高中生零基礎學python(六)

2021-10-25 03:04:05 字數 4012 閱讀 4366

今天我們要學習的是函式的引數

例如,我們寫乙個計算x2的函式

def power(x)

return x*x

對於函式,引數就是乙個位置引數x

當我們呼叫函式的時候,就只能傳入乙個引數x

>>

>power(2)

4>>

>power(10)

100

如果我們要計算x3,x4怎麼辦呢?當然,你可以重新再定義乙個函式,but,如果要一直寫到x100乙個個的去定義,豈不得累死。

既然數學上有xn,python中一樣可以

def

power

(x,n)

a=1#這裡的a可以為任意字母,主要是為了更好的表達函式

while n>

0#只要n>0,就會執行,條件不滿足才會退出

a=a*x

n=n-

1return a

對於這個修改後的函式, 我們可以計算任意n次方:power(x, n)

>>

>power(2,

3)8>>

>power(3,

3)27

修改後的power(x, n)函式有兩個引數:xn,這兩個引數都是位置引數,呼叫函式時,python會傳入的兩個值按照位置順序依次賦給引數xn

現在,我們定義好了新的函式,舊的**不能呼叫了,因為我們增加了乙個引數,而舊的**因為缺少乙個引數無法呼叫。

>>

> power(5)

traceback (most recent call last)

: file ""

, line 1,in

typeerror: power(

) missing 1 required positional argument:

'n'

python的錯誤資訊很明確:呼叫函式power()缺少了乙個位置引數n

這個時候預設引數就派上用場了,由於我們經常計算x2,所以可以將第二個引數的預設值設為2

def

power

(x, n=2)

: s =

1while n >0:

n = n -

1 s = s * x

return s

這時候當我們再呼叫power(5)的時候就相當於在呼叫power(5,2)

那麼,當n>2的時候我們就要詳細的輸入引數值,比如power(5,3)

當我們設定預設引數的時候要注意兩點:

1.必選引數在前,預設引數在後,否則python的直譯器會報錯

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

那麼設定預設引數的好處在哪呢?其實就是為了降低呼叫函式時的難度。

例如,我需要將我們學校高三同學的資訊統計一下,需要提供姓名、年齡、成績、居住城市

由於大部分都是本地學生,年齡和城市我們就可以使用預設引數:

def

statistical

(name, gender,age=

18,city=

'shandong'):

print

('name:'

, name)

print

('gender:'

, gender)

print

('age:'

, age)

print

('city:'

, city)

這樣,這樣大多數學生提供資訊的時候都只需要填寫姓名和成績:

>>

> statistical(

'張三'

,'620'

)name: 張三

gender:

620age:

18city: shandong

當然,外地的學生也可以輸入自己的城市資訊

statistical(

'李四'

,'500'

, city=

'tianjin'

)

注意提供引數的時候最好按預設順序,如果不按預設順序則需要把引數名寫上

比如呼叫statistical('李四', '500', city='tianjin'),意思是,city引數用傳進去的值,其他預設引數繼續使用預設值。

預設引數很有用,但坑也很深,一不留神就會掉進去,不信你看:

def

hole

(a=)

:'egg'

)return a

當我們正常呼叫的時候,好像沒問題

>>

>hole([1

,2,3

])[1

,2,3

,'egg'

]>>

>hole(

['x'

,'y'

,'z'])

['x'

,'y'

,'z'

,'egg'

]

讓我們試試預設引數呼叫:

>>

>hole()[

'egg'

]

貌似大概也沒問題,再試一遍看看?

>>

>hole()[

'egg'

,'egg'

]>>

>hole()[

'egg'

,'egg'

,'egg'

]

啊這,裂開了呀,我想這裡肯定很多和我一樣的初學者都會有疑惑,預設引數是,但是函式似乎每次都「記住了」上次新增了'egg'後的list。

原因解釋如下:

python函式在定義的時候,預設引數a的值就被計算出來了,即,因為預設引數a也是乙個變數,它指向物件,每次呼叫該函式,如果改變了a的內容,則下次呼叫時,預設引數的內容就變了,不再是函式定義時的了。

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

要修改上面的例子,我們可以用none這個不變物件來實現:

def

hole

(a=none):

if a is

none

: a =

'egg'

)return a

現在無論呼叫多少次都不會有問題啦!

>>

>hole()[

'egg'

]>>

>hole()[

'egg'

]

為什麼要設計strnone這樣的不變物件呢?因為不變物件一旦建立,物件內部的資料就不能修改,這樣就減少了由於修改資料導致的錯誤。此外,由於物件不變,多工環境下同時讀取物件不需要加鎖,同時讀一點問題都沒有。我們在編寫程式時,如果可以設計乙個不變物件,那就盡量設計成不變物件。

高中生零基礎學python(五)

上篇我們說到,python中內建了很多函式,我們可以直接呼叫的出來,那我我們能不能自己 創作 乙個函式呢?sure!讓我們試試看 首先,我們要知道怎麼去定義乙個函式 在python中,定義乙個函式要使用def語句,依次寫出函式名 括號 括號中的引數和冒號 然後,在縮排塊中編寫函式體,函式的返回值用r...

高中生零基礎下python(十八)

回顧一下我們這兩天學的高階函式 map 函式可以將傳入的函式作用到序列的每個元素並作為新的iterator返回 reduce 函式把乙個函式作用在乙個序列 x1,x2,x3,上,這個函式必須接收兩個引數,reduce把結果繼續和序列的下乙個元素做累積計算 filter 的作用是從乙個序列中篩出符合條...

零基礎學Python

零基礎學python 1 1 python是一門指令碼語言 2 python的優勢 1 語法和結構比較簡單,易入門 2 能夠跨平台使用 3 應用範圍廣,設計到作業系統 3d動畫 web 雲計算,企業應用等多方面。3 idle 是乙個python shell,類似於windows的cmd視窗 4 pr...