def reverse(word): return word[::-1] fruits = ['strawberry', 'fig', 'apple', 'cherry', 'raspberry', 'banana'] print(reverse('testing')) print(sorted(fruits, key=reverse))
若是 iterable 的每一個元素都是真值,返回 True;all([]) 返回True。html
只要 iterable 中有元素是真值,就返回 True;any([]) 返回False。python
fruits = ['strawberry', 'fig', 'apple', 'cherry', 'raspberry', 'banana'] print(sorted(fruits, key=lambda word: word[::-1]))
若是類定義了 call 方法,那麼它的 實例 能夠做爲函數調用。程序員
所以判斷對象可否調用,最安全的方法是使用內置的 callable() 函數編程
實現 call 方法的類是建立函數類對象的簡便方式,安全
用戶定義的函數的屬性 page 252app
def tag(name, *content, cls=None, **attrs): """生成一個或多個HTML標籤""" if cls is not None: attrs['class'] = cls if attrs: attr_str = ''.join(' %s="%s"' % (attr, value) for attr, value in 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')) print(tag('p', 'hello')) print(tag('p', 'hello', 'world')) print(tag('p', 'hello', 'world', cls='sidebar'))
import bobo @bobo.query('/') def hello(person): return 'Hello %s!' % person
bobo.query 裝飾器把一個普通的函數(如 hello)與框架的請求處理
機制集成起來了。框架
Bobo 會內省 hello 函數,發現它須要一個名爲 person
的參數,而後從請求中獲取那個名稱對應的參數,將其傳給 hello 函
數,所以程序員根本不用觸碰請求對象。ide
使用 inspect 模塊函數式編程
from clip import clip from inspect import signature sig = signature(clip) print(sig) print(str(sig)) for name, param in sig.parameters.items(): print(param.kind, ':', name, '=', param.default)
inspect.signature 函數返回一個inspect.Signature 對象函數
kind 屬性的值是 _ParameterKind 類中的 5 個值之一,列舉以下。
POSITIONAL_OR_KEYWORD
能夠經過定位參數和關鍵字參數傳入的形參(多數 Python 函數的參數屬於此類)。
VAR_POSITIONAL
定位參數元組。
VAR_KEYWORD
關鍵字參數字典。
KEYWORD_ONLY
僅限關鍵字參數(Python 3 新增)。
POSITIONAL_ONLY
僅限定位參數;
它能夠把任意個參數綁定到簽名中的形參上,所用的規則與實參到形參的匹配方式同樣。
框架可使用這個方法在真正調用函數前驗證參數,
示例 5-18 把tag 函數(見示例 5-10)的簽名綁定到一個參數字典
上
>>> import inspect >>> sig = inspect.signature(tag) ➊ >>> my_tag = {'name': 'img', 'title': 'Sunset Boulevard', ... 'src': 'sunset.jpg', 'cls': 'framed'} >>> bound_args = sig.bind(**my_tag) ➋ >>> bound_args <inspect.BoundArguments object at 0x...> ➌ >>> for name, value in bound_args.arguments.items(): ➍ ... print(name, '=', value) ... name = img cls = framed attrs = {'title': 'Sunset Boulevard', 'src': 'sunset.jpg'} >>> del my_tag['name'] ➎ >>> bound_args = sig.bind(**my_tag) ➏ Traceback (most recent call last): ... TypeError: 'name' parameter lacking default value
❷ 把一個字典參數傳給 .bind() 方法。
❸ 獲得一個 inspect.BoundArguments 對象。
❹ 迭代 bound_args.arguments(一個 OrderedDict 對象)中的元
素,顯示參數的名稱和值。
❺ 把必須指定的參數 name 從 my_tag 中刪除。
❻ 調用 sig.bind(**my_tag),拋出 TypeError,抱怨缺乏 name 參
數。
def clip(text: str, max_len: 'int > 0' = 80) -> str: print(text, max_len) clip("sdf", 18) print(clip.__annotations__)
註解不會作任何處理,只是存儲在函數的 annotations 屬性(一
個字典)中:
from functools import reduce # 階乘 def fact(n): print(reduce(lambda a, b: a * b, range(1, n + 1))) # operator.mul 函數計算階乘 from functools import reduce from operator import mul def fact2(n): return reduce(mul, range(1, n + 1)) print(fact2(3))
展現了 itemgetter 的常見用途:根據元組的某個字段給元
組列表排序。在這個示例中,按照國家代碼(第 2 個字段)的順序打印
各個城市的信息。
metro_data = [ ('Tokyo', 'JP', 36.933, (35.689722, 139.691667)), ('Delhi NCR', 'IN', 21.935, (28.613889, 77.208889)), ('Mexico City', 'MX', 20.142, (19.433333, -99.133333)), ('New York-Newark', 'US', 20.104, (40.808611, -74.020386)), ('Sao Paulo', 'BR', 19.649, (-23.547778, -46.635833)), ] ### 演示使用 itemgetter 排序一個元組列表 from operator import itemgetter for city in sorted(metro_data, key=itemgetter(1)): print(city)
若是把多個參數傳給 itemgetter,它構建的函數會返回提取的值構成
的元組:
cc_name = itemgetter(1, 0) for city in metro_data: print(cc_name(city))
此外,若是參數名中包含 .(點號),attrgetter 會深
入嵌套對象,獲取指定的屬性。
from collections import namedtuple metro_data = [ ('Tokyo', 'JP', 36.933, (35.689722, 139.691667)), ('Delhi NCR', 'IN', 21.935, (28.613889, 77.208889)), ('Mexico City', 'MX', 20.142, (19.433333, -99.133333)), ('New York-Newark', 'US', 20.104, (40.808611, -74.020386)), ('Sao Paulo', 'BR', 19.649, (-23.547778, -46.635833)), ] ## 就像數據格式化同樣 數據帶上標籤 LatLong = namedtuple('LatLong', 'lat long') Metropolis = namedtuple('Metropolis', 'name cc pop coord') metro_areas = [Metropolis(name, cc, pop, LatLong(lat, long)) for name, cc, pop, (lat, long) in metro_data] print(metro_areas[0]) print(metro_areas[0].coord.lat) # from operator import attrgetter name_lat = attrgetter('name', 'coord.lat') for city in sorted(metro_areas, key=attrgetter('coord.lat')): print(name_lat(city))
它會自行建立函數。methodcaller 建立的函數會在對象上調用參數指定的方法
本身建立函數
from operator import methodcaller s = 'The time has come' upcase = methodcaller('upper') print(upcase) hiphenate = methodcaller('replace', ' ', '-') print(hiphenate(s))
functools.partial 這個高階函數用於部分應用一個函數。部分應用
是指,基於一個函數建立一個新的可調用對象,把原函數的某些參數固定。
from operator import mul from functools import partial print(mul(3, 7)) # 第一個函數, 第二個固定的參數 triple = partial(mul, 3) print(list(map(triple, range(1, 10))))