一、判断一个变量的布尔值,有哪些方法?
1.1 内置函数bool()
什么是变量的布尔值?指的是在变量这个类中,魔法方法__bool__()中返回的值。比如对于一个字符串变量,当它为空时应该让它返回False,当它非空就返回True。
那么我们调用bool()函数,其实就是在调用变量的魔法方法,也就是在取出它的布尔值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64print(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;哪怕生成器中没有数据,它也会返回真;对于迭代器,如果可通过迭代获取数据就返回真,如果没有数据可获取就返回假;对于任何函数或类,都会返回真。
- 生成器
1
2
3
4
5
6
7
8
9import pathlib from inspect import isgenerator TEST_DIR = r'D:BaiduNetdiskDownloadpycv-learningdataspot_data_clsvalImageSet' print(isgenerator(pathlib.Path(TEST_DIR).iterdir())) # True print(list(pathlib.Path(TEST_DIR).iterdir())) # [] print(bool(pathlib.Path(TEST_DIR).iterdir())) # True
- 迭代器
1
2
3
4
5
6
7
8
9from typing import Iterable print(isinstance(range(0), Iterable)) print(list(range(0))) print(bool(range(0))) print(bool(range(1))) # True # [] # False # True
- 函数和类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17print(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__()中的定义有出入。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64print(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的结果。
1
2
3
4
5
6
7
8class dataf(): def __eq__(self,other): return True a = dataf() if a == None: print('true') # true
因此,用双等号判断一个对象布尔值,是非常不合理、不应该做出的。
1.3 if语句的执行情况
可以看出,结果和bool()函数的返回结果一模一样。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62print('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,在这一点上和==判断符的结果一样。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48print(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:UsersAdministratorAppDataLocalTempipykernel_145963727719771.py:9: SyntaxWarning: "is" with a literal. Did you mean "=="? # print(() is True) # C:UsersAdministratorAppDataLocalTempipykernel_145963727719771.py:10: SyntaxWarning: "is" with a literal. Did you mean "=="? # print(0 is True) # C:UsersAdministratorAppDataLocalTempipykernel_145963727719771.py:11: SyntaxWarning: "is" with a literal. Did you mean "=="? # print(1 is True) # C:UsersAdministratorAppDataLocalTempipykernel_145963727719771.py:12: SyntaxWarning: "is" with a literal. Did you mean "=="? # print('' is True) # C:UsersAdministratorAppDataLocalTempipykernel_145963727719771.py:13: SyntaxWarning: "is" with a literal. Did you mean "=="? # print("" is True) # C:UsersAdministratorAppDataLocalTempipykernel_145963727719771.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的语句,效果等价。
1
2
3
4
5
6
7
8
9
10
11
12def 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__()方法不当声明/重载的风险。
1
2
3
4
5
6
7
8
9>>> 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 - 博客园
最后
以上就是坦率橘子最近收集整理的关于python-if语句的深入讲解,什么时候会判断成True或False,什么时候判断成None?真值、假值一、判断一个变量的布尔值,有哪些方法? 二、哪些类型的变量对应的布尔值是True或False?三、 对于None类型变量的讲解的全部内容,更多相关python-if语句的深入讲解,什么时候会判断成True或False,什么时候判断成None?真值、假值一、判断一个变量的布尔值,有哪些方法? 二、哪些类型的变量对应的布尔值是True或False?三、内容请搜索靠谱客的其他文章。
发表评论 取消回复