python自动化运维之路4

装饰器

装饰器(decorator)是一种高级Python语法。装饰器可以对一个函数、方法或者类进行加工。

在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一个函数的返回结果。

相对于其它方式,装饰器语法简单,代码可读性高。因此,装饰器在Python项目中有广泛的应用。

装饰器的应用场景:饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装

饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。

概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

装饰器的规则:

装饰器可以用def的形式定义,如上面代码中的decorator。装饰器接收一个可调用对象作为输入参数,并返回一个新的可调用对象。

装饰器新建了一个可调用对象,也就是上面的wrapper。

1.装饰器中如何传递参数?

2.要修饰的函数中有返回值如何处理?

3.带有参数的装饰器

2.生成器和迭代器

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。

而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

list = [x*x for x in range(10)]

print(list) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

list1 = (x*x for x in range(10))

print(list1)# at 0x0000000000B130F8>

只要把一个列表生成式的[]改成(),就创建了一个generator。

只要把一个列表生成式的[]改成(),就创建了一个generator。

generator保存的是算法,每次调用next(g),或者是g的__next__()私有方法,就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误

yeild关键字

著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:

1, 1, 2, 3, 5, 8, 13, 21, 34, ...

一个函数中如果有yield关键字,那个这个函数就不在是普通的函数,而是成了生成器。

生产者消费者模型:

有yield函数式生成器,c1.__next__()是执行到yield的地方,然后跳出函数,然后执行for循环,当执行到c1.send(i),将函数从yield处唤醒,并且将i值传递给yield。

们已经知道,可以直接作用于for循环的数据类型有以下几种:

一类是集合数据类型,如list、tuple、dict、set、str等;

一类是generator,包括生成器和带yield的generator function。

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。

可以使用isinstance()判断一个对象是否是Iterable对象:

isinstance({},Iterable}

isinstance((),Iterable}

isinstance([],Iterable}

列表,元组、字典、生成器都是可迭代对象

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

可以使用isinstance()判断一个对象是否是Iterator对象:

生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。

把list、dict、str等Iterable变成Iterator可以使用iter()函数

你可能会问,为什么list、dict、str等数据类型不是Iterator?

这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。

可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,

只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

小结

凡是可作用于for循环的对象都是Iterable类型;

凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

Python的for循环本质上就是通过不断调用next()函数实现.

内置函数

pickle和json

用于序列化的两个模块

json,用于字符串 和 python数据类型间进行转换

pickle,用于python特有的类型 和 python的数据类型间进行转换

Json模块提供了四个功能:dumps、loads、dump、load

pickle模块提供了四个功能:dumps、loads、dump、load

dumps和loads

  • 版权声明: 本文源自互联网, 于5个月前,由整理发表,共 2550字。
  • 原文链接:点此查看原文