原来它是Python中的第一对象,没有想象中的难。

640?wx_fmt=jpeg

原来它是Python中的第一对象,没有想象中的难。_第1张图片


Python语言是面向对象语言,一切皆对象。函数自然也是对象,并且是第一类对象。第一类对象是Python函数的一大特性。在百度百科中,第一类对象(英语:First-class object)在计算机科学中指可以在执行期创造并作为参数传递给其他函数或存入一个变数的实体。将一个实体变为第一类对象的过程叫做“物件化”(Reification)。这意味着,函数和其他对象一样,比如整型、字符串、列表等,可以赋值给变量、可以在函数中定义另外一个函数、可以作为参数传递给其他函数、可以作为返回值等等。这些特性就是第一类对象所有的。

函数是对象,拥有对象模型的三个通用属性:唯一标识对象id、标示对象的类型type以及对象的值value。本节内容为进阶内容,如有不理解的地方,请关注微信公众号(data_circle)与笔者交流。


01 函数是对象


 
   

def welcome():
   """
       定义函数
   :return:
   "
""
   print('Hello, Python!')


# 调用函数
welcome()

print(id(welcome))
print(type(welcome))
print(welcome)


结果为
Hello, Python!

4365725480

'function'>

<function welcome at 0x10437af28>


原来它是Python中的第一对象,没有想象中的难。_第2张图片


02 函数赋值给变量

函数作为第一类对象,可以赋值给其他变量。赋值给变量时,函数并不会被调用,仅仅在函数对象上绑定一个新的名字而已。注意函数调用与该语法点的区别,函数调用是必须有括号。

 
   

语法

变量名 = 函数名


函数可以赋值给多个变量。这些变量最终指向的都是同一个函数对象。因此,我们也可以通过赋值后的变量调用原来的函数。在Python中,每个对象都有指向该对象的引用总数,即引用计数(reference count)。每一次赋值都会增加一次引用计数。当把函数赋值给多个变量的时候,该函数的对象引用计数会不断的增加。当然Python中的某个对象的引用计数也可以减少,当降为0的时候,说明没有任何引用指向该对象。该对象将成为要回收的垃圾了。我们可以手动清理垃圾也可以让Python自动回收。此部分内容为进阶内容,感兴趣的小伙伴可以关注微信公众号(data_cirlce)与笔者沟通。


首先,我们把函数调用赋值给变量welcome_4。由于welcome()函数没有return语句,因此返回的是None。通过查看welcome_4的类型,我们发现welcome_4不是函数。接着,我们把welcome()函数赋值给3个变量。通过id(),我们看到它们都执行同一个地址,但是welcome_4不是同一个,因为返回的不是函数。我们使用type()查看welcome_2的类型是函数,其他变量一样。通过 is 运算符查看这些变量是否为同一个对象。 最后删除该函数,我们通过变量也可以调用,输出同样的结果。


 
   

# 函数调用
welcome_4 = welcome()

print('welcome_4为welcome的返回值', welcome_4)
print('welcome_4的类型是', type(welcome_4))



# 函数赋值给多个变量,后面没有括号
welcome_1 = welcome
welcome_2 = welcome
welcome_3 = welcome
print(id(welcome_1))
print(id(welcome_2))
print(id(welcome_3))
print(id(welcome_4))


print('welcome_2的类型是:', type(welcome_2))


print('通过 is 判断三个变量是否引用同一个对象:', welcome_1 is welcome_2 is welcome_3)
print('welcome1_4 是否和 welcome_1为同一个对象', welcome_4 is welcome_1)



# 删除原来的函数
del welcome

# 此行语句出错,(name 'welcome' is not defined)
print('不能调用', welcome())



# 请屏蔽上面的语句,再执行下面的3条语句

# 通过变量调用原来的函数
welcome_1()
welcome_2()
welcome_3()


结果为:

Hello, Python!

welcome_4为welcome的返回值 None

welcome_4的类型是 <class 'NoneType'>

4358156072

4358156072

4358156072

4356659480

welcome_2的类型是: <class 'function'>

通过 is 判断三个变量是否引用同一个对象: True

welcome1_4 是否和 welcome_1为同一个对象 False

Hello, Python!

Hello, Python!

Hello, Python!


原来它是Python中的第一对象,没有想象中的难。_第3张图片



03 嵌套函数 

嵌套函数是在函数中定义另外一个函数。在函数里面的函数被称为内层函数、闭包函数、或者嵌套的函数,外面的函数被称为外层函数。

def outer_fun(number):
    """
        定义外层函数
    :param number:
    :return:
    """

    # 错误判断
    if number < 0:
        raise TypeError('请输入正整数!')

    def inner_fun(num):
        """
            定义内层函数
        :param num:
        :return:
        """

        return num * 4

    # 调用封闭函数
    n_4 = inner_fun(number)
    print(f'{number}的4倍是:{n_4}')


# 调用外层函数
outer_fun(5)

结果
54倍是:20

内层函数只能在外层函数里面被调用,不可以在外层函数之外被调用,否则出错。这个就是把内层函数封装起来,不受函数外部变化的影响。

除了上面的用法以外,函数作为第一对象,还可以作为参数传递给其他函数、或者作为函数返回值。更加常见的用法是Python装饰器等等。这些内容都是Python基础,也是工作或者面试中经常被用到的内容。想了解更多Python基础内容,请关注一个优质的圈子:Python实战圈!


什么是Python实战圈?

提供清晰的多角度学习路径、快速学习运用python的圈子

圈主是世界500强高级软件工程师,多年编码经验。

具体可以提供以下内容:

【基础】0基础入门python,24小时有人快速解答问题;

【提高】40多个项目实战,老手可以从真实场景中学习python;

【直播】不定期直播项目案例讲解,手把手教你如何分析项目;

【分享】优质python学习资料分享,让你在最短时间获得有价值的学习资源;圈友优质资料或学习分享,会不时给予赞赏支持,希望每个优质圈友既能赚回加入费用,也能快速成长,并享受分享与帮助他人的乐趣。

【人脉】收获一群志同道合的朋友,并且都是python从业者

【价格】本着布道思想,只需 69元 加入一个能保证学习效果的良心圈子

长按下图二维码,了解python实战圈详情。


原来它是Python中的第一对象,没有想象中的难。_第4张图片

你可能感兴趣的:(原来它是Python中的第一对象,没有想象中的难。)