【问题标题】:Declaring variable in one line for loop in Python [duplicate]在Python中的一行for循环中声明变量[重复]
【发布时间】:2016-05-18 11:14:55
【问题描述】:

我有一个像这样的for循环的函数

def my_func():
    order = [1,2,3,4,5,6,7]
    my_list = []
    for o in order:
        tmp = is_odd(o)
        if tmp:
            my_list.append(tmp)
    return my_list

def is_odd(n):
    if n%2 != 0:
        return n
    else:
        return False

我想把它转换成一行 python for 循环。我是这样做的

def my_func():
    order = [1,2,3,4,5,6,7]
    my_list = [is_odd(o) for o in order if is_odd(o)]
    return my_list

def is_odd(n):
    if n%2 != 0:
        return n
    else:
        return False

这段代码的问题是它在每次循环迭代中调用is_odd 函数两次。有没有其他方法可以将循环转换为一行循环并且只调用一次is_odd 函数?

(这不是原始代码。只是一个例子)

【问题讨论】:

  • 如果你只使用 is_odd ,让它只返回 True 或 False,如果不只是创建一个新函数来执行它。你知道你可以做到[o for o in order if is_odd(o) ]吗?
  • 它不仅返回 false 或 true。如果找到它,它将返回一个数组中的对象,如[object]。否则返回None。正如我所提到的,这不是我的原始代码。这只是一个例子。
  • 所以你展示的代码与你的完全不同,并期望得到好的答案,...好吧。
  • 和我的代码没有区别。我在我的代码中展示了我想将is_odd 函数返回的值用于if 条件以及我的列表中。

标签: python for-loop


【解决方案1】:

如问题答案中所述,我已将其作为重复链接到您的问题:

您将创建一个生成器(或列表)来生成函数调用的(中间)结果,并基于此生成过滤后的输出:

例子:

def my_func():
    order = [1,2,3,4,5,6,7]
    intermediate_results = (is_odd(o) for o in order)
    # alternatively filter using `filter(None, intermediate_results)`
    return [i for i in intermediate_results if i]

【讨论】:

  • 你能告诉我如何在itertools.ifilter(None, itertools.imap(foo, range(10))) 中为foo 函数提供参数,就我而言,它需要2 个参数。此解决方案来自您提到的链接。
  • @MHassan 这取决于。它是一个常数吗?输入列表中的每个项目的值是否不同?毕竟这似乎是一个不同的问题。尝试找出如何将其他参数传递给map() 函数的函数参数。如果您自己找不到,请考虑发布一个新问题。
  • 感谢帮助。我像你一样使用intermediate_result,它可以工作。
  • @MHassan 看看这个:stackoverflow.com/q/10834960/1025391
【解决方案2】:

在这种情况下,您可以使用filter function. 例如。 my_list = filter(is_odd, order).

如果你有类似需求,请看itertools module.

【讨论】:

  • 这不起作用,因为 OP 需要传递函数的真实返回值,而不是函数返回真实值的项目。 (这个建议实现了后者。)
【解决方案3】:

嗨——看起来你为o的实例返回了函数is_odd(o)(因此再次运行它),其中函数is_odd(o)返回true。以下应该只运行一次:

def my_func():
    order = [1,2,3,4,5,6,7]
    my_list = [o for o in order if is_odd(o)]
    return my_list

【讨论】:

  • 列表推导等效于内置的filter(),因此我建议使用它。
  • 正如我在问题中提到的,它不是原始代码。如果is_odd(o) 不为假,我想将is_odd(o) 函数返回的值附加到我的列表中,否则不要附加任何东西。
  • 同意——简短而甜蜜,filter() 是最优雅的解决方案。虽然我想解释为什么函数运行两次以及如何防止这种情况。
  • @MHassan,如果您将以上所有答案调整为您的不同代码,所有这些答案都可以实现。您还可以使用参数定义函数:def my_func(arg): ...,然后运行 ​​my_func([1, 2, 3, 4, 5, 6, 7])my_func(my_list)
  • 这不起作用,因为 OP 需要传递函数的真实返回值,而不是函数返回真实值的项目。 (这个建议实现了后者。)
猜你喜欢
  • 2021-08-29
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
相关资源
最近更新 更多