python中的高级特性
一.生成式详解
列表生成式就是一个用来生成列表的特定语法形式的表达式。是Python提供的一种生成列表的简洁形式,可快速生成一个新的list。
·普通的语法格式:[exp for iter_var in iterable]
·带过滤功能语法格式:[exp for iter_var in iterable if_exp]
·循环嵌套语法格式:[exp for iter_var_A in iterable_A for iter_var_B in iterable_B]
字典生成式:用来快速生成字典;
集合生成式:用来快速生成集合;
s={1,2,3,4,5,6,7}
#集合生成式
print({i**2 for i in s})
#字典生成式
print({i:i**2 for i in s})
二.生成式详解
·什么叫生成器?
在Python中,一边循环一边计算的机制,称为生成器:Generator。
·什么时候需要使用生成器?1性能限制需要用到,比如读取一个10G的文件,如果一次性将10G的文件加载到内存处理的话(read方法),内存肯定会溢出;但使用生成器把读写交叉处理进行,比如使用(readline和readlines)
就可以再循环读取的同时不断处理,这样就可以节省大量的内存空间.
·如何创建生成器?
第一种方法:列表生成式的改写。]改成()
第二种方法:yield关键字。·如何打印生成器的每一个元素呢?
通过for循环,依次计算并生成每一个元素。
如果要一个一个打印出来,可以通过next()函数获得生成器的下一个返回值。
生成器的特点是什么?
·解耦.爬虫与数据存储解耦;
·减少内存占用.随时生产,即时消费,不用堆积在内存当中;
·可不终止调用.写上循环,即可循环接收数据,对在循环之前定义的变量,可重复使用;
·生成器的循环,在yield处中断,没那么占cpu.
三.生成器、迭代器与可迭代对象
迭代是访问容器元素的一种方式。迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问植到所有的元素被访问完结束。
可迭代对象:可以直接作用于for循环的对象(如何判断是否可以迭代?)
一类是集合数据类型,如ist,Ituple,dict,set,str等;
一类是generator,包括生成器和带yield的generator function。
·可以被next()函数调用并不断返回下一个值的对象称为迭代器:lterator。
·生成器都是Iterator对象,但list、dict、str虽然是terable,却不是Iterator。
·把ist、dict、str等lterable变成lterator可以使用iter()函数
四.闭包
·什么是闭包?如何实现闭包?
闭包就是指有权访问另一个函数作用域中的变量的函数。
创建闭包最常见方式,就是在一个函数内部创建另一个函数。
常见形式:内部函数使用了外部函数的临时变量,且外部函数的返回值是内部函数的引用。
闭包的一个常用场景就是装饰器
函数line与变量a,b构成闭包。在创建闭包的时候,我们通过line_conf的参数a,b说明了这两个变量的取值,这样,我们就确定了函数的最终形式(y=x+1和y=4x+5)。
优点:闭包也具有提高代码可复用性的作用。
五.装饰器
1.什么是装饰器
器指的是工具,而程序中的函数就是具备某一功能的工具,所以装饰器指的是为被装饰器对象添加额外功能的工具/函数。
2.为什么使用装饰器
如果我们已经上线了一个项目,我们需要修改某一个方法,但是我们不想修改方法的使用方法,这个时候可以使用装饰器。因为软件的维护应该遵循开放封闭原则,即软件一旦上线运行后,软件的维护对修改源代码是封闭的,对扩展功能指的是开放的。
装饰器的实现必须遵循两大原则:
·封闭:对已经实现的功能代码块封闭。不修改被装饰对象的源代码
·开放:对扩展开发
装饰器其实就是在遵循以上两个原则的前提下为被装饰对象添加新功能。
3.装饰器的实现
装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象
4.装饰器的应用场景
装饰器经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等应用场景。
插入日志
性能测试
事务处理
Fib数列缓存
权限校验+多装饰器
六.内置高阶函数
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!Python对函数式编程提供部分支持。
把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式
1.map()
map()会根据提供的函数对指定序列做映射。
当序列多于一个时,map可以并行(注意是并行)地对每个序列执行如下图所示的过程:
2.reduce()
reduce()函数会对参数序列中元素进行累积。
3.filter()
filter()函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
4.sorted()
sorted()函数对所有可迭代的对象进行排序操作。返回重新排序的列表。
sorted(iterable,key=None,reverse=False)
key:主要是用来进行比较的元素,只有一个参数,
reverse:排序规则,True降序,False升序(默认)。
python排序sort()和sorted()的区别是什么?
1.排序对象不同:sort是应用在list上的方法,sorted可以对所有可迭代的对象进行排序操作。
2.返回值不同:
list的sort方法返回的是对已经存在的列表进行操作,无返回值,内建函数sorted方法返回的是一个新的list,而不是在原来的基础上进行的操作。