函數(shù)

1、可接受任意數(shù)量參數(shù)的函數(shù)

def avg(first, *rest):
return (first + sum(rest)) / (1 + len(rest))
# Sample use
avg(1, 2) # 1.5
avg(1, 2, 3, 4) # 2.5
def make_element(name, value, **attrs):
    keyvals = [' %s="%s"' % item for item in attrs.items()]
    attr_str = ''.join(keyvals)
    print(attrs)
    print(attrs.items())
    element = '<{name}{attrs}>{value}</{name}>'.format(
    name=name,
    attrs=attr_str,
    value=value)
    return element

# Example
make_element('item', 'Albatross', size='large', quantity=6)
輸出
# {'size': 'large', 'quantity': 6}
# dict_items([('size', 'large'), ('quantity', 6)])
# '<item size="large" quantity="6">Albatross</item>'
def anyargs(*args, **kwargs):
    print(args) # A tuple
    print(kwargs) # A dict

def a(x, *args, y):
    pass
def b(x, *args, y, **kwargs):
    pass
**參數(shù)只能出現(xiàn)在最后一個參數(shù)。有一點(diǎn)要注意的是抓歼,在 * 參數(shù)后面仍然可以定義其他參數(shù)。

2拢锹、只接受關(guān)鍵字參數(shù)的函數(shù)

def recv(maxsize, *, block):
    'Receives a message'
    pass
recv(1024, True) # TypeError
recv(1024, block=True) # Ok
def mininum(*values, clip=None):
    m = min(values)
    if clip is not None:
        m = clip if clip > m else m
    return m

minimum(1, 5, 2, -5, 10) # Returns -5
minimum(1, 5, 2, -5, 10, clip=0) # Returns 0

3谣妻、給函數(shù)參數(shù)增加元信息

def add(x:int, y:int) -> int:
    return x + y

>>> help(add)
Help on function add in module __main__:
add(x: int, y: int) -> int
>>>

函數(shù)注解只存儲在函數(shù)的 __annotations__ 屬性中。例如:
>>> add.__annotations__
{'y': <class 'int'>, 'return': <class 'int'>, 'x': <class 'int'>}

4卒稳、返回多個值的函數(shù)

>>> def myfun():
...     return 1, 2, 3
...
>>> a, b, c = myfun()
>>> a
1
>>> b
2
>>> c
3
>>> a = (1, 2) # With parentheses
>>> a
(1, 2)
>>> b = 1, 2 # Without parentheses
>>> b
(1, 2)
>>>
>>> x = myfun()
>>> x
(1, 2, 3)
>>>

5蹋半、定義有默認(rèn)參數(shù)的函數(shù)

def spam(a, b=42):
    print(a, b)

spam(1) # Ok. a=1, b=42
spam(1, 2) # Ok. a=1, b=2
如果默認(rèn)參數(shù)是一個可修改的容器比如一個列表、集合或者字典充坑,可以使用 None作為默認(rèn)值减江,就像下面這樣:
# Using a list as a default value
def spam(a, b=None):
    if b is None:
        b = []
    ...
如果你并不想提供一個默認(rèn)值,而是想僅僅測試下某個默認(rèn)參數(shù)是不是有傳遞進(jìn)來捻爷,可以像下面這樣寫:
_no_value = object()
  
def spam(a, b=_no_value):
    if b is _no_value:
        print('No b value supplied')
    ...

>>> spam(1)
No b value supplied
>>> spam(1, 2) # b = 2
>>> spam(1, None) # b = None
>>>
!!!!!! 默認(rèn)參數(shù)的值僅僅在函數(shù)定義的時候賦值一次辈灼。試著運(yùn)行下面這個例子:
>>> x = 42
>>> def spam(a, b=x):
...     print(a, b)
...
>>> spam(1)
1 42
>>> x = 23 # Has no effect
>>> spam(1)
1 42
>>>

6、定義匿名或內(nèi)聯(lián)函數(shù)

>>> add = lambda x, y: x + y
>>> add(2,3)
5
>>> add('hello', 'world')
'helloworld'
>>>
lambda 表達(dá)式典型的使用場景是排序或數(shù)據(jù) reduce 等:
>>> names = ['David Beazley', 'Brian Jones',
...         'Raymond Hettinger', 'Ned Batchelder']
>>> sorted(names, key=lambda name: name.split()[-1].lower())
['Ned Batchelder', 'David Beazley', 'Raymond Hettinger', 'Brian Jones']
>>>

7也榄、匿名函數(shù)捕獲變量值

>>> x = 10
>>> a = lambda y: x + y
>>> x = 20
>>> b = lambda y: x + y
>>>
>>> a(10)
30
>>> b(10)
30
>>>

這其中的奧妙在于 lambda 表達(dá)式中的 x 是一個自由變量巡莹,在運(yùn)行時綁定值,而不是定義時就綁定,這跟函數(shù)的默認(rèn)值參數(shù)定義是不同的降宅。因此骂远,在調(diào)用這個 lambda 表達(dá)式的時候, x 的值是執(zhí)行時的值腰根。例如:

>>> x = 15
>>> a(10)
25
>>> x = 3
>>> a(10)
13
>>>

如果你想讓某個匿名函數(shù)在定義時就捕獲到值激才,可以將那個參數(shù)值定義成默認(rèn)參
數(shù)即可,就像下面這樣:

>>> x = 10
>>> a = lambda y, x=x: x + y
>>> x = 20
>>> b = lambda y, x=x: x + y
>>> a(10)
20
>>> b(10)
30
>>>
>>> funcs = [lambda x: x+n for n in range(5)]
>>> for f in funcs:
... print(f(0))
...
4
4
4
4
4
>>>
>>> funcs = [lambda x, n=n: x+n for n in range(5)]
>>> for f in funcs:
... print(f(0))
...
0
1
2
3
4
>>>
通過使用函數(shù)默認(rèn)值參數(shù)形式唠雕, lambda 函數(shù)在定義時就能綁定到值

8贸营、

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市岩睁,隨后出現(xiàn)的幾起案子钞脂,更是在濱河造成了極大的恐慌,老刑警劉巖捕儒,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冰啃,死亡現(xiàn)場離奇詭異,居然都是意外死亡刘莹,警方通過查閱死者的電腦和手機(jī)阎毅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來点弯,“玉大人扇调,你說我怎么就攤上這事∏栏兀” “怎么了狼钮?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長捡絮。 經(jīng)常有香客問我熬芜,道長,這世上最難降的妖魔是什么福稳? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任涎拉,我火速辦了婚禮,結(jié)果婚禮上的圆,老公的妹妹穿的比我還像新娘鼓拧。我一直安慰自己,他們只是感情好越妈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布毁枯。 她就那樣靜靜地躺著,像睡著了一般叮称。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天瓤檐,我揣著相機(jī)與錄音赂韵,去河邊找鬼。 笑死挠蛉,一個胖子當(dāng)著我的面吹牛祭示,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谴古,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼质涛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了掰担?” 一聲冷哼從身側(cè)響起汇陆,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎带饱,沒想到半個月后毡代,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡勺疼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年教寂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片执庐。...
    茶點(diǎn)故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡酪耕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出轨淌,到底是詐尸還是另有隱情迂烁,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布猿诸,位于F島的核電站婚被,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏梳虽。R本人自食惡果不足惜址芯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窜觉。 院中可真熱鬧谷炸,春花似錦、人聲如沸禀挫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽语婴。三九已至描孟,卻和暖如春驶睦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背匿醒。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工场航, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人廉羔。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓溉痢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親憋他。 傳聞我的和親對象是個殘疾皇子孩饼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評論 2 353

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

  • 函數(shù)注解與匿名函數(shù) 關(guān)于函數(shù)參數(shù)的定義,調(diào)用以及函數(shù)參數(shù)的內(nèi)容竹挡,在下面的文章中已經(jīng)做了初步的介紹镀娶,有需要的可以訪問...
    大夢三千秋閱讀 582評論 0 5
  • C++ lambda表達(dá)式與函數(shù)對象 lambda表達(dá)式是C++11中引入的一項(xiàng)新技術(shù),利用lambda表達(dá)式可以...
    小白將閱讀 85,242評論 15 118
  • 前言 前天創(chuàng)了個 Python 微信討論群此迅,以為沒人進(jìn)的汽畴,哈哈,想不到還真有小伙伴進(jìn)群學(xué)習(xí)討論耸序。如果想進(jìn)群忍些,可以加...
    GitHubClub閱讀 1,096評論 1 15
  • 一、函數(shù)基礎(chǔ) 函數(shù)就是將一些語句組合在一起的組件坎怪,從而讓他們能夠不止一次的在程序中運(yùn)行罢坝。 定義函數(shù) def的頭部定...
    Benedict清水閱讀 332評論 0 0
  • 本次我要給大家分享一些更加高級和不常見的函數(shù)定義與使用模式。 涉及到的內(nèi)容包括默認(rèn)參數(shù)搅窿、任意數(shù)量參數(shù)嘁酿、強(qiáng)制關(guān)鍵字 ...
    運(yùn)維開發(fā)_西瓜甜閱讀 406評論 0 4