生成器


# 生成器 —— 迭代器
# 生成器函數
# 含有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)
各種推導式及應用

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM