国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

如何理解python當中yield關鍵字的行為

weapon / 2606人閱讀

摘要:如何遍歷當中的行現有一個數據框的期望輸出現在我想遍歷這個數據框的每一行,在每一行當中我想通過列名訪問第一行的每一個元素,例如,實現以下效果這里推送一個非常好用的函數這個函數同時返回索引和行對象的生成器可以直接進行遍歷如何理解當中的函數若要理

如何遍歷pandas當中的行

現有一個數據框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

現在我想遍歷這個數據框的每一行, 在每一行當中我想通過列名訪問第一行的每一個元素,例如,實現以下效果:

for row in df.rows:
   print row["c1"], row["c2"]

這里推送一個非常好用的函數:
iterrows()
這個函數同時返回 索引和行對象的生成器可以直接進行遍歷

In [18]: for index, row in df.iterrows():
   ....:     print row["c1"], row["c2"]
   ....:     
10 100
11 110
12 120
如何理解python當中的yield函數

若要理解python當中的(yield)函數,首先必須理解什么是生成器(generators),在理解生成器之前必須先理解迭代器(iterators).

迭代器

當你創建一個列表list,可以一個元素一個元素逐個讀他,這樣的操作稱為迭代 interation :

>>> mylist = [1, 2, 3]
>>> for i in mylist:
...    print(i)
1
2
3

這里mylist就稱之為一個可迭代對象,當你使用列表推導時(list comprehension),可以生成一個列表,列表推導的方法如下所示:

>>> mylist = [x*x for x in range(3)]
>>> for i in mylist:
...    print(i)
0
1
4

所有可以用for ... in ... 操作的對象稱之為可迭代對象.例如字符串列表文件集合等等.

++列表這類可迭代對象還比較方便,但缺點就是需要存儲在內存中的對象非常多,在值非常多的時候如果都使用這種方式,不是很好++.

生成器

生成器也是迭代器的一種,是一種只能遍歷一次的可迭代對象.
生成器不需要在內存當中存儲所有的值,
他們是即時生成值,性能更快.
例如:

>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
...    print(i)
0
1
4

可以看到,除了使用[]替代()之外,其它都是一樣的,但是以下的用法就是不允許的:

for i in mygenerator

實際上他們先生成0,然后忘掉0,再生成1,丟棄1,一直往下,一個接一個進行處理.

Yield函數

yield 函數有點像Return,區別在于這個函數返回的是迭代器.
例如:

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

可以看出來,當你知道你的函數會返回數量非常大的元素供遍歷時,并且只需讀一次的時候,使用yield函數是非常合適的.

若要掌握yield函數,你必須理解當你調用這個函數時,函數內部的代碼實際是沒有執行的.這個函數只是返回一個生成器的對象.當實際遍歷時(for ... in ... ) yield語句才會執行.

這里是比較有意思的地方:
第一次使用for訪問這個生產器對象的時候,"print u"this will be executed only when for ... in ..called only once""這句話才被打印出來,并且打印在"test"之后,說明yield之前的函數體會在for第一次循環時被調用一次且僅僅調用一次.
但是,如果是這樣情況又不同了:

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)

結果現在變成了:

test
this will be executed only when for ... in ..called only once
test3
0
test3
1
test3
4
test2

可見如果在yield語句同級的代碼塊中的語句,其實外層for進行迭代時,每次都會執行.

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41432.html

相關文章

  • Python協程

    摘要:協程的基本行為協程包含四種狀態等待開始執行。協程中重要的兩個方法調用方把數據提供給協程。注意使用調用協程時會自動預激,因此與裝飾器不兼容標準庫中的裝飾器不會預激協程,因此能兼容句法。因此,終止協程的本質在于向協程發送其無法處理的異常。 導語:本文章記錄了本人在學習Python基礎之控制流程篇的重點知識及個人心得,打算入門Python的朋友們可以來一起學習并交流。 本文重點: 1、掌握協...

    shinezejian 評論0 收藏0
  • 談談Python協程技術演進

    摘要:事件循環是異步編程的底層基石。對事件集合進行輪詢,調用回調函數等一輪事件循環結束,循環往復。協程直接利用代碼的執行位置來表示狀態,而回調則是維護了一堆數據結構來處理狀態。時代的協程技術主要是,另一個比較小眾。 Coding Crush Python開發工程師 主要負責豈安科技業務風險情報系統redq。 引言 1.1. 存儲器山 存儲器山是 Randal Bryant 在《深入...

    zhiwei 評論0 收藏0
  • python協程2:yield from 從入門到精通

    摘要:于此同時,會阻塞,等待終止。子生成器返回之后,解釋器會拋出異常,并把返回值附加到異常對象上,只是委派生成器恢復。實例運行完畢后,返回的值綁定到上。這一部分處理調用方通過方法傳入的異常。之外的異常會向上冒泡。 上一篇python協程1:yield的使用介紹了: 生成器作為協程使用時的行為和狀態 使用裝飾器預激協程 調用方如何使用生成器對象的 .throw(...) 和 .close()...

    vpants 評論0 收藏0
  • [譯]yield鍵字都做了什么?

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

    elisa.yang 評論0 收藏0

發表評論

0條評論

weapon

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<