python是一种命令式编程、函数式编程,可以将各种不同语言融合
对象模型 数字:int float complex 字符串:str单引号双引号三引号为定界符 r或R引导的表示原始字符串
字节串:bytes 以b作为引导,可以使用单引号双引号三引号做定界符
列表:llist所有元素放于方括号,其中可以放任意类型的元素
字典:dict放于大括号内,元素的形式为“键:值”
元组:tuple 不可变放于圆括号内,如果元组中只有一个元素,第一个元素后边的额逗号不能省略
集合: set frozenset元素不允许重复放于大括号内 set可变 frozenset不可变
布尔型:bool 空类型:None
文件f=open(‘data.dat’,‘rb’)
强编程语言,会根据赋值或运算推断变量类型,动态类型语言,变量的类型可以随时变化
字符串和元组属于不可变序列
采用基于值得内存管理方式,如果为不同变量赋值为相同值,只在内存中存储一份
python中的变量并不直接存储值,只是存储了值得内存地址或引用
具有自动内存管理功能,对于无任何变量指向的值会将其自动删除
十六进制必须0x,八进制必须0o 二进制那个0b
数字支持中间位置使用单个下划线作为分隔
三引号的字符串可以换行
关系运算符可以连用
成员测试运算符in
同一性测试运算符 is,如果两个对象是他同一个二者具有相同的内存地址
and和or具有惰性求值的特点
矩阵相乘运算符@
range()语法格式为range([start,]end[,step])返回具有惰性求值特电的range对象,包括左闭右开区间以内以step为步长的整数
ascii(obj)将对象格式转换成ascii吗
bin(x)讲对象转换为二进制格式
callable(obj)测试对象obj是否可调用,类和函数是可调用的,含_call_()方法的类的对象也是可调用的
compile()将python代码编译成可被exec()或eval()函数执行的代码对象
delattr(obj,name)删除元素
ord()与chr()功能相反,ord()用来返回单个字符的序数或unicode码,而chr()返回某序数对应的字符
max(),min(),sum()中可以增加参数key来指定比较规则key=len或者int比较长度或者大小
sorted()对列表、元组、字典、集合或其他可迭代对象进行排序并返回新列表
map()将一个函数func依次映射到序列和迭代器对象的每个元素上,并返回一个可迭代的map对象作为结果
input()函数的返回结果都是字符串
.py:python源文件,由python解释器负责解释执行
.pyw:python源文件,常用于图形界面程序文件
.pyc:python字节码文件,隐藏源代码提高运行速度
.pyo:优化的python字节码文件
.pyd:由其他语言编写并编译的二进制文件
每个python脚本在运行时都有一个_name_属性,如果作为模块被导入,则其_name_属性值被自动设置为模块名
独立运行则被设置为_main_利用这个_name_属性即可控制python程序的运行方式,如在编写一个包含大量可被其他程序利用的函数的模块,而不希望该模块可以直接运行,则可以在程序文件中添加
if name==‘main’:
print(‘please use me as a module’)
一般都有个_init_.py文件,用于表示该目录是一个包,主要用途是设置_all_变量以及所包含的包初始化所需的代码。其中_all_变量中定义的对象可以在使用from 。。。import 时全部正确导入
当列表元素增加或删除时,列表对象自动进行扩展或收缩内存,保证元素之间没有缝隙
一个列表中的数据类型可以各不相同
列表中包含的是元素值的引用,而不是直接包含元素值
列表与整数相乘。生成一个新列表,新列表是元列表中元素的重复
列表中前边的元素修改之后会立即进行改变列表的结构,即将后边的元素填补到空缺的位置,因此要注意
index()函数获取指定元素首次出现的下标
浅复制是指生成一个新的列表,并且把愿列表中的所有元素的引用都复制到新列表中,因此修改任何一个都会影响另外一个
insert函数会引起插入位置之后所有元素的移动
元素删除时会自动填充保证之间无缝隙
可以使用切片来截去列表中的任何部分得到一个新列表 也可以来删除和修改列表中的部分元素,甚至可以通过切片增加元素
切片用两个冒号分割的三个数字完成
第一个数字,切片开始的位置
第二个数字表示切片截止的位置
第三个数字表示切片的步长,当步长省略时可以顺便省略最后一个冒号
数字都不写表示返回所有元素
第三个数字是-1,表示逆序返回所有
[[row[i] for row in matrix] for i in range(4)]将4列matrix矩阵进行转置,或者list(zip(matrix))的内置函数进行转置
[p for p in range(2,100) if 0 not in[p%d for d in range(2,int(p**0.5)+1)]]求一百以内的所有素数
sum(map(operator.mul,x,y))向量内积 sum((ij for i,j in zip(x,y)))
list(map(operator.add,x,y))两个等长的向量相加
元组无法添加和删除,tuple冻结列表 list融化元组
生成器推导式的结果是一个生成器对象,使用生成器对象的元素时,可以根据需要将其转化为列表或元组
next()或内置函数next进行遍历,生成推导式具有惰性求值得特点
使用字典对象的items方法可以返回字典的键值对
使用字典对象的keys方法可以返回字典的键
使用字典对象的values方法可以返回字典的值
del删除字典中指定键的元素
使用字典元素的clear方法删除所有元素
使用pop方法删除并返回指定键的元素
使用popitem删除并返回字典中的一个元素
集合中只包含数字字符串元组等不可变类型的数据,不能包含列表字典集合等可变类型的数据
|集合求并集 &集合求交集 -集合求差集<>可以求真集
filter函数按照某种规则过滤一些东西
heapq,heapq.heappush,创建堆 heap.heappop出堆
队列则可以直接用列表模拟
也有queue库,分后进先出队列与优先级队列以及双端队列
可直接用列表实现栈
条件表达式中不允许使用赋值运算符=
使用列表元组或字典可以很容易构建跳转表,在某些场合下可以更快速的实现选择结构
funcdict={‘1’:lambda:print(‘1’),‘2’:lambda:print(‘2’),‘3’:lambda:print(‘3’)}
x=input(‘input an integer’)
func=funcdict.get(x,None)
if func:
func()
else:
print(‘error’)
calendar.isleap()用于判断某一年是不是闰年,calendar是一个模块
while循环中也可加else,如果循环式因为break结束的就不在执行else中的代码
compress函数可将一个序列中的值进行过滤,itertools,compress()根据关系进行筛选
bisect_left返回已有元素前面紧邻的位置,而bisect_right返回已有元素后面紧邻的位置
insort_left与insort_right直接在正确的位置插入新元素并保持新列表有序
utf-8使用三个字节表示中文
在统计字符串长度时无论是数字字母还是汉字,都按一个字符对待和处理
字符串属于不可变序列类型
python字符串驻留机制:对于短字符串,将其赋值给多个不同的对象时,内存中只有一个副本,多个对象共享该副本,长字符串不遵循驻留机制
字符串格式化:
%[-][+][0][m][n]格式字符%x
格式标志表示格式开始 指定左对齐输出 对正数加正好 指定空位填0 指定最小宽度 指定精度 指定类型 格式运算符 待转换的表达式
%s 字符串,采用str的显示
%r字符串,采用repr的显示
%c单个字符
%d十进制整数
%i十进制整数
%o八进制整数
%x十六进制整数
%e指数
format方法将变量嵌到字符串中
find和rfind方法分别用来查找一个字符串在另一个字符串的指定范围内首次和最后一次出现的位置
index和rindex方法用来返回一个字符串在另一个字符串的指定范围内首次和最后一次出现的位置
count方法用来返回一个字符串在当前字符串中出现的次数
split()和rsplit()分别用来以指定字符为分隔符,把当前字符串从左往右或从右往左分割成多个字符串,并返回列表
不推荐使用+运算符连接字符串,优先使用join方法
lower()返回小写字符串 upper()返回大写字符串 capitalize()返回首字母大写 title()每个单词的首字母大写 swapcase()大小写互换
marketrans()用来生成字符映射表,而translate()方法用来根据映射表中定义的对应关系转换字符串并替换其中的字符,使用者两个方法的组合可以同时处理多个字符,相当于将特定字符串中的某些字符进行替换
字符串居中center,左对齐ljust,右对齐rjust,并且可以选择填充字符
zlib提供compress与decompress函数,将用于字符串的压缩与解压缩
字符串属于不可变对象,不支持原地修改,可以使用io.StringIO对象或array模块支持修改
正则表达式
.匹配除换行符以外的任意单个字符
匹配位于之前的字符或子模式的0次或多次出现
+匹配位于+之前的字符或子模式的1次或多次出现
-在[]之内用来表示范围
|匹配位于|之前或之后的字符
匹配行首,匹配以后面的字符开头的字符串
匹 配 行 尾 , 匹 配 以 匹配行尾,匹配以 匹配行尾,匹配以之前的字符结束的字符串
?匹配位于?之前的0个或1个字符,当此字符紧随任何其他限定符之后时,匹配模式是非贪心的,非贪心的模式匹配搜索到的尽可能短的字符串,而默认的贪心的模式匹配搜索到的尽可能唱的字符串
\表示位于\之后的为转义字符
\num此处的num是一个正整数,表示子模式编号
\f换页符匹配
\n换行符匹配
\r匹配一个回车符
\b匹配单词头或单词尾
\B与\b含义相反
\d匹配任何数字
\D与\d含义相反
\s匹配任何空白字符,包括空格、制表符、换页符
\S与\s含义相反
\w匹配任何字母数字以及下划线
\W与\w含义相反
()将位于()内的内容作为一个整体对待
{m,n}{}前的字符或子模式重复至少m次,至多n次
[]表示范围,匹配位于[]中的任意一个字符
[^xyz]反响字符集,匹配除x,y,z之外的任何字符
[a-z]字符范围,匹配指定范围内的任何字符
[^a-z]反向范围字符,匹配除小写英文字母以外的任何字符
re模块
compile(pattern[,flags])创建模式对象
escape(string)将字符创众所有特殊正则表达式字符转义
findall(pattern,string[,flags])返回包含字符串中所有与给定模式匹配的项的列表
finditer(pattern,string,flags=0)返回包含所有匹配项的迭代对象,其中每个匹配项都是match对象
fullmatch(pattern,string,flags=0)尝试把模式作用于整个字符串,返回match对象或none
match(pattern,string[,flags])从字符串的开始处匹配模式,返回match或none
purge()清空正则表达式缓存
search(pattern,string[,flags])在整个字符串中寻找模式,返回match或none
split(pattern,string[,maxsplit=0])根据模式匹配项分割字符串
sub(pat,repl,string[,count=0])将字符串中所有与pat的匹配项用repl替换,返回新字符串,repl可以是字符串或返回字符串的可调用对象,作用于每个匹配的match对象
subn(pat,repl,string[,count=0])将字符串中所有与pat的匹配项用repl替换,返回新字符串和替换次数的二元元祖,repl可以是字符串或返回字符串的可调用对象,作用于每个匹配的match对象
首先使用compile方法将正则表达式编译生成正则表达式对象,然后使用正则表达式对象提供的方法进行字符串处理
使用编译好后的正则表达式对象可以提高字符串的处理速度,也提供了 更强大的文本处理功能
正则表达式对象的match方法用于在字符串开头或指定位置进行搜索,模式必须出现在字符串开头或指定位置
正则表达式对象search方法用于在整个字符串中进行搜索
正则表达式对象findall方法用于在字符串中查找所以负荷正则表达式的字符串并返回列表
match方法在字符串开头或指定位置进行搜索,模式必须出现在字符串开头或指定位置
search方法在整个字符串或指定范围中查找搜索
findall放啊在字符串指定范围中查找符合正则表达式的字符串并以列表的形式返回
子模式扩展语法:
(?P):为子模式命名
(!iLmsux):设置匹配标志,可以是几个字母的组合,每个字母含义与编译标志相同
(?:…):匹配但不捕获该匹配的子表达式
(?P=groupname):表示在此之前的命名为groupname的子模式
(?#…):表示注释
(?=…):用于正则表达式之后,表示如果=后的内容在字符串中出现则匹配,但不返回=之后的内容
(?!..):用于正则表达式之后,表示如果!后的内容在字符串中不出现则匹配,但不返回=之后的内容
(?<=…):用于正则表达式之前,与(?=…)含义相同
(? 正则表达式对象的match方法和search方法匹配成功后返回match对象,match对象的主要方法有:
group:返回匹配的一个或多个子模式内容
groups:返回一个包含匹配的所有子模式内容的元组
groupdict:返回包含匹配的所有命名子模式内容的字典
start():返回指定子模式内容的起始位置
end:返回指定子模式内容的结束位置的前一个位置
span:返回一个包含指定子模式内容起始位置和结束位置前一个位置的元组
函数形参不需要声明类型,也不需要指定函数返回值类型
即使该函数不需要接收任何参数,也必须保留一对空的圆括号
括号后边的冒号不可少
函数体相对于def关键字必须保持一定的空格缩进
python允许嵌套定义函数
python中的函数和自定义对象的成员也是可以随时改变的,可以为函数和自定义对象动态增加新成员
如果传递给函数的实参是可变序列,并且在函数内部使用下标或可变序列自身的方法增加删除修改元素时,实参也会改变
函数参数分普通参数 默认值参数 关键参数 可变长度参数
默认值参数必须出现在参数列表的最右端,任何一个默认值参数右边不能有非默认值参数
默认值参数的赋值只会在函数定义时被解释一次
通过关键参数,实参顺序可以和形参顺序不一致,但不影响传递结果,避免了用户需要牢记位置参数顺序的麻烦
可变长度参数主要有两种形式:在参数名前加或**
*用来接收多个实参并将其放在一个元组中
**接收多个关键参数并存放在字典中
如果函数实参是字典,可以在前面加两个星号进行解包,等价于关键参数
全局变量通过global关键字进行定义
一个变量已在函数外定义,如果在函数内需要为这个变量赋值并要将这个赋值结果反映到函数外,可以在函数内使用global将其声明为全局变量
如果局部变量和全局变量有相同的名字,那么该局部变量会在自己的作用域内隐藏同名的全局变量
关键字nonlocal声明的变量会引用距离最近的非全局作用域的变量,要求声明的变量已经存在,关键字nonlocal不会创建新变量
lambda表达式也称为具名函数,只是一个表达式,不允许含复合语句,但在其中可以调用其他函数
map函数可以将一个函数作用带一个序列或迭代器对象上
标准库funtools中的reduce函数可以将一个接受两个参数的函数以迭代的方式从左到右依次作用到一个序列或迭代器对象的所有元素上
filter函数讲一个函数作用到一个序列上,返回该序列中是的该函数返回值为true的那些元素组成的filter对象
包含yield语句的函数可以用来创建生成器对象,也称为生成器函数
每次执行到yield语句会返回一个值然后暂停或挂起后面代码的执行,下次通过生成器对象的_next_()方法,内置函数next()for循环遍历生成器对象元素或其他方式显示索要数据时恢复执行
生成器对象具有惰性求值得特点
修饰器是函数嵌套定义的另一个应用,修饰器本质上也是一个函数,只不过这个函数接受其他函数作为参数并对其进行一定的改造后返回新函数
偏函数和函数柯里化是函数式编程中常用的技术,有时我们在复用已有函数时可能需要需要固定其中的部分参数,除了使用默认值参数外,还可以使用偏函数,也可以通过functools库提供的partial方法进行创建指定函数的偏函数,相当于将函数的某个参数进行修改
python用class关键字进行定义类,之后是一个空格,然后是类的名字,然后是一个冒号,最后换行定义类的内部实现。
类的首字母一般要大写
pass关键字类似于空语句,可以用在类和函数的定义中或者选择结构中
类的所有实例方法都必须至少有一个名为self的函数,且必须是方法的第一个形参,self参数代表将来要创建的对象本身
在类的实例方法中访问实例属性时需要以self为前缀
在外部通过对象调用对象方法时并不需要传递这个参数,如果在外部通过类调用对象方法则需要显式为self参数传值
python中可以动态的为自定义类和对象增加或删除成员
python类型的动态性使得我们可以动态为自定义类及其对象增加新的属性和行为,俗称混入机制
方法一般指与特定实例绑定的函数,通过对象调用方法时,对象本身将被作为第一个参数隐式传递过去,而函数不具备这个特点
python并没有对似有成员提供严格的访问保护机制
在定义类成员时,如果成员名以两个下划线或更多下划线开头而不以两个或更多下划线结束则表示私有成员
私有成员在类的外部不能直接访问,需要通过调用对象的公开成员方法来访问,也可以通过python支持的特殊方式访问
python不存在严格意义上的私有成员
类的方法分为:公有方法、私有方法、静态方法、类方法
公有方法和私有方法都属于对象
静态方法和类方法都可以通过类名和对象名调用,但不能直接访问属于对象的成员,只能访问属于类的成员
静态方法可以没有参数
一般将cls作为类方法的第一个从参数名称
类方法前加@property表示只读,无法修改和删除
运算符重载是通过重写特殊方法实现的
python中的构造函数时_init_()
析构函数是_del_()
pthon支持多继承
继承时直接在子类的括号里加入父类的名字即可
所谓多态是指基类的同一个方法在不同派生类对象中具有不同的表现和行为,派生类继承了基类行为和属性之后,还会增加某些特定属性的行为和属性,同时还可能会对继承来的某些行为进行一定的改变,这都是多态的表现形式
文本文件,由常规字符串组成,指记事本或其他文本编辑器能正常显示编辑并且人类能够直接阅读和理解的字符串
二进制文件,把对象内容以字节串进行存储,无法用记事本或其他普通字处理软件进行编辑,无法被人类直接阅读和理解
open(file,mode=‘r’,buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)
file参数制定了被打开的文件的名称
mode参数知道嗯可打开文件后的处理方式
buffering参数指定了读写文件的缓存模式0表示不缓存1表示缓存,大于1表示缓冲区的大小
encoding参数指定对文本进行编码和解码的方式,只适用于文本模式,可以使用python支持的任何格式
即使写了关闭文件的代码也无法保证文件一定能正常关闭,使用with关键字就可以了
with open(filename,mode,encoding) as fp:
文件打开方式
r只读
w写,如果文件已存在,先清空原有内容
x写,创建新文件,如果文件已存在则抛出异常
a追加写,不覆盖原有内容
b二进制模式可组合使用
t文本模式,默认
+读写模式
buffer返回当前文件的缓冲区对象
closed判断文件是否关闭
fileno文件号
mode返回文件的俄打开模式
name返回文件名字
close将缓冲区的内容写入文件,同时关闭文件,并释放文件对象
detach分离并返回底层缓冲,底层缓冲被分离后,文件对象不再可用,不允许做任何操作
flush把缓冲区的内容写入文件但不关闭文件
read([size])从文本文件中读取size个字符内容作为结果返回,或从二进制文件中读取指定数量的字节进行返回,省略size则读取所有
readline从文本文件中读取一行内容作为返回结果
readlines把文本文件中的每行文本作为一个字符串存入列表,返回列表
seek(offset[,whence])把文建制镇移动到新的字节位置,offset表示相对于wehnce的位置,whence为0表示从文件头开始1表示从当前位置开始2表示从文件尾部开始,默认为0
seekable测试当前文件是否支持随机访问,如果不支持则调用seek tell truncate时会抛出异常
tell返回文件指针的当前位置
write(s)将s的内容写入文件
writelines(s)把字符串列表写入文本文件,不添加换行符
JSON是一个轻量级的数据交换格式,json.dumps()序列化对象
json.loads()反序列化
所谓序列化,简单地说就是把内存中的数据在不丢是其类型信息的情况下转成对象的二进制形式的过程,对象序列化后的形式经过正确的反序列化过程应该能够准确无误的恢复为原来的对象
python中常用的序列化模块有struct、pickle、marshal和shelve
白盒测试:只看代码来判断
黑盒测试:只通过测试功能来判断是否正确
doctest库可以搜索程序中类似于交互式python代码的文本片段,并运行这些交互式代码来验证是否符合预期结果和功能,常用于python程序的模块测试