国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python函數式編程指南(二):從函數開始

2020-02-23 01:38:39
字體:
來源:轉載
供稿:網友

2. 從函數開始
2.1. 定義一個函數
如下定義了一個求和函數:

代碼如下:
def add(x, y):
    return x + y

關于參數和返回值的語法細節可以參考其他文檔,這里就略過了。

使用lambda可以定義簡單的單行匿名函數。lambda的語法是:

代碼如下:
lambda args: expression

參數(args)的語法與普通函數一樣,同時表達式(expression)的值就是匿名函數調用的返回值;而lambda表達式返回這個匿名函數。如果我們給匿名函數取個名字,就像這樣:
代碼如下:
lambda_add = lambda x, y: x + y

這與使用def定義的求和函數完全一樣,可以使用lambda_add作為函數名進行調用。然而,提供lambda的目的是為了編寫偶爾為之的、簡單的、可預見不會被修改的匿名函數。這種風格雖然看起來很酷,但并不是一個好主意,特別是當某一天需要對它進行擴充,再也無法用一個表達式寫完時。如果一開始就需要給函數命名,應該始終使用def關鍵字。

2.2. 使用函數賦值

事實上你已經見過了,上一節中我們將lambda表達式賦值給了add。同樣,使用def定義的函數也可以賦值,相當于為函數取了一個別名,并且可以使用這個別名調用函數:
代碼如下:
add_a_number_to_another_one_by_using_plus_operator = add
print add_a_number_to_another_one_by_using_plus_operator(1, 2)

既然函數可以被變量引用,那么將函數作為參數和返回值就是很尋常的做法了。

2.3. 閉包
閉包是一類特殊的函數。如果一個函數定義在另一個函數的作用域中,并且函數中引用了外部函數的局部變量,那么這個函數就是一個閉包。下面的代碼定義了一個閉包:
代碼如下:
def f():
    n = 1
    def inner():
        print n
    inner()
    n = 'x'
    inner()

函數inner定義在f的作用域中,并且在inner中使用了f中的局部變量n,這就構成了一個閉包。閉包綁定了外部的變量,所以調用函數f的結果是打印1和'x'。這類似于普通的模塊函數和模塊中定義的全局變量的關系:修改外部變量能影響內部作用域中的值,而在內部作用域中定義同名變量則將遮蔽(隱藏)外部變量。

如果需要在函數中修改全局變量,可以使用關鍵字global修飾變量名。Python 2.x中沒有關鍵字為在閉包中修改外部變量提供支持,在3.x中,關鍵字nonlocal可以做到這一點:
代碼如下:
#Python 3.x supports `nonlocal'
def f():
    n = 1
    def inner():
        nonlocal n
        n = 'x'

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: SHOW| 阜南县| 岚皋县| 枞阳县| 资兴市| 永新县| 三门峡市| 西林县| 贵定县| 石渠县| 昭苏县| 东辽县| 河曲县| 广宁县| 民丰县| 高清| 安福县| 来安县| 濮阳县| 安陆市| 东乡| 黎川县| 岚皋县| 海兴县| 汕尾市| 确山县| 沂南县| 清河县| 大丰市| 阿坝| 永年县| 大埔区| 合江县| 缙云县| 元氏县| 阆中市| 岐山县| 五台县| 曲沃县| 承德县| 河北区|