本篇主要介绍基本数据类型,以文本进度条为例,介绍time库的使用。
并在最后对蟒蛇绘制的代码进行分析。
(从本篇开始,出现的一些库中函数介绍以及部分简单代码都将以图片形式呈现)
读完本篇,你将了解:
1.方法论
Python语言数字及字符串类型
2.实践能力
初步学会编程进行字符类操作
本篇将系统介绍:
1.数字类型及操作(整数、浮点数、复数及相关函数)
2.字符串类型及操作(字符串及字符串序号、操作函数、类型的格式化)
3.模块2: time库的使用(时间获取、格式化、程序计时应用)
4.实例3:文本进度条(简单开始->单行动态刷新->完整效果)
了解基本数据类型之后, 通过字符串、数字的组合,将能很容易的操作字符,使我们能更好的开展程序设计
与数学中整数的概念一致,可正可负,没有取值范围限制
(1)pow(x,y)函数∶计算x的y次方,由于整数没有限制,想算多大算多大
(2)4种进制表示形式
①十进制:1010,99,-217
②二进制,以0b或0B开头:0b010,-OB101
③八进制,以0o或0O开头:0o123,-OO456
④十六进制,以0x或0X开头:0x9a,-0X89
与数学中实数的概念一致,带有小数点及小数的数字
(1)注意:浮点数取值范围和小数精度都存在限制,但常规计算可忽略
取值范围数量级约-10^(308) 10^(308)
精度数量级:10^-16
(2)不确定尾数:浮点数间运算存在不确定尾数,不是bug
①举例:>>> 0.1 + 0.3输出0.4
>>> 0.1 +0.2输出0.30000000000000004
涉及到计算机对数字运算的内部实现原理
②原理:计算机中采用二进制表达数字,Python中采用53位二进制表示小数部分,约10^-16
由于计算机中的二进制跟十进制之间,不存在严格的对等关系,计算机只能截取53位,无限接近0.1
输出时只保留16位,之后的并未输出。故二进制与十进制之间转换出现不确定尾数
(3)round(x, d):对x四舍五入,d是小数截取位数
①浮点数间运算及比较用round()函数辅助
②不确定尾数一般发生在10^-16左右,round()十分有效
(4)科学计数法
①格式:使用字母e或E作为幂的符号,以10为基数,格式如下:
(a)e(b)表示a*10b
②例如∶4.3e-3 值为0.0043或9.6E5值为960000.0
与数学中复数的概念一致
(1)定义j=√(-1),以此为基础,构建数学体系
(2)a+bj被称为复数,其中,a是实部,b是虚部
(3)z.real获得实部、z.imag获得虚部
(4)客观说常规编程中很少使用,但是它却是进行空间变换,尤其是跟复变函数相关的科学体系中最常用的一种类型
(3)数字类型的关系
类型间可进行混合运算,生成结果为"最宽"类型
①三种类型存在一种逐渐"扩展"或"变宽"的关系∶
整数->浮点数->复数
②例如:123 +4.0 = 127.0 (整数+浮点数=浮点数)
(1)字符串:
由0个或多个字符组成的有序字符序列
①字符串由一对单引号或一对双引号表示:"请输入带有符号的温度值: "或’C’
②字符串是字符的有序序列,可以对其中的字符进行索引(从0开始)
如:"请"是"请输入带有符号的温度值:”的第O个字符
(2)字符串有2类共4种表示方法
①由一对单引号或双引号表示,仅表示单行字符串
如:“请输入带有符号的温度值: “或’℃’
②由一对三单引号或三双引号表示,可表示多行字符串(作用而言,也可当作注释使用)
‘’’ Python
语言‘’‘
③如果希望在字符串中包含双引号或单引号呢?
若字符串中出现双引号,那么最外层的引号就要使用单引号,反之
如:'这里有个双引号(”)‘或者"这里有个单引号(’)”
④如果希望在字符串中既包括单引号又包括双引号呢?
则用三个单引号表示
如:’‘’这里既有单引号(’)又有双引号(")‘’‘
⑤故这4种方法存在冗余,使得字符串中出现单引号或者双引号的处理更方便简单
①使用[ ]获取字符串中一个或多个字符
1)索引∶返回字符串中单个字符 <字符串>[M]
"请输入带有符号的温度值: "[0]或者TempStr[-1]
2)切片:返回字符串中一段字符子串 <字符串>[M: N]
“请输入带有符号的温度值:”[1:3]或者TempStr[0:-1]
(这里之前说过,不再多作赘述)
②字符串切片的高级用法
使用[M: N:K]根据步长对字符串切片
1)<字符串>[M: N],M缺失表示至开头,N缺失表示至结尾
如:“o一二三四五六七八九十”[:3]结果是"O一二"(从最开始到3前一个为止)
2)<字符串>[M: N: K],根据步长K对字符串切片
“o一二三四五六七八九十”[1:8:2]结果是"一三五七"(从第一位置到第八位置前结束,步长为2取)
3)小技巧:将字符串逆序[::-1]
“o一二三四五六七八九十”[::-1]结果是"十九八七六五四三二一o"
(从最开始到结尾,步长-1(即从后向前逐一取出),相当于逆序)
③转义符
1)转义符表达特定字符的本意
“这里有个双引号(”)”结果为:这里有个双引号(")
2)转义符形成一些组合,表达一些不可打印的含义
如:"\b"回退“ \n"换行(光标移动到下行首)“ \r”回车(光标移动到本行首)
(2)举例:获取星期字符串
输入∶1-7的整数,表示星期几
输出∶输入整数对应的星期字符串
例如∶输入3,输出星期三
weekStr = "星期一星期二星期三星期四星期五星期六星期日"
weekId = eval(input("请输入星期数字(1-7):"))
pos = (weekId-1)*3 # 算出起始索引的位置
print(weekStr[pos:pos+3]) # 使用切片操作,将切片结果返回给用户
利用操作符改进
weekStr = "一二三四五六日"
weekId = eval(input("请输入星期数字(1-7):"))
print("星期"+weekStr[weekId-1])
这两个函数也是一对对应函数
(2)Unicode编码
Python字符串的编码方式
①统一字符编码,即覆盖几乎所有字符的编码方式
②从0到1114111(Ox10FFFF)空间,每个编码对应一个字符
③Python字符串中每个字符都是Unicode编码字符,使得Python程序不限于中文英文韩文日文俄文等
④一些有趣的例子:
>>> "1 +1 = 2 " +chr( 10004)输出’1 +1 = 2 √’
(1)方法
"方法"在编程中是一个专有名词
①"方法"特指(a).(b)风格中的函数b()
②方法本身也是函数,但与a有关,是a能提供的函数,必须a.b()风格使用(面向对象的一种使用风格)
③字符串及变量也是a,存在一些方法
①split()函数:例子中用逗号分隔字符串,即只要出现逗号就会把字符串拆解为两个部分
故A后的逗号就会将A单独形成一个字符串,B同样。然后将他们放成一个列表类型返回给用户
②center()函数:(对字符串格式进行处理)根据width居中,居中后剩余两侧填充为fillchar(使打印规则的输出处理简易)
③strip()函数:去除字符串左右两侧预定义字符
格式化是对字符串进行格式表达的方式
(1)字符串格式化使用.format()方法,用法如下:
<模板字符串>.format(<逗号分隔的参数>)
(2)槽
相当于一个占位信息符,它使用一对{}来表示,只在字符串中有用
①举例
1)每一个槽中所要添加的内容与.format方法中对应的参数相一致
2)槽的3个顺序在不指定的情况下默认为012
3)将format方法中的参数按照对应顺序填到模板字符串的槽中
4)进一步可在槽中指定需要添加的参数的位置
(3)Python语言使用槽机制加上format方法,来形成字符串的格式化
除参数序号之外,如果某一个槽中确定关联的某一个参数,可以对参数的输出格式进行控制。
在槽内部使用格式化的控制标记来进行格式控制
(4)format()方法的格式控制
①槽内部对格式化的配置方式
通过一个冒号来引导一些参数,控制某一个变量在槽位置的输出格式
Python一共提供了六种格式控制标记
分为两组记忆
②前三个参数为一组,这三个参数分别表达填充、对齐和宽度
基本模式:
1)给出一个输出宽度
2)决定即将输出的这个参数在这个宽度中的对齐方式
3)确定对齐方式之后,若还有空余空间,该填充什么字符
首先要给定填充,其次设定对齐,最后设定宽度
4)举例
第一个例子中:
在一个模板字符串中,槽中给出“:=^20”。=指填充符号,空余空间中填=的单字符
^表明居中对齐(>指右对齐)指的是所放入槽中的format方法中的第0个参数以居中对齐方式来显示
20指输出宽度
第三个例子中:
省略填充、对齐,直接给出宽度。默认情况下填充为空格,变量左对齐
③后三个都是与具体的数字有关(控制数字类型输出)
1)<,>:数字的千位分隔符(这种情况只有在输出字符串,但是当作数字给人阅读的时候才会使用)
2)<.精度>:浮点数小数精度或字符串最大输出长度
3)<类型>:我们以什么样的类型将变量放到槽中
4)举例
第一个例子中:
.2f表示保留两位小数并使用千位分隔符
第二个例子中:
对425以:b的形式输出二进制格式,以:c的形式输出字符形式(即Unicode编码形式)
以:d的形式输出十进制格式, 以:o的形式输出八进制格式
以:x的形式输出十六进制格式, 以:X的形式输出大写十六进制格式
第三个例子中:
以:e的形式采用科学计数法e形式表示浮点数, 以:E的形式采用科学计数法E形式表示浮点数,
以:f的形式采用通常的非科学计数法表示浮点数, 以:%的形式采用百分号形式表示浮点数。
(1)time库是Python中处理时间的标准库
①计算机时间的表达
②提供获取系统时间并格式化输出功能
③提供系统级精确计时功能,用于程序性能分析
(2)使用方法:
import time
time.b()
以此调用相关函数(最典型最直接Python库的使用方法)
(3)time库包括三类函数
①时间获取:time() ctime() gmtime()
②时间格式化并输出: strftime() strptime()
③程序计时(time库的重要功能): sleep(), perf_counter()
①时间戳是一个很长的浮点数,表示从1970年1月1日0:00开始,到当前这一时刻为止的,一个以秒为单位的数值
②ctime():给出一个具体的时分秒的时间(time库中获取人类译读方式时间的最简单的函数)
③gmtime():获取当前时间,但获取后生成的格式不一样,生成的是一种计算机程序可以处理的时间格式
(2)这三个函数基本能对获取来的时间做所有可能的后续处理
将时间以合理的方式展示出来
(1)格式化
①格式化:类似字符串格式化,需要有展示模板
②展示模板由特定的格式化控制符组成(告诉程序输出的时间大概是什么样子)
③实现时间格式化的方法:strftime()方法
(2)strftime()
(3)时间格式化很重要的一点
将计算机内部时间中,表达的年月日时分秒等相关的与时间有关的信息,用一种变量的形式进行合理组合,并合理输出
通过控制来表达输出格式
(4)time库中的控制符
格式:%+字母
(可回顾刚刚的例子)
将一个字符串变成一个计算机内部可操作的一个时间(特定程序中才会使用)
(1)程序计时应用广泛
①程序计时指测量起止动作所经历时间的过程
②测量时间: perf_counter()(获取计算机中CPU以其频率运行的时钟,往往以纳秒来计算,非常精准)
③产生时间: sleep()(让程序休眠或产生一定时间)
(1)文本进度条
①采用字符串方式打印可以动态变化的文本进度条
②进度条需要能在一行中根据程序的运行逐渐变化(与时间有一定关系)
(2)如何获得文本进度条的变化时间?
采用sleep()模拟一个持续的进度
(1)代码实现
# TextProBarV1
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("------执行结束------")
①该代码完成了一个基本的文本进度条框架
②执行效果:生成一个有开始、结束标记,且有一定进度百分比表示的进度条格式
(2)代码简单分析
①引入time库,使用time库的sleep()函数来生成一个持续不断的时间
②打印“执行开始”“执行结束”作为标签
③定义变量scale=10,指文本进度条的大概的宽度
④for循环模拟进度:for i in range(n)结构
⑤基本原理:定义休眠时间,每次循环都会打印当前进度条状态,进行一个简单的休眠
⑥for循环中的相关工作:
1)a等于字符(乘号)与循环变量i的乘积(字符串与整数的乘积表示字符串被复制的次数)
指当前百分比所表达的信息
2)b等于’.'与当前剩余的进度条的比例之间的乘积
3)a与b构成当前进度比例中,与已经执行的和未知执行的之间的对应的(星号)和‘.'两者之间的关系
4)变量c等于i除以scale乘以100,输出与当前进度条与进度相关的百分比
⑦print函数设置三个槽,在每个槽中增加了百分比以及相应字符串
⑧指向效果如上图
(1)单行动态刷新:
刷新的关键是\r
①刷新的本质是:用后打印的字符覆盖之前的字符
②不能换行:print()需要被控制(print()默认输出之后会换行到下一行)
③要能回退:需要让打印后光标退回到之前的位置\r(输出字符串之后,光标会移动到字符串之后)
(2)代码实现
# TextProBarV1
import time
for i in range(101):
print("\r{:3}%".format(i), end="")
time.sleep(0.1)
①使用time库及sleep()函数,101次的循环(0%到100%)
②代码关键:print函数
输出信息之后,增加,end=""这样一个参数,可以改变每一次print输出最后增加的那个信息
比如在这里我们使end赋值为空字符串,那么print函数每一次输出字符串之后,不会增加换行
只会把光标停留在当次输出字符串的后面
③总结:若希望输出的字符串后面增加什么信息,就在end参数中增加,不希望增加换行,使end赋值为空字符串
④print的第一个参数:\r,一个槽,并给出百分号
\r:打印输出之前,它能够使光标退回到当前行的行首
(1)代码实现
# TextProBarV3
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, '-'))
(2)代码分析
与第一段代码很接近,重点分析修改
①第一个和最后一个print,center函数用-填充在两侧
②增加计时效果:对程序进度有更好的展示(程序运行开始变量start开始时间)
③for循环:保留abc变量,新增dur变量记录每一次需要打印文本进度条时所消耗的时间,当前时间减去最开始记录的时间
④for中的print函数:打印文本进度条
1)单行刷新效果:最开始增加\r,实现光标向行首的移动
2)同时print函数要增加end参数,end赋值为空字符串:每次输出之后不换行
(3)效果:具有一定格式框架,有进度“*”输出,又有时间记录的完整的文本进度条
(4)这段代码覆盖了字符串处理,覆盖了数字处理,时间库的使用
效果如图
(1)计算问题扩展
①文本进度条程序使用了perf_counter()计时
②计时方法适合各类需要统计时间的计算问题
③例如︰比较不同算法时间、统计部分程序运行时间
(2)进度条扩展
①在任何运行时间需要较长的程序中增加进度条
②在任何希望提高用户体验的应用中增加进度条
③进度条是人机交互的纽带之一
(3)文本进度条的不同设计函数(作扩展用)
经过本篇的学习,可以大致掌握运用time库去实现基本的文本进度条(本篇只是基础),大家可以尝试不同的进度条设计风格。善于使用time库函数来抓取时间。
如有错误,欢迎指正!
注:代码非原创
下篇将介绍程序的控制结构。
ps(又咕咕了)