python之路---闭包函数

闭包函数:定义在函数内部的函数,并且该函数包含对外部函数作用域中名字的引用-->称为...

  注意:该函数的作用域关系

在函数定义阶段就规定死了,与调用位置无关!!!
# 例一
def f():
    x = 1
    def f1():
        print(x)
    return f1
x=22
f = f()
f()

--->执行结果:1
#例二
def f():
    x=2
    def f1():
        print(x)
    return f1
f1=f()
def foo():
    x = 1
    f1()
foo()
--->执行结果:2

def f():
    x =1
    def f1():
        x+=1
        print(x)
    return f1
res=f()
res()
#在这里尝试修改x的值报错,原因是,x被当成了局部变量,而局部作用域内不存在x
--->UnboundLocalError: local variable 'x' referenced before assignment

函数传值的两种方式:通过参数直接传值和通过闭包

#方式一
import requests
def get(url):
    response = requests.get(url)
    if response.status_code == 200:
        print(response.text)
get('https://www.baidu.com/')
#此方法每次要获取百度网页内容时,都需要调用get()函数并且把百度的网页地址作为参数传给函数体,不利于使用
#方式二
import requests
# import time
#
# def f(url):
#     def f1():
#         response =requests.get(url)
#         if response.status_code == 200:
#             print(response.text)
#     return f1
#
# baidu = f('https://www.baidu.com/')
# baidu()
# time.sleep(3)
# python = f('https://www.python.org')
# python()
# 此方法通过闭包,使全局变量baidu,python指向局部变量f1,而f1指向存储函数体的内存地址,
# baidu = f('https://www.baidu.com/')获取的是f1这个指向函数体的内存地址,在调用时,才会执行
# f1()的函数体功能,获取不同网址的时候只需要使用变量名+()即可

猜你喜欢

转载自blog.csdn.net/ltfdsy/article/details/81264787