生成器

# 生成器 —— 迭代器
# 生成器函數
# 含有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)
各類推導式及應用
相關文章
相關標籤/搜索