成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

如何理解python當(dāng)中yield關(guān)鍵字的行為

weapon / 2609人閱讀

摘要:如何遍歷當(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

相關(guān)文章

  • Python協(xié)程

    摘要:協(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é)...

    shinezejian 評(píng)論0 收藏0
  • 談?wù)?em>Python協(xié)程技術(shù)演進(jìn)

    摘要:事件循環(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 在《深入...

    zhiwei 評(píng)論0 收藏0
  • python協(xié)程2:yield from 從入門到精通

    摘要:于此同時(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()...

    vpants 評(píng)論0 收藏0
  • [譯]yield關(guān)鍵字都做了什么?

    摘要:原文我的微信公眾號(hào)每日一練要理解什么是,必須理解什么是生成器。在理解生成器之前,讓我們先了解迭代。直到運(yùn)行到函數(shù)結(jié)尾處停止,此時(shí)如果是用則會(huì)拋出異常,如果是用則會(huì)結(jié)束循環(huán)并且不會(huì)有異常 原文:https://stackoverflow.com/que...我的微信公眾號(hào):python每日一練 要理解什么是 yield,必須理解什么是生成器(generator)。在理解生成器之前,讓我...

    elisa.yang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<