強迫自己學習python20天之第四天

2021-10-04 05:04:01 字數 4405 閱讀 5433

一、函式

def

functionname

(parameters)

:"函式_文件字串"

function_suite

return

[expression]

2、函式的呼叫

python內建了很多有用的函式,我們可以直接呼叫。

要呼叫乙個函式,需要知道函式的名稱和引數,比如求絕對值的函式abs,只有乙個引數。

>>

>

abs(-20

)20

呼叫函式的時候,如果傳入的引數數量不對,會報typeerror的錯誤,並且python會明確地告訴你:abs()有且僅有1個引數,但你給出了兩個;

如果傳入的引數數量是對的,但引數型別不能被函式所接受,也會報typeerror的錯誤,並且給出錯誤資訊:str是錯誤的引數型別;

3、函式引數

python 的函式具有非常靈活多樣的引數形態,既可以實現簡單的呼叫,又可以傳入非常複雜的引數。從簡到繁的引數形態如下:

位置引數 (positional argument)

預設引數 (default argument)

可變引數 (variable argument)

關鍵字引數 (keyword argument)

命名關鍵字引數 (name keyword argument)

引數組合

(1)位置引數:arg1 - 位置引數 ,這些引數在呼叫函式 (call function) 時位置要固定。

def

functionname

(arg1)

:"函式_文件字串"

function_suite

return

[expression]

對於power(x)函式,引數x就是乙個位置引數。當我們呼叫power函式時,必須傳入有且僅有的乙個引數x:

def

power

(x):

return x * x

(2)預設引數

def

functionname

(arg1, arg2=v)

:"函式_文件字串"

function_suite

return

[expression]

arg2 = v - 預設引數 = 預設值,呼叫函式時,預設引數的值如果沒有傳入,則被認為是預設值。

設定預設引數時,有幾點要注意:

一是必選引數在前,預設引數在後,否則python的直譯器會報錯(思考一下為什麼預設引數不能放在必選引數前面);

二是如何設定預設引數。

當函式有多個引數時,把變化大的引數放前面,變化小的引數放後面。變化小的引數就可以作為預設引數。

使用預設引數有什麼好處?最大的好處是能降低呼叫函式的難度。

 定義預設引數要牢記一點:預設引數必須指向不變物件!

(3)、可變引數:顧名思義,可變引數就是傳入的引數個數是可變的,可以是 0, 1, 2 到任意個,是不定長的引數。

def

functionname

(arg1, arg2=v,

*args)

:"函式_文件字串"

function_suite

return

[expression]

*args - 可變引數,可以是從零個到任意個,自動組裝成元組。

加了星號(*)的變數名會存放所有未命名的變數引數。

定義可變引數和定義乙個list或tuple引數相比,僅僅在引數前面加了乙個*號。在函式內部,引數numbers接收到的是乙個tuple,因此,函式**完全不變。但是,呼叫該函式時,可以傳入任意個引數,包括0個引數。

(4)、關鍵字引數

def

functionname

(arg1, arg2=v,

*args,

**kw)

:"函式_文件字串"

function_suite

return

[expression]

**kw - 關鍵字引數,可以是從零個到任意個,自動組裝成字典。可變引數允許你傳入0個或任意個引數,這些可變引數在函式呼叫時自動組裝為乙個tuple。而關鍵字引數允許你傳入0個或任意個含引數名的引數,這些關鍵字引數在函式內部自動組裝為乙個dict。

(5)命名關鍵字引數

def

functionname

(arg1, arg2=v,

*args,

*, nkw,

**kw)

:"函式_文件字串"

function_suite

return

[expression]

*, nkw - 命名關鍵字引數,使用者想要輸入的關鍵字引數,定義方式是在nkw 前面加個分隔符 *。*後面的引數被視為命名關鍵字引數。

如果要限制關鍵字引數的名字,就可以用「命名關鍵字引數」

使用命名關鍵字引數時,要特別注意不能缺少引數名,否則將報錯。

如果函式定義中已經有了乙個可變引數,後面跟著的命名關鍵字引數就不再需要乙個特殊分隔符*了

(6)引數組合

在python中定義函式,可以用必選引數、預設引數、可變引數、關鍵字引數和命名關鍵字引數,這5種引數都可以組合使用。但是請注意,引數定義的順序必須是:必選引數、預設引數、可變引數、命名關鍵字引數和關鍵字引數。

要注意定義可變引數和關鍵字引數的語法:

*args 是可變引數,args 接收的是乙個 tuple

**kw 是關鍵字引數,kw 接收的是乙個 dict

 雖然可以組合多達5種引數,但不要同時使用太多的組合,否則函式介面的可理解性很差。

4、變數作用域

python 中,程式的變數並不是在哪個位置都可以訪問的,訪問許可權決定於這個變數是在**賦值的。

定義在函式內部的變數擁有區域性作用域,該變數稱為區域性變數。

定義在函式外部的變數擁有全域性作用域,該變數稱為全域性變數。

區域性變數只能在其被宣告的函式內部訪問,而全域性變數可以在整個程式範圍內訪問。

二、遞迴函式

在函式內部,可以呼叫其他函式。如果乙個函式在內部呼叫自身本身,這個函式就是遞迴函式。

def

fact

(n):

if n==1:

return

1return n * fact(n -

1)

遞迴函式的優點是定義簡單,邏輯清晰。理論上,所有的遞迴函式都可以寫成迴圈的方式,但迴圈的邏輯不如遞迴清晰。

使用遞迴函式需要注意防止棧溢位。在計算機中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入乙個函式呼叫,棧就會加一層棧幀,每當函式返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴呼叫的次數過多,會導致棧溢位。

解決遞迴呼叫棧溢位的方法是通過尾遞迴優化,事實上尾遞迴和迴圈的效果是一樣的,所以,把迴圈看成是一種特殊的尾遞迴函式也是可以的。

尾遞迴是指,在函式返回的時候,呼叫自身本身,並且,return語句不能包含表示式。這樣,編譯器或者直譯器就可以把尾遞迴做優化,使遞迴本身無論呼叫多少次,都只占用乙個棧幀,不會出現棧溢位的情況。

三、 lambda 表示式

lambda argument_list: expression
odd =

lambda x: x %2==

1templist =

filter

(odd,[1

,2,3

,4,5

,6,7

,8,9

])print

(list

(templist)

)# [1, 3, 5, 7, 9]

map(function, iterable, …) 根據提供的函式對指定序列做對映。

m1 =

map(

lambda x: x **2,

[1,2

,3,4

,5])

print

(list

(m1)

)# [1, 4, 9, 16, 25]

m2 =

map(

lambda x, y: x + y,[1

,3,5

,7,9

],[2

,4,6

,8,10

])print

(list

(m2)

)# [3, 7, 11, 15, 19]

強迫自己學習

你要經常鼓勵那些為你工作的人繼續進修。但是請相信我,為此,你會遭遇很 多的反對。人人都說,教育訓練很重要,然而一旦到了要接受訓練的時候,各式各樣的藉口就都出籠了 我沒有空 這很浪費時間 下次再說 以及其 它更有創意的回答。不要管這些藉口,就是要他們付諸行動。訓練和教育,可以打造更好的人才 更好的人才...

python20 函式和檔案

直接上 注意下函式是如何與檔案相結合ex20.py from sys import argv script,input file argv def print all f print f.read def rewind f f.seek 0 def print a line line count,f...

Python教程之Python2 0簡介

python 是乙個高層次的結合了解釋性 編譯性 互動性和物件導向的指令碼語言。python 的設計具有很強的可讀性,相比其他語言經常使用英文關鍵字,其他語言的一些標點符號,它具有比其他語言更有特色語法結構。python 是一種解釋型語言 這意味著開發過程中沒有了編譯這個環節。類似於php和perl...