「大數據」(一百一十四)Python基礎知識之函數

【導讀:數據是二十一世紀的石油,蘊含巨大價值,這是·情報通·大數據技術系列第[114]篇文章,歡迎閱讀收藏】

1 基本概念

函數是 python 為了代碼最大程度的重用和最小化代碼冗餘而提供的最基本的程序結果。函數也是一種設計工具,使用它我們可以將複雜的系統分解為可管理的部件。

2 術語解釋

Def :可執行的代碼, Python 的函數是由一個新的語句編寫的,即 def 。不像 C 那樣的編譯語言, def 是一個可執行的語句。當 Python 運行到 def 語句時,它將會生成一個新的函數對象並將其賦值給這個函數名。

Return :將一個結果對象發送給調用者。當函數被調用時,其調用者停止運行直到這個函數完成了它的工作,之後函數才將控制權返回調用者。

Lambda :創建一個對象發送給調用者,當函數被調用時,調用者停止運行直到這個函數完成了它的工作,之後函數才將控制權返回調用者。

Yield :向調用者發回一個結果對象,但是記住它離開的地方,像生成器這樣的函數也可以通過 yield 語句來返回值,並掛起它們的狀態以便稍等能夠恢復狀態。

Global :聲明一個模塊級的變量並被賦值。

Nonlocal :聲明將要賦值的一個封閉的函數變量。

「大數據」(一百一十四)Python基礎知識之函數

3 詳細說明

3.1 Def

Def 語句將創建一個函數對象並將其賦值給一個變量名, def 語句一般格式如下所示。

<code>Def<name>(arg1,arg2,…argN):
<statements>/<name>/<code>

Def 包含了首行並有一個代碼塊跟隨在後邊,這個代碼塊通常都會縮進(或者就是在冒號後邊簡單的一句)。而這個代碼塊就成為了函數的主體 - 也就是每當調用函數時 Python 所執行的語句。 Def 的首行定義了函數名,賦值給函數對象,並在括號中包含了 0 個或以上的參數(也稱為形參)。在函數調用的時候,在首行的參數名賦值給力括號中的傳遞來的對象。

函數主體往往包含一條 return 語句。

<code>Def<name>(arg1,arg2,…argN):

Return<value>/<name>/<code>

Python 的 return 語句可以在函數主體中的任何地方出現。它表示函數調用的結束,並將結果返回至函數調用處。 Returnyuju 包含一個對象表達式,這個對象給出的函數的結果。 Return 語句是可選的,如果它沒有出現,那麼函數將會在控制流執行完函數主體時結束。

Python 的 def 語句是一個可執行的語句:當它運行的時候,它創建一個新的函數對象並將其賦值給一個變量名。它在運行時簡單的給一個變量名進行賦值。更確切地講, def 在運行時才進行評估,而在 def 之中的代碼在函數調用後才會評估。函數描繪了兩個方面:定義( def 創建了一個函數)以及調用(表達式告訴 Python 去運行函數主體)。定義是一個在交互模式下輸入的定義語句,它定義了一個名為 times 的函數,這個函數將返回兩個參數的乘積。

<code>>>>def times(x,y):
… return x*y/<code>

當 Python 運行到這裡並執行了 def 語句時,它將會創建一個新的函數對象,封裝這個函數的代碼並將這個對象賦值給變量名 times 。當 def 運行之後,可以再程序中通過在函數名後增加括號調用(運行)這個函數。括號中可以包含一個或多個對象參數,這些參數將會傳遞給函數頭部的參數名。

<code>>>>times ( 2,4 )/<code>

這個表達式傳遞了兩個參數給 times 函數。在這個例子中,在函數頭部的變量 x 賦值為 2 , y 賦值為 4 ,之後函數的主體開始運行,對於這個函數,其主體僅僅是一條 return 語句,這條語句將會返回結果作為函數調用表達式的值。但是如果稍後需要使用這個值,我們可以將其賦值給另一個變量。例如:

<code>>>>x = times(3.14,4)
>>>x/<code>

Times 函數中表達式 x*y 的意義完全取決於 x 和 y 的對象類型,同樣的函數,在一個實例下執行的是乘法,在另一個實例下執行的是賦值。 Python 將對某一對象的在某種語法的合理性交由對象自身來判斷。這種依賴類型的行為稱為多態。因為 Python 是動態類型語言,所以多態在 Python 中隨處可見。實際上,在 Python 中每個操作都是多態的操作: print 、 index 、 * 操作符,還有很多。即使是簡單的 times 函數,任意兩個支持 * 的對象都可以執行,無論它是哪種類型,也不管它是何時編寫的。這個函數對於數字來說是有效的,兩個字符串或者一個字符串和一個數字,或者任意其他支持擴展接口的兼容對象。除此之外,如果傳遞的對象不支持這種預期的接口, Python 將會在 * 表達式運行時檢測到錯誤,並自動拋出一個異常。

3.2 return

return 語句是 Python 語言中函數返回的一個值,每個函數都應該有一個返回值;其中, return 返回值可以是一個數值,一個字符串,一個布爾值或者一個列表。


Python 函數返回值 return ,函數中一定要有 return 返回值才是完整的函數,如果你沒有定義 Python 函數返回值,那麼得到一個結果是 None 對象,而 None 表示沒有任何值。

寫法 1 :

<code>>>> def someFunction():
...       return
...
>>> sf=someFunction()
>>> sf
>>> sf is None
True7/<code>

沒有返回值的 return 語句等價於 return None 。 None 是 Python 中表示沒有任何東西的特殊類型。例如,如果一個變量的值為 None ,可以表示它沒有值。


寫法 2 :

<code>>>> def someFunction():
...    pass
...
>>> sf=someFunction()
>>> sf is None
True/<code>

3.3 lambda

lambda 函數也叫匿名函數,即,函數沒有具體的名稱。先來看一個最簡單例子:

<code>def f(x):
return x**2

print f(4)/<code>

Python 中使用 lambda 的話,寫成這樣

<code>g = lambda x : x**2

print g(4)/<code>

lambda 和普通的函數相比,就是省去了函數名稱而已,同時這樣的匿名函數,又不能共享在別的地方調用。

其實說的沒錯, lambda 在 Python 這種動態的語言中確實沒有起到什麼驚天動地的作用,因為有很多別的方法能夠代替 lambda 。

1. 使用 Python 寫一些執行腳本時,使用 lambda 可以省去定義函數的過程,讓代碼更加精簡。

2. 對於一些抽象的,不會別的地方再複用的函數,有時候給函數起個名字也是個難題,使用 lambda 不需要考慮命名的問題。

3. 使用 lambda 在某些時候讓代碼更容易理解。

lambda 語句中,冒號前是參數,可以有多個,用逗號隔開,冒號右邊的返回值。 lambda 語句構建的其實是一個函數對象, 實例說明:

<code>>>> foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
>>> print filter (lambda x: x % 3 == 0, foo)

[18, 9, 24, 12, 27]/<code>

3.4 Yield

帶有 yield 的函數在 Python 中被稱之為 generator (生成器),你讓生成器產生一個數時,生成器會執行,直至出現 yeild 語句,生成器把 yeild 的參數給你,之後生成器就不會往下運行。當你向它要下一個數時,他會從上次狀態開始繼續運行,直至出現 yeild 語句,把參數給你,之後停下,如此反覆直至退出函數 。

實例說明:

<code>Def perm(items,n=none):
If n is None:
\t \tn= len(items)
for i in range(len(items)):
v = items[i:i+1]
if n==1
\tyield v
else:
\t\trest= items[:i]+items[i+1:]
for p in perm(resr,n-1):
\t\tyield v+p
a=perm(‘abc’)
for b in a:
\t\tprint b/<code>

3.5 Gloabal

global 語句是適用於當前整個代碼塊的聲明。它是全局變量的標識符。如果某名字在局部名字空間中沒有定義 , 就自動使用相應的全局名字 . 沒有 global 是不可能手動指定一個名字是全局的 . 在 global 中出現的名字不能在 global 之前的代碼中使用 . 在 global 中出現的名字不能作為形參 , 不能作為循環的控制對象 , 不能在類定義 , 函數定義 , import 語句中出現 .

與 nonlocal 關鍵字的區別:

global 語句用以知名某個特定的變量為全局作用域,並重新綁定它。 nonlocal 語句用以指明某個特定的變量為封閉作用域,並重新綁定它。

3.6 Nonlocal

nonlocal 關鍵字用來在函數或其他作用域中使用外層 ( 非全局 ) 變量。

實例說明:

<code>def a():
\t\t\tx = 0
def b():
\t\t\tnonlocal x
\t\t\tx += 1
\t\t\tprint x
\t\t\treturn b/<code>


分享到:


相關文章: