函数是第一对象: python 中万物皆对象,函数同样也是 python 中的对象 、 函数作为对象可以赋值给一个变量、可以作为元素被添加到容器对象中、可以作为参数传给其他函数、可以作为函数的返回值(这些特性就是第一类对象所特有的) 

函数对象的特性(*****灵活运用,后面讲装饰器会用到)

  函数名可以像变量一样被传递

# 变量可以被传递
name = 'jason'
x = name
print(x)
# jason
print(id(name), id(x))
# 3085464224688 3085464224688

# 尝试函数像变量一样被传递
def func():
    print('from func')
print(func)
# <function func at 0x0000016E5E062E18>

f = func  # 其实指向的也是函数func 指向的函数体代码的内存地址
print(f)
# <function func at 0x000001B4D0D92E18>
f()
# from func
print(id(func), id(f))
# 3085463137816 3085463137816

  函数名可以被当做参数传递给其他函数

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

def index(args):
    print(args)
    args()  # 函数只要一定义(先定义),就可以在任意地方调用
    print("from index")

index(func)
# <function func at 0x000001B7429A2E18>
# from func
# from index

  函数名可以被当做函数的返回值

def index():
    print('index')

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

res = func()  # 将返回的函数名index 赋值给变量res
# func
print(res)
# <function index at 0x000001EF64362E18>
res()  # 函数名加括号(...内存地址)就可以直接调用该函数
# index

  函数名可以被当做容器类型的参数

def func():
    print('func')

l = [1, 2, func, func()]  # 定义的时候默认执行了func(),所以下面先打印了 func
# func  # func函数没有返回值,默认返回None,所以列表 l 的第四个元素就是None
print(l)
# [1, 2, <function func at 0x0000013931C92E18>, None]

函数对象小练习

题目: # 循环打印项目功能提示信息 供用户选择 用户选择谁就执行谁 

def register():
    print("注册了")
    pass


def login():
    print("登录了")
    pass


def shopping():
    print("购物了")
    pass


def output_func_list():
    print("----- 请选择功能!")
    for key in func_list:
        print(f"----  {key}.{func_list[key][1]}")


func_list = {
    0: [register, '注册'],
    1: [login, '登录'],
    2: [shopping, '购物'],
}


while True:
    output_func_list()
    chose_func = input("请输入功能编号(q 退出系统):").strip()
    if chose_func.isdigit():
        # 执行相应功能
        chose_func = int(chose_func)
        # 判断输入的编号在不在功能列表里
        if chose_func in func_list:
            func_list[chose_func][0]()  # 取到功能函数名,加括号调用
        else:
            print("您输入的功能编号不存在,请重新输入!")
    elif chose_func.lower() in ['q', 'quit']:
        print("感谢您的使用,祝您生活愉快~")
        break
    else:
        print("请正确输入数字!")
实现代码

相关文章: