天天看點

第34講 函數(下)(和貓妹學Python)

小朋友們好,大朋友們好!

我們今天繼續學習函數,今天要學習的内容如下:

傳回值

變量的作用域

匿名函數(lambda)

傳回值

在Python中,可以在函數體内使用return語句為函數指定傳回值。

該傳回值可以是任意類型,并且無論return語句出現在函數的什麼位置,隻要得到執行,都會直接結束函數的調用。

文法格式如下:

return [value]

return:關鍵字

value:可選參數,用于指定要傳回的值,可以傳回一個值,可以傳回多個值

我們通過幾個小例子體驗下。

貓妹的測試代碼34.1.1.py:

def add(a,b):
    return a+b

def sub(a,b):
    return a-b

def mul(a,b):
    return a*b

def div(a,b):
    return a/b

print('請輸入兩個整數:')
a=input('第一個數')
b=input('第二個數')

ret1=add(int(a),int(b))
ret2=sub(int(a),int(b))
ret3=mul(int(a),int(b))
ret4=div(int(a),int(b))

print(a+'+'+b+'='+str(ret1))
print(a+'-'+b+'='+str(ret2))
print(a+'*'+b+'='+str(ret3))
print(a+'/'+b+'='+str(ret4))
           

貓妹的測試代碼34.1.2.py:

def hero_detail(index):
    tuple1=(
    '天魁星 呼保義 宋江    ',
    '天罡星 玉麒麟 盧俊義  ',
    '天機星 智多星 吳用    ',
    '天閑星 入雲龍 公孫勝  ',
    '天勇星 大刀 關勝      ',
    '天雄星 豹子頭 林沖    ',
    '天猛星 霹靂火 秦明    ',
    '天威星 雙鞭 呼延灼    ',
    '天英星 小李廣 花榮    ',
    '天貴星 小旋風 柴進    ',
    '天富星 撲天雕 李應    ',
    '天満星 美髯公 朱仝    ',
    '天孤星 花和尚 魯智深  ',
    '天傷星 行者 武松      ',
    '天立星 雙槍将 董平    ',
    '天捷星 沒羽箭 張清    ',
    '天暗星 青面獸 楊志    ',
    '天佑星 金槍手 徐甯    ',
    '天空星 急先鋒 索超    ',
    '天速星 神行太保 戴宗  ',
    '天異星 赤發鬼 劉唐    ',
    '天殺星 黑旋風 李逵    ',
    '天微星 九紋龍 史進    ',
    '天究星 沒遮攔 穆弘    ',
    '天退星 插翅虎 雷橫    ',
    '天壽星 混江龍 李俊    ',
    '天劍星 立地太歲 阮小二',
    '天平星 船火兒 張橫    ',
    '天罪星 短命二郎 阮小五',
    '天損星 浪裡白跳 張順  ',
    '天敗星 活閻羅 阮小七  ',
    '天牢星 病關索 楊雄    ',
    '天慧星 拼命三郎 石秀  ',
    '天暴星 兩頭蛇 解珍    ',
    '天哭星 雙尾蠍 解寶    ',
    '天巧星 浪子 燕青      ',
    '地魁星 神機軍師 朱武  ',
    '地煞星 鎮三山 黃信    ',
    '地勇星 病尉遲 孫立    ',
    '地傑星 醜郡馬 宣贊    ',
    '地雄星 井木犴 郝思文  ',
    '地威星 百勝将 韓滔    ',
    '地英星 天目将 彭玘    ',
    '地奇星 聖水将 單廷圭  ',
    '地猛星 神火将 魏定國  ',
    '地文星 聖手書生 蕭讓  ',
    '地正星 鐵面孔目 裴宣  ',
    '地闊星 摩雲金翅 歐鵬  ',
    '地阖星 火眼狻猊 鄧飛  ',
    '地強星 錦毛虎 燕順    ',
    '地暗星 錦豹子 楊林    ',
    '地軸星 轟天雷 淩振    ',
    '地會星 神算子 蔣敬    ',
    '地佐星 小溫侯 呂方    ',
    '地佑星 賽仁貴 郭盛    ',
    '地靈星 神醫 安道全    ',
    '地獸星 紫髯伯 皇甫端  ',
    '地微星 矮腳虎 王英    ',
    '地慧星 一丈青 扈三娘  ',
    '地暴星 喪門神 鮑旭    ',
    '地然星 混世魔王 樊瑞  ',
    '地猖星 毛頭星 孔明    ',
    '地狂星 獨火星 孔亮    ',
    '地飛星 八臂哪吒 項充  ',
    '地走星 飛天大聖 李衮  ',
    '地巧星 玉臂匠 金大堅  ',
    '地明星 鐵笛仙 馬麟    ',
    '地進星 出洞蛟 童威    ',
    '地退星 翻江蜃 童猛    ',
    '地滿星 玉幡竿 孟康    ',
    '地遂星 通臂猿 侯健    ',
    '地周星 跳澗虎 陳達    ',
    '地隐星 白花蛇 楊春    ',
    '地異星 白面郎君 鄭天壽',
    '地理星 九尾亀 陶宗旺',
    '地俊星 鐵扇子 宋清',
    '地樂星 鐵叫子 樂和',
    '地捷星 花項虎 龔旺',
    '地速星 中箭虎 丁得孫',
    '地鎮星 小遮攔 穆春',
    '地羁星 操刀鬼 曹正',
    '地魔星 雲裡金剛 宋萬',
    '地妖星 摸着天 杜遷',
    '地幽星 病大蟲 薛永',
    '地僻星 打虎将 李忠',
    '地空星 小霸王 周通',
    '地孤星 金錢豹子 湯隆',
    '地全星 鬼臉兒 杜興',
    '地短星 出林龍 鄒淵',
    '地角星 獨角龍 鄒潤',
    '地囚星 旱地忽律 朱貴',
    '地蔵星 笑面虎 朱富',
    '地伏星 金眼彪 施恩',
    '地平星 鉄臂膊 蔡福',
    '地損星 一枝花 蔡慶',
    '地奴星 催命判官 李立',
    '地察星 青眼虎 李雲',
    '地悪星 沒面目 焦挺',
    '地醜星 石将軍 石勇',
    '地數星 小尉遅 孫新',
    '地陰星 母大蟲 顧大嫂',
    '地刑星 菜園子 張青',
    '地壯星 母夜叉 孫二娘',
    '地劣星 活閃婆 王定六',
    '地健星 険道神 郁保四',
    '地耗星 白日鼠 白勝',
    '地賊星 鼓上蚤 時遷',
    '地狗星 金毛犬 段景住',
    )

    if index < 0 or index > 108:
        print("輸入參數錯誤")
        return null
    else:
        return tuple1[index-1]
        #return tuple1[0:index-1]

if __name__ == "__main__":
    index=input('請輸入水浒傳的座次,查詢詳細資訊,座位範圍1~108:')
    ret=hero_detail(int(index))
    print(ret)


           

貓妹的測試代碼34.1.3.py:

def buy_goods(price):
    if 500 <= price <1000:
        new_price = price*0.8
    elif 1000 <= price <5000:
        new_price = price*0.6
    elif 5000 <= price:
        new_price = price*0.5
    else:
        new_price = price
    return price,new_price

if __name__ == "__main__":
    price=input('購物節大促銷,輸入消費金額,查詢打折價:')
    ret=buy_goods(int(price))
    print('原價',ret[0])
    print('促銷價',ret[1])
           

變量的作用域

變量的作用域是指程式代碼能夠通路該變量的區域,如果超出該區域,再通路時就會出現錯誤。

在程式中,一般根據變量的有效範圍将變量分為全局變量和局部變量。

局部變量:在函數内部定義并使用的變量,隻在函數内部有效。進入函數時,系統定義局部變量,退出函數時,局部變量被銷毀。

外部如通路局部變量會報錯,會報告NameError異常。

貓妹的測試代碼34.2.1.py:

def variable_test():
    a='hello world'
    print('函數内部全局變量:',a)

if __name__ == "__main__":
    variable_test()

    #會報錯(NameError),函數外部無法通路局部變量
    print('函數外部全局變量:',a)
    
           

全局變量為能夠作用域函數内部和外部的變量。

它主要有以下兩種情況:

  • 定義在函數外部,函數内部和函數外部都可以通路。

貓妹的測試代碼34.2.2.py

a='hello world'
def variable_test():#函數内隻通路全局變量不修改全局變量
    print('函數内部全局變量:',a)

if __name__ == "__main__":
    variable_test()
    print('函數外部全局變量:',a)
           

當局部變量和全局變量同名時,在函數内部更改全局變量會出現如下錯誤

UnboundLocalError: local variable 'a' referenced before assignment

貓妹的測試代碼見34.2.3.py

a='hello world'
def variable_test():#函數内既通路全局變量又修改全局變量
    print('函數内部1:',a)
    a='hello 貓妹'
    #print('函數内部2:',a)
if __name__ == "__main__":
    variable_test()
    print('函數外部全局變量:',a)
           
  • 在函數體定義,并且使用global關鍵字修飾後,該變量也就變為全局變量。

在函數體外也可以通路該變量,并且在函數體内還可以修改将其修改。

貓妹的測試代碼見34.2.4.py

a='hello world'
def variable_test():#函數内既通路全局變量又修改全局變量
    global a
    print('函數内部1:',a)
    a='hello 貓妹'
    print('函數内部2:',a)
if __name__ == "__main__":
    variable_test()
    print('函數外部全局變量:',a)
           

盡管Python允許全局變量和局部變量同名,但是實際開發中,不建議這麼做,因為容易讓代碼混亂。

很難厘清哪些是全局變量,哪些是局部變量。

匿名函數(lambda)

匿名函數是指沒有名字的函數,應用需要一個函數,但是又不想動腦筋去命名函數名字。

多數情況,這樣的函數隻使用一次。

Python中,使用lambda表達式建立匿名函數,格式如下:

result=lambda[arg1 [,arg2,...,argn]]:expression

result:用于調用lambda表達式

[arg1 [,arg2,...,argn]]:可選參數,用于指定要傳遞的參數清單,多個參數用逗号分割。

expression:必須參數,用于指定一個實作具體功能的表達式。如果有參數,那麼在表達式中将應用這些參數。

注:參數可以有多個,但是表達式隻能有一個,即隻能傳回一個值,也不能出現其他非表達式語句(for或while)

貓妹的測試代碼34.3py:

def area_rect(width,height):
    return width*height

if __name__ == "__main__":
    width=4
    height=6
    
    a=area_rect(width,height)
    print('使用函數調用的方式計算長方形的面積:',a)

    result=lambda  width,height:width*height
    print('使用lambda表達式計算長方形的面積:',result(width,height))
           

好了,今天的學習就到這裡!

我們下次見!

第34講 函數(下)(和貓妹學Python)