【问题标题】:using any() in return with for loop [duplicate]在 for 循环中使用 any() [重复]
【发布时间】:2020-07-18 15:03:42
【问题描述】:

我遇到过这样的 any() 用法:

return any(node.state == state for node in self.frontier)

当我检查时,如果可迭代的任何元素为 True,则 any() 返回 True。所以我认为如果 any() 检查可迭代的任何元素,我们为什么要使用 for 循环?它已经检查了其中的每个元素..

我不理解这种语法的另一件事是它在 for 循环中的作用是什么?它在行尾,后面什么都没有..

【问题讨论】:

  • 尝试打印:[node.state == state for node in self.frontier] 以了解发生了什么。
  • return any(self.frontier) 不会检查每个 state 的属性 node 这就是为什么你需要明确,
  • 这是一个生成器语法,也看一下 list comprehensio

标签: python return return-value


【解决方案1】:

首先,内置函数any(iterable)的作用大致相同:

def any(iterable):
    for item in iterable:
        if item:
            return True
    return False

关于您的特定情况,您实际上有一个可迭代的节点,因此您不能直接使用any(self.frontier)。您真正需要的是一种将原始可迭代对象转换为另一个可迭代对象的方法,其中每个元素都与给定状态进行比较。 Python 为这种类型的转换提供了一种紧凑的语法,称为生成器表达式。因此,node.state == state for node in self.frontier 只是将初始节点迭代(即self.frontier)转换为布尔迭代的简单方法。

【讨论】:

    【解决方案2】:

    在以下示例中,您可能会看到不同之处:

    from collections import namedtuple
    Node = namedtuple('Node', ['state'])
    
    state = 2
    frontier = [Node(1), Node(1)]
    
    print("Any frontier:", any(frontier))
    print("Any state:", any(node.state == state for node in frontier))
    

    输出是:

    Any frontier: True
    Any state: False
    

    来自any 文档:Return True if any element of the iterable is true.

    在第一种情况下,iterable 是 frontier,而 iterable 中的元素是 frontier 数组中的元素。

    在第二种情况下,iterable 是 node.state 和 state 之间的比较列表,并且 element 是该比较的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 2020-04-05
      • 2019-01-06
      • 2020-10-18
      • 1970-01-01
      相关资源
      最近更新 更多