基本数据类型
数字类型及操作
首先复习一下前两次的内容:
- python基本语法元素
- 缩进、注释、命名、变量、保留字
- 数据类型、字符串、整数、浮点数、列表
- 赋值语句、分支语句、函数
- input()、print()、eval()、print()格式化 - python基本图形绘制
- 从计算机技术角度看待python语言
- 海龟绘图体系及import保留字用法
- penup()、pendown()、pensize()、pencolor()
- fd()、circle()、seth()
- 循环语句:for和in、range()函数
下面学习本次内容:基本数据类型
- 数字类型及操作
- 实例3:天天向上的力量
- 字符串类型及操作
- 模块2:time库的使用
- 实例4:文本进度条
一、数字类型及操作
1. 整数类型
与数学中整数的概念是一致的,可正可负,没有取值范围限制
函数:pow(x, y) 计算x的y次方
pow(2,100) #1267650600228229401496703205376
4种进制表示:
- 十进制:1010,99,-217
- 二进制,以0b或者0B开头:0b010,-0B101
- 八进制,以0o或者0O开头:0o123,-0O456
- 十六进制,以0x或者0X开头:0X78,-0X9a
2. 浮点类型
与数学中实数的概念一致,带有小数点及小数的数字,浮点数取值范围和小数精度都存在限制,但常规计算可以忽略
特点:浮点数间运算存在不确定尾数,不是bug,例:
>>>0.1 + 0.2
0.30000000000004
>>>0.1 + 0.2 == 0.3
False
>>>round(0.1 + 0.2, 1) == 0.3
True
-
我们可以使用round(x ,d)函数,对x进行四舍五入,d是小数截取位数
-
浮点数间运算及比较用round()函数辅助
-
浮点数可以采用科学计数法表示,以10为基数,格式如下:
- 使用字母e或E作为幂的符号,以10为基数,格式:< a>e< b> 表示a * 10的b次方
3. 复数类型
与数学中的复数概念是一致的
- a+bj被称为复数,其中a是实部,b是虚部
- z.real获得实部,z.imag获得虚部
4. 数值运算操作符
- 操作符是完成运算的一种符号体系
操作符及使用 | 描述 |
---|---|
x + y | 加,x与y之和 |
x - y | 减,x与y之差 |
x * y | 乘,x与y之积 |
x / y | 除,x与y之商 |
x // y | 取整数,x与y之整数商 |
x % y | 余数,模运算 |
x ** y | 幂运算,x的y次幂 |
- 二元操作符有对应的增强运算符
增强操作符及使用 | 描述 |
---|---|
x op = y | 即x = x op y,op 为二元操作符 |
x+=y 、 x -= y 、 x *=y 等 |
-
在python中类型间可进行混合运算,生成结果为“最宽”类型:
- 三种类型存在一种逐渐“扩展”或“变宽”的关系:整数 -> 浮点数 -> 复数
5. 数值运算函数
一些以函数形式提供的数值运算功能
函数及使用 | 描述 |
---|---|
abs(x) | 绝对值,x的绝对值 |
divmod (x ,y) | 商余,(x // y, x % y),同时输出商和余数 |
pow(x , y [ ,z ]) | 幂余,(x**y)% z |
roound(x [, d ]) | 四舍五入,d为保留小数位,默认为0 |
max(x1,x2,x3…,xn) | 返回最大值 |
min(x1,x2,x3…,xn) | 返回最小值 |
int(x) | 将x变成整数,舍弃小数部分,不进行四舍五入运算 |
float(x) | 将x变成浮点数,增加小数部分 |
complex(x) | 将x变成复数,增加虚数部分 |
实例3:天天向上的力量
1.问题分析
基本问题:持续的价值
- 一年365天,每天进步1%,累计进步多少呢?
- 一年365天,每天退步1%,还剩下多少呢?
2. 问题: 1‰的力量
# DayDayUp01.py
dayup = pow(1.001,365)
daydown = pow(0.999,365)
print("向上:{:.2f},向下:{:.2f}".format(dayup,daydown))
3. 问题: 5‰和1%的力量
# DayDayUp02.py
dayfactor = 0.005
dayup = pow(1+dayfactor,365)
daydown = pow(1-dayfactor,365)
print("向上:{:.2f},向下:{:.2f}".format(dayup,daydown))
4. 问题:工作日进步1%,休息日退步1%
# DayDayUp03.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))
5. 问题:工作日的努力
工作日模式下要努力到什么水平,才能与每天努力1%一样?
#
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
print("工作日的努力值是:{:.3f}".format(dayfactor))
举一反三
抽象和自动化的思想
问题变化和拓展:
- 工作日模式中,如果休息日不下降?
- 每天多一份努力呢?多一份懈怠呢?
- 三天打鱼两天晒网呢?
二、字符串类型及操作
- 字符串类型的表示
- 字符串操作符
- 字符串处理函数
- 字符串处理方法
- 字符串类型的格式化
1.字符串类型的表示
字符串是由0个或多个字符组成的
由2类共4种表示方法:
- 由一对单引号或双引号表示,仅表示单行字符串
- 由一对三单引号或三双引号表示,可表示多行字符串
这使得字符串中出现单引号或双引号变得很好处理
字符串的序号:
- 正向递增序号
- 反向递减序号
**字符串切片高级用法:**使用[M:N:K]根据步长对字符串切片
- <字符串>[M:N],M缺失表示至开头,N缺失表示至结尾
- <字符串>[M:N:K],根据步长 K对字符串切片
字符串的特殊字符:
-
转义符:\
- 转义符表达特定字符的本意
- 转义符形成一些组合,表达一些不可打印的含义,例:“\b”回退,“\n”换行
2.字符串操作
操作符及使用 | 描述 |
---|---|
x + y | 连接两个字符串x和y |
n * x | 复制n次字符串x |
x in s | 如果x是s的子串,返回True,否则返回False |
下面看几个例子:
- 获取星期字符串:
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.字符串处理函数
一些以函数形式提供的字符串处理功能
函数及使用 | 描述 |
---|---|
len(x) | 长度,返回字符串x的长度 |
str(x) | 任意类型x所对应的字符串形式 |
hex(x)或oct(x) | 将整数x的十六进制或八进制小写形式字符串 |
chr(u) | u为Unicode编码,返回其对应的字符 |
ord(x) | x为字符,返回其对应的Unicode编码 |
4.字符串的处理方式
“方法 ”在编程中是一个专有名词
- “方法”特指< a>.< b>()风格中的函数< b>()
- 方法本省也是函数,但与< a>有关,< a>.< b>()风格使用
- 字符串及变量也是< a>,存在一些操作方法
- 八类处理方法:
方法及使用 | 描述 |
---|---|
str.lower()或str.upper() | 返回字符串副本,全部字符小写/大写 |
str.split(sep=None) | 返回一个列表,有str根据sep被分隔的部分组成 |
str.count(sub) | 返回子串sub在str中出现的次数 |
str.replace(old,new) | 返回字符串str副本,所有old子串被替换为new |
str.center(width[,fillchar]) | 字符串str根据宽度width居中,fillchar可选 |
str.strip(chars) | 从str中去掉在其左侧和右侧chars中列出的字符 |
str.join(iter) | 在iter变量除最后元素外每个元素后增加一个str |
5.字符串类型的格式化
格式化是对字符串进行格式表达的方式
- 字符串格式化使用**.format()**方法,用法如下:
- <模板字符串>.format(<逗号分隔的参数>)
槽:每一个槽与format中添加的参数相对应,按照对应的顺序添加到对应的槽中
槽内部对格式化的配置方式:
: | <填充> | < 对齐> | <宽度> | <,> | <. 精度> | <类型> |
---|---|---|---|---|---|---|
引导符号 | 用于填充的单个字符 | <左对齐、>右对齐、^居中 | 槽设定的输出宽度 | 数字的千分分隔符 | 浮点小数精度或字符串最大输出长度 | 整数类型:b,c,d,o,x,X浮点数类型:e,E,f,% |
模块2:time库的使用
- time库的基本情况
- 时间获取
- 时间格式化
- 程序计时应用
1.time库的基本情况
time库是python中处理时间的标准库
import time
- 计算机时间的表达
- 提供获取系统时间并格式化输出功能
- 提供系统及精确计时功能,用于程序性能分析
time库包括三类函数:
- 时间获取:time()、ctime()、gmtime()
- 时间格式化:strftime()、strptime()
- 程序计时:sleep()、perf_counter()
2.时间获取
函数 | 描述 |
---|---|
time() | 获取当前时间戳,即计算机内部时间值,浮点数 |
ctime() | 获取当前时间并以易读方式表示返回字符串 |
gmtime() | 获取当前时间,表示为计算机可处理的时间格式 |
3.时间格式化
将时间以合理的方式展示出来
函数 | 描述 |
---|---|
strftime(tpl,ts) | tpl是格式化模板字符串,用来定义输出效果,ts是计算机内部时间类型变量 |
strptime(str,tpl) | str是字符串的时间值,tpl是格式化模板字符串,用来定义输入效果 |
时间格式化:
格式化字符串 | 日期/时间说明 |
---|---|
%Y | 年份 |
%m | 月份 |
%B | 月份名称 |
%b | 月份名称缩写 |
%d | 日期 |
%A | 星期 |
%a | 星期缩写 |
%H | 小时(24) |
%I | 小时(12) |
%p | 上下午 |
%M | 分钟 |
%S | 秒 |
4.程序计时应用
- 程序计时指测量起止动作所经历时间的过程
- 测量时间:perf_counter()指能够记录时间的流逝连续调用求差值
- 产生时间:sleep(),拟休眠的时间,单位是秒
实例4:文本进度条
1.需求分析:
- 采用字符串方式打印可以动态变化的进度条
- 进度条需要能在一行中逐渐变化
2.“文本进度条”简单的开始
#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("------执行结束------")
运行结果:
3.单行动态刷新
能够在每一行中根据程序的进度不断显示文本进度条
- 刷新的本质:用后打印的字符覆盖之前的字符
- 不能换行:print()需要被控制
- 要能退回:打印后光标退回到之前的位置:\r
#TextProBarV2.py
import time
for i in range(101):
print("\r{:3}%".format(i),end="")
time.sleep(0.1)
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.“举一反三”
- 例如:比较不同算法时间、统计部分程序运行时间
- 在任何运行时间需要较长的程序中增加进度条
- 在任何希望提高用户体验的应用程序中增加进度条
- 进度条是人机交互的纽带之一
- 进度条的展示效果,有兴趣可以去查看一些对应的函数