前言
本篇主要介绍基本数据类型,以文本进度条为例,介绍time库的使用。 并在最后对蟒蛇绘制的代码进行分析。 (从本篇开始,出现的一些库中函数介绍以及部分简单代码都将以图片形式呈现)
读完本篇,你将了解: 1.方法论 Python语言数字及字符串类型 2.实践能力 初步学会编程进行字符类操作
本篇将系统介绍: 1.数字类型及操作(整数、浮点数、复数及相关函数) 2.字符串类型及操作(字符串及字符串序号、操作函数、类型的格式化) 3.模块2: time库的使用(时间获取、格式化、程序计时应用) 4.实例3:文本进度条(简单开始->单行动态刷新->完整效果)
了解基本数据类型之后, 通过字符串、数字的组合,将能很容易的操作字符,使我们能更好的开展程序设计
一、数字类型及操作
1.整数类型
与数学中整数的概念一致,可正可负,没有取值范围限制 (1)pow(x,y)函数∶计算x的y次方,由于整数没有限制,想算多大算多大 (2)4种进制表示形式 ①十进制:1010,99,-217 ②二进制,以0b或0B开头:0b010,-OB101 ③八进制,以0o或0O开头:0o123,-OO456 ④十六进制,以0x或0X开头:0x9a,-0X89
2.浮点数类型
与数学中实数的概念一致,带有小数点及小数的数字 (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
3.复数(仅Python提供)
与数学中复数的概念一致 (1)定义j=√(-1),以此为基础,构建数学体系 (2)a+bj被称为复数,其中,a是实部,b是虚部 (3)z.real获得实部、z.imag获得虚部 (4)客观说常规编程中很少使用,但是它却是进行空间变换,尤其是跟复变函数相关的科学体系中最常用的一种类型
4.数字类型及操作
操作符是完成运算的一种符号体系 (1)一些基础操作符
注意:/的结果保留小数
(2)对二元操作符的增强型操作符
(3)数字类型的关系 类型间可进行混合运算,生成结果为"最宽"类型 ①三种类型存在一种逐渐"扩展"或"变宽"的关系∶ 整数->浮点数->复数 ②例如:123 +4.0 = 127.0 (整数+浮点数=浮点数)
5.数值运算函数
(1)Python提供的一些函数
(2)数字类型转换函数
二、字符串类型及操作
1.字符串类型的表示
(1)字符串: 由0个或多个字符组成的有序字符序列 ①字符串由一对单引号或一对双引号表示:"请输入带有符号的温度值: "或’C’ ②字符串是字符的有序序列,可以对其中的字符进行索引(从0开始) 如:"请"是"请输入带有符号的温度值:”的第O个字符
(2)字符串有2类共4种表示方法 ①由一对单引号或双引号表示,仅表示单行字符串 如:“请输入带有符号的温度值: “或’℃’ ②由一对三单引号或三双引号表示,可表示多行字符串(作用而言,也可当作注释使用) ‘’’ Python 语言‘’‘ ③如果希望在字符串中包含双引号或单引号呢? 若字符串中出现双引号,那么最外层的引号就要使用单引号,反之 如:'这里有个双引号(”)‘或者"这里有个单引号(’)” ④如果希望在字符串中既包括单引号又包括双引号呢? 则用三个单引号表示 如:’‘’这里既有单引号(’)又有双引号(")‘’‘ ⑤故这4种方法存在冗余,使得字符串中出现单引号或者双引号的处理更方便简单
(3)字符串的序号 正向递增序号和反向递减序号
①使用[ ]获取字符串中一个或多个字符 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)由0个或多个字符组成的有序字符序列
(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])
3.字符串处理函数
(1)一些以函数形式提供的字符串处理功能
str和eval是一对对应的函数
这两个函数也是一对对应函数 (2)Unicode编码 Python字符串的编码方式 ①统一字符编码,即覆盖几乎所有字符的编码方式 ②从0到1114111(Ox10FFFF)空间,每个编码对应一个字符 ③Python字符串中每个字符都是Unicode编码字符,使得Python程序不限于中文英文韩文日文俄文等 ④一些有趣的例子: >>> "1 +1 = 2 " +chr( 10004)输出’1 +1 = 2 √’
4.字符串处理方法
(1)方法 "方法"在编程中是一个专有名词 ①"方法"特指(a).(b)风格中的函数b() ②方法本身也是函数,但与a有关,是a能提供的函数,必须a.b()风格使用(面向对象的一种使用风格) ③字符串及变量也是a,存在一些方法
(2)8个常用方法(字符串及变量也是a,存在一些方法)
①split()函数:例子中用逗号分隔字符串,即只要出现逗号就会把字符串拆解为两个部分 故A后的逗号就会将A单独形成一个字符串,B同样。然后将他们放成一个列表类型返回给用户 ②center()函数:(对字符串格式进行处理)根据width居中,居中后剩余两侧填充为fillchar(使打印规则的输出处理简易) ③strip()函数:去除字符串左右两侧预定义字符
5.字符串类型的格式化
格式化是对字符串进行格式表达的方式 (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的形式采用通常的非科学计数法表示浮点数, 以:%的形式采用百分号形式表示浮点数。
三、time库的使用
1.time库基本介绍
(1)time库是Python中处理时间的标准库 ①计算机时间的表达 ②提供获取系统时间并格式化输出功能 ③提供系统级精确计时功能,用于程序性能分析
(2)使用方法: import time time.b() 以此调用相关函数(最典型最直接Python库的使用方法)
(3)time库包括三类函数 ①时间获取:time() ctime() gmtime() ②时间格式化并输出: strftime() strptime() ③程序计时(time库的重要功能): sleep(), perf_counter()
2.时间获取
(1)一些函数
①时间戳是一个很长的浮点数,表示从1970年1月1日0:00开始,到当前这一时刻为止的,一个以秒为单位的数值 ②ctime():给出一个具体的时分秒的时间(time库中获取人类译读方式时间的最简单的函数)
③gmtime():获取当前时间,但获取后生成的格式不一样,生成的是一种计算机程序可以处理的时间格式 (2)这三个函数基本能对获取来的时间做所有可能的后续处理
3.时间格式化
将时间以合理的方式展示出来 (1)格式化 ①格式化:类似字符串格式化,需要有展示模板 ②展示模板由特定的格式化控制符组成(告诉程序输出的时间大概是什么样子) ③实现时间格式化的方法:strftime()方法 (2)strftime()
(3)时间格式化很重要的一点 将计算机内部时间中,表达的年月日时分秒等相关的与时间有关的信息,用一种变量的形式进行合理组合,并合理输出 通过控制来表达输出格式 (4)time库中的控制符 格式:%+字母
(可回顾刚刚的例子)
(5)strptime()
将一个字符串变成一个计算机内部可操作的一个时间(特定程序中才会使用)
4.程序计时应用
(1)程序计时应用广泛 ①程序计时指测量起止动作所经历时间的过程 ②测量时间: perf_counter()(获取计算机中CPU以其频率运行的时钟,往往以纳秒来计算,非常精准) ③产生时间: sleep()(让程序休眠或产生一定时间)
(2)perf_counter()
(3)sleep()
四、实例4:文本进度条
1.需求分析
(1)文本进度条 ①采用字符串方式打印可以动态变化的文本进度条 ②进度条需要能在一行中根据程序的运行逐渐变化(与时间有一定关系) (2)如何获得文本进度条的变化时间? 采用sleep()模拟一个持续的进度
2.“文本进度条“简单的开始
(1)代码实现
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函数设置三个槽,在每个槽中增加了百分比以及相应字符串 ⑧指向效果如上图
3.“文本进度条“单行动态刷新
(1)单行动态刷新: 刷新的关键是\r ①刷新的本质是:用后打印的字符覆盖之前的字符 ②不能换行:print()需要被控制(print()默认输出之后会换行到下一行) ③要能回退:需要让打印后光标退回到之前的位置\r(输出字符串之后,光标会移动到字符串之后) (2)代码实现
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:打印输出之前,它能够使光标退回到当前行的行首
4.“文本进度条“实例完整效果
(1)代码实现
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)这段代码覆盖了字符串处理,覆盖了数字处理,时间库的使用 效果如图
5.“文本进度条“举一反三
(1)计算问题扩展 ①文本进度条程序使用了perf_counter()计时 ②计时方法适合各类需要统计时间的计算问题 ③例如︰比较不同算法时间、统计部分程序运行时间 (2)进度条扩展 ①在任何运行时间需要较长的程序中增加进度条 ②在任何希望提高用户体验的应用中增加进度条 ③进度条是人机交互的纽带之一 (3)文本进度条的不同设计函数(作扩展用)
总结
经过本篇的学习,可以大致掌握运用time库去实现基本的文本进度条(本篇只是基础),大家可以尝试不同的进度条设计风格。善于使用time库函数来抓取时间。 如有错误,欢迎指正! 注:代码非原创 下篇将介绍程序的控制结构。 ps(又咕咕了)
|