22、Python之函数对象和闭包

目录

  • 一、函数对象

    • 1.1 可以被赋值
    • 1.2 函数可以当作参数传给另一个函数
    • 1.3 函数可以当作一个函数的返回值
    • 1.4 函数可以当作容器类型的一个元素
  • 二、函数嵌套
    • 2.1 函数的嵌套调用:在调用一个函数的过程中又调用其他函数
    • 2.2 函数的嵌套定义:在函数内定义其他函数
  • 三、闭包函数
    • 3.1 什么是闭包函数
    • 3.2 闭包函数的应用

一、函数对象

可以把函数作为变量去使用,不加括号作为内存地址,加括号作为函数运行作为返回值

1.1 可以被赋值

# func=内存地址
def func():
    print('from func')

f=func
print(f,func)  # '<function func at 0x0000027B07F36280> <function func at 0x0000027B07F36280>'
f()  # from func

1.2 函数可以当作参数传给另一个函数

# func=内存地址
def func():
    print('from func')

def foo(x): # 若x = func的内存地址
    print(x)
    # x()

foo(func) # 则返回为foo(func的内存地址) <function func at 0x0000027B07F36280>

def foo(x): # x = func的内存地址
    # print(x)
    x()  # 内存地址(函数名)加括号,即作为函数运行

foo(func) # from func

1.3 函数可以当作一个函数的返回值

# func=内存地址
def func():
    print('from func')

def foo(x): # x=func的内存地址
    return x # return func的内存地址

res=foo(func) # foo(func的内存地址)
print(res) # res=func的内存地址

res()

1.4 函数可以当作容器类型的一个元素

# func=内存地址
def func():
    print('from func')

l=[func,]
# print(l)  # [<function func at 0x0000027A45EA6280>]
l[0]()  # from func

dic={'k1':func}
print(dic)  # {'k1': <function func at 0x0000027A45EA6280>}
dic['k1']()  # from func

二、函数嵌套

2.1 函数的嵌套调用:在调用一个函数的过程中又调用其他函数

def max2(x,y):
    if x > y:
        return x
    else:
        return y

def max4(a,b,c,d):
    # 第一步:比较a,b得到res1
    res1=max2(a,b)
    # 第二步:比较res1,c得到res2
    res2=max2(res1,c)
    # 第三步:比较res2,d得到res3
    res3=max2(res2,d)
    return res3

res=max4(1,2,3,4)
print(res)  # 4

2.2 函数的嵌套定义:在函数内定义其他函数

def f1():
    def f2():
        pass
# 圆形
# 求圆形的求周长:2*pi*radius
def circle(radius,action=0):
    from math import pi

    def perimiter(radius):
        return 2*pi*radius

    # 求圆形的求面积:pi*(radius**2)
    def area(radius):
        return pi*(radius**2)

    if action == 0:
        return 2*pi*radius

    elif action == 1:
        return area(radius)

res=circle(33,action=0)
print(res)  # 207.34511513692635

三、闭包函数

闭包函数=名称空间与作用域+函数嵌套+函数对象
核心点:名字的查找关系是以函数定义阶段为准

3.1 什么是闭包函数

# "闭"函数指的该函数是内嵌函数
# "包"函数指的该函数包含对外层函数作用域名字的引用(不是对全局作用域)
# 闭包函数:名称空间与作用域的应用+函数嵌套
def f1():
    x = 12306
    def f2():
        print(x)
    f2()    # f2()是内嵌函数,但是又有对外层函数作用域名字的引用
#
#
x=11111
def bar():
    x=444444
    f1()

def foo():
    x=2222
    bar()

foo()  # 12306,运行foo(),调用bar(),运行bar(),调用f1(),运行f1(),即运行f2(),由于f1中已固化x,因此运行结果与外界x无关
# 闭包函数:函数对象
def f1():
    x = 33333333333333333333
    def f2():
        print('函数f2:',x)
    return f2  # 返回的是f2的内存地址,加括号就是返回值了

f=f1()  # f2的内存地址,与f绑定了
print(f)  # <function f1.<locals>.f2 at 0x0000021496203040>

x=4444
f()  # 函数f2: 33333333333333333333
def foo():
    x=5555
    f()

foo()  # 函数f2: 33333333333333333333

3.2 闭包函数的应用

# 两种为函数体传参的方式:
# 方式一:直接把函数体需要的参数定义成形参
def f2(x):
    print(x)

f2(1)
f2(2)
f2(3)

# 方式二:将值包给函数
def f1(x): # x=3
    x=3
    def f2():
        print(x)
    return f2

x=f1(2)  # 函数f1()中括号内参数的值无任何意义,不影响最终结果,定义函数时,x的值已被固化
print(x)  # <function f1.<locals>.f2 at 0x0000022763134040>

x()  # 3
import requests

# 传参的方案一:
def get(url):
    response=requests.get(url)
    print(len(response.text))

get('https://www.baidu.com')

get('https://zhuanlan.zhihu.com/p/109056932')

# 传参的方案二:
def outter(url):
    # url='https://www.baidu.com'
    def get():
        response=requests.get(url)
        print(len(response.text))
    return get

baidu=outter('https://www.baidu.com')
baidu()

zhihu=outter('https://zhuanlan.zhihu.com/p/109056932')
zhihu()

原文地址:https://www.cnblogs.com/zuiyouyingde/p/12536400.html

时间: 2024-11-05 18:44:43

22、Python之函数对象和闭包的相关文章

python基础——函数对象和闭包

关于函数对象和闭包 闭包(closure)是函数式编程的重要的语法结构.不同的语言实现闭包的方式不同.Python以函数对象为基础,为闭包这一语法结构提供支持的 (我们在特殊方法与多范式中,已经多次看到Python使用对象来实现一些特殊的语法).Python一切皆对象,函数这一语法结构也是一个对象.在函数对象中,我们像使用一个普通对象一样使用函数对象,比如更改函数对象的名字,或者将函数对象作为参数进行传递. 一.函数对象: 1.函数可以当参数传递 示例: #把函数当成参数传递 def foo()

Python中的函数对象与闭包

函数在Python中是第一类对象,可以当做参数传递给其他函数,放在数据结构中,以及作为函数的返回结果. 下面的例子为接受另外一个函数作为输入并调用它 1 #foo.py 2 def callf(func): 3 return func() 使用上面的函数: 1 import foo 2 def helloworld(): 3 return 'Hello,World' 4 5 print foo.callf(helloworld) >>>‘Hello,World’ 2.把函数当做数据处理时

python学习16——函数对象与闭包函数

一 函数对象 函数对象指的是函数可以被当做数据来处理,具体可以分为四个方面的使用,我们如下 1.1 函数可以被引用 >>> def add(x,y): ... return x+y ... >>> func=add >>> func(1,2) 3 1.2?函数可以作为容?类型的元素 >>> dic={'add':add,'max':max} >>> dic {'add': <function add at 0x

函数嵌套,名称空间,作用域,函数对象,闭包函数

函数嵌套 嵌套调用是在函数内又调用其他函数 def max(x,y): return x if x > y else y def max4(a,b,c,d): res1=max(a,b) res2=max(res1,c) res3=max(res2,d) return res3 print(max4(1,2,3,4)) 嵌套定义是在函数内又定义其他函数 # def f1(): # print('f1') # def f2(): # print('f2') # def f3(): # print(

Python虚拟机函数机制之闭包和装饰器(七)

函数中局部变量的访问 在完成了对函数参数的剖析后,我们再来看看,在Python中,函数的局部变量时如何实现的.前面提到过,函数参数也是一种局部变量.所以,其实局部变量的实现机制与函数参数的实现机制是完全一样的.这个"一样"是什么意思呢? 之前我们剖析过Python虚拟机的一些指令,如果要访问一个变量,应该使用LOAD_NAME指令,应该依照local.global.builtin这三个名字空间里去检索变量名所对应的变量值.然后在调用函数时,Python虚拟机通过PyFrame_New创

07-04 函数对象与闭包

[TOC] 一 函数对象 函数对象指的是函数可以被当做'数据'来处理,具体可以分为四个方面的使用,我们如下 插图:恶搞图26 1.1 函数可以被引用 >>> def add(x,y): ... return x+y ... >>> func=add >>> func(1,2) 3 1.2 函数可以作为容器类型的元素 >>> dic={'add':add,'max':max} >>> dic {'add': <f

【Python】函数对象

转:作者:Vamei 出处:http://www.cnblogs.com/vamei 函数也是一个对象,具有属性(可以使用dir()查询).作为对象,它还可以赋值给其它对象名,或者作为参数传递. lambda函数 在展开之前,我们先提一下lambda函数.可以利用lambda函数的语法,定义函数.lambda例子如下: func = lambda x,y: x + y print func(3,4) lambda生成一个函数对象.该函数参数为x,y,返回值为x+y.函数对象赋给func.func

python的函数对象

1.lambda函数 lambda可用于定义函数,例子: func = lambda x,y: x+y print func(x,y) 2.函数可作为参数传递 def f2(f1,a): f1(a,1) return f1 f2(f1,4) 3.map re = map((lambda x: x+3),[1,3,5,6]) map有两个参数,一个是lambda所定义的函数,另一个是包含多个元素的表 map的功能是 将 函数依次作用于 表中的元素,  并将结果保存在 re 表中,map多个参数写法

【Python的函数对象】

函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(First-Class Object)呢? 在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量.可以作为元素添加到集合对象中.可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的. 1.函数身为一个对象,拥有对象模型的三个通用属性:id.类型.和值. #