7.1 �接�任�数��数的函数¶
问题¶
ä½ æƒ³æž„é€ ä¸€ä¸ªå�¯æŽ¥å�—ä»»æ„�æ•°é‡�å�‚数的函数。
解决方案¶
为了能让一个函数接�任�数�的�置�数,�以使用一个*�数。例如:
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
在这个例å�ä¸ï¼Œrest是由所有其他ä½�ç½®å�‚数组æˆ�的元组。然å�Žæˆ‘们在代ç �ä¸æŠŠå®ƒå½“æˆ�了一个åº�列æ�¥è¿›è¡Œå�Žç»çš„计算。
为了接å�—ä»»æ„�æ•°é‡�的关键å—å�‚数,使用一个以**开头的å�‚数。比如:
import html
def make_element(name, value, **attrs):
keyvals = [' %s="%s"' % item for item in attrs.items()]
attr_str = ''.join(keyvals)
element = '<{name}{attrs}>{value}</{name}>'.format(
name=name,
attrs=attr_str,
value=html.escape(value))
return element
# Example
# Creates '<item size="large" quantity="6">Albatross</item>'
make_element('item', 'Albatross', size='large', quantity=6)
# Creates '<p><spam></p>'
make_element('p', '<spam>')
在这里,attrs是一个包å�«æ‰€æœ‰è¢«ä¼ 入进æ�¥çš„关键å—å�‚æ•°çš„å—典。
å¦‚æžœä½ è¿˜å¸Œæœ›æŸ�个函数能å�Œæ—¶æŽ¥å�—ä»»æ„�æ•°é‡�çš„ä½�ç½®å�‚数和关键å—å�‚数,å�¯ä»¥å�Œæ—¶ä½¿ç”¨*å’Œ**。比如:
def anyargs(*args, **kwargs):
print(args) # A tuple
print(kwargs) # A dict
使用这个函数时,所有ä½�ç½®å�‚数会被放到args元组ä¸ï¼Œæ‰€æœ‰å…³é”®å—å�‚数会被放到å—å…¸kwargsä¸ã€‚
讨论¶
一个*å�‚æ•°å�ªèƒ½å‡ºçŽ°åœ¨å‡½æ•°å®šä¹‰ä¸æœ€å�Žä¸€ä¸ªä½�ç½®å�‚æ•°å�Žé�¢ï¼Œè€Œ **å�‚æ•°å�ªèƒ½å‡ºçŽ°åœ¨æœ€å�Žä¸€ä¸ªå�‚数。 有一点è¦�注æ„�的是,在*å�‚æ•°å�Žé�¢ä»�ç„¶å�¯ä»¥å®šä¹‰å…¶ä»–å�‚数。
def a(x, *args, y):
pass
def b(x, *args, y, **kwargs):
pass
è¿™ç§�å�‚数就是我们所说的强制关键å—å�‚数,在å�Žé�¢7.2å°�节还会详细讲解到。