运算符与表达式
Posted 喵吉欧尼酱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运算符与表达式相关的知识,希望对你有一定的参考价值。
运算符 运算符 名称 说明 + 加 两个对象相加,也可以字符串拼接 - 减 得到负数或是一个数减去另一个数 * 乘 两个数相乘 或是返回一个被重复若干次的字符串 ** 幂 返回x的y次幂 / 除 x除以y // 取整除 返回商的整数部分 % 取模 返回除法的余数 # 8%3得到2。 -25.5%2.25得到1.5 << 左移 把一个数的二进制向左移一定数目 # 2 << 2得到8 >> 右移 把一个数的二进制向右移一定数目 # 11 >> 1得到5 & 按位与 数的按位与 # 5 & 3得到1。 | 按位或 数的按位或 # 5 | 3得到7。 ^ 按位异或 数的按位异或 # 5 ^ 3得到6 ~ 按位翻转 x的按位翻转是-(x+1) # ~5得到6。 < 小于 返回x是否小于y > 大于 返回x是否大于y <= 小于等于 返回x是否小于等于y >= 大于等于 返回x是否大于等于y == 等于 比较对象是否相等 != 不等于 比较两个对象是否不相等(python3删除了“<>”符号) not 布尔“非” 如果x为True,返回False。如果x为False,它返回True。 # x = True; not x返回False。 and 布尔“与” 如果x为False,x and y返回False,否则它返回y的计算值。 # x=False; y=True; x and y返回False。 or 布尔“或” 如果x是True,它返回True,否则它返回y的计算值。# x = True; y = False; x or y返回True。 in, not in 成员测试 (由类里面的 __contains__ 函数指定返回值) is, is not 同性测试 (两值的 is 运算是判断引用,与“==”的比较有所不同) 说明: 1.加号“+”:有数学相加,也有字符串拼接作用,注意:不能字符串和数字相加。如: 3 + 5得到8; ‘a‘ + ‘b‘得到‘ab‘。 2.乘号“*”:两个数相乘,也可以把字符串重复拼接若干次,如: 2 * 3得到6; ‘la‘ * 3得到‘lalala‘。 3.幂“**” :这种写法,其他语言好像没见到过,如: 3 ** 4得到81(即3 * 3 * 3 * 3) 4.除号“/”:整数的除法得到整数结果,浮点数的得到浮点数,如:4/3得到1(返回相除后结果的向下取整(floor)); 4.0/3或4/3.0得到1.333... 注意:Python 3.0开始,移除了含糊的除法符号(‘/‘),而只返回浮点数。如:4/3得到1.333... 5.取整除“//”:将两数相除,然后对结果取整,如: 7 // 3得到2; 4 // 3.0得到1.0 6.比较运算符:所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量 True 和 False 等价。注意大小写。 如果两个操作数都是数字,它们首先被转换为一个共同的类型(如double)。否则,它总是返回 False 。 5 < 3返回0(即False); 而3 < 5返回1(即True)。比较可以被任意连接: 3 < 5 < 7返回True。 大于、小于、小于等于、大于等于时:数字跟数字可以比较,字符串跟字符串可以比较,但数字不能跟字符串比较。 等于、不等于时: 数字跟数字可以比较,字符串跟字符串可以比较,数字跟字符串比较返回 False (表示不相等) 等于: Python 使用“==”来做比较,用“=”来赋值。但不允许内嵌的赋值,所以不会出现你本以为在做比较而意外的写成赋值的情况。 7.布尔运算: and 和 or 都是短路运算,没有非短路运算的运算符。 短路运算:当前面一个表达式可以决定结果时,后面的语句不用再判断。非短路运算时,还照样判断后面的。 注意:在 and or 运算中,空字符串‘‘,数字0,空列表[],空字典{},空元组(), None,在逻辑运算中都被当作假来处理。 8.and 和 or 的特殊用法: 由于语言的松散性,用 and 和 or 在赋值语句时有判断作用。 1) or 用在赋值语句里,返回第一个逻辑为真的值, 没有逻辑为真的返回最后一个。(如下这写法比较常用) 如:ss = False or None or 0 or ‘‘ or -1 or ‘sss‘; print(ss) # 打印:-1 (-1作if判断时返回 True) 设定预设值的写法: edittype = edittype or "text"; # 如果 edittype 之前有值,则取之前的值; 之前为空,则取默认值 2) and 用在赋值语句里,与 or 刚好相反,返回第一个逻辑为假的值, 没有逻辑为假的返回最后一个。 如: a = 0 and 1; print(a) # 打印: 0 a = 2 and 1; print(a) # 打印: 1 应用: valid = True; valid = valid and checkLength(name, 16); valid = valid and checkLength(name, 16); # 如果前面的验证不通过,则后面的不再验证 简便的记忆是: and 偏 False, or 偏 True 要理解 and 和 or 的这种写法,得考虑到它的短路运算特性。它是在做逻辑判断,但返回的是前或后一个的值,而不是返回 True 或 False 。 9.三目运算符: Python 没有三目运算符“cond ? a : b”,但可以使用 and 和 or 来代替(需理解前面的 and 和 or 的特殊用法),如下: 1) c = cond and a or b # 这多数情况下是正确的,但当 a 是空字符串‘‘、数字0等逻辑运算为假的情况下会出错。 2) c = (cond and [a] or [b])[0] # 即使 a或者b为一个逻辑假的值,将他放入集合中后,就为真了,也就是[False] [None]都不为假。 3) c = (b, a)[cond and 1 or 0] # 注意 a和b的位置是颠倒的,将表达式结果转成1和0来作为元组下标而选择结果。 4) c = a if cond else b # 使用 if else 写条件(python特有的写法,建议使用,前3种写法难理解也容易出错) 10.自增,自减: Python 没有“++”和“--”两个语法,自增自减时只能写: i = i + 1 或者 i += 1, 不能用 i++ 这在一定程度上避免出错,因为新手经常搞错“++”放前面还是放后面; 但这也导致 for 循环的写法与其它语言很不同 11.switch/case 语句 Python现在不支持这语句,但可以用 range(N) 生成一个 列表 12.一次性的多比较 “ if (0 < n < 4000) ”这种写法在python是允许的,它等价于“ if ((0 < n) and (n < 4000)) ”但前者更适合阅读。 运算符优先级 下面这个表给出Python的运算符优先级,从最低的优先级(最松散地结合)到最高的优先级(最紧密地结合)。 在一个表达式中,Python会首先计算下表中较下面的运算符,然后在计算列在下表上部的运算符。 在下表中列在同一行的运算符具有 相同优先级 。例如,+和-有相同的优先级。 建议使用圆括号来分组运算符和操作数,以便能够明确地指出运算的先后顺序,使程序尽可能地易读。例如,2 + (3 * 4)显然比2 + 3 * 4清晰。 运算符 描述 lambda Lambda表达式 or 布尔“或” and 布尔“与” not x 布尔“非” in,not in 成员测试 is,is not 同一性测试 <,<=,>,>=,!=,== 比较 | 按位或 ^ 按位异或 & 按位与 <<,>> 移位 +,- 加法与减法 *,/,% 乘法、除法与取余 +x,-x 正负号 ~x 按位翻转 ** 指数 x.attribute 属性参考 x[index] 下标 x[index:index] 寻址段 f(arguments...) 函数调用 (experession,...) 绑定或元组显示 [expression,...] 列表显示 {key:datum,...} 字典显示 ‘expression,...‘ 字符串转换 计算顺序 默认地,运算符优先级表决定了哪个运算符在别的运算符之前计算。然而,如果要改变它们的计算顺序,得使用圆括号。 例如,你想要在一个表达式中让加法在乘法之前计算,那么你就得写成类似(2 + 3) * 4的样子。 结合规律 运算符通常由左向右结合,即具有相同优先级的运算符按照从左向右的顺序计算。例如,2 + 3 + 4被计算成(2 + 3) + 4。 一些如赋值运算符那样的运算符是由右向左结合的,即a = b + c被处理为a = (b + c)。 is 用于判断两个引用所指的对象是否相同 与“==”的比较有所不同 与内置函数 id() 的判断一样 #在Python中,整数和短小的字符,Python都会缓存这些对象,以便重复使用。当我们创建多个等于1的引用时,实际上是让所有这些引用指向同一个对象。 a = 1 b = 1 print(a is b) # True print(id(a), id(b)) # (8423888, 8423888) a = "good" b = "good" print(a is b) # True a = "very good morning" *10 b = "very good morning" *10 print(a is b) # False (短字符串会缓存,长的就不会了,具体长度未知) a = [] b = [] print(a is b) # False print(id(a), id(b)) # (30353488, 30351768) 可以使用 sys 包中的 getrefcount(),来查看某个对象的引用计数 需要注意的是,当使用某个引用作为参数,传递给 getrefcount() 时,参数实际上创建了一个临时的引用。因此, getrefcount() 所得到的结果,会比期望的多1。 from sys import getrefcount a = [1, 2, 3] print(getrefcount(a)) # 2 b = a print(getrefcount(a)) # 3 print(getrefcount(b)) # 3
以上是关于运算符与表达式的主要内容,如果未能解决你的问题,请参考以下文章