一、列表推导式
a = [1, 2, 3, 4, 5]
result = [i*i for i in a]
print(result)
二、lambda函数
1、lambda函数即为匿名函数,仅在定义匿名函数的地方使用这个函数,其他地方用不到,所以就不需要给它取个阿猫阿狗之类的名字了。
匿名函数一般不会单独使用,而是配合其他方法,为其他方法提供内置的算法或判断条件
a=(lambda x,y:x+y)(3,4)
print(a)
2、与map函数一起使用时:
map(function, iterable, …)
map() 会根据提供的函数对指定序列做映射。
参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
- function – 函数
- iterable – 一个或多个序列
- Python 3.x 返回迭代器
a = [1, 2, 3, 4, 5]
b = [5,4,3,2,1]
result = map(lambda x,y:x*y,a,b)
for i in result:
print(i)
三、yield 以及生成器和迭代器
迭代器,它可以像list那样被遍历,但又不占用多少内存generator(生成器)是一种特殊的迭代器,只能被遍历一次,遍历结束,就自动消失了
总之,不管是迭代器还是生成器,都是为了避免使用list,从而节省内存
python内置了迭代函数 iter,用于生成迭代器
yield 则是用于构造生成器的
generator保存的是函数算法,节约内存
generator也是可迭代对象
可用next函数调用,也可以用for循环调用
Python3的for循环本质上就是通过不断调用next()函数实现的
generator保存的是算法,每次调用next(generaotr_ex)就计算出他的下一个元素的值,直到计算出最后一个元素,没有更多的元素时,抛出StopIteration的错误
generator和函数的执行流程,函数是顺序执行的,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次被next()调用时候从上次的返回yield语句处急需执行,也就是用多少,取多少,不占内存
def fib(max):
n,a,b =0,0,1
while n < max:
yield b
a,b =b,a+b
n = n+1
for i in fib(6):
print(i)
话说py2时代,range()返回的是list,但如果range(10000000)的话,会消耗大量内存资源,所以,py2又搞了一个xrange()来解决这个问题。
py3则只保留了xrange(),但写作range(),xrange()返回的就是一个迭代器,它可以像list那样被遍历,但又不占用多少内存
Python3的for循环本质上就是通过不断调用next()函数实现的
for x in [1, 2, 3, 4, 5]:
pass
实际上完全等价于
# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
try:
# 获得下一个值:
x = next(it)
except StopIteration:
# 遇到StopIteration就退出循环
break
四、装饰器
1、程序扫描到装饰器,默认执行,被装饰的函数名作为参数,保存在装饰器里面,被装饰的函数名被替换成装饰器的返回值
2、被“@函数”修饰的函数不再是原来的函数,而是被替换成一个新的东西(取决于装饰器的返回值)
3、调用被装饰的函数,就是通过装饰器函数,来修改原函数的一些功能,使得原函数不需要修改
4、如果程序中另外还有一个函数,也需要使用装饰器,但是这个新的函数有 2 个参数,此时又该怎么办呢??最简单的解决方式是用 *args 和 **kwargs 作为函数装饰器内部函数的参数,*args 和 **kwargs 表示接受任意数量和类型的参数
import time
def timer(func):
def wrapper(*args, **kwds):
t0 = time.time()
func(*args, **kwds)
t1 = time.time()
print('耗时%0.3f' % (t1 - t0,))
return wrapper
@timer #do_something=timer(do_something)
def do_something(delay):
print('函数do_something开始')
time.sleep(delay)
print('函数do_something结束')
do_something(3)
运行结果: