python-嵌套函数讲解

在看之前先把这篇文章的global搞懂

Python入门--python中的global_愈努力俞幸运的博客-CSDN博客_python的globalhttps://blog.csdn.net/qq_37891604/article/details/124203862

先复习一下嵌套函数

内部函数,是无法被直接调用的,内部函数只能通过外部函数来调用

'''
嵌套函数
'''
#例1
def funA():
    x=520
    def funB():
        x=880
        print('in funB x=',x)
    funB()#内部函数只能通过外部函数来调用
    print('in funA x=',x)
'''
内部函数是无法被直接调用的
内部函数只能通过外部函数来调用
'''
'''
以下语句会报错
funB()
'''
funA()#in funB x= 880 in funA x= 520

首先对输出的结果要会判断,不会就是还没理解python作用域。

 内部函数可以访问到外部函数的变量,但却无法修改外部函数变量的值,外部函数输出的x还是520.

例1中,内部函数外部函数,虽然都是x,但内部函数无法修改外部函数的值。

和global的例1是一样的感觉

 使用nonlocal语句,在内部函数修改外部函数的变量

#例2
'''
使用nonlocal语句,在内部函数修改外部函数的变量
'''
def funA():
    x=520
    def funB():
        nonlocal x
        x=880
        print('in funB x=',x)
    funB()#内部函数只能通过外部函数来调用
    print('in funA x=',x)
funA()#in funB x= 880 in funA x= 880

判断例3的代码是否会报错?

#例3
def funa():
    x=5
    def funb():
        x+=1
        print(x)
    funb()
    print(x)
funa()
'''
UnboundLocalError: local variable 'x' referenced before assignment

'''

例1,会报错,出错原因就是global,一样,虽然在外部函数找到了x,但当对x进行修改时,会把x当成局部变量,但在funb中没定义x,所以会出错。

在global那边文章中,我们说可以加global.在嵌套函数中可以使用nonlocal

#例4
def funa():
    x=5
    def funb():
        nonlocal x
        x+=1
        print(x)
    funb()
    print(x)
funa()

有个神奇的是

#例5
def funa():
    lst=[1,2]
    se={10,20}
    def funb():
        lst.append(3)
        print('内部函数中lst',lst)
        se.add(30)
        print('内部函数中se',se)
    funb()
    print('外部函数中lst',lst)
    print('外部函数中se',se)
funa()
'''
内部函数中lst [1, 2, 3]
内部函数中se {10, 20, 30}
外部函数中lst [1, 2, 3]
外部函数中se {10, 20, 30}
'''

 这没加nonlocal,这怎么可以修改外部函数的变量呢?这是因为列表,集合是容器变量,可以修改。

最后给出个两个代码,检验各位看官是否理解。

#例6
# 定义一个外部函数outer
def outer():
    x = 2
    # 定义一个内部函数inner
    def inner():
        # 在内部函数如何修改外部函数的局部变量
        nonlocal x # 此时这里的x不再是新增的变量,而是外部的局部变量x
        y = x + 1
        print('y为',y)
        x = 10 
        print('内部函数里的x等于',x)
    inner()
    print('外部函数里的x等于',x)
outer()
'''
y为 3
内部函数里的x等于 10
外部函数里的x等于 10
'''

最后,总结

python 里内嵌函数是可以修改外部环境里的变量的

关键是细节. 如果是简单变量类型, 那么不可以.如果相修改就是用nonlocal

但是如果是容器类变量, 则没问题了.

呕心沥血之作,希望有同样疑问的朋友,可以因为本篇节省点精力。

最后给个例子巩固。 

#例7
# 定义一个外部函数outer
def outer():
    a=11
    b=22
    x=[1,2,3]
    def inner():
        global c#如果想把内部变量传递到外部环境里,就必须在内部环境里声明为全局变量
        c=a+b
        #b=b+1#内部函数不能修改,简单型外部变量
        x.append([4,5,6])
        print('内部函数',a,b,c)
        print('内部函数',x)
    inner()
    print('外部函数',a,b,c)
    print('外部函数',x)
outer()
'''
内部函数 11 22 33
内部函数 [1, 2, 3, [4, 5, 6]]
外部函数 11 22 33
外部函数 [1, 2, 3, [4, 5, 6]]
'''

 

  • 14
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 7-2 jmu-python-分段函数是指在Python编程语言中,实现分段函数的计算和绘制。分段函数是指在不同的区间内,函数的表达式不同。在Python中,可以使用if语句或者numpy库中的where函数来实现分段函数的计算。同时,也可以使用matplotlib库来绘制分段函数的图像。 ### 回答2: 7-2 jmu-python-分段函数是一道Python编程题目,要求我们编写一个程序,计算分段函数的值。分段函数是一种常用的数学函数形式,其定义域被划分为若干个子域,在每个子域里函数的表达式是不同的。 对于这个问题,我们可以采用Python语言编写一个函数来求解。具体来说,我们可以先将不同的子域分别处理成单独的函数,在不同的子域里分别调用不同的函数,最终得到分段函数的值。 首先,我们需要确定定义域并将其划分为不同的子域。假设我们需要求解的分段函数为f(x) = x^2-2x+1(x<1); f(x) = x+2 (1<=x<10); f(x) = x^3-20 (x>=10)。可以看出,定义域被分为了三个子域:x<1、1<=x<10、x>=10。 接下来,我们可以分别编写三个子函数,分别用来计算在不同子域内的函数值。对于每个子函数,我们需要传入一个参数x(x为定义域内的一个值),并返回对应函数在该点的函数值。 def func1(x): return x**2 - 2*x + 1 def func2(x): return x + 2 def func3(x): return x**3 - 20 最后,我们可以编写一个分段函数的总函数,根据输入的x的不同值,分别调用不同的函数进行计算。 def piecewise_function(x): if x < 1: return func1(x) elif 1 <= x <10: return func2(x) else: return func3(x) 这样,我们就可以通过调用piecewise_function来计算任意一个x在分段函数中的函数值。 ### 回答3: 7-2 jmu-python-分段函数 分段函数是指函数的定义域被分成多个区间,在每个区间内采用不同的函数表达式来表示函数的值。在图像上,分段函数表现出多段直线或曲线组成的形态。分段函数是高中数学中的一个重要概念,可以解决很多实际问题,如利润函数、收益函数等。 Python中可以通过if语句来实现分段函数的计算。首先要确定函数定义域的区间,然后在每个区间内使用不同的函数表达式计算函数值。具体实现过程如下: 1.确定函数的定义域区间,例如定义域为(-∞,2),[2,5),[5,+∞)。 2.定义一个函数名,例如f(x)。 3.使用if语句,在每个区间内使用不同的函数表达式计算函数值。 def f(x): if x<2: return x**2+3 elif x>=2 and x<5: return 2*x+1 else: return 4*x-3 4.调用函数,输入自变量x的值,求得函数值。 print(f(1)) # 输出4 print(f(3)) # 输出7 print(f(6)) # 输出21 上述代码中,函数f(x)的定义域被分成了三个区间:(-∞,2),[2,5),[5,+∞),并在每个区间内使用不同的函数表达式计算函数值。通过if语句的条件判断,可以实现对不同区间的函数表达式的选择。调用函数时,输入自变量x的值,就可以得到对应的函数值。 总之,Python中可以通过if语句实现分段函数的计算,这对于解决实际问题有很大的帮助。在编写代码时,需要注意定义域的分段和函数表达式的选择,以便正确计算函数值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值