开篇
本周内容会从数学角度,讲讲坚持学习的价值。一年365天每天进步1%,一年之后会进步多少呢。
一年365天,每天退步1%,一年之后还剩下多少呢。
如果三天打鱼两天晒网,或者双休日退步1%呢,让我们一起开始这周的学习吧,学习之前先复习一下前两周的内容。
一二周内容复习
python基本语法元素
- 缩进、注释、命名、变量、保留字
- 数据类型、字符串、整数、浮点数、列表
- 赋值语句、分支语句、函数
input()
、print()
、eval()
、print()
格式化
保留字默写:import, as, from, if, elif, else, and, or, not, def, return, for, break, continue, try, while, is, in, True, False, None, with, yeild, pass, async, await
未写出: raise, global, nonlocal, assert, except, finally, class, lambda, del
温度转换实例
见python学习第一周文章 python第一周学习记录,从零开始的python程序学习
python基本图形绘制
- 海龟绘图体系,import保留字用法
penup()
、pendown()
、pensize()
、pencolor()
fd()
、circle()
、seth()
- 循环语句:
for和in
、range()
函数
绘制蟒蛇
见python学习第二篇文章 python学习第二周,从零开始的python程序学习
第三周内容
数字类型及操作
整数类型
与数学中整数概念一致,可正可负,可用十进制,二进制(以0b或0B开头),八进制(以0o或0O开头)。十六进制(以0x或0X开头)表示。
整数无限制 pow(x, y)
函数,计算x的y次方
浮点数类型
与数学中实数的概念一致。
- 带有小数点及小数的数字
- 浮点数取值范围和小数精度都存在限制,但常规计算可忽略
- 取值范围数量级约-10的307次方至10的308次方,精度数量级10的-16次方
- 浮点数间运算存在不确定尾数,例如
0.1 + 0.2
最终得出0.30000000000000004
,js中也有类似的问题,python中导致存在尾数的原因是计算机通过二进制表示小数,只能无限接近,但不完全相同。一般处理方式是round(a+b,1)
,结果保留一位小数。 round(x, d)
对x四舍五入,d是小鼠截取位数。不确定尾数一般发生在10的-16次方
左右,round()可以避免尾数问题。- 浮点数采用科学计数法表示:使用字母e或E作为幂的符号,以10为基数,格式如下:
<a>e<b>
表示a*10的b次方
复数类型
与数学中复数的概念一致: a + bj
,a是实部,b是虚部
数值运算操作符
x + y
加,x与y之和x - y
减,x与y之差x * y
乘,x与y之积x / y
除,x与y之商10 / 3
结果是3.333333333333335x // y
整数除,x与y之整数商10 // 3
结果是3+ x
x本身- y
x的负值(这个有点没理解描述是啥意思,等下再去看下课)x % y
余数,模运算10 % 3
结果是1x ** y
幂运算,x的y次幂
,当y是小数时,开方运算整数 -> 浮点数 -> 复数
存在一种逐渐扩展或变宽的关系,例如123 + 4.0 = 127.0
(整数+浮点数=浮点数)
数值运算函数
abs(x)
绝对值,x的绝对值abs(-10.01)
结果为10.01divmod(x, y)
商余,(x // y, x % y)
同时输出商和余数divmod(10, 3)
结果是 (3, 1)pow(x, y[, z])
幂余,(x ** y) % z
[..]表示参数z可以省略pow(3, pow(3, 99), 10000)
结果为 4587round(x[, d])
四舍五入,d是保留小数位数,默认值为0,round(-10.123, 2)
结果为-10.12max(X1, X2, ..., Xn)
最大值,返回X1, X2, ..., Xn
中的最大值min(X1, X2, ..., Xn)
最小值,返回X1, X2, ..., Xn
中的最小值int(x)
将x变成整数,舍弃小数部分int(123.45)
结果为123int("123")
结果为123float(x)
将x变成浮点数,增加小数部分float(12)
结果为12.0,float("1.23")
结果为1.23complex(x)
将x变成复数,增加虚数部分,complex(4)
结果为4 + 0j
天天向上的力量
千分之一的力量
- 一年365天,每天进步千分之一,一年累计进步了多少呢?
1.001^365
- 一年365天,每天退步千分之一,累计剩下多少呢?
0.999^365
dayup = pow(1.001, 365)
daydown = pow(0.999, 365)
print("向上:{:.2f}, 向下:{:.2f}".format(dayup, daydown))
每天向上0.001坚持365天,与向下0.001持续365天相比,相差接近两倍。
千分之五和1%的力量
- 一年365天,每天进步千分之五或1%,累计进步多少呢?
1.005^365
1.01^365
- 一年365天,每天退步千分之五或1%,累计剩下多少呢?
0.995^365
0.99^365
dayfactor = 0.005 # 改变为 0.01运行第二次
dayup = pow(1 + dayfactor, 365)
daydown = pow(1 - dayfactor, 365)
print("向上:{:.2f}, 向下:{:.2f}".format(dayup, daydown))
1.005^365 = 6.17
千分之五的力量 0.995^365 = 0.16
1.01^365 = 37.78
1%的力量 0.99^365 = 0.03
工作日的力量
- 一年365天,一周5个工作日,每天进步1%
- 一年365天,一周两个休息日,每天退步1%
dayup = 1
for i in range(365):
if i % 7 in [6, 0]:
dayup = dayup * (1- 0.01)
else:
dayup = dayup * (1 + 0.01)
print("工作日努力,周末放松:{:.2f}".format(dayup))
周末不进步,工作日需要多少努力才能追上每一天都进步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.01
print("工作日的努力参数是:{:.2f}".format(dayfactor))
结论:对比每天都进步1%的人,周末不进步的话,需要工作日加倍努力才能追上。
字符串类型及操作
字符串类型的表示
- 字符串由一对单引号或一对双引号表示,
'hello world'
或"hello world"
- 字符串是有序序列,可以对其中字符进行索引
"h"
是"hello world"
中的第0个字符 ''' hello world '''
,双三单引号或三双引号也可以表示字符串,可表示多行字符串。
使用[]
获取字符串中一个或多个字符
numStr = "零一二三四五六七八九十"
索引:返回字符串中单个字符 <字符串>[M]
"零一二三四五六七八九十"[0]
或 numStr[-1]
切片:返回字符串中一段字符字串 <字符串>[M: N : K]
,M缺失表示从开头开始,N
缺失表示到结尾,K
是步长,根据K
步长对字符串切片
"零一二三四五六七八九十"[1: 3]
或 numStr[0: -1]
零一二三四五六七八九十[:3]
结果是"零一二"
零一二三四五六七八九十[::-1]
结果是"十九八七六五四三二一零"
零一二三四五六七八九十[1: 8: 2]
结果是"一三五七"
字符串操作符
操作符及使用 | 描述 |
---|---|
x + y | 连接两个字符串x,y |
n * x 或 x * n | 复制n次方字符串x |
x in s | 如果x是s的字串,返回True,否则返回False |
weekStr = "星期一星期二星期三星期四星期五星期六星期日"
weekId = eval(input("请输入星期数字(1-7):"))
pos = (weekId - 1) * 3
print(weekStr[pos: pos+3])
此程序在你输入1-7的数字时,会返回对应的星期几。
字符串处理函数
函数及使用 | 描述 |
---|---|
len(x) | 长度,返回字符串x的长度 |
str(x) | 任意类型x所对应的字符串形式 str([1,2]) => "[1, 2]" |
hex(x)或oct(x) | 整数x的十六进制或八进制小写形式字符串 hex(425) = > "0x1a9" |
chr(u) | u为Unicode编码,返回其对应的字符 |
ord(x) | x为字符,返回其对应的Unicode编码 |
从0-1114111(0x10FFFF)空间 每个编码对应一个字符 python字符串中每个字符都是Unicode编码字符
字符串处理方法
方法及使用 | 描述 |
---|---|
str.lower()或str.upper() | 返回字符串的全部字符小写/大写 |
str.split(sep=None) | 返回一个列表,"A, B, C".split(",") => ['A', 'B', 'C'] |
str.count(sub) | 返回子串sub在str中出现的次数 "an apple a day".count("a") => 4 |
str.replace(old, new) | 返回old字串被替换为new,"python".replace("n","n hello") => "python hello" |
str.center(width[, fillchar]) | 字符串根据宽度width居中,fillchar可选,"python".center(10, "=") => "==python==" |
str.strip(chars) | 从str中去掉左侧和右侧chars中列出的字符,"= python =".strip(" =np") => "ytho" |
str.join(iter) | ",".join("12345") => "1,2,3,4,5" 用于字符串分隔 |
字符串类型的格式化
- 字符串格式化使用.format()方法,
<模板字符串>.format(<都好分隔的参数>)
- 槽
8.1日更新 后续内容以下两个标题
time库的使用
时间获取:time() , ctime() , gmtime()
- time() 获取当前时间戳,计算机内部时间值,浮点数,time.time()
- ctime() 获取当前时间并以易读方式表示,返回字符串,time.ctime()
- gmtime() 获取当前时间,表示为计算机可处理时间格式,time.gmtime()
时间格式化:strftime() , strptime()
- strftime(tpl, ts) tpl是格式化模板字符串,用来定义输出效果,ts是计算机内部时间类型变量,
t=time.gmtime()
time.strftime("%Y-%m-%d %H:%M:%S", t) # "2024-08-01 12:44:00"
- strptime(str, tpl) str是字符串形式的时间值,tpl是格式化模板字符串,用来定义输入效果,
timeStr = '2024-08-01 12:55:00'
time.strptime(timeStr, "%Y-%m-%d %H:%M:%S")
程序计时:sleep() , perf_counter()
- perf_counter() 返回CPU级别的精确时间计数值,单位为秒,由于这个技术起点不确定,连续调用差值才有意义
- sleep(s) s拟休眠的时间,单位为秒,可以是浮点数,程序等待s秒后退出