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随机生成彩票号码的方法
Mar 05 Python
使用Python发送邮件附件以定时备份MySQL的教程
Apr 25 Python
Python中用函数作为返回值和实现闭包的教程
Apr 27 Python
获取python文件扩展名和文件名方法
Feb 02 Python
Python3爬虫学习之MySQL数据库存储爬取的信息详解
Dec 12 Python
对python的unittest架构公共参数token提取方法详解
Dec 17 Python
python 定时器,实现每天凌晨3点执行的方法
Feb 20 Python
django如何通过类视图使用装饰器
Jul 24 Python
详解Python并发编程之从性能角度来初探并发编程
Aug 23 Python
flask 实现token机制的示例代码
Nov 07 Python
简单了解python装饰器原理及使用方法
Dec 18 Python
教你怎么用python爬取爱奇艺热门电影
May 20 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
当海贼王变成JOJO风
2020/03/02 日漫
PHP中用hash实现的数组
2011/07/17 PHP
AJAX PHP无刷新form表单提交的简单实现(推荐)
2016/09/09 PHP
JS中令人发指的valueOf方法介绍
2013/02/22 Javascript
JS window对象的top、parent、opener含义介绍
2013/12/03 Javascript
jQuery绑定事件不执行但alert后可以正常执行
2014/06/03 Javascript
JavaScript判断变量是否为空的自定义函数分享
2015/01/31 Javascript
JavaScript使用DeviceOne开发实战(三)仿微信应用
2015/12/02 Javascript
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
bootstrap 通过加减按钮实现输入框组功能
2017/11/15 Javascript
vue实现中部导航栏布局功能
2019/07/30 Javascript
关于layui 弹出层一闪而过就消失的解决方法
2019/09/09 Javascript
Angular短信模板校验代码
2020/09/23 Javascript
JavaScript实现图片合成下载的示例
2020/11/19 Javascript
使用Typescript开发微信小程序的步骤详解
2021/01/12 Javascript
[01:39:04]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第二场 2月1日
2021/03/11 DOTA
用pywin32实现windows模拟鼠标及键盘动作
2014/04/22 Python
Python排序搜索基本算法之冒泡排序实例分析
2017/12/09 Python
python中update的基本使用方法详解
2019/07/17 Python
python 字符串追加实例
2019/07/20 Python
python进阶之自定义可迭代的类
2019/08/20 Python
python爬虫scrapy图书分类实例讲解
2020/11/23 Python
Python爬虫之App爬虫视频下载的实现
2020/12/08 Python
CSS3 calc()会计算属性详解
2018/02/27 HTML / CSS
Sunglasses Shop丹麦:欧洲第一的太阳镜在线销售网站
2017/10/22 全球购物
新西兰杂志订阅:isubscribe
2019/08/26 全球购物
Mountain Warehouse波兰官方网站:英国户外品牌
2019/08/29 全球购物
先进集体获奖感言
2014/02/13 职场文书
大学开学计划书
2014/04/30 职场文书
信用卡逾期证明示例
2014/09/13 职场文书
群众路线四风问题整改措施
2014/09/27 职场文书
先进典型事迹材料
2014/12/29 职场文书
语文复习计划
2015/01/19 职场文书
农业项目投资意向书
2015/05/09 职场文书
2015年防灾减灾工作总结
2015/07/24 职场文书
uni-app 微信小程序授权登录的实现步骤
2022/02/18 Javascript