由lambda引发的思考-函数返回值、函数赋值、变量

作者: laokou 分类: 水处理 发布时间: 2017-11-02 23:02
print("试验三种方法:lambda,普通函数,返回一个函数的共同点与区别")
print("------lambda---------")
tmp1=lambda x:x*2

print(tmp1,"tmp1是一个函数,直接打印的话会显示其类型及位置")
print(type(tmp1),"tmp1的类型为一个函数,打印出来的是类型")
print(tmp1(2),"tmp1(2)返回了一个数,为4,所以打印的内容是4")
print(type(tmp1(2)),"返回的数的类型是整数")
try:
    print(tmp1())
except:
    print("如果试图打印tmp1()不传参,会报错")
try:
    print(type(tmp1()))
except:
    print("当然,上面报错就没有返回值,就没有类型了")

print("------普通函数---------")
def test(x):
    return x*2
print(test,"test是一个函数,直接打印为类型和位置")
print(type(test),"test的类型是一个函数")
print(test(2),"返回值为4,打印出的数据应该为2")
print(type(test(2)),"返回值的类型为int")
try:
    print(test())
except:
    print("同lambda一样,没有传参即不能作为一个函数,又不能作为一个返回值")
try:
    print(type(test()))
except:
    print("所以也没有类型一说了")
print("这一部分可以看出,lambda和普通函数定义是一样的")
print("但是有一个疑问,tmp1是通过赋值给与的,一个函数可以赋值给一个变量么?是怎么实现的?")
try:
    tmp2=test()
except:
    print("可以看出把test()赋值给tmp2是不可以的,因为没有参数")
tmp2=test
print("可以看出,把一个函数本身付给一个变量是可以的,这个变量就变成了函数")
print(tmp2,"应该是一个类型和位置值")
print(type(tmp2),"应该是一个函数")
print(tmp2(2),"返回了一个数值,应该是一个整数")
print(type(tmp2(2)),"整数的类型当然是int")
try:
    print(type(tmp2()))
except:
    print("不传参肯定会报错")
print("--------------")
print("--------------")
print("可以看出,func和func()是不一样的")
print("func是一个函数,可以赋给一个变量,那个变量也成为了一个函数")
print("func()是一个返回值,如果没有参数就报错,不能赋值")


print("------另一种方式--------")
print("从上面看出,把test()赋值给tmp2是不可以的,需要把test直接赋值给tmp2,因为带不带()不是一种类型")
print("还没有结束!实际上可以把一个func()赋值给一个变量")
def test2():
    def test3(x):
        return  x*2
    return test3
tmp3=test2()
print("这里没有报错!!!为什么呢?")
print("区别在于:1、test2()本身就不需要参数,而test(x)是需要参数的!")
print("2、仅仅这样不够,如果test2()没有返回值,则tmp3无类型")
print("结论来了!!!!\n------------------------------")
print("定义了一个函数func(x),把func赋值给一个变量可以,这个变量变成了一个函数")
print("定义了一个函数func(x),把func()赋值给一个变量是不行的,因为本身func()是包含参数x的")
print("但如果把func(x),提示x未定义,把x变成一个数值,如果func没有返回值,则变量还是None")
print("即使有返回值,这个返回值应该是根据x变得,不能灵活调整,没有意义")
print("只有通过上面的方式,返回一个函数本身,这样不需要填写变量,又实现了返回")
print("所以,func直接赋值可以,func()不带参可以,但是没有类型,func()带参可以,但是固定")
print("需要嵌套!func1()不带参返回一个func2()函数")
print("平常的tmp=func(5)是把5为参数的返回值给与tmp,返回值给与变量!")
print("a=func是函数的新增指向,a=func()是把func()的返回值给a,是真正的赋予")
print("其实,返回一个函数给了变量,变量就新增指向到了一个函数,所以其可以使用")
print(tmp3(5))
print("到这里,和lambda基本没有大关系了")