一、collections系列
Counter是对字典类型的补充,用于追踪值的出现次数,具备字典的所有功能 + 自己的功能
1.计数器Counter
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMS5qcGc%3D.jpg?w=700&webp=1)
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMi5qcGc%3D.jpg?w=700&webp=1)
import collections a='abababsbsbhh' c=collections.Counter(a) #直接列出每个元素出现了几次,传入列表和元组也一样 print(c) #输出:Counter({'b': 5, 'a': 3, 'h': 2, 's': 2}) #most_common 列出Counter内的前几个 print c.most_common() print c.most_common(1) print c.most_common(3) ''' 输出: [('b', 5), ('a', 3), ('h', 2), ('s', 2)] [('b', 5)] [('b', 5), ('a', 3), ('h', 2)] ''' #update 相加 c=collections.Counter(a) c1=collections.Counter(a) c.update(c1) print(c) #输出:Counter({'b': 10, 'a': 6, 'h': 4, 's': 4}) #subtract 减 aa=collections.Counter("as") bb=collections.Counter("htw") aa.subtract(bb) #c-c1 print(aa) #输出:Counter({'a': 1, 's': 1, 'h': -1, 't': -1, 'w': -1}) #elements 返回包含所有元素集合的迭代器 for item in c.elements(): print item
2、有序字典(orderedDict )
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMS5qcGc%3D.jpg?w=700&webp=1)
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMi5qcGc%3D.jpg?w=700&webp=1)
import collections #有序字典,是对字典类型的补充,他记住了字典元素添加的顺序 #具备字典的所有功能 + 自己的功能 dic=collections.OrderedDict() #定义有序字典 dic["a1"]=1 dic["a2"]=2 dic["a3"]=3 di={} di["a1"]=1 di["a2"]=2 di["a3"]=3 print(dic) print(di) #输出: # OrderedDict([('a1', 1), ('a2', 2), ('a3', 3)]) #有序 #{'a1': 1, 'a3': 3, 'a2': 2} #无序
3、默认字典(defaultdict)
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMS5qcGc%3D.jpg?w=700&webp=1)
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMi5qcGc%3D.jpg?w=700&webp=1)
import collections #默认字典 #defaultdict 是对字典的类型的补充,他默认给字典的值设置了一个类型。 dic=collections.defaultdict(list) #默认字典的value,也可以是元组(tuple)或字典(dict) #相当于 dic={} dic["k1"]=[]
4、可命名元组
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMS5qcGc%3D.jpg?w=700&webp=1)
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMi5qcGc%3D.jpg?w=700&webp=1)
#tupled的扩展 #可命名元组 import collections t=(1,2) #创建一个扩展tuple的类,Mytuple Mytuple=collections.namedtuple('Mytuple',['x','y']) tu=Mytuple(1,2) #相当于给原来的值赋了一个key print(t) print(tu) print tu.x,tu.y ''' 输出: (1, 2) Mytuple(x=1, y=2) 1 2 '''
5、双向队列、单向队列
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMS5qcGc%3D.jpg?w=700&webp=1)
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMi5qcGc%3D.jpg?w=700&webp=1)
#双向队列,两头都可以取可以插 #线程安全 import collections q=collections.deque() #创建队列 q.append(1) q.append(2) q.append(3) print(q) #单向队列,一个方向拿 #线程安全 import Queue q=Queue.Queue(10) #创建队列,指定最多放10个数据 q.put(1) #进 q.put(2) q.put(3) print q.get() #取 print q.get() ''' 队列和栈的结构: 队列:先进先出 栈:弹夹,后加先出 '''
二、迭代器和生成器
1.迭代器
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMS5qcGc%3D.jpg?w=700&webp=1)
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMi5qcGc%3D.jpg?w=700&webp=1)
''' 只能通过循环从迭代器里拿数据 next方法:返回迭代器的下一个元素 __iter__方法:返回迭代器 ''' i=iter(range(3)) #使用内建的iter方法创建迭代器 print i.next() print i.next() #next()方法可以访问下一个元素 print i.next() print i.next() #python处理迭代器越界抛出StopIteration异常 ''' 输出: 0 1 2 Traceback (most recent call last): File "E:/index.py", line 82, in <module> print i.next() StopIteration ''' #在for循环中,Python将自动调用iter()函数获得迭代器,自动调用next()获取元素,自动完成检查StopIteration异常的工作
2.生成器
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMS5qcGc%3D.jpg?w=700&webp=1)
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMi5qcGc%3D.jpg?w=700&webp=1)
#生成器(生成器只有使用时才创建,从而避免内存浪费) ''' range不是生成器 和 xrange 是生成器 readlines不是生成器 和 xreadlines 是生成器 ''' for i in range(100): #返回100个元素的列表 print(i) for i in xrange(100):#每次迭代中返回一个元素 print(i) #带有 yield 的函数在 Python 中被称之为 generator(生成器) #yield 记住上一次的操作,下次在执行时继续执行 def aaa(arg): seed = 0 while True: seed=seed+1 if seed > arg: return else: yield seed #每次经过yield都会返回到print输出i,然后回到原来位置继续执行 for i in aaa(10): print i
冒泡算法
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMS5qcGc%3D.jpg?w=700&webp=1)
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMi5qcGc%3D.jpg?w=700&webp=1)
#练习 #下标式循环 ''' 有列表li=[13, 22, 6, 99, 11] 按照以下规则计算: 13 和 22 比较,将大的值放在右侧,即:[13, 22, 6, 99, 11] 22 和 6 比较,将大的值放在右侧,即:[13, 6, 22, 99, 11] 22 和 99 比较,将大的值放在右侧,即:[13, 6, 22, 99, 11] 99 和 42 比较,将大的值放在右侧,即:[13, 6, 22, 11, 99,] 13 和 6 比较,将大的值放在右侧,即:[6, 13, 22, 11, 99,] ''' #冒泡算法 依次用下标对应的两个数字进行比较,大的放右边,从而进行排列 li=[13, 22, 6, 99, 11] aa=(len(li)-1) while aa>0: for m in range(aa): if li[m]>li[m+1]: temp=li[m] li[m]=li[m+1] li[m+1]=temp aa=aa-1 print(li) #输出:[6, 11, 13, 22, 99]
三、函数
1.内置函数
常用内置函数
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMS5qcGc%3D.jpg?w=700&webp=1)
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMi5qcGc%3D.jpg?w=700&webp=1)
#常用内置函数 ''' 基础 help() dir() 不带参数时,返回当前范围内的变量、方法和定义的类型列表,带参数时,返回参数的属性、方法列表 print vars() 当前模块的所有变量 type() reload(temp) 真正的在导入一次一个模块 id() is() range 产生一个序列,默认从0开始 xrange 类型转换 int() long() float() complex() str() list() tuple() 计算 cmp(x,y) x<y返回-1 x==y返回0 x>y返回1 abs() boll() divmod() #分别取商和余数 max() min() sum() pow(x,y) 返回x的y次幂 len() 长度 all() 接受一个序列,如果所有都是真返回真,否则返回假 any() 接受一个序列,只要有一个真就是真 eval(dic) 把传入的字符串转换成字典 assic码转换 chr() 接收数字返回字符 ord() 接收字符返回数字 进制转换 hex() 10转16 oct() 10转8 bin() 10转2 #enumerate 自动生成一列数字对应列表里的值,从0开始 li=[11,22,33,44] for k,v in enumerate(li,1):#从1开始 print(k,v) 输出: (1, 11) (2, 22) (3, 33) (4, 44) '''
isinstance
isinstance:判断一个对象是不是某个类的实例,这个类可以是创建该对象的类,也可以是创建该对象的类的基类
在python中,判断对象类型的方法有两种,type和isinstance
a=2 print(isinstance(a,int)) #Ture print(isinstance(a,str)) #False print(type(a)==int) #Ture print(isinstance(a,str)) #False
(2)isinstance还能判断一个对象是不是某个类的实例
class test: pass class AA(test): pass class BB: pass obj=AA() #判断obj对象是不是AA类的实例 print(isinstance(obj,AA)) #Ture print(isinstance(obj,BB)) #False #判断obj对象是不是test类的实例 print(isinstance(obj,test)) #Ture
issubclass
issubclass:判断一个类是不是另一个类的派生类
class test: pass class AA(test): pass class BB: pass #判断AA是不是test的派生类 print(issubclass(AA,test)) #True #判断BB是不是test的派生类 print(issubclass(BB,test)) #False
map遍历序列
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMS5qcGc%3D.jpg?w=700&webp=1)
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMi5qcGc%3D.jpg?w=700&webp=1)
#map遍历序列,对序列中每个元素进行操作,最终获得新的序列 li=[11,22,33,44] li1=[1,2,3,4] def func(arg): return arg+10 print map(func,li) #输出:[21, 32, 43, 54] def func1(a1,a2): return a1+a2 print map(func1,li,li1) #输出:[12, 24, 36, 48] print map(lambda a1,a2:a1+a2,li,li1) #lambda一句实现 #输出:[12, 24, 36, 48]
filter筛选
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMS5qcGc%3D.jpg?w=700&webp=1)
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMi5qcGc%3D.jpg?w=700&webp=1)
#filter 筛选 li=[11,22,33,44,"",False,True,0] print filter(None,li) #传入None,返回是True的序列 #输出:[11, 22, 33, 44, True] li1=[11,22,33,44,55,66] print filter(lambda a:a>22,li1)#返回是True的序列 #输出:[33, 44, 55, 66]
reduce累积
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMS5qcGc%3D.jpg?w=700&webp=1)
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMi5qcGc%3D.jpg?w=700&webp=1)
#reduce 累积操作 li=[1,2,3,4,5,6] print reduce(lambda a1,a2:a1+a2,li) #输出:21 就是((((1+2)+3)+4)+5)+6 #print reduce(lambda a1,a2:a1+a2,li,xxx)#累加 最后还可以加参数作为初始值 print reduce(lambda a1,a2:a1*a2,li)#来乘 #输出:720
每个文件模块自己的变量
#__file__ print __file__ #当前文件路径 #__doc__ import index print index.__doc__ #index是模块名,可查看一个文件模块的顶部注释 #__name__ 用来判断是不是程序的主文件 #当主程序执行时__name__="__main__" if __name__=="__main__": pass
2.自定义函数
def
函数名(参数):
函数体
#接受多个参数,内部自动构造元组 #传入序列要加*,避免内部构造元组 li=[11,22,33] def func(*args): print(args) func(li) #把传的列表当成元组的元素 func(*li) #加*把传的列表内的每个元素当成元组的元素 #输出: #([11, 22, 33],) #(11, 22, 33)
动态参数二:**kwargs
#构造字典(两*) dic={"a":1,"b":2} def func1(**kwargs): print(kwargs) func1(a=11) func1(**dic) #输出: #{'a': 11} #{'a': 1, 'b': 2}
结合上面两种:
def func2(*args,**kwargs): print(args) print(kwargs) func2(1,2,3,a=1,b=2) #输出: #(1, 2, 3) #{'a': 1, 'b': 2}
四、文件操作
1.打开文件
文件句柄
=
file
(
'文件路径'
,
'模式'
)
模式:
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMS5qcGc%3D.jpg?w=700&webp=1)
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMi5qcGc%3D.jpg?w=700&webp=1)
''' r 只读模式 w 只写模式(不可读,不存在则创建,存在则删除内容) a 追加模式(可读,不存在则创建,存在则只追加内容) "+" 表示可以同时读写某个文件 r+ 可读写文件(可读,可写,可追加) w+ 写读 a+ 同a rU 表示在读取时,可以将 \r \n \r\n自动转换成 \n (只能与r或r+模式一起使用) "b" 表示处理二进制文件 rb 以2进制方式去读取文件 wb ab '''
2.操作文件
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMS5qcGc%3D.jpg?w=700&webp=1)
![Python基础第三篇 Python基础第三篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pLzg4NzEwMTJiMDMyMmMyOGJiMzMzMzY4ODc3MmY2NjBjMi5qcGc%3D.jpg?w=700&webp=1)
''' close() 关闭文件 fileno() 文件描述符 flush() 刷新文件内部缓冲区 isatty() 判断文件是否是同意tty设备 next() 获取下一行数据,不存在,则报错 read() 读取指定字节数据 readline() 仅读取一行数据 readlines() 读取所有数据,并根据换行保存到列表 xreadlines()可用于逐行读取文件,非全部 seek() 指定文件中指针位置 tell() 获取当前指针位置 truncate() 截断指针后面的内容只留前面的 write() 写 writelines()将一个字符串列表写入文件 '''
with
为了避免打开文件后忘记关闭,当with代码块执行完毕时,内部会自动关闭并释放文件资源
with open('','r') as obj: obj.read()
Python 2.7后with还支持多个文件管理
with open('','r') as obj1,open('') as obj2: pass
五、lambda 表达式
lambda和三元运算类似,是为了简化函数,不过只能用于处理简单函数,并且能自动return
#正常函数 def lam1(arg): return arg+1 print lam1(10) #lambda表达式 lam2=lambda arg:arg+1#(lam2等于上面的函数名,arg等于上面的参数) print lam2(10) lam3=lambda a,b:a+b print lam3(2,3)
六、递归
1、递归:在运行的过程中调用自己就叫做递归
下面举个最典型的递归案例:斐波纳契数列(1、1、2、3、5、8、13、21.....)
#用递归实现 def func(arg1,arg2): if arg1 == 0: print(arg1) print(arg2) arg3=arg1+arg2 print(arg3) if arg3>1000: return func(arg2,arg3) #在函数内部调用自身 func(0,1)
上面的代码可以实现斐波纳契数列的输出
2、递归的返回值
#递归的返回值 def func(arg1,arg2): if arg1 == 0: print(arg1) print(arg2) arg3=arg1+arg2 if arg3>1000: return arg3 #返回值 func(arg2,arg3) result=func(0,1) print(result) #输出:None
上面代码可以看到,输出的是None,是因为函数第一次执行时的返回值才是result,当函数一直被调用时,return arg3 的返回值是返回给了他上一次
调用的函数func(arg2,arg3),以此往前推
如果代码如下:递归函数就能返回最后一次的返回值
def func(arg1,arg2): if arg1 == 0: print(arg1) print(arg2) arg3=arg1+arg2 if arg3>1000: return arg3 ret=func(arg2,arg3) #把内部调用的函数的返回值赋值给ret return ret result=func(0,1) print(result) #输出:1597