我正在学习python并对下面的代码有疑问:
nums = { 1, 2, 3, 5, 6 }
nums = { 0, 1, 2, 3 } & nums # nums = { 1, 2, 3 }
nums = filter(lambda x: x > 1, nums) # nums = { 2, 3 }
print(len(list(nums)))
此代码的结果必须为2
。但为什么?我不明白这段代码。你能解释一下最后一行吗?我不明白list(nums)
的作用。
答案 0 :(得分:4)
nums = { 1, 2, 3, 4, 5, 6 }
包含1 - 6的集合。
nums = { 0, 1, 2, 3 } & nums
包含0 - 3和前一组的集合的intersection,因此{1,2,3}(两者共有的元素)。
nums = filter(lambda x: x > 1, nums)
filter删除了在作为第一个参数给出的callable传递时不返回true的元素。因此,它在这里删除了1
条目,留下{2,3}。
现在你明白为什么长度是2。
答案 1 :(得分:3)
这样的问题是REPL可以派上用场的地方:
>>> nums = { 1, 2, 3, 5, 6 }
>>> nums
{1, 2, 3, 5, 6}
>>> nums = { 0, 1, 2, 3 } & nums
>>> nums
{1, 2, 3}
>>> nums = filter(lambda x: x > 1, nums)
>>> nums
<filter object at 0x101f465c0>
>>> list(nums)
[2, 3]
由此我们可以看到&
将加入两个集合并采用两者的logical-AND共性(也称为交集或逻辑连接)。 filter
接受一个函数(由lambda
定义)并遍历集合,从过滤函数中删除任何不返回True
的内容。
要了解lambda
的工作原理,我们也可以使用解释器:
>>> f = (lambda x: x > 1)
>>> f(0)
False
>>> f(1)
False
>>> f(2)
True
在这种情况下,我们为f
分配一个函数,一个取值并返回一个布尔值,表示它是否大于或小于1。函数式编程模式,例如filter
,在这种形式中使用函数很多:lambda是你如何定义这样一个函数,它可以以内联形式用于创建一个'匿名'函数(即,一个未赋予名称的函数。)
最后一点,因为您提供的序列不清楚:
>>> nums = { 1, 2, 3, 5, 6 }
>>> nums = { 0, 1, 2, 3 } & nums
>>> nums = filter(lambda x: x > 1, nums) # This is NOT a collection
>>> len(list(nums)) # This returns the expected result
2
>>> len(list(nums)) # !!! What happened?
0
请注意,一旦您通过调用list
函数将filter object
应用于filter
,该对象将被清空。再次对该对象调用list
将导致不返回任何内容。
答案 2 :(得分:2)
&
给出了两组的交集。也就是说,
{ 1, 2, 3, 4, 5, 6 } & { 0, 1, 2, 3 } == { 1, 2, 3 }
lambda
是一个匿名函数。它类似于代码
def func(x):
return x > 1
filter(func, nums)
filter
遍历nums并调用每个lambda
函数。如果lambda
函数返回True
,则该元素将包含在返回的集合中。
list()
将迭代转换为列表类型。
len()
返回列表中的元素数。