Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:是否保证生成元组的语句的执行顺序?多语句lambda_Python_Python 3.x_Lambda_Tuples - Fatal编程技术网

Python:是否保证生成元组的语句的执行顺序?多语句lambda

Python:是否保证生成元组的语句的执行顺序?多语句lambda,python,python-3.x,lambda,tuples,Python,Python 3.x,Lambda,Tuples,我想知道类似于下面所示代码的代码在Python中是否合法,是否可以安全使用: # Example usage of a lambda which executes a statement and returns the changed operand skip_first = lambda iterator: (next(iterator), iterator)[1] 使用这样的构造并期望lambda的返回值是从原始迭代器的第二个元素开始的迭代器(如果没有抛出execption)安全吗 或者f

我想知道类似于下面所示代码的代码在Python中是否合法,是否可以安全使用:

# Example usage of a lambda which executes a statement and returns the changed operand
skip_first = lambda iterator: (next(iterator), iterator)[1]
使用这样的构造并期望lambda的返回值是从原始迭代器的第二个元素开始的迭代器(如果没有抛出execption)安全吗

或者f.i.Cython出于某种原因优化调用
next
是否合法(例如,由于元组中的执行顺序未定义,它会丢弃结果值,并且它可以确定我们以任何方式丢弃第一个值?)

  • 用法示例:
  • 锁紧螺栓示例:

  • 是的,表达式列表中的表达式保证从左到右求值。从:

    除非显示列表或集合的一部分,否则至少包含一个逗号的表达式列表将生成元组。元组的长度是列表中表达式的数量表达式从左到右求值。


    在您的特定示例中,无法优化对
    next
    的调用,因为它可能(并且确实)有副作用(即,它修改迭代器的内部状态)。只有在没有可变值的语言中,才能消除返回值未被使用的函数调用。如果一个函数可以改变一个值,你必须假设它会改变,并允许调用发生。否则,您将更改编写的代码的语义。

    是的,表达式列表中的表达式保证从左到右求值。从:

    除非显示列表或集合的一部分,否则至少包含一个逗号的表达式列表将生成元组。元组的长度是列表中表达式的数量表达式从左到右求值。


    在您的特定示例中,无法优化对
    next
    的调用,因为它可能(并且确实)有副作用(即,它修改迭代器的内部状态)。只有在没有可变值的语言中,才能消除返回值未被使用的函数调用。如果一个函数可以改变一个值,你必须假设它会改变,并允许调用发生。否则,您将更改编写的代码的语义。

    注意Cython不是Python。Python关于求值顺序的任何说法都不必对Cython具有权威性。@Mistermiagi,你实际上是指CPython还是指CPython(即参考实现)?我想告诉你的(和OP)是“Cython”这不是你从www.python.org上得到的东西的“编译器”的实际名称。鉴于godbolt的链接显示了python字节码,我认为我们可以假设CPython(其中字节码是一个实现细节)。是的,这是有保证的。但是请不要这样写代码。对于初学者,不要将lambda表达式的结果指定给名称。如果要这样做,最好只使用常规函数定义,因为命名匿名函数会破坏整个目的。然后,您可以自由地使用完整的语句,而不仅仅是简单的表达式,并且您可以用更合理、更惯用的方式来编写,注意Cython不是Python。Python关于求值顺序的任何说法都不必对Cython具有权威性。@Mistermiagi,你实际上是指CPython还是指CPython(即参考实现)?我想告诉你的(和OP)是“Cython”这不是你从www.python.org上得到的东西的“编译器”的实际名称。鉴于godbolt的链接显示了python字节码,我认为我们可以假设CPython(其中字节码是一个实现细节)。是的,这是有保证的。但是请不要这样写代码。对于初学者,不要将lambda表达式的结果指定给名称。如果要这样做,最好只使用常规函数定义,因为命名匿名函数会破坏整个目的。然后你可以自由地使用完整的语句,而不仅仅是简单的表达式,你可以用一种更合理、更习惯的方式来写
    f = iter([0, 1, 2, 3, 4])
    print(list(skip_first(f)))
    
    expression_list    ::=  expression ("," expression)* [","]
    starred_list       ::=  starred_item ("," starred_item)* [","]
    starred_expression ::=  expression | (starred_item ",")* [starred_item]
    starred_item       ::=  assignment_expression | "*" or_expr