1.19 转�并�时计算数�¶
问题¶
ä½ éœ€è¦�在数æ�®åº�列上执行è�šé›†å‡½æ•°ï¼ˆæ¯”如 sum() , min() , max() ),
ä½†æ˜¯é¦–å…ˆä½ éœ€è¦�先转æ�¢æˆ–者过滤数æ�®
解决方案¶
一个é�žå¸¸ä¼˜é›…的方å¼�去结å�ˆæ•°æ�®è®¡ç®—与转æ�¢å°±æ˜¯ä½¿ç”¨ä¸€ä¸ªç”Ÿæˆ�器表达å¼�å�‚数。 æ¯”å¦‚ï¼Œå¦‚æžœä½ æƒ³è®¡ç®—å¹³æ–¹å’Œï¼Œå�¯ä»¥åƒ�下é�¢è¿™æ ·å�šï¼š
nums = [1, 2, 3, 4, 5]
s = sum(x * x for x in nums)
下é�¢æ˜¯æ›´å¤šçš„例å�:
# Determine if any .py files exist in a directory
import os
files = os.listdir('dirname')
if any(name.endswith('.py') for name in files):
print('There be python!')
else:
print('Sorry, no python.')
# Output a tuple as CSV
s = ('ACME', 50, 123.45)
print(','.join(str(x) for x in s))
# Data reduction across fields of a data structure
portfolio = [
{'name':'GOOG', 'shares': 50},
{'name':'YHOO', 'shares': 75},
{'name':'AOL', 'shares': 20},
{'name':'SCOX', 'shares': 65}
]
min_shares = min(s['shares'] for s in portfolio)
讨论¶
上é�¢çš„示例å�‘ä½ æ¼”ç¤ºäº†å½“ç”Ÿæˆ�器表达å¼�作为一个å�•独å�‚æ•°ä¼ é€’ç»™å‡½æ•°æ—¶å€™çš„å·§å¦™è¯æ³•ï¼ˆä½ å¹¶ä¸�需è¦�å¤šåŠ ä¸€ä¸ªæ‹¬å�·ï¼‰ã€‚ 比如,下é�¢è¿™äº›è¯å�¥æ˜¯ç‰æ•ˆçš„:
s = sum((x * x for x in nums)) # 显å¼�çš„ä¼ é€’ä¸€ä¸ªç”Ÿæˆ�器表达å¼�对象
s = sum(x * x for x in nums) # æ›´åŠ ä¼˜é›…çš„å®žçŽ°æ–¹å¼�,çœ�略了括å�·
使用一个生æˆ�器表达å¼�作为å�‚æ•°ä¼šæ¯”å…ˆåˆ›å»ºä¸€ä¸ªä¸´æ—¶åˆ—è¡¨æ›´åŠ é«˜æ•ˆå’Œä¼˜é›…ã€‚ æ¯”å¦‚ï¼Œå¦‚æžœä½ ä¸�使用生æˆ�器表达å¼�çš„è¯�ï¼Œä½ å�¯èƒ½ä¼šè€ƒè™‘使用下é�¢çš„实现方å¼�:
nums = [1, 2, 3, 4, 5]
s = sum([x * x for x in nums])
è¿™ç§�æ–¹å¼�å�Œæ ·å�¯ä»¥è¾¾åˆ°æƒ³è¦�的效果,但是它会多一个æ¥éª¤ï¼Œå…ˆåˆ›å»ºä¸€ä¸ªé¢�外的列表。 对于å°�型列表å�¯èƒ½æ²¡ä»€ä¹ˆå…³ç³»ï¼Œä½†æ˜¯å¦‚æžœå…ƒç´ æ•°é‡�é�žå¸¸å¤§çš„æ—¶å€™ï¼Œ 它会创建一个巨大的仅仅被使用一次就被丢弃的临时数æ�®ç»“构。而生æˆ�器方案会以è¿ä»£çš„æ–¹å¼�转æ�¢æ•°æ�®ï¼Œå› æ¤æ›´çœ�内å˜ã€‚
在使用一些è�šé›†å‡½æ•°æ¯”如 min() å’Œ max() çš„æ—¶å€™ä½ å�¯èƒ½æ›´åР倾å�‘于使用生æˆ�器版本,
它们接å�—的一个 key 关键å—å�‚æ•°æˆ–è®¸å¯¹ä½ å¾ˆæœ‰å¸®åŠ©ã€‚
比如,在上é�¢çš„è¯�券例å�ä¸ï¼Œä½ å�¯èƒ½ä¼šè€ƒè™‘下é�¢çš„实现版本:
# Original: Returns 20
min_shares = min(s['shares'] for s in portfolio)
# Alternative: Returns {'name': 'AOL', 'shares': 20}
min_shares = min(portfolio, key=lambda s: s['shares'])