3.1数字类型及操作
(一)整数类型
- 可正可负,没有取值范围限制
- pow(x,y)函数:计算X的y次方,想算多大算多大
四种进制表现形式
- 十进制:1010,99,-217
- 二进制:以0b或0B开头:0b010,-0B101
- 八进制:以0o或0O开头:0o123,-0O456
- 十六进制:以0x或0X开头:0x9a,-0X89
(二)浮点类型
与数学中实数的概念一致
- 带有小数点及小数的数字
- 浮点数取值范围和小数精度都存在限制,但常规计算可忽略
- 取值范围数量级约-10的308次方至10的308次方,精度数量级10的负16次方。
注意:浮点数间运算存在不确定尾数,不是bug
>>>0.1+0.3
0.4
>>>0.1+0.2
0.3000000000000004
原因:计算机中十进制小数0.1是由53位二进制表示的小数部分,约10^(-16)
二进制表示小数,可以无限接近,但不完全相同
修改:
>>>0.1+0.2==0.3
False
>>>round(0.1+0.2,1)==0.3
True
- round(x,d):对x四舍五入,d是小数截取位数
- 浮点数间运算及比较用round()函数辅助
- 不确定尾数一般发生在10^(-16)左右,round()十分有效
浮点数可以采用科学计数法表示
- 使用字母e或者E作为幂的符号,以10为基数,格式如下:
<a>e<b> 表示a*10^(b)
(三)复数类型
出现频率较少
(四)数字运算操作符
操作符及使用 | 描述 |
---|---|
x+y | 加,x与y之和 |
x-y | 减,x与y之差 |
x*y | 乘,x与y之积 |
x/y | 除,x与y之商 |
x//y | 整数除,x与y之整数商 10//3结果是3 |
+x | x本身 |
-y | y的负值 |
x%y | 余数,模运算 10%3结果是1 |
x**y | 幂运算,x的y次幂,x^y |
二元操作符有对应的增强赋值操作符
- xop=y 即x=xopy,其中,op为二元操作符
类型间可进行混合运算,生成结果为“最宽”类型
- 三种类型存在一种逐渐“扩展”或“变宽”的关系
整数 ->浮点数 ->复数
数字运算函数
函数及使用 | 描述 |
---|---|
abs(x) | 绝对值,x的绝对值 |
divmod(x,y) | 商余,(x//y,x%y),同时输出商和余数。例:divmod(10,3)结果为(3,1) |
pow(x,y[,z]) | 幂余,(x**y)%z,[..]表示参数z可省略。例:pow(3,pow(3,99),10000)结果为4587 |
round(x[,d]) | 四舍五入,d是保留小数位数,默认值为0 |
max(X1,X2,,,,,Xn) | 最大值 |
mix(X1,X2,,,,Xn) | 最小值 |
一些以函数形式提供的数值运算功能
函数及使用 | 描述 |
---|---|
int(x) | 将x变成整数,舍弃小数部分 |
float(x) | 将x变成浮点数,增加小数部分 |
complex(x) | 将x变成复数,增加虚数部分 |
3.2实例3:天天向上的力量
基本问题:持续的价值
问题1:1‰的力量
#DayDayupQ1.py
dayup=(1.001,365)
daydown=pow(0.999,365)
print("向上:{:.2f},向下:{:.2f}".format(dayup,daydown))
问题2:5‰和1%的力量
#DayDayUpQ2.py
dayfactor=0.005
dayup=pow(1+dayfactor,365)
daydown=pow(1-dayfactor,365)
print("向上:{:.2f},向下:{:.2f})"format(dayup,daydown))
问题3:工作日的力量
- 一年365天,一周5个工作日,每天进步1%
- 一年365天,一周2个休息日,每天退步1%
#DayDayUpQ3.py
dayup=1.0
dayfactor=0.01
for i in range(365):
if i % 7 in[6,0]:
dayup=dayup*(1-dayfactor)
else:
dayup=dayup*(1+dayfactor)
print("工作日的力量:{:.2f}".format(dayup))
问题4:工作日的努力
- A君:一年365天,每天进步1%,不停歇
- B君:一年365天,每周工作5天休息2天,休息日下降1%,要多努力呢?
for...in..(计算思维)==>def..while...(“笨办法”试错)
#DayDayUpQ4.py
def dayup(df):
dayup=1
for i in range(365):
if i % 7 in [6,0]:
dayup=dayup*(1-0.01)
else:
dayup=dayup*(1+df)
return dayup
dayfactor=0.01
while dayUP(dayfactor)<37.78:
dayfactor+=0.001
print("工作日的努力参数是:{:.3f}".format(dayfactor))
3.3字符串类型及操作
由0个或多个字符组成的有序字符序列
- 字符串由一对单引号或一对双引号表示
- 字符串是字符的有序序列,可以对其;中的字符进行索引
字符串的序号
正向递增序号和反向递减序号
字符串切片高级用法
使用[M:N:K]根据步长对字符串切片
- <字符串>[M:N],M缺失表示至开头,N缺失表示至结尾
- <字符串>[M:N:K],根据步长K对字符串切片
字符串的特殊字符
转义符\
- 转义符表示特定字符的本意
- 转义符形成一些组合,表达一些不可打印的含义
字符串的操作符
由0个或多个字符组成的有序字符序列
操作符及使用 | 描述 |
---|---|
x+y | 连接两个字符串x和y |
nx或xn | 复制n次字符串x |
x in s | 如果x是s的子串,返回True,否则返回False |
获取星期字符串
#weekNamePrintV1.py
weekStr="星期一星期二星期三星期四星期五星期六星期日"
weekId=eval(input("请输入星期数字(1-7):"))
pos=(weekId-1)*3
print(weekStr[pos:pos+3])
字符串处理函数
函数及使用|描述
len(x)|长度,返回字符串的长度
str(x)|任意类型x所对应的字符串形式
hex(x)或oct(x)|整数x的十六进制或八进制小写形式字符串
Unicode编码
python字符串的编码形式
- 统一字符编码,即覆盖几乎所有字符的编码方式
- 从0到1114111(0*10FFFF)的空间,每个编码对应一个字符
- python字符串中每个字符都是Unicode编码字符
12星座代表字符
for i in range(12):
print(chr(9800+i),end="")
字符串处理方法
方法及使用 | 描述 |
---|---|
str.lower或str.upper() | 返回字符串的副本,全部字符小写/大写 |
str.split(sep=None) | 返回一个列表,由str根据sep被分隔的部分组成 |
str.count(sub) | 返回子串sub在str中出现的次数 |
str.replace(old,new) | 返回字符串str副本,所有old子串被替代为new |
str.center(width[,fillchar]) | 字符串str根据宽度width居中,fillchar可选 |
str.strip(chars) | 从str中去掉在其左侧和右侧chars中列出的字符 |
str.join(iter) | 在iter变量除最后元素外每个元素后增加一个str |
字符串类型的格式化
格式化是对字符串进行格式表达的方式
- 字符串格式化使用.format()方法,用法如下:
<模板字符串>.format(<逗号分隔的参数>)
: 引导符号
<填充> 用于填充的单个字符
<对齐> <左对齐 >右对齐 ^居中对齐
<宽度> 槽设定的输出宽度
<,> 数字的千位分隔符
<.精度> 浮点数小数精度或字符串最大输出长度
<类型> 整数类型 浮点数类型
3.4time库的使用
time库是python中处理时间的标准库
- 时间获取:time() ctime() gmtime()
- 时间格式化:strftime() strptime()
- 程序计时:sleep(),perf_counter()
函数 | 描述 |
---|---|
time() | 获取当前时间戳,即计算机内部时间值,浮点数 |
ctime() | 获取当前时间并以易读方式表示,返回字符串 |
gmtime() | 获取当前时间,表示为计算机可处理的时间格式 |
时间格式化
将时间以合理的方式展示出来
- 格式化:类似字符串格式化,需要有展示模板
- 展示模板由特定的格式化控制符组成
- strftime()方法
函数 | 描述 |
---|---|
strftime(tpl,ts) | tpl是格式化模板字符串,用来定义输出效果。ts是计算机内部时间类型的变量 |
strptime(str,tpl) | str是字符串形式的时间格式化。tpl是格式化模板字符串,用来定义输入效果 |
程序计时
- 程序计时指测量起止动作所经历事件的过程
- 测量时间:perf_counter()
- 产生时间:sleep()
函数 | 描述 |
---|---|
per_counter() | 返回一个CPU级别的精确时间计数值,单位为秒。由于这个计数值起点不确定,连续调用差值才有意义 |
sleep | s拟休眠时间,单位是秒,可以是浮点数 |
3.5文本计数条
需求分析
- 采用字符串方式打印可以动态变化的文本进度条
- 进度条需要能在一行中逐渐变化
问题分析
- 采用sleep()模拟一个持续的进度
- 似乎不那么难
“文本进度条”简单开始
#TextProBarV1.py
import time
scale=10
print("------执行开始------")
for i range(scale+1)
a='*' * 1
b='.' * (scale-i)
c=(i/scale)*100
print("{:^3.0f}%[{}->{}]".format(c,a,b))
time.sleep(0.1)
print("------执行结束------")
单行动态刷新
#TextProBarV2.py
import time
for i in range(101):
print("\r{:3}%".format(i),end="")
time.sleep(0.1)
完整效果
#TextProBarV3.py
import time
scale = 50
print("执行开始".center(scale//2, "-"))
start = time.perf_counter()
for i in range(scale+1):
a = '*' * i
b = '.' * (scale - i)
c = (i/scale)*100
dur = time.perf_counter() - start
print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,dur),end='')
time.sleep(0.1)
print("\n"+"执行结束".center(scale//2,'-'))