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判断windows系统是32位还是64位的方法
May 11 Python
使用python实现rsa算法代码
Feb 17 Python
利用ctypes提高Python的执行速度
Sep 09 Python
浅析Git版本控制器使用
Dec 10 Python
python实现黑客字幕雨效果
Jun 21 Python
Python 字符串换行的多种方式
Sep 06 Python
Python之两种模式的生产者消费者模型详解
Oct 26 Python
python每5分钟从kafka中提取数据的例子
Dec 23 Python
python 安装impala包步骤
Mar 28 Python
python 在右键菜单中加入复制目标文件的有效存放路径(单斜杠或者双反斜杠)
Apr 08 Python
详解用 python-docx 创建浮动图片
Jan 24 Python
Django路由层如何获取正确的url
Jul 15 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统计数组元素个数的方法
2015/07/02 PHP
PHP扩展迁移为PHP7扩展兼容性问题记录
2016/02/15 PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
2016/05/12 PHP
在PHP 7下安装Swoole与Yar,Yaf的方法教程
2017/06/02 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
取得父标签
2006/11/14 Javascript
JavaScript 私有成员分析
2009/01/13 Javascript
javascript 程序库的比较(一)之DOM功能
2010/04/07 Javascript
javascript 单例/单体模式(Singleton)
2011/04/07 Javascript
javascript实现的HashMap类代码
2014/06/27 Javascript
Javascript数组操作函数总结
2015/02/05 Javascript
js继承实现方法详解
2016/12/16 Javascript
基于vue的短信验证码倒计时demo
2017/09/13 Javascript
nodejs中安装ghost出错的原因及解决方法
2017/10/23 NodeJs
Mac中安装nvm的教程分享
2017/12/11 Javascript
react 实现页面代码分割、按需加载的方法
2018/04/03 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
2018/12/19 Javascript
浅谈目前可以使用ES10的5个新特性
2019/06/25 Javascript
详解vue 命名视图
2019/08/14 Javascript
解决vue页面刷新,数据丢失的问题
2020/11/24 Vue.js
解决已经安装requests,却依然提示No module named requests问题
2018/05/18 Python
pyqt远程批量执行Linux命令程序的方法
2019/02/14 Python
详解Python基础random模块随机数的生成
2019/03/23 Python
对django中foreignkey的简单使用详解
2019/07/28 Python
简述python&amp;pytorch 随机种子的实现
2020/10/07 Python
用python对excel查重
2020/12/07 Python
HTML5 声明兼容IE的写法
2011/05/16 HTML / CSS
Perry Ellis官网:美国男士品味服装
2016/12/09 全球购物
阿玛尼美妆加拿大官方商城:Giorgio Armani Beauty加拿大
2017/10/24 全球购物
老干部工作先进集体事迹材料
2014/05/21 职场文书
星级党支部申报材料
2014/05/31 职场文书
小学教师个人工作总结2015
2015/04/20 职场文书
2015年生产车间工作总结
2015/04/22 职场文书
2015年小学语文教师工作总结
2015/10/23 职场文书
大学生安全教育心得体会
2016/01/15 职场文书
Python图片处理之图片裁剪教程
2021/05/27 Python