Python產生器、三元運算式、列表產生式、字典產生式、產生器運算式

來源:互聯網
上載者:User

標籤:fir   函數名   迭代   zip   返回   地方   python產生器   print   包含   

什麼是產生器:
只要函數內部包含有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產生器、三元運算式、列表產生式、字典產生式、產生器運算式

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.