天天看點

python 九——函數、疊代器、map、reduce、lambda\random模

參考文章:https://www.cnblogs.com/sly27/p/8707191.html

一、函數基礎

1.1 建立函數

标題行由def關鍵字,函數名,以及參數的集合組成;def子句的剩餘部分包括了一個雖然可選但是強烈推薦推薦的文檔字串,和必需的函數體。

函數用def語句建立,文法:

def function_name(arguments):

“function_documentation_string”

function_body_suite

注意:

1)前向引用:函數不允許在函數未聲明之前對其進行引用或者調用

2)内部函數:在函數體内建立另一個函數是完全合法的,這種函數叫做内部/内嵌函數

1.2 調用函數

1)函數操作符:使用一對圓括号()調用函數,如果沒有圓括号,隻是對函數的引用;

任何輸入的參數都必須放置在括号中。

2)關鍵字參數:關鍵字參數的概念僅僅針對函數的調用,讓調用者通過函數調用中的參數名字來區分參數。

3)參數組:python允許程式執行一個沒有顯示定義參數的函數;方法是通過把元組(非關鍵字參數,用*)和字典(關鍵字參數,用 ‘**’)作為參數組傳遞給函數

1.3 匿名函數

1)lambda

lambda [arg1[,arg2,…argN]:expression]

python允許用lamber關鍵字創造匿名函數,匿名是因為不需要以标準的def的方式 來聲明。

一個完整的lambda 語句代表了一個表達式,這個表達式的定義體必須和聲明放在同一行。

2) filter() 函數

filter(func,seq):調用一個布爾函數func來疊代周遊每個序列中的元素;傳回一個使func傳回值為true的元素的序列。

如果布爾函數比較簡單,直接使用lambda匿名函數九顯得非常友善。

1.4 疊代器

疊代器是實作了__next__()方法的對象(這個方法在調用時不需要任何參數),它是通路可疊代序列的一種方式,通常其從序列的第一個元素開始通路,直到所有的元素都被通路才結束。

1 、 建立疊代器

A、使用内建的工廠函數iter(iterable)可以将可疊代序列轉換為疊代器

B、自定義疊代器 :Python中疊代器的本質上每次調用__next__()方法都傳回下一個元素或抛出StopIteration的容器對象。

2、疊代器的方法:

由于Python中沒有“疊代器”這個類,是以具有以下兩個特性的類都可以稱為“疊代器”類:

1)、有__next__()方法,傳回容器的下一個元素或抛出StopIteration異常

2)、有__iter__()方法,傳回疊代器本身

案例》建立疊代器

1 a=[1,2,3,4]

2 b=(1,2,3)

3 str=‘Tomwenxing’

4 print(iter(a))

5 print(iter(b))

6 print(iter(str))

二 、函數進階應用

2.1 變量作用域

辨別符的作用域是定義為其聲明在程式裡的可應用範圍,也就是變量的可見性。

1)全局變量

在一個子產品中最進階别的變量有全局作用域,它會存活到腳本運作結束。

2) 局部變量

局部變量,僅能依賴于定義它們的函數現階段是否處于活動,函數一旦完成,架構被釋放,變量将會離開作用域。

如果局部變量與全局變量同名,那麼定義了局部變量的函數運作時,局部變量會覆寫全局變量。

3)global語句

因為全局變量的名字可以被局部變量覆寫,是以為了明确地引用一個已命名的全局變量,必須使用global語句。

4)名字空間

三個活動的作用域:局部、全局、内建;

辨別符的搜尋順序依次是:局部、全局、内建

2.2 函數式程式設計

  1. 偏函數

    一個帶有多個參數的函數,如果其中某些參數基本上固定的,那麼就可以通過偏函數為緻謝參數指派預設值

    2)遞歸函數

    如果函數包含了對其自身的調用,該函數就是遞歸的。

    3)生成器

    在Python中,這種一邊循環一邊計算的機制,稱為生成器:generator。生成器用于生成一個值的序列

    生成器是一個帶yield語句的函數,一個函數或者子程式隻傳回一次,但是生成器能暫停執行并傳回一個中間的結果。

    建立一個generator方法一:隻要把一個清單生成式的[]改成(),就建立了一個generator;

    方法二:

    當生成器的next() 方法被調用的時候,它會準确地從離開地方繼續;

    與疊代器相似,生成器以另外的方式來運作,當到達一個真正的傳回或者函數結束沒有更多的值傳回,StopIteration異常就會被抛出。

2.3 内部函數

  1. 閉包

    閉包将内部函數自己的代碼和作用域以及外部函數的作用結合起來;閉包的詞法變量不屬于全局名字空間域或者局部的,而是屬于其他的名字空間,帶着“流浪”的作用域。閉包對于安裝計算,隐藏狀态,以及在函數對象和作用域中随意地切換是很有用的。閉包也是函數,但是它們能攜帶一些額外的作用域。

  2. 裝飾器

    裝飾器是在函數調用之上的修飾,這些修飾僅是當聲明一個函數或者方法的時候,才會應用的額外調用。

    使用裝飾器的情形:

    ——引入日志

    ——增加計時邏輯來檢測性能

    ——給函數加入事務的能力。

三 、 map() 函數

map() 會根據提供的函數對指定序列做映射,Map的主要作用就是:并行。

map() 函數文法:map(function, iterable, …)

function – 函數;iterable – 一個或多個序列

第一個參數 function 以參數序列中的每一個元素調用 function 函數,傳回包含每次 function 函數傳回值的新清單。Python 2.x 傳回清單。Python 3.x 傳回疊代器。

注意:python3中map()傳回的是一個object,因為map()轉變成了疊代器來節約空間,傳回的是可疊代對象。

是以,需要list可以直接用list(……)來強制傳回一個清單。

案例>

def square(x):

return x ** 2

result = map(square, [1, 2, 3, 4])

print(result)

print(type(result))

print(list(result))

四、 reduce()函數

reduce()的使用方法形如reduce(function, iterable[, initializer]),它的形式和map()函數一樣。不過參數f(x)必須有兩個參數,initializer是可選的,一個序列,和一個可選的初始化器。

工作原理:reduce通過取出序列的頭兩個元素,将他們傳入二進制函數來獲得一個單一的值來實作。然後又用這個值和序列的下一個元素來獲得又一個值,然後繼續直到整個序列的内容都周遊完畢以及最後的值會被計算出來為止。

五、random子產品

5.1 random.random

random.random()用于生成一個0到1的随機符點數: 0 <= n < 1.0

5.2 random.uniform

random.uniform的函數原型為:random.uniform(a, b),用于生成一個指定範圍内的随機符點數,兩個參數其中一個是上限,一個是下限。如果a > b,則生成的随機數n: a <= n <= b。如果 a <b, 則 b <= n <= a。

5.3 random.randint

andom.randint()的函數原型為:random.randint(a, b),用于生成一個指定範圍内的整數。其中參數a是下限,參數b是上限,生成的随機數n: a <= n <= b

5.4 random.randrange

random.randrange的函數原型為:random.randrange([start], stop[, step]),從指定範圍内,按指定基數遞增的集合中 擷取一個随機數。

5.5 random.choice

random.choice從序列中擷取一個随機元素。其函數原型為:random.choice(sequence)。參數sequence表示一個有序類型。這裡要說明 一下:sequence在python不是一種特定的類型,而是泛指一系列的類型。list, tuple, 字元串都屬于sequence。

5.6 random.shuffle

random.shuffle的函數原型為:random.shuffle(x[, random]),用于将一個清單中的元素打亂。

5.7 random.sample

random.sample的函數原型為:random.sample(sequence, k),從指定序列中随機擷取指定長度的片斷。sample函數不會修改原有序列。