分享

请记住,Python中不要在迭代时更改列表!

 流形sbz 2023-12-03 发布于河南

检查下面的代码,看看有没有问题?目的是删除列表中的偶数。

def remove_even(numbers): for i,number in enumerate(numbers): if number%2==0: del numbers[i]numbers=[1,2,7,4,8,11]remove_even(numbers)print(numbers)

但是,输出是[1, 7, 8, 11],有什么问题吗8?输出包括 8,因为代码在迭代列表时从列表中删除元素。当循环到达索引 4(即列表中的值 8)时,会将其从列表中删除。但是,由于它在迭代时删除元素,因此不会检查其后面的值(最初位于索引 5,但删除后现在位于索引 4)。因此,循环不会检查值 11 并将提前结束,从而产生 list [1, 7, 8, 11]。为了避免此问题,最好创建一个仅包含通过条件的元素的新列表,而不是在迭代原始列表时修改原始列表。例如:

def remove_even(numbers):      return [number for number in numbers if number%2!=0]numbers=[1,2,7,4,8,11]numbers=remove_even(numbers)print(numbers)

yield:

yield是Python中的一个关键字,用于定义生成器函数。生成器是一种特殊类型的函数,可用于动态生成一系列值,而不是像常规函数那样一次性返回所有值。

当一个yield语句在生成器函数中执行,它暂时挂起函数的执行并返回由yield关键词。该函数并未终止,而是处于挂起状态,稍后可以从中断处恢复。

每次调用生成器函数时,它都会从上次调用时停止的位置恢复执行,并继续执行,直到到达下一条yield语句,此时它会暂停执行并返回序列中的下一个值。 以下是使用从列表中删除偶数的示例:

def remove_even(numbers): for i,number in enumerate(numbers): if number%2==0: yield numbernumbers=[1,2,7,4,8,11]numbers=list(remove_even(numbers))print(numbers)

在此代码中,remove_even是一个生成器函数,它从输入列表 中生成每个奇数numberslist()然后使用构造函数将 back 返回的生成器对象转换为remove_even列表。

请记住,不要在迭代时更改列表!

请记住,Python中不要在迭代时更改列表!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多