# 生成器 —— 迭代器
# 生成器函數
# 含有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)
sendpython
#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)
生成器表達式ide
#[每個元素或者是和元素相關的操做 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)