我编写了以下代码,结果为library(stringr)
strings <- c("TwoWords", "ThreeWordsTogether", "Three Words Apart",
"FourWordsTogetherHere", "MiDdleCaps")
strings %>%
str_replace_all("([a-z])([A-Z])", "\\1 \\2")
#> [1] "Two Words" "Three Words Together"
#> [3] "Three Words Apart" "Four Words Together Here"
#> [5] "Mi Ddle Caps"
:
SyntaxError: invalid syntax
我认为它会与此代码做同样的事情:
self.vec.append(v1) if v1 else pass
只是想知道为什么python在支持时不支持此语法:
if v1:
self.vec.append(v1)
答案 0 :(得分:5)
append
返回None
中的NoneType
。
>>> type([].append(420))
<class 'NoneType'>
pass
仅用于流控制(NOOP),没有类型。
>>> type(pass)
Syntax Error
三元声明要求:
object = object if BoolExpr else object
pass
不是object
!
答案 1 :(得分:2)
这里真正的问题是您不应该编写其中任何一个。 1
self.vec.append(v1) if v1 else pass
是非法的,因为pass
是一个语句,而不是表达式,并且您不能将语句放在表达式中。
self.vec.append(v1) if v1 else 0
是合法的,因为0
是一个表达式。
但是仅仅因为它是合法的并不意味着它是您应该编写的代码。
if
表达式的要点是它是一个表达式,因此(a)具有可以使用的值,而(b)可以用于较大的表达式。
您没有使用self.vec.append(v1)
的值(即None
)或0
的值(当然是0
)。您只是在评估第一个的副作用,而第二个是与该语言的语法作斗争的解决方法。
您也不要将表达式放在另一个表达式中;您只是将其用作表达式语句。
这种写法很简单:
if v1:
self.vec.append(v1)
else:
pass
但是当然您在这里不需要else
子句,因此您可以将其写为:
if v1:
self.vec.append(v1)
或者,如果您想节省空间:
if v1: self.vec.append(v1)
有时候,为了提高性能甚至有时为了简洁起见,有必要牺牲可读性。但是您滥用if
表达式的副作用的尝试会较慢(特别是在错误的情况下-跳转并评估文字以丢弃它可能会很快,但它的速度几乎不如什么都不做)。而且更长。
1。实际上,人们担心即使没有绝对理由也要尝试编写这样的代码,这是反对PEP 308(添加此功能的提议)的主要论据。 PEP之所以通过,是因为任何人只要傻到尝试写这样的代码,无论如何都会写Perl而不是Python。
答案 2 :(得分:1)
这里要直截了当的一件重要事情是,您的第一行代码是表达式,第二行代码段是语句。表达式必须计算为值,而语句只是没有值的命令。