我是靠谱客的博主 坦率橘子,最近开发中收集的这篇文章主要介绍python-if语句的深入讲解,什么时候会判断成True或False,什么时候判断成None?真值、假值一、判断一个变量的布尔值,有哪些方法? 二、哪些类型的变量对应的布尔值是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: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
  • 迭代器 
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: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的语句,效果等价。

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 - 博客园

最后

以上就是坦率橘子为你收集整理的python-if语句的深入讲解,什么时候会判断成True或False,什么时候判断成None?真值、假值一、判断一个变量的布尔值,有哪些方法? 二、哪些类型的变量对应的布尔值是True或False?三、 对于None类型变量的讲解的全部内容,希望文章能够帮你解决python-if语句的深入讲解,什么时候会判断成True或False,什么时候判断成None?真值、假值一、判断一个变量的布尔值,有哪些方法? 二、哪些类型的变量对应的布尔值是True或False?三、 对于None类型变量的讲解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部