名称空间
就是存放变量名与变量值关系的地方
1. 内置的名称空间
'内置': Python解释器中本身就存在的,可以直接使用的
len
2. 全局的名称空间
在py文件中,顶格编写的变量名等都是全局的名称空间
name='jerry'
def index():
pass
if a:
pass
while b:
pass
for i in range(10):
pass
3. 局部名称空间
"""一般大多数都是在函数内部存在的都是局部的!"""
def index():
a=1
b=2
...
全局变量:
在函数外部存在的变量都是全局变量
局部变量:
在函数内部存在的变量都是局部变量
名字的查找顺序
只有有了全局的名称空间和局部的名称空间就会存在名字的查找顺序
总结:
1. 如果你在局部
局部 >>> 全局 >>> 内置
2. 如果你在全局
全局 >>> 内置
"""局部变量在外部是不能使用的"""
print(locals())
print(globals())
"""局部名称空间的嵌套!"""
def f1():
def f2():
print('f2')
def f3():
print('f3')
def f4():
print(x)
f4()
f3()
f2()
f1()
名称空间的作用域
域:范围
作用域:变量的作用范围
1. 内置名称空间
2. 全局名称空间
3. 局部名称空间
def index():
x = 666
global和nonlocal的使用
name_list = ['kevin', 'jerry']
def func():
name_list.append('tank')
func()
print(name_list)
"""
如果你想在局部修改全局的变量:
1. 如果你修改的是不可变的类型,需要global关键字的声明
2. 如果你修改的是可变类型的,无需使用global关键字声明
"""
nonlocal的使用:
def outer():
name_list = ['a', 'b']
def inner():
name_list.append('c')
inner()
print(name_list)
outer()
"""
如果你想在内部的局部修改外部的局部:
1. 如果你修改的是不可变的类型,需要nonlocal关键字的声明
2. 如果你修改的是可变类型的,无需使用nonlocal关键字声明
"""
函数对象(函数名)
函数对象就是函数的名字
四种玩法
玩法一:函数名可以当成变量赋值
def index():
print('index')
return 123
'''函数名就是函数在内存中得地址'''
a = index
res=a()
print(res)
def index():
print('index')
return None
def func(a):
print(a)
res=a()
print(res)
func(index)
def index():
print('index')
return 'index2'
def func():
print('func')
return index
res = func()
print(res)
res1=res()
print(res1)
def index():
print('index')
return None
ll = [11, 22, 33, index]
res=ll[3]()
print(res)
函数对象的案例
def register():
pass
def login():
pass
def transfer():
pass
def withdraw():
pass
def pay():
pass
def shopping():
pass
def shopping1():
pass
func_dict = {
'1': register,
'2': login,
'3': transfer,
'4': pay,
'5': withdraw,
'6': shopping,
'7': shopping1,
}
while True:
print("""
1. 注册功能
2. 登录功能
3. 转账功能
4. 充值功能
5. 提现功能
6. 购物功能
7. 购物功能
""")
cmd = input('请输入你要执行的功能编号:').strip()
if not cmd.isdigit():continue
if cmd in func_dict:
func_dict.get(cmd)()
else:
print('请好好输入')
函数的嵌套调用
嵌套:函数套函数
def my_max(a, b):
if a >b:
return a
return b
def many_max(a, b, c, d, e):
'''四个数的比较大小其实还是要两两比较!'''
res=my_max(a, b)
res1=my_max(res, c)
res2=my_max(res1, d)
res3=my_max(res2, e)
return res3
res=many_max(11, 12, 3, 24)
print(res)
闭包函数
什么是闭包函数?
闭:就是函数内部定义函数,至少要有2层函数
包:内部的函数要使用外部函数名称空间中的名字
'''只有同时满足以上两个条件,才能称之为是闭包函数'''
def outer():
x = 666
def inner():
print('hello', x)
return inner
outer()
闭包函数其实是第二种传参方式!
def outer(a, b):
def my_max():
if a > b:
return a
return b
return my_max
res = outer(1, 10)
print(res())
print(res())
print(res())
print(res())
print(res())
print(res())
print(res())
print(res())
res1=outer(10, 20)
print(res1())
print(res1())
print(res1())
print(res1())
print(res1())
print(res1())
print(res1())
print(res1())
print(res1())
闭包函数的用途
import requests
def outer(url):
def get_content():
res=requests.get(url)
res.encoding='utf-8'
print(res.content)
with open('baidu.html', 'wb') as f:
f.write(res.content)
return get_content
res=outer('https://www.jd.com/')
res()
res()
res()
res()
res()
res1=outer('https://www.taobao.com/')
res1()
res1()
res1()
res1()
res1()
res1()
res1()