函数基础

函数是第一类对象,即函数可以被当做数据处理。

def func():
    print('fron func')
print(func)

<function func at 0x0000023B491BF5E8>

函数对象的四大功能

1、引用

name = 'tank'
dsb = name

def index():
    print('from index')


a = index
a()

2、函数名可以当做参数传递

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


def bar():
    print('from bar')


foo(1, 2, bar)

3、函数名可以当做返回值使用

传参的时候没有特殊需求一定不要加括号,加括号当场执行

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


def func(a):
    return a


a = func(index)
print(a)
a()

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

def func():
    print('from func')


l1 = [1, '2', func, func()]

f = l1[2]
print(f)

练习

def register():
    print('register')


def login():
    print('login')


def shopping():
    print('shopping')


def pay():
    print('pay')


func_dic = {
    '1': register,
    '2': login,
    '3': shopping,
    '4': 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()

函数的嵌套定义

函数内部定义的函数,无法在函数外部使用内部定义的函数。

def index():
    print('from index')


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

func()
def func1(x, y):
    if x > y:
        return x
    else:
        return y


print(func1(1,2))
def func2(x, y, z, a):
    result = func1(x, y)
    result = func1(result, z)
    result = func1(result, a)
    return result


print(func2(1, 200000, 3, 1000))

函数的嵌套定义

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

index()

什么是名称空间?

   存放名字的空间

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

  名称空间的分类:

     1、内置名称空间:

         python提前给你的定义完的名字,就是存在内置名称空间

     2、全局名称空间 :

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

        if while for 内部定义的名字执行之后都存放于全局名称空间

     3、局部名称空间

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

  生命周期:

     1、内置名称空间

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

     2、全局名称空间

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

     3、局部名称空间

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

  名称空间的查找顺序:

     局部:局部 > 全局 > 内置

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

    函数内部使用的名字,在定义阶段已经规定死了,与你的调用位置无关

作用域的分类:

   1、全局作用域

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

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

  2、局部作用域

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

    局部名称空间

   global:声明全局变量(**)

   nonlocal:在局部名称空间声明局部变量,在局部修改上层函数的变量(

   只有可变类型可以在局部修改外部变量的值 (*

在局部修改外部函数的变量
x = 1111


def index():
    x = 1

    def func2():
        x = 2

        def func():
            nonlocal x
            x = 3

        func()
        print(x)

    func2()
    print(x)


index()
print(x)

l1 = []
def index(a):
    l1.append(a)
    # print(l1)
index(1)

print(l1)
# 局部变量的修改无法影响上层,上上层

def index():
    x = 1

    def index2():
        nonlocal x
        x = 2

    index2()
    print(x)


index()

 

原文地址:https://www.cnblogs.com/lvguchujiu/p/11836071.html