第三章:基本数据类型

3.1 数字类型及操作

1.整数类型

(1)pow(x,y)函数,计算x的y次方,想算多大算多大。

(2)4种进制表示形式:

十进制:1010,99等;

二进制:以0b或者0B开头:0b10,-0B101等;

八进制:以0o或0O开头:0o123,-0O456等;

十六进制:以0x或者0X开头:0x9a,-0X89等。

2.浮点数类型

取值范围为-10的308次方到10的308次方,精度数量级10的-16次方。

浮点数间存在不确定尾数,不是bug。为了解决这一个问题,可以使用roud(x,d)函数。

rand(x,d):表示对x四舍五入,d是小数截取尾位数。

Python提供使用字母e或者E作为幂的符号,以10为基数。

3.复数类型

实例:

z=1.24e-4+5.6e+89j

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

4.数值运算操作符

表1 基本操作符

操作符及使用

描述

x+y

xy

x*y

x/y

除,x除以y,10/3=3.33333333333335

x//y

整数除,例如10//3=3

+x

x本身

x%y

取余数

x

x的负值

x**y

若y是整数,则是x的y次幂

若y是小数,则是开方运算

注意:

类型间可进行混合运算,生成结果为“最宽”类型(参与运算元素中最宽的类型)。

三种类型存在一种逐渐“扩展”或“变宽”的关系:

整数->浮点数->复数

5.数值运算函数

表2 常用数值运算函数

函数及使用

描述

abs(x)

对x求绝对值

divmod(x,y)

商余,即同时输出商和余数

pow(x,y[,z])

幂余,[]表示可省略。这个式子的意思是:(x**y)%z

round(x[,d])

表示对x四舍五入,d是小数截取尾位数

max(a,b,c,…)

返回a,b,c,…中的最大值

min(a,b,c,…)

返回a,b,c,…中的最小值

 

表3 数据类型转换函数

函数及使用

描述

int(x)

将x变成整数,舍弃小数部分

float(x)

将x变成浮点数,增加小数部分。例如float(12)结果为12.0

complex(x)

转换成复数,增加虚部

 

3.2 实例:天天向上的力量

1.问题分析

基本问题:持续的价值

    (1)一年365天,每天进步1‰,累计进步多少呢?

(2)一年365天,每天退步1‰,累计退步多少呢?

(3)如果是“三天打鱼两天晒网”呢?

(4)如果是“双休日休息又不退步”呢?

2.“天天向上的力量”第一问

代码:

#DayDayUpQ1.py进步或者退步1‰dayup = pow(1.001,365)daydown = pow(0.999,365)print("向上:{:.2f},向下:{:.2f}".format(dayup,daydown))

结果:

向上:1.44,向下:0.69

3. “天天向上的力量”第二问

代码:

#进步或者退步5‰#DayDayUpQ2.pydayfactor = 0.005days = 365dayup = pow(1+dayfactor,days)daydown = pow(1-dayfactor,days)print("向上:{:.2f},向下:{:.2f}".format(dayup,daydown))

结果:

向上:6.17,向下:0.16

4. “天天向上的力量”第三问

一年365天,一周5个工作日,每天进步1%;一周2个休息日,每天退步1%,这种工作日的力量又如何呢?

代码:

#DayDayUpQ3.pydayfactor = 0.01dayup =1.0for 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

5. “天天向上的力量”第四问

问题4:工作日模式(即平时努力工作,双休每天下降1%)要努力到什么水平,才能与每天都进步1%取得的结果一样呢?

流程图:

1.jpg

图1

代码:

#定义函数def dayUP(df):    dayup = 1    for i in range(365):        if i%7 in [0,6]:            dayup = dayup*(1-0.01)        else:            dayup = dayup*(1+df)    return dayupdayfactor = 0.01dayupa1 = pow(1.01,365)dayupa = round(dayupa1,2)while dayUP(dayfactor) <37.78:    dayfactor += 0.001print("工作日努力的参数是:{:.3f}".format(dayfactor))

运行结果:

工作日努力的参数是:0.019

3.3 字符串类型及操作

1.字符串类型的表示

字符串是由0个或多个字符组成的有序字符序列。字符串由一对单引号或者双引号表示。字符串是字符的有序序列,可以对其中的字符进行索引。

字符串由2类共4中表示方法:

(1)由一对单引号或者双引号表示;

(2)一对三单引号或三双引号表示,可表示多行字符串。当所给出的多行字符串没有被应用,则就当做了注释。

字符串切片的高级用法

    使用[M:N:K]根据步长对字符串进行切片,M缺失表示至开头,N缺失表示到结尾,K表示步长。例如:“〇一二三四五六七八九十”,[1:8:2]的结果是“一三五七”。[::-1]则是“十九八七六五四三二一〇”。

2.字符串操作符

表4 字符串操作符

函数及使用

描述

x+y

连接两个字符串x和y

n*x或者x*n

复制n次字符串x

x in s

如果x是s的子串,返回True;否则返回False

 

3.字符串处理函数

表5 常用字符串处理函数

函数及使用

描述

len(x)

返回字符串x的长度

str(x)

任意类型x所对应字符串格式。如str([1,2])结果为”[1,2]”

hex(x)或oct(x)

整数x的十六进制或八进制的字符串形式

chr(x)

x为Unicode编码,返回其对应的字符

ord(x)

x为字符,返回其对应的Unicode编码

Python字符串中每个字符都是Unicode编码字符,从0到1114111(0x10FFFF)空间,每个编码对应一个字符。

例如:

for i in range(12):print(chr(9800+i),end = "")#如果end后面为空,则不换行

结果:

♈♉♊♋♌♍♎♏♐♑♒♓

4.字符串处理方法

此处方法特指<a>.<b>()中的函数<b>(),方法本身也是函数,但与<a>有关。

表6 常用字符串处理方法

函数及使用

描述

str.lower()或sr.upper()

返回字符串的副本,全部小写/大写

str.split(sep=None)

返回一个列表,由str根据sep被分割的部分组成。

例如,”a,b,c”.split(“,”)结果为[‘a’,’b’,’c’]

str.count(sub)

返回子串sub在str中出现的次数

str.replace(old,new)

返回字符串str副本,所有的old子串被替换为new

str.center(width[,fillchar])

字符串str根据宽度width剧中,fillchar可选。例如”python”.center(20,’=’)结果为

’=======python=======’

str.strip(chars)

从str中去掉在其左侧和右侧chars中列出的字符。例如,”= python=”.strip(“ =np”)结果为”ytho”

str.jpin(iter)

在iter变量除最后元素外每个元素后面增加一个str。例如,”,”.join(“12345”结果为”1,2,3,4,5”)

 

5.字符串类型的格式化

格式化是对字符串进行格式表达的方式,字符串格式化使用format()方法。用法如下:

<模板字符串>.format(<逗号分隔的参数>)

我们需要用到一个概念——槽。相当于一个占位符,通常用{}表示。例如:

“{}:计算机{}的CPU占用率为{}%”.format(“2018-10-10”,”C”,10)

输出为:

2018-10-10:计算机C的CPU占用率为10%

若代码为:

“{1}:计算机{0}的CPU占用率为{2}%”.format(“2018-10-10”,”C”,10)

则输出为:

C:计算机2018-10-10的CPU占用率为10%

槽内部对格式化的配置方式:{<参数序号>:<格式控制标记>},具体内容如图2所示:

1522162677319808.jpg

图2

对于前三类举例:

“{0:=^20}”.format(“PYTHON”)

在这里面,“:”冒号是一个引导符,前面的数字0代表的是用第0个元素来放到这里,“=”等号代表用于填充的字符,^表示居中对齐,20代表槽的输出宽度。

对于后三类举例:

“{0:,.2f}”.format(12345.6789)

在这里,0还是指填充第0个元素到这里,“:”还是引导符,“,”是数字的千位分隔符,后面的2是小数精度,f是数据类型。输出结果是:12,345.68(7四舍五入进1)

3.4 模块2:time块的应用

1.time库基本介绍

time库是Python处理时间的标准库,能够提供计算机时间的表达,提供获取系统事件并格式化输出功能,提供系统级精确计时功能,用于程序性分析。

time库包括三类函数:

(1)时间获取:time()/ctime()/gmtime()

(2)时间格式化:strftime()/strptime()

(3)程序计时:sleep()/perf_counter()

2.时间获取

表7 time库的函数

函数

描述

time()

获取当前时间戳,即计算机内部是兼职,浮点数(相对于1976-1-1的秒数)例如:1522157003.0202858

ctime()

获取当前时间并以易读方式表示,返回字符串。例如:Tue Mar 27   21:23:23 2018

gmtime()

获取当前时间,表示为计算机可处理的时间格式。例如:time.struct_time(tm_year=2018, tm_mon=3, tm_mday=27, tm_hour=13,   tm_min=23, tm_sec=23, tm_wday=1, tm_yday=86, tm_isdst=0)

 

3.时间格式化

它是将时间以合理的方式展示出来,它也需要一个展示模板,由特定的格式化控制符组成。

表8 time时间格式化的函数

函数

描述

strftime(tpl, ts)

tpl是格式化模板字符串,用来定义输出效果,ts是计算机内部事件类型变量。例如运行:

t =   time.gmtime()

print(time.strftime("%y-%m-%d   %H:%M:%S",t))结果为:18-03-27 13:27:30

strptime(str,tpl)

将一段字符串str按照tpl的格式来编程时间值。

 

表9 时间格式化字符串

格式化字符串

日期/时间说明

值范围和实例

%Y

年份

0000~9999

%m

月份

01~12,

%B

月份名称

January~December

%b

月份名称缩写

%d

日期

01~31

%A

星期

Monday~Sunday

%a

星期缩写

%H

小时(24小时制)

00~23

%h

小时(12小时制)

%p

上午/下午

AM/PM

%M

分钟

00~59

%S

00~59

 

4.程序计时应用

测试时间:perf_counter(),返回一个CPU级别的精确时间计数值,单位为秒。由于这个计数值起点不确定,连续调用差值才有意义。

产生时间:sleep(s):让程序休眠s秒,可以是浮点数。

3.5 实例:文本进度条

1.问题分析

    采用字符串方式打印可以动态打出的文本进度条。采用sleep()模拟一个持续的进度。

2简单的开始

代码:

scale = 10for 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("------FINISHED------")

结果:

0 %[->……….]

10 %[*->………]

20 %[**->……..]

30 %[***->…….]

40 %[****->……]

50 %[*****->…..]

60 %[******->….]

70 %[*******->…]

80 %[********->..]

——FINISHED——

3.单行动态刷新

刷新的本质是:用后打印的字符覆盖之前的字符;

不能换行:print()需要被控制

要能回退:打印后光标退回到之前的位置\r

代码:

import timefor i in range(101):print("\r{:3}%".format(i), end = "")#想在输出的字符串后面加啥就是end里面加啥,不换行就是空    time.sleep(0.1)

 

4.实例完整效果

代码:

import timescale =50print("执行开始".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("\nFINISHED".center(scale//2,'.'))