gpt4 book ai didi

python - Python 文档中的条件表达式

转载 作者:太空宇宙 更新时间:2023-11-03 14:14:17 25 4
gpt4 key购买 nike

如果我理解正确的话,在Python3中,条件表达式的形式是“x if C else y”。例如,如果我理解正确的话,下面的 block 是一个条件表达式,它返回字符串“a”

'a' if 0<1 else 'b'

而下面的 block 是返回“b”的条件表达式

'a' if 0>1 else 'b'

在Python语言中引用grammar rule for conditional expressions由这些行给出:

conditional_expression ::=  or_test ["if" or_test "else" expression]   

我不理解这条规则,因为例如上面的例子会说 'a'0>1 是从 or_test< 派生的 并且 'b' 是从 表达式 派生的,而对我来说 'a''b' > 应该由相同的规则导出(此处为 expr)。对我来说唯一有意义的是将第一个语法规则替换为

conditional_expression ::=  expression \["if" or_test "else" expression\]

我在这里缺少什么?

最佳答案

简而言之:因为这会带来歧义。

I don't understand this rule because for instance it would say with my above example that 'a' and 0>1 were derived from or_test and that 'b' was derived from expression, whereas for me 'a' and 'b' should both be derived by the same rule (expr here).

好吧,or_testexpr 都可以生成字符串文字。事实上,如果我们向下移动语法,我们会看到:

<b>or_test</b>  ::=  <b>and_test</b> | or_test "or" and_test
<b>and_test</b> ::= <b>not_test</b> | and_test "and" not_test
<b>not_test</b> ::= <b>comparison</b> | "not" not_test
<b>comparison</b> ::= <b>or_expr ( comp_operator or_expr )*</b>
<b>or_expr</b> ::= <b>xor_expr</b> | or_expr "|" xor_expr
<b>xor_expr</b> ::= <b>and_expr</b> | xor_expr "^" and_expr
<b>and_expr</b> ::= <b>shift_expr</b> | and_expr "&" shift_expr
<b>shift_expr</b> ::= <b>a_expr</b> | shift_expr ( ">" ) a_expr
<b>a_expr</b> ::= <b>m_expr</b> | a_expr "+" m_expr | a_expr "-" m_expr
<b>m_expr</b> ::= <b>u_expr</b> | m_expr "*" u_expr | m_expr "//" u_expr | m_expr "/" u_expr
| m_expr "%" u_expr
<b>u_expr</b> ::= <b>power</b> | "-" u_expr | "+" u_expr | "~" u_expr
<b>power</b> ::= <b>primary ["**" u_expr]</b>
<b>primary</b> ::= <b>atom</b> | attributeref | subscription | slicing | call
<b>atom</b> ::= identifier | <b>literal</b> | enclosure
<b>literal</b> ::= <b>stringliteral</b> | bytesliteral
| integer | floatnumber | imagnumber

因此最终 or_test 可以生成字符串文字。您可以将 or_test 视为表达式,但某些事情不再可能(除非我们使用括号)。

我们不能用 or_test 做的两件事是构造一个 if-then-else再次;并构造一个 lambda 表达式。是的,我们可以将第一项设为 lambda 表达式,以及一个新的 if-then-else,但不能不使用括号。

为什么我们有这个必要?那么语法应该是明确的。这意味着如果我们从某个表达式构建语法树,那么应该只有一个这样的树。

如果我们也允许使用表达式作为第一项,我们可以编写如下表达式:

'a' if a else 'b' if c else 'c'

现在我们可以用Python编写它,因为Python可以派生出'a'属于or_testa 到第二个 or_test'b' if c else 'c'表达式。如果前者是一个表达式,我们还可以将 'a' if a else 'b' 匹配为表达式(根据 Python 标准,这是错误的)。

这同样适用于使用 lambda 表达式。如果我们写:

lambda a, b: 'a' if a else 'b' if c else 'c'

然后 Python 会将其解析为:

lambda a, b: ('a' if a else 'b' if c else 'c')

但是如果我们在第一个 or_test 中启用 lambda 表达式,那么 Python 也可以将其解析为:

(lambda a, b: 'a') if a else 'b' if c else 'c'

这本身并没有错,但 Python 的设计者选择了前一种解释而不是后者。重要的是只能有一个解释,否则两个人可能会使用不同的解释器运行同一个 Python 程序,并获得不同的结果。

关于python - Python 文档中的条件表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48305006/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com