今天我們要學習的是函式的引數
例如,我們寫乙個計算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)
函式有兩個引數:x
和n
,這兩個引數都是位置引數,呼叫函式時,python會傳入的兩個值按照位置順序依次賦給引數x
和n
。
現在,我們定義好了新的函式,舊的**不能呼叫了,因為我們增加了乙個引數,而舊的**因為缺少乙個引數無法呼叫。
>>
> power(5)
traceback (most recent call last)
: file ""
, line 1,in
typeerror: power(
) missing 1 required positional argument:
'n'
python的錯誤資訊很明確:呼叫函式這個時候預設引數就派上用場了,由於我們經常計算x2,所以可以將第二個引數的預設值設為2power()
缺少了乙個位置引數n
。
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'
]
為什麼要設計str
、none
這樣的不變物件呢?因為不變物件一旦建立,物件內部的資料就不能修改,這樣就減少了由於修改資料導致的錯誤。此外,由於物件不變,多工環境下同時讀取物件不需要加鎖,同時讀一點問題都沒有。我們在編寫程式時,如果可以設計乙個不變物件,那就盡量設計成不變物件。
高中生零基礎學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...