Python的函数是第一类对象(first-class object)。你可以把一个函数复制给变量,或者把函数存储在一个结构中。可以像参数一样把函数传递进另一个函数,还可以从一个函数中返回另一个函数。

知道了这些,有助于理解 lambda 和装饰器。这也是 面向函数编程 的一部分。

通过这篇文章,我用最简单的例子,为大家做个说明。

首先定义一个函数,然后调用它:

输出:hello alex!

函数是对象

和列表,字符串一样,函数是对象。我们可以把函数赋值给一个变量。

输出:hello john!

hi = hello 这一行并没有调用函数 hello 。实际上是 hi 引用了函数 hello。现在 hi 是可调用的,最后执行 hi('john'),调用函数代码。打印了 hello john!。

函数对象和函数的名称是两个概念,在上面的例子,hi 和 hello 都指向同一个函数对象。如果删除 hello 并不影响 hi,它继续指向原来的函数对象。

输出:hello everyone!

另外,函数在创建阶段就赋予了名称。上面的函数对象创建的时候,指定了名称 hello ,我们把 hi 指向了函数对象,并不影响它之前的名称。print(hi.__name__) # 输出 hello

可见,输出值还是 hello。

函数可以存储在数据结构中

因为函数是第一类对象,你可以把它存入数据结构中,比如列表:

输出:

可以不用赋值给变量,直接通过列表索引调用函数对象:print(funcs[0]('maggie')) # 输出 hello maggie!

函数可以传递给其他的函数

函数可以通过参数传递进其他函数。

输出:hello alex!

这里,把 hello 函数传递进了 hello_alex。在 hello_alex 调用了函数 hello,并打印。

另一个例子:

输出:HELLO ALEX!

我们写了新的函数 hello_alex_upper,这个函数将默认的输出大写。

函数作为参数传递进另一个函数,这个特性是非常强大的。你可以不修改之前的代码,直接为你的应用增加其他的行为。

函数能够接收另一个函数作为参数,这种函数被称为 高阶函数(high order function)。属于面向函数编程的范畴。

在 Python 中使用高阶函数的一个经典的例子是 map 函数。它接收一个函数和一个序列。序列的每一个元素都经过函数的处理,然后返回修改过的结果序列。>>> list(map(str.upper, ['hello', 'world']))['HELLO', 'WORLD']

函数可以嵌套

Python 允许一个函数定义在另一个函数里,这通常被称为 嵌套函数 (nested function) 或者 内部函数(inner function)。

输出:GREET ALEX

注意,内部函数 upper 在外部是访问不了的,如果你试图访问,会报 AttributeError 错误。print(greet.upper)

报错:Traceback (most recent call last): File "first-class-object.py", line 38, in

print(greet.upper)AttributeError: 'function' object has no attribute 'upper'

如果你想访问内部函数,需要返回该内部函数。

对象也可以像函数那样调用

我们从类实例化,得到一个对象,那么对象就可以调用类定义的相关方法。其实对象也可以像函数那样调用,只需要在类上定义一个函数 __call__。

输出:alexalex

在背后,能够像方法一样调用对象,实际上是对象调用它的 __call__ 方法。

python class函数报错_Python 的函数是第一类 First-Class 对象相关推荐

  1. mysql 自定义函数报错_Mysql自定义函数报错解决方法

    [最近研究mysql数据库性能的相关问题,为了对比不同版本之间的差别.笔者找了一台测试服务器升级了该服务器的mysql数据库进行测试,在升级mysql过程中遇到了一些问题并将其 1.在MySql中创建 ...

  2. mysql 自定义函数报错_Mysql自定义函数报错解决方法 | 学步园

    1.在MySql中创建自定义函数报错信息如下: ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READ ...

  3. JavaScript立即执行函数报错--立即执行函数原理分析

    JavaScript立即执行函数报错 1.'()'在JavaScript环境中有提升运算符优先级和执行函数的作用如果直接在JavaScript环境中执行'()',环境会报出语法错误提示. 2.'()' ...

  4. python全局变量赋值报错_python全局变量、回调函数

    1.python全局变量相关概念及使用 来自菜鸟教程上的例子: http://www.runoob.com/python3/python3-function.html 一.python入参需要注意地方 ...

  5. python class函数报错_Python multiprocess pool模块报错pickling error问题解决方法分析

    本文实例讲述了Python multiprocess pool模块报错pickling error问题解决方法.分享给大家供大家参考,具体如下: 问题 之前在调用class内的函数用multiproc ...

  6. python时间函数报错_Python Day11-LEGB-global-时间函数

    1.LEGB规则对变量名进行作用域解析 我们已经知道了多个命名空间可以独立存在,而且可以在不同的层次上包含相同的变量名."作用域"定义了Python在哪一个层次上查找某个" ...

  7. python read函数报错_python 使用read_csv读取 CSV 文件时报错

    读取csv文件时报错 df = pd.read_csv('c:/Users/NUC/Desktop/成绩.csv' ) Traceback (most recent call last): File ...

  8. python join函数报错_python中join()函数的使用方法

    函数:string.join() Python中有join()和os.path.join()两个函数,具体作用如下: join():    连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分 ...

  9. python调用函数怎么错_python调用函数失败是什么原因

    一.调用函数 Python内置了很多有用的函数,我们可以直接调用. 要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数. 也可以在交互式命令行通过help(abs)查看a ...

最新文章

  1. 最小割 ---- 集合冲突模型 ---- AGC038 F - Two Permutations[详解]
  2. VSCODE编译头文件时函数没有定义的解决方案(VSCODE手动链接C文件方法)
  3. php 中 fastcgi
  4. Go 语言web 框架 Gin 练习8
  5. 汇编语言学习——第四章 第一个汇编程序
  6. Hibernate_2_Hibernate中对象状态及转化_一级缓存_Session详解_HQL/SQL/Criteria_一对多关系_级联操作
  7. mac 源生安装mysql_Django执行源生mysql语句实现过程解析
  8. 作业MathExam
  9. go语言暂停命令_go test命令(Go语言测试命令)完全攻略
  10. 记录QT在实时显示摄像头数据时候切换TAB页出现异常
  11. Openlayers 杂项
  12. 58同城推荐系统设计与实现
  13. cachecloud 安装
  14. SimpleDateFormat 使用TimeZone
  15. C++17之std::apply与std::make_from_tuple
  16. TAPD使用方法学习
  17. SAP MM库存盘点流程
  18. hp打印机无法与计算机,电脑无法连接HP打印机怎么办?
  19. 计算机视觉就业怎么样?好找工作吗?
  20. 7-209 sdut-C语言实验-数位数7-210 sdut-C语言实验-小树快长高

热门文章

  1. 最美的Linux中文版的吗,号称最美的Linux发行版——Elementary OS
  2. 安装mysql 环境变量_win10系统安装mysql数据库后配置环境变量的图文教程
  3. 【Python】字符转换为 ASCII 码
  4. [云炬创业管理笔记]第十章商业计划书答辩测试2
  5. 逻辑回归还能这样解?关于Kernel Logistic Regression的详细解释
  6. 简述Hadoop和Spark的异同
  7. c#开发中程序集调用时容易忽略的问题
  8. c#中将对象序列化为xml(包括list)
  9. Sql获取表信息(包括结构及字段说明)
  10. 动态加载JS脚本的4种方法