可以用 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)
(编辑:好传媒网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|