Python 中的 True 和False总是让人困惑,一不小心就会用错,本文总结了三个易错点,别离是逻辑取反、if 条件式和 pandas.DataFrame.loc 切片中的条件式。
1.True 和 False 的逻辑取反
在对 True 和 False 进行逻辑取反时,不应用 ~,而要应用not。
因为在 Python 中,not 才是逻辑取反,而~ 是按位取反。True 和 False 对应的数值是 1 和 0,~True 就相当于对 1 按位取反,后果是 -2,not True 的后果才是 False。
print(True)
print(~True)
print(not True)
后果是:
True
-2
False
相似的,~False 的后果是 1,not False 的后果才是 True
print(False)
print(~False)
print(not False)
后果是:
False
-1
True
注:Python 中 ~ 按位取反是依照数的补码取反,即:
1 => 补码 00000001 => ~ 按位取反 => 补码 11111110 => 2
双重否定的后果是这样的
print(not not True)
print(~~True)
print(not ~True)
print(~(not True))
后果为:
True
1
False
-1
对 False 的双重否定
print(not not False)
print(~~False)
print(not ~False)
print(~(not False))
后果为:
False
0
False
-2
2.if 条件语句中的 True 和 False
Python 语言中,if 后任何非 0 和非空(null)值为 True,0 或者 null 为 False。这点和其余语言不雷同,应用多种编程语言时很容易混同。所以即便判断条件是一个正数,也是依照 True 解决,不会执行 else 分支。来看例子:
if (-2):
print('a')
else:
print('b')
后果为:
a
如果应用了 ~ 对 True 或 False 取反,则得不到想要的后果:
if (~True): # ~True == -2
print('a')
else:
print('b')
后果为:
a
只有用 not 来取反,能力达到逻辑取反的成果:
if not True:
print('a')
else:
print('b')
后果为:
b
3.pandas.DataFrame.loc 中的否定
pandas.DataFrame.loc 官网文档中是这么说的
Access a group of rows and columns by label(s) or a boolean array.
能够应用布尔列表作为输出,包含应用一个条件式来返回一个布尔列表,例:
首先创立一个 DataFrame
import pandas as pd
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
index=['cobra', 'viper', 'sidewinder'],
columns=['max_speed', 'shield'])
df
应用条件式来筛选出 shield 大于 6 的数据
df.loc[df['shield'] > 6]
筛选出 shield 域小于等于 6 的数据,能够
df.loc[df['shield'] <= 6]
也能够用
~ df.loc[~(df['shield'] > 6)]
另一个例子,筛选出 index 中不蕴含 er 两个字母的数据
df.loc[~df.index.str.contains('er')]
须要留神的是,在这里应用 df.index.str.contains(‘er’)作为条件筛选时,返回的是 pd.Series。
而在 pd.Series 中,~ 操作符重载了,它对布尔类型数据和对数值类型数据的解决别离是逻辑取反和按位取反。
df.index.str.contains('er')
的后果是:
array([False, True, True])
对 布尔类型 的 pd.Series 应用 ~ 取反,是 逻辑取反
~pd.Series([False, True, False])
后果为
True
False
True
dtype: bool
而如果对 数值型 的 pd.Series 应用 ~ 取反,则是 按位取反
~pd.Series([1,2,3])
后果为
-2
-3
-4
dtype: int64
总结
- Python 中,在对 True 和 False 进行逻辑取反时,不应用~,而要应用 not。
- if 条件式中,任何非 0 和非空(null)为 True,0 或者 null 为 False。
- pandas.DataFrame.loc 切片操作中,~ 操作符重载了,与原生 Python 中意义不同。
我的 Python 版本
>>> import sys
>>> print(sys.version)
3.7.6 (default, Jan 8 2020, 13:42:34)
[Clang 4.0.1 (tags/RELEASE_401/final)]