1.集合的基本操做(set)
集合是一个无序的,不重复的元素集合,他的主要做用是
去重:把一个列表变为集合就自动去重了。
关系测试:测试两组数据之间的交集,差集,并集等关系python
list_1 = [1,4,6,6,7,89]
list_1 = set(list_1)
list_2 = set([1,9,4,542,2,26,4,7,2])
#交集
list_1.instersection(list_2)
#并集
list_1.union(list_2)
#差集 -左边有右边没有的
list_1.difference(list_2)
#子集判断
list_1.issubset(list_2)#判断一是否是二的子集
list_2.issuperset(list_1)#判断一是否是二的父集
#对称差集
list_1.symmetric_difference(list_2)
#若是两个集合有一个空交集,则返回真
list_1.isdisjoint(list_2)编程
文件IO数据结构
读文件:打开一个文件用open()方法open()返回一个文件对象,它是可迭代的
f = open('test.txt', 'r')
r表示是文本文件,rb是二进制文件。(这个mode参数默认值就是r)
若是文件不存在,open()函数就会抛出一个IOError的错误,而且给出错误码和详细的信息告诉你文件不存在
文件使用完毕后必须关闭,由于文件对象会占用操做系统的资源,而且操做系统同一时间能打开的文件数量也是有限的
因为文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。因此,为了保证不管是否出错都能正确地关闭文件,咱们可使用try ... finally来实现
try:
f = open('/path/to/file', 'r')
print(f.read())
finally:
if f:
f.close()
可是每次都这么写实在太繁琐,因此,Python引入了with语句来自动帮咱们调用close()方法:
with open('/path/to/file', 'r') as f:
print(f.read())
python文件对象提供了三个“读”方法: read()、readline() 和 readlines()。每种方法能够接受一个变量以限制每次读取的数据量。函数式编程
read() 每次读取整个文件,它一般用于将文件内容放到一个字符串变量中。若是文件大于可用内存,为了保险起见,能够反复调用read(size)方法,每次最多读取size个字节的内容。
readlines() 之间的差别是后者一次读取整个文件,像read() 同样。readlines() 自动将文件内容分析成一个行的列表,该列表能够由 Python 的 for ... in ... 结构进行处理。
readline() 每次只读取一行,一般比readlines() 慢得多。仅当没有足够内存能够一次读取整个文件时,才应该使用 readline()。函数
注意:这三种方法是把每行末尾的'\n'也读进来了,它并不会默认的把'\n'去掉,须要咱们手动去掉。测试
文件打开模式网站
r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
w,只写模式【不可读;不存在则建立;存在则清空内容】
x, 只写模式【不可读;不存在则建立,存在则报错】
a, 追加模式【可读; 不存在则建立;存在则只追加内容】,文件指针自动移到文件尾。
"+" 表示能够同时读写某个文件编码
r+, 读写【可读,可写】
w+,写读【可读,可写】,消除文件内容,而后以读写方式打开文件。
x+ ,写读【可读,可写】
a+, 写读【可读,可写】,以读写方式打开文件,并把文件指针移到文件尾。
"b"表示以字节的方式操做,以二进制模式打开文件,而不是以文本模式。操作系统
rb 或 r+b
wb 或 w+b
xb 或 w+b
ab 或 a+b
注:以b方式打开时,读取到的内容是字节类型,写入时也须要提供字节类型,不能指定编码设计
字符编码
先说python2
py2里默认编码是ascii
文件开头那个编码声明是告诉解释这个代码的程序 以什么编码格式 把这段代码读入到内存,由于到了内存里,这段代码实际上是以bytes二进制格式存的,不过即便是2进制流,也能够按不一样的编码格式转成2进制流,你懂么?
若是在文件头声明了#_*_coding:utf-8*_,就能够写中文了,不声明的话,python在处理这段代码时按ascii,显然会出错, 加了这个声明后,里面的代码就全是utf-8格式了
在有#_*_coding:utf-8*_的状况下,你在声明变量若是写成name=u"大保健",那这个字符就是unicode格式,不加这个u,那你声明的字符串就是utf-8格式
utf-8 to gbk怎么转,utf8先decode成unicode,再encode成gbk
再说python3
py3里默认文件编码就是utf-8,因此能够直接写中文,也不须要文件头声明编码了,干的漂亮
你声明的变量默认是unicode编码,不是utf-8, 由于默认便是unicode了(不像在py2里,你想直接声明成unicode还得在变量前加个u), 此时你想转成gbk的话,直接your_str.encode("gbk")便可以
但py3里,你在your_str.encode("gbk")时,感受好像还加了一个动做,就是就是encode的数据变成了bytes里,我擦,这是怎么个状况,由于在py3里,str and bytes作了明确的区分,你能够理解为bytes就是2进制流,你会说,我看到的不是010101这样的2进制呀, 那是由于python为了让你能对数据进行操做而在内存级别又帮你作了一层封装,不然让你直接看到一堆2进制,你能看出哪一个字符对应哪段2进制么?什么?本身换算,得了吧,你连超过2位数的数字加减运算都费劲,还仍是省省心吧。
那你说,在py2里好像也有bytes呀,是的,不过py2里的bytes只是对str作了个别名(python2里的str就是bytes, py3里的str是unicode),没有像py3同样给你显示的多出来一层封装,但其实其内部仍是封装了的。 这么讲吧, 不管是2仍是三, 从硬盘到内存,数据格式都是 010101二进制到-->b'\xe4\xbd\xa0\xe5\xa5\xbd' bytes类型-->按照指定编码转成你能看懂的文字
编码应用比较多的场景应该是爬虫了,互联网上不少网站用的编码格式很杂,虽然总体趋向都变成utf-8,但如今仍是很杂,因此爬网页时就须要你进行各类编码的转换,不过生活正在变美好,期待一个不须要转码的世界。
1.函数
定义: 函数是指将一组语句的集合经过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名便可
特性:
减小重复代码
使程序变的可扩展
使程序变得易维护
2.函数参数与局部变量
形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。
所以,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量
实参能够是常量、变量、表达式、函数等,不管实参是何种类型的量,在进行函数调用时,
它们都必须有肯定的值,以便把这些值传送给形参。所以应预先用赋值,输入等办法使参数得到肯定值
3.全局与局部变量
在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
全局变量做用域是整个程序,局部变量做用域是定义该变量的子程序。
当全局变量与局部变量同名时:
在定义局部变量的子程序内,局部变量起做用;在其它地方全局变量起做用。
4.递归
在函数内部,能够调用其余函数。若是一个函数在内部调用自身自己,这个函数就是递归函数。
递归特性:
1. 必须有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减小
3. 递归效率不高,递归层次过多会致使栈溢出(在计算机中,函数调用是经过栈(stack)这种数据结构实现的,
每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。因为栈的大小不是无限的,
因此,递归调用的次数过多,会致使栈溢出)
5. 匿名函数
匿名函数就是不须要显式的指定函数
#这段代码
def calc(n):
return n**n
print(calc(10))
#换成匿名函数
calc = lambda n:n**n
print(calc(10))
#将匿名函数与其余函数一块儿使用才是正确的用法
res = map(lambda x:x**2,[1,5,7,4,8])
for i in res:
print(i)
6.函数式编程
函数是Python内建支持的一种封装,咱们经过把大段代码拆成函数,
经过一层一层的函数调用,就能够把复杂任务分解成简单的任务,这种分解能够称之为面向过程的程序设计。
函数就是面向过程的程序设计的基本单元。
函数式编程中的函数这个术语不是指计算机中的函数(其实是Subroutine),而是指数学中的函数,即自变量的映射。
也就是说一个函数的值仅决定于函数参数的值,不依赖其余状态。好比sqrt(x)函数计算x的平方根,只要x不变,
不论何时调用,调用几回,值都是不变的。
7.高阶函数变量能够指向函数,函数的参数能接收变量,那么一个函数就能够接收另外一个函数做为参数,这种函数就称之为高阶函数。