加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

函数对象,名称空间和作用域

发布时间:2020-12-20 10:37:14 所属栏目:Python 来源:网络整理
导读:目录 函数对象 引用 作为函数参数 作为函数返回值 作为容器类元素 小练习 函数的嵌套 名称空间和作用域 名称空间 内置名称空间 全局名称空间 局部名称空间 名称空间的执行(生成)的顺序 搜索顺序 作用域 全局作用域 局部作用域 global关键字 nonlocal关键字

目录

  • 函数对象
    • 引用
    • 作为函数参数
    • 作为函数返回值
    • 作为容器类元素
    • 小练习
  • 函数的嵌套
  • 名称空间和作用域
    • 名称空间
      • 内置名称空间
      • 全局名称空间
      • 局部名称空间
      • 名称空间的执行(生成)的顺序
      • 搜索顺序
    • 作用域
      • 全局作用域
      • 局部作用域
    • global关键字
    • nonlocal关键字
    • 注意点

函数对象

python中一切皆对象

引用

def f1():
    print('from f1')
    
func = f1
print('f1:',f1)
print('func',func)

# 打印结果:
f1: <function f1 at 0x000002110991D268>
func <function f1 at 0x000002110991D268>

作为函数参数

def f1():
    print('from f1')


def f2(f2_f1):
    print('f2_f1:',f2_f1)

f2(f1)
print('f1:',f1)

# 打印结果:
f2_f1: <function f1 at 0x000001E47029D268>
f1: <function f1 at 0x000001E47029D268>

作为函数返回值

def f1():
    print('from f1')
    
    
def f2(f2_f1):
    return f2_f1

res = f2(f1)
print('res:',res)
print('f1:',f1)

# 打印结果:
res: <function f1 at 0x0000019F13E7D268>
f1: <function f1 at 0x0000019F13E7D268>

作为容器类元素

def f1():
    print('from f1')


lt = [f1,12,3,4,5]
lt[0]()

小练习

def pay():
    print('支付1e成功')

def withdraw():
    print('提现2e成功')

dic = {
    '1': pay,'2': withdraw
}

while True:
    msg = '''
    '1': 支付,'2': 提现,'3': 退出,'''
    print(msg)
    choice = input('>>: ').strip()
    if choice == '3':
        break

    elif choice in dic:
        dic[choice]()

函数的嵌套

函数里面嵌套函数

def f1():
    print('from f1')

    def f2():
        print('from f2')
    f2()

f1()

名称空间和作用域

名称空间

内置名称空间

存储了内置方法的空间

数据类型内置方法;python解释器自带的方法(print / len / list / str / dict)

全局名称空间

除了内置和局部都叫全局

局部名称空间

函数内部定义的都叫局部

名称空间的执行(生成)的顺序

  1. 内置名称空间:python解释器启动的时候就有了
  2. 全局名称空间:执行文件代码的时候才会有全局
  3. 局部名称空间:函数调用的时候才会有局部

搜索顺序

从当前位置查找,找不到按照这种顺序,不会逆向寻找:局部 > 全局 > 内置 > 报错

作用域

全局作用域

内置名称空间 +全局名称空间 --> 全局作用域

局部作用域

局部名称空间 --> 局部作用域

  • 全局作用域的 x 和局部作用域 x 没有任何关系
  • 局部作用域1 的 x 和局部作用域2 的 x没有任何关系,即使局部作用域1和局部作用域2在同一个局部作用域下

global关键字

x = 10
def func():
    global x
    x = 20

func()
print(x)   # 打印20

nonlocal关键字

x = 10
def f1():
    x = 2

    def f2():
        nonlocal x   # nonlocal让x成为额顶层函数的局部,不是让它成为全局
        x = 30

    f2()
    print(x)

f1()
# 打印30

注意点

所有可变数据类型均可打破上述一切规则

lt = [10]

def f1():
    lt.append(20)

f1()
print(lt)

# 打印结果:
[10,20]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读