Python函数中几个比较重要内容,给大家梳理一下----闭包原理(一)

一.函数嵌套的作用

  1. 简单介绍作用域的分类

# ------------作用域分类--------------

# 1.全局作用域:

# 在整个程序运行环境中可见

# 全局作用域中的变量称为全局变量

# 2.局部作用域:

# 在函数,类等累不可见

# 局部作用域中的变量称为局部变量,其使用范围不能超过其所在局部作用域

# 也称为本地作用域local

# 一般来说外部作用域变量可以在函数内部可见,可以使用

# 反过来,函数内部的局部变量,不能在函数外部看到

2. 函数作用域(重要性)

# 一个标识符的可见范围,这就是标识符的作用域,一般常说的是变量的作用域

简单介绍一下概念,来一串代码(本人手写的)

防止有人看不懂,手敲一下代码(简单写一下)

def outer():
    o = 65    #-----局部变量

    def inner():
        o = 0x61    #97----ASCLL码表  #----局部变量(如不会可以看一ASCLL码表,一一对应即可)
        print(1, o, chr(o))

    print(2, o, chr(o))
    inner()           
    print(3, o, chr(o))


print(outer())
#第一次执行-------print(2, o, chr(o))------2,65,A
#第二次执行-------print(1, o, chr(o))------1,97, a
#第三次执行-------print(3, o, chr(o))------3,65,A

2赋值问题

先来一串代码(本人手写)

接着手敲代码

x=300
def foo()
  y=x+1    #出错
  print(y)
  x=500    #在python赋值即定义---因为上面x没有定义,在下面定义x,所以此代码运行不出来
  print(x)

print(foo())

这上面代码运行不出来

接下来再看一个例子,接着分析

x=300
def foo():
   x+=1   #x=x+1------x被赋值,所以是本地变量,运行不出来
   print(x)

print(foo())#-----调用

这上面代码运行不出来

改成这样即可:

x=300
def foo():
   x=2
   print(x)

print(foo())

2global问题

简单介绍一下概念:

# global关键字的变量,将foo内的x声明为使用外部的全局作用域中定义的x

# 全局作用域中必须有x的定义

# 注意:使用了global,foo中的x不再是局部变量了,它是局部变量。

# global使用原则:

# 1.外部作用域变量会在内部作用域可见,但也不要在这个内部的局部作用域中直接使用,因为函数的目的就是为了封装,尽量与外界隔离

# 2.如果函数需要使用外部局部变量,尽量使用函数的形参定义,并在调用传实参解决

# 3.不用global,学习它就是为了深入理解变量作用域

接着来一串代码(本人手写)

接着手敲代码

x=600
def foo():
  global x   #x这个标识被修饰,被global声明成了全局变量。这串代码可以运行出来
  x+=1
  print(x)

print(foo())

上面的赋值问题也可以用global(建议少用)

重点来了闭包原理

3.闭包原理:未在本地作用域中定义的常量。例如:定义在内层函数外的外层函数的作用域中的变量。

闭包:就是一个概念,出现在嵌套函数中,指的是内层函数引用到了外层函数的自由变量,就形成了闭包。

先来一串代码,先分析一下,更加明确(本人手写)

接着手敲代码

def counter():
    c = [0]

    def inner():
        c[0] += 1
        return c[0]

    return inner


foo = counter()
print(foo())   #1
print(foo(),foo())   #2,3
# 首先先运行的是counter(),让两个标识符(c,inner)都消亡了
# foo()由于外层函数运行结束了,内层函数没有消亡,什么时候被调用不知道,但是内层函数要用到外层函数的自由变量(c)
#所以可以得出print(foo())------1

接下来这串代码要注意(相似)

def counter():  # python3中比较简单实现闭包的方式
    c = 0
    def inc()
        c += 1  # c=c+1#如果在一个函数中使用c=,c就是inc函数局部变量
        return c
    return inc
foo=counter()
print(foo())-----------运行不出来-----上面一串代码是列表,这一处赋值即定义(c=c+1)

如果向让上面这串代码运行出来,有两种方法

  1. global(不推荐)

def counter():  # python3中比较简单实现闭包的方式
    global c  #用global,让c成为全局变量
    c = 0
    def inc()
        global c     #所以得出c=0,c有值了
        c += 1  # c=c+1#如果在一个函数中使用c=,c就是inc函数局部变量
        return c
    return inc
foo=counter()
print(foo())#---------此处能够运行出来

用接下来的方法介绍一下nonlocal

nonlocal:将变量标记为不在本地作用域,而是在上级的某一级局部作用域中定义,但不能是(全局作用域----全局变量)中定义

2.nonlocal(推荐)

def counter():  # python3中比较简单实现闭包的方式
    c = 0
    def inc()
        nonlocal c     #从定义中的函数找出c=0(就近原则),不能找全局变量。
        c += 1  # c=c+1#如果在一个函数中使用c=,c就是inc函数局部变量
        return c
    return inc
foo=counter()
print(foo())#---------此处能够运行出来

这是以上函数几个比较重要的内容,尤其是这个闭包原理,大家需要认真的去分析。

如有错误,希望大家指出来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最初的梦10

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值