生成器 雜項

2021-08-20 17:28:02 字數 4466 閱讀 3670

1.什麼是生成器?

在函式內但凡出現 yield關鍵字,再呼叫函式就不會執行函式體**,會返回乙個值,該值稱之為生成器

生成器本質就是迭代器

2.為什麼要有生成器?

生成器是一種自定義迭代器的方式

3.如何用生成器

# def func():

#     print('first1')

#     print('first2')

#     print('first3')

#     yield 1 #暫停

#     print('second1')

#     print('second2')

#     print('second3')

#     yield 2  #暫停

#     print('third')

#     yield 3 #暫停

#     print('fourth')

# g=func()

# print(g)

# print(g.__iter__().__iter__().__iter__() is g)

# res1=next(g)

# print('第一次的返回值:',res1)

# print('='*100)

# res2=next(g)

# print('第二次的返回值:',res2)

# print('='*100)

# res3=next(g)

# print('第三次的返回值:',res3)

# print('='*100)

# res4=next(g)

# print('第三次的返回值:',res4)

# for item in g: #g=iter(g) #item=next(g)

#     print(item)

# i=range(1,1000)

# for item in range(1,100000000000000):

#     print(item)

def my range(start,stop,step=1):

while start總結yield的功能

1、提供一種自定義迭代器的方式

2、yield可以暫停住函式,返回值

yield vs return

相同點:都是用在函式內,都可以返回值,沒有型別限制,沒有個數限制

不同點:return只能返回一次值,yield可以返回多次值了解知識

yield 值

x=yield

x=yield 值

def dog(name):

food_list=[ ]

print('狗哥 %s 準備開吃' %name)

while true:

food=yield food_list  #暫停 food=yield='一桶泔水'

print('狗哥[%s]吃了<%s>' %(name,food))

alex_dog=dog('alex')

res1=next(alex_dog) #初始化,即讓狗準備好

print(res1)

next(alex_dog)     #等同於alex_dog,send(none)

next(alex_dog)

res2=alexa_dog.send(('一泡翔','咖啡伴侶'))

print(res2)

res3=alex_dog.send('一桶泔水')

print(res3)

三元表示式

條件成立時的返回值    if 條件 else 條件不成立時的返回值

def max2(x,y):

if x>y:

return x

else:

return y

列表生成式

l=[item**2 for item n range(1,11)]

print(l)

names=['alex','wxx','lxx']

l=[ ]

for name in names:

names=l

print(l)

下列**執行效果等同於上面的,因為三元表示式的列表生成式,**量更少,**更簡潔但最多for兩層,不然會失去三元表示式的優勢

names=[name+'sb' for name in names]

print(names)

例1:

names=['alex','wxx','egon','lxx','zhangmingyan']

l=[ ]

for name in names:

print(l)

一行**代替上面多行,結果相同.......

names=[name+ 'sb' for name in names if != '']

print(names)

例2:

l=[item**2 for item in range(1,5) if item >2]

print(l)

例3:

names=['egon','alex_sb','wupeiqi','yuanhao']

names=[name.upper() for name in names]

print(names)

例3:

names=['egon','alex_sb','wupeiqi','yuanhao']

nums=[len(names) for name in names if not name.endswith('sb')] 

print(nums)

字典生成式:

s1='hello'

l1=[1,2,3,4,5]

res=zip(s1,l1)

print(res)

print(list(res))

# 結果:[('h', 1), ('e', 2), ('l', 3), ('l', 4), ('o', 5)]

keys=

a=keys

print(a)

keys=['name','age','***']

values=['egon',18,'male']

d=print(d)

例1:

#keys=

#a=key

#print(a)

keys=['name','age','***']

values=['egon',18,'male']

d=print(d)

結果:

例2:

常規做法

info=

keys=info.keys()

print(keys)

iter_keys=keys.__iter__()

values=info.values()

print(values)

三元表示式:

info=

keys=info.keys()

d=print(d)

結果:

生成器表示式

g=(i for i in range(10))

# print(g)

print(next(g))

print(next(g))

nums=[11,22,33,44,55]

print(max(nums))

with open('a.txt',encoding='utf-8') as f:

nums=(len(line) for line in f)

print(max(nums))

print(max(nums))

print(max(nums))

l=['egg%s' %i for i in range(100)]

print(l)

g=('egg%s' %i for i in range(1000000000000))

# print(g)

print(next(g))

print(next(g))

[ ] 返回的是列表 記憶體占用大

返回的是字典或者集合 記憶體占用大

( ) 返回的是生成器,記憶體占用小,檔案再大也沒關係,都是逐行**執行的

python 生成器作用 Python生成器

生成器介紹 在函式內部包含yield關鍵字,那麼該函式執行的結果是生成器,生成器就是迭代器。生成器的功能 把函式結果做成迭代器 以一種優雅的方式封裝好iter,next 提供了一種自己定義迭代器的方式。使用生成器建立乙個迭代器 def a print a yield 11 使用yield,執行後返回...

python生成器好處 Python生成器筆記

python中三大器有迭代器,生成器,裝飾器,本文主要講述生成器。主要從生成器的概念,本質,以及yield關鍵字的使用執行過程。本質 生成器是一類特殊的迭代器,使用了yield關鍵字的函式不再是函式,而是生成器。使用了yield的函式就是生成器 1.yield關鍵字有兩點作用 1.1 yield語句...

古文生成器python python(生成器)

生成器 先從列表生成式說起 可以通過簡單的式子,生成有規律的列表 如果把 換為 會發生什麼呢?看到 x 存的不再是列表,而是乙個位址,而這個位址就是我們的生成器物件的位址 這東西有什麼用呢?當然時,節省記憶體啦 假設現在有很龐大的一組資料要處理,貌似不可能把它一次性載入記憶體再進行處理,這時候就體現...