| 
                         可以用 map 重写成: 
- import random 
 -  
 - names = ['Mary', 'Isla', 'Sam'] 
 -  
 - secret_names = map(lambda x: random.choice(['Mr. Pink', 
 -                                             'Mr. Orange', 
 -                                             'Mr. Blonde']), 
 -                    names) 
 
  
练习1:尝试将下面的代码重写为 map ,输入一个真实名字列表,替换成用更可靠策略生成的代号。 
- names = ['Mary', 'Isla', 'Sam'] 
 -  
 - for i in range(len(names)): 
 -     names[i] = hash(names[i]) 
 -  
 - print names 
 - # => [6306819796133686941, 8135353348168144921, -1228887169324443034] 
 
  
(希望特工会留下美好的回忆,在秘密任务期间能记得住搭档的秘密代号。) 
我的实现方案: 
- names = ['Mary', 'Isla', 'Sam'] 
 -  
 - secret_names = map(hash, names) 
 
  
reduce
reduce 输入一个函数和一个集合,返回通过合并集合元素所创建的值。 
这是一个简单的 reduce ,返回集合所有元素的总和。 
- sum = reduce(lambda a, x: a + x, [0, 1, 2, 3, 4]) 
 -  
 - print sum 
 - # => 10 
 
  
x 是迭代的当前元素。 a 是累加器( accumulator ),它是在前一个元素上执行 lambda 的返回值。 reduce() 遍历所有集合元素。对于每一个元素,运行以当前的 a 和 x 为参数运行 lambda ,返回结果作为下一次迭代的 a 。 
在第一次迭代时, a 是什么值?并没有前一个的迭代结果可以传递。 reduce() 使用集合中的第一个元素作为第一次迭代中的 a 值,从集合的第二个元素开始迭代。也就是说,第一个 x 是集合的第二个元素。 
下面的代码计算单词 'Sam' 在字符串列表中出现的次数: 
- sentences = ['Mary read a story to Sam and Isla.', 
 -              'Isla cuddled Sam.', 
 -              'Sam chortled.'] 
 -  
 - sam_count = 0 
 - for sentence in sentences: 
 -     sam_count += sentence.count('Sam') 
 -  
 - print sam_count 
 - # => 3 
 
  
这与下面使用 reduce 的代码相同: 
- sentences = ['Mary read a story to Sam and Isla.', 
 -              'Isla cuddled Sam.', 
 -              'Sam chortled.'] 
 -  
 - sam_count = reduce(lambda a, x: a + x.count('Sam'), 
 -                    sentences, 
 -                    0) 
 
                          (编辑:泰州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |