鍍金池/ 教程/ Python/ exercise18.命名, 變量, 代碼, 函數(shù)
附錄 A-練習(xí) 9:生成一個(gè)空文件(Touch, New-Item)
附錄 A-練習(xí) 10:復(fù)制文件 (cp)
exercise44.繼承 Vs.包含
附錄 A-練習(xí) 14:刪除文件 (rm)
附錄 A-練習(xí) 11:移動文件 (mv)
exercise46.項(xiàng)目骨架
附錄 A-練習(xí) 3:如果你迷路了
exercise37.復(fù)習(xí)符號
exercise47.自動化測試
exercise3.數(shù)字和數(shù)學(xué)計(jì)算
附錄 A-練習(xí) 1:安裝
exercise32.循環(huán)和列表
exercise31.做出決定
exercise42.對象、類、以及從屬關(guān)系
exercise48.更復(fù)雜的用戶輸入
下一步
簡介
附錄 A-練習(xí) 7:刪除路徑 (rmdir)
exercise49.寫代碼語句
exercise18.命名, 變量, 代碼, 函數(shù)
exercise12.提示別人
exercise14.提示和傳遞
exercise40.模塊, 類和對象
附錄 A-練習(xí) 12:查看文件 (less, MORE)
exercise9.打印, 打印, 打印
exercise13.參數(shù), 解包, 變量
exercise30. Else 和 If
exercise28. 布爾表達(dá)式
附錄 A-練習(xí) 4:創(chuàng)建一個(gè)路徑 (mkdir)
附錄 A-練習(xí) 15:退出命令行 (exit)
exercise25. 更多更多的練習(xí)
exercise6.字符串和文本
exercise2.注釋和井號“#”
exercise21. 函數(shù)的返回值
附錄 A-下一步
exercise1.第一個(gè)程序
exercise23. 閱讀代碼
附錄 A-練習(xí) 5:改變當(dāng)前路徑 (cd)
exercise17.更多文件操作
exercise24. 更多的練習(xí)
exercise19.函數(shù)和變量
exercise51.從瀏覽器獲取輸入
exercise22. 到目前為止你學(xué)到了什么?
exercise41.學(xué)會說面向?qū)ο?/span>
exercise52.開始你的 web 游戲
exercise20. 函數(shù)和文件
exercise15.讀文件
exercise45.你來制作一個(gè)游戲
exercise10.那是什么?
exercise8.打印, 打印
exercise35.分支和函數(shù)
exercise26. 恭喜你,可以進(jìn)行一次考試了
exercise33.while 循環(huán)
exercise29. IF 語句
exercise36.設(shè)計(jì)和調(diào)試
exercise0.安裝和準(zhǔn)備
exercise50.你的第一個(gè)網(wǎng)站
附錄 A-練習(xí) 2:路徑, 文件夾, 名錄 (pwd)
exercise38.列表操作
附錄 A-練習(xí) 6:列出當(dāng)前路徑 (ls)
exercise16.讀寫文件
exercise4.變量和命名
exercise34.訪問列表元素
exercise11.提問
exercise43.基本的面向?qū)ο蟮姆治龊驮O(shè)計(jì)
附錄 A-簡介
附錄 A-練習(xí) 8:目錄切換(pushd, popd)
來自老程序員的建議
exercise27. 記住邏輯
exercise5.更多的變量和打印
exercise7.更多的打?。ㄝ敵觯?/span>
附錄 A-練習(xí) 13:輸出文件 (cat)
exercise39.字典,可愛的字典

exercise18.命名, 變量, 代碼, 函數(shù)

標(biāo)題包含的內(nèi)容夠多的吧?接下來我要教你“函數(shù)(function)”了!說到函數(shù),不一樣的人會對它有不一樣的理解和使用方法,不過我只會教你現(xiàn)在能用到的最簡單的使用方式。

函數(shù)可以做三樣事情:

1.它們給代碼片段命名,就跟“變量”給字符串和數(shù)字命名一樣。 2.它們可以接受參數(shù),就跟你的腳本接受 argv 一樣。 3.通過使用 #1 和 #2,它們可以讓你創(chuàng)建“微型腳本”或者“小命令”。

python 中你可以使用 def 新建函數(shù)。我將讓你創(chuàng)建四個(gè)不同的函數(shù),它們工作起來和你的腳本一樣。然后我會演示給你各個(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)該會覺著比較眼熟:

1.首先我們告訴 Python 創(chuàng)建一個(gè)函數(shù),我們使用到的命令是 def,也就是“定義(define)”的意思。

2.緊接著 def 的是函數(shù)的名稱。本例中它的名稱是 print_two,但名字可以隨便取,就叫 peanuts 也沒關(guān)系。但函數(shù)名最好能夠體現(xiàn)出函數(shù)的功能來。 3.然后我們告訴函數(shù)我們需要*args,這和腳本的 argv 非常相似,參數(shù)必須放在圓括號 () 中才能正常工作。 4.接著我們用冒號:結(jié)束本行,然后開始下一行縮進(jìn)。 冒號以下,使用 4 個(gè)空格縮進(jìn)的行都是屬于 print_two 這個(gè)函數(shù)的內(nèi)容。 其中第一行的作用是將參數(shù)解包,這和腳本參數(shù)解包的原理差不多。 5.為了演示它的工作原理,我們把解包后的每個(gè)參數(shù)都打印出來,這和我們在之前腳本練習(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ù)理解成“迷你腳本”就可以了。

你看到的結(jié)果

運(yùn)行上面的腳本會看到如下結(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)如下:

1.函數(shù)定義是以 def 開始的嗎? 2.函數(shù)名稱是以字符和下劃線 _組成的嗎? 3.函數(shù)名稱是不是緊跟著括號 ( ? 4.括號里是否包含參數(shù)?多個(gè)參數(shù)是否以逗號隔開? 5.參數(shù)名稱是否有重復(fù)?(不能使用重復(fù)的參數(shù)名) 6.緊跟著參數(shù)的是不是括號和冒號 ): ? 7.緊跟著函數(shù)定義的代碼是否使用了 4 個(gè)空格的縮進(jìn) (indent)? 8.函數(shù)結(jié)束的位置是否取消了縮進(jìn) (“dedent”)?

當(dāng)你運(yùn)行(或者說“使用 use”或“調(diào)用 call”)一個(gè)函數(shù)時(shí),記得檢查下面的點(diǎn):

1.調(diào)運(yùn)函數(shù)時(shí)是否使用了函數(shù)的名稱? 2.函數(shù)名稱是否緊跟著 (? 3.括號后有無參數(shù)?多個(gè)參數(shù)是否以逗號隔開? 4.函數(shù)是否以 ) 結(jié)尾?

按照這兩份檢查表里的內(nèi)容檢查你的代碼,直到你不需要檢查表為止。

最后,將下面這句話閱讀幾遍:

‘運(yùn)行函數(shù)(run)’、‘調(diào)用函數(shù)(call)’、和‘使用函數(shù)(use)’是同一個(gè)意思

常見問題

Q:什么字符允許用在函數(shù)名上?

和變量命名規(guī)則相同。不能以數(shù)字開頭,并且只能包含字母數(shù)字和下劃線。

Q:*args 中的星號*是干嘛的?

它告訴 python 把函數(shù)的所有參數(shù)組織一個(gè)列表放在 args 里。類似你之前用過的 argv,只不過*args 是用在函數(shù)里的,

Q: 這個(gè)練習(xí)讓我覺得枯燥

這是好事,說明你在輸入代碼方面做的越來越好,而且也能很好的明白這些代碼是做什么的,想讓練習(xí)不那么枯燥,輸入我讓你練習(xí)的代碼,然后故意出錯(cuò),檢查你的錯(cuò)誤并修復(fù)它們。