您的位置:首页 > 编程语言 > Python开发

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

2019-01-05 13:22 597 查看

昨日内容复习

函数返回值

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

参数

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

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

func()
func()
func()

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

今日内容 函数进阶

命名空间和作用域

全局命名空间

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

局部命名空间

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

内置命名空间

就是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()

函数的嵌套和作用域链

函数嵌套调用

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()


闭包最常用的形式
外部函数调用内部函数,不需要每次都重复生成外部函数的变量

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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: