本模块任务:
1.方法论:Python数字及字符串类型
2.实践能力:初步学会编程进行字符类操作
3.1数字类型及操作
1.整数类型
(1)与数学中整数的概念一致,可正可负。
(2)没有取值范围的限制。pow(x,y)函数用来计算,想算多大算多大。
(3)四种进制表示形式:十进制,二进制(以0b或0B开头),
八进制(以0o或0O开头),十六进制(以0x或0X开头)。
2.浮点数类型
(1)与数学中实数的概念一致,带有小数点及小数的数字。
(2)浮点数取值范围和小数精度都存在限制,但常规计算可忽略。取值范围数量级约至,精度数量级为。
(3)浮点数间运算存在不确定尾数,不是bug。因为用二进制表达小数,只能是无限接近十进制表达的小数,但不完全相同。又因为两个小数之间的差别最小可以表示到这个数量级,对于常规的数学运算显然这样的取值范围和这样的精度是不影响结果的,可以被忽略的。
(4)round(x,d)截断函数:对x四舍五入,d是小数截取位数。因为不确定尾数一般发生在左右,所以用round()函数来辅助浮点数间运算与比较是十分有效的。
(5)科学计数法表示浮点数:使用字母e或E作为幂的符号,以10为基数,格式为<a>e<b>,表示的是。
3.复数类型
(1)与数学中复数的概念一致,a+bj被称为复数,其中a是实部,b是虚部。
(2)z=a+bj,z.real获得实部,z.imag获得虚部。
4.数值运算操作符
(1)操作符是完成运算的一种符号体系。
操作符及使用 | 描述 |
x + y | 加,x与y的和 |
x - y | 减,x与y的差 |
x * y | 乘,x与y的积 |
x / y | 除,x与y的商。10 / 3 = 3.3333333333333335 |
x // y | 整除,x与y的整数商。10 // 3 = 3 |
+ x | x本身 |
- x | x的负值 |
x % y | 余数,模运算。10 % 3 = 1 |
x ** y | 幂运算,x的y次幂,。 当y是小数时,开方运算。10**0.5= |
在python中,两个整数相除,结果是浮点数;而在c中,结果仍是是整数,小数部分舍去。 (2)二元操作符op有对应的增强赋值操作符,形如x op= y,等价于x = x op y。
(3)数字类型的关系:类型间可进行混合运算,生成结果为“最宽”类型。整数->浮点数->复数。
5.数值运算函数
函数及使用 | 描述 |
abs(x) | 绝对值,x的绝对值 |
divmod(x,y) | 商余(x//y,x%y),同时输出商和余数 |
pow(x,y[,z]) | 幂余(x**y)%z,[...]表示参数z可省略。 |
round(x[,d]) | 四舍五入,d时保留小数位数,默认为0 |
max() | 最大值 |
min() | 最小值 |
int(x) | 将x变成整数,舍弃小数部分 |
float(x) | 将x变成浮点数,增加小数部分 |
complex(x) | 将x变成复数,增加虚数部分 |
(1)pow(3,pow(3,99),10000)结果为4587:求pow(3,pow(3,99))结果的最后四位。
(2) 将字符串类型的数变成整数,浮点数,复数:
3.2实例3:天天向上的力量
1.问题分析
(1)基本问题:持续的价值
①一年365天,每天进步1%,累计进步多少?解:
②一年365天,每天退步1%,累计剩下多少?解:
③如果是三天打鱼两天晒网呢?
④如果是工作日每天进步1%,双休日每天退步1%呢?
⑤如果是双休日又不退步?
2.问题1:1‰的力量
(1)一年365天,每天进步1‰,累计进步多少?解: = 1.44
(2)一年365天,每天退步1‰,累计剩下多少?解: = 0.69
#DayDayUpQ1.py
dayup = pow(1.001,365)
daydown = pow(0.999,365)
print("向上:{:.2f},向下:{:.2f}".format(dayup,daydown))
3.问题2:5‰和1%的力量
#DayDayUpQ2.py
#5‰的力量
dayfactor = 0.005
dayup = pow(1+dayfactor,365)
daydown = pow(1-dayfactor,365)
print("向上:{:.2f},向下:{:.2f}".format(dayup,daydown))
#1%的力量
dayfactor1 = 0.01
dayup1 = pow(1+dayfactor1,365)
daydown1 = pow(1-dayfactor1,365)
print("向上:{:.2f},向下:{:.2f}".format(dayup1,daydown1))
5‰的力量:
1%的力量:
4.问题3:工作日的力量
一年365天,一周5个工作日,每天进步1%,2个休息日,每天退步1%。这种工作日的力量如何呢?
(数学思维)——>for...in...(计算思维)
#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
5.问题4:工作日的努力
工作日模式要努力到什么水平,才能与每天努力1%一样?
for...in...(计算思维)——>def...while...(“笨方法”试错)
#DayDayUpQ4.py
def dayUP(df): #df是一个占位符,使用df表示dayfactor的简写形式
dayup = 1
for i in range(365):
if i%7 in [6,0]:
dayup = dayup*(1-df)
else:
dayup = dayup*(1+df)
return dayup
dayfactor = 0.01
while dayUP(dayfactor) < 37.78:
dayfactor +=0.001
print("工作日的努力参数是:{:.3f}".format(dayfactor))
运行结果为工作日的努力参数是:0.019。即工作日模式下,每天努力到1.9%,相当于365天模式每天努力1%的效果!如果365天,每天努力1.9%,则。
GRIT:perseverance and passion for long-term goals。坚毅,对长期目标的持续激情及持久耐力。
6.举一反三:问题的变化和扩展
#工作日模式中,如果休息日不下降呢?
dayup = 1.0
dayfactor = 0.01
for i in range(365):
if i%7 in [6,0]:
dayup = dayup*1
else:
dayup = dayup*(1+dayfactor)
print("工作日的力量:{:.2f}".format(dayup))
#如果努力时每天提高1%,休息时每天下降1‰呢?
dayup = 1.0
dayupfactor = 0.01
daydownfactor = 0.001
for i in range(365):
if i%7 in [6,0]:
dayup = dayup*(1-daydownfactor)
else:
dayup = dayup*(1+dayfactor)
print("工作日的力量:{:.2f}".format(dayup))
#如果工作3天休息1天呢?
dayup = 1.0
dayfactor = 0.01
for i in range(365):
if i%4 in [0]:
dayup = dayup*(1-dayfactor)
else:
dayup = dayup*(1+dayfactor)
print("工作日的力量:{:.2f}".format(dayup))
#三天打鱼两天晒网呢?
dayup = 1.0
dayfactor = 0.01
for i in range(365):
if i%5 in [4,0]:
dayup = dayup*(1-dayfactor)
else:
dayup = dayup*(1+dayfactor)
print("工作日的力量:{:.2f}".format(dayup))
#多一份努力呢?就是努力比下降多一点儿
dayup = 1.0
dayfactor = 0.01
more = 0.001
for i in range(365):
if i%7 in [6,0]:
dayup = dayup*(1-dayfactor)
else:
dayup = dayup*(1+dayfactor+more)
print("工作日的力量:{:.2f}".format(dayup))
#多一点懈怠呢?就是下降比努力多一点儿
dayup = 1.0
dayfactor = 0.01
less = 0.001
for i in range(365):
if i%7 in [6,0]:
dayup = dayup*(1-dayfactor-less)
else:
dayup = dayup*(1+dayfactor)
print("工作日的力量:{:.2f}".format(dayup))
3.3字符串类型及操作
1.字符串类型的表示
(1)字符串:由0个或多个字符组成的有序字符序列。可以对其中的字符进行索引。
(2)字符串的表示:2类共4种表示方法。
①仅表示单行字符串:由一对单引号或双引号表示。
②可表示多行字符串:由一对三单引号或三双引号表示。
注:三单引号中的内容是字符串,但如果没有赋给变量或进行操作,则可以作为注释这一功能。
✳字符串表示类型冗余的好处是使得单引号和双引号在字符串中的出现变得很好处理,很简单。
①如果希望在字符串中包含双引号或单引号,怎么办?
②如果希望在字符串中既包含单引号又包含双引号,怎么办?
(3)字符串的序号:正向递增序号和反向递增序号。
(4)字符串的使用:使用[ ]获取字符串中一个或多个字符。
①索引:返回字符串中单个字符,格式:<字符串>.[M]。
②切片:返回字符串中一段字符字串,格式:<字符串>.[M:N],输出含M不含N。
(5)字符串的特殊字符:转义符 \
①转义符表达特定字符的本意。比如:
"这里有个双引号(\")"结果为 这里有个双引号(")
②转义符形成一些组合,表达一些不可打印的含义。
\b:回退,使当前的光标向前回退一个位置。
\n:换行,使当前的光标移动到下行的行首。
\r:回车,使光标移动到本行的行首。
2.字符串操作符
操作符及使用 | 描述 |
x + y | 连接两个字符串x和y |
n * x 或 x * n | 复制n次字符串x |
x in s | 如果x是s的子串,返回True,否则返回False |
(1)获取星期字符串:
输入:1-7的整数,表示星期几;输出:输入整数对应的星期字符串。
例如:输入3,输出 星期三。
#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])
解题思想:首先给出含所有答案的字符串,然后根据用户的输入在其中进行切片,最后将切片的结果返回给用户。
3.字符串处理函数
函数及使用 | 描述 |
len(x) | 长度,返回字符串x的长度 |
str(x) | 任意类型x所对应的字符串形式 |
hex(x)或oct(x) | 整数x的十六进制或八进制小写形式字符串 |
chr(u) | u为Unicode编码,返回其对应的字符 |
ord(x) | x为字符,返回其对应的Unicode编码 |
len():数字,符号,英文,中文都是一个字符长度。
str():使任何类型变成字符串形式,进行加引号的操作。
eval():使字符串还原成原本类型,进行去引号的操作。
hex()和oct():因为二进制人类读取不方便,所以使用十六进制和八进制来表示计算机的内部的运算结构。
Unicode编码:Python字符串的编码方式。①统一字符编码,即覆盖几乎所有字符的编码方式。②从0到1114111(0x10FFFF)空间,每个编码对应一个字符。③Python字符串中每个字符都是Unicode编码字符。
4.字符串处理方法
“方法”在编程中是一个专有名词,特指<a>.<b>()风格中的函数b<>()。方法本身也是函数,但与<a>有关,必须是以<a>.<b>()风格使用。当字符串或字符串变量是<a>,存在一些可用方法。
方法及使用 | 描述 |
str.lower() 或 str.upper() | 返回字符串的副本,全部字符小写或大写 |
str.split(sep=None) | 返回一个列表,由str根据sep被分隔的部分组成。 sep的默认值是以 连续的空格、换行符、制表符 作为分割符。 |
str.count(sub) | 返回子串sub在str中出现的次数 |
str.replace(old,new) | 返回字符串str副本,所有old子串被替换为new |
str.center(width[,fillchar]) | 字符串根据宽度width居中,fillchar可选。 |
str.strip(chars) | 从str中去掉在其左侧和右侧chars中列出的字符 |
str.join(iter) | 在iter变量除最后元素外每个元素后增加一个str |
5.字符串类型的格式化
格式化是对字符串进行格式表达的方式。字符串格式化使用.format()方法,用法如下:
<模板字符串>.format(<逗号分隔的参数>)。
槽:槽这个概念只在字符串中有效,槽机制和format方法形成字符串的格式化。
3.4模块2:time库的使用
1.time库基本介绍
time库是Python中处理时间的标准库。其功能有:①计算机时间的表达,②提供获取系统时间并格式化输出功能,③提供系统级精确计时功能,用于程序性能分析。
time库包括三类函数:①时间获取:time(),ctime(),gmtime() ②时间格式化:strftime(),strptime() ③程序计时:sleep(),perf_counter()
2.时间获取
函数 | 描述 |
time() | 获取当前时间戳,即计算机内部时间值(浮点数) |
ctime() | 获取当前时间并以易读方式表示,返回字符串 |
gmtime | 获取当前时间,表示为计算机可处理的时间格式 |
3.时间格式化
时间格式化的目的是将时间以合理的方式展示出来。格式化:类似字符串格式化,需要有展示模板。展示模板由特定的格式化控制符组成。方法:strftime() 和 strptime()。
strftime(tpl,ts):tpl是格式化模板字符串,用来定义输出效果。ts是计算机内部时间类型变量。
格式化字符串 | 日期/时间说明 | 值范围 |
%Y | 年份 | 0000~9999 |
%m | 月份 | 01~12 |
%B | 月份名称 | January~December |
%b | 月份名称缩写 | Jan~Dec |
%d | 日期 | 01~31 |
%A | 星期 | Monday~Sunday |
%a | 星期缩写 | Mon~Sun |
%H | 小时(24h制) | 00~23 |
%I | 小时(12h制) | 01~12 |
%p | 上午/下午 | AM,PM |
%M | 分钟 | 00~59 |
%S | 秒 | 00~59 |
strptime(str,tpl):str是字符串形式的时间值。tpl是格式化模板字符串,用来定义输入效果。
4.程序计时应用
程序计时指测量起止动作所经历时间的过程,应用广泛。测量时间:perf_counter(),产生时间:sleep()。
函数 | 描述 |
perf_counter() | 返回一个CPU级别的精确时间计数值,单位为秒。 由于这个计数值起点不确定,连续调用差值才有意义。 代码: start = time.perf_counter() end = time.perf_counter() end - start #获得两次指针之间流逝的时间 |
sleep(s) | s拟休眠的时间,单位是秒,可以是浮点数 代码: def wait(): time.sleep(3.3) wait() #程序将等待3.3秒后再退出 |
3.5实例4:文本进度条
1.问题分析
(1)需求分析
①进度条的原理:文本进度条是采用字符串方式打印可以动态变化的文本进度条。进度条需要能在一行中逐渐变化。
(2)问题分析
①如何获得文本进度条的变化时间:采用sleep()模拟一个持续的进度。
2.简单的开始
#TextProBarV1.py
import time
scale = 10
print("------执行开始------") #表示二:print("{:-^16}".format("执行开始"))
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("------执行结束------")
3.单行动态刷新
刷新的关键是\r。刷新的本质是用之后打印的字符覆盖之前的字符。注意两点:①不能换行:print()需要被控制。②要能回退:打印后光标退回到之前的位置 \r。
#TextProBarV2.py
import time
for i in range(101):
print("\r{:3}%".format(i),end="")
time.sleep(0.1)
在IDLE中执行代码,看到的不是刷新,而是所有的信息都被展示了出来,每一次打印并没有回到行首进行刷新。不是程序出错,而是因为IDLE本身是一个编写程序的开发环境,并不是程序运行的主要环境。我们运行程序要么通过双击来实现程序运行,要么通过控制台来进行运行,很少直接用IDLE来运行的,由于IDLE被设定为开发环境,为保证其中参数的运行的一个效果,就把\r这个功能屏蔽掉了。为了让程序能够正确运行,可以在cmd类似的相关工具,当采取这种方式时操作系统是提供\r这个功能。
4.实例完整效果
#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,"-"))
5.举一反三
(1)计算问题扩展
①文本进度条程序使用了perf_counter()计时
②计时方法适合各类需要统计时间的计算问题。例如:比较不同算法时间,统计程序运行时间。
(2)进度条应用
①在任何运行时间需要较长的程序中增加进度条。
②在任何希望提高用户体验的应用中增加进度条。
③进度条是人机交互的纽带之一。进度条开始慢,后续的增长幅度逐渐增加这种方式更符合人的心理。
(3)文本进度条的不同设计函数
设计名称 | 趋势 | 设计函数 |
Linear | Constant | f(x)=x |
Early Pause | Speeds up | f(x)=x+(1-sin(x**2+/2)/(-8) |
Late Pause | Slows down | f(x)=x+(1-sin(x**2+/2)/8 |
Slow Wavy | Constant | f(x)=x+sin(x**5)/20 |
Fast Wavy | Constant | f(x)=x+sin(x**20)/80 |
Power | Speeds up | |
Inverse Power | Slows down | |
Fast Power | Speeds up | |
Inverse Fast Power | Slows down |