Python函数对象,一切皆对象概念,将函数作为变量值使用

前言:

Python中有着一切皆为对象的说法,那么作为对象,应该具备三种特性:
id(内存地址)、类型(type)、值(对象所具备的数据)



函数对象

作为Python函数,它也是对象的一种,来查看一下它具备的特性

def func():
	print('this is test func')
	
# 如果使用括号的话就表示调用这个函数了,不加括号我们可以将函数作为对象使用
print(type(func))
<class 'function'>	# 函数的类型

print(id(func))
140447349182960	# 函数所处的内存地址

print(func)
<function func at 0x7fe8bc5b91f0>	# 函数对象的属性/值
		# 函数对象名

函数对象的使用

将函数对象作为值赋给变量

def func():
    print('this is func')

f = func # 注意:使用括号的话表示调用这个函数,拿函数对象不要加括号

f()	# f变量已经拿到函数对象,所以直接调用f相当于间接调用 func函数

打印结果:'this is func'

可以作为返回值使用

def func():
	print('this is func')

def add(x):
	return x	# 收到传递的值以后,没有做别的操作就执行return返回了这个值

f = func	# 拿到func函数对象

res = add(func)	# 将func函数对象传递给add函数

# res = func 因为将func传递进去后,执行了return 将它传递的值又返回给它了

print(res)	
<function func at 0x7f9c1e50eca0> # 打印的还是func的属性

可以作为容器类型的元素,如:列表、字典、元组、集合

def func():
	print('this is func project')

def bar():
	print('this is bar project')

lis = [1,2,func,bar]	# 将函数对象作为元素放入列表内
print(lis)
[1,2,<function func at 0x7fb5d5b0eca0>]

lis[-1]()	# 可以通过这种方式执行这个函数对象
'this is bar project'

lis[-2]()
'this is func project'

函数对象练习:

使用传统写法、重复代码较多

def login():
    print('login')

def register():
    print('register')

def transfer():
    print('transfer')

def withdraw():
    print('withdraw')

while True:
    choice = input('输入操作编号:').strip()
    print('''
        0、退出
        1、登录
        2、注册
        3、转账
        4、提现
    ''')
    # 功能越多,分支结构越长
    if choice == '0':
        break
    elif choice == '1':
        login()
        
    elif choice == '2':
        register()
    
    elif choice == '3':
        transfer()
    
    elif choice == '4':
        withdraw()

经过函数对象优化后写法

# 写好功能函数
def login():
    print('login')

def register():
    print('register')

def transfer():
    print('transfer')

def withdraw():
    print('withdraw')

# 将函数对象集合在字典里的列表,并添加了提示信息
fun_dic = {
    '1':[login,'转账'],
    '2':[register,'注册'],
    '3':[transfer,'转账'],
    '4':[withdraw,'体现']
}

while True:
    print('0 退出登录系统')   # 没有0 补充添加

    for k,v in fun_dic.items():	# 省略了之前的较长的提示信息内容
        print(k,v[-1])  # 打印出提示信息
        # 编号 以及列表最后一位的内容

    choice = input('输入操作编号:').strip()

    if choice == '0':
        break

    if choice in fun_dic:   # 判断输入的编号是否对应字典的key
        fun_dic[choice][0]()    # 调用字典里面 对应编号的列表里面的函数对象
        # 通过key找到 列表下面的第一个元素也就是函数对象 括号执行

    else:   # 表示输入的编号不存在
        print('没有这个选项,请重新输入')

技术小白记录学习过程,有错误或不解的地方请指出,如果这篇文章对你有所帮助请点赞收藏+关注 谢谢支持!

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值