方法论:
实践能力:
4种进制表示形式
>>> 0.1 + 0.3
0.4
>>> 0.1 + 0.2
0.30000000000000004
30000000000000004 不确定尾数
Python中采用53位二进制表示小数部分,约10-16
0.1 在对应的二进制中,是一个无限小数。
计算机采用53位二进制表示小数部分,在转换成十进制时,只输出前16位。
所以,0.1 + 0.2在二进制计算时,会无限接近0.3,但可能存在尾数
>>> 0.1 + 0.2 == 0.3
False
#使用round()函数
>>>round(0.1+0.2,1) == 0.3
True
round(x,d):对x四舍五入,d是小数截取位数
浮点数可以用科学计数法表示
空间变换及复变函数相关
操作符以及使用 | 描述 |
---|---|
x + y | 加 |
x - y | 减 |
x * y | 乘 |
x / y | 除,取浮点数商 |
x // y | 整数除,取整数商 |
+ x | x本身 |
- y | y的负数 |
x % y | 模运算,取余 |
x ** y | 幂运算,xy;当y是小数时,进行开方运算 |
对应的增强赋值操作符
增强操作符以及使用 | 描述 |
---|---|
x op y | x += y; x -= y; x *= y; x /= y…… |
不同数字类型混合运算
函数及使用 | 描述 |
---|---|
abs(x) | x取绝对值 |
divmod(x,y) | 同时输出x//y和x%y,divmod(10,3) = (3,1) |
pow(x,y [,z]) | 幂余,(x**y)%z,z可以省略 |
round(x [,d]) | 四舍五入,d是保留小数位数,默认值为0 |
max(x1,x2,…xn) | 最大值 |
min(x1,x2,…xn) | 最小值 |
例子:计算3 ^ 398 的后四位
pow(3,pow(3,98),10000)
为了解决大数运算,取余可以始终让值保留在可表示范围内
函数 | 描述 |
---|---|
int(x) | x转为整数类型,int(“123”) = 123 |
float(x) | x转为浮点数类型,float(“1.23”) = 1.23 |
complex(x) | x转为复数类型,增加虚数部分 |
问题描述:持续的价值
一年365天,每天进步1%。,累计进步多少? - 1.001365
一年365天,每天退步1%。,累计剩下多少?- 0.999365
如果是“三天打鱼两天晒网呢”?
如果加入双休日呢,双休日不退步不进步?
dayup = pow(1.001,365)
daydown = pow(0.999,365)
print("up: {:.2f} , down: {:.2f}".format(dayup,daydown)}
5%。和1%的力量
dayfactor = 0.005
dayup = pow(1 + dayfactor,365)
daydown = pow(1 - dayfactor,365)
dayfactor = 0.01
>>> dayup = 37.78343433288728
一年365天,一周五个工作日,每天进步1%
一年365天,一周两个工作日,每天退步1%
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))
在工作日的情况下,工作日要努力到什么水平,才能与每天努力1%一样
A:一年365天,每天进步1%
B:一年365天,工作日进步,休息日下降1%
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
print("{:.3f}".format(dayfactor))
>>> 0.019
计算思维:抽象和自动化相结合的结果
由一对单引号或双引号表示,仅表示单行字符串
如:“双引号字符串” 或者 ‘单引号字符串’
由一对三单引号或者三双引号表示,可表示多行字符串
如:
'''
多行
字符
'''
如果在字符串中包含双引号或者单引号?
‘这里有一个双引号"’ 或者 “这里有一个单引号’”
如果希望字符串中既包含单引号又包含双引号?
‘’‘这里既有单引号’ 又有双引号" ‘’’
索引
返回字符串中单个字符,<字符串>[M]
切片
返回从M到N-1的子串,<字符串>[M:N]
用法:
<字符串>[M:N:K]
如:“0123456789”[:3] 结果是 “012”
如:“0123456789”[1:8:2] 结果是"1357"
如:字符串逆序,“0123456789”[::-1] 结果是"9876543210" 这里的步长-1表示从后向前逐一取出
操作符及使用 | 描述 |
---|---|
x + y | 字符串连接 |
n * x 或者 x * n | 复制n次字符串x |
x in s | 如果x是s的子串,返回True,否则返回False |
小例子:
用户输入整数1-7,输出对应的星期字符串
#根据用户的输入在字符串中切片,返回切片结果
weekStr = "星期一星期二星期三星期四星期五星期六星期日"
weekId = eval(input("请输入对应星期数字(1-7)"))
pos = (weekId - 1) * 3
print(weekStr[pos : pos + 3])
weekStr = "一二三四五六日"
weekId = eval(input("请输入对应星期数字(1-7)")
print("星期" + weekStr[weekId - 1])
函数及使用 | 描述 |
---|---|
len(x) | 返回字符串x长度 |
str(x) | 将任意类型的x 变成字符串,如str(1.23) = “1.23”;str([1,2])结果为"[1,2]",与eval()相反 |
hex(x) 或 oct(x) | 返回整数x的十六进制或八进制小写形式字符串,如hex(425)结果为"0x1a9",oct(425)结果为"0o651" |
chr(u) | 返回unicode编码u对应的字符 |
ord(x) | 返回字符x对应的unicode编码 |
python3内部使用unicode编码
方法及使用 | 描述 |
---|---|
str.lower() 或者 str.upper() | 返回字符串,全部小写/大写 |
str.split([分隔符]) | 以分隔符为标志,分割字符串,返回在列表类型中,如 “A,B,C”.split(",") 结果为 [‘A’,‘B’,‘C’] |
str.count(sub) | 返回子串sub在str中出现的次数 |
str.replace(old,new) | 将str中的old子串替换为new,如:“python”.replace[“n”,“n123.io”] 结果为"python123.io" |
str.center(width[,fillchar]) | 字符串str根据宽度width居中,如"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()方法:
占位信息符,用{}表示,只在字符串中有用
“{1}:计算机{0}的CPU占用率为{2}%”.format(“2020-04-03”,“C”,10)
<格式控制标记>的六种类型
>>> "{0:=^20}".format("python")
'=======python======='
>>> "{0:*>20}".format("BIT")
'*****************BIT'
>>> "{:10}".format("BIT")
'BIT '
>>> "{:,.2f}".format(12345.6789)
'12,345.68'
>>> "{0:b},{0:c},{0:d},{0:o},{0:x},{0:X}".format(425)
'110101001,Ʃ,425,651,1a9,1A9'
# b二进制,c unicode对应字符形式,d十进制,o八进制,x十六进制,X大写十六进制
>>> "{0:e},{0:E},{0:f},{0:%}".format(3.14)
'3.140000e+00,3.140000E+00,3.140000,314.000000%'
import time
函数 | 描述 |
---|---|
time() | time.time() 获取当前时间戳,计算机内部时间值,是一个浮点数,表示从1970年1月1日零点开始到现在隔了多少秒 |
ctime() | time.ctime() 获取当前时间字符串,以易读方式表示 |
gmtime() | time.gmtime() 返回一个结构体,里面存储具体时间信息 |
strftime(tpl,ts)
>>>t = time.gmtime()
>>>time.strftime("%Y-%m-%d %H:%M:%S",t)
'2020-04-06 04:53:02'
strptime(str,tpl)
timeStr = '2020-04-06 04:53:02'
t = time.strptime(timeStr,"%Y-%m-%d %H:%M:%S")
#与strftime互补
start = time.perf_counter()
end = time.perf_counter()
end - start
time.sleep(3)
采用字符串方式打印可以动态变化的文本进度条
进度条需要能在一行中逐渐变化
import time
scale = 10
print("----start----")
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("----end----")
import time
for i in range(101):
print("\r{:3}%".format(i),end = "") #\r 光标回退
time.sleep(0.1)
print参数[end ], 输出完后字符串想要增加什么信息写在end中,加入了end参数,print输出完不会换行
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,'-'))