这两天忙着去核酸检测点帮忙了,故今天才更新,而不是我偷懒!!
运算优先级
1.先运算两个3**2,于是变成30-9+8//9*10,然后就是简单的四则运算。//的优先级和*、/一样。结果是21
2.%的优先级和*、/、//一样。于是变成3*16/8%5,结果是1.0(陷阱!结果变成浮点数了,不是1)
3.涉及到结合性的问题,Python 中大部分运算符都具有左结合性,也就是从左到右执行;只有 ** 乘方运算符、单目运算符(例如 not 逻辑非运算符)、赋值运算符和三目运算符例外,它们具有右结合性,也就是从右向左执行。于是先计算2**3,再计算2**8,结果是256
4.4j看成0+4j,于是变成(10j-5)/2,结果是-2.5+5j。
(复数乘法:设z1=a+bi,z2=c+di是任意两个复数,则它们的和是 (a+bi)+(c+di)=(a+c)+(b+d)i)
(复数除以实数:实部虚部同时除)
运算符说明 | Python运算符 | 优先级 | 结合性 | 优先级顺序 |
---|---|---|---|---|
小括号 | ( ) | 19 | 无 | 高 ︿ | | | | | | | | | | | | | | | | | | | | | | 低 |
索引运算符 | x[i] 或 x[i1: i2 [:i3]] | 18 | 左 | |
属性访问 | x.attribute | 17 | 左 | |
乘方 | ** | 16 | 右 | |
按位取反 | ~ | 15 | 右 | |
符号运算符 | +(正号)、-(负号) | 14 | 右 | |
乘除 | *、/、//、% | 13 | 左 | |
加减 | +、- | 12 | 左 | |
位移 | >>、<< | 11 | 左 | |
按位与 | & | 10 | 右 | |
按位异或 | ^ | 9 | 左 | |
按位或 | | | 8 | 左 | |
比较运算符 | ==、!=、>、>=、<、<= | 7 | 左 | |
is 运算符 | is、is not | 6 | 左 | |
in 运算符 | in、not in | 5 | 左 | |
逻辑非 | not | 4 | 右 | |
逻辑与 | and | 3 | 左 | |
逻辑或 | or | 2 | 左 | |
逗号运算符 | exp1, exp2 | 1 | 左 |
(表格来源:Python运算符优先级和结合性一览表 (biancheng.net))
凯撒密码
这题看着简单,就是一个将输入字母转化为unicode码一通操作后再转回字母并输出。一般想到的思路都是分为a-w、x-z两类处理。但是书上例题没有分类处理,原理是考虑到字母加密方式是相对的,即无关字母本身的unicode码。为了防止xyz加密后溢出成小写字母以外的符号,所以采用计算和字母a之间的距离来保证ord(p)-ord('a')+3)%26中unicode的取值范围在0-25,ord('a')+25刚好对应字母表最后一个字母从而实现目的。
另:书上例题不完全,原题是要求特殊字符不转换处理,怪不得我else那行看了半天。
Note:Python用的是Unicode码,只占一个字节。C语言用的是ASCII码,中2英1.
plaincode=input('请输入明文')
for p in plaincode: #字符串遍历
if ord('a')<=ord(p)<=ord('z'):
p=chr(ord('a')+(ord(p)-ord('a')+3)%26) #算出与字母a的距离,即Unicode码差。保证xyz转换时不会溢出
print(p,end=' ')
else:
print(p)
字符串处理
s代表字符串名 e.g s=‘helloworld’
1.s.[::3]表示切片范围从字符串头到尾且步长为3,结果为hlod
2.s.find('l')表示字符串中出现l的次数,并返回数字,未发现返回-1
3.s.split(' ')表示以空格为分隔符,将前后字符串切片成数组。
字符串大小比较
先比较第一个字母的Unicode值,如果相等, 就比较第二个,以此类推,直到比出位置。
1.‘abcd’>'ab'
2.'acd'>'abd'
3.''<'a' 此时''中有一个字符串结束标记'\0',Unicode编码是0.(类似的'a'中实际由字符a和'\0'组成)
字符串格式化
print("{:>15s}:{:<8.2f}".format('Length',23.87501))
Length:23.88
>15s代表字符串宽度为15,右对齐;<8.2f代表浮点数宽度8,左对齐,保留两位小数
进度条设计
1.第一次调用time.clock()开始计时,第二次调用计算两次时间差,单位为秒,一般是负数,所以输出时在变量前加个符号。
2.用end=''和\r实现单行刷新,但是IDLE自动屏蔽单行刷新。