7.运算符

予早 2024-10-05 10:17:14
Categories: Tags:

算数运算符

# 算术运算符
# +
# -
# *
# **

# 这一点与其他语言很b
# /  浮点除
# // 整数除
# %

Python中没有自增自减运算符

解释角度一

定义一个变量i存储1,不同语言机制不一样。

C语言,int i = 1,会定义变量i并申请一块内存与变量绑定,Python,i = 1,会定义变量i,并申请一块内存与1绑定,C语言与Python均支持i += 1的操作,C语言会对i绑定的内存中数据加1,Python会对i + 1的结果2重新申请内存并与2绑定,然后使得i指向该内存,从最终i += 1的值上看是一致的,但i指向的内存地址发生了变化。

解释角度二

C语言中i++、i--、++i、--i用于简化for循环中变量增减,而Python中提供in关键字,如使用for i in range(...)来简化遍历操作,一定程度上替代了自增自减运算符。

赋值运算符

# 赋值运算符
# =
# +=
# -=
# /=  浮点除等
# //= 整数除等
# *=
# **=

关系运算符

# 关系运算符
# >
# ==
# <
# >=
# <=
# !=
# is
# is not

逻辑运算符

# 逻辑运算符
# 返回表达式的值
# and
# or
# not
# () > not > and > or

print(1 and 2)  # 2
print(0 and 2)  # 0
print(2 and 0)  # 0

print(1 or 2)  # 1
print(0 or 2)  # 2
print(2 or 0)  # 2

print(not 1)  # False
print(not 2)  # False
print(not 0)  # True
print(not '0')
print(not [])  # python判空一个not即可
# 根据表达式结果判定,如果为0,返回可以确定整个表达式真假的表达式的值

print("10" and 0)
print(0 or "10")
print(0 or True)

print(1 and 2 > 1)
print(2 > 1 and 1)
print(2 > 1 or 1)

print("" and 1)  # 特别注意
# 根据逻辑运算符返回表达式的值,如果使用关系运算符,则正好返回bool

位运算符

位运算符
# & 按位与
# | 按位或
# ~ 按位取反
# ^ 按位异或
# << 左移
# >> 右移
print(bool("123") ^ bool(""))

成员操作符

# 成员操作符
# in
# not in 

注:

  1. is用于通过比较内存地址判断两个对象是否相等,==通过比较两个对象指向的数据判断两个对象是否相等,Python中None、True、False是单例的,习惯上使用is进行判断。

  2. if not x中若x为零值,即None、False、0、””、()、[]、{},表达式均为假,在一些场景下直接使用if not x容易导致问题

    # 部分缺失数据计算场景,函数calc_growth_rate(a, b)用于计算a相对于b的增长率,结果返回一个不带百分号的百分数,在数据中,a、b均可能为空,且a、b有可能为0。
    
    # 错误示例,a=0,b=100时的计算结果是有问题的
    def calc_growth_rate(a, b):
        if a and b and b != 0:
            return a / b * 100
        return None
        
    # 正确示例
    def calc_growth_rate(a, b):
        if a is None or not b:
            return None
        return a / b * 100
    

标准运算符对应函数

https://docs.python.org/zh-cn/3/library/operator.html

海象运算符

# 给定一连串分数,返回属于A、B、C三个等级的分数及其等级
scores = [22, 54, 75, 89, 60]


def judge_grade(n):
    print("call once")
    if n >= 90:
        return 'A'
    elif n >= 80:
        return 'B'
    elif n >= 70:
        return 'C'
    elif n >= 60:
        return 'D'
    else:
        return 'F'


# 共计调用七次judge_grade函数,其中每个元素各一次共五次,两个属于A、B、C等级的共两次
score2grade_1 = [(score, judge_grade(score)) for score in scores if judge_grade(score) in ('A', 'B', 'C')]

# 仅需每个元素调用一个judge_grade即可
score2grade_2 = [(score, grade) for score in scores if (grade := judge_grade(score) in ('A', 'B', 'C'))]