Python—高级函数

一、闭包

Python函数是支持嵌套的。如果在一个内部函数中对外部函数作用域(非全局作用域)的变量进行引用,那么内部函数就会被称为闭包。闭包需要满足如下3个条件:
存在于两个嵌套关系的函数中,并且闭包是内部函数;
内部函数引用了外部函数的变量;
外部函数会返回内部函数的函数名。
举例:
#演示内置函数
def a():#1定义外部函数
b=1#3 外部函数代码
def c():#4定义内部函数
print(b)#6 执行内部函数代码
c()#5调用内部函数
a() #2调用外部函数
#演示把内部函数返回(闭包的必要条件),外部可以用接收返回值的方式来访问内部函数
def a():
def b():
return 1 #定义了内部函数的返回值为1
return b #定义了外部函数的返回值为内部函数
rst=a() #接收了外部函数的返回值,也就是内部函数
print(rst)#rst就是内部函数
print(a()())#a()()=rst()
print(rst())#rst()是调用内部函数
 
#使用一个函数作为另一个函数的参数
def a(func_a):#可以传任意函数
print("你好,我是小a!")
func_a() #可以对已定义的函数做额外的操作,不需要修改原来的函数
print("gudeibai")
 
def b():
print("你好,我是小b!")
a(b)
 
def outer(start=0):
count=[start]
def inner():
count[0]+=1
return count[0]
return inner
out=outer(5)
print(out())
 
#使用闭包实现案例
#有银行卡才能执行汇款的操作
#外部函数为创建银行卡
#内部函数为汇款的操作
def bank(isVIP,action):
if isVIP:
print("客户你好,欢迎光临")
else:
print("您好,给你办一张新卡")
if action=="huikuan":
def remit():
print("进行汇款操作")
return remit
if action=="cun":
def cunkuan():
print("进行存款")
return cunkuan
 
card=bank(False,"cun")
card()
 

二、什么是装饰器

假设我们已经定义了一个函数,后续可能会增加临时的需求,例如插入日志,我们可以增加一个包裹函数,由它来负责这些额外的需求,这个包裹函数就是装饰器 。
装饰器主要用于下列场景:
引入日志;
函数执行时间统计;
执行函数前预备处理;
执行函数后清理功能;
权限校验;
缓存。
 
装饰器是一个函数,它需要接收一个参数,该参数表示被修饰的函数。例如,有如下一个装饰器函数:
def wrap(func):
print(‘正在装饰’)
def inner():
print(‘正在验证权限’)
func()
return inner()
装饰器是个嵌套函数
内部函数是一个闭包。
外部函数接收的是被修饰的函数(func)
 
通过在函数定义的前面添加@符号和装饰器名,实现装饰器对函数的包装。给test函数加上装饰器,示例如下:
@wrap
def test():
print(’test')
此时,程序会自动编译生成调用装饰器函数的代码,等价于:
test = wrap(test)
举例:
1.#演示装饰器
from functools import wraps, reduce
 
def a(func_a):
print("装饰器开始工作")
@wraps(func_a)
def b():
print("闭包开始工作")
func_a()
print("装饰器工作结束")
return b
 
def decorator_c():
print("感觉很虚空,需要被装饰")
 
rst=a(decorator_c()) #b
rst()
@a
def abc():
print("想要被装饰")
abc()
print(abc.__name__)
2.
def func(function_name):
print("这是一个有返回值的闭包")
def func_in():
return function_name()
return func_in
 
@func #装饰器的名称
def test():
return 'hello world'
a=test()
print(a)
3.
def out(args):
def fun(function_name):
print('闭包')
def fun_in():
print(args)
return function_name()
return fun_in
return fun
fun=out('hello')
@fun
def test():
return 'hello world'
 
a=test()
print(a)
 

三、常见Python内置函数

  • map函数
map函数会根据提供的函数对指定的序列做映射。
map函数的定义如下:
map(function, iterable,…)
参数function表示函数的名称,参数iterable可以是序列、支持迭代的容器或者迭代器。
 
map函数的作用是以iterable中的每个元素调用function函数,把每次调用后返回的结果保存为迭代器对象。
func = lambda x:x+2
result = map(func, [1,2,3,4,5])
print(list(result))
举例:
#演示map函数
func=lambda x:x+2
rst=map(func,(1,2,3,4,5))
for x in rst:
print(x)
  • filter函数
filter函数会对指定序列执行过滤操作。
filter函数的定义如下:
filter(function,iterable)
function参数可以是函数的名称或None; iterable参数可以是序列、支持迭代的容器或迭代器。
func = lambda x:x%2
result = filter(func, [1, 2, 3, 4, 5])
print(list(result))
举例:
#演示filter函数
func=lambda x:x>5#返回为true通过,false不通过
rst=filter(func,[1,2,3,4,5,6,7,8])
print(list(rst))
 
  • reduce函数
reduce函数会对参数序列中的元素进行累积。
reduce函数的定义如下:
reduce(function, iterable[, initializer])
function是一个带有两个参数的函数;
iterable是一个迭代器对象;
initializer表示固定的初始值。
代码演示:
from functools import reduce
func = lambda x, y:x + y
result = reduce(func, [1, 2, 3, 4, 5])
print(result)
举例:
#演示reduce函数
func=lambda x,y:x+y#前一个值和后一个值相加
rst=reduce(func,[1,2,3,4,5,6,7,8,9,10])
print(rst)
 
注意:function参数不能为None。
在Python 3中,reduce函数已经被从全局名字空间里面移除了,它现在被放置在fucntools模块中,使用时需要先引入,格式如下:
from functools import reduce
 
总结:
闭包:
1、一个函数包含另一个函数
2、外部函数return了内部函数名
3、内部函数调用了外部函数的变量
--这个内部函数叫做闭包
特点:闭包不能直接被调用,而是需要调用外部函数获得返回值;使用该返回值(),来调用内部函数
 
二、装饰器
1、在外部函数的参数部分接收函数名
2、在内都函数的函数体中调用参数对应的函数
3.外部函数返回了内部函数
4.调用外部函数获取返回值(闭包)
5.通过闭包调用,实现对参数对应的函数调用
6.可以通过@装饰器名,来替代传参的过程
特点:
装饰器的调用相对安全可靠,并且不会改变原函数的逻辑

Python—高级函数的更多相关文章

  1. python 高级函数

    高级函数 map 格式:map(func, lt) 说明:接受两个参数,一个函数和一个可迭代对象,返回一个生成器,将func依次作用于lt 示例: l = [1,2,3,4,5]​def double ...

  2. python高级函数

    1 函数 1.1 函数即变量 函数定义:把一个函数体作为变量赋值给一个函数名,同时函数体存放到内存中. 函数调用:根据函数名去内存中寻找对用的函数体,找到了就执行. >>> def ...

  3. Python高级函数--map/reduce

    名字开头大写 后面小写:练习: def normalize(name): return name[0].upper() + name[1:].lower() L1 = ['adam', 'LISA', ...

  4. Python高级函数--filter

    def is_palindrome(n): return str(n) == str(n)[::-1] #前两个‘:’表示整个范围,‘-’表示从后面,‘1’表示数据间隔 output = filter ...

  5. python高级之函数

    python高级之函数 本节内容 函数的介绍 函数的创建 函数参数及返回值 LEGB作用域 特殊函数 函数式编程 1.函数的介绍 为什么要有函数?因为在平时写代码时,如果没有函数的话,那么将会出现很多 ...

  6. 第一篇:python高级之函数

    python高级之函数   python高级之函数 本节内容 函数的介绍 函数的创建 函数参数及返回值 LEGB作用域 特殊函数 函数式编程 1.函数的介绍 为什么要有函数?因为在平时写代码时,如果没 ...

  7. Python函数式编程(一):高级函数

    首先有一个高级函数的知识. 一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数. def add(x, y, f): return f(x) + f(y) 当我们调用add(-, , abs ...

  8. Day11 Python基础之装饰器(高级函数)(九)

    在python中,装饰器.生成器和迭代器是特别重要的高级函数   https://www.cnblogs.com/yuanchenqi/articles/5830025.html 装饰器 1.如果说装 ...

  9. python高级特性和高阶函数

    python高级特性 1.集合的推导式 列表推导式,使用一句表达式构造一个新列表,可包含过滤.转换等操作. 语法:[exp for item in collection if codition] if ...

随机推荐

  1. 【VUE】VUE使用常见问题搜集

    文章目录 1.日期格式化 2.引用JSON文件中的数据 1.日期格式化 安装插件,官网:Moment.js npm install moment --save 示例: //Sat Mar 14 202 ...

  2. C#中的记录(record)

    从C#9.0开始,我们有了一个有趣的语法糖:记录(record) 为什么提供记录? 开发过程中,我们往往会创建一些简单的实体,它们仅仅拥有一些简单的属性,可能还有几个简单的方法,比如DTO等等,但是这 ...

  3. exit hook

    之前经常改 malloc_hook , realloc_hook,free_hook 为 one_gadget 来 get shell ,最近看到一种利用是改 exit hook(winmt师傅告诉我 ...

  4. Nginx 全模块安装及匹配方式、反向代理和负载均衡配置

    一.安装 OpenResty OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用于方便地搭建能够处理超 ...

  5. Python max()方法扩展:求字典中值最大的键

    重要的应该写在前面[捂脸]   场景一:仅求最大值对应的键,代码如下: >>> dic = {'A':4, 'B':2, 'C':3} >>> max_key = ...

  6. 深入了解mysql--gap locks,Next-Key Locks

    Next-Key Locks Next-Key Locks是在存储引擎innodb.事务级别在可重复读的情况下使用的数据库锁,官网上有介绍,Next-Key Locks是行锁和gap锁的组合.行锁是什 ...

  7. HIVE执行引擎TEZ学习以及实际使用

    概述 最近公司在使用Tez,今天写一篇关于Tez的学习和使用随笔.Tez是Apache最新的支持DAG作业的开源计算框架,它可以将多个有依赖的作业转换为一个作业从而大幅提升DAG作业的性能.Tez并不 ...

  8. Python常用的数据结构

    一.list 列表 1.列表的特点 有序的,元素可以重复,列表中的元素可以进行增上改查,可以存放不同的数据类型 2.创建列表 中括号创建并填充 --->[] 通过构造函数创建 list() 列表 ...

  9. 我把自己的java库发布到了maven中央仓库,从此可以像Jackson、Spring的jar一样使用它了

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  10. 【刷题-LeetCode】201 Bitwise AND of Numbers Range

    Bitwise AND of Numbers Range Given a range [m, n] where 0 <= m <= n <= 2147483647, return t ...