函数嵌套,名称空间,作用域,函数对象,闭包函数

Posted yang-sen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数嵌套,名称空间,作用域,函数对象,闭包函数相关的知识,希望对你有一定的参考价值。

函数嵌套

嵌套调用是在函数内又调用其他函数

def max(x,y):
    return x if x > y else y

def max4(a,b,c,d):
    res1=max(a,b)
    res2=max(res1,c)
    res3=max(res2,d)
    return res3
print(max4(1,2,3,4))

嵌套定义是在函数内又定义其他函数

# def f1():
#     print(‘f1‘)
#     def f2():
#         print(‘f2‘)
#         def f3():
#             print(‘f3‘)
#         f3()
#     f2()
# f1()

名称空间

名称空间分为三类:

1、内置名称空间

python解释器自带的名字,解释器启动的时候生效,关闭的的时候失效。

2、全局名称空间

文件级别的名字,在执行文件时生效,在文件结束或者文件执行期间被删除则失效

# x=1
# def func():
#     name=‘egon‘
#
# del func
#
# print(‘===‘)
# print(‘===‘)
# print(‘===‘)
# print(‘===‘)
# print(‘===‘)

3、局部名称空间

存放函数内定义的名字(函数的参数以及函数内的名字都存放于局部名称空间)

在函数调用时临时生效,函数结束时则失效

# def func(x):
#     y=2
#
# func(1)

加载顺序:内置名称空间>全局名称空间>局部名称空间

查找顺序:局部名称空间>全局名称空间>内置名称空间

# len=‘global‘         # 第三查找目标
# def f1():
#     # len=1          # 第二查找目标
#     def f2():
#         # len=2      # 第一查找目标
#         print(len)
#     f2()
#
# f1()

 

作用域

全局作用域:包含内置名称空间与全局名称空间的名字

特点:

1、在任何位置都可以访问的到

2、该范围会伴随这个生命周期

 

局部作用域:包含局部名称空间的名字

特点:

1、只能在函数内使用

2、调用函数时生效,调用结束时失效

 

函数对象

因为函数是第一类的对象,函数我们可以像变量一样引用,当做数据传递

1、可以被引用

# x=1
# y=x

# def bar():
#     print(‘from bar‘)
#
# f=bar
# f()

2、可以当做参数传入

# def bar():
# print(‘from bar‘)
#
# def wrapper(func): #func=bar
# func() #bar()
#
# wrapper(bar)

3、可以当做函数当中的返回值

# def bar():
# print(‘from bar‘)
# def foo(func): #func=<function bar at 0x00000225AF631E18>
# return func #return <function bar at 0x00000225AF631E18>
# f=foo(bar) #f=<function bar at 0x00000225AF631E18>
# # print(f)
# f()

4、可以当做容器类型的元素

# def get():
#     print(‘from get‘)
# def put():
#     print(‘from put‘)
# l=[get,put]
# # print(l)
# l[0]()
技术分享图片
def auth():
    print(登陆。。。。。)

def reigster():
    print(注册。。。。。)

def search():
    print(查看。。。。)

def transfer():
    print(转账。。。。)

def pay():
    print(支付。。。。)

dic={
    1:auth,
    2:reigster,
    3:search,
    4:transfer,
    5:pay
}
def interactive():
    while True:
        print("""
        1 认证
        2 注册
        3 查看
        4 转账
        5 支付
        """)
        choice=input(>>: ).strip()
        if choice in dic:
            dic[choice]()
        else:
            print(非法操作)


interactive()
小例子

闭包函数

定义在函数内部的函数,并且该函数包含对外部函数用域中名字的作用,该函数就成为闭包函数

闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域

 

# def outter():
#     name=‘egon‘
#     def inner():
#         print(‘my name is %s‘ %name)
#     return inner
# f=outter()

作用域关系:在函数定义阶段就规定死勒,与调用位置无关

# def outter():
#     x=2
#     def inner():
#           x=1                          #  f在定义时固定死了
#         print(‘from inner‘,x)
#     return inner
# f=outter
# def foo():
#       x=1111                         #  在此处调用也不会改变x的值
#       f()
# foo()

 

技术分享图片
 1 db_path=db.txt
 2 def get_uname():
 3     while True:
 4         uname=input(用户名>>:).strip()
 5         if not uname.isalpha():
 6             print(\033[45m用户名必须为英文字母...\033[0m)
 7             continue
 8         with open(r%s %db_path,r,encoding=utf-8) as f:
 9             for line in f:
10                 uinfo=line.strip(\n).split(,)
11                 if uname == uinfo[0]:
12                     print(\033[45m用户名已存在...\033[0m)
13                     break
14             else:
15                 return uname
16 def get_pwd():
17     while True:
18         pwd1=input(请输入密码>>: ).strip()
19         pwd2=input(再次输入密码>>: ).strip()
20         if pwd1 == pwd2:
21             return pwd1
22         else:
23             print(\033[45m两次输入的密码不一致,请重新输入...\033[0m)
24 def get_bal():
25     while True:
26         bal=input(请输入余额: ).strip()
27         if bal.isdigit():
28             # bal=int(bal)
29             return bal
30         else:
31             print(\033[45m钱必须是数字,傻叉...\033[0m)
32 def file_hanle(uname,pwd,bal):
33     with open(r%s %db_path,a,encoding=utf-8) as f:
34         f.write(%s,%s,%s\n %(uname,pwd,bal))
35 def register():
36     uname=get_uname() #拿到合法的用户名
37     pwd=get_pwd() #拿到合法的密码
38     bal=get_bal() #拿到合法的余额
39     file_hanle(uname,pwd,bal) #写入文件
40 register()
注册功能

 













以上是关于函数嵌套,名称空间,作用域,函数对象,闭包函数的主要内容,如果未能解决你的问题,请参考以下文章

013.Python之函数嵌套名称空间与作用域闭包函数

函数嵌套,名称空间,作用域,函数对象,闭包函数

函数对象函数的嵌套名称空间函数的作用域闭包

函数对象,函数的嵌套,名称空间与作用域,闭包,装饰器,迭代器,内置函数

Day19_名称空间和作用域_函数的嵌套_函数第一类对象的使用_闭包函数

20181128(闭包函数,函数嵌套,名称空间,作用域,装饰器待补充)