Python-函数进阶
今日的内容:
命名空间
命名空间一共分为三种:
全局命名空间
局部命名空间
内置命名空间:中存放了python解释器为我们提供的名字:input,print,str,list、、、
它们都是我们熟悉的,拿过来就可以用的方法
启动python:
内置的命名空间->加载全局命名空间中的名字 —— (从上到下顺序加载)->加载局部命名空间中的名字 ——— 调用该函数的时候,从上到下去加载(程序运行中:调用时才加载)
取值:
在局部调用:布局命名空间 -> 全局命名空间 -> 内置命名空间
a = 0
b = 1
print(a)
def my_max():
c = 5
def asy():
d= 2
print(a)
my_max()
命名空间 名称空间
内置命名空间
全局命名空间
局部命名空间
对于变量的使用:在局部可以使用全局命名空间中的名字,但是全局不可以使用局部命名空间的名字
对于局部来说:自己有的时候就用自己的,自己没有再用全局的
三种:内置、全局、局部
全局:除了函数内部的名字之外,我们自己写的代码里所有的名字
局部:函数内部的
作用域:
内置的命名空间 在任意地方可以用
全局的命名空间 在我们写的代码里任意地方
局部的命名空间 只能在自己的函数内使用
globals(): 修改全局命名空间的变量值
a = 0
def demo1():
global a
a= 2
print(a)
demo1()
print(a)
范围从大到小:内置 全局 局部
作用域:站在范围小的布局,如果局部有用局部,局部没有往上一层找,一层一层往上找,找到一个可用的名字就用这个
a = 0
def demo1():
a = 1
def demo2():
def demo3():
global a
a = "小神仙"
print("demo3:", a)
demo3()
print("demo2:", a)
demo2()
print(a)
demo1()
print(a)
# 函数的嵌套调用
def max2(x,y):
m = x if x>y else y
return m
def max4(a,b,c,d):
res1 = max2(a,b)
res2 = max2(res1,c)
res3 = max2(res2,d)
return res3
print(max4(23,-6,32,12))
# 函数的嵌套定义(一)
def f1():
print("in f1")
def f2():
print("in f2")
f2()
f1()
# 函数的嵌套定义(二)
def f1():
def f2():
def f3():
print("in f3")
print("in f2")
f3()
print("in f1")
f2()
f1()
# 作用域链(一)
def f1():
a = 1
def f2():
print(a)
f2()
f1()
# 作用域链(二)
def f1():
a = 1
def f2():
def f3():
print(a)
f3()
f2()
f1()
# 作用域链(三)
def f1():
a = 1
def f2():
a = 2
f2()
print("a in f1 :", a)
f1()
nonlocal关键字
1.外部必须有这个变量
2.在内部函数声明nonlocal变量之前不能再出现同名变量
3.内部修改这个变量如果想在外部有这个变量的第一层函数中生效
4.只修改局部命名空间里的 从内往外部找到第一个对应的变量名
# nonlocal关键字
def f1():
a = 1
def f2():
nonlocal a
a = 2
f2()
print("a in f1 :", a)
f1()
函数名的本质:
函数的名字 —— 可以当作变量使用 —— 函数名是第一类对象的概念
第一类对象(first-class-object)指:
1.可在运行期创建
2.可用作函数参数或返回值
3.可存入变量的实体
# 1.可以被引用
def func():
print("in func")
f= func
print(f)
# 2.以赋值,可以作为其他列表等容器类型的元素
def f1():
print('f1')
def f2():
print('f2')
def f3():
print('f3')
l = [f1, f2, f3]
d = {'f1':f1,'f2':f2,'f3':f3}
# 调用
l[0]()
d['f2']()
闭包函数:
内部函数引用了外部函数的变量,内部的函数就叫做闭包
装饰器是闭包的一种应用
闭包的作用:
def func():
name = "eva"
def inner():
print(name)
return inner
f = func()
f()
# 判断闭包函数的方法_closure_
#输出的_closure_有clee元素:是闭包函数
def func():
name = "eva"
def inner():
print(name)
print(inner.__closure__)
return inner
f = func()
f()
#输出的_closure_为None:不是闭包函数
name = "egon"
def fun2():
def inner():
print(name)
print(inner.__closure__)
return inner
f2 = fun2()
f2()
#闭包嵌套
def wrapper():
money = 1000
def func():
name = "eva"
def inner():
print(name,money)
return inner
return func
f = wrapper()
i = f()
i()
#闭包函数获取网络应用
from urllib.request import urlopen
def index():
url = "http://www.cnblogs.com/Eva-J/articles/7156261.html#_label2"
def get():
return urlopen(url).read()
return get
art = index()
content = art
print(content

浙公网安备 33010602011771号