python之路——14
王二学习python的笔记以及记录,如有雷同,那也没事,欢迎交流,wx:wyb199594
复习
1.迭代器
1.双下方法:不常直接调用,是通过其他语法触发的
2.可迭代的:可迭代协议——含有__iter__() print('__iter__' in dir.(数据))
可以被for循环
3.迭代器协议:含有__iter__()和__next__()
可迭代
可迭代的通过__iter__()可以得到一个迭代器
4.迭代器特点:方便使用;所有数据只能取一次;节省内存
2.生成器
1.本质:是一种迭代器
2.表现形式: 生成器函数
生成器表达式
3.生成器函数: 含有yield 的函数
调用时,不执行,返回一个生成器
4.调用生成器中数据的方法:1.next 2.for 3.强制转换数据类型
学习内容
1.send ——第一次取值和最后一个yield不能用send
2.生成器表达式
3.各种推导式
遍历操作
筛选操作
代码区
1.生成器
def wahaha(): for i in range(200): yield '娃哈哈%s'%i g = wahaha() for i in g: print(i) def generator(): print('123') yield 1 print('345') yield g = generator() ret = g.__next__() print('***',ret) ret = g.__next__() print('***',ret)
2.移位平均数,即每接受一个数,都重新计算平均数
# 1号 ''' def average(): sum = 0 count = 0 avg = 0 while 1: num = yield sum += num count += 1 avg = sum/count yield avg avg_g = average() avg_g.__next__() avg1 = avg_g.send(10) print(avg1) avg_g.__next__() avg1 = avg_g.send(20) print(avg1) ''' # 2号 ''' def average(): sum = 0 count = 0 avg = 0 num = 0 while 1: num = yield avg sum += num count += 1 avg = sum/count avg_g = average() avg_g.__next__() avg1 = avg_g.send(10) print(avg1) avg1 = avg_g.send(20) print(avg1) ''' # 3号 ''' def initial(f): def inner(*args, **kwargs): ret = f(*args, **kwargs) ret.__next__() return ret return inner @initial def average(): sum = 0 count = 0 avg = 0 num = 0 while 1: num = yield avg sum += num count += 1 avg = sum/count avg_g = average() avg1 = avg_g.send(10) print(avg1) avg1 = avg_g.send(20) print(avg1)
3.生成器表达式
li = ['鸡蛋%s'%i for i in range(10)] # 列表推导式 print(li) g = (i for i in range(10)) print(g)
4.yield from 用法
def gen1(): for c in 'AB': yield c for i in range(3): yield i print(list(gen1())) def gen2(): yield from 'AB' yield from range(3) print(list(gen2()))
5.各种推导式
# 30以内能被3整除的数 列表推导式 ''' g = (i for i in range(30) if i % 3 == 0) for i in g: print(i) print([i for i in range(30) if i % 3 == 0]) ''' # 嵌套列表中 名字含有两个e的名字,,,str.count ''' names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'], ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] li = [name for i in names for name in i if name.count('e') == 2] print(li) ''' # 字典推导式 1.对调key 和 value ''' mcase = {'a': 10, 'b': 34} mcase_frequency = {mcase[k]: k for k in mcase.keys()} print(mcase_frequency) ''' # 2.合并大小写对应的value值,将k统一成小写 ''' mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3} mcase_1 = {i.lower() : mcase.get(i.upper(),0)+ mcase.get(i.lower(),0) for i in mcase} print(mcase_1) ''' # 集合推导式 ''' squared = {x**2 for x in [1, -1, 2]} print(squared) '''
6.练习
# 例1: 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母 li = ['asd', 'asdd', 'qwe23','a','as','asd'] li1 = [i.upper() for i in li if len(i)>= 3] print(li1) # 例2: 求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表 li = [(x,y) for x in range(0,6,2) for y in range(1,6,2)] print(li) # 例3: 求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]] M = [[1,2,3],[4,5,6],[7,8,9]] li = [row[2] for row in M] print(li)

浙公网安备 33010602011771号