python装饰器通俗易懂的解释!
import time
def timeit(func):
def test():
start = time.clock()
func()
end = time.clock()
print('time used :',end-start)
return test
@timeit#语法糖
def sum():
sum = 1+2
print(sum)
@timeit
def sub():
sub = 2-1
print(sub)
sub()
sum()
sum()
sum()
sub()
Python3生成器与迭代器
字符串,列表,元组都是典型的迭代器,迭代器的类内部都有__iter__和__next__两个函数。
import sys
l = [1,2,3,4,3,46,457,235,73,45]
it = iter(l)
print(next(it))
print(next(it))
#常用的for遍历属于迭代器的语法糖
for i in l:
print(i)
一个典型的迭代器类如下,使用StopIteration异常标识迭代结束
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 10:
x = self.a
self.a += 1
return x
else:
raise StopIteration
mynumber = MyNumbers()
myiter = iter(mynumber)
print(next(myiter))
print(next(myiter))
for i in myiter:
print(i)
在 Python 中,使用了 yield 的函数被称为生成器(generator)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。以下实例使用 yield 实现斐波那契数列:
def fibonacci(n):
a, b, cnt = 0, 1, 0
while True:
if cnt > n:
return
yield a
a, b = b, a+b
cnt += 1
f = fibonacci(10)
while True:
try:
print(next(f), end='')
except StopIteration:
sys.exit()
又称解析式,python有三种推导式,列表,字典,集合。
列表是[],字典和集合是{}
只适用于代码量少,不想去def一个新的函数的时候(如果代码量多,直接去def多好),基本形式为关键字lambda 参数 : 程序语句。比如说列表排序时,key的指定可以使用lambda表达式。
function = lambda x,y: [x for i in range(y)]
print(function(2,5))
map(函数f,可迭代对象1,可迭代对象2...可迭代对象n)
就是通过map函数对可迭代对象中的每个元素全部使用函数f,有种取代循环的感觉
def square(x):
return x**2
l = list(map(square,[1,2,3,6]))
print(l)
def add(x,y):
return x,y
l1 =[1,2,3,4]
l2 =[1,2,0]
l = list(map(add,l1,l2))
print(l)
l = list(map(lambda x,y:x*y,l1,l2))
print('*'*100,'\n',l)
他是将可迭代对象组合成元组列表!!!使用*将元组列表解压成列表
l = list(zip(l1,l2))
print(l)
a,b = zip(*l)
print(a,'\t',b)
集合(set)是一个无序的不重复元素序列。他是python基本类型之一。
可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
不说了,就是排序的,经常用
print('%d \t %.4f'%(4,3.1415))#百分号法
print('loss: {0} \t accuracy: {1:.4f}'.format(3.1415926,1.23456789))#format法
class car():
def __init__(self,a):
self.a = a
class moto(car):
def __init__(self,a,b):
super(car,self).__init__(a)
self.b = b
m = moto(1,2)
print(m.__dict__)
class bwm(car):
def __init__(self,a,b):
Car.__init__(self,a)
self.b = b
def foo(self):
print('f1')
b = bwm(3,4)
print(b.__dict__)
https://zhuanlan.zhihu.com/p/20953544
可见,某个线程想要执行,必须先拿到GIL,我们可以把GIL看作是“通行证”,并且在一个python进程中,GIL只有一个。拿不到通行证的线程,就不允许进入CPU执行
所以要在python下提高效率,建议使用多进程(在多CPU前提下),因为每个进程用各自的GIL
Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数。
当一个对象的引用计数归零时,它将被垃圾收集机制处理掉
Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。
try:
#语句
except 错误类型:
#输出错误原因
else:
#如果语句没有错误,则执行else
finally:
#不管有没有错误,都要执行finally