1. 程式人生 > >Python函數語言程式設計指南(四):生成器

Python函數語言程式設計指南(四):生成器

生成器是迭代器,同時也並不僅僅是迭代器,不過迭代器之外的用途實在是不多,所以我們可以大聲地說:生成器提供了非常方便的自定義迭代器的途徑。

這是函數語言程式設計指南的最後一篇,似乎拖了一個星期才寫好,嗯……

轉載請註明原作者和原文地址:)

4. 生成器(generator)

4.1. 生成器簡介

首先請確信,生成器就是一種迭代器。生成器擁有next方法並且行為與迭代器完全相同,這意味著生成器也可以用於Python的for迴圈中。另外,對於生成器的特殊語法支援使得編寫一個生成器比自定義一個常規的迭代器要簡單不少,所以生成器也是最常用到的特性之一。

從Python 2.5開始,[PEP 342:通過增強生成器實現協同程式]的實現為生成器加入了更多的特性,這意味著生成器還可以完成更多的工作。這部分我們會在稍後的部分介紹。

4.2. 生成器函式
4.2.1. 使用生成器函式定義生成器

如何獲取一個生成器?首先來看一小段程式碼:

?
1 2 3 4 5 6 7 >>> def get_0_1_2(): ...   yield 0 ...   yield 1 ...   yield 2 ... >>> get_0_1_2 <function get_0_1_2 at 0x00B2CB70>

我們定義了一個函式get_0_1_2,並且可以檢視到這確實是函式型別。但與一般的函式不同的是,get_0_1_2的函式體內使用了關鍵字yield,這使得get_0_1_2成為了一個生成器函式。生成器函式的特性如下:

  1. 呼叫生成器函式將返回一個生成器; ?
    1 2 3 >>> generator = get_0_1_2() >>> generator <generator

    相關推薦

    Python語言程式設計指南生成器

    生成器是迭代器,同時也並不僅僅是迭代器,不過迭代器之外的用途實在是不多,所以我們可以大聲地說:生成器提供了非常方便的自定義迭代器的途徑。 這是函數語言程式設計指南的最後一篇,似乎拖了一個星期才寫好,嗯…… 轉載請註明原作者和原文地址:) 4.

    scala語言程式設計系列--- scala語言程式設計完全解密

    傳值呼叫與傳名呼叫通常,函式的引數是傳值引數; 也就是說,引數的值在傳遞給函式之前確定。其實, 在Scala中, 我們方法或者函式的引數可以是一個表示式, 也就是將一個程式碼邏輯傳遞給了某個方法或者函式./**   * scala 的   *     傳名呼叫(call-by

    JS語言程式設計基礎FP

    一種基於過程抽象的程式設計方式,在函數語言程式設計中,函式就是一個管道(pipe)。這頭進去一個值,那頭就會出來一個新的值,沒有其他作用 在函數語言程式設計中,函式被看做是“一等公民”。JavaScript可以通過巧妙地函式組合來構建抽象,通過內嵌函式的方式,

    swift語言程式設計Tips

    Protocol(協議)專題 demo連結–>https://github.com/PeipeiQ/MySwift 我的個人部落格->http://www.peipeiq.cn 最近在公司用swift做開發,也開始關注一些swif

    Python語言程式設計高階函式

    首先有一個高階函式的知識。 一個函式可以接收另一個函式作為引數,這種函式就稱之為高階函式。 def add(x, y, f): return f(x) + f(y) 當我們呼叫add(-5, 6, abs)時,引數x,y和f分別接收-5,6和abs,根據函式定義,我們可以推導計算過程為:

    Python進階語言程式設計例項附程式碼

    上篇文章“幾個小例子告訴你, 一行Python程式碼能幹哪些事 -- 知乎專欄”中用到了一些列表解析、生成器、map、filter、lambda、zip等表達形式,這就涉及到了Python中關於函數語言程式設計(functional programming)的語法、函式等

    Python語言程式設計1高階函式 Higher-order-function

    # 高階函式 Higher-order-function # 變數可以指向函式 # 以Python內建的求絕對值的函式abs()為例,呼叫該函式用以下程式碼: print(abs(-10)) # 10 print(abs) # <built-in f

    Python語言程式設計高階函式 返回函式 匿名函式 裝飾器 偏函式

    函數語言程式設計 將業務邏輯細化,抽象,封裝成一個個功能函式,並藉助語言自帶的高階函式api,將整個業務流程轉化為函式之間的相互呼叫,這就是函數語言程式設計。 對比:將業務邏輯細化,抽象,封裝成一個個物件,並藉助語言,庫,元件,框架等,將整個業務流程轉化為

    python語言程式設計裝飾器、偏函式

    1. 裝飾器 由於函式也是一個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。 >>>def now():        print('2015-3-25') >>>f = now >>>f() 201

    python語言程式設計map/reduce、filter、sorted

    1. 變數可以指向函式 函式本身也可以賦值給變數,即:變數可以指向函式: >>>f = abs >>>f(-10) 10 2. 傳入函式 既然變數可以指向函式,函式的引數能接收變數,那麼一個函式就可以接收另一個函式作為引數,這種函式就稱之

    15.python語言程式設計—返回函式,匿名函式

    1)返回函式(1)返回函式地址高階函式除了可以接收函式作為輸入以外,還可以輸出函式。示例程式碼如下:#!/usr/bin/env python3 # -*- coding: utf-8 -*- def func(*arg): def sum(): he

    python語言程式設計

    一、python中or和and的使用 1、使用方式 result = a or b result = a and b 複製程式碼 2、or計算規則 當a為真的時候就直接返回a的值,否則返回b的值 3、and計算規則 當a為真的時候返回b,當a為假

    Python 語言程式設計(待續)

    函數語言程式設計 把計算視為函式而非指令 純函數語言程式設計:不需要變數,沒有副作用,測試簡單 支援高階函式,程式碼簡潔 高階函式——將函式作為引數傳入函式 map() 把函式依次作用在 list 的每個元素上,得到一個新的list並返回 [

    python語言程式設計3(裝飾器的深入理解)

    一、什麼是裝飾器 1、python中裝飾器可以理解為AOP程式設計,有點類似Spring中的註解,在不改變原函式或類的基礎上,對函式或類新增額外(自己需求補充)的功能。 2、裝飾器本質上是一個函式,該函式用來處理其他函式,它可以讓其他函式在不需要修改程式碼的前提下增加額外的功能,裝飾器的返回值也是

    python學習筆記03-python語言程式設計

    1. 高階函式 1. 高階函式基礎 變數可以指向函式 函式名也是變數 高階函式允許傳入函式  #!/usr/bin/env python #將函式賦值給變數 A = abs print A(-10) #匯入__builtin__模組 import __builtin

    python語言程式設計

    一、函式的巢狀 1、函式巢狀的程式碼示例   def f1():       print('我是函式1')       def f2():          

    Python語言程式設計-講解函式

    Python函式優點:   函式是使用者自己編寫好的,因為在很多的情況下一個程式的執行需要重複很多的同一種工作,這個時候可以把重複工作的程式碼封裝成一個函式,每次使用的時候只需要呼叫這個函式就可以了,就算實在修改程式碼的時候,我們也只是修改自定一的函式塊的程式碼就可以了,不用修改很多的程式碼,這樣帶給我門的

    Python--語言程式設計

    運用yield實現   模擬 grep -rl 'root' /etc (遞迴找etc下所有檔案並開啟,過濾有'root'的檔案) # import os # g = os.walk(r'C:\Users\56360\Desktop\city\mycity') # print(next(g)) #

    [python] 語言程式設計

    filter() 函式用於過濾序列,過濾掉不符合條件的元素,返回一個迭代器物件,如果要轉換為列表,可以使用 list() 來轉換。 filter()把傳入的函式依次作用於每個元素,然後根據返回值是True還是False決定保留還是丟棄該元素。 filter(fu

    (D11)Python-語言程式設計,遞迴,閉包

    函數語言程式設計 函數語言程式設計 函數語言程式設計是指用一系列函式解決問題 函式是一等公民 好處: - 用每個函式完成細小的功能,一系列函式組合可以解決大問題 - 函式僅接收輸入併產生輸出,不包含任何能影像輸出的內部狀態 函式的可重入性: