函数是第一对象: 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("请正确输入数字!")