python不相等的两个字符串的 if 条件判断为True详解


Posted in Python onMarch 12, 2020

今天遇到一个非常基础的问题,结果搞了好久好久.....赶快写一篇博客记录一下:

本来两个不一样的字符串,在if 的条件判断中被判定为True,下面是错误的代码:

test_str = 'happy'
if test_str == 'good' or 'happy': #这样if判断永远是True,写法错误
  print('aa')
else:
  print('bbbb')

这是正确的代码:

test_str = 'happy'
if test_str == 'good' or test_str == 'happy':
  print('aa')
else:
  print('bbbb')

补充知识:python基础(if判断条件语句,比较、布尔运算符)

1.条件和条件语句

在编写的程序中,语句都是逐条执行的。现在更进一步,让程序选择是否执行特定的语句块。

1 )布尔值的用武之地

真值也称布尔值,是以在真值方面做出了巨大贡献的George Boole命名的。

用作布尔表达式(如用作if语句中的条件)时,下面的值都将被解释器视为假:

False None 0 "" () [] {}

换而言之,标准值False和None、各种类型(包括浮点数、复数等)的数值0、空序列(如空字符串、空元组和空列表)以及空映射(如空字典)都被视为假,而其他各种值都被视为真,包括特殊值True。

正如Python老手Laura Creighton指出的,这种差别类似于“有些东西”和“没有东西”的差别,而不是真和假的差别。

这意味着任何Python值都可解释为真值。乍一看这有点令人迷惑,但也很有用。虽然可供选择的真值非常多,但标准真值为True和False。在有些语言(如C语言和2.3之前的Python版本)中,标准真值为0(表示假)和1(表示真)。实际上,True和False不过是0和1的别名,虽然看起来不同,但作用是相同的。

>>> True 
True 
>>> False 
False 
>>> True == 1 
True 
>>> False == 0 
True 
>>> True + False + 42 
43

因此,如果你看到一个返回1或0的表达式(可能是使用较旧的Python版本编写的),就知道这实际上意味着True或False。

布尔值True和False属于类型bool,而bool与list、str和tuple一样,可用来转换其他的值。

>>> bool('I think, therefore I am') 
True 
>>> bool(42) 
True 
>>> bool('') 
False 
>>> bool(0) 
False

鉴于任何值都可用作布尔值因此你几乎不需要显式地进行转换(Pthon会自动转换)

虽然[]和""都为假(即bool([]) == bool("") == False),但它们并不相等(即[] != "")。

对其他各种为假的对象来说,情况亦如此(一个更显而易见的例子是() != False)。

2) 有条件地执行和 if 语句

真值可合并,先来看看真值可用来做什么。请尝试运行下面的脚本:

name = input('What is your name? ') 
if name.endswith('Gumby'): 
 print('Hello, Mr. Gumby')

这就是if语句,让你能够有条件地执行代码。这意味着如果条件(if和冒号之间的表达式)为前面定义的真,就执行后续代码块(这里是一条print语句);如果条件为假,就不执行。

3)else 子句

在前一节的示例中,如果你输入以Gumby结尾的名字,方法name.endswith将返回True,导致后续代码块执行——打印问候语。如果你愿意,可使用else子句增加一种选择(之所以叫子句是因为else不是独立的语句,而是if语句的一部分)。

name = input('What is your name?') 
if name.endswith('Gumby'): 
 print('Hello, Mr. Gumby') 
else: 
 print('Hello, stranger')

在这里,如果没有执行第一个代码块(因为条件为假),将进入第二个代码块。

还有一个与if语句很像的“亲戚”,它就是条件表达式——C语言中三目运算符的Python版本。下面的表达式使用if和else确定其值:

status = "friend" if name.endswith("Gumby") else "stranger"

如果条件(紧跟在if后面)为真,表达式的结果为提供的第一个值(这里为"friend"),否则为第二个值(这里为"stranger")。

4)elif 子句

要检查多个条件,可使用elif。elif是else if的缩写,由一个if子句和一个else子句组合而成,也就是包含条件的else子句。

num = int(input('Enter a number: ')) 
ifnum > 0: 
 print('The number is positive') 
elifnum < 0: 
 print('The number is negative') 
else: 
 print('The number is zero')

5)代码块嵌套

你可将if语句放在其他if语句块中,如下所示:

name = input('What is your name? ') 
if name.endswith('Gumby'): 
   if name.startswith('Mr.'): 
     print('Hello, Mr. Gumby') 
   elif name.startswith('Mrs.'): 
     print('Hello, Mrs. Gumby') 
   else: 
     print('Hello, Gumby') 
else: 
   print('Hello, stranger')

在这里,如果名字以Gumby结尾,就同时检查名字开头,这是在第一个代码块中使用一条独立的if语句完成的。请注意,这里还使用了elif。最后一个分支(else子句)没有指定条件——如果没有选择其他分支,就选择最后一个分支。如果需要,这里的两个else子句都可省略。如果省略里面的else子句,将忽略并非以Mr.或Mrs.打头的名字(假设名字为Gumby)。如果省略外面的else子句,将忽略陌生人。

6)更复杂的条件

1. 比较运算符

在条件表达式中,最基本的运算符可能是比较运算符,它们用于执行比较。

python不相等的两个字符串的 if 条件判断为True详解

从理论上说,可使用<和<=等运算符比较任意两个对象x和y的相对大小,并获得一个真值,但这种比较仅在x和y的类型相同或相近时(如两个整数或一个整数和一个浮点数)才有意义。

将整数与字符串相加毫无意义,检查一个整数是否小于一个字符串也是一样。

与赋值一样,Python也支持链式比较:可同时使用多个比较运算符,如0 < age < 100。有些比较运算符需要特别注意

相等运算符

要确定两个对象是否相等,可使用比较运算符,用两个等号(==)表示。

>>> "foo" == "foo" 
True 
>>> "foo" == "bar" 
False

两个等号?为何不像数学中那样使用一个等号呢?但这里还是试试一个等号吧。

>>> "foo" = "foo"
SyntaxError: can't assign to literal

一个等号是赋值运算符,用于修改值,而进行比较时你可不想这样做。

is:相同运算符

这个运算符很有趣,其作用看似与==一样,但实际上并非如此。

>>> x = y = [1, 2, 3] 
>>> z = [1, 2, 3] 
>>> x == y 
True 
>>> x == z 
True 
>>> x is y 
True 
>>> x is z 
False

在前几个示例中,看不出什么问题,但最后一个示例的结果很奇怪:x和z相等,但x is z的结果却为False。为何会这样呢?因为is检查两个对象是否相同(而不是相等)。变量x和y指向同一个列表,而z指向另一个列表(其中包含的值以及这些值的排列顺序都与前一个列表相同)。这两个列表虽然相等,但并非同一个对象。这好像不可理喻?请看下面的示例:

>>> x = [1, 2, 3] 
>>> y = [2, 4] 
>>> x is not y 
True 
>>> del x[2] 
>>> y[1] = 1 
>>> y.reverse()

在这个示例中,我首先创建了两个不同的列表x和y。如你所见,x is not y(与x is y相反)的结果为True,接下来,我稍微修改了这两个列表,现在它们虽然相等,但依然是两个不同的列表。

>>> x == y 
True 
>>> x is y 
False

显然,这两个列表相等但不相同。

总之,==用来检查两个对象是否相等,而is用来检查两个对象是否相同(是同一个对象)。

不要将is用于数和字符串等不可变的基本值。鉴于Python在内部处理这些对象的方式,这样做的结果是不可预测的。

in:成员资格运算符

与其他比较运算符一样,它也可用于条件表达式中。

name = input('What is your name?') 
if 's' in name: 
 print('Your name contains the letter "s".') 
else: 
 print('Your name does not contain the letter "s".')

字符串和序列的比较

字符串是根据字符的字母排列顺序进行比较的。

>>> "alpha" < "beta"
True

虽然基于的是字母排列顺序,但字母都是Unicode字符,它们是按码点排列的。

实际上,字符是根据顺序值排列的。要获悉字母的顺序值,可使用函数ord。这个函数的作用与函数chr相反。

这种方法既合理又一致,但可能与你排序的方式相反。例如,涉及大写字母时,排列顺序就可能与你想要的不同。

>>> "a" < "B"
False

一个诀窍是忽略大小写。为此可使用字符串方法lower,如下所示:

>>> "a".lower() < "B".lower() 
True 
>>> 'FnOrD'.lower() == 'Fnord'.lower() 
True

其他序列的比较方式与此相同,但这些序列包含的元素可能不是字符,而是其他类型的值。

>>> [1, 2] < [2, 1]
True

如果序列的元素为其他序列,将根据同样的规则对这些元素进行比较。

>>> [2, [1, 4]] < [2, [1, 5]]
True

2. 布尔运算符

至此,你已见过很多返回真值的表达式(实际上,考虑到所有值都可解释为真值,因此所有的表达式都返回真值),但你可能需要检查多个条件。例如,假设你要编写一个程序,让它读取一个数,并检查这个数是否位于1~10(含)。为此,可像下面这样做:

number = int(input('Enter a number between 1 and 10: ')) 
if number <= 10: 

   if number >= 1: 
     print('Great!') 
   else: 
     print('Wrong!') 
else: 
   print('Wrong!')

这可行,但有点笨拙,因为输入了print('Wrong!')两次。重复劳动可不是好事,那么该如何办呢?很简单。

number = int(input('Enter a number between 1 and 10: ')) 
if number <= 10 and number >= 1: 
  print('Great!') 
else: 
  print('Wrong!')

通过使用链式比较1 <= number <= 10可进一步简化这个示例。

运算符and是一个布尔运算符。它接受两个真值,并在这两个值都为真时返回真,否则返回假。还有另外两个布尔运算符:or和not。通过使用这三个运算符,能以任何方式组合真值。

if ((cash > price) or customer_has_good_credit) and not out_of_stock:
give_goods()

短路逻辑和条件表达式

布尔运算符有个有趣的特征:只做必要的计算。例如,仅当x和y都为真时,表达式x and y才为真。因此如果x为假,这个表达式将立即返回假,而不关心y。实际上,如果x为假,这个表达式将返回x,否则返回y。这种行为称为短路逻辑(或者延迟求值):布尔运算符常被称为逻辑运算符,在有些情况下将“绕过”第二个值。对于运算符or,情况亦如此。在表达式x or y中,如果x为真,就返回x,否则返回y。请注意,这意味着位于布尔运算符后面的代码(如函数调用)可能根本不会执行。像下面这样的代码就利用了这种行为:

name = input('Please enter your name: ') or '<unknown>'

如果没有输入名字,上述or表达式的结果将为'<unknown>'。在很多情况下,宁愿使用条件表达式,而不耍这样的短路花样。

以上这篇python不相等的两个字符串的 if 条件判断为True详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Java中重定向输出流实现用文件记录程序日志
Jun 12 Python
python用Pygal如何生成漂亮的SVG图像详解
Feb 10 Python
python日志记录模块实例及改进
Feb 12 Python
CentOS 6.5下安装Python 3.5.2(与Python2并存)
Jun 05 Python
Python内置模块turtle绘图详解
Dec 09 Python
python smtplib模块实现发送邮件带附件sendmail
May 22 Python
Django Rest framework频率原理与限制
Jul 26 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
Aug 27 Python
Python实现TCP通信的示例代码
Sep 09 Python
基于python+selenium的二次封装的实现
Jan 06 Python
给Python学习者的文件读写指南(含基础与进阶)
Jan 29 Python
基于Tensorflow一维卷积用法详解
May 22 Python
Python 实现使用空值进行赋值 None
Mar 12 #Python
PyCharm永久激活方式(推荐)
Sep 22 #Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
Mar 12 #Python
pycharm激活码快速激活及使用步骤
Mar 12 #Python
Python自动化测试笔试面试题精选
Mar 12 #Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
Mar 12 #Python
Python之关于类变量的两种赋值区别详解
Mar 12 #Python
You might like
php循环语句 for()与foreach()用法区别介绍
2012/09/05 PHP
PHP不用递归遍历目录下所有文件的代码
2014/07/04 PHP
Eclipse的PHP插件PHPEclipse安装和使用
2014/07/20 PHP
PHP基于数组实现的分页函数实例
2014/08/20 PHP
PHP MySql增删改查的简单实例
2016/06/21 PHP
php求数组全排列,元素所有组合的方法总结
2017/03/14 PHP
asp.net和php的区别点总结
2019/10/10 PHP
Javascript学习笔记4 Eval函数
2010/01/11 Javascript
JS鼠标事件大全 推荐收藏
2011/11/01 Javascript
js实现向右横向滑出的二级菜单效果
2015/08/27 Javascript
jQuery实现固定在网页顶部的菜单效果代码
2015/09/02 Javascript
jQuery实现分隔条左右拖动功能
2015/11/21 Javascript
jQuery ajax方法传递中文时出现中文乱码的解决方法
2016/07/25 Javascript
关于数据与后端进行交流匹配(点亮星星)
2016/08/03 Javascript
微信小程序 详解下拉加载与上拉刷新实现方法
2017/01/13 Javascript
结合mint-ui移动端下拉加载实践方法总结
2017/11/08 Javascript
Vue $emit $refs子父组件间方法的调用实例
2018/09/12 Javascript
探秘vue-rx 2.0(推荐)
2018/09/21 Javascript
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
用Python的Tornado框架结合memcached页面改善博客性能
2015/04/24 Python
学习python类方法与对象方法
2016/03/15 Python
解决pycharm启动后总是不停的updating indices...indexing的问题
2019/11/27 Python
将python依赖包打包成window下可执行文件bat方式
2019/12/26 Python
python多项式拟合之np.polyfit 和 np.polyld详解
2020/02/18 Python
如何在django中实现分页功能
2020/04/22 Python
Python中用xlwt制作表格实例讲解
2020/11/05 Python
Python3中的tuple函数知识点讲解
2021/01/03 Python
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
深入了解canvas在移动端绘制模糊的问题解决
2019/04/30 HTML / CSS
Staples英国官方网站:办公用品一站式采购
2017/10/06 全球购物
挂职学习心得体会
2014/09/09 职场文书
《少年闰土》教学反思
2016/02/18 职场文书
Python打包为exe详细教程
2021/05/18 Python
美元符号 $
2022/02/17 杂记
利用 Python 的 Pandas和 NumPy 库来清理数据
2022/04/13 Python
Mysql 一主多从的部署
2022/05/20 MySQL