Python全栈学习Day10 函数进阶:命名空间 作用域 闭包

昨日内容复习

函数返回值

没有返回值
1.不写return 函数执行完毕自动结束
2.只写return 结束函数
3.return none
返回一个值
结束函数且返回一个值
返回多个值
多个值用逗号隔开,可以用一个变量(元祖)或等量的变量接收。

参数

形参
位置参数(按顺序)
*args 动态参数,可以接收任意多个位置参数
默认参数 可以不传
**kwargs 动态参数,可以接收任意多个按关键字传入的参数
如果默认参数的值是一个可变数据类型,那么每次调用函数的时候,如果不传值就公用这个数据类型的资源

def func(l = []):
    l.append('1')
    print(l)


func()
func()
func()

Python全栈学习Day10 函数进阶:命名空间 作用域 闭包_第1张图片

实参
按照位置传参
按照关键字传参

今日内容 函数进阶

命名空间和作用域

全局命名空间

是程序从上到下被执行的过程中依次加载到内存
放置了我们设置的所有变量名和函数名

局部命名空间

函数内定义的名字
当调用函数时候才会产生此命名空间,当函数执行结束随之消失

内置命名空间

就是python解释器一起动就可以使用,比如print()
内置的名字在启动解释器的时候加载到内存里

在局部可以使用全局命名空间和内置命名空间
在全局可以使用内置,但不可以使用局部

作用域

全局作用域

内置和全局都属于全局作用域

局部作用域

对于不可变数据类型,在局部可以查看全局,但不能直接修改,若要修改,需要在局部上加个global(global尽量少用,不安全

a =1


def func():
    global a
    a += 1
    print(a)


func()

或者

a =1


def func():
    a = 2
    return a


ret = func()
print(ret)

locals()可以查看局部中所有变量,也可以查看全局的
根据locals的位置输出,在全局输出全局,在局部输出局部
globals()可以查看全局和内置中所有变量
只显示全局

a =1


def func():
    a = 1
    b = 2
    print(locals())


func()

Python全栈学习Day10 函数进阶:命名空间 作用域 闭包_第2张图片

函数的嵌套和作用域链

函数嵌套调用

def max(a,b):
    return a if a>b else b


def the_max(x, y, z):
    c = max(x, y)
    return max(c, z)


ret = the_max(1, 2, 3)
**print(ret)

函数嵌套定义
内部函数可以使用外部函数的变量

def outer():
    a = 1

    def inner():
        print('inner')
        print(a)
    inner()


outer()

nolocal用法类似global 只能用于局部变量,找上层离当前函数最近一层的局部变量
函数可以放在列表中这么用:

def func1():
    print(1, 3, 3)


func2 = func1
l = [func1, func2]
for i in l:
    i()

函数名可以作为函数的参数

def func():
    print(1, 3, 3)


def func1(f):
    f()

    
func1(func)

函数名可以作为函数的返回值

def func():
    print(1, 3, 3)


def func1(f):
    f()
    return  f


addrss = func1(func)
addrss()

闭包

定义:是嵌套函数,内部函数调用外部函数的变量
验证:打印函数.closure,当结果前部分有cell就是闭包

def outer():
    a = 1

    def inner():
        print(a)
    print(inner.__closure__)


outer()

Python全栈学习Day10 函数进阶:命名空间 作用域 闭包_第3张图片
闭包最常用的形式
外部函数调用内部函数,不需要每次都重复生成外部函数的变量

def outer():
    a = 1

    def inner():
        print(a)
    return inner


address = outer()
address()

小例子:

from urllib.request import urlopen


def get_url():
    url = urlopen('https://hao.360.cn/?a1004') # 打开网站
    
    def inner():
        ret = urlopen(url).read()
        print(ret)
    return inner


get_func = get_url()

你可能感兴趣的:(python全栈学习100天,Python全栈学习100天,python,python基础,python自学,闭包,函数)