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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

列表/字典生成式、生成器(generator)、迭代器(Iterator)

發(fā)布時(shí)間:2023/12/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 列表/字典生成式、生成器(generator)、迭代器(Iterator) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

列表生成式

列表生成式即List Comprehensions,是Python內(nèi)置的非常簡(jiǎn)單卻強(qiáng)大的可以用來(lái)創(chuàng)建list的生成式。


?

''' 在列表中存放1-10的數(shù)據(jù) ''' #第一種方式 list0 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] #第二種方式 list0 = list(range(1, 11)) #第三種方式 list0 = [] for i in range(1, 11):if i % 2 != 0:list0.append(i) #列表中存放1-10的偶數(shù),用列表生成式來(lái)寫 list0 = [i for i in range(1, 11) if i % 2 != 0]''' 列表生成器的格式: [存放于列表中的元素 元素來(lái)源 元素篩選條件] '''

練習(xí):

list0 = [" ? ", "\nabc", "\t", "hello"]
在list0的基礎(chǔ)上 快速的生成一個(gè)列表,列表的存放的元素是非空白序列

#如何判斷一個(gè)序列是空白字符序列 ---> 按照空白進(jìn)行切割 列表的長(zhǎng)度為0 # 去除字符序列兩端空白 strip() ---> 按照空白區(qū)去除兩端的內(nèi)容 如果最終剩下的是空序列res = [item for item in list0 if len(item.split()) != 0] print(res) res = [item for item in list0 if len(item.strip()) != 0] print(res)關(guān)于strip() ''' any whitespace string is a separator and empty strings are removed from the result. 如果使用的是空白分割符的話 會(huì)將生成的列表中中的空字符序列給移除掉 ''' #判斷數(shù)據(jù)是否是指定類型 isinstance() print(type(a)) res = isinstance(a, str) print(res)

字典生成式


''' dict0 = {"英語(yǔ)":66, "數(shù)學(xué)":78, "政治":42, "語(yǔ)文":59}去除掉字典中value < 60的數(shù)據(jù) ''' dict0 = {"英語(yǔ)":66, "數(shù)學(xué)":78, "政治":42, "語(yǔ)文":59} #第一種方式 new_dict = {} for k, v in dict0.items():if v >= 60:new_dict[k] = v#利用字典生成式 dict1 = {k:v for k, v in dict0.items() if v >= 60} print(dict1)

生成器(generator)

Python中,這種一邊循環(huán)一邊計(jì)算的機(jī)制,稱為生成器:generator。

生成器可以生成一批數(shù)據(jù),但是這些數(shù)據(jù)不會(huì)立即存放于內(nèi)存中 ,內(nèi)存中存放的是生成器對(duì)象,保存生成數(shù)據(jù)的方法。


''' 聲明生成器 ''' #第一種方式 gene = (i for i in range(1, 10001)) #第二種方式 函數(shù)的return改為yield def test():for i in range(1, 10001):yield iprint(i,"yield之后執(zhí)行的語(yǔ)句") # 當(dāng)下一次獲取時(shí)候回執(zhí)行 ''' 獲取數(shù)據(jù) '''#通過(guò)next方法,可以獲取數(shù)據(jù),直到拋出StopIteration錯(cuò)誤 print(gene.next()) print(gene.next()) ... print(gene.next()) # StopIteration 當(dāng)生成器中數(shù)據(jù)已經(jīng)取完了,再獲取的話就會(huì)報(bào)錯(cuò)#通過(guò)for循環(huán)獲取數(shù)據(jù) 可以忽略StopIteration錯(cuò)誤 ge = test() for i in range(10):value = next(ge)print(value)

迭代器(Iterator)


#可以使用迭代器進(jìn)行遍歷 from collections import Iterator#符合這個(gè)類型的都可以通過(guò)for in進(jìn)行遍歷 from collections import Iterableres = isinstance(11, Iterable) #Falseres = isinstance("11", Iterable) #Trueres = isinstance([], Iterable) #Trueres = isinstance((), Iterable) #Trueres = isinstance({}, Iterable) #Trueres = isinstance(set(), Iterable) #True


能夠使用for in遍歷的數(shù)據(jù)不一定可以使用迭代器來(lái)進(jìn)行遍歷
迭代器的遍歷是通過(guò)next方法進(jìn)行遍歷的
能使用迭代器來(lái)進(jìn)行遍歷 前提必須是屬于Itarator這種類型

為什么list、dict、str等數(shù)據(jù)類型不是Iterator?

因?yàn)镻ython的Iterator對(duì)象表示的是一個(gè)數(shù)據(jù)流,Iterator對(duì)象可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)數(shù)據(jù),直到?jīng)]有數(shù)據(jù)時(shí)拋出StopIteration錯(cuò)誤??梢园堰@個(gè)數(shù)據(jù)流看做是一個(gè)有序序列,但我們卻不能提前知道序列的長(zhǎng)度,只能不斷通過(guò)next()函數(shù)實(shí)現(xiàn)按需計(jì)算下一個(gè)數(shù)據(jù),所以Iterator的計(jì)算是惰性的,只有在需要返回下一個(gè)數(shù)據(jù)時(shí)它才會(huì)計(jì)算。

Iterator甚至可以表示一個(gè)無(wú)限大的數(shù)據(jù)流,例如全體自然數(shù)。而使用list是永遠(yuǎn)不可能存儲(chǔ)全體自然數(shù)的。

a = "11"next(a) print(res) # 'str' object is not an iteratorres = isinstance("", Iterator) #Falseres = isinstance([], Iterator) #Falseres = isinstance({}, Iterator) #Falseres = isinstance((), Iterator) #Falseres = isinstance(set(), Iterator) #False

如何將可以使用for in 進(jìn)行遍歷的數(shù)據(jù) 也可以使用迭代器進(jìn)行遍歷??
可以將數(shù)據(jù)通過(guò)iter()的方法將其轉(zhuǎn)化為Iterator的類型?

ite = iter(["12", "17", "34", "99"]) value = next(ite) print(value)

小結(jié):

凡是可作用于for循環(huán)的對(duì)象都是Iterable類型;

凡是可作用于next()函數(shù)的對(duì)象都是Iterator類型,它們表示一個(gè)惰性計(jì)算的序列;

集合數(shù)據(jù)類型如list、dict、str等是Iterable但不是Iterator,不過(guò)可以通過(guò)iter()函數(shù)獲得一個(gè)Iterator對(duì)象。

總結(jié)

以上是生活随笔為你收集整理的列表/字典生成式、生成器(generator)、迭代器(Iterator)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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