函数对象与闭包

函数对象与闭包

函数对象指的是函数可以被当做""数据""来处理

1.函数可以被引用

>>> def add(x, y):
...     return x+y
...
>>> func = add
>>> func(1, 2)
3

2.函数可以当做参数传递

>>> def foo(x,y,func):
...     return func(x,y)
...
>>> foo(1,2,add)
3

3.函数可以当做返回值使用

(传参的时候一定不能加括号,加括号当场就执行了)

def index():
    print("from index")

def func(a):
    return a

a = func(index)
a()

4.函数可以被当做容器类型的元素

def func():
    print('from func')


l1 = [1, '2', func, func()]

f = l1[2]
print(f)
from func
<function func at 0x000001F6BD7F3E18>

函数的嵌套

函数的嵌套调用:在函数内调用函数

定义:

​ 让内层函数封闭起来,不让外部直接调用

作用:

将复杂并且小的功能,在函数内部调用,解决代码结构清晰问题

def index():
    def home():
        print("from home")
    home()

index()
from home

例子:

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


print(func1(1,2))

def func2(x, y, z, a):
    result = func1(x, y)
    result = func1(result, z)
    result = func1(result, a)
    return result


print(func2(1, 200000, 3, 1000
2
200000

闭包函数

闭:代表函数内部

包:代表函数外“包裹”着对外层作用域的引用

是函数嵌套、函数对象、名称空间与作用域的结合体

1.闭包函数必须在函数内部定义

2.闭包函数可以引用外层函数的名字

闭包函数是为了装饰器做准备

x = 1

def f1():
    def f2():
        print(x)
    return f2

def f3():
    x = 3
    f2 = f1()   #调用f1()返回函数f2
    f2()    #需要按照函数定义时的作用关系去执行,与调用位置无关
f3()
1

有两种为函数体传值的方式,一种是直接将值以参数的形式传入,另外一种就是将值包给函数

import requests


def get(url):       #第一种方式
    return requests.get(url).text


print(len(get('https://www.baidu.com')))
print(len(get('https://www.python.org')))
2443
49559

方式一在下载同一页面时需要重复传入url

import requests

def page(url):      #第二种方式
    def get():
        return requests.get(url).text
    return get


python = page('https://www.python.org')
python()

方式二只需要传入一次值,就会得到一个包含指定url的闭包函数,以后调用该闭包函数无需再传url

猜你喜欢

转载自www.cnblogs.com/YGZICO/p/11843844.html