標籤:format utils 輸出 imp 自動 one 其他 類型 說明
Python函數
先來看下面代碼:
def welcome_info(): "顯示歡迎資訊“ print("Hello World!") return 0
如上代碼,就定義了一個函數。
調用後的結果為:
welcome_info() #調用函數Hello World! #調用結果
這裡,我們引用一下Python官方文檔對Python函數的定義:
The keyword def
introduces a function definition. It must be followed by the function name and the parenthesized list of formal parameters. The statements that form the body of the function start at the next line, and must be indented.
關鍵字def引入一個函數定義。它必須後接一個作用名(即函數名)以及一對由圓括弧包起來的形式參數列(可以為空白)。形成函數主體的陳述語句開始於下一行,並且強制縮排。
這裡,補充兩點:
冒號後的第一行最好是由雙引號包起來的說明用的字串以供程式員本人及他人日後尋找及調用時能快速知其功能和意義。養成一個良好的編寫習慣最好從頭開始。
函數主體的最後一行通常由return語句結束。
上面講了如何定義一個函數,那麼函數具體有什麼用呢,看完下面的代碼或許你就能明白一些了:
def result(): print("打下來一隻鳥")def hunt1(): "打鳥1" print("我射了一箭") result()def hunt2(): print("我開了一槍") result()def hunt3(): print("我打了一炮") result()hunt1()hunt2()hunt3()
運行結果:
我射了一箭打下來一隻鳥我開了一槍打下來一隻鳥我打了一炮打下來一隻鳥
當程式中多次需要調用同一個功能時,函數的作用就體現出來了,即函數可以避免重複代碼。
再看下面的代碼:
import timedef result(): time_format = "%Y-%m-%d %X" time_current = time.strftime(time_format) print("打下來一隻鳥%s" % time_current)def hunt1(): "打鳥1" print("我射了一箭") result()def hunt2(): print("我開了一槍") result()def hunt3(): print("我打了一炮") result()hunt1()hunt2()*/hunt3()
結果為:
我射了一箭打下來一隻鳥2017-11-29 17:14:06我開了一槍打下來一隻鳥2017-11-29 17:14:06我打了一炮打下來一隻鳥2017-11-29 17:14:06
這裡我們看到,只修改第一個函數,其他調用該函數的函數結果都會有所變動,這就是函數的另外兩個特性:
一致性
可擴充性
return語句
先看下面代碼:
def welcome_info(): print("Hello World!") return 0 print("Hello Python!") x = welcome_info()
print(x)
運行結果:
Hello World!
0
當函數執行時,return強制結束並返回0。0是什麼意思呢?看下面的代碼:
def hunt1(): "打鳥1" print("我射了一箭")def hunt2(): print("我開了一槍") return 0def hunt3(): print("我打了一炮") return 2, 69, "Hello Python!", ["bigbang", "bigcock"], {"size":"15 centimeters"}a = hunt1()b = hunt2()c = hunt3()print(a)print(b)print(c)
運行結果:
我射了一箭我開了一槍我打了一炮None0(2, 69, ‘Hello Python!‘, [‘bigbang‘, ‘bigcock‘], {‘size‘: ‘15 centimeters‘})
由此段代碼看出,
沒有return語句時,即沒有傳回值,結果為None;
當傳回值為0時,返回object;
當傳回值為數字、字串、列表、字典時,返回一個包含前面所有對象的一個元組tuple。
傳回值可以是任意類型任意長度。
形式參數&實際參數&預設參數&參數組
看下面代碼:
def name(a,b): print(a) print(b)name("bigbang", "bigcock")
運行結果:
bigbangbigcock
上面代碼中,關鍵字def後name是此函數的函數名,圓括弧內為形式參數a和b。
為什麼a和b被稱為形式參數呢?
因為在沒有給他們賦值之前,他們只是a和b,沒有任何實際意義,只是一個正在等待賦值的標識。
當調用函數時,圓括弧內給了兩個實際參數,bigbang和bigcock,他們的位置與函數名後括弧內的形式參數a和b一一對應。
此時實際參數也被稱為位置參數。
現在有如下代碼:
def name(a,b): print(a) print(b)name(b = "bigbang", a = "bigcock")
運行結果:
bigcockbigbang
調用函數name時,括弧內指定形式參數的賦值,此時的實際參數被稱為關鍵參數。它們與形式參數的位置無關,但數量必須相對應。
看下面代碼:
def name(a, b = "bigbang"): print(a) print(b)name("bigcock")
運行結果:
bigcockbigbang
這個樣本中當我們調用函數時並沒有給name傳遞兩個值,但輸出結果依舊為兩個值。
這是因為我們提前在定義函數時已經給形式參數b賦值,這裡b = “bigbang”即被稱為預設參數。
調用時只需給a傳遞一個實際參數即可。
看如下代碼:
def name(a, b = "bigbang"): print(a) print(b)name("bigcock", "lovefuck")
結果如下:
bigcocklovefuck
上面樣本中,當調用函數name時,傳遞了兩個實際參數。運行結果中b的賦值由形式參數中定義的“bigbang”變為“lovefuck”。
由此可見,預設參數的一個特點就是:
當調用函數時,預設參數非必須傳遞。通過預設參數的使用,可以設定在程式中設定一些預設值來提高程式的運行效率。
當有多個實際參數時,可以如下定義:
def numbers(*args): print(args)numbers(23, 62, 79, 1, 28, 99)
結果:
(23, 62, 79, 1, 28, 99)
args為arguments的縮寫,*是一個引用方法,電腦語言裡表示全部,比如我們想搜尋電腦中所有的圖片,可以在搜尋欄裡輸入“*.jpg"。這時電腦會自動搜尋電腦中所有的JPG格式的圖片檔案。
在這裡當我們調用函數並傳遞多個參數給args時,args會將所有實際參數封裝為一個tuple。
上面執行個體還可以這樣寫:
def numbers(a, b, *args): print(a) print(b) print(args)numbers(23, 62, 79, 1, 28, 99)
結果:
2362(79, 1, 28, 99)
定義函數時傳遞兩個形參以及一個參數組,調用時會根據位置將實際參數賦值給形式參數,未分配到形式參數的實際參數則會全部分配給參數組。
繼續,看下面樣本:
def user_info(**kwargs): print(kwargs)user_info(name = "bigbang", sex = "m", age = "22", hobby = "girl")
運行結果:
{‘name‘: ‘bigbang‘, ‘sex‘: ‘m‘, ‘age‘: ‘22‘, ‘hobby‘: ‘girl‘}
樣本中,kwargs是key word arguments的縮寫,意為關鍵字參數組。
同時可以發現,當我們調用函數時,kwargs會將調用時所傳遞的關鍵參數封裝為一個字典。
當傳遞多個型別參數時,需注意以下幾點:
預設參數必須寫在參數組前面;
調用函數時,位置參數必須在關鍵參數前面。
經過前面的學習,我們可以寫出一個大家比較常見的函數,如果你是遊戲玩家的話,可以通過這個函數更容易理解函數中各種參數的定義:
def login(name, pw, difficulty = "normal", *args, **kwargs): print(name) print(pw) print(difficulty) print(args) print(kwargs)login("bigbang", "123456", "beginner", "start game", "quit", "previous page", map = "lost temple")
運行結果:
bigbang123456beginner(‘start game‘, ‘quit‘, ‘previous page‘){‘map‘: ‘lost temple‘}
樣本中,調用參數時傳遞的前兩個實際參數與形式參數的前兩位相對應,第三個位置參數改變了定義中的預設參數的賦值變成了”beginner“,如果沒有傳遞這個位置參數,那麼此處的難度就變成了”start game“,這顯然不是我們想要的結果,接著後面的三個位置參數全部傳給了args,形成了一個tuple,最後的關鍵參數被傳給kwargs。
Python學習筆記:函數