数字类型及操作
整数类型
与数学中整数的概念一致。
- 可正可负,没有取值范围限制
-
pow(x,y)
函数:计算x的y次方,想算多大算多大
四种进制表示形式
- 十进制
- 二进制,以0b或0B开头:0b11
- 八进制,以0o或0O开头:0o7
- 十六进制,以0x或0X开头:0o11
浮点数类型
与数学中实数概念一致。
- 带有小数点及小数的数字
- 浮点数取值范围和小数精度都存在限制,但常规计算可忽略
- 取值范围约为-10^308 ~ 10^308 ,精度等级 10^-16
浮点数间运算存在不确定尾数,不是bug。
十进制浮点数计算经过二进制转换和反向转换,可能出现不确定尾数。
-
round(x,d)
:对x四舍五入,d是小数截取位数 - 浮点数间运算及比较用
round()
函数辅助
浮点数可用科学计数法表示
- 使用e或E作为幂的符号,以10为基数,格式为
<a>e<b>
,表示a*10^b
复数类型
与数学中复数概念一致。
对于复数z=a+bj
-
z.real
获得实部,z.imag
获得虚部
数值运算操作符
完成运算的一种符号体系
-
+
,-
,*
,/
,//
(整数除,商取整数) -
%
余数,模运算,**
幂运算,同pow(x,y)
二元操作符有对应的增强赋值操作符
x op = y,即 x=x op y其中op为二元操作符,即以上七种操作符。
类型间可混合运算,生成结果为“最宽”类型。
- 整数->浮点数->复数
数值运算函数
一些以函数形式提供的数值运算功能
函数及使用 | 描述 |
---|---|
abs(x) |
绝对值 |
divmod(x,y) |
商余,同时输出整数商和余数 |
pow(x,y[,z]) |
幂运算,z为取模数 |
round(x[,d]) |
四舍五入,d为小数位数,默认为0 |
max(x1,x2...,xn) |
返回最大值,个数不限 |
min(x1,x2...,xn) |
返回最小值,个数不限 |
int(x) |
将x变为整数,舍弃小数部分,字符串也可以 |
float(x) |
将x变为浮点数,增加小数部分 |
complex(x) |
将x变为复数,增加虚数部分 |
实例3:天天向上的力量
问题:一年365天,每天进步1%,累计进步多少?每天退步1%,累计剩下多少?
- 进步,1.01^ 365;退步,0.99^365
- 如果是三天打鱼两天晒网?如果工作日进步双休日休息?
问题1:1‰的力量
代码:
#DayDayUpQ1.py
dayup = pow(1.001,365)
daydown = pow(0.999,365)
print("向上:{:2f},向下:{:2f}".format(dayup, daydown))
运行结果:
>>>
向上:1.44,向下:0.69
问题2:5‰和1%的力量
代码:
#DayDayUpQ2.py
dayfactor = 0.005
dayup = pow(1+dayfactor, 365)
daydown = pow(1-dayfactor, 365)
print("向上:{:2f},向下:{:2f}".format(dayup, daydown))
运行结果:
>>>
向上:6.17,向下:0.16
问题3:工作日的力量
工作日进步1%,休息日退步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.63
问题4:工作日的努力
在工作日模式下要努力什么程度才能与每天努力1%相同?
计算思维:试错 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
举一反三
第三问:计算思维
第四问:试错
问题变化和扩展
- 如果休息日不下降?
- 如果工作和休息的时间变化?
- 比例不同?
字符串类型及操作
字符串:由0个或多个字符组成的有序字符序列,由一对单引号或双引号表示。
字符串类型的表示
有2类,四种表示方式
- 由一对单引号或双引号表示,仅表示单行字符串
- 由一对三单引号或三双引号表示,可表示多行字符串
如果希望在字符串中包含双引号或单引号?
- 字符串中和两侧的引号不同
如果希望在字符串中包含双引号和单引号?
- 字符串两侧使用三单引号或三双引号
字符串的序号
字符串的使用
- 索引:返回单个字符,
<字符串>[M]
- 切片:返回多个字符串,
<字符串>[M:N]
- M缺失表示至开头,N缺失表示至结尾
-
<字符串>[M:N:K]
根据步长K对字符串进行切片 -
<字符串>[::-1]
将字符串逆序
特殊字符
转义符 \
- 转义符表达特定字符的本意
结果为"这里有个双引号(\")"
>>> 这里有个双引号(")
- 转义符形成一些组合,表达一些不可打印的含义
"\b"回退;"\n"换行(光标移到下行首);"\r"回车(光标移到本行首)
字符串操作符
操作符及使用 | 描述 |
---|---|
x+y |
连接字符串x和y |
n*x 或x*n
|
复制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])
消去重复的“星期”字符串
#WeekNamePrintV2.py
weekStr = '一二三四五六日'
weekId = eval(input('请输入星期数字(1-7):'))
print('星期' + weekStr[weekId-1])
字符串处理函数
函数及使用 | 描述 |
---|---|
len(x) |
返回字符串x的长度 |
str(x) |
将x转化为字符串类型 |
hex(x) 或oct(x)
|
返回整数x的十六进制或八进制小写形式的字符串 |
chr(u) |
u为Unicode编码,返回其对应的字符 |
ord(x) |
x为字符,返回其对应的Unicode编码 |
字符串处理方法
方法,特指
<a>.<b>()
风格中的函数<b>()
;方法本身也是函数,但与<a>有关;字符串及变量也是<a>
方法及使用 | 描述 |
---|---|
str.lower() 或str.upper()
|
返回字符串的副本,全部为小写或大写 |
str.split(sep=None) |
返回一个列表,由str根据sep被分隔的部分构成 |
str.count(sub) |
返回sub在str中出现的次数 |
str.replace(old,new) |
返回字符串的副本,所有old字符串被替换为new |
str.center(width[,fillchar]) |
字符串根据宽度width居中,填充字符fillchar可选 |
str.strip(chars) |
从字符串中去掉在其左侧和右侧chars中列出的字符 |
str.join(iter) |
在iter变量除最后元素外每个元素后增加一个str,主要用于字符串分隔,如",".join("12345")
|
字符串的格式化
使用.format()
方法,格式为<模板字符串>.format(<逗号分隔的参数>)
槽
{}
为槽。
槽顺序对应format()
中参数的顺序。
在槽中加上数字可规定顺序。
槽内部对格式化的配置方式
形式为{<参数序号>:<格式控制标记>}
: | <填充> | <对齐> | <宽度> | <,> | <.精度> | <类型> |
---|---|---|---|---|---|---|
引导符号 | 用于填充的单个字符 | <左对齐 >右对齐 ^居中对齐 | 槽设定的输出宽度 | 数字的千位分隔符 | 浮点小数精度或字符串最大输出长度 | 整数类型b,c,d,o,x,X 浮点数类型e,E,f,% |
如:填充对齐宽度
>>>"{0:=^20}".format("Python")
'=======Python======='
数字格式设置
>>>"{0:,.2f}".format(12345.6789)
'12,345.68'
模块2:time库的使用
time库基本介绍
time库是Python中处理时间的标准库
- 计算机时间的表达
- 提供获取系统时间并格式化输出功能
- 提供系统级精确计时功能,用于程序性能分析
import time
time.<b>()
time库包括三类函数
- 时间获取:
.time()
.ctime()
.gmtime()
- 时间格式化:
.strftime()
.strptime()
- 程序计时:
.sleep()
.perf_counter()
时间获取
函数 | 描述 |
---|---|
.time() |
获取当前时间戳,即计算机内部时间值,浮点数,从1970年1月1日开始,单位为秒 |
.ctime() |
获取当前时间并以易读方式表示,返回字符串 |
.gmtime() |
获取当前时间,表示为计算机可处理的时间格式time.struct_time()
|
时间格式化
将时间以合理的方式展示出来
- 类似字符的格式化,需要有展示模板
- 展示模板由特定的格式化控制符组成
- 使用
.strftime()
方法
函数 | 描述 |
---|---|
.strftime(tpl, ts) |
tpl是格式化模板字符串,用来定义输出效果;ts是计算机内部时间类型变量 |
格式化字符
格式化字符串 | 日期/时间说明 | 值范围和实例 |
---|---|---|
%Y | 年份 | 0000~9999,例如:1900 |
%m | 月份 | 01~12 |
%B | 月份名称 | January~December |
%b | 月份名称缩写 | Jan~Dec |
%d | 日期 | 01~31 |
%A | 星期 | Monday~Sunday |
%a | 星期缩写 | Mon~Sun |
%H | 小时(24小时制) | 00~23 |
%I | 小时(12小时制) | 01~12 |
%p | 上/下午 | AM,PM |
%M | 分钟 | 00~59 |
%S | 秒 | 00~59 |
>>>t = time.gmtime()
>>>time.strftime("%Y-%m-%d %H:%M:%S",t)
`2018-01-26 12:55:20`
由已知时间字符串,解析处理时间:
>>>timeStr = `2018-01-26 12:55:20`
>>>time.strptime(timeStr, "%Y-%m-%d %H:%M:%S")
time.struct_time(tm_year=2018, tm_mon=1, tm_mday=26, tm_hour=4, tm_min=11, tm_sec=16, tm_wday=4, tm_yday=26, tm_isdst=0)
程序计时应用
- 程序计时指测量起止动作所经历时间的过程
- 测量时间:
.perf_counter()
- 产生时间:
.sleep()
函数 | 描述 |
---|---|
.perf_counter() |
返回一个cpu级别的精确时间计数值,单位为秒。起点不确定,连续调用差值才有意义。start = time.perf_counter() end = time.perf_counter() end - start
|
.sleep(s) |
让程序休眠s秒时间,s可以为浮点数 |
实例4:文本进度条
- 采用字符串方式打印可以动态变化的文本进度条
- 进度条需要能在一行中逐渐变化
如何获得文本进度条的变化时间?
- 采用
sleep()
模拟一个持续的进度
简单的开始
代码:
#TextProBarV1.py
import time
scale = 10
print("-----执行开始-----")
for i in range(scale+1):
a = '*' * i
b = '.' * (scale - i)
c = (i/scale)*100
print("{:^3.0f}%[{}->{}]".format(c,a,b))
time.sleep(0.1)
print("-----执行结束-----")
执行结果
------执行开始------
0 %[->..........]
10 %[*->.........]
20 %[**->........]
30 %[***->.......]
40 %[****->......]
50 %[*****->.....]
60 %[******->....]
70 %[*******->...]
80 %[********->..]
90 %[*********->.]
100%[**********->]
------执行结束------
单行动态刷新
根据进度刷新进度,不换行
- 刷新本质:用后打印的字符覆盖之前的字符
- 不能换行,
print()
需要被控制 - 要能回退:打印后光标退回到之前的位置
\r
#TextProBarV2.py
import time
for i in range(101):
print("\r{:3}%".format(i), end='')
time.sleep(0.1)
使用命令提示行执行程序。输入python "<加路径的文件名>"
完整效果
#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,'-')
举一反三
计算问题扩展
- 使用
perf_counter()
进行计时 - 适合各类需要统计时间的问题
进度条应用扩展
- 在任何运行时间较长和需要提高用户体验的程序中增加进度条
- 文本进度条不同设计函数