【问题标题】:For & while loop condition comparaisonfor&while循环条件比较
【发布时间】:2014-02-11 17:34:42
【问题描述】:

如果我在 PHP 中写了 for 循环

foreach($vertex['neighbours'] as $n_vertex)

是不是类似于下面Python中的for循环

for n_vertex in vertex['neighbors']:

在我使用 PHP 中的 While 循环时也是如此

while(!empty($my_queue))

是不是类似于下面Python中的while循环

while my_queue:

如果不是,那么在 Python 中的 for 和 while 循环在 PHP 中的正确版本是什么。

【问题讨论】:

  • 两个例子都是正确的。对于后者,假设my_queue 是一个列表,只要my_queue 不为空,它将评估为True

标签: php python loops for-loop while-loop


【解决方案1】:

是的,这些是相似的。

它们并不完全相同,但在大多数代码中差异并不重要。*

直接使用my_queue 作为测试,而不是empty 方法/函数,是Pythonic 的方法,正如PEP 8 中所推荐的那样:

对于序列(字符串、列表、元组),使用空序列为假这一事实。

所以,你做的一切都是正确的。

当然,在某些情况下,使用 list comprehension 或生成器表达式(在 PHP 中没有直接的类比)可能比 for 语句更简洁或更易读,但您永远不需要使用它们。


* 首先,Python 的for 循环从源代码创建一个iterator,然后一遍又一遍地调用next(it),直到引发StopIteration,这与PHP 中的幕后发生的情况完全不同。除非您使用非常奇怪的类型,或者尝试在迭代期间改变您正在迭代的对象,否则您永远不会注意到差异。其次,在 Python 中,与 PHP 不同,my_queue 理论上可以是可迭代的,但不是序列,如迭代器——在这种情况下,while my_queue: 将不起作用。但是,对于您命名为 my_queue 的东西来说,这不太可能。

【讨论】:

    【解决方案2】:

    你的两个 for 循环都很好。它们是相同/相似的。但是 while 循环彼此不同:

    while(!empty($my_queue))
    

    正在检查列表是否为空并通过它。另一方面,

    while my_queue:
    
    如果 my_queue 不是布尔值,

    将不起作用。希望对您有所帮助。

    【讨论】:

    • 错了。如果my_queue 是一个序列,那么while my_queue: 只要不为空就会为真。更一般地说,一个 Python while/if/等。 condition 可以采用任何可转换为布尔值的值(使用 C++ 术语,因为没有真正的 Python 术语……),包括所有内置/stdlib 序列和所有提供 __len__/implement collections.abc.Sized 的第三方序列.
    • 我假设 my_queue 是一个列表。我也从这个意义上比较了他们两个!
    • 如果 my_queue 是一个列表,如您所料,那么 OP 的代码 工作,因为列表是序列,因此只要它们不是空,所以你的答案是错误的。
    • 它将创建一个无限循环。转到终端,请运行 3 行 python 代码。
    • 没有任何内容的裸循环将在 PHP 和 Python(以及 C 和任何其他具有while 循环的语言)中创建无限循环。如果您添加代码,例如,每次从队列中弹出一个元素,那么它将完全按照您在 PHP 和 Python(以及 C 和……)中的要求执行操作。没有区别。您似乎认为empty 会以某种方式改变列表,但事实并非如此。也许你在想eachnext
    猜你喜欢
    • 1970-01-01
    • 2015-06-25
    • 2014-12-12
    • 2012-10-20
    • 2017-11-29
    • 2016-04-15
    • 2013-06-28
    • 2015-05-19
    • 2012-01-07
    相关资源
    最近更新 更多