有这样的代码
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)
Run Code Online (Sandbox Code Playgroud)
如何在更少的线上完成相同的工作?
短代码不是更好的代码.短代码不是更快的代码.短代码不是可维护的代码.现在,也就是说,让您的个人组件简洁明了是件好事.
这就是我要做的事情:
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
Run Code Online (Sandbox Code Playgroud)
这给了我:
{'odds': [1, 3, 5, 7, 9], 'evens': [2, 4, 6, 8, 10]}
Run Code Online (Sandbox Code Playgroud)
虽然这段代码实际上已经添加了几行,但是程序正在做的事情变得更加清晰,因为我们已经应用了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)
Run Code Online (Sandbox Code Playgroud)
对此:
numbers = '1 2 3 4 5 6 7 8 9 10'
nums = split_odd_even(string_to_ints(numbers))
Run Code Online (Sandbox Code Playgroud)
通过读取这两行,我们知道numbers从字符串转换为ints 的列表,然后我们将这些数字拆分为奇数和偶数,并将结果分配给nums.
解释一些可能并不熟悉的事情:
map()为list(或tuple其他可迭代的)中的每个项调用一个函数,并返回一个新列表,其中包含在每个项上调用的函数的结果.在这种情况下,我们使用它来调用int()列表中的每个项目.
filter()要求在每一个项目的功能list(或tuple或其他迭代),返回True或False每个项目(当然,truthy或falsey),并返回评估,以项目列表True时,函数被调用.
Lambda Expressions(lambda)类似于"迷你函数",它们接受参数并可以就地创建.