列表/字典生成式、生成器(generator)、迭代器(Iterator)
列表生成式
列表生成式即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è)列表,列表的存放的元素是非空白序列
字典生成式
''' 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的類型?
小結(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)題。
- 上一篇: 前端面试常见题目
- 下一篇: 企业WiFi管理解决方案