zoukankan      html  css  js  c++  java
  • part2-3:Python 运算符(赋值、算术、位运算、索引、比较、逻辑、三目、in、运算符优先级)


    运算符是一种特殊符号,用来表示数据运算、赋值和比较等。运算符将一个或多个操作数连接成可执行语句,用来实现特定功能。Python 中运算符分为如下几种:
    (1)、赋值运算符
    (2)、算术运算符
    (3)、位运算符
    (4)、索引运算符
    (5)、比较运算符
    (6)、逻辑运算符


    一、 赋值运算符

    Python中“=”是赋值运算符,用于为变量或常量指定值。可将表达式的值赋值给另一个变量。例如:
    s1 = 'python' # 将字符串赋值给 s1 变量
    flags = True # 为变量 flags 赋值为 True

    还可以使用赋值运算符将一个变量的值赋值给另一个变量。例如:
    s2 = s1 # 将变量 s1 的值赋值给 s2

    Python 的赋值表达式是有值的,赋值表达式的值就是被赋的值,因此还可以进行连续赋值,例如:
    x = y = z = 30
    这里将 z = 30 表达式的值赋给变量 y,是由于赋值表达式本身也有值,就是被赋的值,因此表达式 z=30 的值是 30,所以 y 也被赋值为 30;以此类推,变量 x 也被赋值为 30。

    赋值运算还可以将表达式的值赋给变量,例如:
    n1 = 1.23
    n2 = n1 + 3 # 将表达式的值赋值给 n2

    二、 算术运算符

    算术运算符用于执行基本的数学运算,如加、减、乘、除和求余等。
    +:加法运算符除可以让数字相加外,还可以作为字符串和序列的连接运算符。示例如下:
    x = 1.1
    y = 2.2
    z = x + y # z 的值是 3.3
    s1 = 'hello, ' + 'michael' # 使用 + 连接两个字符串

    -:减法运算符可让两个数字相减,还可以作为求负运算符。示例如下:
    a = 5.3
    b = 3.1
    c = a - b # c 的值是 2.2
    a = -a # 对 a 求负,此时 a 的值是 -5.3

    *:乘法运算符可让两个数字相乘。还可作为字符串或序列的连接运算符,表示将 N 个字符串连接起来。示例如下:
    multiply = 5 * 3.14 # 两个数字相乘
    print("hello," * 5) # 使用 乘法(*) 将字符串连接起来,输出:hello,hello,hello,hello,hello,

    /或//:除法运算符有两个:“/” 是普通除法,除不尽时产生小数;“//”是整除,结果只有商的整数部分,小数部分被丢弃。示例如下:
    print(20/6) # 普通除法,输出是:3.3333333333333335
    print(20//6) # 整除法,输出是:3

    在Python中的除法运算,除数不能为0,否则报 ZeroDivisionError错误。在Python2 中只有一个“/”除法运算符。当两个操作数都是
    整数时就是整除,其中有一个是浮点数时,就是非整除运算。

    %:求余运算符,求余运算符的两个操作数可以是整数,也可以是小数。求余的结果不一定是整数,它是第一个操作数除以第二个操作数,
    得到一个整除的结果后剩下的值就是余数
    。求余运算的第二个操作数同样不能为0,否则报 ZeroDivisionError错误。示例如下:
    print(7%5) # 整数求余,输出是:2
    print(7.3%5.1) # 浮点数取余,输出是:2.2
    print(-7.3%-5.1) # 浮点数取余,输出是:-2.2
    print(7.3%-5.1) # 第二个操作数为负数,输出是:-2.8999999999999995
    print(7.3%-2.3) # 第二个操作数为负数,输出是:-1.8999999999999995
    print(-7.3%2.3) # 第一个操作数为负数,输出是:1.8999999999999995
    print(7%0) # 第二个操作数不能为0,报 ZeroDivisionError错误

    在上面的示例中,第四个算式的计算结果为什么不是 -2.9?在Python中求余运算的逻辑是用被除数减去除数的N倍,这里N是 -2,所以得到的结果应该是-2.9。但实际结果是-2.8999999999999995,这是由于浮点数在存储机制导致的。计算机底层的浮点数的存储机制并不是精确保存每一个浮点数的值,浮点数在Python中可能产生精度丢失的问题。比如这里正常的计算结果是-2.9,但实际计算的结果是一个非常接近-2.9的值。

    **:乘方运算符。一个方便的运算符,开方运算是乘方运算的逆运算,用“**”可以进行开方运算。示例如下:
    print(3**3) # 3的3次方,输出是:27
    print(3**(1/2)) # 3的平方根,输出是:1.7320508075688772
    print(2**(1/2)) # 2的平方根,输出是:1.4142135623730951

    三、 位运算符

    位运算常用在图形、图像处理,和创建设备驱动等底层开发中使用。使用位运算可以直接操作数值的原始bit位,在使用自定义的协议进行通信时,使用位运算符对原始数据进行编码和解码了非常有效。

    Python中位运算符有下面6个:
    &:按位与,需要2个操作数
    |:按位或,需要2个操作数
    ^:按位异或,需要2个操作数
    ~:按位取反,需1个操作数
    <<:左位移运算符,需要2个操作数
    >>:右位移运算符,需要2个操作数

    示例如下,下面示例中省略了前面24个0:
    print(3 & 6) # 00000011 & 00000110 = 00000010,输出:2
    print(3 | 6) # 00000011 | 00000110 = 00000111,输出:7
    print(~5) # 正数5按位取反,输出是:-6
    print(~-5) # 负数5按位取反,输出是:4

    正数的原码、反码、补码都是相同的。负数的原码最高位表示符号位,取反码时符号位保持不变,反码加1得到补码。
    -5的原码:1000 0000 0000 0000 0000 0000 0000 0101 # 最高位1是符号位
    -5的反码:1111 1111 1111 1111 1111 1111 1111 1010 # 反码是原码按位取反,符号位保持不变
    -5的补码:1111 1111 1111 1111 1111 1111 1111 1011 # 反码加1得到补码
    4的原码:0000 0000 0000 0000 0000 0000 0000 0100 # 对-5的补码按位取反就得到正的二进制数,可直接计算结果,即4的原码

    5原码: 0000 0000 0000 0000 0000 0000 0000 0101 # 正数的原码
    ~5的结果:1111 1111 1111 1111 1111 1111 1111 1010 # 按位取反后最高位符号位是负数,得到的是负二进制数
    计算反码: 1000 0000 0000 0000 0000 0000 0000 0101 # 对负二进制数按位取反得到反码,符号位保持不变
    得到补码: 1000 0000 0000 0000 0000 0000 0000 0110 # 反码加1得到补码,用补码直接计算结果得 -6

    取反小结:
    (1)、取反后正数变负数,负数变正数。
    (2)、取反后,如果结果为负数,要计算它的补码,根据补码得到最后的十进制结果。
    (3)、取反后,如果为正数,则其原码、反码、补码一样,可以直接计算出十进制结果。
    (4)、整数的取反运算等于该整数加1后,再对结果取负数运算,用公式总结就是:~x = -(x+1)

    print(5^7) # 5异或7,输出是:2
    print(5<<2) # 5左移2位,输出是:20
    print(-5<<2) # -5左移2位,输出是:-20
    print(5>>2) # 5右移2位,输出是:1
    print(-5>>2) # -5右移2位,输出是:-2

    左移是将操作数的二进制码整体左移指定位数,左移后右边空出来的位以0填充。负数左移时,要先计算其补码,使用补码左移后得到值。右移是将操作数的二进制码右移指定位数后,左边空出来的位以原来的符号位填充。即:如果第一个操作数原来是正数,则左边补0;如果第一个操作数是负数,则左边补1。负数右移时,同样要先计算补码,根据补码右移。

    位移运算只适合对整型数进行运算

    在进行位移运算时,左移n位相当于乘以2的n次方,右移n位则相当于除以2的n次方(如果不能整除,实际返回的结果是小于除得结果数值的最大整数的)。位移运算不会改变原来的操作数本身。

    四、 赋值运算符扩展

    赋值运算可以与算术运算符、位移运算符等结合。扩展后的赋值运算符如下:
    x += y:相当于 x = x + y
    x -= y:相当于 x = x - y
    x *= y:相当于 x = x * y
    x /= y:相当于 x = x / y
    x //= y:相当于 x = x // y
    x %= y:相当于 x = x % y
    x **= y:相当于 x = x ** y
    x &= y:相当于 x = x & y
    x |= y:相当于 x = x | y
    x ^= y:相当于 x = x ^ y
    x <<= y:相当于 x = x << y
    x >>= y:相当于 x = x >> y

    五、 索引运算符

    索引运算符在字符串中经常使用,对应的符号是方括号([]),在方括号中可以使用单个索引值,还可以使用索引范围。在使用索引范围时,还可指定步长。示例如下:
    s = "hellopython"
    print(s[3:10:2]) # 获取索引3到10的子串,步长为2,输出:lpto
    print(s[3:10:3]) # 获取索引3到10的子串,步长为3,输出:lyo

    六、比较运算符与 bool 类型

    Python中的 bool 类型有两种值:真(True)和 假(False)。在Python中,不等于0的数字(包括负数)都是True,字符或字符串也是True。等于0的数字或者空值为False。此外,True 还可当做数字1进行算术运算,False 可当做数字0进行算术运算

    比较运算符判断两个值(变量、常量、表达式均可)之间的大小,运算结果为真 或 假值。Python中的比较运算符有如下这些:
    大于(>)、大于或等于(>=)、小于(<)、小于或等于(<=)、等于(==)、不等于(!=)、判断两个变量引用的对象是否相同(is)、判断两个变量引用的对象是否不相同(is not)。示例如下:
    print(5>4) # 输出:True
    print(5>4>3) # 实际做的比较是:5>4 and 4>3,输出是:True
    print(5>4 and 4>3) # 输出是:True
    print(3 ** 3 >= 28) # 3的3次方是否大于或等于28,输出是:False
    print(10 >= 10.0) # 10 是否大于或等于 10.0,输出是:True
    print(10 == 10.0) # 10 是否等于 10.0,输出是:True
    print(True == 1) # True 是否等于数字 1,输出是:True
    print(False == 0) # False 是否等于数字 0,输出是:True
    print(True + False) # 输出:1
    print(False - True) # 输出:-1

    等于(==)与 is 的区别,== 只比较两个变量的值,is 是判断两个变量是否引用同一个对象。Python有一个全局(内置)函数可判断变量所引用的对象的内存地址(对象在计算机中存储的门牌号),如果两个对象所在的内存地址相同(计算机同一块内存在任一时刻只能存放一个对象),则说明这两个对象其实是同一个对象。is 就是通过 id() 函数计算两个对象时判断返回的地址是否相同。示例如下:
    import time
    a = time.gmtime()
    b = time.gmtime()
    print(a == b) # 输出是:True
    print(a is b) # 输出是:False
    print(id(a))
    print(id(b)) # a 和 b 的内存地址不一样,所以 a is b 是False

    七、 逻辑运算符

    逻辑运算符用于操作 bool 类型的变量、常量、表达式,逻辑运算的返回值也是 bool 值。逻辑运算符有下面三个:
    逻辑与(and):两个操作数都为True,才返回True,否则返回False。
    逻辑或(or):两个操作数中有一个为True,就返回True。两个都为False时,才返回False。
    逻辑非(not):只要一个操作数,用常于反转条件,当操作数为True,则返回False;当操作数为False,则返回True。

    示例如下:
    print(not True) # 对True取非运算,输出是:False
    print(5>4 and 4>3) # 同时判断两个条件,输出是:True
    print("4" > "5" or "b" > "a") # 输出:True

    当使用多个逻辑运算组合成复杂的逻辑时,通常要使用圆括号来明确运算顺序,同时也提高程序的可读性。

    八、三目运算符

    Python中通过 if 语句实现三目运算符功能。语法格式如下:
    True_statements if expression else False_statements
    首先对逻辑表达式(expression)求值,如果 expression 返回 True,则执行并返回 True_statements 的值;如果 expression 返回 False,则执行并返回 False_statements 的值。示例如下:
    x = 8
    y = 5
    res = "x大于y" if x > y else "x小于y"
    print(res) # 输出:x大于y
    print("x大于y") if x > y else print('x小于y') # 还可使用这种形式的三目运算符
    print("x大于y" if x > y else 'x小于y') # 使用这种形式也是可以的

    在True_statements 或 False_statements 中可以放置多条语句。支持的主要方式有两种:
    (1)、多条语句以英文逗号隔开:每条语句都会执行,程序返回多条语句的返回值组成的元组。
    (2)、多条语句以英文分号隔开:每条语句都会执行,程序只返回第一条语句的返回值。


    对于第一种情况,示例如下:
    res = print("python"), "x大于y" if x > y else "x小于y" # 执行这条语句输出:python
    print(res) # 输出是:(None, 'x大于y')
    这里的 True_statements 是 (print("python"), "x大于y"),这两条语句都会执行,程序返回这两条语句的返回值组成的元组。
    由于 print() 函数没有返回值,相当于返回值是 None。所以输出是 (None, 'x大于y')。

    将上面语句的逗号改为分号,并且修改逗号之后的语句,示例如下:
    res = print("python"); z = 10 if x > y else "x小于y" # 执行这条语句输出:python
    print(res) # res 只有分号前面语句的返回值,输出:None
    print(z) # 分号后面的语句同样被执行了,所以输出:10

    另外,三目运算符支持嵌套,通过嵌套三目运算符,可执行更复杂的判断。示例如下:
    x = 10
    y = 10
    print("x大于y" if x > y else ("x小于y" if x < y else "x等于y")) # 输出是:x等于y

    九、in运算符

    in 运算符可判断某个成员是否在序列中,例如判断某个字符是否在某个字符串中。in 的反义词是 not in,判断的结果都是 bool 型值。

    print('on' in 'python.org') # 输出:True
    print('on' not in 'python.org') # 输出:False
    print('linux' not in 'python.org') # 输出:True

    十、 运算符的结合性和优先级

    数学运算是从左向右进行的,Python中大部分运算也是从左向右结合的。但是单目运算符、赋值运算符和三目运算符例外,它们是从右向左结合的,也就是从右向左运算的。

    乘法和加法是两个可结合的运算符,这两个运算符左右两边的操作数可以互换位置而不影响结果。

    此外,运算符有不同的优先级,优先级高的会先计算。按优先级从高到低排列,如下所示:
    image
    根据上面的运算符优先级可知,5+5<<2语句的执行顺序是,先执行 5+5 得到结果10,再执行 10<<2 得到40。可以使用圆括号来改变执行顺序,例如 5+(5<<2) 会先执行 5<<2 的结果20与5相加,得到25。

    虽然运算符有优先级顺序,但是不要过度依赖运算符的优先级,这样会造成程序可读性变差。通常一个表达式太复杂,可分成几步来完成。另外,当需要明确执行顺序时,尽量使用圆括号来表示。


    练习二

    # 输入两个整数,并输出这两个整数的整除结果和带小数的除法结果
    num_str = input("请输入两个整数,以空格做分隔:")
    num_list = num_str.split(" ")
    print("%s // %s = %i" % (num_list[0], num_list[1], int(num_list[0]) // int(num_list[1])))
    print("%s / %s = %f" % (num_list[0], num_list[1], int(num_list[0]) / int(num_list[1])))

    # 从标准输入读取两个整数,并打印三行,第一行是两个整数的和,第二是两个整数的差,第三行是两个整数的乘积
    num_str = input("请输入两个整数,以空格做分隔:")
    num_list = num_str.split(" ")
    num1, num2 = int(num_list[0]), int(num_list[1])
    print("%d + %i = %d" % (num1, num2, num1 + num2))
    print("%d - %i = %d" % (num1, num2, num1 - num2))
    print("%d * %i = %d" % (num1, num2, num1 * num2))

    # 输入两个字符串,第一个是字符串,第二个子串,要求判断子串在字符串中出现的次数,如ABCDCDC和CDC,程序输出是2
    fist_str = input("请输入第一个字符串:")
    second_str = input("请输入第二个子串:")
    fist_str_length = len(fist_str)
    second_str_length = len(second_str)
    n = 0
    count = 0
    if second_str_length > fist_str_length:
    print(count)
    elif second_str_length == 1:
    print(fist_str.count(second_str))
    else:
    for _ in range(1, fist_str_length - 1):
    if fist_str[n:second_str_length] == second_str:
    count += 1
    n += 1
    second_str_length += 1
    else:
    n += 1
    second_str_length += 1
    print(count)

    # 输入一个任意整数,输出该整数的十进制、八进制、十六进制、二进制形式的字符串
    num = int(input("请输入一个整数:"))
    print("十进制形式:%s" % num)
    print("八进制形式:%o" % num)
    print("十六进制小写形式:%x" % num)
    print("十六进制大写形式:%X" % num)
    print("二进制形式:%s" % bin(num))

    # 修改字符串,要求输入一个字符,修改字符串中指定的位置,例如 6 @ 表示将字符串中6的位置修改为 @ 符号
    s = input("请输入一个字符串:")
    r = input("请输入修改位置及修改符号,以空格分隔,例如 “6 @”:")
    r_list = r.split(" ")
    index = int(r_list[0])
    s1 = s[0:index] # 如果 index 是 0,则 s[0:0] 是空值
    s2 = s[index+1:]
    print("修改后的字符串是:", s1 + r_list[1] + s2)
  • 相关阅读:
    Linq聚合操作之Aggregate,Count,Sum,Distinct源码分析
    Linq分区操作之Skip,SkipWhile,Take,TakeWhile源码分析
    Linq生成操作之DefautIfEmpty,Empty,Range,Repeat源码分析
    Linq基础操作之Select,Where,OrderBy,ThenBy源码分析
    PAT 1152 Google Recruitment
    PAT 1092 To Buy or Not to Buy
    PAT 1081 Rational Sum
    PAT 1084 Broken Keyboard
    PAT 1077 Kuchiguse
    PAT 1073 Scientific Notation
  • 原文地址:https://www.cnblogs.com/Micro0623/p/11415415.html
Copyright © 2011-2022 走看看