1. 程式人生 > 實用技巧 >python從0到1--9 函式

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表示。