python中的函数嵌套和嵌套调用

目录
  • 函数嵌套和嵌套调用
    • 函数的嵌套
    • 函数的嵌套调用
  • 函数中定义函数
    • 在函数内部定义的函数要在函数内部调用
    • 函数内的函数可以引用外部变量
    • 试图对外部变量进行修改
    • 函数怎么修改外部变量的值的说明

函数嵌套和嵌套调用

函数的嵌套

函数的嵌套:在函数里面还有函数。分为外函数和内函数。

嵌套函数是为函数内部服务的,比如减少代码的重复,想要调用函数,要使用函数名,内函数也一样。如果不用函数名调用内函数,内函数就永远不会执行。

内函数的调用

怎么在函数外部调用内函数呢?首先,不能直接调用内函数 ,需要先执行外函数的代码块。

def func1():
    print("这是外部函数")
    def func2():
        print("这是内部函数")
func2()  

没有执行外函数内部的代码块,python找不到内函数,所以报name ‘func2’ is not defined,函数func2()没有定义

有几种方式可以实现对内函数的调用。

1.在外函数内部调用内函数,即用函数名调用

def func1():
    print("这是外部函数")
    def func2():
        print("这是内部函数")
    func2() #函数名调用内函数
func1() 

这样调用外函数也会执行内函数的代码块了

2.可以用return调用内函数

在使用return之前,需要说明一点:我们都是使用"函数名()“调用函数的方法,单独使用"函数名”,我们会得到函数的内存地址;(函数名后面加括号才会告诉python,参数是否对得上,然后执行函数的代码块。)

  • "return函数名()"调用内函数
def func1():
    print("这是外部函数")
    def func2():
        print("这是内部函数")
    return func2()
func1()

函数没有返回值,即返回值为None,"return func2()"和"func2()"的效果是一样的

def func1():
    print("这是外部函数")
    def func2():
        print("这是内部函数")
    return func2()
m = func1() #调用函数func1(),调用函数func2的方法
print(m)    #m为None
  • 外函数内部"return函数名",也可以调用内函数,只不过调用外函数时多加一个括号
def func1():
    print("这是外部函数")
    def func2():
        print("这是内部函数")
    return func2
m = func1() 
print(m)
# 
#执行结果为
这是外部函数
<function func1.<locals>.func2 at 0x0000000002EB6620>

上面可以看到,使用函数名得到的是函数的地址,我们可以用一个变量指向这个地址,相当于创建一个变量,这个变量指向的是函数的地址。因为只有函数名是不能调用函数的方法的,所以调用外函数时要用到双括号。

def func1():
    print("这是外部函数")
    def func2():
        print("这是内部函数")
    return func2
func1()() ##执行func1()会返回func2然后再func2()
# m = func1()
# m()

我们可以用func1()返回一个函数func2,再加一个括号调用内函数的方法。

小结:想要调用内函数,首先要调用外函数,即执行外函数的代码块,才有内函数调用的环境。在外函数内部,可以用函数名调用内函数。也可以用return调用内函数,如果return是函数本身的地址,调用外函数时会用到双括号,先调用func1()得到func2然后再func2()。如果return func2(),那么和func2()是一样的,都是告诉python调用内函数。

变量的作用范围

外函数里面的变量和内函数里面的变量是有区别的,作用范围不一样。内函数也可以使用外函数的变量,但是如果想要在内部函数修改外部函数变量的值,就要使用关键字nonlocal

def func1():
    b = 2
    def func2():
        nonlocal b
        b = b - 1
    func2()
    print(b)

函数的嵌套调用

在一个函数里面调用别的函数

def print1():
    print("这是第一个函数")
def print2():
    print("这是定义的第二个函数")
    print1() #在print2()中调用print1()
print2()

函数中定义函数

在函数内部定义的函数要在函数内部调用

def paint():
    print("paint")
    def paintA():
        print("paintA")
    paintA()
paint()
//输出如下:
//paint
//paintA

在函数外部调用函数的结果如下

paintA    //试图在函数外部调用paintA()
//以下是报错信息
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-15-1a59d6e3eeb5> in <module>()
      5     paintA()
      6 paint()
----> 7 paintA

NameError: name 'paintA' is not defined

函数内的函数可以引用外部变量

但是不可以对其进行修改

a=6
def FuncX(x):
     def FuncY(y):
             return a*y
            // return x*y,这里也可以写这条语句进行测试,因为对于FuncY()来说,x也算外部变量,我这里主要是为了突出外部变量这个概念
     return FuncY
FuncX(5)(6)//把5赋给x,6赋给y
//输出结果如下:
36

试图对外部变量进行修改

a=6
def FuncX(x):
     def FuncY(y):
            #global a    加上这条语句即可修改a的值
             a=a*y
             return a  #试图修改 a 的值
           #return a=a*y   Python不允许返回赋值表达式,并不是因为修改a的原因,这里更新一下
           #更新时间  2019.1.4                
     return FuncY
FuncX(5)(6)
//报错信息
UnboundLocalError: local variable 'a' referenced before assignment

函数怎么修改外部变量的值的说明

对于全局变量的修改,如果全局变量是int或者str,那么如果想要在函数中对函数变量进行修改,则需要先在函数内,声明其为global或nonlocal,在进行修改, 如果是list或者dict则可以直接修改

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • python函数的两种嵌套方法使用

    目录 交叉嵌套 回环函数 python函数的两种嵌套方法使用函数的嵌套有两种方式: 交叉嵌套 回环嵌套 交叉嵌套 交叉嵌套的方式是在本函数中调用同一级或上一级函数的嵌套方法: def func(foo):     print(1)     foo()     print(3)      def a():     print(1) b = func(a) print(b) 输出的结果为: 113None 首先,程序会将 Python 文件中顶格的代码运行.函数 func 和 a 都是先开辟内存空间

  • Python的函数嵌套的使用方法

    例子: 复制代码 代码如下: def re_escape(fn):    def arg_escaped(this, *args):        t = [isinstance(a, VerEx) and a.s or re.escape(str(a)) for a in args]        return fn(this, *t)    return arg_escaped 函数嵌套python允许在定义函数的时候,其函数体内又包含另外一个函数的完整定义,这就是我们通常所说的嵌套定义.为

  • 关于python之字典的嵌套,递归调用方法

    一 字典的嵌套 在机器学习实战决策树部分,生成决策树时用到了字典的嵌套. >>>s1={'no surface':{}} >>>s1['no surfacce'][0]='no' >>>s1 {'no surface':{0:'no'}} >>>s2={'flipper':{}} >>>s2['flipper'][0]='no' >>>s2['flipper'][1]='yes' >>&

  • Python基础之函数嵌套知识总结

    内部/内嵌函数 1.定义:在一个函数的函数体内使用关键字def关键字定义一个新的函数,这个新的函数就叫做内部/内嵌函数. 2.注意点:内部函数的整个函数体都在外部函数的作用域内,如果在内部函数内没有对外部函数变量的引用,即访问,那么除了在外部函数体内,在其他任何地方都不能对内部函数进行调用. 3.内部函数可以访问外部函数的变量,但是不能对外部函数中的变量进行使用,即不能试图改变外部函数中的变量.但可以使用nonlocal关键字修饰内部函数的变量,修饰后内部函数就可以访问并使用外部函数的变量.

  • 在python中使用正则表达式查找可嵌套字符串组

    在网上看到一个小需求,需要用正则表达式来处理.原需求如下: 找出文本中包含"因为--所以"的句子,并以两个词为中心对齐输出前后3个字,中间全输出,如果"因为"和"所以"中间还存在"因为""所以",也要找出来,另算一行,输出格式为: 行号 前面3个字 *因为* 全部 &所以& 后面3个字(标点符号算一个字) 2 还不是 *因为* 这里好, &所以& 没有人 实现方法如下: #e

  • python中编写函数并调用的知识点总结

    能够调用自己编写的函数,这在很多开发语言中,都会用到一个叫做mian的主函数,这个函数一般都是程序的入口,当程序启动时,首先执行这个函数. 在Python中,main函数的主要作用就是你写的模块既可以导入到别的模块中用,也可以在模块本身执行使用.下面就来了解具体使用操作吧. 编写简单的函数并调用: def show(): print("这是一个简单的函数") print("无论如何,我都会输出") print("__name__变量为:"+__n

  • Python中的函数作用域

    在python中,一个函数就是一个作用域 name = 'xiaoyafei' def change_name(): name = '肖亚飞' print('在change_name里的name:',name) change_name() # 调用函数 print("在外面的name:",name) 运行结果如下: 在change_name里的name: 肖亚飞 在外面的name: xiaoyafei 我们再试一下在嵌套函数中是如何的寻找的? age = 15 def func():

  • Python 中的函数装饰器和闭包详解

    函数装饰器可以被用于增强方法的某些行为,如果想自己实现装饰器,则必须了解闭包的概念. 装饰器的基本概念 装饰器是一个可调用对象,它的参数是另一个函数,称为被装饰函数.装饰器可以修改这个函数再将其返回,也可以将其替换为另一个函数或者可调用对象. 例如:有个名为 decorate 的装饰器: @decorate def target(): print('running target()') 上述代码的写法和以下写法的效果是一样的: def target(): print('running targe

  • Python中关于函数的具体用法范例以及介绍

    目录 1.函数的介绍 2.函数的定义和调用 3.函数的参数 4.参数的分类 4.1.位置参数 4.2.关键字参数 4.3.缺省参数 4.4.不定长参数 1.不定长参数*args 2.不定长参数* * kwargs 4.5.函数位置顺序 4.6.函数的返回值 1.多个return 2.返回多个数据 4.7.函数的类型 1.无参数,无返回值的函数 2.无参数,有返回值的函数 3.有参数,无返回值的函数 4.有参数,有返回值的函数 4.8.函数的嵌套 4.9.匿名函数 5.函数小练习 1.函数的介绍

  • python中zip()函数遍历多个列表方法

    在对列表的元素进行找寻时,会频繁的说到遍历的理念.对于复杂的遍历要求,如多个列表中查找就显然不适合用for循环.本篇所要带来的是zip() 函数的方法,能够对多个迭代器进行遍历.下面我们就python中zip的说明.语法.使用注意点进行讲解,然后带来遍历多个列表的实例. 1.说明 zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表.(注:在python3中返回的是zip对象) 2.语法 zip(iterable, ...) # 其中 it

  • python中Genarator函数用法分析

    本文实例讲述了python中Genarator函数用法.分享给大家供大家参考.具体如下: Generator函数的定义与普通函数的定义没有什么区别,只是在函数体内使用yield生成数据项即可.Generator函数可以被for循环遍历,而且可以通过next()方法获得yield生成的数据项. def func(n): for i in range(n): yield i for i in func(3): print i r=func(3) print r.next() print r.next

  • Python中super()函数简介及用法分享

    首先看一下super()函数的定义: super([type [,object-or-type]]) Return a **proxy object** that delegates method calls to a **parent or sibling** class of type. 返回一个代理对象, 这个对象负责将方法调用分配给第一个参数的一个父类或者同辈的类去完成. parent or sibling class 如何确定? 第一个参数的__mro__属性决定了搜索的顺序, sup

  • python中reduce()函数的使用方法示例

    前言 本文主要给大家介绍了关于python中reduce()函数使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: reduce()函数在库functools里,如果要使用它,要从这个库里导入.reduce函数与map函数有不一样地方,map操作是并行操作,reduce函数是把多个参数合并的操作,也就是从多个条件简化的结果,在计算机的算法里,大多数情况下,就是为了简单化.比如识别图像是否是一只猫,那么就是从众多的像素里提炼出来一个判断:是或否.可能是几百万个像素,就只

  • Python中super函数用法实例分析

    本文实例讲述了Python中super函数用法.分享给大家供大家参考,具体如下: 这是个高大上的函数,在python装13手册里面介绍过多使用可显得自己是高手 23333. 但其实他还是很重要的. 简单说, super函数是调用下一个父类(超类)并返回该父类实例的方法. 这里的下一个的概念参考后面的MRO表介绍. help介绍如下: super(type, obj) -> bound super object; requires isinstance(obj, type) super(type)

随机推荐