日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python列表推导式实现从1加到100_python之生成器和列表推导式

發(fā)布時(shí)間:2025/3/20 python 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python列表推导式实现从1加到100_python之生成器和列表推导式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、生成器函數(shù)

1、生成器:就是自己用python代碼寫的迭代器,生成器的本質(zhì)就是迭代器(所以自帶了__iter__方法和__next__方法,不需要我們?nèi)?shí)現(xiàn))。

2、用以下兩種方式構(gòu)建一個(gè)生成器:

1,生成器函數(shù):跟常規(guī)函數(shù)定義類似,但是,使用yield語句而不是return語句返回結(jié)果。

yield語句一次返回一個(gè)結(jié)果,在每個(gè)結(jié)果中間,掛起函數(shù)的狀態(tài),以便下次從它離開的地方繼續(xù)執(zhí)行。

2,生成器表達(dá)式:類似于列表推導(dǎo),但是,返回的是生成器的一個(gè)對(duì)象,

而不是一次構(gòu)建一個(gè)結(jié)果列表。

3、生成器函數(shù)

3-1、先看一般的函數(shù):

deffunc1(x):

x+= 1

returnx

func1(5) #函數(shù)的執(zhí)行命令,并且接收函數(shù)的返回值。

print(func1(5)) #6

3-2、再看生成器函數(shù):

deffunc1(x):

x+= 1

print(666)yieldx

x+=2

print(777)print(x)yield 'xiaobai'x+=3g= func1(5) #此時(shí)的func1(5)不會(huì)執(zhí)行函數(shù),因?yàn)樗皇巧善骱瘮?shù)對(duì)象

print(g) #

print(g.__next__()) #666 6

print(next(g)) #777 8 xiaobai

3-3、yield與return的區(qū)別:

return:結(jié)束函數(shù),給函數(shù)的執(zhí)行者返回值

yield:不會(huì)結(jié)束函數(shù),一個(gè)next對(duì)應(yīng)一個(gè)yield,

執(zhí)行yield上面的代碼并給 生成器對(duì)象.__next__() 返回值

3-4、生成器函數(shù)與迭代器的區(qū)別

區(qū)別1:自定制的區(qū)別

迭代器由可迭代對(duì)象轉(zhuǎn)化而來,已經(jīng)‘寫死了’

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

l1.__iter__()

生成器可用自定制函數(shù)來定制

deffunc1(x):

x+= 1

yieldx

x+= 3

yieldx

x+= 5

yieldx

g1= func1(5)print(g1.__next__())print(g1.__next__())print(g1.__next__())

區(qū)別2:內(nèi)存級(jí)別的區(qū)別。

迭代器是需要可迭代對(duì)象進(jìn)行轉(zhuǎn)化,可迭代對(duì)象非常占內(nèi)存。

生成器直接創(chuàng)建,不需要轉(zhuǎn)化,從本質(zhì)就節(jié)省內(nèi)存。

deffunc1():for i in range(1000000):yieldi

g1=func1()for i in range(50):print(g1.__next__()) #一個(gè)next取一次值,可用for循環(huán)取值

3-5、send與next

先看例子:

deffunc1():print(1)

count= yield 6

print(count)print(2)

count1= yield 7

print(count1)print(3)yield 8g=func1()print(g.__next__()) #1 6

print(g.send('xiaobai')) #xiaobai 2 7

print(g.send('xiaigou')) #xiaogou 3 8

總結(jié):

send與next一樣,也是對(duì)生成器取值(執(zhí)行一個(gè)yield)的方法。

send可以給上一個(gè)yield 傳值。

注意小坑:

1,第一次取值只能用next

2,最后一個(gè)yield不可能得到send傳的值

3-6、生成器close()方法:

deffun():for i in range(5):yieldi

g=fun()print(g.__next__())print(g.__next__())print(g.__next__())

g.close()#直接把生成器的值取(刪)完了,后面就不能再取值

print(g.__next__()) #報(bào)錯(cuò)

a= (i for i in range(4))print(a.__next__())print(a.__next__())

a.close()print(a.__next__()) #報(bào)錯(cuò)

3-7、生成器函數(shù)的應(yīng)用例子

要制作一批量很大的衣服,用普通的函數(shù)只能一次全部制作完:

defcloth1(n):for i in range(n+1):print('衣服%s號(hào)' %i)

cloth1(100000) #一次全部制作完了

而用生成器函數(shù),需要制作多少就先制作多少:

defcloth2(n):for i in range(1,n+1):yield '衣服%s號(hào)' %i

g= cloth2(10000)

先制作50件:for i in range(50):print(g.__next__()) #衣服1號(hào),衣服2號(hào),衣服3號(hào)...衣服50號(hào)

再制作50件:for i in range(50):print(g.__next__()) #衣服51號(hào),衣服52號(hào),衣服53號(hào)...衣服100號(hào)

二、列表推導(dǎo)式,生成器表達(dá)式

1、普通方法創(chuàng)建一個(gè)元素為1到100的列表:

l1 =[]for num in range(1,101):

l1.append(num)print(l1)

2、列表推導(dǎo)式:一行代碼幾乎搞定你需要的任何的列表。

2-1、兩種方式:

循環(huán)模式

篩選模式

2-2、循環(huán)模式:[變量(加工后的變量) for 變量 in iterable]

#1到100的列表

l = [i for i in range(1,101)]print(l) #[1,2,3,4...100]

#python1到python15的列表

l2 = ['python%s' % i for i in range(1,16)]print(l2) #[python1,python2,python3...python15,]

#1到10的平方

l3 = [i*i for i in range(1,11)]print(l3) #[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

2-3、篩選模式 [變量(加工后的變量) for 變量 in iterable if 條件]

#30以內(nèi)的偶數(shù)

l4 = [i for i in range(1,31) if i % 2 ==0]print(l4) #[2, 4, 6, 8,10,...28, 30]

#30以內(nèi)能被3整除的數(shù)

l5 = [i for i in range(1,31) if i % 3 ==0]print(l5) #[3, 6, 9, 12, 15, 18, 21, 24, 27, 30]

#30以內(nèi)能被3整除的數(shù)的平方

l6 = [i**2 for i in range(1,31) if i % 3 ==0]print(l6) #[9, 36, 81, 144, 225, 324, 441, 576, 729, 900]

#找出列表中含有兩個(gè)'e'的元素

names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],

['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]

l7= [j for i in names for j in i if j.count('e') == 2]print(l7) #['Jefferson', 'Wesley', 'Steven', 'Jennifer']

2-4、列表推導(dǎo)式優(yōu)缺點(diǎn)

優(yōu)點(diǎn):一行解決,方便。

缺點(diǎn):容易著迷,不易排錯(cuò),不能超過三次循環(huán)。

列表推導(dǎo)式不能解決所有列表的問題,所以不要太刻意用。

3、生成器表達(dá)式:將列表推導(dǎo)式的[]換成()即可。

g = (i for i in range(100000000000))print(g) #生成器表達(dá)式左邊的變量g是生成器對(duì)象

print(g.__next__()) #0

print(g.__next__()) #1

print(g.__next__()) #2

上面代碼相當(dāng)于:deffunc():for i in range(100000000000):yieldi

g= func() #生成器對(duì)象

print(g.__next__())print(g.__next__())print(g.__next__())

4、擴(kuò)展

4-1、字典推導(dǎo)式

# 例一:將一個(gè)字典的key和value對(duì)調(diào)

dic= {'a': 10, 'b': 34}

new_dic= {dic[k]: k for k indic}print(new_dic)

# 結(jié)果:

# {10: 'a', 34: 'b'}

# 例二:合并大小寫對(duì)應(yīng)的value值,將k統(tǒng)一成小寫

dic= {'a': 10, 'b': 34, 'A': 7, 'Z': 3}

new_dic= {k.lower():dic.get(k.lower(),0) + dic.get(k.upper(),0) for k indic}print(new_dic)

# 結(jié)果:

# {'a': 17, 'b': 34, 'z': 3}

4-2、集合推導(dǎo)式

# 例一:計(jì)算列表中每個(gè)值的平方,自帶去重功能

set1= {x**2 for x in [1, -1, 2]}print(set1)

# 結(jié)果:

# {1, 4}

4-3、集合推導(dǎo)式和字典推導(dǎo)式的區(qū)別

相同點(diǎn):外層都是使用大括號(hào){}

不同點(diǎn):返回的形式是 key:values 形式的就是字典,返回的形式是 values1,values2...形式的是集合#集合推導(dǎo)式

set1 = {x**2 for x in (1, -1, 2)}print(set1,type(set1)) #{1, 4}

#字典推導(dǎo)式

dic1 = {x**2:x for x in (1, -1, 2)}print(dic1,type(dic1)) #{1: -1, 4: 2}

4-4、練習(xí)題

#例1: 過濾掉長度小于3的字符串列表,并將剩下的轉(zhuǎn)換成大寫字母

l1 = [i.upper() for i in ['asdf','a','b','qwe'] if len(i) >= 3]print(l1)#結(jié)果:#['ASDF', 'QWE']

#例2: 求(x,y)其中x是0-5之間的偶數(shù),y是0-5之間的奇數(shù)組成的元組列表

l2 = [(x,y) for x in range(6) if x % 2 ==0 for y in range(6) if y % 2 == 1]print(l2)#結(jié)果:#[(0, 1), (0, 3), (0, 5), (2, 1), (2, 3), (2, 5), (4, 1), (4, 3), (4, 5)]

#例3: 求M中3,6,9組成的列表

M = [[1,2,3],[4,5,6,24,3],[7,8,9,12,9]]

l3= [j for i in M for j in i for z in [3,6,9] if j / z == 1]print(l3)#結(jié)果:#[3, 6, 3, 9, 9]

總結(jié)

以上是生活随笔為你收集整理的python列表推导式实现从1加到100_python之生成器和列表推导式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。