电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

淺析Python迭代器的高級用法

瀏覽:93日期:2022-07-17 10:50:01

跳過開頭

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

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

# This is a data for student# Rows 100xiaoming, 17, 99;xiaoli, 18, 98;...

常規操作當中,我們會創建一個打開文件的迭代器,我們通過遍歷這個迭代器去獲取文件當中的數據:

with open(’xxxx.txt’) as f: for line in f: print(line)

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

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

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

from itertools import dropwhilewith open(’xxxx.txt’) as f: for line in dropwhile(lambda line: line.startswith(’#’), f): print(line)

這樣出來的結果就沒有頭部我們不需要的內容了。

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

舉個例子:

from itertools import dropwhilewith open(’xxxx.txt’) as f: for line in islice(f, 3, None): print(line)

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

迭代排列組合

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

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

items = [’a’, ’b’, ’c’]from itertools import permutationsfor p in permutations(items): print(p)

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

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

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

from itertools import combindationsfor c in combinations(items): print(c)

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

for c in combinations_with_replacement(items, 3): print(c)

迭代合并后的序列

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

舉個例子:

from itertools import chainnums = [1, 2, 3]chars = [’a’, ’b’, ’c’]for i in chain(nums, chars): print(i)

這樣我們會把nums和chars當中的內容一起輸出出來,就好像從頭到尾只執行了一個迭代器一樣。

你可能會說我們不用chain也可以實現啊,我們可以這樣:

for i in nums + chars: print(i)

的確,從結果上來看這樣也是行得通的。但是如果我們分析一下內部執行的時候的中間變量,會發現當我們執行nums+chars的時候,實際上是先創建了一個新的臨時list。然后在這個list當中存儲nums和chars的數據,也就是說我們迭代的其實是這個新的list。這帶來的結果是我們額外開辟了一段內存,并且花費了一些時間。如果我們使用chain,它并不會有這樣的中間變量,完全是通過迭代器來執行的迭代,非常節省內存,這也是chain的優點。

歸并迭代的內容

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

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

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

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

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

以上就是淺析Python迭代器的高級用法的詳細內容,更多關于Python迭代器的高級用法的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 面粉仓_储酒罐_不锈钢储酒罐厂家-泰安鑫佳机械制造有限公司 | 河南砖机首页-全自动液压免烧砖机,小型砌块水泥砖机厂家[十年老厂] | 阻燃剂-氢氧化镁-氢氧化铝-沥青阻燃剂-合肥皖燃新材料 | 退火炉,燃气退火炉,燃气热处理炉生产厂家-丹阳市丰泰工业炉有限公司 | 茶楼装修设计_茶馆室内设计效果图_云臻轩茶楼装饰公司 | 酵素生产厂家_酵素OEM_酵素加盟_酵素ODM_酵素原料厂家_厦门益力康 | 非标压力容器_碳钢储罐_不锈钢_搪玻璃反应釜厂家-山东首丰智能环保装备有限公司 | 电销卡_稳定企业大语音卡-归属地可选-世纪通信 | 热工多功能信号校验仪-热电阻热电偶校验仿真仪-金湖虹润仪表 | 铁艺,仿竹,竹节,护栏,围栏,篱笆,栅栏,栏杆,护栏网,网围栏,厂家 - 河北稳重金属丝网制品有限公司 山东太阳能路灯厂家-庭院灯生产厂家-济南晟启灯饰有限公司 | 拼装地板,悬浮地板厂家,悬浮式拼装运动地板-石家庄博超地板科技有限公司 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 洁净实验室工程-成都手术室净化-无尘车间装修-四川华锐净化公司-洁净室专业厂家 | 转向助力泵/水泵/发电机皮带轮生产厂家-锦州华一精工有限公司 | 深圳网站建设-高端企业网站开发-定制网页设计制作公司 | 海日牌清洗剂-打造带电清洗剂、工业清洗剂等清洗剂国内一线品牌 海外整合营销-独立站营销-社交媒体运营_广州甲壳虫跨境网络服务 | 开云(中国)Kaiyun·官方网站-登录入口 | 杭州画室_十大画室_白墙画室_杭州美术培训_国美附中培训_附中考前培训_升学率高的画室_美术中考集训美术高考集训基地 | 活动策划,舞台搭建,活动策划公司-首选美湖上海活动策划公司 | 天津散热器_天津暖气片_天津安尼威尔散热器制造有限公司 | 环保袋,无纺布袋,无纺布打孔袋,保温袋,环保袋定制,环保袋厂家,环雅包装-十七年环保袋定制厂家 | 西安耀程造价培训机构_工程预算实训_广联达实作实操培训 | 汽车整车综合环境舱_军标砂尘_盐雾试验室试验箱-无锡苏南试验设备有限公司 | 浙江栓钉_焊钉_剪力钉厂家批发_杭州八建五金制造有限公司 | 浙江宝泉阀门有限公司| 电主轴,车床电磨头,变频制动电机-博山鸿达特种电机 | 高精度-恒温冷水机-螺杆式冰水机-蒸发冷冷水机-北京蓝海神骏科技有限公司 | 南京泽朗生物科技有限公司-液体饮料代加工_果汁饮料代加工_固体饮料代加工 | 政府园区专业委托招商平台_助力企业选址项目快速落地_东方龙商务集团 | 气动绞车,山东气动绞车,气动绞车厂家-烟台博海石油机械有限公司 气动隔膜泵厂家-温州永嘉定远泵阀有限公司 | 流水线电子称-钰恒-上下限报警电子秤-上海宿衡实业有限公司 | 广东泵阀展|阀门展-广东国际泵管阀展览会 | 航空障碍灯_高中低光强航空障碍灯_民航许可认证航空警示灯厂家-东莞市天翔航天科技有限公司 | 佛山市钱丰金属不锈钢蜂窝板定制厂家|不锈钢装饰线条|不锈钢屏风| 电梯装饰板|不锈钢蜂窝板不锈钢工艺板材厂家佛山市钱丰金属制品有限公司 | 丝杆升降机-不锈钢丝杆升降机-非标定制丝杆升降机厂家-山东鑫光减速机有限公司 | 磁力反应釜,高压釜,实验室反应釜,高温高压反应釜-威海自控反应釜有限公司 | 临沂招聘网_人才市场_招聘信息_求职招聘找工作请认准【马头商标】 | 合肥抖音SEO网站优化-网站建设-网络推广营销公司-百度爱采购-安徽企匠科技 | 浙江自考_浙江自学考试网| 旋振筛|圆形摇摆筛|直线振动筛|滚筒筛|压榨机|河南天众机械设备有限公司 | 滑板场地施工_极限运动场地设计_滑板公园建造_盐城天人极限运动场地建设有限公司 |