Python Learning-函數(shù) 一

函數(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ù) 二

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刻帚,一起剝皮案震驚了整個濱河市悔耘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌我擂,老刑警劉巖衬以,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異校摩,居然都是意外死亡看峻,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門衙吩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來互妓,“玉大人,你說我怎么就攤上這事坤塞》朊悖” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵摹芙,是天一觀的道長灼狰。 經(jīng)常有香客問我,道長浮禾,這世上最難降的妖魔是什么交胚? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任份汗,我火速辦了婚禮,結(jié)果婚禮上蝴簇,老公的妹妹穿的比我還像新娘杯活。我一直安慰自己,他們只是感情好熬词,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布旁钧。 她就那樣靜靜地躺著,像睡著了一般互拾。 火紅的嫁衣襯著肌膚如雪均践。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天摩幔,我揣著相機(jī)與錄音,去河邊找鬼鞭铆。 笑死或衡,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的车遂。 我是一名探鬼主播封断,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼舶担!你這毒婦竟也來了坡疼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤衣陶,失蹤者是張志新(化名)和其女友劉穎柄瑰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剪况,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡教沾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了译断。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片授翻。...
    茶點(diǎn)故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖孙咪,靈堂內(nèi)的尸體忽然破棺而出堪唐,到底是詐尸還是另有隱情,我是刑警寧澤翎蹈,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布淮菠,位于F島的核電站,受9級特大地震影響荤堪,放射性物質(zhì)發(fā)生泄漏兜材。R本人自食惡果不足惜理澎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望曙寡。 院中可真熱鬧糠爬,春花似錦、人聲如沸举庶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽户侥。三九已至镀琉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蕊唐,已是汗流浹背屋摔。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留替梨,地道東北人钓试。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像副瀑,于是被迫代替她去往敵國和親弓熏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容