python從0到1--9 函式
1.函式的建立和呼叫
1.1建立一個函式
建立函式也稱為定義函式,可以理解為建立一個具有某種用途的工具。使用def關鍵字實現。格式如下:
def functionname([parameterlist]):
['''comments''']
[functionbody]
引數說明:
functionname:函式名稱,在呼叫函式時使用
parameterlist:可選引數,用於指定向函式中傳遞的引數。如果有多個引數,各引數間使用逗號分隔。如果不指定,則表示該函式沒有引數。在呼叫時,也不指定引數
comments:可選引數,表示為函式指定註釋,註釋內容通常是說明該函式的功能,要傳遞的引數的作用等,可以為使用者提供友好和幫助的內容
functionbody:可選引數,用於指定函式體,即該函式被呼叫後,要執行的功能程式碼。如果函式有返回值,可以使用return語句返回
例如:定義一個根據身高,體重計算BMI指數的函式fun_bmi(),該函式包括3個引數,分別用於指定姓名/身高/體重,在根據公式:BMI=體重/(身高*身高)計算BMI指數,並輸出結果。
def fun_bmi(person,height,weight): '''功能:根據身高體重計算BMI指數 person:姓名 height:身高,單位:米 weight:體重,單位:千克 ''' print(person + "的身高:" + str(height) +"米 \t體重:"+ str(weight)+"千克") bmi = weight/(height*height) print(person+"的BMI指數為:"+str(bmi)) if bmi < 18.5: print("您的體重過輕") if bmi >=18.5 and bmi < 24.9: print("正常範圍") if bmi > 24.9: print("您的體重超重") if bmi >= 29.9:print("肥胖")
1.2 呼叫函式
呼叫函式其實也就是執行函式。語法格式:
functionname([parametersvalue])
引數說明:
functionname:函式名稱,要呼叫的函式名稱,必須是已經建立好的
parametersvalue:可選引數,用於指定各個引數的值,如果需要傳遞過個引數值,用逗號分隔;如果沒有函式則直接寫一對小括號。
例如:上面的程式碼,實現呼叫函式,計算rain的BMI指數;
def fun_bmi(person,height,weight): '''功能:根據身高體重計算BMI指數 person:姓名 height:身高,單位:米 weight:體重,單位:千克 ''' print(person + "的身高:" + str(height) +"米 \t體重:"+ str(weight)+"千克") bmi = weight/(height*height) print(person+"的BMI指數為:"+str(bmi)) if bmi < 18.5: print("您的體重過輕") if bmi >=18.5 and bmi < 24.9: print("正常範圍") if bmi > 24.9: print("您的體重超重") if bmi >= 29.9: print("肥胖") fun_bmi("rain",1.65,70)
執行結果:
rain的身高:1.65米 體重:70千克 rain的BMI指數為:25.71166207529844 您的體重超重
1.3 pass語句
在python中有個pass語句,表示空語句,它不做任何事情,一般起到佔位作用,例如,建立一個函式,但我們暫時不知道這個函式幹嘛的。這是用pass語句填充函式主體。
def func(): pass
2.引數傳遞
2.1形式引數和實際引數
形式引數:在定義函式時,函式名後面括號中的引數為“形式引數”,也稱行參。
實際引數:在呼叫一個函式時,函式名後米娜括號中的引數為“實際引數”。也就是將引數的呼叫者提供給函式的引數稱為實際引數,也稱實參
舉個例子:假如說,我們要在一張紙上用筆畫畫。那麼筆就是“形式引數”;如果我選擇用鉛筆來實現畫畫,那麼鉛筆就是“實際引數”。
其中:當實參為不可變物件時,進行的值傳遞;當實參為可變物件時,進行的時引用物件。
例如:
#定義函式 def demo(obj): #obj形式引數 print("原值:",obj) obj += obj #呼叫函式 print("="*10 + "值傳遞" + "="*10) mot = "我愛洗澡,面板好好" #採用不可變物件--字串(實參) print("呼叫函式前:",mot) demo(mot) print("呼叫函式後:",mot) print("="*10 + "引用傳遞" + "="*10) list1 = ["Kobe","James","Lrving","Harden"] #採用可變物件--列表(實參) print("呼叫函式前:",list1) demo(list1) print("呼叫函式後:",list1)
執行結果:
==========值傳遞========== 呼叫函式前: 我愛洗澡,面板好好 原值: 我愛洗澡,面板好好 呼叫函式後: 我愛洗澡,面板好好 ==========引用傳遞========== 呼叫函式前: ['Kobe', 'James', 'Lrving', 'Harden'] 原值: ['Kobe', 'James', 'Lrving', 'Harden'] 呼叫函式後: ['Kobe', 'James', 'Lrving', 'Harden', 'Kobe', 'James', 'Lrving', 'Harden']
2.2 位置引數
位置引數也稱為必備引數,必須按照正確的順序傳到函式中。即呼叫的函式數量和位置必須和定義的是一樣的。
例如:
def fun_hello(name, sex): sex_dict = {1: '先生', 2: '女士'} print('hello %s %s, welcome to python world!' %(name, sex_dict.get(sex))) # 兩個引數的順序必須一一對應,且少一個引數都不可以 fun_hello('張建宇',1)
執行結果:
hello 張建宇 先生, welcome to python world!
2.3 關鍵字引數
關鍵字引數是指使用行參的名字來確定輸入的引數值。通過該方式指定的實參時,不再需要與行參的位置完全一致,只要將引數名寫正確即可
同樣上面的例子:
def fun_hello(name, sex): sex_dict = {1: '先生', 2: '女士'} print('hello %s %s, welcome to python world!' %(name, sex_dict.get(sex))) # 在利用關鍵字引數時,可以不按順序位置 fun_hello(sex = 2,name= "賽金花")
2.4為引數設定預設值
在呼叫函式時,如果沒有指定某個引數將丟擲異常,那麼我們可以在定義函式時,直接指定形式引數的預設值。這樣,當沒有傳入引數時,直接使用定義函式時的這個預設值
例如:
def fun_bmi(height,weight,person = "wind"): '''功能:根據身高體重計算BMI指數 person:姓名 height:身高,單位:米 weight:體重,單位:千克 ''' print(person + "的身高:" + str(height) +"米 \t體重:"+ str(weight)+"千克") bmi = weight/(height*height) print(person+"的BMI指數為:"+str(bmi)) if bmi < 18.5: print("您的體重過輕") if bmi >=18.5 and bmi < 24.9: print("正常範圍") if bmi > 24.9: print("您的體重超重") if bmi >= 29.9: print("肥胖") fun_bmi(1.65,70,"cloud") fun_bmi(1.90,80)
注意:在定義函式時,指定預設的行參必須在所有引數最後.
在定義函式時,為形式引數設定預設值要牢記一點:預設引數必須指向不可變物件。
2.5可變引數
可變引數也稱為不定長引數,即傳入函式中的實際引數可以是0個,1個,2個。。。。。n個。
定義可變引數主要是兩種形式,一種是*parameter,另一種是**parameter。
2.5.1 *parameter
這種形式表示接收任意多個實際引數並將其放到一個元組中。
例如:
def player(*name): print("\n我喜歡的NBA球員有: ") for i in name: print(i) player("Kobe") player("Kobe","Yaoming","Harden") player("Kobe","Park","Bob","James")
如果想要使用一個已經存在的列表作為函式的可變引數,可以在列表的名稱前加*。例如
listname = ["Kobe","Park","Bob","James"] player(*listname)
2.5.2 **parameter
這種形式表示接收任意多個顯式賦值的實際引數,並將其放到一個字典中。
例如:
def printsign(**sign): print() for key,value in sign.items(): print(key + "的綽號是: " + value) printsign(鄧肯 = "石佛",羅賓遜="海軍上將") printsign(吉諾比利 = "妖刀",帕克 = "法國跑車",科比 = "黑曼巴")
如果想要使用一個已經存在的字典作為函式的可變引數,可以在字典名稱前加“**”
例如:
dict1 = {"鄧肯":"石佛","羅賓遜":"海軍上將","科比":"黑曼巴"} printsign(**dict1)
3.返回值
我們在定義函式的時候,其實是告訴他實現什麼功能或運算。但是函式並不知道你想要的成品是什麼。那麼return就是來實現這一目標。(老闆--工人--材料--成品)
例如:
#商城促銷活動,滿500打9折。滿1000打8折。滿2000打7折。滿3000打6折 def fun_chekout(money): money_old = sum(money) money_new = money_old if 500 <= money_old <1000: money_new = '{:.2f}'.format(money_old*0.9) elif 1000<= money_old <2000: money_new = '{:.2f}'.format(money_old * 0.8) elif 2000<=money_old<3000: money_new = '{:.2f}'.format(money_old * 0.7) elif money_old>3000: money_new = '{:.2f}'.format(money_old * 0.6) else: money_new == money_old return money_old,money_new list_money = [] while True: inmoney = float(input("請輸入商品金額(輸入0表示輸入完畢):")) if int(inmoney) == 0: break else: list_money.append(inmoney) money = fun_chekout(list_money) print("合計金額:",money[0],"應付金額:",money[1])
4.變數
變數的作用域是指程式程式碼能夠訪問該變數的區域,如果超出該區域,再訪問就會出現錯誤。
4.1區域性變數
區域性變數是指函式內部定義並使用的變數,它只在函式內部有效。
例如:
def fun_demo(): message = "hello python" print("區域性變數在函式體內",message) fun_demo() print("區域性變數在函式體外",message)
上面這段程式碼,執行完成後,之後在函式內部的變數會成功,外部的變數會丟擲異常
4.2全域性變數
- 如果一變數,在函式外定義,那麼不僅可以在函式外可以訪問到,在該函式內也可以訪問到。這個就稱為全域性變數
例如:
message = "hello python" def fun_demo(): print("函式體內",message) fun_demo() print("函式體外",message)
執行結果:
區域性變數在函式體內 hello python
區域性變數在函式體外 hello python
- 當局部變數與全域性變數重新命名時,對函式體對變數進行賦值後,不影響函式體外對變數。
例如:
message = "hello python" print("函式體外:",message) def fun_demo(): message = "hello china" print("函式體內: ",message) fun_demo() print("函式體外: ",message)
函式體外: hello python
函式體內: hello china
函式體外: hello python
- 在函式體內定義,並且使用global關鍵字修飾後,該變數也可以成為全域性變數。在函式體外也可以訪問到該變數,並且在函式體內還可以對其進行修改。
例如
message = "hello python" print("函式體外:",message) def fun_demo(): global message message = "hello china" print("函式體內: ",message) fun_demo() print("函式體外: ",message)
執行結果:
函式體外: hello python
函式體內: hello china
函式體外: hello china
5 匿名函式
匿名函式:指沒有名字的函式,它主要應用在需要一個函式,但是又不想費神去命名這個函式。在python中使用lambda表示式建立匿名函式
例如:要定義一個計算圓面積的函式。常規程式碼如下:
import math def circlearea(r): result = math.pi*r*r return result r = 10 print("半徑為",r,"的圓面積為:",circlearea(r))
使用lambda表示式的程式碼如下:
import math r = 10 result = lambda r:math.pi*r*r print("半徑為",r,"的圓面積為:",result(r))
6.常用的python中內建函式
小測驗:編寫一個函式,實現中俄雙方貨幣間的轉換。(1人民幣=9.912盧布;1盧布=0.1009人民幣)。程式可以接受輸入人民幣或者盧布,轉換成盧布或者人民幣。人民幣用RMB表示。盧布用RUB表示。