目录:
- 3.1 数字类型及操作
- 3.2 实例3: 天天向上的力量
- 3.3 字符串类型及操作
- 3.4模块2: time库的使用
- 3.5实例4: 文本进度条
课程导学
前课复习
Python基本语法元素
- 缩进、注释、命名、变量、保留字
- 数据类型、字符串、整数、浮点数、列表
- 赋值语句、分支语句、函数
- input()、print()、eval()、print()格式化
Python基本图形绘制
- 从计算机技术演进角度看待Python语言
- 海龟绘图体系及import保留字用法
- penup()、pendown()、pensize()、pencolor()
- fd()、circle()、seth()
- -循环语句:for和in、range()函数
保留字
温度转换
Python蟒蛇绘制
第3章 基本数据类型
目录:
- 3.1 数字类型及操作
- 3.2 实例3: 天天向上的力量
- 3.3 字符串类型及操作
- 3.4模块2: time库的使用
- 3.5实例4: 文本进度条
方法论- Python数字及字符串类型
实践能力-初步学会编程进行字符类操作
练习(可选)- 5道编程@Python123
测验- 10道单选+2道编程@Python123
- 3.1 数字类型及操作
目录:
- 整数类型
- 浮点数类型
- 复数类型
- 数值运算操作符
- 数值运算函数
小结:
- 整数类型的无限范围及4种进制表示
- 浮点数类型的近似无限范围、小尾数及科学计数法
- +、-、*、/、//、%、**、二元增强赋值操作符
- abs()、divmod()、pow()、round()、max()、min()
- int()、float()、complex()
3.1.1-整数类型
与数学中整数的概念一致
- 可正可负,没有取值范围限制
- pow(x,y)函数:计算xy,想算多大算多大
4种进制表示形式:
- 十进制:1010, 99, -217
- 二进制,以0b或0B开头:0b010, -0B101
- 八进制,以0o或0O开头:0o123, -0O456
- 十六进制,以0x或0X开头:0x9a, -0X89
小结:关于Python整数,就需要知道这些。
•整数无限制pow()
•4种进制表示形式
3.1.2-浮点数类型
与数学中实数的概念一致
- 带有小数点及小数的数字
- 浮点数取值范围和小数精度都存在限制,但常规计算可忽略
- 取值范围数量级约-10307至10308,精度数量级10-16
浮点数间运算存在不确定尾数,不是bug
- round(x, d):对x四舍五入,d是小数截取位数
- 浮点数间运算与比较用round()函数辅助
- 不确定尾数一般发生在10-16左右,round()十分有效
浮点数可以采用科学计数法表示
- 使用字母e或E作为幂的符号,以10为基数,格式如下:
e 表示a*10b - 例如:4.3e-3值为0.0043 9.6E5值为960000.0
小结:关于Python浮点数,需要知道这些。
•取值范围和精度基本无限制
•运算存在不确定尾数round()
•科学计数法表示
3.1.3-复数类型
与数学中复数的概念一致
如果x2= -1,那么x的值是什么?
- 定义j= −𝟏𝟏,以此为基础,构建数学体系
- a+bj被称为复数,其中,a是实部,b是虚部
复数实例
z = 1.23e-4+5.6e+89j
- 实部是什么?z.real获得实部
- 虚部是什么?z.imag获得虚部
3.1.4-数值运算操作符
操作符是完成运算的一种符号体系
二元操作符有对应的增强赋值操作符
数字类型的关系
类型间可进行混合运算,生成结果为"最宽"类型
- 三种类型存在一种逐渐"扩展"或"变宽"的关系:
整数->浮点数-> 复数 - 例如:123 + 4.0 = 127.0 (整数+浮点数= 浮点数)
3.1.5-数值运算函数
一些以函数形式提供的数值运算功能
- 3.2 实例3: 天天向上的力量
3.2.1 问题分析
天天向上的力量
基本问题:持续的价值
-一年365天,每天进步1%,累计进步多少呢?
-一年365天,每天退步1%,累计剩下多少呢?1. 013650.99365
需求分析
天天向上的力量
-数学公式可以求解,似乎没必要用程序
-如果是"三天打鱼两天晒网"呢?
-如果是"双休日又不退步"呢?
3.2.2 第一问
问题1:1‰的力量
-一年365天,每天进步1‰,累计进步多少呢?
1.001365
-一年365天,每天退步1‰,累计剩下多少呢?0.999365
#DayDayUpQ1.py
dayup = pow(1.001, 365)
daydown = pow(0.999, 365)
print("向上:{:.2f},向下:{:.2f}".format(dayup, daydown))
编写上述代码,并保存为DayDayUpQ1.py文件
3.2.3 第二问
问题2:5‰和1%的力量
-一年365天,每天进步5‰或1%,累计进步多少呢?
1.005365——1. 01365
-一年365天,每天退步5‰或1%,累计剩下多少呢?0.995365——0.99365
#DayDayUpQ2.py
dayfactor= 0.005
dayup = pow(1+dayfactor, 365)
daydown = pow(1-dayfactor, 365)
print("向上:{:.2f},向下:{:.2f}".format(dayup, daydown))
编写上述代码,并保存为DayDayUpQ2.py文件
使用变量的好处:一处修改即可
3.2.4 第三问
问题3:工作日的力量
-一年365天,一周5个工作日,每天进步1%
-一年365天,一周2个休息日,每天退步1%
-这种工作日的力量,如何呢?
1.01365(数学思维) ➡️ 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))
采用循环模拟365天的过程抽象+ 自动化
3.2.5 第四问
问题4:工作日的努力
-工作日模式要努力到什么水平,才能与每天努力1%一样?
-A君: 一年365天,每天进步1%,不停歇
-B君: 一年365天,每周工作5天休息2天,休息日下降1%,要多努力呢?
#DayDayUpQ4.py
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))
根据df参数计算工作日力量的函数
参数不同,这段代码可共用
def保留字用于定义函数
while保留字判断条件是否成立
条件成立时循环执行
GRIT:perseverance and passion for long-term goals
1.01365= 37.781. 019365= 962.89
-GRIT,坚毅,对长期目标的持续激情及持久耐力
-GRIT是获得成功最重要的因素之一,牢记天天向上的力量
3.2.6 举一反三
天天向上的力量
-实例虽然仅包含8-12行代码,但包含很多语法元素
-条件循环、计数循环、分支、函数、计算思维
-清楚理解这些代码能够快速入门Python语言
问题的变化和扩展
-工作日模式中,如果休息日不下降呢?
-如果努力每天提高1%,休息时每天下降1‰呢?
-如果工作3天休息1天呢?
问题的变化和扩展
-"三天打鱼,两天晒网"呢?
-"多一份努力"呢?(努力比下降多一点儿)
-"多一点懈怠"呢?(下降比努力多一点儿)
- 3.3 字符串类型及操作
目录:
- 字符串类型的表示
- 字符串操作符
- 字符串处理函数
- 字符串处理方法
- 字符串类型的格式化
小结:
- 正向递增序号、反向递减序号、<字符串>[M:N:K]
- +、*、in、len()、str()、hex()、oct()、ord()、chr()
- .lower()、.upper()、.split()、.count()、.replace()
- .center()、.strip()、.join()、.format()格式化
3.3.1-字符串类型的表示
字符串
:由0个或多个字符组成的有序字符序列
- 字符串由一对单引号或一对双引号表示
"请输入带有符号的温度值: "或者’C’ - 字符串是字符的有序序列,可以对其中的字符进行索引
"请"是"请输入带有符号的温度值: "的第0个字符
字符串有2类共4种表示方法
- 由一对单引号或双引号表示,仅表示单行字符串
"请输入带有符号的温度值: "或者’C’ - 由一对三单引号或三双引号表示,可表示多行字符串
‘’’ Python
语言’’’
Q: 老师老师,三引号不是多行注释吗?
Python语言为何提供2类共4种字符串表示方式?
- 如果希望在字符串中包含双引号或单引号呢?
'这里有个双引号(")‘或者"这里有个单引号(’)" - 如果希望在字符串中既包括单引号又包括双引号呢?
‘’‘这里既有单引号(’)又有双引号(") ‘’’
字符串的使用
使用[ ]获取字符串中一个或多个字符
- 索引:返回字符串中单个字符<字符串>[M]
"请输入带有符号的温度值: "[0]或者TempStr[-1] - 切片:返回字符串中一段字符子串<字符串>[M: N]
"请输入带有符号的温度值: "[1:3]或者TempStr[0:-1]
字符串切片高级用法
使用[M:N: K]根据步长对字符串切片
- <字符串>[M: N],M缺失表示至开头,N缺失表示至结尾
“〇一二三四五六七八九十”[:3]结果是"〇一二" - <字符串>[M: N: K],根据步长K对字符串切片
“〇一二三四五六七八九十”[1:8:2] 结果是"一三五七"
“〇一二三四五六七八九十”[::- 1] 结果是"十九八七六五四三二一〇"
字符串的特殊字符
转义符\
- 转义符表达特定字符的本意
“这里有个双引号(”)“结果为这里有个双引号(”) - 转义符形成一些组合,表达一些不可打印的含义
“\b"回退”\n"换行(光标移动到下行首)"\r"回车(光标移动到本行首)
3.3.2-字符串操作符
字符串操作符:由0个或多个字符组成的有序字符序列
操作符及使用 | 描述 |
x+ y | 连接两个字符串x和y |
n *x 或x *n | 复制n次字符串x |
x ins | 如果x是s的子串,返回Tr u e,否则返回False |
获取星期字符串:
- 输入: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.3.3-字符串处理函数
一些以函数形式提供的字符串处理功能
Unicode编码
- 统一字符编码,即覆盖几乎所有字符的编码方式
- 从0到1114111(0x10FFFF)空间,每个编码对应一个字符
- Python字符串中每个字符都是Unicode编码字符
一些有趣的例子:
3.3.4-字符串处理方法
"方法"在编程中是一个专有名词
- "方法"特指.()风格中的函数()
- 方法本身也是函数,但与有关,.()风格使用
- 字符串或字符串变量是,存在一些可用方法
一些以方法形式提供的字符串处理功能
3.3.5-字符串类型的格式化
格式化是对字符串进行格式表达的方式
- 字符串格式化使用.format()方法,用法如下:
<模板字符串>.format(<逗号分隔的参数>)
- 3.4模块2: time库的使用
3.4.1 time库基本介绍
time库概述:
time库是Python中处理时间的标准库
- 计算机时间的表达
- 提供获取系统时间并格式化输出功能
- 提供系统级精确计时功能,用于程序性能分析
import time
time.<b>()
time库包括三类函数
- 时间获取:time() ctime() gmtime()
- 时间格式化:strftime() strptime()
- 程序计时:sleep(), perf_counter()
3.4.2 时间获取
3.4.3 时间格式化
将时间以合理的方式展示出来
- 格式化:类似字符串格式化,需要有展示模板
- 展示模板由特定的格式化控制符组成
- strftime()方法
3.4.4 程序计时应用
程序计时:
程序计时应用广泛
- 程序计时指测量起止动作所经历时间的过程
- 测量时间:perf_counter()
- 产生时间:sleep()
- 3.5实例4: 文本进度条
3.5.1 问题分析
需求分析
文本进度条
-采用字符串方式打印可以动态变化的文本进度条
-进度条需要能在一行中逐渐变化
问题分析
如何获得文本进度条的变化时间?
-采用sleep()模拟一个持续的进度
-似乎不那么难
3.5.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.5.3 单行动态刷新
刷新的关键是\r
- 刷新的本质是:用之后打印的字符覆盖之前的字符
- 不能换行:print()需要被控制
- 要能回退:打印后光标退回到之前的位置\r
#TextProBarV2.py
import time
for i in range(101):
print("\r{:3}%".format(i), end="")
time.sleep(0.1)
IDLE屏蔽了\r功能
3.5.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,'-'))
3.5.4 举一反三
计算问题扩展
- 文本进度条程序使用了perf_counter()计时
- 计时方法适合各类需要统计时间的计算问题
- 例如:比较不同算法时间、统计程序运行时间
进度条应用
- 在任何运行时间需要较长的程序中增加进度条
- 在任何希望提高用户体验的应用中增加进度条
- 进度条是人机交互的纽带之一
作业