@terrygmk
2020-02-22T13:20:13.000000Z
字数 6505
阅读 270
学习笔记
十进制(默认,不用开头标示):99,-87
二进制(0b,0B开头):0b010,0B101,-0B011
八进制(0o,0O开头): 0o1357,-0O1246
十六进制(0x,0X开头):0x18F,-0X29E
-10^307~10^308 非常大 309位
53位表示小数部份,
0.1+0.2 == 0.3 => False
0.1+0.2 == 0.30000000000000004 => True
round(0.1+0.2,1)==0.3 => True
4.3e-2 = 0.043
5.6e3 = 5600.0
a+bj表示
z=3+4j
z.real 表示实部
z.imag 表示虚部
+-*/ 加减乘除
// 整数除 5//3=1
% 模运算,求余数 5%3=2
** 幂运算(相当于pow()函数) 5**3=125
增强赋值操作符 x op=y x+=y=>x=x+y
混合操作结果最宽,常见 整数+符点数=符点数 1+2.0=3.0
abs(x):绝对值
round(x,d):四舍五入
max(x1,x2,...xn):取最大值
min(x2,x2,...xn):取最小值
divmod(a,b):商余
pow(x,y[,z]):幂余
int(x):强制类型转换为整数
float(x):强制类型转换为浮点数
complex(x):强制类型转换为复数数
| 操作 | |
|---|---|
| len(iter) | 求元素个数 |
| min(iter) | 求最小值 |
| max(iter) | 求最大值 |
| o.clear() | 清除,只适用set ls dict, |
| x in O | x 元素是否在O对象里面,是返回True |
| x not in O| | |
| for item in iter | 遍历 |
一维
元素可变
可下标索引访问
| 操作符及使用 | 说明 |
|---|---|
| ls + ls2 | 连接2个序列 |
| n*ls or ls*n | n个a连接 |
| ls[i] | 索引 |
| ls[m:n:k] | 切片 |
| ls.index(x[,i,j]) | 求从i位置到j位置,x出现的索引 |
| ls.count(x) | x出现的次数 |
'一对单引号表示,这里面方面有双引号""'
"一对双引号表示,这里面方面有单引号''"
'''三对单引号表示,这里面方便有单引号'双引号"'''
'''可以多行
你知道吗'''
正序从0开始,倒序为负数,从-1开始,最后一个是-1,倒数第二个是-2
str[M:N:K] 从索引M到N(不含),以K(默认1)为步长取子串,K为负数时倒序
常用取[M,N)子串 str[M:N]
转义字符'\'
'\b':回退
'\n':换行(光标移到下行首)
'\r':回车(光标回到行首)
| 操作符及使用 | 说明 |
|---|---|
| a + b | 连接2个子串 |
| n*a or a*n | n个a连接 |
| a in s | a是s的子串返回True,否则False |
| 函数 | 说明 |
|---|---|
| int len(s) | 字符串的长度 |
| strng str(x) | 任意类型转字符串 |
| string hex(i) | 返回整数i的16进制字符串形式 |
| string oct(i) | 返回整数i的8进制字符串形式 |
| string chr(i) | 返回整数i所表示的Unicode字符 |
| int ord(ch) | 返回字符ch对应的Unicode编码 |
| 方法 | 说明 |
|---|---|
| str.upper() or str.lower() | 转大写or小写 |
| str.split(sep) | 分割字符串返回列表 |
| str.count(sub) | 子串出现的次数 |
| str.replace(old,new) | 替换 |
| str.center(width[,fill_char]) | 字符串居中 |
| str.strip(chars) | 去掉chars中的字符 |
| str.join(iter) | 用str连接iter中的每个元素 |
| 方法 | 说明 | |||||
|---|---|---|---|---|---|---|
| {<槽的索引> | :<填充> | <对齐> | <宽度> | <,> | <.精度> | <类型>} |
| 长度太长用什么填写 | 左<,右>,中^, | 数字 | 数字的千分位 | 符点数的精度 | b,c,d,o,x,X,e,E,f,% |
>>>'{1:=^20,.2f}'.format(0,98765)'=====98,765.00======'
序列的一种,一旦创建,不可更改,除了元组的通用操作,无特殊操作
创建方法:
t = ()
t= tuple()
t= 1,2,3
t = (1,2,3)
t = (1,)
i = (1) # 这个是int 不是元组
元组的一种,可随意更改
| 操作 | |
|---|---|
| ls[i]=x | 赋值 |
| ls[i:j:k]=ls2 | 赋值,当k=1时,将i:j的元素删除,ls2里的元素插入到i的位置 |
| del ls[i] | 删除i索引位置的元素,长度变为(原来-1) |
| del ls[i:j:k] | 删除切片中的元素 |
| 方法 | |
|---|---|
| ls.append(x) | 在末尾插入元素 |
| ls.insert(i,x) | 在i位置插入元素 |
| ls.pop() | 将最后一个删除并返回 |
| ls.remove(x) | 将列表中第1个出现的x删除 |
| ls.copy() | 返回副本 |
| ls.clear() | 清空 |
| ls.reverse() | 反转 |
可变数据类型| 操作符 | 描述 |
|---|---|
| S|T | 并,返回一个新集合,包含在集合S和T中的所有元素 |
| S-T | 差,返回一个新集合,包含在集合S但不在T中的元素 |
| S&T | 交,返回一个新集合,包含同时在集合S和T中的元素 |
| S^T | 补,返回一个新集合,包含在集合S和T中的非相同元素 |
| S<=T or S<T | 返回Boolean,S是T的子集吗? |
| S>=T or S>T | 返回Boolean,S是T的超集吗? |
| S |=T | 并,更新集合S,包含在集合S和T中的所有元素 |
| S -=T | 差,更新集合S,包含在集合S但不在T中的元素 |
| S &=T | 交,更新集合S,包含同时在集合S和T中的元素 |
| S ^=T | 补,更新集合S,包含在集合S和T中的非相同元素 |
| 方法 | 描述 |
|---|---|
| S.add(x) | 如果x不在集合中,将x增加到S |
| S.discard(x) | 移除S中元素x,如果x不在集合中,不报错 |
| S.remove(x) | 移除S中元素x,如果x不在集合中,产生KeyError异常 |
| S.clear() | 移除S中的所有元素 |
| S.pop() | 随机移除一个元素,并返回这个元素,如果S是空集,产生KeyError异常 |
| S.copy() | 返回集合的副本 |
| 方法 | 描述 |
|---|---|
| len(S) | 返回元素个数 |
| set(x) | 其它类型的转为集合,或x不提供,则返回空集 |
| x in S | 移除S中元素x,如果x不在集合中,产生KeyError异常 |
| x not in S | 移除S中的所有元素 |
数据去重
包含关系的比较
| 方法 | |
|---|---|
| del ds[k] | 删除key=k的元素 |
| ds.keys() | |
| ds.values() | |
| ds.items() | |
| ds.get(k,default) | 返回k的值 |
| ds.pop(k,default) | 取出k的值 |
| ds.popitem() | 随机弹出,返回元组格式 |
| ds.get() |
| 分类 | 函数 | |
|---|---|---|
| 时间获取 | time() | 获取时间戳,返回浮点数 |
| gmtime() | 获取时间,返回<class 'time.struct_time'> |
|
| localtime() | 同gmtime(),区别是本地的,中国是+8h | |
| 时间格式化 | strftime(tpl,ts) | 格式化时间,返回字符串 |
| strptime(str,tpl) | 格式化时间,返回字<class 'time.struct_time'> |
|
| 程序计时 | sleep(s) | 休眠,浮点数,秒单位 |
| 程序计时 | perf_counter() | 返回CPU级别的时间,浮点数,秒单位,一般用time()替代即可 |
>>> import time>>> time.time()1582016465.4839685>>> time.gmtime()time.struct_time(tm_year=2020, tm_mon=2, tm_mday=18, tm_hour=9, tm_min=1, tm_sec=13, tm_wday=1, tm_yday=49, tm_isdst=0)>>> time.localtime()time.struct_time(tm_year=2020, tm_mon=2, tm_mday=18, tm_hour=16, tm_min=16, tm_sec=56, tm_wday=1, tm_yday=49, tm_isdst=0)>>> time.strftime('%Y-%m-%d %H-%M-%S',time.localtime())'2020-02-18 17-03-06'>>> time.strptime('2020-02-18 17-03-06','%Y-%m-%d %H-%M-%S')time.struct_time(tm_year=2020, tm_mon=2, tm_mday=18, tm_hour=17, tm_min=3, tm_sec=6, tm_wday=1, tm_yday=49, tm_isdst=-1)
将俩种温度单位(摄氏度与华氏度)互转
#温度转换 TempConvert.pystr_temp = input("请输入温度F或C结尾:")if str_temp[-1:] in ('F','f'):c_temp = (eval(str_temp[0:-1])-32)/1.8print('转换后的温度是:{:.2f}C'.format(c_temp))elif str_temp[-1:] in ('C','c'):f_temp = eval(str_temp[0:-1])*1.8+32print('转换后的温度是:{:.2f}F'.format(f_temp))else:print('输入有误')
同一场景(转换问题)找不同的问题:货币转换,长度转换,重量转换...
单位转换问题都可以用这类程序
对输入的检测不够健全,如输入:‘FF’,‘3.2.3C’
问题一:一年365天,每天进步1‰,累计可进步多少?每天退步1‰,累计还剩下多少?
问题二:如果不是1‰,而是其它值呢
问题三:如果是工作日进步,休息日退步呢?
问题四:求解,一周工作5天的模式,工作日要多努力才能赶上天天工作的值?
# 天天向上的力量 DayDayUpQ1.py# 按每天比还来多0.001算day_up = pow(1.001,365)day_down = pow(0.999,365)print('天天向上{:.2f},天天向下{:.2f}'.format(day_up,day_down))
# 天天向上的力量 DayDayUpQ2.py# 按每天比还来多0.005算呢,0.002或其它呢day_factor = 0.005 # 使用变量的好处:一处修改即可day_up = pow(1+day_factor,365)day_down = pow(1-day_factor,365)print('天天向上{:.2f},天天向下{:.2f}'.format(day_up,day_down))
# 天天向上的力量 DayDayUpQ3.py'''工作日进步,休息日退步呢1.01^365 :这是数学思维for ... in ... :这是计算思维采用循环模拟365天的过程抽象+自动化'''day_factor = 0.01 # 使用变量的好处:一处修改即可day_up = 1for i in range(365):if i % 7 in (1,2,3,4,5):day_up *= 1+day_factorelse:day_up *= 1-day_factorprint('工作日进步,休息日退步:{:.2f}'.format(day_up))
# 天天向上的力量 DayDayUpQ4.py'''求解:休息2天退步1%,要多努力才能赶走上天天进步1%的?求day_factor?用"笨方法"一直尝试'''def work_five(df):day_up = 1for i in range(365):if i % 7 in (1,2,3,4,5):day_up *= 1+dfelse:day_up *= 1- 0.01return day_upday_factor = 0.01 # 使用变量的好处:一处修改即可while(work_five(day_factor)<pow(1.01,365)):day_factor += 0.001print('休息2天的要多努力才能赶走上天天1%的:{:.3f}'.format(day_factor))
深入理解
计算思维:
模拟过程:for .. in ..模拟365天的过程
试错求值:while 比较直到解出值
打印可在一行中逐渐动态变化的进度条
# TextBarV1.pyimport timescale = 10print('=====程序开始=====')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('=====程序结束=====')
# TextBarV2.py'''单行刷新的本质 ('\r' 和 end='')1.刷新需要输出覆盖2.不能换行 (控制print()函数,end='')3.从行首开始输出( \r 在输出的最开始)'''import timefor i in range(101):print('\r{:<3d}%'.format(i),end='')time.sleep(0.01)
# TextBarV2.py'''单行刷新的本质 ('\r' 和 end='')1.刷新需要输出覆盖2.不能换行 (控制print()函数,end='')3.从行首开始输出( \r 在输出的最开始)'''import timefor i in range(101):print('\r{:<3d}%'.format(i),end='')time.sleep(0.01)
# TextBarV3.pyimport timescale = 20start_time = time.time()print('程序开始'.center(scale,'='))for i in range(scale+1):a = i * '*'b = (scale - i) * '.'c = (i/scale)*100use_time = time.time() - start_timeprint('\r{:<3.0f}%[{}->{}]{:.02f}s'.format(c,a,b,use_time),end='')time.sleep(0.1)print('\n' + '程序结束'.center(scale,'='))
同一场景(转换问题)找不同的问题:程序执行时间,比较不同算法时间
在任务运行时间需要较长的程序中增加进度条提高用户体验
统计时间可以用time.time()
暂无