数字类型及操作
整数类型
可正负
pow(x,y):计算X的y次方
四种进制表示形式:
十进制:1010
二进制:0b或0B开头,-0B101
八进制:0o或0O开头
十六进制:0x或0X开头
浮点数类型
即实数概念,带有小数点及小数的数字。浮点数取值范围和小数精度都存在限制,但通常可以忽略
取值范围约-10308至10308,精度数量级10^(-16)
注意:浮点数间运算存在不确定尾数,不是bug(经过各种二进制和十进制的转换)
>>>0.1+0.3
0.4
>>>0.1+0.2
0.300000000000004
round(x,d):对x四舍五入,d是小数截取位数
浮点数间运算及比较用round()函数辅助
不确定尾数一般发生在10^(-16)位产生,round十分有效
浮点数可以用科学计数法表示,使用字母e或E作为幂的符号,以10为基数:e 表示a10^b
如4.3e(-3)值为0.0043
复数类型
别的编程软件都没有
a+bj被称为复数,其中a是实部,b是虚部
z.real获得实部,z.imag获得虚部
数值运算操作符
x+y
x-y
xy
x/y 浮点数结果,一般软件里不是这样
x//y 整数除 只保留整数位
+x x本身, -y y的负数
x%y余数,模运算
xy 幂运算
二元增强赋值操作符,两个数进行运算,去更改其中一个值 增强赋值形式
数字类型的关系:类型间可以混合运算,生成结果为最宽类型。整数→浮点数→复数
123+4.0=137.0
数值运算函数
abs(x) 绝对值
divmod(x,y) 商余(x//y,x%y),同时输出商和余数
pow(x,y,[z])幂余,(xy%z)[…]表示参数z可以省略
pow(3,pow(3,99),10000)结果为4587
有余操作,比如此例中,x**y的数值会非常大,计算机无法计算,转化为余数的计算能非常迅速。这个相当于求解这个幂结果的最后四位
round(x[,d])
max(X1,X2,…,Xn) max(X1,X2,…,Xn)
int(x) 将x变成整数,舍弃小数部分
float(x)将x变成浮点数,增加小数部分,float(“1.23”)结果为1.23;float(12)为12.0
complex(X)将x变成复数,增加虚数部分 complex(4) 结果为4+0j
实例3:天天向上的力量
#Daydayup1.py
dayup= pow(1.01,365)
daydown= pow(0.999,36)
print(“向上:{:.2f},向下:{:.2f}”.format(dayup, daydown))
#2
dayfactor=0.005
dayup=pow(1+dayfactor, 365)
daydown=pow(1-dayfactor,365)
print(“向上:{:.2f},向下:{:.2f}”.format(dayup,daydown)
#3
A君每天进步1%,B君只工作日努力X%,周末退步1%
问B君的X值多少时,才能和A有同样的进步
def…while…
#Daydayup4.py 注意冒号!
def dayUP(df): def定义函数,根据df参数计算工作日力量
dayup=1
for i in range(365):
if i %7 in [6,0]: i不是应该从0开始到364的吗?
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}”.format(dayfactor))
假设自己画画是三天打鱼两天晒网状态: 5.7 大概是是37.78的七分之一
#Santiandayu
day=1
for i in range (365):
if i%5 in [1,2,3]:
day=day*(1+0.01)
else:
day=day*(1-0.003)
print(“实际效果为:{:.3f}”.format(day))
if和while有什么区别??
字符串类型及操作
字符串类型的表示
0个或多个字符组成的有序字符序列
由一对单引号或者一对双引号表示 “C”
字符串是字符的有序序列,可以对其中的字符进行索引,编号从0开始
字符串有2类,共四种
有一对单引号或双引号表示,仅表示单行字符串
由一堆三单引号或三双引号表示,表多行字符串.如果这个字符串没有另外再作用,就可以当做注释来用
如果希望在字符串中包含双引号或者单引号,在字符串内容的外面就对应使用另外一种引号
如果字符串中既有“又有’ 用’’‘表示字符串’’’
字符串的序号:正向增序序号,“反响递减序号
[]获取字符串中的一个或多个字符 索引及切片
[M:N:K]根据步长对字符串切片:
[M:N] M却是表至开头,N缺失表至结尾
[M:N:K] k为步长 〇一二三十五六七八九十 [1:8:2] 结果是一三五七
[::-1] 表示从开头到结尾,步长为-1表示整个倒序
转义符\ 此符号后面的特定字符会表达特定字符的本意
\b 回退 \n换行(移动到下一行行首) \r回车(移动到本行行首)
操作符
由0个或者多个字符组成的有序字符序列
x+y 连接两个字符串
nx或xn 复制n次字符串x
x in s 如果x是s的子串,返回True,否则返回False
实例:获取星期字符串
思路:给出一个长字符串,然后切片输出。避免了连续的if else的重复
注意:input函数获得的输入会被保存为字符串的形式 用eval把他变成数字
处理函数
len(x) 返回字符串x的长度,数字标点英文汉字都是算一个字符
str(x) 任意类型x所对应的字符串形式(和eval功能相反)
hex(x)或oct(x) 整数x的十六进制或者八进制小写形式字符串
hex(425) 0x1a9 oct(425)0o651
chr(u) u为Unicode编码,返回其对应的字符
ord(x) x为字符,返回其对应的Unicode编码
Python字符串的编码方式:Unicode 统一字符编码 几乎所有字符
0-1114111(0x10FFFF)
例子:输出十二星座的符号
我的代码:u=9800
for i in range (12):
print("十二星座符号:"+chr(u))
u=u+1
老师的代码
end="" 表示输出一个之后不换行
处理方法
方法必须要用 . 执行 一共八个
str.lower()或str.upper() 返回字符串的副本,全部字符小写或者大写
str.split(sep=None) 返回一个列表 字符串根据sep被分割的部分组成 "A,B,C".split(",")
结果为['A','B','C']
str.count(sub)返回子串sub在str中出现的次数 返回子串sub在str中出现的次数
"a apple a day".count("a") 结果为4
str.reolace(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.join(iter) 在iter变量除最后元素外每个元素后增加一个str
",".join("12345") 结果为"1,2,3,4,5" 主要用于字符串分隔
字符串类型的格式化
<模板字符串>.format(<逗号分隔的参数>)
槽机制和format方法形成字符串的格式化
槽内部对格式化的配置方式 {<参数序号>:<格式控制标记>}
: 填充 对齐 宽度 , <.精度> 类型
引导符号 用于填充的单个字符 < ^ > 槽设定的输出宽度 千位分隔符 浮点数小数精度或字符串最大输出长度 整数类型 b,c,d,o,x,X浮点数类型
前三个:
注释:最后一个例子,默认空格填充,左对齐
time库的使用
time库
处理时间的标准库
计算机时间的表达
提供获取系统时间并格式化输出功能
提供系统级精确计时功能,用于程序性能分析
import time
time.()
time库包括三类函数
时间获取: time() ctime() gmtime()
时间格式化: strftime() strptime()
程序计时: sleep() perf_counter()
time.time() 获得当前时间戳,计算机内部时间值,浮点数 1970.1.1 0:0到现在的秒数
time.ctime() 获取当前时间 返回字符串 ‘Fri Jan 26 12:11:16 2018’
time.gmtime() 表示为计算机可处理的时间格式
time.struct_time(tm_year=2018, tm_mon=1,tm_mday=4,tm_hour=4,tm_min=11,tm_sec=16,tm_wday=4,tm_yday=26,tm_isdst=0)
时间格式化
类似字符串格式化,要有展示模板
展示模板由特定的格式化控制符组成
strftime()方法
strftime(tpl,ts) tpl定义输出效果,格式化模板字符串 ts计算机内部时间类型变量
t=time.gmtime()
time.strftime("%Y-%m-%d %H:%M:%S",t)
‘2018-01-26 12:55:20’
格式化字符串: %Y %m %B(月份名称) %b(月份名称缩写) %d
%a 星期缩写 %H小时(24) %h(12) %p 上下午(AM,PM) %s
特殊情况下会有反格式化过程,将字符串变成时间
strptime(str,tpl) str 字符串形式的时间值 tpl是格式化模板字符串,用来定义输入效果
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() CPU级别的精确时间计数值,单位为秒,由于计数起点不确定,要连续调用差值(第一次调用的值作为起点)
start=time.perf_counter()
318.66599499718114
end=time.perf_counter()
341.3905185375658
end- start
22.724523540384666
产生时间: sleep()
sleep(s) s拟休眠的时间,单位是秒,可以是浮点数
def wait():
time.sleep(3.3)
wait() #程序等待3.3秒后再退出
例子:文本进度条 采用字符串方式打印可以动态变化的文本进度条 要能逐渐变化
TextProgress1自己写的:
#Textprogress
import time
scale=10
print("{0:-^16}".format("执行开始"))
for i in range(scale+1):
a='#'*i
b='.'*(scale-i)
c=str(10*i)
print("{0: >4} [{1:}->{2:}]".format(c+"%",a,b))
print("{0:-^16}".format("执行结束"))
红行报错原因:ValueError: cannot switch from automatic field numbering to manual field specification。此问题是format()函数 前面大括号里 没写 数字 对应后面的 ()的顺序的值
老师的: {:^3.0f是什么意思?}
TextProgress2:
单行动态刷新:
刷新本质:用后打印的字符覆盖之前的字符
不能换行:print()需要被控制
要能回退:打印后光标退回到之前的位置 \r
在idle中\r的功能会被屏蔽掉(只是个编写软件),所以执行出来没有单行动态刷新的状态
end="" 如果不写,默认每一次输出后会换行,写了这个代表返回行首
TextProgress3: 注意,要在“命令提示符”执行 结果才对。有\r
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()计时:统计时间的计算问题,比较不同算法时间,统计部分程序运行时间
需求:运行时间较长的程序、希望提高用户体验的程序,人机交互的纽带
用于生活中时,进度套也不一定就要忠实的反应程序的进度
错题:答案PYTHON
s=‘PYTHON’
print("{0:3}".format(s))