python笔记
1.
if a==None:
c=a
else:
c=b
可以写成
c=a or b #直接扔掉None的情况,如果a,b都是None,c就是None
2.
ordereddict保持dict在遍历的时候按照插入的先后顺序。
3.
d.setdefault(kk, []).append(vv) # 这是一个既set又get的操作,若有则只返回,若没有则set然后返回。
这个骚操作在
d.setdefault(kk, 0)+=1
的时候无效,你想想为什么?
4.
x,y=y,x #能完成交换两变量的操作
5.
list的sort操作的算法是TimSort,是一种混合的sort算法,浅显的可能错误的理解是:先找上升子段,上升子段之间merge-sort。所以,如果list是几大段上升子段的样子,可以放心sort,速度不会很差。
6.
numpy.repeat不是循环重复,而是立即重复的。举个例子:1,2重复3次是,1,1,1,2,2,2。而不是1,2,1,2,1,2。我执行发现这个操作应该是开辟新内存的,numpy中的array的占用内存总是和shape大小相符,不会有此方面的优化,因为优化会导致歧义。a NumPy array must have a consistent stride along each dimension, while your strides would need to go one way most of the time but sometimes jump backwards.
1)flat object了解一下。
2)
import numpy as np
arr = np.arange(10)
repeated = np.broadcast_to(arr, (1000, arr.size))
上面的图中说明了,2不是True,但是2的对错属性是True。
1就不一样了,它的属性是True,而且它的值也是True。
类似的还有空串,None这种的。
8.
python中的作用域:
a=[i*10+j for i in range(3) for j in range(3)]
这就是个for的嵌套而已,容易理解,要注意的是先写的是外层循环,后写的是内层的。
9.
collections.Counter()这个容器非常好。不在的默认为0,在的有值。是一个封装的dict
10.
for i,n in enumerate(list,1):
会把1作为偏置加到 i上面,使之计数从1开始
11.python一行代码执行求list的前k项累加和:
方法1: a=[sum(a[:i+1]) for i in range(len(a))] ,耗费时间空间!每次都是n^2时间复杂度,空间也大
方法2: numpy有cumsum
方法3:
sm=[k[0] for k in [[0]] for x in a if k.append(k.pop()+x) or True]
有两个问题:1.不能开辟新变量。2.不能进行赋值操作
解释:for k in [[0]]开辟一个储存空间。if k.append(k.pop()+a[i]) or True这个恒定为真的操作来进行赋值运算,而且保证不会增加空间。
12.
python和c++的负数取余操作不同,要注意。
13.
python巨坑无比的一个地方,函数的默认参数如果是mutable的比如list这种,只会在第一次运行的时候申请一份 ,然后以后都在用这同一份东西!!!!
end