Loading

函数以及函数的性质 名称空间以及分类 生命周期 变量的查找顺序

函数是第一类对象:

  函数名指向的值可以被当成参数传递

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指向函数体代码的内存地址
View Code

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
View Code

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
View Code

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('你输入的功能暂时没有')
View Code
# 在函数内部调用其他函数
# 可以将复杂的逻辑简单化
 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))
View Code

函数内定义函数应用场景

"""
写一个函数
该函数用户可以通过传参的不同控制函数执行不同的功能
"""
 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
View Code

名称空间是什么?

# 就是放名字的地方
# 详细解释:存放的是变量名与变量值的内存地址得绑定关系的地方
# 要想访问一个变量的值 必须先去名称空间中拿到对应的名字 才能够访问变量的值

名称空间的分类

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

变量的查找顺序 (******)

  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()
posted @ 2019-07-10 16:18  1640808365  阅读(307)  评论(0编辑  收藏  举报