资讯专栏INFORMATION COLUMN

python-学习笔记 内部函数

Gilbertat / 1827人阅读

摘要:返回该函数的时候,携带了该内部函数引用的外部函数参数和局部变量。每次返回的函数都是不同的对象的结果为内部函数本身被返回时,所携带的参数或局部变量时那一刻的值例如在函数内有循环,内部函数引用的循环变量。

内部函数

Python可以在函数内部再定义一个函数。这个定义的内部函数可以引用外部函数的参数和局部变量。
事实上,内部函数还可以在其中再定义内部函数,实现内部函数多重嵌套。
例如:

def fun_outer(x, y):
    def fun_inner(z):
        def fun_inner_inner(h):
            return x+y+z+h
        return fun_inner_inner(100)
    return fun_inner(20)

print fun_outer(1, 2)
返回函数本身

函数本身也是一个对象。因此我们可以在函数内将一个内部函数返回。返回该函数的时候,携带了该内部函数引用的外部函数参数和局部变量。

def fun_outer(x, y):
    def fun_inner(z):
        def fun_inner_inner(h):
            return x+y+z+h
        return fun_inner_inner(100)
    return fun_inner(20)

f =  fun_outer(1, 2)
print f

打印的结果为. 此时fun_outer(1, 2)得到的是一个函数对象,该函数对象携带了两个参数值,即x=1y=2
如何让它进一步计算呢,此时我们再执行f(3)就会返回结果6

每次返回的函数都是不同的对象
f1 = fun_outer(1, 2)
f2 = fun_outer(1, 2)
print f1
print f2

print的结果为:



内部函数本身被返回时,所携带的参数或局部变量时return那一刻的值

例如在函数内有循环,内部函数引用的循环变量。

def fun_outer(x, y):
    funcs = []
    for i in range(0,3):
        def fun_inner():
            return x+y+i
        funcs.append(fun_inner)
    return funcs

func1, func2, func3 = fun_outer(1, 2)
print func1(),func2(),func3()

打印结果竟然三个函数都是5.其实这时候func_outer函数在返回一个函数列表的时候,i已经循环到2了。因此func1func2func3携带的i参数都已经是2了。因此最终计算结果都是5.
如何实现在有循环变量的时候,返回的函数携带的变量都是循环当时的值呢?
方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变.

def fun_outer(x, y):
    funcs = []
    for i in range(0,3):
        def fun_inner(c):
            def fun_inner_inner():
                return x+y+c
            return fun_inner_inner
        funcs.append(fun_inner(i))
    return funcs

func1, func2, func3 = fun_outer(1, 2)
print func1(),func2(),func3()

打印结果:3 4 5

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38243.html

相关文章

  • python学习笔记之一(.py文件里输入中文报错)

    摘要:定义默认参数要牢记一点默认参数必须指向不变对象尾递归调用函数本身,但是的返回值不包含表达式。而尾指针相当于把常规的递归反过来,增加一层递归的同时释放前一个递归指针,所以能够始终保持只有一个栈帧在使用中。 教程 1、python大小写敏感 如果字符串里面有很多字符都需要转义,就需要加很多,为了简化,Python还允许用r表示内部的字符串默认不转义 >>> print ...

    heartFollower 评论0 收藏0
  • Python 3 学习笔记之——变量作用域、模块和包

    摘要:局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。 1. 变量作用域 Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python 的作用域一共有4种,分别是: L (Local) 局部作用...

    lijinke666 评论0 收藏0
  • Python学习笔记

    摘要:数字和字符串,不能改变对象本身,只能改变引用的指向,称为不可变数据对象。从开始,依次增加的值,直至等于或者大于将会输出。该函数输入姓名和各科的成绩,输出姓名和总共成绩。表明该参数是关键字参数,通常来讲关键字参数是放在函数参数列表的最后。 基础 局部变量与全局变量 函数中使用的变量是局部的 如果在外面的变量在函数中使用,需要加global关键字 APPLY = 100 # 全局变量 a ...

    anquan 评论0 收藏0
  • python学习笔记

    摘要:在循环外使用今天在练习一个题目求之内的素数。表示从倒数第一个开始往前数如果是的话则表示从正数第一个到最后一个。同时,闭包要求外部函数的返回值是内部函数的函数名。 18. random()的用法 #随机整数: >>> import random >>> random.randint(0,99) 21 #随机选取0到100间的偶数: >>> import random >>> rando...

    张汉庆 评论0 收藏0
  • Python 3 学习笔记之——面向对象

    摘要:类的介绍类用来描述具有相同的属性和方法的对象的集合。类变量类变量在整个实例化的对象中是公用的。类的定义语法格式如下类有一个名为的特殊方法,也即是构造函数,该方法会在定义对象的时候自动调用,可以通过参数传递来对类的实例进行设定。 1. 类的介绍 类(Class) 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例,类是对象的抽象。 ...

    yzzz 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<