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 相关文章推荐
python中的字典详细介绍
Sep 18 Python
Python中实现结构相似的函数调用方法
Mar 10 Python
Python的mysql数据库的更新如何实现
Jul 31 Python
Python3中的json模块使用详解
May 05 Python
python采集微信公众号文章
Dec 20 Python
python3+selenium实现126邮箱登陆并发送邮件功能
Jan 23 Python
python多进程重复加载的解决方式
Dec 13 Python
Python SMTP配置参数并发送邮件
Jun 16 Python
在Keras中CNN联合LSTM进行分类实例
Jun 29 Python
Python爬虫实现自动登录、签到功能的代码
Aug 20 Python
python两个list[]相加的实现方法
Sep 23 Python
TensorFlow的自动求导原理分析
May 26 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函数utf8转gb2312编码
2006/12/21 PHP
php 远程图片保存到本地的函数类
2008/12/08 PHP
一些php技巧与注意事项分析
2011/02/03 PHP
MyEclipse常用配置图文教程
2014/09/11 PHP
PHP共享内存用法实例分析
2016/02/12 PHP
php语法检查的方法总结
2019/01/21 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
分享一个我自己写的ToolTip提示插件(附源码)
2013/01/20 Javascript
js鼠标点击按钮切换图片-图片自动切换-点击左右按钮切换特效代码
2015/09/02 Javascript
jQuery获取字符串中出现最多的数
2016/02/22 Javascript
jQuery实现的跨容器无缝拖动效果代码
2016/06/21 Javascript
JavaScript实现通过select标签跳转网页的方法
2016/09/29 Javascript
Jq通过td获取同行其它列td的方法
2016/10/05 Javascript
js选项卡的制作方法
2017/01/23 Javascript
详解用vue.js和laravel实现微信支付
2017/06/23 Javascript
jQuery实现参数自定义的文字跑马灯效果
2018/08/15 jQuery
angularjs手动识别字符串中的换行符方法
2018/10/02 Javascript
详解Vue中的基本语法和常用指令
2019/07/23 Javascript
Vue数字输入框组件示例代码详解
2020/01/15 Javascript
vue.js click点击事件获取当前元素对象的操作
2020/08/07 Javascript
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
2018/03/19 Python
基于python实现名片管理系统
2018/11/30 Python
Python自动化运维之Ansible定义主机与组规则操作详解
2019/06/13 Python
在pycharm中为项目导入anacodna环境的操作方法
2020/02/12 Python
css3实现动画的三种方式
2020/08/24 HTML / CSS
浅谈amaze-ui中datepicker和datetimepicker注意的几点
2020/08/21 HTML / CSS
C#如何允许一个类被继承但是避免这个类的方法被重载?
2015/02/24 面试题
小学生国庆演讲稿
2014/09/05 职场文书
土地转让协议书
2014/09/27 职场文书
四风之害观后感
2015/06/09 职场文书
战友聚会致辞
2015/07/28 职场文书
离职员工给领导和同事的感谢信
2015/11/03 职场文书
2016年4月份红领巾广播稿
2015/12/21 职场文书
用javascript制作qq注册动态页面
2021/04/14 Javascript
vue 给数组添加新对象并赋值
2022/04/20 Vue.js
DQL数据查询语句使用示例
2022/12/24 MySQL