国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - 淺析Python迭代器的高級用法

淺析Python迭代器的高級用法

2020-07-17 00:14TechFlow2019 Python

這篇文章主要介紹了Python迭代器的高級用法,在實(shí)際場景當(dāng)中非常實(shí)用,可以幫助我們大大簡化代碼的復(fù)雜度。感興趣的朋友可以了解下

跳過開頭

首先是跳過開始部分,這個(gè)在我們讀取文本的時(shí)候最常用。在實(shí)際的應(yīng)用當(dāng)中,比如記錄的日志或者是代碼等等,一般來說頭部都會附上一段說明,或者用注釋標(biāo)注或者是用特殊的符號標(biāo)記。這些信息是給用到數(shù)據(jù)的程序員看的,當(dāng)我們通過代碼獲取數(shù)據(jù)的時(shí)候,顯然是希望可以過濾掉這些信息的。

比如我們有一段數(shù)據(jù),它的開頭用#做了一些注釋:

?
1
2
3
4
5
6
# This is a data for student
# Rows 100
 
xiaoming, 17, 99;
xiaoli, 18, 98;
...

常規(guī)操作當(dāng)中,我們會創(chuàng)建一個(gè)打開文件的迭代器,我們通過遍歷這個(gè)迭代器去獲取文件當(dāng)中的數(shù)據(jù):

?
1
2
3
with open('xxxx.txt') as f:
  for line in f:
    print(line)

如果只是用來輸出還好,如果我們需要加工文件當(dāng)中的數(shù)據(jù),那么頭部的注釋信息就會干擾我們代碼的運(yùn)行。我們當(dāng)然可以手動加入一些判斷,但是這會比較麻煩,代碼也不夠美觀。針對這個(gè)問題,一個(gè)比較好的解決方案是dropwhile。

dropwhile是itemtools當(dāng)中的一個(gè)函數(shù),它可以接收一個(gè)我們自定義的過濾函數(shù)和迭代器重新生成一個(gè)新的迭代器,這個(gè)新的迭代器當(dāng)中會過濾掉之前迭代器頭部不符合我們要求的數(shù)據(jù):

在剛才的例子當(dāng)中我們想要過濾掉頭部加了#注釋的部分,我們可以這么操作:

?
1
2
3
4
from itertools import dropwhile
with open('xxxx.txt') as f:
  for line in dropwhile(lambda line: line.startswith('#'), f):
    print(line)

這樣出來的結(jié)果就沒有頭部我們不需要的內(nèi)容了。

當(dāng)我們知道頭部不符合情況的數(shù)據(jù)的格式的時(shí)候,可以使用dropwhile來規(guī)定過濾的格式。如果我們知道需要過濾的條數(shù),則可以使用另外一個(gè)工具,叫做islice,它的本質(zhì)是一個(gè)切片函數(shù),就像是Python當(dāng)中數(shù)組的切片功能一樣,可以切出迭代器當(dāng)中指定片段的數(shù)據(jù)。

舉個(gè)例子:

?
1
2
3
4
from itertools import dropwhile
with open('xxxx.txt') as f:
  for line in islice(f, 3, None):
    print(line)

這樣我們就會從第三行開始獲取,之前的數(shù)據(jù)會被過濾掉。它其實(shí)就代表著數(shù)組當(dāng)中[3: ]的切片操作。

迭代排列組合

我們都知道在C++當(dāng)中有一個(gè)叫做next_permutation的函數(shù),可以傳入一個(gè)數(shù)組,返回下一個(gè)字典序的排列。在Python當(dāng)中也有同樣的功能,但是是以迭代器的形式使用的。

舉個(gè)簡單的例子,比如我們有a, b, c三個(gè)元素,我們希望求出它的所有排列:

?
1
2
3
4
5
items = ['a', 'b', 'c']
from itertools import permutations
 
for p in permutations(items):
  print(p)

permutations還支持多傳一個(gè)參數(shù),比如上述的排列當(dāng)中我們希望只保留前兩個(gè)元素,除了切片之外,我們只需要多傳一個(gè)參數(shù)就好了,like this:

?
1
2
for p in permutations(items, 2):
  print(p)

除了排列之外,itertools當(dāng)中還支持組合,用法還是一樣,只是把函數(shù)名稱換成是combinations而已:

?
1
2
3
from itertools import combindations
for c in combinations(items):
  print(c)

在一般的組合當(dāng)中,一個(gè)元素一旦被選中那么它接下來就會從候選集當(dāng)中移除,再也不會被選中。如果我們希望獲得有放回的組合,我們可以再換一個(gè)函數(shù),這個(gè)函數(shù)名稱有點(diǎn)長,但是名字倒也直觀叫做combinations_with_replacement。但既然是有放回的抽樣,我們需要設(shè)定元素的數(shù)量,否則抽樣可以無限進(jìn)行下去。

?
1
2
for c in combinations_with_replacement(items, 3):
  print(c)

迭代合并后的序列

上一篇文章當(dāng)中我們介紹了zip可以同時(shí)迭代多個(gè)迭代器,除此之外還有一種情況是我們需要把多個(gè)迭代器串起來迭代。比如系統(tǒng)的日志打在了多個(gè)文件當(dāng)中,我們希望找出其中有error的日志來分析。這個(gè)時(shí)候,我們希望的不是同時(shí)讀取多個(gè)迭代器,而是希望能夠有辦法將多個(gè)迭代器的內(nèi)容串聯(lián)起來。這個(gè)功能就是itertools當(dāng)中的chain方法,它接受多個(gè)迭代器,當(dāng)我們遍歷的時(shí)候,會自動將多個(gè)迭代器的內(nèi)容串聯(lián)起來,我們可以無縫迭代。

舉個(gè)例子:

?
1
2
3
4
5
6
from itertools import chain
nums = [1, 2, 3]
chars = ['a', 'b', 'c']
 
for i in chain(nums, chars):
  print(i)

這樣我們會把nums和chars當(dāng)中的內(nèi)容一起輸出出來,就好像從頭到尾只執(zhí)行了一個(gè)迭代器一樣

你可能會說我們不用chain也可以實(shí)現(xiàn)啊,我們可以這樣:

?
1
2
for i in nums + chars:
  print(i)

的確,從結(jié)果上來看這樣也是行得通的。但是如果我們分析一下內(nèi)部執(zhí)行的時(shí)候的中間變量,會發(fā)現(xiàn)當(dāng)我們執(zhí)行nums+chars的時(shí)候,實(shí)際上是先創(chuàng)建了一個(gè)新的臨時(shí)list。然后在這個(gè)list當(dāng)中存儲nums和chars的數(shù)據(jù),也就是說我們迭代的其實(shí)是這個(gè)新的list。這帶來的結(jié)果是我們額外開辟了一段內(nèi)存,并且花費(fèi)了一些時(shí)間。如果我們使用chain,它并不會有這樣的中間變量,完全是通過迭代器來執(zhí)行的迭代,非常節(jié)省內(nèi)存,這也是chain的優(yōu)點(diǎn)。

歸并迭代的內(nèi)容

對于歸并操作我們應(yīng)該都不陌生,在之前的歸并排序以及一些題解的文章當(dāng)中我們見過很多次。同樣,我們在使用工具合并多個(gè)迭代器內(nèi)容的時(shí)候,如果迭代器當(dāng)中的內(nèi)容有序,我們也可以對多個(gè)迭代器當(dāng)中的元素進(jìn)行歸并,而不再需要我們自己手動操作。

使用我們之前介紹的heapq的庫可以非常輕松地做到這一點(diǎn),我們一起來看一個(gè)例子:

?
1
2
3
4
5
6
7
a = [1, 3, 5]
b = [2, 4, 6]
 
import heapq
 
for c in heapq.merge(a, b):
  print(c)

執(zhí)行之后,我們會得到[1, 2, 3, 4, 5, 6]的結(jié)果。也就是說通過heapq.merge操作,我們把多個(gè)有序的迭代器合并到了一起。當(dāng)然我們也可以自己合并,但如果我們只是需要利用當(dāng)中的數(shù)據(jù)的話,使用merge操作可以節(jié)省內(nèi)存空間。

到這里內(nèi)容就結(jié)束了,本文和之前的文章基本上列舉完了常用的迭代器用法。當(dāng)然,除了上述講到的內(nèi)容之外,Python當(dāng)中的迭代器還有一些其他的用法,不過相對不太常用,感興趣的同學(xué)可以私下了解。

以上就是淺析Python迭代器的高級用法的詳細(xì)內(nèi)容,更多關(guān)于Python迭代器的高級用法的資料請關(guān)注服務(wù)器之家其它相關(guān)文章!

原文鏈接:https://www.cnblogs.com/techflow/p/12602970.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 人人99| 欧美日韩视频在线第一区 | 日韩在线一区二区三区 | 日本在线免费观看 | 欧美成人福利 | 欧美日韩中文在线观看 | 影音在线资源 | 国产在线一区二区三区 | 国产欧美日韩专区 | www午夜 | 亚洲欧美高清 | 精品国产污网站污在线观看15 | 国产精品久久久久久中文字 | 夜夜爽99久久国产综合精品女不卡 | 日韩免费在线 | 俺去俺来也在线www色官网 | 亚洲欧美日韩精品久久亚洲区 | 亚洲精品成人18久久久久 | 日韩高清一区二区 | 成人精品| 久久精品91 | hh99me在线观看 | 毛片网站大全 | 国产欧美在线观看 | 日本a v在线播放 | 国产一区在线视频观看 | 日韩精品在线观看免费 | 久久久久久麻豆 | 在线观看黄色电影 | 黄桃av| 91成人看片 | 在线a视频| 久久久精品日本 | 成人久久久精品国产乱码一区二区 | 自拍偷拍av| 日韩在线视频一区 | 国产精品一区二区久久 | 精品久久伊人 | 国产成人精品综合 | 成人爽a毛片一区二区免费 日韩av高清在线 | 黄大片在线观看 |