一、函數引入 與數學中的函數不同,在Python中,函數不是看上去冰冷無聊的規則和公式,而是有實打實的、有自己作用的代碼。比如說當我們需要實現“列印”這個功能,我們會用到print();當我們需要實現“獲取數據長度”這個功能,我們會要到len()。這些都是設定好了,可以直接拿過來就用的功能,這就叫做 ...
一、函數引入
與數學中的函數不同,在Python中,函數不是看上去冰冷無聊的規則和公式,而是有實打實的、有自己作用的代碼。比如說當我們需要實現“列印”這個功能,我們會用到print()
;當我們需要實現“獲取數據長度”這個功能,我們會要到len()
。這些都是設定好了,可以直接拿過來就用的功能,這就叫做“組織好的代碼”。函數(Function)能實現的功能從簡單到複雜,各式各樣,但其本質是相通的:“喂”給函數一些數據,它就能內部消化,給你“吐”出你想要的東西。這就像自動販賣機,只不過販賣機是喂點錢,吐出來一些吃的喝的用的東西;而Python函數則是喂各種各樣的數據,吐出來各種各樣的功能。
二、常用python函數
你會發現圖片里的函數後面都跟了個括弧。而括弧里放的東西,也就是我們需要輸入的數據,它在函數中被稱作【參數】。【參數】指向的是函數要接收、處理怎樣的數據。
比如print()
函數的括弧里可以放不同的參數,根據你放的參數不同,print()
函數會幫你在屏幕上顯示不同的內容。
三、函數的格式
1、函數的概念:
函數是組織好的、可以重覆使用,用來實現單一功能的代碼
(還是用販賣機來打比方,販賣機是設定好可以直接使用(組織好的),可以重覆上架售賣不同的物品(重覆使用),功能是賣東西(單一功能)。
而函數呢?以print()函數為例,它也是設定好可以直接使用(組織好的),不論你想列印什麼參數都可以(重覆使用),而print函數能實現的單一功能就是“列印”。
2、定義和調用函數
1)定義函數的語法
舉例:
定義一個打招呼的函數
說明:(打招呼的英文是greet,你寫say_hello或別的也行,其實理論上你隨便起什麼都可以,但別人也看得懂是最好的啦。)
解讀函數:
第1行:def的意思是定義(define),greet是【函數名】(自己取的),再搭配一個括弧和冒號,括弧裡面的name是參數(參數名也是自己取)。
第2行:def下一行開始縮進的代碼是函數要實現的功能,也叫【函數體】。這裡的函數體展現出的功能就是:列印出“name+ 早上好”這句話。
第3行:一個簡單的return。函數內部一旦遇到return語句,就會停止執行並返回結果。沒有return語句的函數,Python也會在末尾隱性地加上return None,即返回None值(return None可以簡寫為return。)所以你也會看到,我們接下來的很多例子是省略了return語句的。
函數註意事項
1、#函數名:最好是取體現函數功能的名字,一般用小寫字母和單下劃線、數字等組合
def greet(name):
2、#參數:根據函數功能,括弧里可以有多個參數,也可以不帶參數,命名規則與函數名相同
3、#規範:括弧是英文括弧,後面的冒號不能丟
print(name+'早上好')
4、#函數體:函數體就是體現函數功能的語句,要縮進,一般是四個空格
3、函數實踐
1)有入參
def pika2(name):
print('我最喜愛的神奇寶貝是'+name)
2)沒有入參
def pika1():
print('我最喜愛的神奇寶貝是皮卡丘')
3)有多個入參
def pika3(name,person):
print('我最喜愛的神奇寶貝是'+name)
print('我最喜愛的馴獸師是'+person)
四、函數調用
1、舉例:
通過這個例子,我們明白調用函數最關鍵的是:得弄清楚這個函數有多少個參數,如何給參數賦值,這個過程在函數里叫做參數的傳遞(pass)。
但函數的作用遠不僅如此,它能將複雜的語句和功能統一封裝進一個函數名里,調用者只需明白函數能實現什麼,根據需要傳遞參數即可。
2、函數的參數類型
主要的參數類型有:位置參數、預設參數、不定長參數。我會用一個案例把這些參數串起來。
1)位置參數:
def menu(appetizer,course):
print('一份開胃菜:'+appetizer)
print('一份主食:'+course+'\n')
#還記得轉義字元\n吧,表示換行
menu('牛肉拉麵','話梅花生')
menu('話梅花生','牛肉拉麵')
#如果採用下麵這種形式傳遞,就不需要理會參數位置
menu(course='牛肉拉麵',appetizer='話梅花生')
2)預設參數:
#因為已經預設將'綠豆沙'傳遞給dessert,調用時無須再傳遞。
預設參數是可以改變的
如下
def menu(appetizer,course,dessert='綠豆沙'):
print('一份開胃菜:'+appetizer)
print('一份主食:'+course)
print('一份甜品:'+dessert)
menu('話梅花生','牛肉拉麵')
menu('話梅花生','牛肉拉麵','銀耳羹')
#銀耳羹對應參數dessert
3、不定長參數
盛夏來襲,你覺得賣燒烤是個不錯的主意。但問題是每個人點的烤串數量都不同,你也不能限定死數量,這時候【不定長參數】就能派上用場,即不確定傳遞參數的數量。
它的格式比較特殊,是一個星號*
加上參數名,來看下麵的例子
你會發現輸出的是這樣的結果:('烤雞翅', '烤茄子', '烤玉米')
,這種數據類型叫做元組(tuple)
預設參數也需要放在不定長參數的後面
上面的函數可以寫成:
五、return語句
1、返回單個參數
2、返回多個參數
返回的是('李若彤的臉蛋', '林志玲的身材')
這樣一個元組,對不對?又是元組。
事實上,Python語言中的函數返回值可以是多個,而其他語言都不行,這是Python相比其他語言的簡便和靈活之處。一次接受多個返回值的數據類型就是元組。
最後需要再強調的是,沒有return語句的函數會預設返回None值。
return還有一個“副作用”:一旦函數內部遇到return語句,就會停止執行並返回結果。
3、總結return
六、變數作用域
第一點:在一個函數內定義的變數僅能在函數內部使用(局部作用域),它們被稱作【局部變數】。
第二點:在所有函數之外賦值的變數,可以在程式的任何位置使用(全局作用域),它們叫【全局變數】
第一個輸出為 88,第二個x為99
註意:
雖然變數的名字相同(都是x),但因為全局變數和局部變數處在不同的“作用域”中,所以它們彼此井水不犯河水,都能列印出相應的結果。
但為了讓程式更易讀以及避免可能會出現的麻煩,建議局部變數和全局變數【不要】取相同的名字,以免混淆。
你可以將定義的函數想象成一個私人房間,所以裡面存數據的容器(變數)是私有的,只能在個人的房間里使用;而在函數外存數據的變數是公用的,沒有使用限制。
全局作用域中的代碼中也不能使用任何局部變數,在函數內部的局部作用域,是可以訪問全局變數的。
局部變數轉換為全局變數
global