1. 程式人生 > >10.2生成器

10.2生成器

Python 生成器 創建生成器 執行生成器

生成器

列表表達式回顧

# -*-coding:utf-8 -*-
__date__ = ‘2018/3/5‘
__author__ = ‘xiaojiaxin‘
__file_name__ = ‘生成器‘

#a1=[x*2 for x in range(10000000000)] #全部加載至內存,列表表達式

生成器創建的兩種方法

a=(x*2 for x in range(5))
print(a)
# <generator object <genexpr> at 0x000000E29B512990>
#裏面沒有值!!!!生成器只是一個對象

生成器執行的兩種方法

#就比如說列表和元組等都是菜,想吃就直接吃,生成器只是一個廚師,他會做菜,但是你要吃哪道菜,他才會去加載那一道菜

#第一種方法:使用內置方法
print(a.__next__())
#0
print(a.__next__())
#2
print(a.__next__())
#4

#第二種方法:使用next()方法
print(next(a))  #等價於Python2.x  a.next()
#6
print(next(a))
#8

# print(next(a))    #報警:停止叠代
# #StopIteration
# print(next(a))

#生成器就是一個可叠代對象(iteration叠代)
#for內部對b做了next()調用,之前的數據作為垃圾回收了
#for循環檢測是否還有數據,及時結束next()調用
b=(x for x in range(10))
for i in b:   #for內部對b做了next()調用,之前的數據作為垃圾回收了
    print(i)  #for循環檢測是否還有數據,及時結束next()調用
#生成器一共兩種創建方式
#第一種:(x for x in range(5))
#第二種:yield

生成器函數與普通函數的區別

def foo():
    print("haha")
    return 1
foo()
#haha
print(foo())   #執行函數,並返回返回值
#haha
#1
print(foo)
# <function foo at 0x000000A30D962E18>
def fou():
    print("123")
    yield 2    #只要有yield就是生成器對象

    print("456")
    yield 4

fou()
#      #空表示沒有執行fou()函數
print(fou())   #不執行函數,不返回函數返回值
# <generator object fou at 0x00000092754D2A40>
print(fou)
# <function fou at 0x000000A823DBD158>

#fou()是一個生成器對象
#有一個yield就只有一道菜,有多個yield就有多道菜

next(fou())   #執行fou()生成器對象
#123
next(fou())

大家對內容有任何問題,歡迎留言,定在第一時間解答,謝謝大家!

10.2生成器