master
/ 2.6.3 比较运算.ipynb

2.6.3 比较运算.ipynb @masterview markup · raw · history · blame

Notebook

比较运算

比较运算符用于比较两个值,并确定他们之间的关系,结果是__逻辑值____True____False__。</font>

共8种比较运算:

  • 2 种一致性比较(==、!=)
  • 4 种次序比较(<、>、<=、>=)
  • 2 种标识号比较(is 和is not)

这些比较运算符的优先级相同,比布尔运算优先级高。比较运算符可以连续使用,例如: x < y <= z 相当于同时满足条件 x < y and y <= z,x is y == z 相当于x is y and y == z。比较运算与成员运算的优先级也相同,成员运算符 in 也可以与比较运算符一起连续使用。

In [2]:
# 输入Python考试成绩并为浮点数
score = float(input())
# 若成绩在90分以上且不大于100分,输出“优秀”
if score >= 90 and score <= 100:  # 逻辑与
    print("优秀")
if 100 >= score >= 90:            # 连续比较,推荐使用
    print("优秀")
优秀
优秀

Python 所有的内建类型都支持比较运算,不同的类型的比较方式不一样。一致性比较 (== 和 !=)基于对象的值,具有相同值的实例一致性比较结果为相等。 内置数值类型 (int, float, complex) 以及标准库类型 fractions.Fraction(分数运算) 和 decimal.Decimal(精确运算)可进行类型内部和跨类型的比较,复数不支持次序比较。在类型相关的限制以内,他们会按数学规则进行比较且不会有精度损失。

In [3]:
from fractions import *

print(2 == 2.0)           # 整数与浮点数比较 True
print(2 < Fraction(5, 3)) # 与分子为5,分母为3的分数比较,False
True
False

字符串使用内置函数 ord()获取其字符的 Unicode 码数字值按字典顺序进行比较。元组、列表和range等序列只可进行类型内部的比较,range不支持次序比较。以上对象的跨类型一致性比较结果将是不相等,跨类型次序比较将引发 TypeError异常。

In [ ]:
print(ord('a'), ord('h'))     # 97 104
print('abc' < 'hello')        # 第一个字符就比较出结果,True
print([1, 2, 3] < [1, 2, 4])  # True

数值类型会根据数字大小和正负进行比较,而字符串会根据字符串序列值进行比较。int、float等同属于数值类型,可以相互比较,其他如数值、字符串等不同类型的对象不能直接进行比较运算。None和任何其他的数据类型比较永远返回False。None 是单例对象,PEP 8 建议单例对象的比较应当总是通过 is 或 is not 而不是等于运算符来进行。 运算符 is 和 is not 用于检测对象的标识号是否相同,也就是比较两个对象的存储单元是否相同,对象的标识号可使用 id() 函数来确定。当且仅当 x 和 y 是同一对象,即仅当id(x) == id(y)时, x is y 结果为True。x is not y 会产生相反的逻辑值,即当id(a) != id(b)时,引用的不是同一个对象,返回结果 True,否则返回 False。比较运算符的描述如表 3.1 所示。默认的一致性比较 (== 和 !=) 是基于对象的标识号。

具体见下表。

运算符 含义 描述 实例(设a = 5, b = 10, c = 10)
== 等于 比较a、b两个对象是否相等 (a == b) 返回值 False
!= 不等于 比较a、b两个对象是否不相等 (a != b) 返回值 True
> 严格大于 返回a是否大于b (a > b) 返回值 False
< 严格小于 返回a是否小于b。返回1表示真,返回0表示假,分别True和False等价 (a < b) 返回值 True
>= 大于等于 返回a是否大于等于b (a >= b) 返回值 False
<= 小于等于 返回a是否小于等于b (a <= b) 返回值 True
is 同一对象 当且仅当 x 和 y 是同一对象时 x is y 为真,即要求x和y的类型、值和id均相同时为True。 (c is b) 返回值 True
is not 不同对象 当且仅当 x 和 y 不是同一对象时 x is not y 为真,即要求x和y的类型、值和id其中任一项不相同时即为True。 (a is not b) 返回值 True
  • ### 数值类型会根据__数字大小和正负__进行比较,整数和浮点数可以跨类型比较。
    浮点数比较时精度会影响结果
In [3]:
print(100 > 99)           # True
print(3.14 > 3.141)       # False
print(1.0 == 1)           # True,值相等的不同对象
True
False
True
  • ### __浮点数比较时精度会影响结果,一般不做相等比较__
In [2]:
print(1e18 == 1e18 + 10)  # True,大浮点数比较精度影响结果
  • ### __字符串比较__根据其字符的__Unicode 码数字值__大小,按字典顺序进行

image.png

In [5]:
print('ji lin' > 'ji an')   # True
# ord()获取字符Unicode码数字值
print([ord(y) for y in 'ji lin'])
print([ord(x) for x in 'ji an'])

  • ### 元组、列表和range等序列只可进行__类型内部__的比较,比较方法是依次比较元素的值。
In [4]:
print([1, 2, 3, 4] > [1, 2, 3])   # True
print ([1, 2, 3, 4] > [3, 2, 3])  # False
print((1, 2, 3, 4) > (1, 2, 3))   # True
print ((3, 2, 3) > (1, 2, 3))     # True
print(range(5) == range(0,5))     # True
True
False
True
True
True

特别的,__range不支持次序比较__

In [8]:
print(range(5) > range(8))
  • ### __不同序列类型__不支持型次序比较,跨类型次序比较将引发TypeError异常。
In [4]:
print([1, 2, 3, 4] > (1, 2, 3))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/tmp/ipykernel_219/1028083632.py in <module>
----> 1 print([1, 2, 3, 4] > (1, 2, 3))

TypeError: '>' not supported between instances of 'list' and 'tuple'
In [10]:
print(0 > None)
  • ### __跨类型一致性比较__结果将是__不相等__
In [11]:
print([1, 2, 3, 4] == (1, 2, 3, 4)) # False
print([1, 2, 3, 4] == range(1, 5))  # False

__None__和任何其他的数据类型的一致性比较永远返回__False__

In [12]:
print(range(0) == None)   # Range, False
print([] == None)         # 空列表, False
print('' == None)         # 空字串符, False
print(0 == None)          # 整数0 , False
  • ### 运算符 __is____is not__ 用于检测是否同一个对象,要求__类型、值与标识号__均相同

当且仅当 x 和 y 是同一对象时 x is y 为真,即要求x和y的类型、值和id均相同时为True,否则为False。

当且仅当 x 和 y 不是同一对象时 x is not y 为真,即要求x和y的类型、值和id其中任一项不相同时即为True。

In [6]:
a = 5
b = 5.0

print(a == b)           # True,值相等,但数据类型不同
print(id(a), id(b))     # 两个不同的id值
print(id(a) == id(b))   # False

print(a is b)           # False
print(a is not b)       # True
True
11147296 139927034189136
False
False
True
In [1]:
print([1, 2] == [1, 2, 3, 4])          # 两个列表值不同 False
print(id([1, 2]) == id([1, 2, 3, 4]))  # True
print(id([1, 2]), id([1, 2, 3, 4]))    # 1387046221120 1387046221120
print([1, 2] is [1, 2, 3, 4])          # 两个对象值不同 False
In [5]:
ls = [1, 2]
lst = [1, 2, 3, 4]

print(ls == lst)          # 两个列表值不同 False
print(id(ls) == id(lst))  # 不同对象,False
print(id(ls), id(lst))    # 地址不同1750617592064 1750618649920
print(ls is lst)           # 两个对象值不同 False
False
False
139927016510320 139927016635760
False
In [18]:
c = int('10')
d = 20 // 2
print(c == d)           # True,值相等
print(id(c), id(d))     # 两个相同同的id值
print(id(c) == id(d))   # True
print(c is d)           # True
print(c is not d)       # False

  • ### 比较运算符可以连续使用
    x < y <= z 
    90 <= score <= 100
    
    等价于
    x < y and y <= z
    score >= 90 and score <= 100
    
In [2]:
score = int(input())
if 0 <= score <= 100:  # if 0 <= score and score <= 100:
    print('这是合法成绩')
else:
    print('这是非法成绩')

练一练

完成下面的程序,根据输入的预测气温,输出相应的高温警报信息。

用户输入一个浮点数的气温,根据输入值与下面的高温警报规则表,输出对应的高温警报信息。

气温范围 警告信息
气温$<35^{\circ}C$ 无高温警告
$35^{\circ} C\le$气温$<37^{\circ}C$ 高温黄色警告
$37^{\circ} C\le$气温$<40^{\circ}C$ 高温橙色警告
气温$\ge 40^{\circ}C$ 高温红色警告

输入输出样例:

输入:32
输出:无高温警告

输入:39
输出:高温橙色警告

提示:考虑大小写,元音字母包括A、E、I、O、U、a、e、i、o、u

In [ ]:
temp = float(input())
if temp < 35:
    print('无高温警告')
# 参考上面的代码,实现题目要求