函數(shù)是組織好的呼巷,可重復(fù)使用的稻扬,用來實現(xiàn)單一外傅,或相關(guān)聯(lián)功能的代碼段
print()就是一個函數(shù)蹦哼,它是Python提前為我們封裝好的
認(rèn)識函數(shù)
例:自定義一個函數(shù)
# 自定義一個函數(shù)
def say_hello():
"""向大家說你好"""
print('Hello, everybody!')
# 調(diào)用寫好的自定義函數(shù)
say_hello()
輸出:
Hello, everybody!
第一行代碼中鳄哭,def
是用來定義函數(shù)的關(guān)鍵字,然后是自定義的一個函數(shù)名字say_hello
纲熏,函數(shù)名字后面一字要加上一對()
妆丘,定義完函數(shù)后記得在后面加一冒號;冒號下面的有縮進(jìn)的代碼都屬于這個函數(shù)的函數(shù)體局劲,即這個函數(shù)要實現(xiàn)的功能勺拣,在這里,函數(shù)say_hello的功能是打印Hello, everybody!
注意鱼填,"""向大家說你好"""這行注釋叫作==文檔字符串==药有,它寫在函數(shù)體的第一行,用來描述這個函數(shù)是什么的苹丸;它的意義在于方便開者理解函數(shù)意義愤惰,寫注釋是一個好習(xí)慣
say_hello()
是調(diào)用該函數(shù)語句
函數(shù)的參數(shù)
上例中的say_hello()
是一個無參函數(shù)
say_hello()
目前的功能是對所有人說Hello,如果想對小紅說Hello赘理,則需要再定義一個函數(shù):
# 自定義一個函數(shù)
def say_hello_to_xiaohong():
"""向大家說你好"""
print('Hello, xiaohong!')
# 調(diào)用寫好的自定義函數(shù)
say_hello_to_xiaohong()
那如果要對小明說Hello呢宦言?再寫一個函數(shù)?這樣太麻煩了商模!我們可以將不斷變化的人名提取出來奠旺,做為參數(shù)傳遞蜘澜,這個函數(shù)就不必再關(guān)注要對誰說Hello了
# 自定義一個函數(shù)
def say_hello(name):
"""向大家說你好"""
print('Hello, '+name+"!")
# 調(diào)用寫好的自定義函數(shù)
say_hello('xiaohong')
say_hello('xiaoming')
輸出:
Hello, xiaohong!
Hello, xiaoming!
def say_hello(name):
中的name被稱作形參
say_hello('xiaohong')
調(diào)用函數(shù)時傳遞的具有實際值的參數(shù)被稱作實參
向函數(shù)傳遞多個參數(shù)
# 定義一個打印食物名稱與價格的函數(shù)
def show_food_price(food,price):
"""打印食物名稱與價格"""
print("food:"+str(food))
print("price:"+str(price))
# 打印牛奶信息
show_food_price('milk',3.2)
# 打印蘋果的信息
show_food_price('apple',5)
輸出:
food:milk
price:3.2
food:apple
price:5
一看就明白,多個參數(shù)之間只要用逗號進(jìn)行分隔開即可
這里因為傳遞的price參數(shù)是個數(shù)值响疚,因此在打印的時候別忘記用str()將其轉(zhuǎn)換成字符串
假如上面的例子兼都,將食物名稱與價格這兩個參數(shù)傳遞順序變換一下,結(jié)果會怎么樣稽寒?
# 定義一個打印食物名稱與價格的函數(shù)
def show_food_price(food,price):
"""打印食物名稱與價格"""
print("food:"+str(food))
print("price:"+str(price))
# 打印牛奶信息
show_food_price(3.2,'milk')
# 打印蘋果的信息
show_food_price(5,'apple')
輸出:
food:3.2
price:milk
food:5
price:apple
可以看出,一旦實參順序與形參順序不一致趟章,將會導(dǎo)致令人不悅的后果
要求實參順序與形參順序一致的值參方式叫幫位置實參
如果怕將順序?qū)戝e杏糙,則可以采用關(guān)鍵字實參,例:
# 定義一個打印食物名稱與價格的函數(shù)
def show_food_price(food,price):
"""打印食物名稱與價格"""
print("food:"+str(food))
print("price:"+str(price))
# 打印牛奶信息
show_food_price(price=3.2,food='milk')
# 打印蘋果的信息
show_food_price(food='apple',price=5)
輸出:
food:milk
price:3.2
food:apple
price:5
關(guān)鍵字實參可顯性的指出形參的名稱并為其賦值蚓土,這樣即不用再關(guān)注形參的順序
上例的函數(shù)有兩個形參宏侍,那如果在調(diào)用的時候只傳遞了一個實參會怎么樣呢?
# 定義一個打印食物名稱與價格的函數(shù)
def show_food_price(food,price):
"""打印食物名稱與價格"""
print("food:"+str(food))
print("price:"+str(price))
# 打印牛奶信息
show_food_price('milk')
輸出:
Traceback (most recent call last):
File "C:/Users/Administrator/AppData/Local/Programs/Python/Python37-32/a.py", line 7, in <module>
show_food_price('milk')
TypeError: show_food_price() missing 1 required positional argument: 'price'
可以看出蜀漆,函數(shù)還有一個參數(shù)price谅河,但我們沒有給它傳遞值,函數(shù)在執(zhí)行的時候無法處理這種情況
可以將參數(shù)price設(shè)置默認(rèn)值确丢,即可避免此種情況绷耍,如下:
# 定義一個打印食物名稱與價格的函數(shù)
def show_food_price(food,price=0):
"""打印食物名稱與價格"""
print("food:"+str(food))
# 當(dāng)價格值是默認(rèn)值時,不做任何處理
if price != 0:
print("price:"+str(price))
# 打印牛奶信息
show_food_price('milk')
# 打印蘋果的信息
show_food_price('apple',5)
輸出:
food:milk
food:apple
price:5
注意:如果多個參數(shù)中鲜侥,有指定默認(rèn)值 的情況褂始,則指定默認(rèn)值的形參要放在沒有設(shè)置默認(rèn)值的形參之后,因此在使用位置實參的時候描函,會從第一個開始匹配
位置實參與關(guān)鍵字實參可以混合使用崎苗,如下:
# 定義一個打印食物名稱與價格的函數(shù)
def show_food_price(food,price=0):
"""打印食物名稱與價格"""
print("food:"+str(food))
# 當(dāng)價格值是默認(rèn)值時,不做任何處理
if price != 0:
print("price:"+str(price))
# 打印牛奶信息
show_food_price('milk',price=5)
輸出:
food:milk
price:5
讓函數(shù)返回你想的數(shù)據(jù)
函數(shù)可以返回任何類型數(shù)據(jù)舀寓,數(shù)值胆数、字符串、列表互墓、字典……
# 定義一個打印食物名稱與價格的函數(shù)
def show_food_price(food,price=0):
"""返回食物名稱與價格"""
message = "food:"+str(food)+"\nprice:"+str(price)
return message
# 打印牛奶信息
return_message = show_food_price('milk',price=5)
print(return_message)
輸出:
food:milk
price:5
這里做了一些修改必尼,將食物的名稱與價格拼接成一個字符串,將通過關(guān)鍵字return
將字符串返回
在調(diào)用函數(shù)的時候轰豆,return_message
變量接收函數(shù)的返回值胰伍,即message
,然后將其打印輸出
上面的代碼設(shè)置了默認(rèn)的price酸休,因此骂租,函數(shù)體內(nèi)還要對默認(rèn)值做個處理,如下:
# 定義一個打印食物名稱與價格的函數(shù)
def show_food_price(food,price=0):
"""返回食物名稱與價格"""
message = ""
message1 = "food:"+str(food)
message2 ="\nprice:"+str(price)
if price != 0:
message = message1 + message2
else:
message = message1
return message
# 打印牛奶信息
return_message = show_food_price('milk',price=5)
print(return_message)
# 打印蘋果信息
print(show_food_price('apple'))
輸出:
food:milk
price:5
food:apple
下面再演示返回字典的例子
def show_food_price(food,price=0):
"""返回食物名稱與價格"""
food_dic = {}
food_dic[food] = price
return food_dic
# 打印牛奶信息
return_message = show_food_price('milk',price=5)
print(return_message)
輸出:
{'milk': 5}
使用函數(shù)將上節(jié)中為小紅定制的系統(tǒng)進(jìn)行升級
def initialize():
"""初始化食物清單列表斑司,并將其返回"""
foods = [
{'tomato': 3, 'potato': 2, 'onion': 4},
{'apple': 5, 'banana': 3.3},
{'beef': 23, 'pork': 14, 'chicken': 19.8, 'fish': 9.7}
]
return foods
def get_food(foods,food):
"""查看是否有顧客想要的食物"""
find_food = ""
# 從小紅的食物清單里查看是否有顧客想要的食物
for food_list in foods:
if food in food_list.keys():
find_food = food
print("We have " + find_food + ". Please wait a moment")
break
# 如果找到顧客想要的食物渗饮,將其賦值給變量find_food
# 如果該變量是空字符串但汞,證明沒有找到顧客想要的食物
if find_food == "":
print("Sorry, there are no " + food + " here")
def find_food(foods):
"""根據(jù)用戶輸入的食物進(jìn)行答復(fù)"""
# 退出標(biāo)志
exit = False
while not exit:
# 獲取用戶輸入的食物名稱
txt_value = input("Please tell me what kind of food you want:")
if txt_value == 'quit':
exit = True
get_food(foods,txt_value)
# 初始化食物列表
foods = initialize()
# 將食物列表傳遞給find_food函數(shù),系統(tǒng)開始工作
find_food(foods)
# 上面兩行等同于
# find_food(initialize())
輸出:
Please tell me what kind of food you want:apple
We have apple. Please wait a moment
Please tell me what kind of food you want:potato
We have potato. Please wait a moment
Please tell me what kind of food you want:
通過重構(gòu)互站,將原來的代碼進(jìn)行了分類處理私蕾,即將數(shù)據(jù)初始化的工作封裝為一個函數(shù),將尋找食物的工作封裝為一個函數(shù)胡桃,將循環(huán)工作的代碼又封裝成一個函數(shù)踩叭,這樣,代碼的可讀必翠胰,可重用性變得更高了
在這個例子中看到容贝,foods列表被當(dāng)作一個參數(shù)傳遞給了相關(guān)函數(shù),實際上之景,在函數(shù)體內(nèi)可以對列表進(jìn)行修改斤富,如下:
# 食物清單
foods = [
{'tomato': 3, 'potato': 2, 'onion': 4},
{'apple': 5, 'banana': 3.3},
{'beef': 23, 'pork': 14, 'chicken': 19.8, 'fish': 9.7}
]
def print_food(foods):
"""打印foods列表中的食物名稱"""
for food_dic in foods:
for food in food_dic.keys():
print(food)
# 將打印完畢的食物的價格改為0
food_dic[food] = 0
print(foods)
print_food(foods)
輸出:
tomato
potato
onion
apple
banana
beef
pork
chicken
fish
[{'tomato': 0, 'potato': 0, 'onion': 0}, {'apple': 0, 'banana': 0}, {'beef': 0, 'pork': 0, 'chicken': 0, 'fish': 0}]
foods列表不僅可以被當(dāng)作參數(shù)傳遞,而且在函數(shù)體內(nèi)對其內(nèi)容進(jìn)行修改后锻狗,可直接改變列表的內(nèi)容
因為是修改满力,所以這里使用了for循環(huán),在修改的過程中轻纪,使原有的列表的長度發(fā)生了變化油额,則要使用while循環(huán),否則會報錯
目錄
上一章 Python Learning-while循環(huán)
下一章 Python Learning-函數(shù) 二