1. 程式人生 > >Python生成器、三元表達式、列表生成式、字典生成式、生成器表達式

Python生成器、三元表達式、列表生成式、字典生成式、生成器表達式

pan name generator object bject python AC 拉鏈 一個

什麽是生成器:
只要函數內部包含有yield關鍵字,那麽函數名()的到的結果(生成器地址)就是生成器,
再調用函數不會執行函數內部代碼
這個生成器本身有 _iter_ he _next_功能(即生成器就是一個叠代器)

為什麽要用生成器:
生成器是一種自定義叠代器的方式


總結yield的功能
1、提供一種自定義叠代器的方式
2、yield可以暫停住函數,返回值

yield he return
相同點:都是用在函數內,都可以返回值,沒有類型限制,沒有個數限制
不同點:return只能返回一次值,yield可以返回多次值


1.生成器next取值,例如1:
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)
res1=next(g) #把yield後面的返回值賦值給res1 #取到一個值,這個值是由func中的yield控制的,所以next後會逐一從上到下打印
print(‘第一次的返回值:‘,res1)

print(‘=‘*100)
res2=next(g)
print(‘第二次的返回值:‘,res2)

輸出結果為:
<generator object func at 0x05597BD0>
first1
first2
first3
第一次的返回值: 1
===============================================================
second1
second2
second3
第二次的返回值: 2


1.生成器next取值(for循環),例如2:

for item in g: #g=iner(g) #item=next(g)
pass #註意next(g)只會打印函數體print的結果,碰到yield會暫停pass,yield,繼續下次循環

輸出結果:
first1
first2
first3
second1
second2
second3
third
fourth


實際每次yield的值已經賦值給了item=next(g),item,只是上面沒有打印
for item in g:
print(item)
first1
first2
first3
1
second1
second2
second3
2
third
3
fourth

2.自定義range函數模型(例如:my_range)
def my_range(start,stop,step=1):
while start < stop:
yield start
start+=step

obj=my_range(1,7,2) #顧頭不顧尾只能從1,2,3,4,5,6中取值
print(next(obj)) #1
print(next(obj)) #3
print(next(obj)) #5
print(next(obj)) #報錯StopIteration

3.三元表達式 (條件成立時返回值 if 條件 else 條件不成立時返回值
x=10
y=20
res = x if x > 10 else y
print(res)


4.列表生成式:(值放在for循環的左邊))(給一筐雞蛋)

#原始取值
l=[]
for i in range(1,11):
l.append(i)
print(l)

改進為:
l=[i for i in range(1,11)]
print(l) #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 得到的是一組列表,占內存空間大

例如1:
names=[‘alex‘,‘wxx‘,‘lxx‘]
names=[name+‘SB‘ for name in names]
print(names) #[‘alexSB‘, ‘wxxSB‘, ‘lxxSB‘]


5.生成器表達式:(給一只雞)
# 相對列生成式省空間,剛開始什麽都不執行,t本身就是一個叠代器,需要逐一取值
t=(i for i in range(100000000))
print(t) #<generator object <genexpr> at 0x05057BD0> 得到的是一個生成器不占內存空間
print(next(t)) #0
print(next(t)) #1
print(next(t)) #2


6.字典生成式:()
keys=[‘name‘,‘age‘,‘sex‘]
values=[‘egon‘,18,‘male‘]
res=zip(keys,values)
print(list(res)) #[(‘name‘, ‘egon‘), (‘age‘, 18), (‘sex‘, ‘male‘)]
方式一
d={ }
for k,v in zip(keys,values):
d[k]=v
print(d) #{‘name‘: ‘egon‘, ‘age‘: 18, ‘sex‘: ‘male‘}

方式二
d={k:v for k,v in zip(keys,values)}
print(d) #{‘name‘: ‘egon‘, ‘age‘: 18, ‘sex‘: ‘male‘}


7.zip()拉鏈函數:
s=‘hello‘
l=[1,2,3,]
res=zip(s,l)
print(list(res)) #[(‘h‘, 1), (‘e‘, 2), (‘l‘, 3)]

8.max函數(取位數最長的值len)
情況1:
with open(‘a.txt‘,encoding=‘utf-8‘) as f:
nums=[len(line) for line in f] #【】nums裏面已經把值全部存放到列表中
print(max(nums)) #返回值32
print(max(nums)) #在任何地方取都OK #返回值32
# 情況2:
with open(‘a.txt‘,encoding=‘utf-8‘) as f:
nums=(len(line) for line in f) #如果(),nums是叠代器對象,每取一次裏面就沒有了
print(max(nums)) #返回值32
print(max(nums)) #max() arg is an empty sequence 上面已經去過最大值,再取提示為空

Python生成器、三元表達式、列表生成式、字典生成式、生成器表達式