基本数据类型
数字类型
整数
没有取值限制! 这个时python的数据类型的一个特点,整数没有溢出的概念。
所以当使用
pow(x,y)
时,想算多大算多大
python提供了4种进制表示,
十进制:(正常书写),123,456
二进制:(以0b或者0B开头),0b010 ,-0B101
八进制:(以0O或者0o开头 ,注意,是零欧不是零零),0o123,-0o456
十六进制:(以0X 或者0x 开头),0x9a,0X89
浮点数
带有小数点以及小数的的数字,就是浮点数。
浮点数的取值范围和小数精度都存在限制,但常规计算可以忽略
取值范围数量级约 -10^308^ - 10^308^ ,精度数量级10^-16^
精度数量级就是两个小数之间的差别,最多可以到10
-16
浮点数之间的运算存在不确定尾数!这不是一个bug,Java也存在,C++也存在
例如0.1+0.2 的结果是 0.300000000004这个是计算机对数据运算的原理造成的。
计算机在表示数字时,使用的是二进制,Python使用的是53位二进制表示小数部分,10进制与2进制没有精准的对等关系,所以0.1是一个无限接近0的一个数,
所以程序执行 0.1 + 0.2 == 0.3 输出位False
所以我们需要round函数,对比两个浮点数是否相等时,要这样写,
round(0.1+0.2,1) == 0.3
round 是进行四舍五入的函数,
round(x,d) : 表示对x进行四舍五入,d是小数截取的位数,也就是保留几位小数
不确定位数一般发生在10
-16
左右才会产生,所以round方法非常有限
幂的表示
使用e或者E 表示幂数
<底数> e/E <幂数>
例如:3e10 表示的就是3
10
复数
**只有Python 提供了复数**,python的复数与数学种复数一致
数值操作运算符
+,- ,* ,/ ,
// (整数除)
, %
这里要说明的是python中的除法,/ 等到的结果是浮点型,所以10 / 3 = 3.33333,如果要获得整数那么就是用 // ,那么10 // 3 = 3
python提供的 x**y ,代表着x
y
注意当,y为正数时为幂运算,等同pow(x,y),当y为小数时,就是开方了,例如 10 **0.5 = 根号下10
增强赋值语句,例如:x += y – > x = x+y 其他符号都具备这个功能
不同的数据类型混合运算时,会向上兼容,整数 -》 浮点数 -》 复数
数学运算函数
类型转换函数
练习:天天向上的力量
每天进步一点点,进步1%
dayup = pow(1.001,365)
daydown = pow(0.999,365)
print("向上:{:.2f} , 向下:{:.2f} ".format(dayup,daydown))
使用抽象思维编写天天向上的力量
dayfactor = 0.01
dayup = pow(1+dayfactor,365)
daydown = pow(1-dayfactor,365)
print("向上:{:.2f} , 向下:{:.2f} ".format(dayup,daydown))
工作日向上的力量,周一到周五进步,周六周天休息退步
dayup = 1
dayfactor = 0.01
for i in range(365):
#代表周末
if i % 7 in [6,0]:
dayup *= 1-dayfactor
else:
dayup *= 1+dayfactor
print("向上:{:.2f} ".format(dayup))
使用函数来抽象,并且对比一下,对于工作日向上的人来说,每天要努力多少,才能追赶上每天都进步1%的人呢?
def dayup(fd):
dayup = 1
for i in range(365):
if i % 7 in[0,6]:
dayup *= 1-0.01
else:
dayup *= 1+ fd
return dayup
dayfactor = 0.01
while dayup(dayfactor) < 37.78:
dayfactor += 0.001
print("工作日每天努力{:.3f} 才可以超过每天努力1%".format(dayfactor))
这个结果为1.9% 仔细算一笔帐,那么还不如每天进步1%来的轻松。
所以好好学习,天天向上!!!
字符串类型
字符串类型的表示
字符串由”” 或者’’ 表示,这只是对单行字符串的表示
对于多行字符串,还可以使用一对三单引号或者三双双引号来表示,表示多行字符串
Str1 = """ 1
2
3"""
Str2 = '''4
5
6'''
这里就值得一说了,前面说过注释就是一对三个单引号,这里三个单引号又能表示多行字符串。为什么呢,因为Python并没有提供真正的注解,只是这个字符串没有被变量所接受,所以它并不会被程序所执行,我们没有办法去引用这个字符串,那么它就相当于就是一个字符串。
这里谈一下为为什么要使用两个引号来使用,如果要输出的字符串中有双引号怎么办??如果要输出的字符中有单引号怎么办???? 所以当我们内部要使用双引号时,外部使用单引号就可以了,内部使用单引号同理。
使用
[ ]
来获取指定索引的字符,
切片操作
: [ M : N ],表示从M号下标开始切割字符一直切割到N号下标的前一个字符(左闭右开)
高级用法,M和N 都是可以缺失的。
当M省略时,M默认为0,例如Str[:3] 从0切割到3
当N省略时,默认N为最后一个字符位置+1,也就是从第N个字符到最后一个字符
还有一种用法为
[ M , N . K ]
,指的是以M为开头,以N-1为结尾,以步进为K 来获取字符,例如:零一二三四五,使用[0:5:2] ,获得的字符就是 : 一三
逆置字符串
:[::-1] ,使用的就是[M,N,K]。
*
转义符 : *
字符串操作符
x + y :连接两个字符串x和y
x * n 或者 n *x :赋值n次字符串x
x in s : 如果x 是 s 的字串,返回True,否则返回False
小练习,获取星期字符串
#WeekNamePrint
weekStr = "星期一星期二星期三星期四星期五星期六星期日"
weekId = eval(input("请输入星期数字(1-7)"))
pos = (weekId - 1) * 3
print(weekStr[pos:pos+3])
字符串处理函数
len(x)
: 返回字符串x 的长度,一个汉字一个符号,都算一个长度
str(x)
:任意类型x所对应的字符串形式
hex(x) 或 oct(x)
:将整数x准换位 ,十六进制 或者 八进制的小写字符串形式
chr(u)
: u为Unicode编码,返回其对应的字符
ord(x)
: x为字符,返回其对应的Unicode编码
字符串处理方法
8个常用的字符串类型方法:
str.lower() 或者 str.upper()
: 返回字符串的副本,全部字符的小写或者大写
str.split(sep = None)
: 返回一个列表,有str根据sep 分割的部分组成。
例如:”A,B,C”.split(“,”) -> [‘A’,‘B’, ‘C’]
str.count(sub)
: 表示在str 中 sub 出现的次数。
str.replace(old,new)
: 输出str的副本,将old 字符串,替换为new 字符串。
str.center(width ,[fillchar])
: 字符串str根据宽度width居中,fillchar可选默认为空格,这个的意思是将str直接居中,第一个参数代表宽度,因为居中必须有一个整体的度量才能居中,第二个参数代表填充,这一行居中的字符为str,其他的字符该用什么填充。
str.strip(chars)
: 从str中去掉在其左右两侧出现在chars字符串中出现的字符,例如 : “= python=”.strip(” =np”)结果为 ” ytho ”
str.join(iter)
: 在iter变量除了最后元素外每个字符后增加一个str,例如: “,”.join(“12345”) -》 “1,2,3,4,5”
字符串类型的格式化
使用 <模板字符串>.format(str1,str2) 来实现
当然也可以修改参数
格式控制
: 填充,对齐,宽度,这三个是一个模式,
= 代表要填充的字符,
^ 代表居中
20 代表宽度
同样我们也可以省略
具体的数字有关:<,> 数字的千位分割符,只有在供人阅读的时候使用,
类型 b :二进制形式
c :字符形式,也就是Unicode编码形式
d : 10进制格式
o:8进制格式
x:16进制格式
X:16进制大写格式
对于浮点数类型来说,
e:使用小写e,科学表示法
E : 使用大写E 科学表示法
f:使用浮点小数表示法
% :使用百分比的表示法
time库的使用
time库是Python 中处理时间的标准库,它可以提供获取系统时间,并格式化输出的功能,提供系统级精确计时功能,用于程序性能分析
时间获取
time.time()
: 获取当前的时间戳,表示从1970 年1月1日 0 点开始经过秒数
time.ctime()
: 获取当前时间并以易读的方式返回字符串,
import time as t
print(t.ctime())
结果为 :
Fri May 22 16:28:34 2020
格式为
星期 月 日 时:分:秒 年
time.gmtime()
: 获取当前时间,表示为计算机可以处理的时间格式
输出为:
可以在编码时直接 . 引用获取 想要操作的单位。
时间格式化
类似字符串的格式化,使用展示模板来规定输出
strftime(tpl, ts)
: tpl 表示格式化的模板字符串,用来定义输出效果,ts是计算机内部时间类型变量。
举个例子
import time
t = time.gmtime()
time.strftime("%Y-%m-%d-%H:%M:%S",t)
结果为 :
2020-05-22-08:39:23
既然时间变量可以转为字符串,那么字符串同样可以转时间变量。
time 库中提供了
time.strptime(timeStr,str)
: timeStr代表了时间字符串,str 代表了输入的时间格式
str = time.strptime(timeStr,"%Y-%m-%d-%H:%M:%S")
print(str)
结果:
程序计时应用
测量时间 :
perf_counter()
:
获取时间差值
import time
start = time.perf_counter()
end = time.perf_counter()
res = end - start;
结果是一个以秒为单位的一个浮点数。
产生时间函数 :
sleep(s)
: 让程序休眠多少秒,s是一个以秒为单位的整型
练习:文本进度条
实现一个文本的进度条,简单的文本进度我们可以这样来做。每0.1秒完成10%。使用sleep函数进行休眠0.1秒,打印一行进度条
#TextProBarV1
import time
#一行进度条长10个单位
scale = 10
Stringstart = "执行开始"
Stringend = "执行结束"
#刚学完字符串的格式化输出就可以使用一下 长度为10的字符串,
# 使用Stringstart居中,左右使用- 填充
print("{:-^16}".format(Stringstart))
for i in range(scale+1):
#由i 个* 号组成的字符串a
a = '*' * i
#由scale - i 个 . 组成的字符串b
b = '.' * (scale-i)
#计算当前进度,i/scale 获得当前的百分比,*100 获取对应的证书
c = (i/scale)*100
#采用浮点小数法表示,居中,宽度为3,保留0位小数
# print("{:=3.0f}%[{}->{}]".format(c, a, b))
# print("{:<3.0f}%[{}->{}]".format(c, a, b))
print("{:>3.0f}%[{}->{}]".format(c,a,b))
#系统睡眠0.1秒
time.sleep(0.1)
print("{:-^16}".format(Stringend))
结果:
再进一步,
单行动态刷新
,所以我们
第一点,不能换行,第二点,必须把光标回退到原点
。
所以我们来再进一步
import time
#从0%打印100%
for i in range(101):
#输出时,首先先将光标回退到原点, \r
#宽度为3
# end=”“ 代表输出之后,要添加的操作,end=”“ 意味着不做任何操作,
# end 在 print 中默认为换行 \n
print("\r{:3}%".format(i),end="")
time.sleep(0.1)
此时程序运行的结果就是动态增加的了。
import time
scale = 50
#使用center 进行居中,左右用 - 进行填充
print("执行开始".center(scale//2,'-'))
#使用字符串格式化进行填充
#print("{:-^25}".format("执行开始"))
#获取当前时间
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"+"{:-^25}".format("执行结束"))
课后练习:
#获取输入之后去除引号
str1 = eval(input())
#获取平方根
res = pow(str1,0.5)
#+ 填补 , > 右对齐, 宽度30, .3f 保留三位小数浮点显示
print("{:+>30.3f}".format(res))
list1 = input().split("-")
print("{}+{}".format(list1[0],list1[-1]))