一、数字类型及操作
(1)整数类型
与数学概念一致 可正可负,没有取值范围限制 pow(x,y)函数:计算
x
y
x^{ y }
x y ,想算多大算多大 提供了4种进制表示形式:
十进制:1010,99 二进制,以0b或0B开头:0b010,-0B101 八进制,以0o或0O开头:0o123,-0O456 十六进制,以0x或0X开头:0x9a,-0X89
(2)浮点类型
与数学中实数概念一致 带有小数点及小数的数字 浮点数取值范围和小数精度都存在限制,但常规计算可以忽略 取值范围数量级约
−
1
0
308
-10^{308}
− 1 0 3 0 8 至
1
0
308
10^{308}
1 0 3 0 8 ,精度数量级
1
0
−
16
10^{-16}
1 0 − 1 6 注意 :浮点数间运算存在不确定尾数,不是bug
// “== ”是一个判断是否相等的运算符
0.1 + 0.2 == 0.3
// 由于浮点数存在不确定尾数,所以结果为false
False
// round ( x, d) : 对x四舍五入,d是小数截取位数
// 在浮点数间运算存在不确定尾数
round ( 0.1 + 0.2 , 1 ) == 0.3
True
使用字母e或E作为幂的符号,以10为基数,格式如下:
< a > e < b > 表示a*
1
0
b
10^{b}
1 0 b
(3)复数类型complex
与数学中复数的概念一直 如果
x
2
x^{2}
x 2 =-1,那么x的值是什么? 定义j=
(
−
1
)
\sqrt{(-1)}
( − 1 )
,以此为基础,构建数学体系 a+bj被称为复数,其中,a是实部,b是虚部 复数可以分离实数部分和虚数部分
复数的共轭
// 复数实例
z= 1 + 5j
(4)数值运算操作符
操作符及使用 描述 x+y 加,x与y之和 x-y 减,x与y之差 x*y 乘,x与y之积 x/y 除,x与y之商 10/3结果是3.3333333 x//y 整数除,x与y之整数商 10/3结果是3 +x x本身 -y y的负值 x%y 余数,模运算 10%3结果是1 x**y 幂运算,x的y次幂,
x
y
x^{y}
x y .当y是小数时,开方运算 10**0.5结果是
10
\sqrt{10}
1 0
x op=y 即 x=x op y,其中,op为二元操作符
类型之间可进行混合运算,生成结果为“最宽”类型
三种类型存在一种逐渐“扩展”或“变宽”的关系:
例如:123+4.0=127.0(整数+浮点数=浮点数) 一些以函数形式提供的数值运算功能
函数及使用 描述 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,[…]表示参数可省略 pow(3,pow(3,99),10000)结果为4587 round(x[,d]) 四舍五入,d是保留小数位数,默认值为0 max(x1,x2,x3…,xn) 最大值,返回x1,x2,x3…,xn中的最大值,n不限 min(x1,x2,x3…,xn) 最小值,返回x1,x2,x3…,xn中的最小值,n不限 int(x) 将x变成整数,舍弃小数部分 complex(x) 将x变成复数
(5)布尔型
整形的子类 仅有两个值:True、False 本质上是用整形的1、0分别存储的
>> > x= Treu
>> > int ( x)
1
(6)字符串运算符
原始字符串操作符(r/R):
所有的字符串都是Unicode字符串
二、实例:天天向上的力量
(1)基本问题1:持续的价值
一年365天,每天进步1%,累计进步多少呢?
1.0
1
365
1.01^{365}
1 . 0 1 3 6 5 一年365天,每天退步1%,累计剩下多少呢?
0.99
9
365
0.999^{365}
0 . 9 9 9 3 6 5
(2)需求分析
数学公式可以求解,似乎没有必要用程序 如果是“三天打鱼两天晒网”? 如果是“双休日又不退步”?
(3)代码
dayup = pow ( 1.01 , 365 ) ;
daydown = pow ( 0.999 , 365 ) ;
print ( "向上:{:.2f},向下:{:.2f}" . format ( dayup, daydown) )
(4)基本问题2:千分之五和百分之一的力量
一年365天,每天进步千分之五或1%,累计进步多少呢?
1.00
5
365
1.005^{365}
1 . 0 0 5 3 6 5
1.0
1
365
1.01^{365}
1 . 0 1 3 6 5 一年365天,每天退步千分之五或者1%,累计剩下多少呢?
0.99
5
365
0.995^{365}
0 . 9 9 5 3 6 5
0.9
9
365
0.99^{365}
0 . 9 9 3 6 5
(5)代码
dayfactor = 0.005
dayup = pow ( 1 + dayfactor, 365 )
daydown = pow ( 1 - dayfactor, 365 )
print ( "向上:{:.2f},向下:{:.2f}" . format ( dayup, daydown) )
(6)基本问题3:工作日的力量
一年365天,一周5个工作日,每天进步1% 一年365天,一周2个休息日,每天退步1% 这种工作日的力量如何呢?
(7)代码
dayup= 1.0
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) )
(8)基本问题4:工作日的努力
工作日模式要努力到什么水平,才能与每天努力1%一样? A君:
一年365天,每天进步1%,不停歇 一年365天,每周工作5天休息2天,休息日下降1%,要多努力呢?
(9)代码
// 定义一个函数
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.01
print ( "工作日的努力参数是:{:.3f}" . format ( dayfactor) )
三、字符串类型及操作
(1)字符串类型的表示(两类四种)
字符串由一堆单引号或一堆双引号表示
字符串是字符的有序数列,可以对其中的字符进行索引
字符串也可以由三单引号多行表示:
'''请输入
信息'''
如果希望在字符串中包含双引号或单引号呢?
'这里有个双引号(")‘或者"这里有个单引号(’)" 如果希望在字符串中既包含双引号有包括单引号呢?
(2)字符串序号
(3)字符串的使用
使用[]获取字符串中一个或多个字符
索引:返回字符串中单个字符 <字符串>[M]
“请输入带有符号的温度值:”[0] 或者 TempStr[-1] 切片:返回字符串中一段字符串字符 <字符串>[M:N]
“请输入带有符号的温度值:”[1:3]或者TempStr[0:-1] 使用[M:N:K]根据步长对字符串切片
<字符串>[M:N],M缺失表示至开头,N缺失表示至结尾
“0一二三四五六七八九十”[:3]结果是"0一二" <字符串>[M:N:K],根据步长K对字符串切片
“0一二三四五六七八九十”[1:8:2]结果是"一三五七" “0一二三四五六七八九十”[::-1]结果是"十九八七六五四三二一0" 字符串的特殊字符
转义符\
转义符表达特定字符的本意
“这里有个双引号(”)“结果为 这里有个双引符(”) 转义符形成一些组合,表达一些不可打印的含义 "\b"回退 "\n"换行(光标移动到下行首) "\r"回车(光标移动到本行首)
(4)字符串操作符
操作符及使用 描述 x + y 连续两个字符串x和y n * x 或 x * n 复制n次字符串x x in s 如果x是s的子串,返回True,否则返回False
(5)字符串处理函数
函数及使用 描述 len(x) 长度,返回字符串x的长度 len(“一二三456”)结果为6 str(x) 任意类型x所对应的字符串形式 str(1.23)结果为"1.23" str([1,2])结果为"[1,2]" hex(x)或oct(x) 整数x的十六进制或八进制小写形式字符串 hex(425)结果为"0x1a9" cot(425)结果为"0o651" chr(u) u为Unicode编码,返回其对应的字符 ord(x) x为字符,返回其对应的Unicode编码
(6)字符串处理方法
"方法"在编程中是一个专有名词
"方法"特指< a >.< b > () 风格中的函数() 方法本身也是函数,但与< a >有关,< a >.< b >()风格使用 字符串及变量也是< a >,存在一些方法
(7)Python中常用的字符串处理方法
方法及使用 描述 str.lower()或strupper() 返回字符串的副本,全部字符小写/大写 “AbCdEfG”.lower()结果为"abcdefg" str.split(sep=Npne) 返回一个列表,由str根据sep被分隔的部分组成"A,B,C".split(",")结果为[‘A’,‘B’,‘C’] str.count(sub) 返回子串sub在str中出现的次数 “an appple a day”.count(“a”)结果为4 str.replace(old,new) 返回字符串str的副本,所有old子串被替换为new “Python”.replace(“n”,“n123.io”)结果为Python123.io 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(“123456”) 结果为"1,2,3,4,5" #主要用于字符串分隔等
(8)字符串类型的格式化
格式化是对字符串进行格式表达的方式
字符串格式化使用.format()方法,用法如下:
<模板字符串>.format(<逗号分隔符的参数>) {}称为槽。默认字符串中槽的顺序和format()中参数的顺序一一对应 槽内部对格式化的配置方式
format()方法的格式控制
: <填充> <对齐> <宽度> < , > <.精度> <类型> 引导符号 用于填充的单个字符 <左对齐 >右对齐 ^居中对齐 槽设定的输出宽度 数字的千位分隔符 浮点数小数精度或字符串最大输出长度 整数类型b,c,d,o 浮点数类型e,E,f
四、time库的使用
(1)time库是Python中处理时间的标准库
计算机时间的表达 提供获取系统时间并格式化输出功能 提供系统级精确计时功能,用于程序性能分析
(2)time库包括三类函数
时间获取:time() ctime() gmtime() 时间格式化:strftime() strptime() 程序计时:sleep() perf_counter()
(3)时间获取
函数 描述 time() 获取当前时间戳,即计算机内部时间值,浮点数 ctime() 获取当前时间并以易读方式表示,返回字符串 gmtime() 获取当前时间,表示为计算机可处理的时间格式
(4)时间格式化
将时间以合理的方式展示出来
格式化:类似字符串格式化,需要有展示模板 展示模板由特定的格式化控制符组成 strftime()方法
函数 描述 strftime(tpl,ts) tpl是格式化模板字符串,用来定义输出效果 ts是计算机内部时间类型变量 strptime(str,tpl) str是字符串形式的时间值 tpl是格式化模板字符串,用来定义输入效果
格式化字符串 日期/时间说明 值范围和实例 %Y 年份 0000~9999,例如:1900 %m 月份 01~12,例如:10 %B 月份名称 January~December,例如:April %b 月份名称缩写 Jan~Dec,例如:Apr %d 日期 01~31,例如:25 %A 星期 Monday~Sunday,例如:Wedesday %a 星期缩写 Mon~Sun,例如:Wed %H 小时(24h制) 00~23,例如:12 %I 小时(12h制) 01~12,例如:7 %p 上午/下午 AM,PM,例如:PM %M 分钟 00~59,例如:12 %S 秒 00~59,例如:12
(5)程序计时
程序计时应用广泛
程序计时指测量起止动作所经历时间的过程 测量时间:perf_count() 产生时间:sleep()
函数 描述 perf_count() 返回一个CPU级别的精确时间计数值,单位为秒 由于这个计数值起点不确定,连续调用差值才有意义 sleep(s) s为休眠的时间,单位是秒,可以是浮点数。
五、文本进度条(实例)
(1)需求分析
采用字符串方式打印可以动态变化的文本进度条 进度条需要能在一行中逐渐变化 如何获得文本进度条的变化时间?
(2)简单开始
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 ( "------执行结束-----" )
(3)"文本进度条"单行动态刷新
刷新的本质是 :用后打印的字符覆盖之前的字符不能换行:print()需要被控制 要能回退:打印后光标退回到之前的位置\r
import time
for i in range ( 101 ) :
// end能改变print 输出最后增加的信息
// \r使光标退回到当前行的行首
print ( "\r{:3}%" . format ( i) , end= "" )
time. sleep( 0.1 )
(4)完整效果
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 = timeperf_counter( ) - start
print ( "\r{:^3.0f}%[{} - > {}]{:.2f}s" . format ( c, a, b, dur) , end= '' )
time. sleep( 0.1 )
print ( "\n" + "执行结束" . center( scale// 2 , '-' ) )