目录
一、数字类型及操作
1、整数类型
2、浮点数类型
3、复数类型
4、数值运算操作符
5、数值运算函数
总结
二、实例3:天天向上的力量
问题1:千分之一的力量
问题2:千分之五和百分之一的力量
问题3:工作日的力量
问题4:工作日的努力
三、字符串类型及操作
1、字符串
2、字符串类型的表示
3、字符串的序号
4、字符串的使用(索引、切片)
5、字符串的特殊字符:转义符 \
6、字符串操作符
7、字符串处理函数
8、字符串处理方法(8个)
9、字符串类型的格式化
总结
四、模块2:time库的使用
1、time库基本介绍
2、时间获取
3、时间格式化
4、程序计时应用
总结
五、实例4:文本进度条
1、问题分析
2、基本原理
3、文本进度条的单行动态刷新
4、完整效果的文本进度条
5、拓展
- 可正可负,没有取值范围限制
- pow(x,y) 函数:计算x的y次方
- 四种进制表示形式:
(1)带有小数点及小数的数字
- 浮点数取值范围(数量级约-10的308次方到10的308次方)和小数精度(数量级10的-16次方,即两个小数间的差别最小可以表示到10的-16次方)都存在限制,但常规计算可忽略
- 范围很大,精度很小,基本无限制
(2)浮点数间运算存在不确定尾数,不是bug,原因:
- 0.1 + 0.2 == 0.3 False(因为 0.1 + 0.2 产生了浮点数间运算的不确定尾数)
- 通过 round() 函数来判断浮点数运算与浮点数之间的比较关系,改为 round(0.1+0.2 , 1) == 0.3 True
(3)round(x,d):对x进行四舍五入,d是小数截取位数(取小数后的几位保留)
- 浮点数间运算及比较需要用 round() 函数辅助,因为不确定尾数一般发生在10的-16次方左右,故 round() 函数十分有效
(4)浮点数可以采用科学计数法表示,可以通过这种方式表达特别大或特别小的浮点数
只有 Python 语言提供了复数类型
进行空间变换,尤其跟复变函数相关的科学体系中常用
4、数值运算操作符操作符是完成运算的一种符号体系,数值运算操作符是用操作符的形式来提供数值运算功能
(1)基本操作符
(2)提供了对二元操作符的一种增强型的赋值操作符
- 基本功能:对两个数进行运算之后,去更改其中的一个数
(3)不同数字类型之间可以进行混合运算,生成结果我们一般认为会生成一种最宽的类型
三种类型存在一种逐渐“扩展”或“变宽”的关系
- 整数是浮点数的特殊形式(整数的小数部分为0)
- 浮点数也可以认为是复数的特殊情况(浮点数是复数虚部为0的表现形式)
如 123 + 4.0 = 127.0(整数+浮点数=浮点数)
5、数值运算函数以函数形式来完成数值运算功能,Python 语言提供了一些内置函数来完成数字运算
(1)功能函数
(2)数字类型转换函数
#DayDayUpQ1.py
dayup = pow(1.001,365)
daydown = pow(0.999,365)
print("向上:{:.2f},向下:{:.2f}".format(dayup,daydown))
定义一个变量 dayfactor,用来保存我们需要计算力量的千分值或百分值
#DayDayUpQ2.py
dayfactor = 0.005 #使用变量的好处:一处修改即可
dayup = pow(1+dayfactor,365)
daydown = pow(1-dayfactor,365)
print("向上:{:.2f},向下:{:.2f}".format(dayup,daydown))
采用循环模拟365天的过程,抽象+自动化
#DayDayUpQ3.py
dayup = 1.0
dayfactor = 0.01
for i in range(365): # i表示每一天
# 一周有7天,模7,若尾数为0或6是周末,反之则是工作日
if i%7 in [6,0]:
dayup = dayup * (1-dayfactor)
else:
dayup = dayup * (1+dayfactor)
print("工作日的力量:{:.2f}".format(dayup))
根据 df 参数计算工作日力量的函数,参数不同,这段代码可共同,def保留字用于定义函数
#DayDayUpQ4.py
def dayUP(df): #参数df是一个占位符,为dayfactor的简写
dayup = 1
for i in range(365): # i表示每一天
# 一周有7天,模7,若尾数为0或6是周末,反之则是工作日
if i%7 in [6,0]:
dayup = dayup * (1-0.01)
else:
dayup = dayup * (1+df)
return dayup
while 保留字判断条件是否成立,条件成立时循环执行
dayfactor = 0.01
while dayUP(dayfactor) < 37.78:
dayfactor += 0.001
print("工作日的努力参数是:{:.3f}".format(dayfactor))
完整代码:
#DayDayUpQ4.py
def dayUP(df): #参数df是一个占位符,为dayfactor的简写
dayup = 1
for i in range(365): # i表示每一天
# 一周有7天,模7,若尾数为0或6是周末,反之则是工作日
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))
- 带判断条件的循环while
- 带计数的循环for
- 分支if-else
- 函数
- 由0个或多个字符组成的有序字符序列
- 由一对单引号或一对双引号表示
- 是字符的有序序列,可以对其中的字符进行索引(从0开始编号)
字符串有2类共4种表示方法:
- 由一对单引号或一对双引号表示:只能表示单行字符串
- 由一对三单引号或一对三双引号表示:可表示多行字符串与多行注释的区别:Python语言中并没有真正提供多行注释的表示方式,三单引号构成的就是字符串,但是如果在程序中出现了一个字符串,这个字符串并没有给到某一个变量中,或者这个字符串没有进行任何操作,那么它也可以当做注释来使用。综上,三单引号形成的是字符串,只是它的作用可以当做注释
Python提供的4种字符串表示方法是存在冗余的,好处是:使得单引号和双引号在字符串中的出现变得很好处理,也变得非常简单
- 如果在字符串中出现双引号(单引号),那么最外层的引号就要使用单引号(双引号)
- 如果希望在字符串中既包括单引号又包括双引号,那么可以使用三个单引号作为字符串的表示,那么其中出现的一个单引号或者一个双引号就变成了字符串中的字符
- 正向递增序号:从0开始
- 反向递减序号:从-1开始
使用 [ ] 获取字符串中一个或多个字符
- 索引:返回字符串中单个字符 [M]
- 切片:返回字符串中一段字符子串 [M:N]
字符串切片的高级用法:
将字符串进行逆序:[: : -1]
5、字符串的特殊字符:转义符 \- \b:回退,使当前的光标向前回退一个位置
- \n:换行,使当前的光标移动到下行的行首
- \r:回车,使光标移动到当前行的行首
例子:获取星期字符串
# WeekNamePrintV1.py
weekStr = "星期一星期二星期三星期四星期五星期六星期日"
# input()获得的用户输入会被保存为字符串类型,eval()能够将数字的字符串形式变为数字形式
weekId = eval(input("请输入星期数字(1-7):"))
# 用weekId进行计算,算出在weekStr中相应的weekId的起始索引位置
pos = (weekId-1) * 3
# 使用切片操作将对应的星期字符取出
print(weekStr[pos:pos+3])
更简洁的写法:
# WeekNamePrintV2.py
weekStr = "一二三四五六日"
weekId = eval(input("请输入星期数字(1-7):"))
print("星期"+weekStr[weekId-1])
7、字符串处理函数
定义:以函数形式来实现字符串处理功能(Python提供了6个)
hex() 或 oct() 函数的作用:计算机很多内部运算都是采用二进制形式完成,二进制由大量01构成,对人类读取不方便,故人们喜欢使用十六进制或八进制来表示计算机的内部运算形式。通过这两个函数可以将计算机的一些运算操作通过字符串的形式打印出来,对很多程序(尤其程序员关心的系统级程序)的使用非常有帮助
Unicode编码
- 是Python字符串的编码形式,在Python3中所有字符串、所有Python代码全部是Unicode的编码形式来实现的
- 最开始计算机中只有英文字符,而英文字符的空间范围很有限,国际上广泛使用ASCII码来表示所有的英文字符。随着计算机的广泛使用,如何对中文汉字进行编码,如何让计算机可以处理中文汉字,成了重要问题。于是产生了统一字符编码
- 统一字符编码基本思想:用一套编码能够把世界上出现的所有字符纳进来,只要有一个字符,就会有一个对应的编码与字符表示,这就是Unicode编码的由来
- 将世界上的所有编码放在了一个大的序列空间中,从0到1114111(十六进制0x10FFFF)空间,每个编码对应一个字符
例子:
end参数:决定每一个print输出之后是否要换行,若end=空,那么输出之后并不换行
8、字符串处理方法(8个)方法 是编程(面向对象)中的一个专有名词,方法必须要用 . 的形式来执行
- 特指 .() 风格中的函数 ()
- 方法本身也是函数,但与 有关,它是 能够提供的函数,且方法必须采用 .() 风格(面向对象的一种使用风格,其中 是对象, 是某一个对象能够提供的功能,叫方法)使用
- 字符串本身也是一个对象,也是一种 ,也存在了一些操作方法
.join() 方法是一个格式化输出,尤其是按规律在一段字符串中增加分隔符的一个重要方法
9、字符串类型的格式化格式化:对字符串进行格式表达的方法
- 字符串格式化使用 .format() 方法,用法:.format()
- Python 语言使用槽机制加上 format 方法来形成字符串的格式化
- 除了参数序号之外,如果某一个槽中确定关联的某一个参数,在确定关联参数后,也可以对这个参数的输出格式进行相关的控制
- 槽内部使用格式化的控制标记来进行格式控制,简单讲,在槽的内部,除了槽的参数序号之外,可以通过一个 : 来引导参数,控制某一个变量在槽位置的输出格式
通过利用类型和精度,可以很好地控制数字类型的输出,这对于我们输出数字的精度,以及控制输出数字的格式非常有帮助
在编写Python程序中,所有出现的标点符号要采用英文的半角形式,不要采用中文形式,因为Python默认的语法体系是以英文字符为基础的体系,但是可以把中文信息放在字符串中,以字符串的字符形式来表示,但不能作为语法的一部分
总结- time库基本介绍
- 时间获取
- 时间格式化
- 程序计时应用
time库是Python中处理时间的标准库,Python语言中包含了若干个能够处理时间的库,而其中time库是最基本的一个,time库能够:
- 表达计算机时间
- 提供获取系统时间并格式化输出的功能
- 提供系统级的精确计时功能,用于程序性能分析
import time
time.()
time库包含三类函数: 获取时间;对时间进行格式化并输出;程序计时
- 将时间以合理的方式展示出来,类似于字符串的格式化(.format()方法,需要一个模板字符串) ,时间格式化也需要展示模板
- 展示模板是由特定的格式化控制符组成,它能够告诉程序我们输出的时间大概是什么样子
- 用来实现时间格式化的方法 strftime() 方法
将计算机内部时间中表达年月日时分秒等相关的与时间有关的信息,用一种变量的形式进行合理组合,并且合理输出,通过控制来表达输出格式
第一个参数 tpl 使用了6个时间格式化的控制符
import time
# 获得一个时间格式的变量t
t = time.gmtime()
# 通过调用一个展示模板,将内部变量t输出为一个具有一定格式的时间字符串
t = time.strftime("%Y-%m-%d %H:%M:%S",t)
print(t)
将一个字符串反格式化形成内部时间:strptime(str, tpl)
在计算机中为了表达时间,其实只有一个浮点数(1970年1月1日开始),为了让其他程序更好地处理这个浮点数,把它定义为一个程序可以理解的格式(即gmtime获取的struct_time格式,struct_time中包含了很多元素,这些元素的值都是通过浮点数来提取的)。反过来,我们也可以使用一个字符串赋予一个时间给我们定义的strptime类型,由这个类型进一步生成浮点数
4、程序计时应用程序计时:测量起止动作所经历时间的过程(一段程序从开始运行到结束经历了多少时间),主要包括测量时间和产生时间两个部分
- 测量时间:perf_counter() 能够记录时间的流逝
- 产生时间:sleep() 让程序休眠
介绍了能够处理时间的Python函数库,包含三部分:
- 三个获取时间的函数:time()获得浮点数、ctime()获得程序员可读的字符串类型的时间、gmtime()获得一个时间变量,用来给其他程序提供时间参数
- 时间格式化:strftime()及相关的一组时间控制格式符、strptime() 能够将字符串转变为内部的时间变量
- 程序计时:perf_counter() 利用连续调用以及调用之间的减法来实现计数的方式、sleep() 让程序能够休眠一段时间
Python官方文档 3.10.2 Documentation
五、实例4:文本进度条 1、问题分析- 以文本字符形式来形成的、可动态变化的一种进度条方式
- 需要能够在一行中根据程序的运行逐渐变化
- 进度条反映了某一事件的运行,与时间有关,用sleep()模拟持续进度,生成一个持续不断的时间
定义了一个休眠时间,每次循环都会打印当前的进度条状态,进行一个简单的休眠,这个休眠可以理解为计算机在完成某一个任务,之后再去打印进度条,再去完成任务,直到任务完成或进度条达到了预期百分比
# TextProBarV1.py
import time
scale = 10 # 文本进度条大概宽度
print("--------执行开始--------")
# 为模拟进度,使用for循环
for i in range(scale+1):
a = '*' * i # 字符串与整数的乘积表示字符串被复制的次数,*表示当前百分比所表达的信息
b = '.' * (scale - i) # scale-i 当前剩余进度条的比例
# 经过a和b,就能够构成当前进度比例中与已执行的和未执行的之间的对应的*和.之间的关系
c = (i/scale)*100 # 输出与当前进度条和进度相关的百分比
# 设置3个槽,在每个槽中增加了百分比
print("{:^3.0f}%[{}->{}]".format(c,a,b))
time.sleep(0.1)
print("--------执行结束--------")
像文本进度条一样,能够在每一行中根据程序的进度不断地显示文本进度条的信息,并不换行
如果希望输出的字符串后面增加什么信息,就在end参数中增加;若希望不换行,就将end参数赋值为空字符串
# TextProBarV2.py
import time
# 为了输出文本进度条0%和100%的状态,中间划分100次,就要101次的输出
for i in range(101):
# end为print的一个参数,默认情况下不存在,即输出一个信息后默认在最后增加一个换行
# \r表示在打印输出字符串之前,使光标退回到当前行的行首
# 即每一次都是从行首不断地输出信息,且不换行(单行刷新)
print("\r{:3}%".format(i),end="")
time.sleep(0.1)
但上述代码在IDLE中运行,并不是单行刷新的效果,而是所有信息都被展示出来。因为IDLE为开发环境,为了保证其中参数运行的效果,将 \r 功能屏蔽掉了
可在命令行中运行,效果如下:
覆盖了字符串处理、数字处理、时间库的使用
# 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 # 记录每一次需要打印文本进度条时所消耗的时间
# 为了使文本进度条有单行刷新效果,在模板字符串的最开始增加\r,实现光标向行首移动,同时print函数增加end参数,赋值为空字符串,在每次输出后不换行
print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,dur),end="")
time.sleep(0.1)
print("执行结束".center(scale//2,"-"))
- 可以通过 perf_counter() 比较不同算法的时间
- 在任何运行时间需要较长的程序中、在任何希望提高用户体验的应用中增加进度条
文本进度条的不同设计函数:
什么样的进度条展示模式更能让你觉得用户体验好?
结论:相比线性展示外,开始展示进度条速度慢一些,而随着下载的持续,后续进度条展示的增长效果逐渐增加,这种方式更符合人类的心理需求