python学习笔记
基本操作
▲input('……')
输出引号里内容并读入
▲print('……',a,b)
引号里内容原样输出;每用一个逗号分隔都会输出一个空格;
print('%d %s %.2f' % (2,'123',3.0))
输出一个%需要用%%转义
末尾会默认加一个换行,可以用print(……,end=' ')取消回车
注意可以把输出的值放在list里再输出来加速
print (' '.join(map(str, res)))
▲print('''A
B
C''')
每行都能换行。
▲#注释
▲单引号和双引号都可以表示字符串;用\进行转义。
▲缩进决定子程序;if和else后要加冒号。可以用elif代替else if。
▲for循环:
for i in range(0,100000):
本质是生成了一个很大的list然后一个个访问过去。
▲while循环:
while (x>0):
▲int():转化成整数。
▲import math:导入math库。
容器的使用
▲list:
类似于vector,用中括号定义。 a=[1,2,3]
用len(a)测长度;a[-x]表示倒数第x个数是什么。
用append(x)在末尾添加一个元素,用insert(p,x)加入到指定位置;用pop()删除最后一个,用pop(i)删除指定位置。
ls.copy()生成一个等于ls的新的列表。
使用较为灵活。比如ls+=lt(或ls.extend(lt))表示将lt接到ls后面;
list里面的元素可以不是同一个类型,甚至可以嵌套list。
tuple与list类似,但是不可变(没有加入、删除函数);用小括号来定义。
▲dict:
类似于unordered_map,用大括号定义。d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
可以直接用中括号访问和修改。
可以用'Bob' in d 进行询问是否存在;也可以用d.get('Bob',-1)访问,没有元素返回-1。
用d.pop('Bob',-1)删除。
for循环in后面可以放dict类型。直接引用默认迭代key。
如果要迭代value,用for value in d.values()
如果要同时迭代key和value 用for k, v in d.items()。
enumerate()可以把list转化为“下标-list”的pair
▲set:
用小括号和一个list定义。s = set([1, 2, 3])
用add(key)和remove(key)进行加入和删除。
注意可以完全看做一个集合,因此可以进行s1&s2,s1|s2等运算。
函数相关
▲用lambda快速定义函数
比如f=lambda x,y:x+y
▲定义一个普通函数
def move(x, y, step, angle=0):
nx=ny=1
return nx, ny
▲传入可变参数
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
调用的时候,可以往Move里放0或多个参数(如move(1,2,3))。进入函数后,它们会打包成一个list。
如果就是要往里面传整个list类型的东西,可以简写成move(*List)。
▲传入关键字参数
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
调用的时候,可以在末尾放0或多个参数,比如person('Adam', 45, gender='M', job='Engineer')。
进入函数后,它们会打包成一个dict。同样的,可以简单地用**Dict来传入一个dict类型的容器。
▲传入命名关键字参数
def person(name, age, *, city, job):
中间要加个*号以示区分。在这样的情况下,后面只接受名字(第一维)为city,job的关键字。
如果之前已经定义过可变参数了,那么不用加*来区分了。
▲定义函数参数的顺序:必选参数->默认参数->可变参数->命名关键字参数->关键字参数
def f(a, b, c=0, *args, **kw):
print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
甚至可以组装一个tuple和一个dict直接传进去,即任意一个函数f都可以用形如f(*args,**kw)的形式调用。
▲基本函数
eval()将引号里的东西用python表达式计算结果
math.sqrt()
math.acos()
abs()
round(x,2)保留2位小数
▲随机数相关(import random)
seed(x)
random() 生成[0.0,1.0)之间的随机小数
randint(a,b) 生成[a,b]之间的整数
shuffle(seq) 把一个序列类型打乱
高级特性
▲使用import decimal调用浮点数高精度库。
设置计算时的精度:decimal.getcontext().prec=n
将一个数x转化为它:decimal.Decimal(x)
初始化常量时,要用单引号括起来。
▲切片
a[0:3] :截取list里固定的一段(注意下标左闭右开)。支持负数,0可以省略。
a[:10:2]:前10个数里每两个中取一个(即a[0],a[2],a[4],a[6],a[8])。中间的数省略,视为在整个list里选。
▲列表生成式
[x * x for x in range(1, 11)]
甚至可以加判断 [x * x for x in range(1, 11) if x % 2 == 0]
▲生成器generator
定义方式①:将列表生成式的[]替换成()
每次用g.next()调用下一个值;也可以用 for i in g 循环调用
定义方式②:用函数。每次在关键字yield后抛出一个值,next后从上次抛出位置继续。
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'
文件相关
▲打开和关闭
<变量名>=open(<文件名>,<打开模式>)
打开模式和C类似。'r'是只读,'w'覆盖写,'a'追加;'t'为文本文件类型,'b'为二进制文件类型;末尾加一个'+'表示在原功能上同时加上读写功能。
open默认以"rt"的方式打开;如果读入图片、音乐等,就要用'*b'打开。
释放文件使用权:<变量名>.close()
▲读写格式
文件变量本身是行序列,所以可以用 for line in <文件名>: 遍历。