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 01 Python
python中元类用法实例
Oct 10 Python
图文讲解选择排序算法的原理及在Python中的实现
May 04 Python
使用Python3 编写简单信用卡管理程序
Dec 21 Python
Python使用cx_Oracle调用Oracle存储过程的方法示例
Oct 07 Python
用Python登录好友QQ空间点赞的示例代码
Nov 04 Python
解决python 输出是省略号的问题
Apr 19 Python
Python实现的简单读写csv文件操作示例
Jul 12 Python
解决Django一个表单对应多个按钮的问题
Jul 18 Python
通过python3实现投票功能代码实例
Sep 26 Python
使用 Python 写一个简易的抽奖程序
Dec 08 Python
用python进行视频剪辑
Nov 02 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
德生PL550的电路分析
2021/03/02 无线电
杏林同学录(七)
2006/10/09 PHP
使用XDebug调试及单元测试覆盖率分析
2011/01/27 PHP
PHP实现Soap通讯的方法
2014/11/03 PHP
PHP中使用file_get_contents post数据代码例子
2015/02/13 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
2019/10/11 PHP
js 解决“options为空或不是对象”
2008/12/22 Javascript
JavaScript中switch判断容易犯错的一个细节
2014/08/27 Javascript
基于jQuery实现页面搜索功能
2020/03/26 Javascript
AngularJS中的包含详细介绍及实现示例
2016/07/28 Javascript
js replace()去除代码中空格的实例
2017/02/14 Javascript
nodeJS实现简单网页爬虫功能的实例(分享)
2017/06/08 NodeJs
angularjs中判断ng-repeat是否迭代完的实例
2018/09/12 Javascript
详解vue-template-admin三级路由无法缓存的解决方案
2020/03/10 Javascript
JavaScript 引用类型实例详解【数组、对象、严格模式等】
2020/05/13 Javascript
基于JavaScript或jQuery实现网站夜间/高亮模式
2020/05/30 jQuery
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
2020/08/11 Javascript
[05:35]DOTA2英雄梦之声_第13期_拉比克
2014/06/21 DOTA
python批量下载图片的三种方法
2013/04/22 Python
Ruby元编程基础学习笔记整理
2016/07/02 Python
Python格式化输出%s和%d
2018/05/07 Python
Django 全局的static和templates的使用详解
2019/07/19 Python
移动Web—CSS为Retina屏幕替换更高质量的图片
2012/12/24 HTML / CSS
英国最大的宠物食品和宠物用品网上零售商: Zooplus
2016/08/01 全球购物
标准的毕业生自荐信
2014/04/20 职场文书
2014年客户经理工作总结
2014/11/20 职场文书
2015年小学图书室工作总结
2015/05/18 职场文书
建国大业电影观后感
2015/06/01 职场文书
观后感开头
2015/06/19 职场文书
机械原理课程设计心得体会
2016/01/15 职场文书
如何利用JavaScript实现二叉搜索树
2021/04/02 Javascript
mysql批量新增和存储的方法实例
2021/04/07 MySQL
Mysql数据库值的添加、修改、删除及清空操作实例
2021/06/20 MySQL
总结Python连接CS2000的详细步骤
2021/06/23 Python
Python编程编写完善的命令行工具
2021/09/15 Python