我想检查变量是否存在.现在我正在做这样的事情:
try:
myVar
except NameError:
# Do something.
Run Code Online (Sandbox Code Playgroud)
还有其他方法没有例外吗?
在C#中,我可以说x ?? "",如果x不为null,它将给出x,如果x为null,则为空字符串.我发现它对于使用数据库很有用.
如果Python在变量中找到None,有没有办法返回默认值?
将值赋给像这样的变量是否被认为是不好的风格?
x = "foobar" or None
y = some_variable or None
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,x得到值'foobar'.
有一个带有可选参数的函数.
def alpha(p1="foo", p2="bar"):
print('{0},{1}'.format(p1, p2))
Run Code Online (Sandbox Code Playgroud)
让我迭代一下当我们以不同方式使用该函数时会发生什么:
>>> alpha()
foo,bar
>>> alpha("FOO")
FOO,bar
>>> alpha(p2="BAR")
foo,BAR
>>> alpha(p1="FOO", p2=None)
FOO,None
Run Code Online (Sandbox Code Playgroud)
现在考虑我想要调用它的情况,alpha("FOO", myp2)并且myp2将包含要传递的值,或者是None.但即使该函数处理p2=None,我希望它使用其默认值"bar".
也许这令人困惑,所以让我改写一下:
如果
myp2 is None,打电话alpha("FOO").不用了,打电话alpha("FOO", myp2).
区别是相关的,因为alpha("FOO", None)结果不同alpha("FOO").
我如何简洁(但可读)做出这种区分?
一种可能性通常是在内部检查无alpha,这将被鼓励,因为这将使代码更安全.但是假设alpha它实际上应该在其他地方使用,None就像它一样.
我想在来电方面处理这个问题.
一种可能性是区分案例:
if myp2 is None:
alpha("FOO")
else:
alpha("FOO", myp2)
Run Code Online (Sandbox Code Playgroud)
但是,当有多个这样的论点时,这很快就会成为很多代码.(指数,2 ^ n)
另一种可能性是简单地做alpha("FOO", myp2 or "bar"),但这需要我们知道默认值.通常,我可能会采用这种方法,但我可能稍后更改默认值, …
有没有办法只在分配的值不是 None 时才进行分配,否则什么都不做?
我们当然可以这样做:
x = get_value() if get_value() is not None
Run Code Online (Sandbox Code Playgroud)
但这将读取该值两次。我们可以将它缓存到一个局部变量中:
v = get_value()
x = v if v is not None
Run Code Online (Sandbox Code Playgroud)
但现在我们为一件简单的事情做了两个陈述。
我们可以写一个函数:
def return_if_not_none(v, default):
if v is not None:
return v
else:
return default
Run Code Online (Sandbox Code Playgroud)
然后做x = return_if_not_none(get_value(), x)。但是肯定已经有一个 Python 习惯用法可以实现这一点,无需访问x或get_value()两次,也无需创建变量?
换句话说,假设=??是一个类似于C# null 合并运算符的 Python 运算符。与 C# 不同??=,我们虚构的运算符检查右侧是否为None:
x = 1
y = 2
z = None
x =?? y …Run Code Online (Sandbox Code Playgroud) 许多语言的三元运算符都是这样的:
x = f() ? f() : g()
Run Code Online (Sandbox Code Playgroud)
其中if f()为truthy则x赋值为f(),否则赋值为g().但是,某些语言有一个更简洁的elvis运算符,它在功能上是等价的:
x = f() ?: g()
Run Code Online (Sandbox Code Playgroud)
在python中,三元运算符表达如下:
x = f() if f() else g()
Run Code Online (Sandbox Code Playgroud)
但是python有更简洁的elvis操作符吗?
也许是这样的:
x = f() else g() # Not actually valid python
Run Code Online (Sandbox Code Playgroud) 例如,在C#中(从v6开始)我可以说:
mass = (vehicle?.Mass / 10) ?? 150;
Run Code Online (Sandbox Code Playgroud)
如果有车辆,则将质量设置为车辆质量的十分之一;如果车辆为空,则设置为150(或者如果Mass属性为可空类型,则为零质量).
我可以在我的C#应用程序的脚本中使用Python(特别是IronPython)中的等效构造吗?
这对于显示可以被其他值修改的值的默认值特别有用 - 例如,我可能在我的星舰的脚本中定义了一个装甲组件,它总是消耗其安装的船上可用空间的10%,它的其他属性也可以缩放,但我想显示装甲大小,生命值,成本等的默认值,这样你就可以将它与其他船舶组件进行比较.否则,我可能不得不写一个复杂的表达式进行空检查或两次,就像我在V6之前在C#中所做的那样.
Python中是否有一个空传播运算符(“空感知成员访问”运算符),所以我可以写一些类似的东西
var = object?.children?.grandchildren?.property
Run Code Online (Sandbox Code Playgroud)
就像在 C#、VB.NET 和 TypeScript 中一样,而不是
var = None if not myobject\
or not myobject.children\
or not myobject.children.grandchildren\
else myobject.children.grandchildren.property
Run Code Online (Sandbox Code Playgroud) python null-coalescing-operator null-coalescing method-chaining
我看到这个问题,但它使用?? 运算符作为空检查,我想将它用作bool true/false测试.
我在Python中有这个代码:
if self.trait == self.spouse.trait:
trait = self.trait
else:
trait = defualtTrait
Run Code Online (Sandbox Code Playgroud)
在C#中我可以这样写:
trait = this.trait == this.spouse.trait ? this.trait : defualtTrait;
Run Code Online (Sandbox Code Playgroud)
在Python中有类似的方法吗?
我如何从 SQL 中重新创建 COALESCE() 方法,但在 python 中?
在Python中,是否有一种很好的方法来添加/求和(或以其他方式组合)两个长度不均匀的列表?
例如给出一些列表:
a = [1,2,3]
b = [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)
产品清单c:
c = [2,4,6,4]
Run Code Online (Sandbox Code Playgroud)
其中每个元素是的总和a和b,取了缺少的元素为零?
python ×11
python-3.x ×2
add ×1
coding-style ×1
exception ×1
ironpython ×1
list ×1
operators ×1
ruby ×1
ruby-2.3 ×1
sql ×1
sum ×1
syntax ×1
tuples ×1
variables ×1