文章目录
基本数据类型
数字类型及其操作
整数类型
浮点类型
复数类型
数值运算操作符
数值运算函数
好好学习,天天向上
问题1: 1的力量
问题2:0.5%和0.1%的力量
问题3: 工作日的力量
字符串类型
字符串类型的表示
字符串操作符
字符串处理函数
字符串处理方法
字符串类型的格式化
time库基本介绍
时间获取
时间格式化
程序计时应用
文本进度条实现
学习目标:
Python语言数字及字符串类型
初步用编程进行字符类操作(⭐⭐⭐)
数字类型及其操作
学习内容:
整数类型
浮点数类型
复数类型
数值运算操作符
数值运算函数
整数类型
整数无限制
pow(x,y)函数:计算x的y次方
a= pow(2,99) b= pow(2,pow(2,10)) print(a) print(b)
4种进制表示
十进制:1000,89,-34
二进制:以0b或0B开头,0b010,-0B101
八进制:以0o或0O(零ou不是00),0o1234,-0O678
十六进制:以0x或0X开头,0x9b,-0X89
浮点类型
与数学中实数的概念一致
带有小数点及小数的数字
浮点数取值范围和小数精度都存在限制,但常规计算可忽略不计
取值范围数量级约为 -10^308 ~ 10^308 ,精度数量级10 ^-16
浮点数间运算存在不确定尾数,不是bug
0.1 + 0.3
0.4
0.1 + 0.2
0.30000000000000004
不确定尾数
Why?
因为计算机语言设计问题,Python语言用53位二进制表示小数部分,由于计算机中的二进制跟十进制之间不存在严格的对等关系(学过计算机科学导论应该明白)0.1在用二进制表是的时候,它是一个无限小数,计算机就会截取53位,使其无限的接近0.1,并不真正等于0.1,所以会有尾数产生。
>>> 0.1 + 0.2 == 0.3 False >>> round(0.1+0.2, 1) == 0.3 True
我们发现0.1+0.2计算机认为是不等于0.3的,因为有不确定尾数在调皮,那么,如何解决呢?
round(x,d):对X进行四舍五入,d是小数截取位数
在浮点数间运算及比较时用round函数辅助完成(金牌辅助)
不确定尾数一般发生在 10^-16 左右,所以说round()函数十分有效。
科学计数法
浮点数可以采用科学计数法表示
使用字母e或E作为幂的符号,以10为基数,格式如下: <a>e<b> 表示 a*10b 例如:4.3e-3 值为0.0043 9.6E5 值为960000.0
复数类型
与数学中复数的概念一致
x2 = -1,那么x的值是什么? - 定义 j = −𝟏𝟏 ,以此为基础,构建数学体系
a+bj 被称为复数,其中,a是实部,b是虚部 z = 1.23e-4+5.6e+89j - 实部是什么? z.real 获得实部 - 虚部是什么? z.imag 获得虚部
了解
数值运算操作符
一元操作符 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本身 - y x的负值 x % y 余数 模运算 10%3结果是1 x ** y 幂运算,x的y次幂 当y是小数时,开方运算10**0.5结果是 根号10 二元操作符 x += y x -= y x *= y x /= y x //= y x %= y x **= y >>> x = 3.1415 >>> x **= 3 # 与 x = x **3 等价 31.006276662836743
类型间可进行混合运算,生成结果为"最宽"类型
三种类型存在一种逐渐"扩展"或"变宽"的关系:
整数 -> 浮点数 -> 复数
例如:123 + 4.0 = 127.0 (整数+浮点数 = 浮点数)
数值运算函数
一些以函数形式提供的数值运算功能
abs(x) 绝对值,x的绝对值abs(-10.01) 结果为 10.01
divmod(x,y) 商余,(x//y, x%y),同时输出商和余数 divmod(10, 3) 结果为 (3, 1)
pow(x, y[, z]) 幂余,(x**y)%z,[…]表示参数z可省略 pow(3, pow(3, 99), 10000) 结果为 4587
round(x[, d]) 四舍五入,d是保留小数位数,默认值为0 round(-10.123, 2) 结果为 -10.12
max(x1,x2, … ,xn) 最大值,返回x1,x2, … ,xn中的最大值,n不限 max(1, 9, 5, 4, 3) 结果为 9
min(x1,x2, … ,xn) 最小值,返回x1,x2, … ,xn中的最小值,n不限 min(1, 9, 5, 4, 3) 结果为 1
int(x) 将x变成整数,舍弃小数部分 int(123.45) 结果为123; int(“123”) 结果为123
float(x) 将x变成浮点数,增加小数部分 float(12) 结果为12.0; float(“1.23”) 结果为1.23
complex(x) 将x变成复数,增加虚数部分 complex(4) 结果为 4 + 0j
好好学习,天天向上
基本问题:持续的价值
问题1: 1的力量
一年365天,每天进步1%,累计进步多少呢?
1.01^365
一年365天,每天退步1%,累计剩下多少呢?
0.99^365
代码实现
up = pow(1.001, 365) down = pow(0.999, 365) print("向上:{:.2f},向下:{:.2f}".format(up, down))
结果:
不积小流无以成江海,不积跬步无以至千里。
问题2:0.5%和0.1%的力量
一年365天,每天进步0.5%或0.1%,累计进步多少呢?
一年365天,每天退步0.5%或0.1%,累计剩下多少呢?
1.005^365 0.995^365
1.01^365 0.99^365
代码实现
day = 0.005 up = pow(1+day, 365) down = pow(1-day, 365) print("向上:{:.2f},向下:{:.2f}".format(up, down))
结果:
问题3: 工作日的力量
一年365天,一周5个工作日,每天进步1%
一年365天,一周2个休息日,每天退步1%
这种工作日的力量,如何呢?
1.01365 (数学思维)——》 for…in… (计算思维)
代码实现:
#利用循环模拟 nice #注意代码的缩进 up = 1.0 day = 0.01 for i in range(365): if i % 7 in [6,0]: #用来确定周末的时间 up = up*(1-day) else: #工作日的时间 up = up*(1+day) print("工作日的力量:{:.2f} ".format(up))
结果:
1.001^365 = 1.44
1.005^365 = 6.17
1.01^365 = 37.78
1.019^365 = 962.89
字符串类型
主要内容:
字符串类型的表示
字符串操作符
字符串处理函数
字符串处理方法
字符串类型的格式化
字符串类型的表示
由0个或多个字符组成的有序字符序列
字符串由一对单引号或一对双引号表示
"请输入带有符号的温度值: " 或者 ‘C’
字符串是字符的有序序列,可以对其中的字符进行索引
“请” 是 "请输入带有符号的温度值: " 的第0个字符
表示方法
字符串有 2类共4种 表示方法 - 由一对单引号或双引号表示,仅表示单行字符串 "请输入带有符号的温度值: " 或者 'C' - 由一对三单引号或三双引号表示,可表示多行字符串 ''' Python 语言 '''
为什么这样提供四种
假如我们想用单引号,就可以外加一对双引号
加入我们们既想用双引号又想用单引号,就可以让我们的三引号登场
另外没有给变量名的三引号字符串可以充当多行注释来使用
正向递增序号 和 反向递减序号
使用[ ]获取字符串中一个或多个字符
- 索引:返回字符串中单个字符 <字符串>[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" 回车(光标移动到本行首)
字符串操作符
获取星期字符串
weekStr = "星期一星期二星期三星期四星期五星期六星期日" weekId = eval(input("请输入星期数字(1-7):")) pos = (weekId – 1 ) * 3 print(weekStr[pos: pos+3])
优化
weekStr = "一二三四五六日" weekId = eval(input("请输入星期数字(1-7):")) #获取用户输入,是一个字符串类型 eval函数去掉引号 如果没加就会报错 print("星期" + weekStr[weekId-1]) #因为字符串下标是0开始的
字符串处理函数
一些以函数形式提供的字符串处理功能
Python字符串的编码方式
统一字符编码,即覆盖几乎所有字符的编码方式
从0到1114111 (0x10FFFF)空间,每个编码对应一个字符
Python字符串中每个字符都是Unicode编码字符
玩一玩
b="1 + 1 = 2" + chr(10004) c="这个字符♉的Unicode值是:a" + str(ord("♉")) print(b) print(c) for i in range(12): print(chr(9800 + i), end="")
字符串处理方法
"方法"在编程中是一个专有名词
- "方法"特指<a>.<b>()风格中的函数<b>() - 方法本身也是函数,但与<a>有关,<a>.<b>()风格使用 - 字符串或字符串变量是<a>,存在一些可用方法
字符串类型的格式化
格式化是对字符串进行格式表达的方式
time库基本介绍
time库是Python中处理时间的标准库
用途:
计算机时间的表达
提供获取系统时间并格式化输出功能
提供系统级精确计时功能,用于程序性能分析
用法:
import time time.<b>()
time库包括三类函数
时间获取:time() ctime() gmtime()
时间格式化:strftime() strptime()
程序计时:sleep(), perf_counter()
时间获取
时间格式化
将时间以合理的方式展示出来
格式化:类似字符串格式化,需要有展示模板
展示模板由特定的格式化控制符组成
strftime()方法
程序计时应用
程序计时指测量起止动作所经历时间的过程
测量时间:perf_counter()
产生时间:sleep()
文本进度条实现
需求分析
采用字符串方式打印可以动态变化的文本进度条 进度条需要能在一行中逐渐变化 如何获得文本进度条的变化时间? 采用sleep()模拟一个持续的进度 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.4) #每隔0.4秒打印一次,模拟 print("------执行结束------")
优化单行动态刷新
不让换行就可以 哈哈
刷新的关键是 \r退回行首
刷新的本质是:用之后打印的字符覆盖之前的字符
不能换行:print()需要被控制
要能回退:打印后光标退回到之前的位置 \r
import time for i in range(101): print("\r{:3}%".format(i), end="") time.sleep(0.1)
完整代码:
import time s = 40 print("正在安装".center(s//2, "-")) start = time.perf_counter() for i in range(s+1): a = '◼' * i b = '.' * (s - i) c = (i/s)*100 d = time.perf_counter() - start print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,d),end='') time.sleep(0.1) print("\n"+"安装完成".center(s//2,'-'))
最终效果
……