Python自学之函数内嵌和闭包

函数内嵌指一个函数内部包含定义另一个函数
举例:

>> def fun1():
print(‘fun1()正在被调用...‘)
def fun2():
print(‘fun2()正在被调用...‘)
fun2()

>> fun1()
fun1()正在被调用...
fun2()正在被调用...
>> fun2()
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
fun2()
NameError: name ‘fun2‘ is not defined

闭包(closure)是函数式编程的一个重要的语法结构,函数式编程是一种编程范式,著名的函数式编程语言就是LISP语言.
Python中的闭包从表现形式上定义为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就是被认为闭包.
举例

>> def FunX(x):
def FunY(y): //FunY就是FunX的内部函数,FunX的整个函数作用域为FunY的外部作用域,变量x
return x * y
return FunY

>> i = FunX(8)
>> i //i是一个function
<function FunX.<locals>.FunY at 0x029CDCD8>
>> type(i)
<class ‘function‘>
>> i(5)
40
>> FunX(8)(5)
40
>> FunY(5)
Traceback (most recent call last):
File "<pyshell#31>", line 1, in <module>
FunY(5)
NameError: name ‘FunY‘ is not defined

内部函数对外部函数的局部变量只能进行引用,不能进行修改
举例:

>> def Fun1():
x = 5
def Fun2():
x *= x //x为外部函数的局部变量,只能引用不能修改
return x
return Fun2()

>> Fun1()
Traceback (most recent call last):
File "<pyshell#39>", line 1, in <module>
Fun1()
File "<pyshell#38>", line 6, in Fun1
return Fun2()
File "<pyshell#38>", line 4, in Fun2
x *= x
UnboundLocalError: local variable ‘x‘ referenced before assignment
>>

解决办法
方法一:
容器类型存放解决,容器类型不是存放在栈中

>> def Fun1():
x = [5] //用列表来存放x
def Fun2():
x[0] *= x[0]
return x[0]
return Fun2()

>> Fun1()
25
>>
方法二
nonlocal关键字,3.0以后版本加入
>> def Fun1():
x = 5
def Fun2():
nonlocal x
x *= x
return x
return Fun2()

>> Fun1()
25
>>

原文地址:http://blog.51cto.com/10991728/2062995

时间: 2024-08-01 22:43:05

Python自学之函数内嵌和闭包的相关文章

Selenium2+python自动化26-js处理内嵌div滚动条

前言 前面有篇专门用js解决了浏览器滚动条的问题,生活总是多姿多彩,有的滚动条就在页面上,这时候又得仰仗js大哥来解决啦. 一.内嵌滚动条 1.下面这张图就是内嵌div带有滚动条的样子,记住它的长相. 2.页面源码如下:(老规矩:copy下来,用文本保存下来,后缀改成.html,用浏览器打开) <!DOCTYPE html><meta charset="UTF-8"> <!-- for HTML5 --><meta http-equiv=&qu

T-SQL编程 —— 用户自定义函数(内嵌表值函数)

内嵌表值函数 接上 <T-SQL编程 -- 用户自定义函数(标量函数)> http://www.cnblogs.com/viusuangio/p/6212072.html 内嵌表值函数可以用于实现参数化视图(查询),例如有一个查询其定义语句如下: 1 use Student 2 GO 3 --查询笔试成绩几个的同学 4 select s.stuno ,s.stuname,s.brithday,e.written,e.lab 5 from StuInfo s left outer join ex

Selenium2+python自动化26-js处理内嵌div滚动条【转载】

前言 前面有篇专门用js解决了浏览器滚动条的问题,生活总是多姿多彩,有的滚动条就在页面上,这时候又得仰仗js大哥来解决啦. 一.内嵌滚动条 1.下面这张图就是内嵌div带有滚动条的样子,记住它的长相. 2.页面源码如下:(老规矩:copy下来,用文本保存下来,后缀改成.html,用浏览器打开) <!DOCTYPE html><meta charset="UTF-8"> <!-- for HTML5 --><meta http-equiv=&qu

js函数内嵌函数的整体跳出 .

stop=false; $.ajax({success:function(){ 这里面不能用return false跳出整个<script></script>,只能跳出该处的function, 注意;可以使用stop=true }}); 另起一行使用if (stop) return false:

python学习:函数内置方法

原文地址:https://www.cnblogs.com/blitz2000/p/9465429.html

python协程函数、递归、匿名函数与内置函数使用、模块与包

目录: 协程函数(yield生成器用法二) 面向过程编程 递归 匿名函数与内置函数的使用 模块 包 常用标准模块之re(正则表达式) 一.协程函数(yield生成器用法二) 1.生成器的语句形式 a.生成器相关python函数.装饰器.迭代器.生成器,我们是如何使用生成器的.一个生成器能暂停执行并返回一个中间的结果这就是 yield 语句的功能 : 返回一个中间值给调用者并暂停执行. 我们的调用方式为yeild 1的方式,此方式又称为生成器的语句形式. 而使用生成器的场景:使用生成器最好的场景就

Python3基础 内嵌函数 简单示例

? ???????Python : 3.7.0 ?????????OS : Ubuntu 18.04.1 LTS ????????IDE : PyCharm 2018.2.4 ??????Conda : 4.5.11 ???typesetting : Markdown ? code """ @Author : 行初心 @Date : 18-9-24 @Blog : www.cnblogs.com/xingchuxin @Gitee : gitee.com/zhichengji

【Python 生成器 匿名函数 递归 模块及包的导入 正则re】

一.生成器 1.定义 生成器(generator)是一个特殊的迭代器,它的实现更简单优雅,yield是生成器实现__next__()方法的关键.它作为生成器执行的暂停恢复点,可以对yield表达式进行赋值,也可以将yield表达式的值返回. 也就是说,yield是一个语法糖,内部实现支持了迭代器协议,同时yield内部是一个状态机,维护着挂起和继续的状态. yield的功能: 1.相当于为函数封装好__iter__和__next__ 2.return只能返回一次值,函数就终止了,而yield能返

python基础13 ---函数模块3(正则表达式)

正则表达式 一.正则表达式的本质 1.正则表达式的本质(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行. 2.正则表达式简介 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分 强大.得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的