赞
踩
这几天看了下Python函数进阶知识,对于函数中某些的一些高阶用法,如生成器 装饰器 推导式。
既然引出了专属装饰器,我们先来谈一谈Python中的闭包,闭包其实就是函数的深层嵌套,你可以理解为一个函数里面套了另一个函数,这样做的目的其实其实就是让该作用域里可以再开辟作用域,另一个函数需要的参数提前在第一个函数里准备好,保护变量,使其不会被任意更改,函数使用更加灵活高效。闭包的作用其实就是保护变量,可以在内存中预加载一块区域存储内层函数需要使用到的数据。接下来聊聊装饰器是什么鬼,简单来说就是给一个函数装饰了,用另一个函数来装饰原函数,使得我们可以在原函数运行或者之后做操作,比如一个视图,要保证已经登录状态才给予访问,就可以在执行视图之前先判断一下,对应业务。在一个函数上面加上@另一个函数,自动执行另一个函数,并且将原函数名传到另一个修饰他的函数,自然要有一个参数接收。函数名 引用 内存中的一块地址,它执行函数体里的代码,加括号即可让函数运行起来。函数名可以哈希,所以可以充当字典的key,后面我们可以通过字典循环kv进行函数循环执行的用法,例如一套流程的操作,也可以使用列表的数据结构,实现函数名的存储,函数参数对应的存储,最后循环执行函数,简化代码,高效。装饰器自动传入被修饰的函名,然后在外层进行返回内层函数,内层函数里再次调用原函数,在其前后都可以进行其他操作,将这个函数的运行扩展了,需要注意的是,将原函数修饰成内层函数执行,原来函数的某些东西会消失,例如 函数注释 函数名 如果不想让原来的函数消失自己的特效,需要导入一个functools的模块,functools.wrap(函数)操作使其仅仅伪装修饰的过程。简单总结,装饰器就是利用函数嵌套,闭包知识,我们可以在这个函数运行前后进行操作。第二个就是,生成器,这个东西特别牛逼,和Java遍历容器里的对象有异曲同工之处,Java里对容器操作 常见容器set list map,都可以使用Iterator 迭代器对象来搞,一般和while循环搭配进行,hasnext() next方法一个一个讲容器里的数据获取到即可。Python这生成器玩意也是,如果在函数里加上yield 值,这个函数就变成了一个生成器对象,执行该函数返回的就不是返回值了,而是一个生成器对象,他可以被迭代,我们可以一个一个拿到数据,生成器的优点就是,操作处理大批量数据时,节省内存消耗,提高程序运行效率。所有后面我们遇到,比如批量读取超大文件,就可以这样搞。一般操作就是next一个一个取到 接收返回值就是yield对应的值,如果一个生成器函数里面有多个yield,每执行到一个yield,函数执行就停止,运行后再次从上一次yield节点开始继续运行。除了next 还有send针对返回的生成器对象,我们可以使用send方法,默认执行第一个yield传入参数None,None这种数据类型也是设计的很巧妙,节省内存开销,当你不知道给一个变量赋值是可以使用,函数不反回数据时默认返回None,可以看到Python真的巧妙。send相当于可以让我们赋值给yield左边接收的那个变量。一般用生成器就是,一条一条返回数据,然后迭代生成器对象,直接默认执行next方法,我们就可以直接拿到数据,方便后面操作。最后,推导式有四种,列表元组字典集合都可以进行使用,左右就是快速生成我们想要的数据结合for循环 三元表达式 前后即可对循环变量进行操作。有个坑点就是列表推导式和元组推导式,列表推导式里假如最后生成的是匿名函数,假设里面设计推导式的数据,使用最后的那个数据,此时匿名函数和推导式的作用域是一致的,以最后一次为例。相反,元组就不是这么了,元组需要一个一个执行,所以每次的值都是不一样的。生成式提高了开发效率,代码更加优雅✔
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。