【3】Python基本数据结构

数字类型及操作

整数类型

与数学中整数的概念一致。

  • 可正可负,没有取值范围限制
  • pow(x,y)函数:计算x的y次方,想算多大算多大

四种进制表示形式

  • 十进制
  • 二进制,以0b或0B开头:0b11
  • 八进制,以0o或0O开头:0o7
  • 十六进制,以0x或0X开头:0o11

浮点数类型

与数学中实数概念一致。

  • 带有小数点及小数的数字
  • 浮点数取值范围和小数精度都存在限制,但常规计算可忽略
  • 取值范围约为-10^308 ~ 10^308 ,精度等级 10^-16

浮点数间运算存在不确定尾数,不是bug。

十进制浮点数计算经过二进制转换和反向转换,可能出现不确定尾数。

  • round(x,d):对x四舍五入,d是小数截取位数
  • 浮点数间运算及比较用round()函数辅助

浮点数可用科学计数法表示

  • 使用e或E作为幂的符号,以10为基数,格式为<a>e<b>,表示a*10^b

复数类型

与数学中复数概念一致。
对于复数z=a+bj

  • z.real获得实部,z.imag获得虚部

数值运算操作符

完成运算的一种符号体系

  • +,-,*,/,//(整数除,商取整数)
  • %余数,模运算,**幂运算,同pow(x,y)

二元操作符有对应的增强赋值操作符

x op = y,即 x=x op y其中op为二元操作符,即以上七种操作符。

类型间可混合运算,生成结果为“最宽”类型。

  • 整数->浮点数->复数

数值运算函数

一些以函数形式提供的数值运算功能

函数及使用 描述
abs(x) 绝对值
divmod(x,y) 商余,同时输出整数商和余数
pow(x,y[,z]) 幂运算,z为取模数
round(x[,d]) 四舍五入,d为小数位数,默认为0
max(x1,x2...,xn) 返回最大值,个数不限
min(x1,x2...,xn) 返回最小值,个数不限
int(x) 将x变为整数,舍弃小数部分,字符串也可以
float(x) 将x变为浮点数,增加小数部分
complex(x) 将x变为复数,增加虚数部分

实例3:天天向上的力量

问题:一年365天,每天进步1%,累计进步多少?每天退步1%,累计剩下多少?

  • 进步,1.01^ 365;退步,0.99^365
  • 如果是三天打鱼两天晒网?如果工作日进步双休日休息?

问题1:1‰的力量

代码:

#DayDayUpQ1.py
dayup = pow(1.001,365)
daydown = pow(0.999,365)
print("向上:{:2f},向下:{:2f}".format(dayup, daydown))

运行结果:

>>>
向上:1.44,向下:0.69

问题2:5‰和1%的力量

代码:

#DayDayUpQ2.py
dayfactor = 0.005
dayup = pow(1+dayfactor, 365)
daydown = pow(1-dayfactor, 365)
print("向上:{:2f},向下:{:2f}".format(dayup, daydown))

运行结果:

>>>
向上:6.17,向下:0.16

问题3:工作日的力量

工作日进步1%,休息日退步1%。
代码:

#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))

运行结果:

>>>
工作日的力量:4.63

问题4:工作日的努力

在工作日模式下要努力什么程度才能与每天努力1%相同?
计算思维:试错 def...while...
编写函数

#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

举一反三

第三问:计算思维
第四问:试错
问题变化和扩展

  • 如果休息日不下降?
  • 如果工作和休息的时间变化?
  • 比例不同?

字符串类型及操作

字符串:由0个或多个字符组成的有序字符序列,由一对单引号或双引号表示。

字符串类型的表示

有2类,四种表示方式

  • 由一对单引号或双引号表示,仅表示单行字符串
  • 由一对三单引号或三双引号表示,可表示多行字符串

如果希望在字符串中包含双引号或单引号?

  • 字符串中和两侧的引号不同

如果希望在字符串中包含双引号和单引号?

  • 字符串两侧使用三单引号或三双引号

字符串的序号

字符串的使用

  • 索引:返回单个字符,<字符串>[M]
  • 切片:返回多个字符串,<字符串>[M:N]
    • M缺失表示至开头,N缺失表示至结尾
    • <字符串>[M:N:K]根据步长K对字符串进行切片
    • <字符串>[::-1]将字符串逆序

特殊字符

转义符 \

  • 转义符表达特定字符的本意
    "这里有个双引号(\")"    
    
    结果为
    >>>
    这里有个双引号(")
    
  • 转义符形成一些组合,表达一些不可打印的含义
    "\b"回退;"\n"换行(光标移到下行首);"\r"回车(光标移到本行首)

字符串操作符

操作符及使用 描述
x+y 连接字符串x和y
n*xx*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的长度
str(x) 将x转化为字符串类型
hex(x)oct(x) 返回整数x的十六进制或八进制小写形式的字符串
chr(u) u为Unicode编码,返回其对应的字符
ord(x) x为字符,返回其对应的Unicode编码

字符串处理方法

方法,特指<a>.<b>()风格中的函数<b>();方法本身也是函数,但与<a>有关;字符串及变量也是<a>

方法及使用 描述
str.lower()str.upper() 返回字符串的副本,全部为小写或大写
str.split(sep=None) 返回一个列表,由str根据sep被分隔的部分构成
str.count(sub) 返回sub在str中出现的次数
str.replace(old,new) 返回字符串的副本,所有old字符串被替换为new
str.center(width[,fillchar]) 字符串根据宽度width居中,填充字符fillchar可选
str.strip(chars) 从字符串中去掉在其左侧和右侧chars中列出的字符
str.join(iter) 在iter变量除最后元素外每个元素后增加一个str,主要用于字符串分隔,如",".join("12345")

字符串的格式化

使用.format()方法,格式为<模板字符串>.format(<逗号分隔的参数>)

{}为槽。
槽顺序对应format()中参数的顺序。
在槽中加上数字可规定顺序。

槽内部对格式化的配置方式

形式为{<参数序号>:<格式控制标记>}

: <填充> <对齐> <宽度> <,> <.精度> <类型>
引导符号 用于填充的单个字符 <左对齐 >右对齐 ^居中对齐 槽设定的输出宽度 数字的千位分隔符 浮点小数精度或字符串最大输出长度 整数类型b,c,d,o,x,X 浮点数类型e,E,f,%

如:填充对齐宽度

>>>"{0:=^20}".format("Python")
'=======Python======='

数字格式设置

>>>"{0:,.2f}".format(12345.6789)
'12,345.68'

模块2:time库的使用

time库基本介绍

time库是Python中处理时间的标准库

  • 计算机时间的表达
  • 提供获取系统时间并格式化输出功能
  • 提供系统级精确计时功能,用于程序性能分析
import time
time.<b>()

time库包括三类函数

  • 时间获取:.time() .ctime() .gmtime()
  • 时间格式化:.strftime() .strptime()
  • 程序计时:.sleep() .perf_counter()

时间获取

函数 描述
.time() 获取当前时间戳,即计算机内部时间值,浮点数,从1970年1月1日开始,单位为秒
.ctime() 获取当前时间并以易读方式表示,返回字符串
.gmtime() 获取当前时间,表示为计算机可处理的时间格式time.struct_time()

时间格式化

将时间以合理的方式展示出来

  • 类似字符的格式化,需要有展示模板
  • 展示模板由特定的格式化控制符组成
  • 使用.strftime()方法
函数 描述
.strftime(tpl, ts) tpl是格式化模板字符串,用来定义输出效果;ts是计算机内部时间类型变量

格式化字符

格式化字符串 日期/时间说明 值范围和实例
%Y 年份 0000~9999,例如:1900
%m 月份 01~12
%B 月份名称 January~December
%b 月份名称缩写 Jan~Dec
%d 日期 01~31
%A 星期 Monday~Sunday
%a 星期缩写 Mon~Sun
%H 小时(24小时制) 00~23
%I 小时(12小时制) 01~12
%p 上/下午 AM,PM
%M 分钟 00~59
%S 00~59
>>>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.strptime(timeStr, "%Y-%m-%d %H:%M:%S")
time.struct_time(tm_year=2018, tm_mon=1, tm_mday=26, tm_hour=4, tm_min=11, tm_sec=16, tm_wday=4, tm_yday=26, tm_isdst=0)

程序计时应用

  • 程序计时指测量起止动作所经历时间的过程
  • 测量时间:.perf_counter()
  • 产生时间:.sleep()
函数 描述
.perf_counter() 返回一个cpu级别的精确时间计数值,单位为秒。起点不确定,连续调用差值才有意义。start = time.perf_counter() end = time.perf_counter() end - start
.sleep(s) 让程序休眠s秒时间,s可以为浮点数

实例4:文本进度条

  • 采用字符串方式打印可以动态变化的文本进度条
  • 进度条需要能在一行中逐渐变化

如何获得文本进度条的变化时间?

  • 采用sleep()模拟一个持续的进度

简单的开始

代码:

#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("-----执行结束-----")

执行结果

------执行开始------
 0 %[->..........]
10 %[*->.........]
20 %[**->........]
30 %[***->.......]
40 %[****->......]
50 %[*****->.....]
60 %[******->....]
70 %[*******->...]
80 %[********->..]
90 %[*********->.]
100%[**********->]
------执行结束------

单行动态刷新

根据进度刷新进度,不换行

  • 刷新本质:用后打印的字符覆盖之前的字符
  • 不能换行, print()需要被控制
  • 要能回退:打印后光标退回到之前的位置\r
#TextProBarV2.py
import time
for i in range(101):
    print("\r{:3}%".format(i), end='')
    time.sleep(0.1)

使用命令提示行执行程序。输入python "<加路径的文件名>"

完整效果

#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,'-')

举一反三

计算问题扩展

  • 使用perf_counter()进行计时
  • 适合各类需要统计时间的问题

进度条应用扩展

  • 在任何运行时间较长和需要提高用户体验的程序中增加进度条
  • 文本进度条不同设计函数
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,492评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,048评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,927评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,293评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,309评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,024评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,638评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,546评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,073评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,188评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,321评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,998评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,678评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,186评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,303评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,663评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,330评论 2 358

推荐阅读更多精彩内容