python入门笔记

计算机基础

程序是一组让计算机识别和执行的指令
电子计算机:能够执行程序的机器
计算机中的冯诺依曼体系:控制器 运算器 存储器 输入输出(io)
为什么计算机用二进制是因为计算机只能用高电平和低电平来表示状态,所以用二进制1 0对应高低电平.3.5伏以上为高电平.在内存中又用一个字节表示一个储存单元.
即8位 2**8=256种状态

内存 掉电易失 与晶振频率有关 临时数据 mermory
cpu与内存速度差几个数量级
cpu 只认内存 io设备最慢
CPU 缓存 cache bus 总线
先写源程序 通过编译程序把源程序转换成机器指令的程序
python是跑在虚拟机上的 动态语言 做节点 集群优化
编译语言 把源代码转换成目标机器的CPU指令 不同架构的CPU指令集不一样

机器语言: 是一定位数组成的0 1序列 称为机器指令 机器指令的集合就是机器语言
汇编: 是用助记符替代机器指令
静态语言: 是声明变量类型,不能再改变,编译需要检查
动态语言: 不用声明类型 随时可以赋值为其他类型
强类型: 不同类型之间操作 必须强制类型转换为同一类型
弱类型: 不同类型之间操作 自动隐式转换

python基础介绍

python 的源代码需要被解释器编译成中间代码,在虚拟机上运行
*`程序 = 算法 +数据结构`*
数据一切程序的核心
数据结构是数据在计算机中的类型和组织方式
算法是处理数据的方式,算法有优劣之分.
python自带了一个IDLE的程序,全称是交互式开发环境.
注释:注释的目的是解释代码的功能程序员通过注释,使得代码更易于阅读.在注释中,可以写下任何内容,只要保持一行即可
只有在代码中执行特别操作,或者代码不清晰易懂的情况下,才需要写注释尽量少写注释–不要每行都写注释,有特殊情况才需要.

import math

#对角线的长度
i = 4
w = 10
d = math.sqrt(12 + w2)
即使你完全理解了这段代码,也可能并不知道如何计算长方形的对角线长度,因此这里的注释就是有用的
编写尽量用pep8风格

数据类型:python将数据划分为不同的类别,即数据类型.
每一个数据值被称为对象 对象拥有三个属性的数据值:唯一标识,数据类型,值.
对象的唯一标识,指的是在计算机内存中的地址,该地址不会变化.
对象的数据类型是数据所属的数据类别,这决定了对象的属性.也不会变化.
对象的数据类型是对象所属的数据类别.
“hello world”这个对象的数据类型为字符串(string),字符是类似a 或 l这样的单个符号
数据类型为bool的对象被称为布尔值.
数据类型为nonetype的对象,其值永远我none 用来表示数据缺失.

系统编程
python对操作系统服务的内置接口,使其成为编写可移植的维护操作系统的管理工具和部件
(有时也称为shell工具)的理想工具.python程序可以搜索文件和目录树,可以运行其他程序,用进程或线程进行并行处理.
python的标准库绑定了posix以及其他常规操作系统os工具:环境变量 文件 套接字 管道
进程 多线程 正则表达式模式匹配 命令行参数 标准流接口 shell命令启动器 文件扩展
此外很多python的系统工具设计都考虑了其可移植性.

python解释器
python 也是名为解释器的软件包,解释器是一种让其他程序运行起来的程序.当你编写一段python程序 python解释器将读取程序,并按照其中的命令执行,得出结果.实际上,解释器是代码与机器的计算机硬件的软件逻辑成
当python包安装在机器上后,它包含了一些最小化的组件:一个解释器和支持的库.根据使用情况的不同,python解释器可能采取可执行程序的形式,或是作为连接到另一个程序的一系列库.根据选用的python版本的不同,解释器本身可以用c程序实现,或一些java类实现,或者其他的形式.无论采取哪种形式,编写的python代码必须在解释器中运行.

python变量和内存

变量在python是表示内存的地址.
可以用id()函数获取内存地址

a=5
id(a)
id(5)
会发现这两个地址一样,都输出140720362218448

即python的编程哲学 :一切皆对象,一切皆指针
只有指针,要说变量也是指针变量
variable 变量是改变的值.变量由一个或多个字符组成的名称构成
并使用赋值符 等号赋予了这个名称一个值
变量是记住内存中 0 1数字 开始和结束的一串

指针的内容是存储地址在存储器中有大量的存储元,把它们按相同的位划分为组,组内所有的存储元同时进行读出或写入操作,这样的一组存储元称为一个存储单元。一个存储单元通常可以存放一个字节;存储单元是CPU访问存储器的基本单位。

内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。

内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
对于C和C++这样的没有Garbage Collection 的语言来讲
我们主要关注两种类型的内存泄漏:

堆内存泄漏(Heap leak)。对内存指的是程序执行中依据须要分配通过malloc,realloc new等从堆中分配的一块内存,再是完毕后必须通过调用相应的 free或者delete 删掉。假设程序的设计的错误导致这部分内存没有被释放,那么此后这块内存将不会被使用,就会产生Heap Leak.

系统资源泄露(Resource Leak).主要指程序使用系统分配的资源比方 Bitmap,handle ,SOCKET等没有使用对应的函数释放掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定。

python虚拟机原理

python不单纯是一种解释性语言,也需要编译,需要编译成字节码.然后模仿可执行文件的入栈出栈调成顺序执行.pyc文件中保存这编译而成的字节码,pvm从pycodeobject读取字节码一条一条执行.
pycodeobject保存字节码以及进程上下文信息.

过程:python先把代码(.py)编译成字节码,交给字节码虚拟机,然后虚拟机一条一条执行字节码指令,从而完成程序的执行
字节码: 字节码在python虚拟机程序里对应的是pycodecbject 对象
.pyc文件字节码在磁盘上的表现形式
pvm是python的引擎,他时常表现为python系统的一部分,并且它是实际运行脚本的组件,
从技术上将,他才是所谓python解释器的最后一步.
代码在写好之后立即运行,另外一个就是,python字节码不是机器的二进制代码(intel芯片的指令)字节码特定于python的一种表现形式.

开发环境 —-pyenv
python多版本管理工具
pip包管理器
pip install xxx
pip list
pip search keyword 或者 pypi
pip help install
pip install redis ipython
pip install jupyter
pip -V
pip freeze > requirement
pip install-r requirement

原码补码反码

原码是给人看的,补码是给计算机用的
127后面是-128,最大的正数加下来是最小的负数。这就跟钟表一样,12点钟后面是1点中钟一样。
因为它是用补码的编码方式。
正数的补码就是它的原码,也就是单纯的二进制数。负数的话,
1111 1111这个二进制串,首先它最高位是1,明确他是个负数。
那么其余位是111 1111,按位取反得到:000 0000,再加1就是:000 0001
也就是1,再加上符号位。最终结果是-1

补码 从小到大 二进制
1000 0000—-0000 0000—-0111 1111
首尾相连,刚好连个时钟,最大的加一到最小的


字符串

使用单双三引号括起来的序列叫字符串

r前缀:在字符串前面加上r 或者R前缀,表示该字符不做特殊的处理
f前缀:3.6版本开始,新增f前缀,格式化字符串
转义序列
\ \t \r \n \’ \”
缩进:未使用c等语言的花括号,而是采用缩进的方式表示层次关系
约定使用4个空格缩进
续行:在行尾使用\ 如果使用各种括号,认为括号内是一个整体,内行跨行不用\
extend 魔术方法add()

标识符

一个名字,用来指代一个值
只能是字母,下划线和数字
只能以字母或下划线开头
不能是python的关键字,例如def,class等
python是大小写敏感的
约定:
不允许使用中文
不要使用歧义单词,例如class_
在python中不要随便使用下划线开头的标识符

运算符

  • 算术运算符

+-*/%**
自然除/结果是浮点数,整除//

  • 位运算符

& | ~ ^ << >>

  • 比较运算符

== != > < >= <=
返回一个bool值

  • 逻辑运算符

与或非 and or not
短路运算符

  • 赋值运算符
    0 *? =0短路
    1+? =1短路运算 可以提高效率 可以提前算完了
    赋值运算 先算右边 和左边相连(映射)

a=min(3,5)

运算符优先级 就记住一句话 a+b>c and

折半思想可以优化程序

程序控制

顺序结构:按照先后顺序一条条执行
分支结构:根据不同情况判断,条件满足执行某条件下的语句
循环结构:条件满足就反复执行,不满足就不执行或不再执行

内置类型

内置对象使程序更容易编写
内置对象使扩展的组件
内置对象往往比定制的数据结构更有效率
内置对象使语言的标准的一部分
python的核心数据类型
模式匹配

循环

while 语句
whlie condition:
block
当他成立则进入循环
while true:
pass #死循环 冒号后要形成语句块 死循环都用这个语法
例子:

flag = 10
while flag:
print(flag)
flag-= 1

在做循环时,一定要分析边界 边界最容易出错
range(1,10) # [1,10) 前包后不包 python大多函数都是前包后不包

for i in range(10):
print(i+1)
i= i+10
循环 隐含赋值 原来有什么会被冲掉
for相当于遍历 不会重复拿 挨个拿
如果要倒着遍历 应当在range函数内加步长-1
例子:
for i in range(10):
if i %2 == 0:
print(i)

for i in range(10):
if not i % 2:
print(i)
not 经常用
for i in range (10):
if i &1 == 0:
print(i)

for i in range(10):
if i & 1:
continue
print(i)

写程序要减少循环提高效率

for i in range(10):
if i % 2:
continue
print(i)

如果循环嵌套 continue 和break也只影响语句所在的那一层循环

迭代器和生成器

我们已经知道,可以直接作用于for循环的数据类型有以下几种:

一类是集合数据类型,如list、tuple、dict、set、str等;

一类是generator,包括生成器和带yield的generator function。

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。

可以使用isinstance()判断一个对象是否是Iterable对象:

from collections import Iterable
isinstance([], Iterable)
True
isinstance({}, Iterable)
True
isinstance(‘abc’, Iterable)
True
isinstance((x for x in range(10)), Iterable)
True
isinstance(100, Iterable)
False
而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator.

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:

L = [x x for x in range(10)]
L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
g = (x
x for x in range(10))
g

<generator object at 0x1022ef630>

函数

python 内置了很多有用的函数,我们可以直接调用
要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs()
调用函数的时候,如果传入的参数数量不对,会报Typeerror的错误,并且Python会明确地告诉你有且仅有一个参数.

感谢支持 !
0%