我正在尝试学习python,并且遇到了一些既好又短的代码,但并不完全有意义
背景是:
def fn(*args):
return len(args) and max(args)-min(args)
Run Code Online (Sandbox Code Playgroud)
我得到它正在做的事情,但为什么python这样做 - 即返回值而不是True/False?
10 and 7-2
Run Code Online (Sandbox Code Playgroud)
返回5.同样,更改和将导致或将导致功能更改.所以
10 or 7 - 2
Run Code Online (Sandbox Code Playgroud)
会回来10.
这是合法/可靠的风格,还是有任何问题?
我试图从别人的项目中理解这段代码.如果您想要上下文,请访问:https://github.com/newsapps/beeswithmachineguns/blob/master/beeswithmachineguns/bees.py#L501
IS_PY2只是一个布尔变量,True如果Python主要版本是2.我知道非空字符串是True,但由于某种原因我不理解openmode被指定'w'或者'wt'而不是True或False.
openmode = IS_PY2 and 'w' or 'wt'
openkwargs = IS_PY2 and {} or {'encoding': 'utf-8', 'newline': ''}
Run Code Online (Sandbox Code Playgroud)
有人能解释一下结果吗?
所以,我正在玩翻译,并输入以下内容:
In [95]: 1 and 2
Out[95]: 2
In [96]: 1 and 5
Out[96]: 5
In [97]: 234324 and 2
Out[97]: 2
In [98]: 234324 and 22343243242
Out[98]: 22343243242L
In [99]: 1 or 2 and 9
Out[99]: 1
Run Code Online (Sandbox Code Playgroud)
最初我认为它与False和True值有关,因为:
In [101]: True + True
Out[101]: 2
In [102]: True * 5
Out[102]: 5
Run Code Online (Sandbox Code Playgroud)
但这似乎并不相关,因为False总是为0,而且从上面的试验来看,它似乎不是输出的最大值.
我不能在这里诚实地看到这种模式,并且在文档中找不到任何东西(老实说,我真的不知道如何有效地寻找它).
那么,怎么做
int(x) [logical operation] int(y)
Run Code Online (Sandbox Code Playgroud)
在Python工作?
我试图在这样的函数中返回一个布尔值:
return mylist and any(condition(x) for x in mylist)
Run Code Online (Sandbox Code Playgroud)
True如果列表为空或者其中的任何元素满足条件,则应该返回行为.我使用第一个操作数作为短路,因为如果列表为空则any返回True,这不是我所追求的.
我希望[] and boolval返回False,因为该列表是空的,但让我吃惊,它返回[]是否boolval是True或False.我希望第一个操作数被自动计算为布尔值,因为它涉及比较操作,而不是发生的任何事情.
我并不是真的在问如何解决我的问题,这可以通过显式类型转换轻松完成:bool(mylist)而是询问发生了什么以及为什么.
编辑:当我问"为什么"这种情况发生时,我不仅仅在寻找"事实",因为它们已经在链接的重复问题中进行了解释,而且还有实施此行为背后的原因.
在Python中,如果我写的话
z = 1 and 2
print z
Run Code Online (Sandbox Code Playgroud)
然后它产生"2".
但如果我写
z = 0 and 2
print z
Run Code Online (Sandbox Code Playgroud)
现在,它产生"0".
它在现实生活中的问题可能并不重要,但我试图理解这里的逻辑.
我正在维护一个庞大的代码库,我在我的python代码中找到了类似这样的东西:
...
foo = bar(a, b, c) and foo
return foo
...
Run Code Online (Sandbox Code Playgroud)
其中foo被赋予一个布尔值,并在这里第一次被声明.这是什么意思/这个目的是什么/这里发生了什么?
它背后有什么逻辑吗?
>>>'a' and 'b' and 'c'
'c'
>>>'a' or 'b' or 'c'
'a'
Run Code Online (Sandbox Code Playgroud)