我在codecademy项目中的指示是
定义一个名为purify的函数,它接受一个数字列表,删除列表中的所有奇数,然后返回结果。例如,purify([1,2,3])应该返回[2]。不要直接修改您输入的列表;相反,返回一个只包含偶数的新列表。
我提出的代码是:
def purify(numbers):
pure = numbers
for num in pure:
if num % 2 != 0:
pure = pure.remove(num)
return pure
错误是:
哎呀,再试一次。您的函数在[1]上崩溃,因为您的函数会抛出一个"' NoneType'对象不可迭代"错误。
当我理解它时,这意味着我的代码中的某些内容将被返回为"无"。或者那里没有数据。我似乎无法找到这个简短的代码有什么问题,除非它在我的if语句中。提前谢谢。
所以我在代码中进行了编辑以删除" pure = pure.remove(num)"这解决了没有问题。但是,在运行代码时,它仍然无法输入[4,5,5,4]并返回[4,5,4]。
新守则:
def purify(numbers):
pure = numbers
for num in pure:
if num % 2 != 0:
pure.remove(num)
return pure
答案 0 :(得分:6)
第一个问题是您在迭代时更改列表。 DO NOT change lists while you are iterating over them.您将错过循环中的某些值。
第二个问题是list.remove
就地行动并返回无。因此,当您执行pure = pure.remove(num)
时,将pure
设置为None
,这不再是可迭代的,而这又是导致错误的原因。相反,您可以按如下方式过滤列表
def purify(numbers):
return [num for num in numbers if num % 2 == 0]
答案 1 :(得分:2)
那个错误意味着python正在尝试迭代None
对象。
代码中唯一的迭代就是for
循环,因此pure
必须是None
。
另外,不要忘记正确缩进:
def purify(numbers):
pure = numbers
for num in pure:
if num % 2 != 0:
pure = pure.remove(num)
return pure
如果将None
设置为numbers
,或者从pure.remove(num)
分配时,则将其定义为None
。当您查找remove(num)文档时,您会看到它运行就地,因此它不会返回任何有用的内容(通常为pure =
)。您要执行的操作会删除for
循环中的{{1}}部分。你可能会注意到你最终跳过循环中的元素,但这会对这段代码产生一个单独的问题(修改你正在迭代的东西)。
答案 2 :(得分:0)
我不知道pure
的类型是什么,但它似乎是一个可变对象。 pure.remove
更新了pure
,因此会返回None
。您不应将其设置为pure
。此外,您不应修改在迭代过程中迭代的对象。
编辑:我在此处放置的上一段代码不正确,如评论中所述。我建议你选择其他答案中提到的方法之一。如果您真的对维护当前解决方案的一般结构感兴趣,可以使用copy模块进行解决方法:
import copy
def purify(numbers):
pure = copy.copy(numbers) # a shallow copy
for num in numbers:
if num % 2 != 0:
pure.remove(num)
return pure
请注意,numbers
的类应该实现__copy__
方法才能生效。您在上面的评论中提到numbers
是list
,因此内置实现适合您。但是,对于list
,您只需执行以下操作:
pure = numbers[:]
答案 3 :(得分:-2)
def purify(numbers):
sequence = [] //starting with a an empty
for f in sequence:
if f%2 -1: //filtering out odd numbers,alternative to f%2 ==0
sequence.append(f) //append each even number to the empty list
return sequence
N / B:从空列表开始确保列表未被修改