有这样的代码
numbers = '1 2 3 4 5 6 7 8'
nums = {'evens': [], 'odds': []}
for number in numbers.split(' '):
if int(number) % 2:
nums['odds'].append(number)
else:
nums['evens'].append(number)
如何在更少的行上完成相同的任务?
短代码不是更好的代码。短代码不是更快的代码。短代码不是可维护的代码。话虽如此,使您的各个组件简洁明了是一件好事。
这是我会做的:
def split_odd_even(number_list):
return {
'odds': filter(lambda n: (n % 2) != 0, number_list),
'evens': filter(lambda n: (n % 2) == 0, number_list)
}
def string_to_ints(string):
return map(int, numbers.strip().split())
numbers = '1 2 3 4 5 6 7 8 9 10'
nums = split_odd_even(string_to_ints(numbers))
print nums
这给了我:
{'odds': [1, 3, 5, 7, 9], 'evens': [2, 4, 6, 8, 10]}
尽管这段代码实际上增加了几行长度,但是随着我们应用了Abstraction并使代码的每个组件仅做一件事情,它变得更加清楚了程序在做什么。
即使我们添加了两个函数,代码中最可见的部分也由此消失了:
numbers = '1 2 3 4 5 6 7 8'
nums = {'evens': [], 'odds': []}
for number in numbers.split(' '):
if int(number) % 2:
nums['odds'].append(number)
else:
nums['evens'].append(number)
对此:
numbers = '1 2 3 4 5 6 7 8 9 10'
nums = split_odd_even(string_to_ints(numbers))
仅通过阅读这两行,我们就知道将numbers
其从字符串转换为int
s的列表,然后将这些数字拆分为奇数和偶数,并将结果分配给nums
。
要解释一些可能不是所有人都熟悉的事情:
map()
为list
(或tuple
其他可迭代)中的每个项目调用一个函数,并返回一个新列表,其中包含对每个项目调用该函数的结果。在这种情况下,我们使用它来调用int()
列表中的每个项目。
filter()
为list
(或tuple
其他可迭代)中的每个项目调用一个函数,该函数返回True
或False
为每个项目(well,true或falsey),并返回在True
调用该函数时要求值的项目列表。
Lambda表达式(lambda
)类似于带有参数的“迷你函数”,并且可以就地创建。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句