问题:在if语句中,Python等效于&&(逻辑与)
这是我的代码:
def front_back(a, b):
# +++your code here+++
if len(a) % 2 == 0 && len(b) % 2 == 0:
return a[:(len(a)/2)] + b[:(len(b)/2)] + a[(len(a)/2):] + b[(len(b)/2):]
else:
#todo! Not yet done. :P
return
我在IF条件中遇到错误。
我究竟做错了什么?
回答 0
您可能想要and
而不是&&
。
回答 1
Python使用and
和or
条件。
即
if foo == 'abc' and bar == 'bac' or zoo == '123':
# do something
回答 2
我在IF条件中遇到错误。我究竟做错了什么?
得到a的原因SyntaxError
是&&
Python中没有运算符。同样||
,!
并且不是有效的 Python运算符。
您可能从其他语言中了解到的某些运算符在Python中使用不同的名称。逻辑运算符&&
和||
实际上被称为and
和or
。同样,逻辑否定运算符!
称为not
。
所以你可以这样写:
if len(a) % 2 == 0 and len(b) % 2 == 0:
甚至:
if not (len(a) % 2 or len(b) % 2):
一些其他信息(可能会派上用场):
我在此表中总结了运算符“等效项”:
+------------------------------+---------------------+
| Operator (other languages) | Operator (Python) |
+==============================+=====================+
| && | and |
+------------------------------+---------------------+
| || | or |
+------------------------------+---------------------+
| ! | not |
+------------------------------+---------------------+
另请参阅Python文档:6.11。布尔运算。
除了逻辑运算符外,Python还具有按位/二进制运算符:
+--------------------+--------------------+
| Logical operator | Bitwise operator |
+====================+====================+
| and | & |
+--------------------+--------------------+
| or | | |
+--------------------+--------------------+
Python中没有按位取反(只是按位逆运算符~
-但这并不等效于not
)。
另见6.6。一元算术和按位/二进制运算和6.7。二进制算术运算。
逻辑运算符(像许多其他语言一样)具有使它们短路的优点。这意味着,如果第一个操作数已经定义了结果,则根本不会对第二个运算符求值。
为了说明这一点,我使用了一个简单地使用值的函数,将其打印并再次返回。方便查看由于print语句而实际评估的内容:
>>> def print_and_return(value):
... print(value)
... return value
>>> res = print_and_return(False) and print_and_return(True)
False
如您所见,仅执行了一个print语句,因此Python甚至没有查看正确的操作数。
对于二进制运算符,情况并非如此。那些总是评估两个操作数:
>>> res = print_and_return(False) & print_and_return(True);
False
True
但是,如果第一个操作数不够用,那么,当然会计算第二个运算符:
>>> res = print_and_return(True) and print_and_return(False);
True
False
总结一下,这是另一个表:
+-----------------+-------------------------+
| Expression | Right side evaluated? |
+=================+=========================+
| `True` and ... | Yes |
+-----------------+-------------------------+
| `False` and ... | No |
+-----------------+-------------------------+
| `True` or ... | No |
+-----------------+-------------------------+
| `False` or ... | Yes |
+-----------------+-------------------------+
在True
与False
代表什么bool(left-hand-side)
回报,他们不必是True
或False
,他们只需要返回True
或False
当bool
被要求他们(1)。
因此,在Pseudo-Code(!)中,and
and or
函数的工作方式如下:
def and(expr1, expr2):
left = evaluate(expr1)
if bool(left):
return evaluate(expr2)
else:
return left
def or(expr1, expr2):
left = evaluate(expr1)
if bool(left):
return left
else:
return evaluate(expr2)
请注意,这是伪代码,而不是Python代码。在Python中,您无法创建称为and
或的函数,or
因为这些是关键字。另外,您永远不要使用“评估”或if bool(...)
。
自定义自己的类的行为
这隐含bool
调用可用于自定义您的类的行为有and
,or
和not
。
为了说明如何进行自定义,我使用该类来再次print
跟踪正在发生的事情:
class Test(object):
def __init__(self, value):
self.value = value
def __bool__(self):
print('__bool__ called on {!r}'.format(self))
return bool(self.value)
__nonzero__ = __bool__ # Python 2 compatibility
def __repr__(self):
return "{self.__class__.__name__}({self.value})".format(self=self)
因此,让我们看看与这些运算符结合使用该类会发生什么:
>>> if Test(True) and Test(False):
... pass
__bool__ called on Test(True)
__bool__ called on Test(False)
>>> if Test(False) or Test(False):
... pass
__bool__ called on Test(False)
__bool__ called on Test(False)
>>> if not Test(True):
... pass
__bool__ called on Test(True)
如果您没有__bool__
方法,Python还将检查对象是否具有__len__
方法,以及它是否返回大于零的值。如果您创建了序列容器,可能会很有用。
另请参阅4.1。真值测试。
NumPy数组和子类
可能超出了原始问题的范围,但是如果您要处理NumPy数组或子类(如Pandas Series或DataFrames),则隐式bool
调用将引发可怕的问题ValueError
:
>>> import numpy as np
>>> arr = np.array([1,2,3])
>>> bool(arr)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> arr and arr
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> import pandas as pd
>>> s = pd.Series([1,2,3])
>>> bool(s)
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> s and s
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
在这些情况下,您可以使用NumPy中的逻辑和函数,该逻辑和函数执行逐个元素and
(或or
):
>>> np.logical_and(np.array([False,False,True,True]), np.array([True, False, True, False]))
array([False, False, True, False])
>>> np.logical_or(np.array([False,False,True,True]), np.array([True, False, True, False]))
array([ True, False, True, True])
如果您只处理布尔数组,则还可以将二进制运算符与NumPy一起使用,它们确实会执行按元素进行比较(也可以是二进制)的比较:
>>> np.array([False,False,True,True]) & np.array([True, False, True, False])
array([False, False, True, False])
>>> np.array([False,False,True,True]) | np.array([True, False, True, False])
array([ True, False, True, True])
(1)
那bool
对操作数调用必须返回True
或者False
是不完全正确的。它只是第一个需要在其__bool__
方法中返回布尔值的操作数:
class Test(object):
def __init__(self, value):
self.value = value
def __bool__(self):
return self.value
__nonzero__ = __bool__ # Python 2 compatibility
def __repr__(self):
return "{self.__class__.__name__}({self.value})".format(self=self)
>>> x = Test(10) and Test(10)
TypeError: __bool__ should return bool, returned int
>>> x1 = Test(True) and Test(10)
>>> x2 = Test(False) and Test(10)
这是因为,and
如果第一个操作数求和False
,则实际返回第一个操作数;如果求和,True
则返回第二个操作数:
>>> x1
Test(10)
>>> x2
Test(False)
同样,or
但相反:
>>> Test(True) or Test(10)
Test(True)
>>> Test(False) or Test(10)
Test(10)
但是,如果您在if
语句中使用它们,if
也会隐式调用bool
结果。因此,这些要点可能与您无关。
回答 3
两条评论:
- 在Python中使用
and
和or
进行逻辑操作。 - 使用4个空格而不是2缩进。您稍后将感谢自己,因为您的代码看起来与其他人的代码几乎相同。有关更多详细信息,请参见PEP 8。
回答 4
您可以使用and
和or
执行类似C,C ++的逻辑操作。就像字面上的and
is &&
和or
is一样||
。
看看这个有趣的例子,
假设您要使用Python构建Logic Gate:
def AND(a,b):
return (a and b) #using and operator
def OR(a,b):
return (a or b) #using or operator
现在尝试调用给他们:
print AND(False, False)
print OR(True, False)
这将输出:
False
True
希望这可以帮助!
回答 5
我提出了一个纯粹的数学解决方案:
def front_back(a, b):
return a[:(len(a)+1)//2]+b[:(len(b)+1)//2]+a[(len(a)+1)//2:]+b[(len(b)+1)//2:]
回答 6
可能这不是执行此任务的最佳代码,但是可以正常工作-
def front_back(a, b):
if len(a) % 2 == 0 and len(b) % 2 == 0:
print a[:(len(a)/2)] + b[:(len(b)/2)] + a[(len(a)/2):] + b[(len(b)/2):]
elif len(a) % 2 == 1 and len(b) % 2 == 0:
print a[:(len(a)/2)+1] + b[:(len(b)/2)] + a[(len(a)/2)+1:] + b[(len(b)/2):]
elif len(a) % 2 == 0 and len(b) % 2 == 1:
print a[:(len(a)/2)] + b[:(len(b)/2)+1] + a[(len(a)/2):] + b[(len(b)/2)+1:]
else :
print a[:(len(a)/2)+1] + b[:(len(b)/2)+1] + a[(len(a)/2)+1:] + b[(len(b)/2)+1:]
回答 7
一个&
(而不是double &&
)就足够了,或者作为最高答案建议您可以使用’and’。我也在大熊猫中发现了
cities['Is wide and has saint name'] = (cities['Population'] > 1000000)
& cities['City name'].apply(lambda name: name.startswith('San'))
如果我们将“&”替换为“ and”,则将无法使用。
回答 8
也许用&代替%可以更快并保持可读性
其他测试奇数/奇数
x是偶数?x%2 == 0
x是奇数?不是x%2 == 0
也许按位和1更清楚
x是奇数?x&1
x是偶数?不是x&1(不奇怪)
def front_back(a, b):
# +++your code here+++
if not len(a) & 1 and not len(b) & 1:
return a[:(len(a)/2)] + b[:(len(b)/2)] + a[(len(a)/2):] + b[(len(b)/2):]
else:
#todo! Not yet done. :P
return
回答 9
有条件地使用“和”。在Jupyter Notebook导入时,我经常使用此功能:
def find_local_py_scripts():
import os # does not cost if already imported
for entry in os.scandir('.'):
# find files ending with .py
if entry.is_file() and entry.name.endswith(".py") :
print("- ", entry.name)
find_local_py_scripts()
- googlenet_custom_layers.py
- GoogLeNet_Inception_v1.py