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))
 这个完美解决!!!repeated变量是一个read-only变量,正好避免了问题。
 
7.
python中的对与错

上面的图中说明了,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

posted @ 2018-12-14 10:01  Cloud.9  阅读(163)  评论(0编辑  收藏  举报