第三周:基本数据类型
1.整数类型 integer
(1)与数学中整数的概念一致,可正可负,没有整数限制
pow(x,y)函数:计算x的y次方,想算多大算多大,可以套用
(2)进制表示
十进制:正常数字
二进制:0b或0B开头
八进制:0o或0O开头
十六进制:0x或0O开头或h结尾
2.浮点类型 float
(1)与数学中的实数一致,带有小数点及小数的数字
(2)浮点数的取值范围和小数精度都存在限制,但常规计算可忽略
(3)浮点数间运算存在不确定尾数,不是bug
0.1+0.3#0.4
0.1+0.2#0.3000000000004,这就是不确定尾数,原因为计算机内部有关计算机小数的存储为二进制近似表示
0.1+0.2==0.3#False
round(0.1+0.2==0.3,1)#Ture
#准确的浮点数运算的标准库decimal
>>>from decimal import *
>>>Decimal('0.1')+Decimal('0.2')
Decimal('0.3')
#使用Decimal库,Decimal('数字')是基本表达形式,及这样表示依旧为数字
(4)浮点数间运算不确定尾数
round(x,d):对x四舍五入,d是小数截取位数
浮点数间运算及比较用round()函数辅助
>>>round(123.456789,3)
123.457
(5)浮点数的科学计数法
#使用e或E作为幂的符号,以10为基数,格式如下:
<a>e<b>(<a>E<b>)表示a乘上10的b次方
4.3e-3为0.0043 9.6E5(9.6E+5)为960000.0
#若小数或整数部分0,则可保留小数点并省略为0的部分
-77. .123 99.
(6)浮点数精度
>>>import sys
>>>sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024,
max_10_
exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_
exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16,
radix=2, rounds=1)
>>>sys.float_info.max
1.7976931348623157e+308
3.复数类型
复数在Python中以字符串'complex'表示其类型
与数学中复数的概念一致
定义j=√-1,等价为数学里的i,a+bj为复数,a为实部,b为虚部,a,b 均为浮点数类型
z=a+bj 实部:z.real 虚部:z.image
>>>type(1.23e-4+5.67e+89j)
<class'complex'>
>>>(1.23e-4+5.67e+89j).real
0.000123
>>>(1.23e-4+5.67e+89j).imag
5.67e+89
4. 真假无值
Ture 和 False 构成 bool 类型,严格讲,它们属于数值,Ture==1,False==0
None()表示无
>>>a = print("Hello World")
>>>a == None
True
#print函数运行后不返回任何内容
5. 整数序列
整数序列是数字类型的一种重要延伸,由 range()函数生产
#第一种,生成丛0开始的递增整数序列
#产生的整体为range类型,可通过遍历循环逐一获得序列整数,若b<0,则不产生
>>>for i in range(10):
print(i,end"")
0 1 2 3 4 5 6 7 8 9
#第二种,生成a到b-1的递增的整数序列
>>>for i in range(10,20):
print(i,end"")
10 11 12 13 14 15 16 17 18 19
#第三种,带有步长的
>>>for i in range(0,20,2):
print(i,end"")
0 2 4 6 8 10 12 14 16 18
#总结:生成数字个数为末-初,有则除以步长
6.数值运算操作符
(1)二元数字运算符
+、-、*、/(结果为浮点数)、//(整除得整数部分)、%(取余)、**(幂运算)
(2)增强赋值运算符
功能为对两个数进行运算之后,去更改其中的一个数
x op=y
eg:x +=y、x -=y、x *=y、x /=y、x //=y、x %=y、x **=y
x **=3等价为x=x**3,s += count 等于 s 等于 s+count
(3)类型间进行混合运算时,生成结果为最宽类型
整数<浮点数<复数
eg:123+4.0=127.0
7.数值运算函数
|
函数及使用 |
描述 |
|
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,x3,...,xn) |
最大值,返回x1,x2,x3,...,xn中的最大值,n不限 max(1,9,5,4,3)结果为9 |
|
mix(x1,x2,x3,...,xn) |
最小值,返回x1,x2,x3,...,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(re,[,im]) |
将x变为复数,增加虚数部分,re 为实数,im 为虚数 complex(4)结果为4+0j |
#abs()也可以计算复数的绝对值,输出为二维坐标系中复数位置到坐标原点的距离
>>>ans(-3+4j)
5.0
#divmod()输出商和余数属于元组类型,可通过赋值方式将结果同时传递给两个变量
#pow(x,y[,z])的速度快,如pow(3,pow(3999))%10000慢于pow(3,pow(3999),10000),因为后者是同时进行运算的
#模运算个好东西,n%m的结果映射到[0,m-1]的区间内
#round()的四舍五入按平等价值划分,即奇进偶不进,并非所有的Y.5都进位,看Y的奇偶得
#复数不能直接转换为其他数字类型,可通过.real和.imag将复数的实部和虚部分别转换
>>>float((10+99j).image)
99.0
8.实例三:天天向上的力量
#DayDayUpQ1.py
dayup =pow(1.001,365)
daydown =pow(0.999,365)
print("向上:{:.2f},向下:{:.2f}".format(dayup,daydown))
#向上:1.44,向下:0.69
dayfactor = 0.005
dayup = pow(1+dayfactor,365)
daydown = pow(1-dayfactor,365))
print("向上:{.2f},向下:{.2f}".format(dayup,daydown))
#当前能力为N时,进步则N*(1+0.01),反之N*(1-0.01)
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))
def dayup(df):#def定义一个函数,df是个占位符,用来表示dayfactor的缩写
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}".foemat(dayfactor))
#工作日的努力参数为0.019
#根据df参数计算工作日力量的函数,参数不同,代码可共用,def保留字用于定义函数
#while保留字判断条件是否成立,条件成立时执行循环
9.字符串类型及操作
(1)字符串类型的表示(二类四种)
由一对单引号或双引号表示,仅表示单行字符串
eg:"请" '请'
由一对三单引号或三双引号表示,可表示多行字符串
'''Python
语言'''
注意:三单引号形成的是字符串,只是它的作用可以当成注释
如何把单、双引号当做字符?
'这里有个双引号(")'或者"这里有个单引号(')"
如果希望字符串中出现单引号和双引号的组合?
'''这里既有单引号(')又有(")双引号'''
10.time库
(1)time库是python中处理时间的标准库;计算机时间的表达;提供获取系统时间并格式化输出功能;提供系统级精确功能,用于程序性能分析
import time
time.<b>()
(2)包含的三类函数
时间获取:time()、ctime()、gmtime()
时间格式化:strftime()、strptime()
程序计时:sleep()、perf_counter()
|
函数 |
描述 |
|
time() |
获取当前时间戳,单位为 s,浮点数 >>>time.time() 1536727223.63191689#从 1970.1.1 开始至今 |
|
ctime() |
获取当前时间并以易读方式表示,返回字符串 >>>time.ctime 'Fri Jan 26 12:11:16 2018'(星期,月份,日,时,分,秒,年) |
|
gmtime() |
返回当前时间戳对应的 struct_time 类型时间,获取当前时间,表达为计算机可处理的时间格式 >>>time.gmtime time.struct_time(tm_year=2018,tm_mon=1, time_mday=26,tm_hour=4,tm_ser=16, tm_wday=4,tm_yday=26,tm_isdst=0) |
11.gmtime 和 localtime 区别
在Python中,localtime和gmtime是两个用于获取时间信息的函数,它们的主要区别在于处理时区的方式。
localtime函数:
-
localtime函数将一个时间戳转换为本地时间,返回的是一个包含本地时间信息的struct_time对象。- 该函数考虑了当前系统的时区,因此返回的时间是根据本地时区调整后的。
- 如果不传入参数,
localtime会使用当前时间作为转换标准。
gmtime函数:
-
gmtime函数将一个时间戳转换为UTC时间(世界标准时间),即不考虑时区的时间。- 该函数返回的时间是基于格林尼治标准时间(GMT)的,不进行任何时区调整。
- 如果不传入参数,
gmtime也会使用当前时间作为转换标准。
localtime返回的是本地时间,考虑了时区的影响;而gmtime返回的是UTC时间,不考虑时区的影响。这两个函数在处理时间时需要根据具体需求选择使用,以确保时间信息的准确性。
(3)时间格式化
将时间以合理的方式展示出来
格式化:类似字符串格式化,需要有展示模版
展示模板需要由特定的格式化控制符组成
|
strftime(tpl,gt) |
tpl是格式化模版字符串,用来定义输出效果 gt 是 struct_time 类型的时间,即 gmtime 所的 >>>t = time.gmtime() >>>time.strftime("%y-%m-%d %h:%m:%s,t") '2018-01-26 12:55:20' |
|
strptime() |
与 strftime 函数刚好相反,用于提取字符串 str 中时间要素,生成一个 strut_time 类型的时间值 |
>>>timeString = '2023-09-02 13:26:22'
>>>strptime(timeString,"%Y-%m-%d %H:%M:%s")
time.struct_time(tm_year=2024, tm_mon=9, tm_mday=29, tm_
hour=20, tm_min=27, tm_sec=49, tm_wday=6, tm_yday=273, tm_isdst=-1)
|
格式化字符串 |
日期/时间说明 |
值范围和实例 |
|
%Y |
年份 |
0000~9999,例如:2024 |
|
%m |
月份 |
01~12,01~12 例如:08 |
|
%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 |
|
%I |
小时(12h制) |
01~12,例如:7 |
|
%p |
上/下午 |
AM,PM,例如:PM |
|
%M |
分钟 |
00~59,例如:26 |
|
%S |
秒 |
00~59,例如:26 |
|
%x |
日期 |
月/日/年,09/29/2024 |
|
%X |
时间 |
时/分/秒,18/29/11 |
|
月份 |
全称 |
缩写 |
|
一月 |
January |
Jan |
|
二月 |
February |
Feb |
|
三月 |
March |
Mar |
|
四月 |
April |
Apr |
|
五月 |
May |
May |
|
六月 |
June |
Jun |
|
七月 |
July |
Jul |
|
八月 |
August |
Aug |
|
九月 |
September |
Sep |
|
十月 |
October |
Oct |
|
十一月 |
November |
Nov |
|
十二月 |
December |
Dec |
|
英文全称 |
缩写形式 |
|
Monday |
Mon. |
|
Tuesday |
Tue. |
|
Wednesday |
Wed. |
|
Thursday |
Thu. |
|
Friday |
Fri. |
|
Saturday |
Sat. |
|
Sunday |
Sun. |
>>>t = time.gmtime()
>>>time.strftime("%Y-%m-%d %H:%M:%S",t)
'2018-01-26 12:55:20'
>>>timeStr = '2018-01-26 12:55:20'
>>>time.strtime(timeStr,"%Y-%m-%d %H:%M:%S")
(4)程序计时
程序计时时间广泛;程序计时指测量起止动作所经历时间的进程
测量时间:perf_counter()
产生时间:sleep()
|
函数 |
描述 |
|
perf_counter() |
返回英国CPU级别的精确时间计数值,单位为秒 由于这个计数值起点不确定,连续调用差值才有意义,并且差值是基于最开始调用之后,而非上一次 >>>start = time.perf_counter() 318.66599499718114 >>>end = time.perf_counter() 341.3905185375658 >>>end - start 22.724523540384666 |
|
sleep(s) |
s拟休眠的时间,单位是秒,可以是浮点数 >>>def waite()#定义一个函数 waite time.sleep(3.3) >>>wait() #当调用 waith 函数时程序将等待3.3秒后再退出 |
12. 实例四.文本进度条
(1)单行动态刷新
刷新的本质:用后打印的字符覆盖原来的字符
不能换行:print()需要被控制
要能回退:打印后光标退回到之前的位置\r
#TextProBarv1.py
import time
for i in range(101):#0到100共101个数
print("\r{:3}%").format(i),end()="")#end()=""使原来print的换行变为停留在当前光标,\r为在打印字符串之前,将光标退回到行首
time.sleep(0.1)
(2)完整效果
#TextProBarV3.pу
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)课本高级版
#tqdmBar.py
from tqdm import tqdm
from time import sleep
for i in tqdm(range(1,100)):
sleep(0.01)
#100%|██████████| 99/99 [00:01<00:00, 88.26it/s]
13.作业
在一个周期内,连续学习 3 天能力值不变,从第 4 天起到休息前,能力每天比前一天增长 1%,若中断学习,周期从头计算,问当每 10 天或 15 天休息一天后,365 天后的能力值是多少?
dayup = 1#能力初始值
dayfactor = 0.01#进步百分数
period = [4,5,6,0]#当为周四五六日时
decrease = 0#
for j in range(1,366):#进行365次循环
temp = j - decrease
tom = temp % 7#得到当前按程序讲的星期,而非实际的
if j%10 == 0:#当连续学习10天时
decrease += j - (tom - 1)
tom = 1
if tom in period:#
dayup = dayup * (1 + dayfactor)
print('%f the result is %.2f'%(dayfactor,dayup))
ability = 1.0
T = 365//11
for j in range(T):
for i in range(1,12):
if i in [1,2,3]:
ability = ability
print(ability)
elif i in [4,5,6,7,8,9,10]:
ability = ability*1.01
print(ability)
else:
ability = ability
i = 1
print(ability)

996

被折叠的 条评论
为什么被折叠?



