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

作者:LLLLLLLLLLLLIU 时间:2021-09-05 01:10:26 

函数嵌套和嵌套调用

函数的嵌套

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

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

内函数的调用

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

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则可以直接修改

来源:https://blog.csdn.net/weixin_44851971/article/details/106216497

标签:python,函数嵌套,嵌套调用
0
投稿

猜你喜欢

  • 抓包工具Fiddler的使用方法详解(Fiddler中文教程)

    2022-09-21 03:34:55
  • python爬虫实战项目之爬取pixiv图片

    2021-04-17 00:01:29
  • function.inc.php超越php

    2024-06-05 09:22:40
  • php 一维数组的循环遍历实现代码

    2023-06-12 00:49:04
  • CSS清除浮动常用方法小结

    2009-07-07 11:59:00
  • Python使用struct处理二进制(pack和unpack用法)

    2022-12-23 08:27:56
  • javascript 通过键名获取键盘的keyCode方法

    2024-04-22 22:18:21
  • 在VSCode中如何配置Python开发环境

    2023-05-13 22:02:59
  • Yii2 rbac权限控制操作步骤实例教程

    2024-05-22 10:02:18
  • python基础while循环及if判断的实例讲解

    2021-02-18 06:56:06
  • 浏览器根据什么来判定脚本失控?[译]

    2009-02-20 13:36:00
  • Python网络编程之Python编写TCP协议程序的步骤

    2022-12-25 17:18:55
  • python利用元类和描述器实现ORM模型的详细步骤

    2023-11-13 14:54:12
  • 关于WARNING:Ignoring invalid distribution -pencv-python....警告信息的处理方法(已解决!)

    2021-01-14 18:14:28
  • 如何在nodejs中体验http/2详解

    2024-05-05 09:21:48
  • Python 中Django验证码功能的实现代码

    2022-05-01 22:55:39
  • python反爬虫方法的优缺点分析

    2023-09-07 11:38:02
  • Python hashlib常见摘要算法详解

    2023-07-29 20:04:09
  • python time模块时间戳 与 结构化时间详解

    2021-04-09 11:06:42
  • Centos7下使用yum安装mysql数据库的详细教程(增强版)

    2024-01-13 17:24:52
  • asp之家 网络编程 m.aspxhome.com