流畅的Python 5. 函数
生活随笔
收集整理的這篇文章主要介紹了
流畅的Python 5. 函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. 函數對象
- 2. 高階函數
- 3. 匿名函數
- 4. 可調用函數
- 5. 定位參數、僅限關鍵字參數
- 6. 獲取參數信息
- 7. 函數注解
- 8. 支持函數式編程的包
1. 函數對象
def factorial(n):'''returns n! n的階乘'''return 1 if n < 2 else n * factorial(n - 1)print(factorial(42)) print(factorial.__doc__) # returns n! n的階乘 print(type(factorial)) # <class 'function'>fact = factorial print(fact) # <function factorial at 0x0000021512868EA0> print(fact(4)) # 24 print(list(map(factorial, range(11)))) # [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]2. 高階函數
- 接受函數作為參數,如 map,sorted
3. 匿名函數
- lambda
4. 可調用函數
- 對象是否可調用:callable()
- 任意對象實現可調用:實現 __call__()
5. 定位參數、僅限關鍵字參數
def tag(name, *content, cls=None, **attrs):"""生成一個或多個HTML標簽"""if cls is not None:attrs['class'] = clsif attrs:attr_str = ''.join(' %s="%s"' % (attr, value)for attr, valuein sorted(attrs.items()))else:attr_str = ''if content:return '\n'.join('<%s%s>%s</%s>' %(name, attr_str, c, name) for c in content)else:return '<%s%s />' % (name, attr_str)print(tag('br')) # <br /> print(tag('p', 'hello')) # <p>hello</p> print(tag('p', 'hello', 'world')) # 第一個參數后的任意個 參數 被 *content 捕獲,存入元組 # <p>hello</p> # <p>world</p> print(tag('p', 'hello', id=33, pid=24)) # 沒有明確指定名稱的關鍵字參數被 **attrs 捕獲,存入字典 # <p id="33" pid="24">hello</p> print(tag('p', 'hello', 'world', id=33, cls='sidebar', pid=24)) # cls 參數只能作為關鍵字參數 # <p class="sidebar" id="33" pid="24">hello</p> # <p class="sidebar" id="33" pid="24">world</p> print(tag(cont='testing', name="img")) # <img cont="testing" /> my_tag = {'name': 'img', 'title': 'Sunset Boulevard','src': 'sunset.jpg', 'cls': 'framed'} print(tag(**my_tag)) # ** 字典中所有元素作為單個參數傳入,同名鍵綁定到對應具名參數,余下被 **attrs 捕獲 # <img class="framed" src="sunset.jpg" title="Sunset Boulevard" /> def f(a, *c, b):return a, bprint(f(1, b=2)) # (1, 2) print(f(1, 2, b=3)) # (1, 3) b= 必須寫,因為前面有 * 參數# print(f(1, 2)) # f() takes 1 positional argument but 2 were givendef f1(a, b, *c):return a, bprint(f1(1, b=2)) # (1, 2) print(f1(1, 2)) # (1, 2) print(f1(1, 2, 3)) # (1, 2)6. 獲取參數信息
from inspect import signature sig = signature(tag) print(sig) # (name, *content, cls=None, **attrs)my_tag = {'name': 'img', 'title': 'Sunset Boulevard','src': 'sunset.jpg', 'cls': 'framed'} bound_args = sig.bind(**my_tag) print(bound_args) # <BoundArguments (name='img', cls='framed', attrs={'title': 'Sunset Boulevard', 'src': 'sunset.jpg'})> del my_tag['name'] bound_args = sig.bind(**my_tag) # TypeError: missing a required argument: 'name'7. 函數注解
- 對參數,返回值進行注釋,解釋器不做檢查
8. 支持函數式編程的包
- operator
總結
以上是生活随笔為你收集整理的流畅的Python 5. 函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 5268. 找出两数组
- 下一篇: LeetCode 2080. 区间内查询