#函数的进阶
#命名空间和作用域
#内置命名空间:
#python解释器一启动就可以使用的名字
#内置的名字在启动解释器的时候被加载进内存里
#全局命名空间
#在程序从上到下被执行的过程中依次加载进内存的
#放置我们设置的所有变量名和函数名
#局部命名空间
#就是函数内部定义的名字
#当调用函数的时候 才会产生这个名称的空间随着函数执行结束,这个命名空间就消失了
#在局部:可以使用全局、内置命名空间的名字
#在全局:可以使用内置命名空间中的名字,但是不能用局部中使用
#在内置:不能使用局部和全局的名字的
def max():
print('in max func')
max()
#作用域两种
# 全局作用域——作用在全局——内置和全局
# 局部作用域——作用在局部——函数——使用locals
a=1
def func():
global a #全局申明
a+=1
func()
print(a)
#globals 永远打印全局的名字
#locals 根据locals所在的位置
def max(a,b):
return a if a>b else b
def the_max(a,b,c):
x =max(a,b)
return max(x,c)
print(the_max(1,2,3))
#函数的嵌套定义
def outer():
def inner():
a=1
print('inner')
def inner2():
nonlocal a #用于局部变量的声明
print('inner2')
inner2()
inner()
outer()
#函数名相当于函数的内存地址 可以当作变量用
def func():
print(123)
def fun(f):
f()
fun(func)
#闭包:嵌套的函数,内部函数调用外部的变量
def oh():
a=1
def oi():
print(a)
return oi
ch=oh() #将oi的地址给与变量ch
ch() #将ch使用oi的地址形成一个函数,就相当于使用oi()
#闭包:嵌套的函数,内部函数调用外部的变量
def oh():
a=1
def oi():
print(a)
return oi
ch=oh() #将oi的地址给与变量ch
ch() #将ch使用oi的地址形成一个函数,就相当于使用oi()
import urllib #模块
from urllib.request import urlopen
ret =urlopen('https://www.taobao.com').read()
print(ret)
#闭包可以节省空间不用循环打开变量
def ger_htm():
url='https://www.taobao.com'
def ger_us():
ret =urlopen(url).read()
print(ret)
return ger_us
get_func=ger_htm()
get_func()