函数进阶

函数进阶

1、函数对象

  函数是第一类对象

(1)函数名是可以被引用的

def index():
    print("from index")

index()
a = index
print(a)    # 输出结果 <function index at 0x00000208897CB730> 为函数对象的内存地址
a()    # 若想要用a引用在后面加()即可执行

 

(2)函数名可以当做参数来传递

def foo(x, y, z):
    print(x, y)
    z()

def bar():
    print("from bar")

foo(1, 2, bar)

 

(3)函数名可以当做返回值来使用

def index():
    print("from index")

def func(c):
    return c    # 返回时候如果没有特殊需求,一定不要加括号,加括号就执行

a = func(index)
a()

 

(4)函数名可以被当做容器类型的元素

def func():
    print("from func")

l1 = [1, "2", func, func()]
f = l1[2]
print(f)

 

  例子:写一个程序,根据用户输入来执行相应的程序

func_dic = {
    '1': register,
    '2': login,
    '3': shopping,
    '4': pay
}

def register():
    print('register')

def login():
    print('login')

def shopping():
    print('shopping')

def pay():
    print('pay')

def main():
    while True:
        print("""
            1、注册
            2、登录
            3、购物
            4、付款
            5、退出
        """)
        choice = input("请输入对应的编号:").strip()
        if choice == '5':
            break
        if choice not in func_dic:
            continue
        else:
            func_dic[choice]()

main()

 

 

2、函数嵌套

(1)函数的嵌套调用:在函数内部调用其他函数

def index():
    print("from index")

def func():
    index()
    print("from func")

func()

 

(2)函数的嵌套定义

def index():
    def home():
        print("from home")
    home()

index()

 

 

3、名称空间

(1)什么是名称空间

  名称空间:存放名字的空间

  如果想要访问一个变量值,就必须先访问对应的名称空间,拿到名字和对应的内存地址的保定关系

 

(2)名称空间的分类

  ①内置名称空间:

    在python解释器中,python提前给的定义好的名字,就是存在内置名称空间

  ②全局名称空间:

    存放于文件级别的变量名字就是全局名称空间:

      if语句中的赋值执行之后属于全局名称变量

      while循环中的赋值执行之后属于全局名称变量

      for循环中的赋值执行之后属于全局名称变量

      内部定义的名字执行之后属于全局名称变量

  ③局部名称空间:

    函数内部定义的所有名字都是存放于当前函数的内置名称空间

 

(3)生命周期:

  ①内置名称空间

    在python解释器启动的时候生效,关闭解释器的时候失效

  ②局部名称空间

    启动当前py文件的时候生效,当前页面代码执行结束失效

  ③局部名称空间

    当调用当前函数时生效,函数体代码执行结束后失效

 

(4)名称空间的查找顺序

  局部:局部 > 全局 > 内置

  全局:全局 > 内置               # 内置找不到就报错

x = 1
def index():
    print(x)

def wrapper():
    x = 2
    index()

wrapper()

  默认值参数:

x = 1
def index(arg = x):    # 此处的arg=x为默认值参数
    print(x)
    print(arg)

x = 2
index()

 

 

4、作用域

  作用域:起作用的范围

(1)作用域的分类

  ①全局作用域

    全局可以调用的名字就存在于全局作用域

    内置名称空间、全局名称空间

  ②局部作用域

    局部可以调用的名字就存放于局部作用域

    局部名称空间

 

(2)global:声明全局变量

def index():
    global x    # 此处将x从局部变量转化为全局变量
    x = 2
    print(x)

index()
print(x)    # 在全局下也可以打印x变量

 

(3)nonlocal:在局部修改上层函数的变量

def index():
    x = 1
    def func():
        nonlocal x    # 在此处使用nonlocal可以将上层函数变量修改,上层变量改变,不可用于全局
        x = 2
    func()
    print(x)

index()
posted @ 2020-10-09 17:27  chchcharlie、  阅读(126)  评论(0编辑  收藏  举报