W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
標(biāo)題包含的內(nèi)容夠多的吧?接下來我要教你“函數(shù)(function)”了!說到函數(shù),不一樣的人會(huì)對(duì)它有不一樣的理解和使用方法,不過我只會(huì)教你現(xiàn)在能用到的最簡單的使用方式。
函數(shù)可以做三樣事情:
- 它們給代碼片段命名,就跟“變量”給字符串和數(shù)字命名一樣。
- 它們可以接受參數(shù),就跟你的腳本接受
argv
一樣。- 通過使用 #1 和 #2,它們可以讓你創(chuàng)建“微型腳本”或者“小命令”。
python中你可以使用def
新建函數(shù)。我將讓你創(chuàng)建四個(gè)不同的函數(shù),它們工作起來和你的腳本一樣。然后我會(huì)演示給你各個(gè)函數(shù)之間的關(guān)系。
# this one is like your scripts with argv
def print_two(*args):
arg1, arg2 = args
print "arg1: %r, arg2: %r" % (arg1, arg2)
# ok, that *args is actually pointless, we can just do this
def print_two_again(arg1, arg2):
print "arg1: %r, arg2: %r" % (arg1, arg2)
# this just takes one argument
def print_one(arg1):
print "arg1: %r" % arg1
# this one takes no arguments
def print_none():
print "I got nothin'."
print_two("Zed","Shaw")
print_two_again("Zed","Shaw")
print_one("First!")
print_none()
讓我們把地一個(gè)函數(shù)print_two
分解一下,這個(gè)函數(shù)和你寫腳本的方式差不多,因此你看上去應(yīng)該會(huì)覺著比較眼熟:
1.首先我們告訴Python創(chuàng)建一個(gè)函數(shù),我們使用到的命令是
def
,也就是“定義(define)”的意思。
- 緊接著def的是函數(shù)的名稱。本例中它的名稱是
print_two
,但名字可以隨便取,就叫peanuts
也沒關(guān)系。但函數(shù)名最好能夠體現(xiàn)出函數(shù)的功能來。- 然后我們告訴函數(shù)我們需要
*args
,這和腳本的argv
非常相似,參數(shù)必須放在圓括號(hào) () 中才能正常工作。- 接著我們用冒號(hào)
:
結(jié)束本行,然后開始下一行縮進(jìn)。- 冒號(hào)以下,使用4個(gè)空格縮進(jìn)的行都是屬于
print_two
這個(gè)函數(shù)的內(nèi)容。 其中第一行的作用是將參數(shù)解包,這和腳本參數(shù)解包的原理差不多。- 為了演示它的工作原理,我們把解包后的每個(gè)參數(shù)都打印出來,這和我們?cè)谥澳_本練習(xí)中所作的類似。
函數(shù)print_two
的問題是:它并不是創(chuàng)建函數(shù)最簡單的方法。在 Python 函數(shù)中我們可以跳過整個(gè)參數(shù)解包的過程,直接使用()
里邊的名稱作為變量名。這就是print_two_again
實(shí)現(xiàn)的功能。
接下來的例子是print_one
,它向你演示了函數(shù)如何接受單個(gè)參數(shù)。
最后一個(gè)例子是print_none
,它向你演示了函數(shù)可以不接收任何參數(shù)。
Warning:如果你不太能看懂上面的內(nèi)容也別氣餒。后面我們還有更多的練習(xí)向你展示如何創(chuàng)建和使用函數(shù)?,F(xiàn)在你只要把函數(shù)理解成“迷你腳本”就可以了。
運(yùn)行上面的腳本會(huì)看到如下結(jié)果:
$ python ex18.py
arg1: 'Zed', arg2: 'Shaw'
arg1: 'Zed', arg2: 'Shaw'
arg1: 'First!'
I got nothin'.
$
你應(yīng)該已經(jīng)看出函數(shù)是怎樣工作的了。注意到函數(shù)的用法和你以前見過的 exists
、open
,以及別的“命令”有點(diǎn)類似了吧?其實(shí)我只是為了讓你容易理解才叫它們“命令”,它們的本質(zhì)其實(shí)就是函數(shù)。也就是說,你也可以在自己的腳本中創(chuàng)建你自己的“命令”。
為自己寫一個(gè)函數(shù)注意事項(xiàng)
以供后續(xù)參考。你可以寫在一個(gè)索引卡片上隨時(shí)閱讀,直到你記住所有的要點(diǎn)為止。注意事項(xiàng)如下:
- 函數(shù)定義是以
def
開始的嗎?- 函數(shù)名稱是以字符和下劃線
_
組成的嗎?- 函數(shù)名稱是不是緊跟著括號(hào)
(
?- 括號(hào)里是否包含參數(shù)?多個(gè)參數(shù)是否以逗號(hào)隔開?
- 參數(shù)名稱是否有重復(fù)?(不能使用重復(fù)的參數(shù)名)
- 緊跟著參數(shù)的是不是括號(hào)和冒號(hào)
):
?- 緊跟著函數(shù)定義的代碼是否使用了 4 個(gè)空格的縮進(jìn) (indent)?
- 函數(shù)結(jié)束的位置是否取消了縮進(jìn) (“dedent”)?
當(dāng)你運(yùn)行(或者說“使用use”或“調(diào)用call”)一個(gè)函數(shù)時(shí),記得檢查下面的點(diǎn):
- 調(diào)運(yùn)函數(shù)時(shí)是否使用了函數(shù)的名稱?
- 函數(shù)名稱是否緊跟著
(
?- 括號(hào)后有無參數(shù)?多個(gè)參數(shù)是否以逗號(hào)隔開?
- 函數(shù)是否以
)
結(jié)尾?
按照這兩份檢查表里的內(nèi)容檢查你的代碼,直到你不需要檢查表為止。
最后,將下面這句話閱讀幾遍:
‘運(yùn)行函數(shù)(run)’、‘調(diào)用函數(shù)(call)’、和‘使用函數(shù)(use)’是同一個(gè)意思
和變量命名規(guī)則相同。不能以數(shù)字開頭,并且只能包含字母數(shù)字和下劃線。
*args
中的星號(hào)*
是干嘛的?它告訴python把函數(shù)的所有參數(shù)組織一個(gè)列表放在
args
里。類似你之前用過的argv
,只不過*args
是用在函數(shù)里的,
這是好事,說明你在輸入代碼方面做的越來越好,而且也能很好的明白這些代碼是做什么的,想讓練習(xí)不那么枯燥,輸入我讓你練習(xí)的代碼,然后故意出錯(cuò),檢查你的錯(cuò)誤并修復(fù)它們。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: