【问题标题】:Convert comprehensive list to an if, else statement将综合列表转换为 if、else 语句
【发布时间】:2022-10-06 06:54:29
【问题描述】:

我对 Python 比较陌生。我尝试做的是将这个综合列表转换为普通的 if, else 语句。

def draw(self):
    self.value = choice(green_chars)
    self.y = self.y + self.speed if self.y < 1080 else -40 * randrange(1, 5)
    screen.blit(self.value, (self.x, self.y))

到目前为止,我已经尝试过:

    self.value = choice(green_chars)
    if self.y < 1080:
        self.y = self.y + self.speed 
    else:
        -40 * randrange(1, 5)

    screen.blit(self.value, (self.x, self.y))

但它不起作用。

  • 您忘记在 else 语句中分配值
  • 您还需要在 else 子句中分配 self.y 。
  • “综合列表”是指条件表达式吗?
  • 旁注:这里不涉及lists。 Python中没有“综合列表”这样的术语(我觉得你的意思是“列表理解”)。原始代码包含一个条件表达式(有时称为“三元运算符”,采用value_on_true if conditional else value on false 的形式),您将其转换为带有附加else 语句的普通if 语句,但条件表达式与列表推导无关(您可以串联使用它们,但结果通常很丑陋)。
  • @chepner:我怀疑他们的意思是“列表理解”,认为任何以 if 作为表达式而不是语句的一部分的东西都是一个 listcomp,不理解条件表达式完全是另外一回事(恰好包括 @ 987654328@ 在语句级别也是如此)。

标签: python python-3.x


【解决方案1】:

您可能忘记分配值:

self.value = choice(green_chars)
if self.y < 1080:
    self.y = self.y + self.speed 
else:
    self.y = -40 * randrange(1, 5) # Here

screen.blit(self.value, (self.x, self.y))

【讨论】:

  • 旁注:只要他们将其拆分并需要更多重复,他们不妨让第一个块做self.y += self.speed以避免重复self.y两次;在这里它并不重要,但是当被更改的值嵌套更深或名称更长时,如果您不必要地重复名称,它可能会使代码更慢和/或更难阅读。
【解决方案2】:

Python 中的conditional expression 与其他语言类似

variable = expr1 if truth-expr else expr2

如果truth-expr 表达式为真,这里variable 将被分配给expr1 表达式,否则expr2

在正常形式下,

if truth-expr:
    variable = expr1
else:
    variable = expr2

【讨论】:

  • 两件事:1)它被称为 Python 中的条件表达式,而不是三元运算符(三元运算符不太精确和不准确;它不是运算符,三元适用于任何具有三个操作数的东西,而不仅仅是条件),以及 2 ) 据我所知,没有其他语言使用 Python 的运算符形式(大多数类似 C 的语言使用 condition ? on_true : on_falseon_true if condition else on_false 的 Python 形式是特定于 Python 的),所以说它是“与其他语言相同”是误导.
  • @ShadowRanger 1)感谢您指出。我正在阅读手册,其中也提到了sometimes called a “ternary operator”。但我同意ifelse 不是运营商。我改变了答案的措辞。 2)更改“相同”->“相似”。
【解决方案3】:
def draw(self):
    value = random.choice(chars)
    if self.y < 1080:
        self.y = self.y + 30
    else:
        self.y = -40 * random.randrange(1, 5)
    screen.blit(value, (self.x, self.y))

这样可行。感谢您的反馈。

【讨论】:

    猜你喜欢
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    相关资源
    最近更新 更多