第三周
基本数据类型
数字类型及操作:
整数类型,浮点数类型,复数类型,数值运算操作符,数值运算函数
整数类型:与数学中的整数概念一致
可正可负,没有取值范围限制
pow(x,y)函数:计算xy想算多大算多大

整数类型的四种进制表示形式
十进制:1010,99,-217
二进制以0b或0B开头:0b010,-0B101
八进制以0o或0O开头:0o123,-0O456
十六进制以0x或0X开头:0x9a,-0X89
我们需要了解:整数无限制、pow函数、四种进制表示形式
浮点数类型:与数学中的实数概念一致
带有小数点以及小数的数字
浮点数的取值范围和小数精度都存在限制,但常规计算可以忽略
取值范围数量级约-10^308至10^308,精度数量级为10^-16
浮点数类型运算存在不确定尾数,不是bug,这个现象涉及到计算机组成原理里面的内容了,不详细展述
显示如下图所示:

出现这种情况的原因:
计算机以53位二进制表示小数部分,约10-16
0.1
0.000110011001100110011001100110011001100110011001100110011010(二进制表示)
0.100000000000000005551115123125782702119158340454101523 (十进制表示)
二进制表示小数,可以无限接近,但不完全相同
0.1+0.2 其结果无限接近0.3,但可能存在位数

round(x,d):对x四舍五入,d是小数截取位数
浮点数间运算及比较用round()函数辅助
不确定尾数一般发生在10-16左右,所以round( )十分有效
使用字母e或E作为幂的符号,以10为基数,格式如下:
<a>e<b> 表示a*10b

通过这种方式,可以表示较大或者非常小的浮点数
我们需要了解:
1、取值范围和精度基本无限制
2、运算存在不确定尾数,round()
3、科学计数法表示
复数类型:与数学中的复数概念一致
如果x2=-1,那么x的值是什么?
定义j=√(-1),以此为基础,构建数学体系
a+bj被称为复数,其中,a是实部,b是虚部
实部: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 | y的负值 |
| x % y | 余数,模运算 10%3结果为1 |
|
x ** y 与pow(x,y)的用法相同 |
幂运算,x的y次幂,xy |
| 当y是小数时,开方运算 10**0.5结果为√10 |
二元操作符有对应的增强赋值操作符:对两个数进行运算后,更改其中的一个数
| 增强操作符及使用 | 描述 |
| x op= y | 即 x = x op y,其中,op为二元操作符 |
|
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,3,5) 结果为2 同时,可以用这种方法,确定大额数值的最后几位 pow(3,pow(3,99),10000) 结果为4587 |
| round(x[,d]) |
四舍五入,d是保留小数位数,默认值为0 round(-10.123,2) 结果为 -10.12
遵循四舍六入五成偶原则, 被约的5前面的数值若为偶数时,则不进一, 若被约的5前面的数值为奇数,则进一; 若被约5后面有非0数值时,则都会进一
|
| 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.56) 结果为123;int("123") 结果为123 int("123.21")会得到ValueError |
| float(x) |
将x变成浮点数,增加小数部分 float(12) 结果为12.0;float("1.23") 结果为1.23; float("123") 结果为123.0 |
| complex(x) |
将x变为复数,增加虚数部分 complex(4) 结果为 4+0j |
“天天向上的力量”问题分析:
基本问题:持续的价值
一年365天,每天进步1%,累计进步多少呢?
一年365天,每天退步1%,累计剩下多少呢?
问题一:千分之一的力量
#DayDayUp1.py dayup =pow(1.001, 365) daydown =pow(0.999, 365) print("向上:{:.2f},向下:{:.2f}".format(dayup, daydown))
运行结果如下图所示

1.001365=1.44 0.999365=0.69
千分之一的力量,最后的结局将近是两倍,不可小觑
问题二:千分之五和百分之一的力量
一年365天,每天进步5‰或1%,累计进步多少呢?
一年365天,每天退步5‰或1%,累计剩下多少呢?
#DayDayUP2.py dayfactor = 0.005 dayup = pow(1+dayfactor,365) daydown =pow(1+dayfactor,365) print("向上:{:.2f},向下:{:.2f}".format(dayup,daydown))
#DayDayUP2.py dayfactor = 0.01 dayup = pow(1+dayfactor,365) daydown =pow(1+dayfactor,365) print("向上:{:.2f},向下:{:.2f}".format(dayup,daydown))
这就是使用变量的好处,只要改一个数字便可解决两个问题
运行结果如下图:

问题三:工作日的力量
一年365天,一周五个工作日,每天进步1%
一年365天,一周两个休息日,每天退步1%
这种休息日的力量如何呢?
#DayDayUp3.py dayup =1.0 dayfactor =0.01 for i in range(365): if i%7 in [0,6]: dayup = dayup*(1-dayfactor) else: dayup = dayup*(1+dayfactor) print("工作日的力量:{:.2f}".format(dayup))
运行结果如下图所示:

尽管进步百分之一,但由于休息日的退步导致,效果在千分之一和千分之五之间
问题四:工作日的努力
工作日要努力到什么程度,才能与每天努力1%一样
A君:一年365天,每天进步1%,不停歇
B君:一年365天,每周工作5天休息2天,休息日下降1%,要多努力呢?
for..in..(计算思维) => def..while..(“笨办法”试错)

#DayDayUp4.py def dayUP(fd): dayup = 1 for i in range(365): if i%7 in [0,6]: dayup = dayup*(1 - 0.01) else: dayup = dayup*(1 + fd) return dayup dayfactor = 0.01 while dayUP(dayfactor) < 37.78: dayfactor += 0.001 print("工作日的努力参数是:{:.3f}".format(dayfactor))
运行结果如下图所示:

工作日模式,每天要努力到1.9%,
相当于365模式每天1%的一倍!
1.01365=37.78 1.019365=962.89
字符串类型和操作单元
字符串类型的表示:
字符串:由0个或多个字符组成的有序字符序列
字符串由一对单引号或一对双引号表示(python默认使用单引号表示)
"请输入带有符号的温度值:"或者 'C'
字符串是字符的有序序列,可以对其中的字符进行索引
"请"是"请输入带有符号的温度值:" 的第0个字符
字符串的两类4种表示方法
由一对单引号或双引号表示,仅表示单行字符串
"请输入带有符号的温度值:"或者 'C'
由一对三单引号或三双引号表示,可以表示多行字符串
'''Python
语言 '''
"""Python
语言 """
我们前面提到过,三单引号或者三双引号是多行注释的一种说法,实际上,在Python语言中,实际上并没有真正提供多行注释的表示方式。三单引号构成的就是字符串,但是如果在程序中出现了一个字符串,这个字符串没有给到某一个变量中,或者这个字符串并没有进行任何操作,那么它可以当作注释来使用。
那么为什么要设置两类四种表示方法呢
如果希望在字符串中包含双引号或单引号呢?
'这里有个双引号(")' 或者 "这里有个单引号(')"
如果希望既包括双引号又包括单引号呢?
'''这里既有单引号(')又有双引号(")'''
字符串的序号:正向递增序号和反向递减序号

字符串的使用:使用[ ]获取字符串的一个或多个字符
索引:返回字符串中的单个字符 <字符串>[M]
切片:返回字符串中的一段字符子串 <字符串>[M:N]
字符串切片高级用法:使用[M:N:K]根据步长对字符串进行切片
<字符串>[M:N],M表示至开头,N缺失表示至结尾
"零一二三四五六七八九十"[:3] 结果是 "零一二"
"零一二三四五六七八九十"[-3:] 结果是 "八九十"
"零一二三四五六七八九十"[-3:-1] 结果是 "八九"
<字符串>[M:N:K],根据步长k对字符串进行切片
"零一二三四五六七八九"[1:8:2] 结果是 "一三五七"
"零一二三四五六"[::-1] 结果是"六五三二一零"
字符串的特殊字符:
转义符\
转义符表示特定字符的含义:
\b 退格符 使当前的光标向前回退一个位置,再用退格符后的字符进行替换,在IDLE中不能正常使用
\n 换行
\r 回车 光标回到本行最开始的位置
\t 制表符 代表四个空格,也就是一个tab;它的作用是对齐表格数据的各列,可以在不使用表格的情况下,将数据上下对齐
| 操作符及使用 | 描述 |
| x + y | 连接两个字符串x和y |
| n * x 或 x * n | 复制n次字符串x |
| x in s | 如果x是s的子串,返回True,否则返回False |
获取星期几字符串
#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])
输出结果如下:

字符串处理函数:一些以函数形式提供的字符串处理功能
| 函数及使用 | 描述 |
| len(x) |
长度,返回字符串x的长度 len("一二三456") 结果为 6 数字、标点符号、英文字母或者汉字都是一个字符,长度是相同的 |
| str(x) |
任意类型x对应的字符串形式 str(1.23)结果为"1.23";str([1,2])结果为"[1,2]" |
| hex(x) 或 oct(x) |
整数x的十六进制或八进制小写形式字符串 hex(425)结果为"0x1a9";oct(425)结果为"0o651" |
| chr(u) |
u为Unicode编码,返回其对应的字符 |
| ord(x) |
x为字符,返回其对应的Unicode编码 |

下面简单介绍一下unicode编码:python字符串的编码方式
统一字符编码,几乎覆盖了所有字符的编码方式
从0到1114111(0x10FFFF)空间,每个编码对应一个字符
python字符串中每个字符都是unicode编码字符
一些有趣的例子

字符串处理方法
“方法”在编程中是一个专有名词
“方法”特指<a>.<b>()风格中的函数<b>()
方法本身也是函数,但与<a>有关,以<a>.<b>()风格使用
字符串及变量也是<a>,存在一些方法
<a>.<b>风格是一种面向对象的使用风格,其中<a>是对象,<b>是某一种对象能够提供的功能,我们称之为方法,方法需要用"."的形式执行
一些以方法形式提供的字符串处理功能
| 方法及使用 |
描述 |
| str.lower()或str.upper() |
返回字符串的副本,全部字符小写/大写 "AbCdEfGh".lower()结果为”abcdefgh“ |
| str.split(sep=None) |
返回一个列表,由str根据sep被分隔的部分组成 "A,B,C".split(",")结果为['A','B','C'] |
| str.count(sub) | 返回子串sub在str中出现的次数 |
| str.replace(old,new) | 返回字符串str副本,所有子串被替换为new |
| str.center(width[,fillchar]) |
字符串str根据宽度width居中,fillchar可选 "python".center(20,"=")结果为 '=======python=======' |
| str.strip(chars) |
从str中去掉在其左侧和右侧chars中列出的字符 "= pypthnon=".strip(" =np")结果为 "ypthno" |
| str.join(iter) |
在iter变量除最后元素外,每个元素后增加一个str ",".join("12345")结果是 "1,2,3,4,5"#主要用于字符串分隔等 |
字符串类型的格式化
格式化是对字符串进行格式表达的方式:
字符串格式化使用.format()方法,用法如下:
<模板字符串>.format(<逗号分隔的参数>)
槽

{ }括起来的称为槽,默认顺序为0,1,2
也可以通过自定义的方式确定槽的顺序,如下图
槽之间的关系为,将format()函数中的参数,按照对应的顺序,填到模板字符串的槽中

槽内部使用格式化的控制标记,进行相关控制
槽内部对格式化的配置方式
{<参数序号>:<格式控制标记>}
| : | <填充> | <对齐> | <宽度> | <,> | <.精度> | <类型> |
| 引导符号 | 用于填充的单个字符 |
<左对齐 >右对齐 ^居中对齐 |
槽设定的输出宽度 | 数字的千位分隔符 | 浮点数小数精度或字符串最大输出长度 |
整数类型 b(二进制形式),c(字符形式,Unicode编码形式),d(十进制形式), o(八进制形式),x(十六进制形式),X(大写的十六进制) 浮点数类型 e(科学计数法e形式),E(科学计数法E形式), f(非科学计数法形式),%(百分数形式) |


time库的使用
time库是python中处理时间的标准库
1、用于计算机时间的表达
2、提供获取系统时间并格式化输出功能
3、提供系统级精确计时功能,用于程序性能分析
import time time.<b>()
time库包括三类函数
时间获取:time()、ctime()、gmtime()
时间格式化:strftime()、strptime()
程序计时:sleep()、perf_counter()
时间获取 先 import time或from time import*
| 函数 | 描述 |
| time() |
获取当前时间戳,即计算机内部时间值,浮点数 >>>time.time() 1646762035.3120291 每个时间戳都以自1970年1月1日0:00开始,到当前这一时刻为止的一个以秒位单位的数值 |
| ctime() |
获取当前时间并以易读方式表示,返回字符串 >>>time.ctime() 'Wed Mar 9 01:59:30 2022' 获取的是系统时间(北京时间) |
| gmtime() |
获取当前时间,表示为计算机可处理的时间格式 >>>time.gmtime() time.struct_time(tm_year=2022, tm_mon=3, tm_mday=8, tm_hour=18, tm_min=1, tm_sec=38, tm_wday=1, tm_yday=67, tm_isdst=0) 获取的是格林尼治时间(英国的标准时间) |
时间格式化:将时间以合理的方式展示出来
格式化:类似字符串的格式化,需要有展示模板
展示模板由特定的格式化控制符组成
strftime()方法
| 函数 | 描述 |
| strftime(tpl,ts) |
tpl是格式化模板字符串,用来定义输出效果 ts是计算机内部时间类型变量 >>>t = time.gmtime() >>>time.strftime("%Y-%m-%d %H:%M:%S",t) '2022-03-08 18:07:46' |
格式化控制符
| 格式化字符串 | 日期/时间说明 | 值范围和实例 |
| %Y | 年份 | 0000-9999,例如:1900 |
| %m | 月份 | 01-12,例如:10 |
| %B | 月份名称 | January-December,例如April |
| %b | 月份名称缩写 | Jan-Dec,例如Apr |
| %d | 日期 | 01-31,例如25 |
| %A | 星期 | Monday-Sunday,例如wednesday |
| %a | 星期缩写 | Mon-Sun,例如:Wed |
| %H | 小时(24h制) | 00-23,例如:12 |
| %h | 小时(12h制) | 01-12,例如:7 |
| %p | 上/下午 | AM,PM,例如PM |
| %M | 分钟 | 00-59,例如26 |
| %S | 秒 | 00-59,例如26 |
strptime()方法
| 函数 | 描述 |
| strptime(str,tpl) |
str是字符串形式的时间值 tpl是格式化模板字符串,用来定义输入效果 >>>timeStr='2022-03-09 02:35:23' >>>time.strptime(timeStr,"%Y-%m-%d %H:%M:%S") time.struct_time(tm_year=2022, tm_mon=3, tm_mday=9, tm_hour=2, tm_min=35, tm_sec=23, tm_wday=2, tm_yday=68, tm_isdst=-1) |
time函数用一个元组装起来的9组数字处理时间:


一个小例子
from time import* t = gmtime() ftime1 = strftime("%Y-%m-%d %H:%M:%S",t) #格式化成2016-03-20 11:45:39形式 ftime2 = strftime("%a %b %d %H:%M:%S %Y",t) #格式化成Sat Mar 28 22:24:24 2016形式 timeStr1='2022-3-9 2:57:34' timeStr2='Wed Mar 9 2:57:34 2022' time3 = strptime(timeStr1,"%Y-%m-%d %H:%M:%S") time4 = mktime(strptime(timeStr2, "%a %b %d %H:%M:%S %Y")) #它接收struct_time对象作为参数,返回用秒数来表示时间的浮点数 print('格式化日期输出1:', ftime1) print('格式化日期输出2:', ftime2) print('计算机可处理时间格式:',time3) print('计算机内部时间值:',time4)
运行结果如下图所示:

程序计时:程序计时应用广泛。
1、程序计时指测量起止动作所经历的时间过程
2、测量时间:perf_counter()
3、产生时间:sleep()
| 函数 | 描述 |
| perf_counter() |
返回一个CPU级别的精确时间计数值,单位为秒 由于这个基数值起点不确定,连续调用差值才有意义 >>>start=time.perf_counter() >>>end=time.perf_counter() >>>end-start 4.990869345020572 |
| sleep(s) |
s拟休眠的时间,单位是秒,可以是浮点数 >>>def wait(): time.sleep(3.3) >>>wait() #程序3.3秒后再退出 |
浙公网安备 33010602011771号