基础知识
1 . 除了常规比较操作,以下值或返回True或False:
- 数字(0,0.0返回false)
- 数据类型None返回false
- 集合类型(list,tuple,dict,set)元素数量为0返回false
2 . python内置上述四种集合可用于迭代(for… in …),其中字典类型以key值返回,且和set一样内容是乱序(可改用collections模块)。
3 . 只要类中有iter和next函数,可以作为迭代器对象在for语句中使用。
# define a Fib class
class Fib(object):
def __init__(self, max):
self.max = max
self.n, self.a, self.b = 0, 0, 1
def __iter__(self):
return self
def __next__(self):
if self.n < self.max:
r = self.b
self.a, self.b = self.b, self.a + self.b
self.n = self.n + 1
return r
raise StopIteration()
# using Fib object
for i in Fib(5):
print(i)
yield关键字也可实现迭代效果。yield 语句每次执行时,立即返回结果给上层调用者,而当前的状态仍然保留,以便迭代器下一次循环调用。
def fib(max):
a,b=0,1
while max:
r=b
a,b=b,a+b
max-=1
yield r
#using generator
for i in fib(5):
print(i)
4 . 三目运算符:python没有类似 condition ? value1 : value2 三目操作符,不过python可以通过 if-else 的行内表达式完成类似的功能。
var=var1 if condition else var2
5 . 使用if __name__ == '__main__':
的代码称为自调用,可用于单元测试等。
6 . 函数参数摆放位置:特定参数>默认参数>可变参数>关键字参数。可变参数以()和变量名组合,为可迭代的对象。关键字参数(*)在函数内部封装成字典。
def report(name, *grades):
total_grade = 0
for grade in grades:
total_grade += grade
print(name, 'total grade is ', total_grade)
def portrait(name, **kw):
print('name is', name)
for k,v in kw.items():
print(k, v)
7 . list列表已经实现了append、insert、remove、切片、index(查找)、count、sort等功能。
8 . 文件读取(w,r,a,+)
- r只读 ,r+覆盖读写 ,文件不存在不创建会报错
- w新建只写(不能读出) , w+新建读写,二者都会清空文件内容,文件不存在会创建
- a附加写方式打开,不可读,a+附加读写方式打开
9 . 高级函数
- zip
a=[1,2,3]
b=[4,5,6]
ab=zip(a,b)
print(list(ab))
for i,j in zip(a,b):
print(i/2,j*2)
'''
[(1, 4), (2, 5), (3, 6)]
0.5 8
1.0 10
1.5 12
'''
- lambda
fun= lambda x,y:x+y
x=int(input('x=')) #这里要定义int整数,否则会默认为字符串
y=int(input('y='))
print(fun(x,y)
- map
def fun(x,y):
return x+y
print(list(map(fun,[1],[2])))
print(list(map(fun,[1,2],[2,4])))
print(fun([1,2],[3,4]))
'''
[3]
[3, 6]
[1, 2, 3, 4]
'''
- pickle
10 . 深copy和浅拷贝
一个对象的id值在CPython解释器里就代表它在内存中的地址,如id(var)
。
浅拷贝只是拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。如copy.copy(var)
,深拷贝对外围和内部元素都进行了拷贝对象本身,如copy.deepcopy(var)
。
11 . 正则表达式
多线程threading
- 系统模块threading。
- 使用join函数控制执行完的先后顺序。(线程同步)
- 多线程会遇到Global Interpreter Lock (GIL)问题。
尽管Python完全支持多线程编程, 但是解释器的C语言实现部分在完全并行执行时并不是线程安全的。 实际上,解释器被一个全局解释器锁保护着,它确保任何时候都只有一个Python线程执行。 GIL最大的问题就是Python的多线程程序并不能利用多核CPU的优势 (比如一个使用了多个线程的计算密集型程序只会在一个单CPU上面运行)。 - 线程锁
执行共享内存前,lock.acquire()
;执行后,lock.release()
。
多进程multiprocessing
- 多进程弥补了多线程GIL的问题并充分利用了多核和threading的使用方法。
- 常用到进程池Pool,map、apply_async。
- 共享内存使用Value、Array(一维的)
- 使用内存锁解决内存争用