迭代器
1 迭代器:迭代的工具 2 1.什么是迭代:指的是一个重复的过程,每次重复称为一次迭代,并且每次重复的结果是下一次重复的初始值 3 例: 4 while True: 5 print('====>'') 6 7 l=['a','b','c'] 8 count=0 9 while count') 82 print('====>') 83 print('====>') 84 print('====>') 85 86 d={ 'name':'egon','age':18,'sex':'male'} 87 for k in d: 88 print(k) 89 print('====>') 90 print('====>') 91 print('====>') 92 print('====>') 93 94 for循环总结详解(上为实例): 95 1.调用in后面的obj_iter=obj.__iter__() 96 2.k=obj_iter.__next__() 97 3.捕捉到StopIteration异常,结束迭代 98 99 100 101 102 #总结迭代器的优缺点:103 #优点:104 #1、提供一种统一的、不依赖于索引的取值方式,为for循环的实现提供了依据105 #2、迭代器同一时间在内存中只有一个值——》更节省内存,106 107 #缺点:108 #1、只能往后取,并且是一次性的109 #2、不能统计值的个数,即长度
生成器
1 生成器:只有在函数体内出现yield关键字,那么再执行函数就不会执行函数代码,会得到一个结果,该结果就是生成器 2 3 def func(): 4 print('=====>1') 5 yield 1 6 print('=====>2') 7 yield 2 8 print('=====>3') 9 yield 310 11 #生成器就是迭代器12 # g=func()13 ##g.__iter__和g.__next__都有,所以说生成器就是迭代器14 #15 #next(g)#返回值是======>116 #17 #res1=next(g)18 # print(res1)19 #20 #21 # res2=next(g)22 # print(res2)23 #24 #25 # res3=next(g)26 # print(res3)27 #yield的功能:28 #1、yield为我们提供了一种自定义迭代器对象的方法29 #2、yield与return的区别1:yield可以返回多次值 #2:函数暂停与再继续的状态是由yield帮我们保存的30 31 obj=range(1,1000000000000000000000000000000000000000000000000000000000000000,2)32 obj_iter=obj.__iter__()33 print(next(obj_iter))34 print(next(obj_iter))35 print(next(obj_iter))36 print(next(obj_iter))37 print(next(obj_iter))38 39 def my_range(start,stop,step=1):#step步长默认为一40 while start < stop:41 yield start #start=142 start+=step #start=343 44 45 g=my_range(1,5,2)46 print(g)47 48 print(next(g))49 print(next(g))50 print(next(g))51 print(next(g))52 print(next(g))53 print(next(g))54 print(next(g))55 for i in my_range(1,5,2):56 print(i)57 58 小练习::tail -f access.log | grep '404'59 import time60 def tail(filepath):#文件路径61 with open(filepath,'rb') as f:#把光标放到最后62 f.seek(0,2)#直接跑到文件末尾去了63 while True:#循环去读64 line=f.readline()#读一行65 if line:#如果有值66 yield line#把这个值返回,让这个值持续运行67 else:#如果没有值68 time.sleep(0.05)69 70 def grep(lines,pattern):#lines,pattern是匹配的东西71 for line in lines:72 line=line.decode('utf-8')#把数字转成字符串类型73 if pattern in line:74 yield line#只干过滤的活75 76 77 lines=grep(tail('access.log'),'404')78 79 for line in lines:80 print(line)81 82 83 #了解知识点:yield表达式形式的用法84 def eater(name):85 print('%s ready to eat' %name)86 food_list=[]#加一个列表87 while True:88 food=yield food_list#food=yield='一盆骨头'#只要写成yield就是生成器了,89 food_list.append(food)90 print('%s start to eat %s' %(name,food))91 92 93 e=eater('alex')94 95 #首先初始化:#初始化一次就是next(e)96 print(e.send(None)) # 等同于next(e)97 #然后e.send:1 从暂停的位置将值传给yield,在用yield给前面的变量 2、与(就是next操作)next一样98 print(e.send('一桶泔水'))99 print(e.send('一盆骨头'))
面向编程
三元表达式
1 def my_max(x,y): 2 if x >= y: 3 return x 4 else: 5 return y 6 7 x=10 8 y=20 9 10 # res=x if x >= y else y11 # print(res)12 13 name=input('>>: ').strip()14 15 res='Sb' if name == 'alex' else 'NB'16 print(res)
列表推导式和生成器表达式
1 #1 列表推导式 2 # l=[] 3 # for i in range(1,11): 4 # res='egg'+str(i) 5 # l.append(res) 6 # 7 # print(l) 8 9 # l=['egg'+str(i) for i in range(1,11)]10 # print(l)11 12 # l1=['egg'+str(i) for i in range(1,11) if i >= 6]13 # print(l1)14 15 # l1=[]16 # for i in range(1,11):17 # if i >= 6:18 # l1.append('egg'+str(i))19 #20 21 #2 生成器表达式22 23 # g=('egg'+str(i) for i in range(0,1000000000000000000000000000000000))24 # print(g)25 # print(next(g))26 # print(next(g))27 # print(next(g))28 29 30 #练习31 names=['egon','alex_sb','wupeiqi','yuanhao']32 33 # names=[name.upper() for name in names]34 # print(names)35 36 # sbs=[name for name in names if name.endswith('sb')]37 # print(sbs)38 39 40 # obj=list('abcdef')41 # print(obj)42 43 # print(max([1,2,3,4,5]))44 45 # g=(i for i in range(10))46 # print(max(g))47 #48 # print(max(g))49 50 with open('a.txt','r',encoding='utf-8') as f:51 # l=[]52 # for line in f:53 # # print(len(line))54 # l.append(len(line))55 56 # g=(len(line) for line in f)57 # res=max(g)58 # print(res)59 60 # print(max(len(line) for line in f))61 62 print(sum(len(line) for line in f))
递归调用
1 #递归调用:在调用一个函数的过程中,直接或者间接又调用该函数本身,称之为递归调用 2 #递归必备的两个阶段:1、递推 2、回溯 3 4 # import sys 5 # print(sys.getrecursionlimit()) 6 # sys.setrecursionlimit(2000) 7 # print(sys.getrecursionlimit()) 8 9 # def func(n):10 # print('---->',n)11 # func(n+1)12 #13 # func(0)14 15 16 # def bar():17 # print('from bar')18 # func()19 #20 # def func():21 # print('from func')22 # bar()23 #24 # func()25 26 27 # age(5) = age(4) + 228 # age(4) = age(3) + 229 # age(3) = age(2) + 230 # age(2) = age(1) + 231 #32 # age(1) = 1833 34 # age(n)=age(n-1)+2 # n > 135 # age(1) = 18 #n = 136 37 38 # def age(n):39 # if n == 1:40 # return 1841 # return age(n-1) + 242 #43 # res=age(5)44 # print(res)45 46 47 # l=[1,[2,[3,[4,[5,[6,[7,]]]]]]]48 #49 #50 # def func(l):51 # for item in l:52 # if type(item) is list:53 # func(item)54 # else:55 # print(item)56 57 58 59 # def func():60 # print('===>')61 # func()62 #63 # func()
二分法
1 #了解的知识点 2 l=[1,2,10,30,33,99,101,200,301,402] #从小到大排列的数字列表 3 4 def binary_search(l,num): 5 print(l) 6 if len(l) == 0: 7 print('not exists') 8 return 9 mid_index=len(l) // 210 if num > l[mid_index]:11 #往右找12 binary_search(l[mid_index+1:],num)13 14 elif num < l[mid_index]:15 #往左找16 binary_search(l[0:mid_index],num)17 else:18 print('find it')19 20 # binary_search(l,301)21 binary_search(l,302)
匿名函数
1 # def func(): #func=内存地址 2 # print('from func') 3 # 4 # func() 5 # func() 6 7 8 # 内存地址 9 # def my_sum(x,y):10 # return x+y11 12 # print(lambda x,y:x+y)13 # print((lambda x,y:x+y)(1,2))14 15 # func=lambda x,y:x+y16 # # print(func)17 # print(func(1,2))18 19 20 #max,min,sorted,map,reduce,filter21 # salaries={22 # 'egon':3000,23 # 'alex':100000000,24 # 'wupeiqi':10000,25 # 'yuanhao':200026 # }27 # print(max(salaries))28 29 # s='hello'30 # l=[1,2,3]31 # g=zip(s,l)32 # # print(g)33 # print(list(g))34 35 # g=zip(salaries.values(),salaries.keys())36 # # print(list(g))37 # print(max(g))38 39 # def func(k):40 # return salaries[k]41 42 # print(max(salaries,key=func)) #key=func('egon')43 44 # print(max(salaries,key=lambda k:salaries[k])) #key=func('egon')45 # print(min(salaries,key=lambda k:salaries[k])) #key=func('egon')46 47 48 49 50 51 52 #sorted53 # salaries={54 # 'egon':3000,55 # 'alex':100000000,56 # 'wupeiqi':10000,57 # 'yuanhao':200058 # }59 # print(sorted(salaries,key=lambda k:salaries[k]))60 # print(sorted(salaries,key=lambda k:salaries[k],reverse=True))61 62 63 #map,reduce,filter64 # names=['alex','wupeiqi','yuanhao']65 # l=[]66 # for name in names:67 # res='%s_SB' %name68 # l.append(res)69 #70 # print(l)71 72 # g=map(lambda name:'%s_SB' %name,names)73 # # print(g)74 # print(list(g))75 76 77 # names=['alex_sb','wupeiqi_sb','yuanhao_sb','egon']78 # g=filter(lambda x:x.endswith('sb'),names)79 # print(g)80 # print(list(g))81 82 83 84 from functools import reduce85 print(reduce(lambda x,y:x+y,range(1,101),100))
内置函数
1 #了解 2 # print(abs(-1)) 3 4 # print(all([1,'a','b',0])) 5 # print(all([])) 6 7 # print(any([None,False,0,1])) 8 # print(any([])) 9 10 11 # print(bin(11)) 12 # print(hex(11)) 13 # print(oct(11)) 14 15 # print('xxx'.encode('utf-8')) 16 # print(bytes('xxx',encoding='utf-8')) 17 18 # print(callable(max)) 19 20 # print(chr(65)) 21 # # print(chr(90)) 22 # # print(chr(39)) 23 # print(ord('A')) 24 # print(ord('@')) 25 26 27 # import os 28 # print(dir(os)) 29 30 31 # s=set({ 1,2,3}) 32 # s.add(4) 33 # print(s) 34 35 # s=frozenset({ 1,2,3}) #不可变集合 36 37 # print(hash('xxx')) 38 39 # l=[1,2,'a',4] 40 # print(list(reversed(l))) 41 42 43 # s=slice(1,5,2) 44 # l=['a','b','c','d','e'] 45 # 46 # # print(l[1:5:2]) 47 # # print(l[1:5:2]) 48 # 49 # print(l[s]) 50 51 52 # print(vars() is locals()) 53 54 55 #面向对象 56 classmethod 57 staticmethod 58 property 59 60 61 hasattr 62 getattr 63 setattr 64 delattr 65 66 isinstance 67 issubclass 68 69 object 70 71 super 72 73 # obj.__dict__() #vars(obj) 74 75 #__import__ 76 # choice=input('>>: ') 77 # print(choice,type(choice)) 78 # 79 # # import 'time' 80 # m=__import__(choice) 81 # m.sleep(10) 82 83 84 85 #掌握: 86 #divmod 87 # print(divmod(10011,25)) 88 89 90 #enumerate 91 # l=['a','b','c'] 92 93 # for i in l: 94 # print(l.index(i),i,) 95 96 # for i,v in enumerate(l): 97 # print(i,v) 98 99 #eval:100 # res=eval('[1,2,3]')101 # print(res,type(res))102 103 # res=exec('[1,2,3]')104 # print(res)105 106 #pow107 # res=pow(2,3,3) # (2 ** 3 )%3108 # print(res)109 110 #round111 # print(round(3.5))