Python的三大神器,你知道是哪三大吗?史上最详细的入门教程!

Python的三大神器,你知道是哪三大吗?史上最详细的入门教程!

Python的三大神器:装饰器、迭代器与生成器!这就是Python的三大神器,好了废话不多说。直接来上干货吧!

生成器

仅仅拥有生成某种东西的能力,如果不用__next__方法是获取不到值得。

创建一个生成器函数

>>> 


 def scq():... print("11")# 当函数代码块中遇到yield关键字的时候,这个函数就是一个生成器函数... yield  


1... print("22")... yield 2... print("33")... yield 3... 

把生成器赋值给一个对象

>>> r = scq() 

查看r的苏剧类型并且输出r的值

>>> print(type(r),r)<class 'generator'> <generator object scq at 0x000001F117D8DF10> 

当执行生成器的__next__的时候,代码会按照顺序去执行,当执行到yield时会返回并提出,yield后面的值就是返回值,然后记录代码执行的位置,并退出

执行结果

C:Python35python.exe F:/Python_code/sublime/Week5/Day03/s1.py0 1 2 3 4Process finished with exit code 0 

迭代器

具有访问生成器的能力,可以访问到生成器的值,类似于生成器的__next__方法,一个一个值一个值得去迭代,只能够按照顺序的去查找。

特点:

  1. 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
  2. 不能随机访问集合中的某个值 ,只能从头到尾依次访问
  3. 访问到一半时不能往回退
  4. 便于循环比较大的数据集合,节省内存

优化上面range或xrange的生成器

def 


 irange(start, stop, step=1): while start != stop: yield start start +=  


step  else:  raise StopIteration for n in irange(1, 10):  


"""for循环只要遇到StopIteration就会停止"""  print(n)ret = irange(1, 20) print(ret) 


 # 返回一个生成器,相当于只在内存中创建了一个值 print(list(ret)) # 如果想要得到全部的值,变成列表就可以 


/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/ansheng/MyPythonCode/hello.py 


1 


2 


3 


4 


5 


6 


7 


8 


9 


<generator object irange at 0x1021df7d8> 


[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] 


 


Process finished with exit code 0 

Python之装饰器

现要在执行func这个函数前后执行一些操作,就可以创建一个装饰器来实现:

#!/usr/bin/env python 


# _*_ coding: utf-8 _*_ 


 


def decorator(func): # 创建一个装饰器函数,接受的参数arg参数就是func函数名 


 


def inner(*args, **kwargs): 


print("执行函数之前") 


ret = func(*args, **kwargs) 


print("执行函数之后") 


return ret 


 


return inner 


 


@decorator # 如果要让某个函数使用装饰器,只需要在这个函数上面加上@+装饰器名 


def func(arg): 


print(arg) 


 


func("Hello World!") 

输出结果为:

/usr/bin/python3.5 /home/ansheng/Documents/PycharmProjects/blogcodes/装饰器.py 


执行函数之前 


Hello World! 


执行函数之后 


 


Process finished with exit code 0 

多个装饰器装饰同一个函数

#!/usr/bin/env python 


# _*_ coding: utf-8 _*_ 


 


def decorator1(func): 


def inner(): 


print("开始之前执行装饰器01") 


ret = func() 


print("结束之后执行装饰器01") 


return ret 


 


return inner 


 


 


def decorator2(func): 


def inner(): 


print("decorator2>>>Start...") 


ret = func() 


print("decorator2>>>End...") 


return ret 


 


return inner 


 


 


@decorator1 


@decorator2 


def index(): 


print("执行函数...") 


 


index() 

输出结果:

/usr/bin/python3.5 /home/ansheng/Documents/PycharmProjects/blogcodes/装饰器.py 


开始之前执行装饰器01 


decorator2>>>Start... 


执行函数... 


decorator2>>>End... 


结束之后执行装饰器01 


 


Process finished with exit code 0 

相关推荐