DAY2-函數(shù)進階

  • 函數(shù)參數(shù)--動態(tài)傳參

  • gloabal, nonlocal關鍵字

  1. 函數(shù)參數(shù)--動態(tài)傳參
  • 動態(tài)接收位置參數(shù)
    ?先我們先回顧一下位置參數(shù), 位置參數(shù), 按照位置進行傳參锌杀。
def chi(quality_food, junk_food):
      print("我要吃", quality_food, junk_food) 
      chi("?大?米飯", "?小?米飯") 

結果:

我要吃 ('?大?米飯', '?小?米飯') 
# "?大?米飯"傳遞給quality_food  "?小?米飯"傳遞給junk_food

現(xiàn)在問題來了. 我想吃任意的食物. 數(shù)量是任意的, 食物也是任意的. 這時我們就要?用到 動態(tài)參數(shù)了.
在參數(shù)位置編寫*表?示接收任意內容

def chi(*food):

   print("我要吃", food) 
   chi("?大?米飯", "?小?米飯") 

結果:

我要吃 ('?大?米飯', '?小?米飯')

# 多個參數(shù)傳遞進去. 收到的內容是元組tuple

動態(tài)接收參數(shù)的時候要注意: 動態(tài)參數(shù)必須在位置參數(shù)后?

def chi(*food,a,b):
     print("我要吃",food,a,b)

chi("大米","小米","紅燒肉","茄子")
這時程序運?行行會報錯. 因為前?面?zhèn)鬟f進去的所有位置參數(shù)都被*food接收了了. a和b永遠接收 不到參數(shù)

Traceback (most recent call last):
File"/Users/sylar/PycharmProjects/oldboy/fun.py", line 95, in <module> chi("?大?米飯", "?小?米飯", "?黃?瓜", "茄?子")
TypeError: chi() missing 2 required keyword-only arguments: 'a' and 'b'

所以必須改寫成以下代碼:

def chi(*food, a, b):
       print("我要吃", food, a, b)

chi("?大?米飯", "?小?米飯", a="?黃?瓜", b="茄?子")  # 必須?用關鍵字參數(shù)來指定

這個時候a和b就有值了了, 但是這樣寫呢位置參數(shù)就不能?用了了. 所以. 我們要先寫位置參數(shù), 然后再?動態(tài)參數(shù).

def chi(a, b, *food):
       print("我要吃", a, b, food)

chi("?大?米飯", "?小?米飯", "饅頭", "?面條") 

# 前兩個參數(shù)用位置參數(shù)來接收, 后面的參數(shù)?動態(tài)參數(shù)接收.

那默認值參數(shù)呢?

def chi(a, b, c='饅頭', *food):
       print(a, b, c, food)

chi("?蕉", "菠蘿") # ?蕉 菠蘿 饅頭 (). 默認值?生效 
chi("香蕉", "菠蘿", "葫蘆娃") # 香蕉 菠蘿 葫蘆娃 () 默認值不不?生效 
chi("?蕉", "菠蘿", "葫蘆娃", "口罩") # 香蕉 菠蘿 葫蘆娃 ('?罩',) 默認值不生效

發(fā)現(xiàn)默認值參數(shù)寫在動態(tài)參數(shù)前面. 默認值只有一種情況可能會生效.

def chi(a, b, *food, c="娃哈哈"):
       print(a, b, food, c)

chi("?蕉", "菠蘿") # 香蕉 菠蘿 () 娃哈哈 默認值?生效 
chi("香蕉", "菠蘿", "葫蘆娃") # 香蕉 菠蘿 ('葫蘆娃',) 娃哈哈 默認值?生效 
chi("香蕉", "菠蘿", "葫蘆娃", "口罩") # 香蕉 菠蘿 ('葫蘆娃', '口罩') 娃哈哈 認值?生效

這個時候我們發(fā)現(xiàn)所有的默認值都?生效了. 這個時候如果不給出關鍵字傳參. 那么你的默認值是永遠都生效的.

順序: 位置參數(shù), 動態(tài)參數(shù)*, 默認值參
  1. 動態(tài)接收關鍵字參數(shù)
    在python中可以動態(tài)的位置參數(shù), 但是這種情況只能接收位置參數(shù)?法接收關鍵字參數(shù).
    在python中使?
    *來接收動態(tài)關鍵字參數(shù)
def func(**kwargs):
       print(kwargs)

func(a=1, b=2, c=3) 
func(a=1, b=2)

結果:
{'a': 1, 'b': 2, 'c': 3}
 {'a': 1, 'b': 2}

這個時候接收的是一個dict

  • 順序的問題, 在函數(shù)調用的時候, 如果先給出關鍵字參數(shù), 則整個參數(shù)列表會報錯.
def func(a, b, c, d):
       print(a, b, c, d)

# 關鍵字參數(shù)必須在位置參數(shù)后?面, 否則參數(shù)會混亂 
func(1, 2, c=3, 4)
  • 所以關鍵字參數(shù)必須在位置參數(shù)后面. 由于實參是這個順序. 所以形參接收的時候也是這個順序. 也就是說位置參數(shù)必須在關鍵字參數(shù)前面. 動態(tài)接收關鍵字參數(shù)也要在后?.

最終順序(*):
位置參數(shù) > *args > 默認值參數(shù) > **kwargs

這四種參數(shù)可以任意的進?行行使?用. 如果想接收所有的參數(shù):

def func(*args, **kwargs):
       print(args, kwargs)

func("麻花藤","?馬暈",wtf="胡辣湯")

動態(tài)參數(shù)的另?一種傳參?方式:

def fun(*args):
    print(args)

lst = [1, 4, 7] 
fun(lst[0], lst[1], lst[2])

fun(*lst) # 可以使?用*把?一個列列表按順序打散 
s = "?臣妾做不不到" 
fun(*s)  # 字符串串也可以打散, (可迭代對象)

在實參位置上給一個序列,列表,可迭代對象前面加個*表示把這個序列列按順序打散.

在形參的位置上的* 表示把接收到的參數(shù)組合成一個元組 如果是?個字典, 那么也可以打散. 不過需要用兩個*

def fun(**kwargs):
    print(kwargs)

dic = {'a':1, 'b':2} 
fun(**dic)
  • 函數(shù)的注釋:
def chi(food, drink):

""" 
這?里里是函數(shù)的注釋
:param:param food: 參數(shù)food是什什么意思 :param:param drink: 參數(shù)drink是什什么意思 
:return:return: 返回的是什么東東 
""" 
print(food, drink)
 return "very good"
  1. 關鍵字global和nonlocal
  • ?先我們寫這樣?個代碼, 首先在全局聲明?一個變量, 然后再局部調?用這個變量, 并改變這 個變量的值
a = 100 
def func():
     global a # 加了了個global表示不不再局部創(chuàng)建這個變量量了了. 而是直接使用全局的a
     a = 28 
     print(a)

func() 
print(a)
global表示. 不再使用局部作?域中的內容了. ?改用全局作用域中的變量

nonlocal 表?在局部作用域中, 調?用父級命名空間中的變量

a = 10 
def func1():
       a = 20 
       def func2():
            nonlocal a 
            a = 30 
            print(a)
       func2()
       print(a)

func1()
結果: 
加了nonlocal
30 
30 
不加nonlocal 
30 
20     
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末风范,一起剝皮案震驚了整個濱河市嘹裂,隨后出現(xiàn)的幾起案子芙代,更是在濱河造成了極大的恐慌鼓黔,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谎脯,死亡現(xiàn)場離奇詭異葱跋,居然都是意外死亡,警方通過查閱死者的電腦和手機源梭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門娱俺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咸产,你說我怎么就攤上這事≈倜觯” “怎么了脑溢?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赖欣。 經(jīng)常有香客問我屑彻,道長,這世上最難降的妖魔是什么顶吮? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任社牲,我火速辦了婚禮,結果婚禮上悴了,老公的妹妹穿的比我還像新娘搏恤。我一直安慰自己,他們只是感情好湃交,可當我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布熟空。 她就那樣靜靜地躺著,像睡著了一般搞莺。 火紅的嫁衣襯著肌膚如雪息罗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天才沧,我揣著相機與錄音迈喉,去河邊找鬼绍刮。 笑死,一個胖子當著我的面吹牛挨摸,可吹牛的內容都是我干的孩革。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼油坝,長吁一口氣:“原來是場噩夢啊……” “哼嫉戚!你這毒婦竟也來了?” 一聲冷哼從身側響起澈圈,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤彬檀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瞬女,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窍帝,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年诽偷,在試婚紗的時候發(fā)現(xiàn)自己被綠了坤学。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡报慕,死狀恐怖深浮,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情眠冈,我是刑警寧澤飞苇,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站蜗顽,受9級特大地震影響布卡,放射性物質發(fā)生泄漏。R本人自食惡果不足惜雇盖,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一忿等、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧崔挖,春花似錦贸街、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至卷哩,卻和暖如春蛋辈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工冷溶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留渐白,地道東北人。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓逞频,卻偏偏與公主長得像纯衍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子苗胀,可洞房花燭夜當晚...
    茶點故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內容

  • 第5章 函數(shù)和函數(shù)式編程 5.1 引言函數(shù)是組織好的襟诸,可重復使用的,用來實現(xiàn)單一基协,或相關聯(lián)功能的代碼段歌亲。函數(shù)...
    VIVAFT閱讀 961評論 0 5
  • 這篇筆記記錄的知識點:函數(shù)的基本概念自定義函數(shù)函數(shù)的幾種參數(shù) 編程的三種方式:1.OOP 面向對象編程,萬物皆對象...
    古月半半閱讀 923評論 0 2
  • 函數(shù)和對象 1澜驮、函數(shù) 1.1 函數(shù)概述 函數(shù)對于任何一門語言來說都是核心的概念陷揪。通過函數(shù)可以封裝任意多條語句,而且...
    道無虛閱讀 4,578評論 0 5
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,111評論 1 32
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學習記錄文檔杂穷,今天18年5月份再次想寫文章悍缠,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 2,767評論 2 9