函数是第一类对象:
函数名指向的值可以被当成参数传递
1.函数名可以被传递
1 def func():
2 print('from func')
3 print(func)
4 print(id(func))
5 f = func
6 func()
7 print(f)
8 f() # 其实指向的也是函数func指向函数体代码的内存地址
2.函数名可以被当做参数传递给其他函数
1 def func():
2 print('from func')
3
4 def index(args):
5 print(args)
6 args()
7 print('from index')
8 index(func)
9 打印结果:
10 <function func at 0x0000022C56F02F28>
11 from func
12 from index
3.函数名可以被当做函数的返回值
1 def index():
2 print('index')
3
4
5 def func():
6 print('func')
7 return index
8 res = func()
9 print(res)
10 res()
11 打印结果:
12 func
13 <function index at 0x0000021FB1022F28>
14 index
4.函数名可以被当做容器类型的参数
def func():
print('func')
print(func())
l = [1,2,func,func()]
print(l)
打印结果:
# [1,2,<function func at 0x000001F7D79899D8>,None]
# 循环打印项目功能提示信息 供用户选择 用户选择谁就执行谁
1 1 # def register():
2 2 # username = input('username>>>:').strip()
3 3 # pwd = input('password>>>:').strip()
4 4 # print(username,pwd)
5 5 # print('register ...')
6 6 # def login():
7 7 # print('login ...')
8 8 # def transfer():
9 9 # print('transfer ...')
10 10 # def shopping():
11 11 # print('shopping...')
12 12 # def pay():
13 13 # print('pay ...')
14 14 #
15 15 # msg = """
16 16 # 1 注册
17 17 # 2 登陆
18 18 # 3 转账
19 19 # 4 购物
20 20 # 5 支付
21 21 # """
22 22 # func_dict = {
23 23 # '1':register,
24 24 # '2':login,
25 25 # '3':transfer,
26 26 # '4':shopping,
27 27 # '5':pay,
28 28 # }
29 29 # while True:
30 30 # print(msg)
31 31 # choice = input('请现在你想要执行的功能>>>:').strip()
32 32 # if choice in func_dict:
33 33 # func_dict.get(choice)() # 函数名()
34 34 # else:
35 35 # print('你输入的功能暂时没有')
# 在函数内部调用其他函数
# 可以将复杂的逻辑简单化
1 #函数内部调用其他函数
2 def index():
3 func()
4 print('index')
5
6 def func():
7 print('func')
8 index()
9 #将复杂的逻辑简单化
10 def my_max(x,y):
11 if x > y:
12 return x
13 return y
14
15 def my_max4(a,b,c,d):
16 res = my_max(my_max(a,b),my_max(c,d))
17 return res
18 print(my_max4(1,2,10,4))
函数内定义函数应用场景
"""
写一个函数
该函数用户可以通过传参的不同控制函数执行不同的功能
"""
1 def outer():
2 x = 1
3 print('outer')
4 def inner():
5 print('inner')
6 print(inner)
7 return inner
8
9 res = outer()
10 print(res)
11 res()
12
13
14 #运行结果:
15 outer
16 <function outer.<locals>.inner at 0x00000231FE0C4AE8>
17 <function outer.<locals>.inner at 0x00000231FE0C4AE8>
18 inner
名称空间是什么?
# 就是放名字的地方
# 详细解释:存放的是变量名与变量值的内存地址得绑定关系的地方
# 要想访问一个变量的值 必须先去名称空间中拿到对应的名字 才能够访问变量的值
名称空间的分类
1.内置名称空间:python解释器提前给你定义好的名字(已经存放到内置名称空间中了)
len
max
min
2.全局名称空间:文件级别的代码
x = 1 if 1 ==1 : y = 2 print(y) while True: z = 3 for i in [1,2,3]: print(i) print(i) # x,y,z都会放到全局名称空间 # if for while 无论嵌套多少层 它们内部所创建的名字都是全局名称空间的
3.局部名称空间:函数体内创建的名字都属于局部名称空间
# username def func(): username = 'jason' func()
生命周期:
内置名称空间:只要python解释器已启动立马创建 关闭python解释器的时候内置名称空间自动销毁
全局名称空间:只要你右键运行py文件会自动创建 py文件程序运行结束自动销毁
局部名称空间:函数被调用的时候自动创建 函数指向结束立即销毁(动态创建动态销毁)
1 # len = '我是全局名称空间的len'
2 # def func():
3 # # len = '我是局部名称空间的len'
4 # print(len)
5 #
6 #
7 # print(len) # 我现在站在的是全局的位置
8 # func()
9 #
10 #
11 #
12 #
13 # def index():
14 # x = 'xxx'
15 #
16 # def index2():
17 # print(x)
18 # y = 666
19 #
20 # index()
21 # index2()
变量的查找顺序 (******)
1.需要先确定你当前在哪(大前提)
(1)站在全局: 全局 >>> 内置
(2)站在局部: 局部 >>> 全局 >>> 内置
# len = '我是全局名称空间的len'
# def func():
# len = '我是局部名称空间的len'
# print(len)
# print(len) # 我现在站在的是全局的位置
# func()
注意:函数在定义阶段查找名字的顺序就已经固定了 不会因为函数的调用位置变化而改变(******)
x = 111
def f1():
x = 222
def f2():
x = 333
def f3():
x = 444
def f4():
x = 555
print(x)
f4()
f3()
f2()
f1()
def func():
x = 1
def index():
print(x) # 获取全局找x
return index
res = func()
x = 999
res()
x=111
def outer():
def inner():
print('from inner',x)
return inner
f = outer()
f()
x = 222
f()
x=111 def outer(): def inner(): print('from inner',x) return inner f=outer() def func(): x=333 f() func()
x=111 def outer(): def inner(): #x = 66666666(解决方法) print('from inner',x) x = 66666666 return inner f=outer() f() # 运行结果: # UnboundLocalError: local variable 'x' referenced before assignment(错误提示信息!)
global:
局部修改全局 如果想修改多个 逗号隔开
nonlocal:
局部修局部 如果想修改多个 逗号隔开
# global 在局部修改全局的不可变数据类型
# x = [] # 因为列表是可变类型
x = 1 # 不可变类型
username = 'jason'
def func():
# x.append('嘿嘿嘿')
global x,username # 修改全局变量 而不是创建局部名称空间
x = 999
username = 'egon'
func()
print(x)
print(username)
# nonlocal 局部修改局部
def func(): x = 1 def index(): nonlocal x x = 2 index() print(x)func()