首页 > 代码库 > 【Python3之函数对象】

【Python3之函数对象】

函数对象

函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性。

那到底什么是第一类对象(First-Class Object)呢?

在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量、可以作为元素添加到集合对象中、可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的。

1.函数身为一个对象,拥有对象模型的三个通用属性:id、类型、和值。

技术分享
#!/usr/bin/env python
# -*- coding:utf-8 -*-
def foo():
    print(‘from foo‘)
foo()

print(id(foo))
print(type(foo))
print(foo)
技术分享

输出

from foo
4406808360
<class ‘function‘>
<function foo at 0x106aa8f28>

2.函数可以被引用,即函数可以赋值给一个变量

还可以把该函数赋值给更多的变量,唯一变化的是该函数对象的引用计数不断地增加,本质上这些变量最终指向的都是同一个函数对象。

技术分享
#!/usr/bin/env python
# -*- coding:utf-8 -*-
def foo():
    print(‘from foo‘)

foo()
func=foo    #引用,赋值
print(foo)
print(func)
func()
技术分享

输出

from foo
<function foo at 0x10eed8f28>
<function foo at 0x10eed8f28>
from foo

 

3.函数可以当做参数传递

技术分享
def foo():
    print(‘from foo‘)

def bar(func):
    print(func)
    func()

bar(foo)
技术分享

输出

<function foo at 0x1047eff28>
from foo

 

4.函数可以作返回值

函数接受一个或多个函数作为输入或者函数输出(返回)的值是函数时,我们称这样的函数为高阶函数

技术分享
def foo():
    print(‘from foo‘)

def bar(func):
    return func     

f=bar(foo)

print(f)

f()
技术分享

输出

<function foo at 0x107f29f28>
from foo

 

5.函数可以当作容器类型的元素

容器对象(list、dict、set等)中可以存放任何对象,包括整数、字符串,函数也可以作存放到容器对象中

技术分享
def foo():
    print(‘from foo‘)
dic={‘func‘:foo}

foo()

print(dic[‘func‘])

dic[‘func‘]()
技术分享

输出

from foo
<function foo at 0x10997ef28>
from foo

 

6.函数还可以嵌套

函数嵌套的定义

技术分享
def f1():

    def f2():
        print(‘from f2‘)
        def f3():
            print(‘from f3‘)
        f3()
    f2()


f1()
技术分享

输出

from f2
from f3

 

应用

技术分享
def get(text):
    def clean(t):   #2
        return t[1:]
    new_text = clean(text)  #1
    return len(new_text)

print(get(‘python‘))
技术分享

输出

5

【Python3之函数对象】