# 生成器 —— 迭代器
# 生成器函数
# 含有yield关键字的函数都是生成器函数
# 生成器函数的特点
#调用之后函数内的代码不执行,返回生成器
#每从生成器中取一个值就会执行一段代码,遇见yield就停止。
#如何从生成器中取值:
# for :如果没有break会一直取直到取完
# next :每次只取一个
# send :不能用在第一个,取下一个值的时候给上个位置传一个新的值
# 数据类型强制转换 :会一次性把所有数据都读到内存里
def generator(): for i in range(20): yield '哇哈哈%s'%i g = generator() #调用生成器函数得到一个生成器 for i in g: #或print(list(g)) 数据类型强制转换 print(i)
def tail(filename): f = open(filename,encoding='utf-8') while True: line = f.readline() if line.strip(): yield line.strip() g = tail('file') for i in g: if 'python' in i: print('***',i)
send
#send 获取下一个值的效果和next基本一致
#只是在获取下一个值的时候,给上一yield的位置传递一个数据
#使用send的注意事项
# 第一次使用生成器的时候 是用next获取下一个值
# 最后一个yield不能接受外部的值
# def generator(): # print(123) # content = yield 1 # print('=======',content) # print(456) # arg = yield 2 # '''''' # yield # g = generator() # ret = g.__next__() # print('***',ret) # ret = g.send('hello') # print('***',ret)
生成器表达式
#[每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型] #遍历之后挨个处理
#[满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件] #筛选功能
# egg_list=['鸡蛋%s'%i for i in range(10)] #列表推导式
# print(egg_list)
# 老母鸡=('鸡蛋%s'%i for i in range(10)) #生成器表达式
# print(老母鸡)
# for 蛋 in 老母鸡:
# print(蛋)

# #30以内所有能被3整除的数 # ret = [i for i in range(30) if i%3 == 0] #完整的列表推导式 # g = (i for i in range(30) if i%3 == 0) #完整的生成器推导式 # print(ret) # # #30以内所有能被3整除的数的平方 # ret = [i*i for i in (1,2,3,4) if i%3 == 0] # ret = (i*i for i in range(30) if i%3 == 0) # print(ret) # # # 例三:找到嵌套列表中名字含有两个‘e’的所有名字 # names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'], # ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] # ret = [name for lst in names for name in lst if name.count('e') ==2] # ret = (name for lst in names for name in lst if name.count('e') ==2) # print(ret) #字典推导式 # 例一:将一个字典的key和value对调 # mcase = {'a': 10, 'b': 34} # #{10:'a' , 34:'b'} # mcase_frequency = {mcase[k]: k for k in mcase} # print(mcase_frequency) # 例二:合并大小写对应的value值,将k统一成小写 # mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3} # #{'a':10+7,'b':34,'z':3} # mcase_frequency = {k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) for k in mcase} # print(mcase_frequency) #集合推导式,自带结果去重功能 # squared = {x**2 for x in [1, -1, 2]} # print(squared)