函数对象

在python中,一切皆对象,函数也是对象

在python语言中,声明或定义一个函数时,使用语句:

def func_name(arg1,arg2,...):
func_suite

当执行流程遇到def语句时,会在内存中生成一个函数对象。这个函数对象被定义为这个函数的名字。

当我们调用函数时就要指定函数的名字,通过函数名才能找到这个函数。

函数的代码段在定义时是不会执行的,只有当这个函数被调用时,函数内部的代码段才会被执行。

函数调用结束时,这个函数内部生成的所有数据都会被销毁。

函数可以作为对象可以赋值给一个变量,可以作为元素添加到集合对象中,可以作为参数值传递给其它函数,还可以当做函数的返回值被引用。

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

>>> def func():
... print("hello world")
...
>>> print(id(func))
140473814191912
>>> print(type(func))
<class 'function'>
>>> print(func)
<function func at 0x7fc29bcb8f28>
>>> func()
hello world

如上所示,使用def语句来定义函数,func是函数名.

定义func这个函数后,函数里面的打印语句并没有执行,而是等待被调用 ,然后才会执行输出语句。

使用id加函数名,可以打印func这个函数在内存中的身份地址;
使用type加函数名可以打印func这个函数的类型;
只输入函数名,不加括号时,会输出函数在内存中的地址;
只有输入函数名加括号时,函数才会被调用。

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

把函数赋值给一个变量时,就是把这个函数在内存中的地址绑定给这个变量,这样引用这个变量时就是在调用这个函数

>>> def foo():

... print("hello world")

...

>>> foo()

hello world

>>> f1=foo

>>> print(f1)

<function foo at 0x7fc294214730>

>>> print(foo)

<function foo at 0x7fc294214730>

>>> f1()

hello world

在这里,定义一个foo函数,函数的功能是打印"hello world"这名话,然后把foo函数赋值给f1这个变量,

分别打印f1这个变量和foo这个函数就会发现,它们指向的是同一个内存地址.

使用f1变量名加括号就相当于是在调用foo这个函数

3.函数的参数传递的是一个函数时

>>> def foo():
... print("hello world")
...
>>> def bar(func):
... print("hello python")
... func()
...
>>> foo()
hello world
>>> bar(foo)
hello python
hello world

在这里先定义一个foo函数,这个函数的作用是打印一行“hello world”

然后再定义一个bar函数,bar函数会有一个func的参数,在bar函数内部,打印“hello python”,然后引用func这个变量。

调用foo函数,输出"hello world"

调用bar函数,foo函数会被当作参数传递到这里,然后调用,输出"hello world"和"hello python"

4.函数可以作为返回值

在函数内部调用并返回另一个函数,或者函数的返回值是一个函数时

>>> def foo():

... print("hello world")

...

>>> def bar(func):

... return func

...

>>> f1=bar(foo)

>>>

>>> print(f1)

<function foo at 0x7fc2942148c8>

>>> f1()

hello world

5.函数的嵌套定义与嵌套调用

1.在函数内部定义一个并调用这个函数
>>> name="egon"
>>> def f1(name):
... def f2():
... print("%s eat food"% name)
...
>>> def f1(name):
... def f2():
... print("%s eat food" %name)
... f2()
...
>>> f1(name)
egon eat food
2.在函数内部调用另一个函数
>>> name="egon"
>>> def f1(name):
... print("%s eat food"%name)
...
>>> def f2(name):
... print("%s like python"%name)
... f1(name)
...
>>> f2(name)
egon like python
egon eat food

先定义一个f1函数,然后定义函数f2,

在f2函数内部调用f1这个函数,然后再调用f2这个函数,得到返回值

闭包函数

在函数内部定义的函数,称为内部函数.

内部函数包含对外部作用域,而非全局作用域的变量的引用,这个内部函数称为闭包函数

>>> item="linux"
>>> def func1():
... item="python"
... def func2():
... print(item)
... return func2
...
>>> func1()
<function func1.<locals>.func2 at 0x7f246b2f9f28>
>>> f1=func1()
>>> f1()
python

在上面的例子中:

1.先一个全局变量item,item变量的值为"linux",
2.再定义一个func1函数,在func1函数内部再定义一个局部变量item,
局部变量item的值为"python".
3.然后在func1这个函数内部再声明一个函数func2,
此时func2这个函数就是一个内部函数.
4.func2函数引用item变量,根据LEGB变量原则,func2这个内部函数会引用函数func1内部,func2外部的变量item,
所以返回func2这个内部函数时,调用func1这个外部函数,得到python这个值。

python中的函数对象与闭包函数的更多相关文章

  1. day16 函数对象与闭包函数

    目录 一.函数对象 1.1函数可以被引用 1.2函数可以作为容器类型的元素 1.3函数可以作为参数传入另外一个函数 1.4函数的返回值可以是一个函数 二.闭包函数 1 什么是闭包函数 2 闭包函数的用 ...

  2. Python中的函数对象与闭包

    函数在Python中是第一类对象,可以当做参数传递给其他函数,放在数据结构中,以及作为函数的返回结果. 下面的例子为接受另外一个函数作为输入并调用它 #foo.py def callf(func): ...

  3. Python(2.7.6) 函数对象与闭包

    在 Python 中,一切皆对象.函数也是对象,它可以赋值给其他变量,也可以当作参数传递. lambda 表达式可以创建函数对象,在 Python 中,lambda 表达式的函数体只能有唯一的一条语句 ...

  4. python函数对象和闭包

    关于函数对象和闭包 闭包(closure)是函数式编程的重要的语法结构.不同的语言实现闭包的方式不同.Python以函数对象为基础,为闭包这一语法结构提供支持的 (我们在特殊方法与多范式中,已经多次看 ...

  5. python中的一等对象--函数

    一等对象 什么是一等对象: 在运行时创建 能赋值给变量或数据结构中的元素 能作为参数传递给函数 能作为函数的返回结果 python中的字符串,列表什么的都是一等对象,但对如果之前只是使用c++.jav ...

  6. python中hasattr()、getattr()、setattr()函数的使用

    1. hasattr(object, name) 判断object对象中是否存在name属性,当然对于python的对象而言,属性包含变量和方法:有则返回True,没有则返回False:需要注意的是n ...

  7. python中lambda,map,reduce,filter,zip函数

    函数式编程 函数式编程(Functional Programming)或者函数程序设计,又称泛函编程,是一种编程范型,它将计算机运算视为数学上的函数计算,并且避免使用程序状态以及易变对象.简单来讲,函 ...

  8. 【python】dir(__builtins__)查看python中所用BIF(内置函数)

    dir(__builtins__)查看python中所用BIF(内置函数)

  9. python中“生成器”、“迭代器”、“闭包”、“装饰器”的深入理解

    python中"生成器"."迭代器"."闭包"."装饰器"的深入理解 一.生成器 1.生成器定义:在python中,一边 ...

随机推荐

  1. jQuery选择器ID、CLASS、标签获取对象值、属性、设置css样式

    jQuery是继prototype之后又一个优秀的Javascrīpt框架.它是轻量级的js库(压缩后只有21k) , 它兼容CSS3,还兼容各种浏览器 (IE 6.0+, FF 1.5+, Safa ...

  2. sqlserver 重置标识列

    重置标识信息:DBCC CHECKIDENT('表名', RESEED,0) 检查标识信息:DBCC CHECKIDENT('SysModule', NORESEED)

  3. Codeforces 839C Journey【DFS】

    C. Journey time limit per test:2 seconds memory limit per test:256 megabytes input:standard input ou ...

  4. HDU6166-Senior Pan-Dijkstra迪杰斯特拉算法(添加超源点,超汇点)+二进制划分集合-2017多校Team09

    学长好久之前讲的,本来好久好久之前就要写题解的,一直都没写,懒死_(:з」∠)_ Senior Pan Time Limit: 12000/6000 MS (Java/Others)    Memor ...

  5. c++(非递归排序)

    在上面一篇博客当中,我们发现普通查找和排序查找的性能差别很大.作为一个100万的数据,如果使用普通的查找方法,那么每一个数据查找平均下来就要几十万次,那么二分法的查找呢,20多次就可以搞定.这中间的差 ...

  6. 配置web.xml文件用于配置tomcat

    <Context path = "/myweb" docBase = "E:\workspace1\myweb\WebRoot" reloadable = ...

  7. 微信小程序监听input输入并取值

    小程序的事件分为两种,冒泡和非冒泡事件,像<form/>的submit事件,<input/>的input事件,<scroll-view/>的scroll事件等非冒泡 ...

  8. 我的第一个python web开发框架(20)——产品发布(部署到服务器)

    首先按上一章节所讲述的,将服务器环境安装好以后,接下来就是按步骤将网站部署到服务器上了. 我们的站点是前后端分离的,所以需要部署两个站点.首先来发布前端站点. 部署前端站点 输入命令进入svn管理文件 ...

  9. Oracle:对用户的CREATE、ALTER、GRANT、REVOKE操作练习

    --创建一个用户yong2,yong2的表空间为users,临时表空间为temp,users的表空间大小为10M,密码立刻过期,用户锁定. CREATE USER yong2IDENTIFIED BY ...

  10. 织梦DEDE网站后台如何上传附件

    如题,织梦DEDE网站后台如何上传附件?今天本人遇到这样的问题,在网站后台里点击一番后,成功上传了一个pdf文件和doc文件,特来分享经验. 工具/原料 织梦dede网站 doc文件 方法/步骤 1 ...