python-if语句的深入讲解,什么时候会判断成True或False,什么时候判断成None?真值、假值

一、判断一个变量的布尔值,有哪些方法?

1.1 内置函数bool()

什么是变量的布尔值?指的是在变量这个类中,魔法方法__bool__()中返回的值。比如对于一个字符串变量,当它为空时应该让它返回False,当它非空就返回True。

那么我们调用bool()函数,其实就是在调用变量的魔法方法,也就是在取出它的布尔值。

print(bool(False))  #False是False
print(bool(0))      #数值0是False
print(bool(0.0))    #是False
print(bool(None))   #是False
print(bool(''))     #单引号空字符串是False
print(bool(""))     #双引号空字符串是False
print(bool([]))     #空列表是False
print(bool(list())) #空列表是False
print(bool(()))     #空元组是False
print(bool(tuple()))#内置函数tuple可以得到一个空元组,也是False
print(bool({}))     #空字典是False
print(bool(dict())) #内置函数dict()可以得到一个空字典,也是False
print(bool(set()))  #内置函数set()可以得到一个空集合,也是False

print('---------------------------------------------------')

print(bool(1))              #除0以外的数字,都是True
print(bool('  '))           #有空格的单字符串,是True
print(bool("   "))          #有空格的双字符串,是True
print(bool(True))           #True是True
print(bool([1,2,3]))        #不为空的列表是True
print(bool((1,2,3)))        #不为空的元组是True
print(bool({'a':'1'}))      #不为空的字典是True
print(bool({'a','b'}))      #不为空的集合是True

# False
# False
# False
# False
# False
# False
# False
# False
# False
# False
# False
# False
# False
# ---------------------------------------------------
# True
# True
# True
# True
# True
# True
# True
# True

 以上代码源于:Python布尔值为False或True的情况,以及False和True的判断条件

另外,补充一点。对于任何生成器、存在数据的迭代器、函数或类这些,它们的布尔值都是True;哪怕生成器中没有数据,它也会返回真;对于迭代器,如果可通过迭代获取数据就返回真,如果没有数据可获取就返回假;对于任何函数或类,都会返回真。

  • 生成器
import pathlib
from inspect import isgenerator

TEST_DIR = r'D:\BaiduNetdiskDownload\pycv-learning\data\spot_data_cls\valImageSet'

print(isgenerator(pathlib.Path(TEST_DIR).iterdir()))  # True
print(list(pathlib.Path(TEST_DIR).iterdir()))  # []
print(bool(pathlib.Path(TEST_DIR).iterdir()))  # True
  • 迭代器 
from typing import Iterable

print(isinstance(range(0), Iterable))
print(list(range(0)))
print(bool(range(0)))
print(bool(range(1)))

# True
# []
# False
# True
  •  函数和类
print(print)  # <built-in function print>

print(int)  # <class 'int'>
print(float)  # <class 'float'>
print(list)  # <class 'list'>

print(bool(print))  # True

print(bool(int))  # True
print(bool(float))  # True
print(bool(list))  # True

1.2 双等号==判断符

下面的大多数类型的变量,用双等号判断出来的结果都是和直接调用bool函数相同。

但是对于非空的容器(字符串、元组、列表、集合、字典、空数组),返回的是False,和调用bool函数结果不同。

我估计是因为,变量在声明过程中对__eq__()魔法方法的定义中,与__bool__()中的定义有出入。

print(False == True)  #False是False
print(0 == True)      #数值0是False
print(0.0 == True)    #是False
print(None == True)   #是False
print('' == True)     #单引号空字符串是False
print("" == True)     #双引号空字符串是False
print([] == True)     #空列表是False
print(list() == True) #空列表是False
print(() == True)     #空元组是False
print(tuple() == True)#内置函数tuple可以得到一个空元组,也是False
print({} == True)     #空字典是False
print(dict() == True) #内置函数dict()可以得到一个空字典,也是False
print(set() == True)  #内置函数set()可以得到一个空集合,也是False

print('---------------------------------------------------')

print(1 == True)              #除0以外的数字,都是True
print('  ' == True)           #有空格的单字符串,是True
print("   " == True)          #有空格的双字符串,是True
print(True == True)           #True是True
print([1,2,3] == True)        #不为空的列表是True
print((1,2,3) == True)        #不为空的元组是True
print({'a':'1'} == True)      #不为空的字典是True
print({'a','b'} == True)      #不为空的集合是True

# False
# False
# False
# False
# False
# False
# False
# False
# False
# False
# False
# False
# False
# ---------------------------------------------------
# True
# False
# False
# True
# False
# False
# False
# False

比如,我们自定义一种数据类型,然后重载__eq__()方法,return的返回值恒为True,那么不管双等号右边是什么值,都会得到True的结果。

class dataf():
    def __eq__(self,other):
        return True

a = dataf()

if a == None:
    print('true')
    
# true
        

因此,用双等号判断一个对象布尔值,是非常不合理、不应该做出的。 

1.3 if语句的执行情况

可以看出,结果和bool()函数的返回结果一模一样。

print('True') if False else print('False')  #False是False
print('True') if 0 else print('False')      #数值0是False
print('True') if 0.0 else print('False') 
print('True') if None else print('False') 
print('True') if '' else print('False')     #单引号空字符串是False
print('True') if "" else print('False')     #双引号空字符串是False
print('True') if [] else print('False')     #空列表是False
print('True') if list() else print('False') #空列表是False
print('True') if () else print('False')     #空元组是False
print('True') if tuple() else print('False')#内置函数tuple可以得到一个空元组,也是False
print('True') if {} else print('False')     #空字典是False
print('True') if dict() else print('False') #内置函数dict()可以得到一个空字典,也是False
print('True') if set() else print('False')  #内置函数set()可以得到一个空集合,也是False

print('---------------------------------------------------')
print('True') if 1 else print('False')           #除0以外的数字,都是True
print('True') if '  ' else print('False')        #有空格的单字符串,是True
print('True') if "   " else print('False')       #有空格的双字符串,是True
print('True') if True else print('False')        #True是True   
print('True') if [1,2,3] else print('False')     #不为空的列表是True
print('True') if (1,2,3) else print('False')     #不为空的元组是True
print('True') if {'a':'1'} else print('False')   #不为空的字典是True
print('True') if {'a','b'} else print('False')   #不为空的集合是True 

# False
# False
# False
# False
# False
# False
# False
# False
# False
# False
# False
# False
# False
# ---------------------------------------------------
# True
# True
# True
# True
# True
# True
# True
# True

1.4 is语句的判断

is语句用来判断字符串、scalar的布尔值时,是会报错的;并且对于非空容器的判断结果,恒为False,在这一点上和==判断符的结果一样。

print(None is True)
print({} is True)
print([] is True)
print(() is True)
print(0 is True)
print(1 is True)
print('' is True)
print("" is True)
print("abc" is True)

# False
# False
# False
# False
# False
# False
# False
# False
# False
# <>:9: SyntaxWarning: "is" with a literal. Did you mean "=="?
# <>:10: SyntaxWarning: "is" with a literal. Did you mean "=="?
# <>:11: SyntaxWarning: "is" with a literal. Did you mean "=="?
# <>:12: SyntaxWarning: "is" with a literal. Did you mean "=="?
# <>:13: SyntaxWarning: "is" with a literal. Did you mean "=="?
# <>:14: SyntaxWarning: "is" with a literal. Did you mean "=="?
# <>:9: SyntaxWarning: "is" with a literal. Did you mean "=="?
# <>:10: SyntaxWarning: "is" with a literal. Did you mean "=="?
# <>:11: SyntaxWarning: "is" with a literal. Did you mean "=="?
# <>:12: SyntaxWarning: "is" with a literal. Did you mean "=="?
# <>:13: SyntaxWarning: "is" with a literal. Did you mean "=="?
# <>:14: SyntaxWarning: "is" with a literal. Did you mean "=="?
# C:\Users\Administrator\AppData\Local\Temp\ipykernel_14596\3727719771.py:9: SyntaxWarning: "is" with a literal. Did you mean "=="?
#   print(() is True)
# C:\Users\Administrator\AppData\Local\Temp\ipykernel_14596\3727719771.py:10: SyntaxWarning: "is" with a literal. Did you mean "=="?
#   print(0 is True)
# C:\Users\Administrator\AppData\Local\Temp\ipykernel_14596\3727719771.py:11: SyntaxWarning: "is" with a literal. Did you mean "=="?
#   print(1 is True)
# C:\Users\Administrator\AppData\Local\Temp\ipykernel_14596\3727719771.py:12: SyntaxWarning: "is" with a literal. Did you mean "=="?
#   print('' is True)
# C:\Users\Administrator\AppData\Local\Temp\ipykernel_14596\3727719771.py:13: SyntaxWarning: "is" with a literal. Did you mean "=="?
#   print("" is True)
# C:\Users\Administrator\AppData\Local\Temp\ipykernel_14596\3727719771.py:14: SyntaxWarning: "is" with a literal. Did you mean "=="?
#   print("abc" is True)

 二、哪些类型的变量对应的布尔值是True或False?

详见本文第一部分,总结一下吧!

  • 空容器、空的迭代器、任何生成器、函数和类、​​​​​​​None(重点记住!)、大小为0的scalar(整型或浮点型)、布尔值False本身对应的布尔值是False。
  • 非空容器(哪怕里面全装0或False)、非空迭代器、大小非零的scalar、布尔值True本身对应的布尔值是True。

三、 对于None类型变量的讲解

3.1 None与函数返回值

python-函数中没有return语句和有return但是没返回值、有return 返回值是None的语句,效果等价。

def a_():
    return None
 
def b_():
    return
 
def c_():
    pass
 
print(a_())
print(b_())
print(c_())
 
# None
# None
# None

3.2 None与if语句

如果我们要判断某一个变量是否为None类型,那么最好的办法是用is表达式,而非用==判断。

为什么呢?因为可以杜绝__eq__()方法不当声明/重载的风险。

>>> class foo(object):
    def __eq__(self, other):
        return True
 
>>> f = foo()
>>> f == None
True
>>> f is None
False

那可不可以直接用if 语句(或if not 语句)呢?

也不建议,因为无法避免空容器、数值0和Flase本身和None布尔值相同的混淆。

如果用is语句,想要判断变量是None,很明显直接用if x is None是比较好的;如果想要变量不是None,具体怎么用最好呢?

对于`if x is not None`和`if not x is None`写法,很明显前者更清晰,而后者有可能使读者误解为`if (not x) is None`,因此推荐前者,同时这也是谷歌推荐的风格

python 判断变量是否是 None 的三种写法 - lincappu - 博客园

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值