摘要:如何遍歷當(dāng)中的行現(xiàn)有一個(gè)數(shù)據(jù)框的期望輸出現(xiàn)在我想遍歷這個(gè)數(shù)據(jù)框的每一行,在每一行當(dāng)中我想通過(guò)列名訪問(wèn)第一行的每一個(gè)元素,例如,實(shí)現(xiàn)以下效果這里推送一個(gè)非常好用的函數(shù)這個(gè)函數(shù)同時(shí)返回索引和行對(duì)象的生成器可以直接進(jìn)行遍歷如何理解當(dāng)中的函數(shù)若要理
如何遍歷pandas當(dāng)中的行
現(xiàn)有一個(gè)數(shù)據(jù)框pandas的dataframe:
import pandas as pd inp = [{"c1":10, "c2":100}, {"c1":11,"c2":110}, {"c1":12,"c2":120}] df = pd.DataFrame(inp) print df
期望輸出
c1 c2 0 10 100 1 11 110 2 12 120
現(xiàn)在我想遍歷這個(gè)數(shù)據(jù)框的每一行, 在每一行當(dāng)中我想通過(guò)列名訪問(wèn)第一行的每一個(gè)元素,例如,實(shí)現(xiàn)以下效果:
for row in df.rows: print row["c1"], row["c2"]
這里推送一個(gè)非常好用的函數(shù):
iterrows()
這個(gè)函數(shù)同時(shí)返回 索引和行對(duì)象的生成器可以直接進(jìn)行遍歷
In [18]: for index, row in df.iterrows(): ....: print row["c1"], row["c2"] ....: 10 100 11 110 12 120如何理解python當(dāng)中的yield函數(shù)
若要理解python當(dāng)中的(yield)函數(shù),首先必須理解什么是生成器(generators),在理解生成器之前必須先理解迭代器(iterators).
迭代器當(dāng)你創(chuàng)建一個(gè)列表list,可以一個(gè)元素一個(gè)元素逐個(gè)讀他,這樣的操作稱為迭代 interation :
>>> mylist = [1, 2, 3] >>> for i in mylist: ... print(i) 1 2 3
這里mylist就稱之為一個(gè)可迭代對(duì)象,當(dāng)你使用列表推導(dǎo)時(shí)(list comprehension),可以生成一個(gè)列表,列表推導(dǎo)的方法如下所示:
>>> mylist = [x*x for x in range(3)] >>> for i in mylist: ... print(i) 0 1 4
所有可以用for ... in ... 操作的對(duì)象稱之為可迭代對(duì)象.例如字符串列表文件集合等等.
++列表這類可迭代對(duì)象還比較方便,但缺點(diǎn)就是需要存儲(chǔ)在內(nèi)存中的對(duì)象非常多,在值非常多的時(shí)候如果都使用這種方式,不是很好++.
生成器生成器也是迭代器的一種,是一種只能遍歷一次的可迭代對(duì)象.
生成器不需要在內(nèi)存當(dāng)中存儲(chǔ)所有的值,
他們是即時(shí)生成值,性能更快.
例如:
>>> mygenerator = (x*x for x in range(3)) >>> for i in mygenerator: ... print(i) 0 1 4
可以看到,除了使用[]替代()之外,其它都是一樣的,但是以下的用法就是不允許的:
for i in mygenerator
實(shí)際上他們先生成0,然后忘掉0,再生成1,丟棄1,一直往下,一個(gè)接一個(gè)進(jìn)行處理.
Yield函數(shù)yield 函數(shù)有點(diǎn)像Return,區(qū)別在于這個(gè)函數(shù)返回的是迭代器.
例如:
def createGenerator(): mylist = range(3) print u"this will be executed only when for ... in ..called only once" for i in mylist: yield i*i mygenerator = createGenerator() print "test" for i in mygenerator: print(i) test this will be executed only when for ... in ..called only once 0 1 4
可以看出來(lái),當(dāng)你知道你的函數(shù)會(huì)返回?cái)?shù)量非常大的元素供遍歷時(shí),并且只需讀一次的時(shí)候,使用yield函數(shù)是非常合適的.
若要掌握yield函數(shù),你必須理解當(dāng)你調(diào)用這個(gè)函數(shù)時(shí),函數(shù)內(nèi)部的代碼實(shí)際是沒(méi)有執(zhí)行的.這個(gè)函數(shù)只是返回一個(gè)生成器的對(duì)象.當(dāng)實(shí)際遍歷時(shí)(for ... in ... ) yield語(yǔ)句才會(huì)執(zhí)行.
這里是比較有意思的地方:
第一次使用for訪問(wèn)這個(gè)生產(chǎn)器對(duì)象的時(shí)候,"print u"this will be executed only when for ... in ..called only once""這句話才被打印出來(lái),并且打印在"test"之后,說(shuō)明yield之前的函數(shù)體會(huì)在for第一次循環(huán)時(shí)被調(diào)用一次且僅僅調(diào)用一次.
但是,如果是這樣情況又不同了:
def createGenerator(): mylist = range(3) print u"this will be executed only when for ... in ..called only once" for i in mylist: print "test3" yield i*i print "test2" mygenerator = createGenerator() print "test" for i in mygenerator: print(i)
結(jié)果現(xiàn)在變成了:
test this will be executed only when for ... in ..called only once test3 0 test3 1 test3 4 test2
可見(jiàn)如果在yield語(yǔ)句同級(jí)的代碼塊中的語(yǔ)句,其實(shí)外層for進(jìn)行迭代時(shí),每次都會(huì)執(zhí)行.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41432.html
摘要:協(xié)程的基本行為協(xié)程包含四種狀態(tài)等待開(kāi)始執(zhí)行。協(xié)程中重要的兩個(gè)方法調(diào)用方把數(shù)據(jù)提供給協(xié)程。注意使用調(diào)用協(xié)程時(shí)會(huì)自動(dòng)預(yù)激,因此與裝飾器不兼容標(biāo)準(zhǔn)庫(kù)中的裝飾器不會(huì)預(yù)激協(xié)程,因此能兼容句法。因此,終止協(xié)程的本質(zhì)在于向協(xié)程發(fā)送其無(wú)法處理的異常。 導(dǎo)語(yǔ):本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之控制流程篇的重點(diǎn)知識(shí)及個(gè)人心得,打算入門Python的朋友們可以來(lái)一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、掌握協(xié)...
摘要:事件循環(huán)是異步編程的底層基石。對(duì)事件集合進(jìn)行輪詢,調(diào)用回調(diào)函數(shù)等一輪事件循環(huán)結(jié)束,循環(huán)往復(fù)。協(xié)程直接利用代碼的執(zhí)行位置來(lái)表示狀態(tài),而回調(diào)則是維護(hù)了一堆數(shù)據(jù)結(jié)構(gòu)來(lái)處理狀態(tài)。時(shí)代的協(xié)程技術(shù)主要是,另一個(gè)比較小眾。 Coding Crush Python開(kāi)發(fā)工程師 主要負(fù)責(zé)豈安科技業(yè)務(wù)風(fēng)險(xiǎn)情報(bào)系統(tǒng)redq。 引言 1.1. 存儲(chǔ)器山 存儲(chǔ)器山是 Randal Bryant 在《深入...
摘要:于此同時(shí),會(huì)阻塞,等待終止。子生成器返回之后,解釋器會(huì)拋出異常,并把返回值附加到異常對(duì)象上,只是委派生成器恢復(fù)。實(shí)例運(yùn)行完畢后,返回的值綁定到上。這一部分處理調(diào)用方通過(guò)方法傳入的異常。之外的異常會(huì)向上冒泡。 上一篇python協(xié)程1:yield的使用介紹了: 生成器作為協(xié)程使用時(shí)的行為和狀態(tài) 使用裝飾器預(yù)激協(xié)程 調(diào)用方如何使用生成器對(duì)象的 .throw(...) 和 .close()...
摘要:原文我的微信公眾號(hào)每日一練要理解什么是,必須理解什么是生成器。在理解生成器之前,讓我們先了解迭代。直到運(yùn)行到函數(shù)結(jié)尾處停止,此時(shí)如果是用則會(huì)拋出異常,如果是用則會(huì)結(jié)束循環(huán)并且不會(huì)有異常 原文:https://stackoverflow.com/que...我的微信公眾號(hào):python每日一練 要理解什么是 yield,必須理解什么是生成器(generator)。在理解生成器之前,讓我...
閱讀 1684·2023-04-26 00:30
閱讀 3157·2021-11-25 09:43
閱讀 2885·2021-11-22 14:56
閱讀 3195·2021-11-04 16:15
閱讀 1156·2021-09-07 09:58
閱讀 2029·2019-08-29 13:14
閱讀 3114·2019-08-29 12:55
閱讀 994·2019-08-29 10:57