首页 > 编程语言 >python-函数-作用域

python-函数-作用域

时间:2023-01-06 10:15:02浏览次数:44  
标签:函数 作用域 python func print 装饰 def

1. 作用域

  • 作用域: 限制一个变量或一段代码可用范围,好处是提高了城乡逻辑局部性,减少名字冲突

  • 作用域结构图:
    image

    • Local(局部作用域):在函数中定义的变量,def关键字定义的语句块中,即函数中定义的变量
    • Enclosed(嵌套作用域): 一般出现在函数中嵌套一个函数时,在外部函数中的作用域称为嵌套作用域(闭包常见)
    • Global(全局作用域):文件顶层定义的变量
    • Built-in(内置作用域): 系统内解释器定义的变量,例如关键字。
  • 闭包:

    • 你可以简单粗暴地理解为闭包就是一个定义在函数内部函数,闭包使得变量即使脱离了该函数的作用域范围也依然能被访问到,像上面所说的嵌套函数也是闭包的一种形式(将内部嵌套定义的函数作为返回值)。

    • 示例:

      def outer():
      	x = 1
      	def inner():
      		print(x) # 1
      	return inner # 不加括号,表示返回函数体
      sf = outer()
      sf() # 调用,等同于outer()()
      
    • 在一个外部函数内定义了一个函数,内部函数里引用外部函数的变量,并且外部函数的返回值是内函数的引用,这样就构成了一个闭包,并且满足了闭包的三个条件:

      • 两层以上嵌套关系
    • 内部函数调用外部函数定义的变量

    • 外部函数返回内部函数体对象, 而不是函数体结果(加括号)

  • 函数装饰器

    • 函数装饰器作用:装饰器本质上是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。

    • 应用场景:记录日志、性能测试、权限效验等

    • 示例:

      • 示例:无参数

        • 示例1、无参数装饰调用

          #!/usr/bin/env python
          # _*_ coding: utf-8 _*_
          # Author:shichao
          # File: .py
          
          
          # 装饰器无参数
          
          def hello():
              print("我是源函数")
          
          def hello2():
              print("我是一个求和的函数,正在执行中")
          
          def decorator(func):         # func要接收一个函数
              def f():
                  print("原函数开始执行")
                  func()
                  print("原函数执行结束")
          
              return f # 返回函数体
          
          # 把装饰器传入函数
          dec = decorator(hello)
          dec2 = decorator(hello2)
          
          # 调用内部函数
          dec()
          dec2()
          
          
        • 示例2、无参数装饰器使用“@”调用

          python提供一个更简洁引用装饰器的方法:语法糖“@”

          #!/usr/bin/env python
          # _*_ coding: utf-8 _*_
          # Author:shichao
          # File: .py
          
          
          # 装饰器: 无参数装饰器"@"
          
          
          def test_dec(func):
              def f():
                  print("test功能刚开始执行")
                  func()
                  print("test功能执行结束")
          
              return f
          @test_dec
          
          # 需要调用的装饰器,需要放到装饰器下面
          def test():
              print("我测试装饰器无参数")
          
          test()
          
      • 函数装饰:带参数

        • 示例1:装饰器带参数传递示例

          def decorator(func):
          	def f(msg):
          		print("原函数开始执行了")
          		func(msg)
          		print("原函数执行结束了")
          	return f
          
          @decorator
          def hello(msg):
          	print(msg)
            
          hello("我是原函数")
          

2. 作用域案例

  • 案例1、函数作用域与闭包

    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
    # Author:shichao
    # File: .py
    
    x = 123      # 全局作用域
    
    def outer():
        x = 456       # 嵌套作用域
        def inner():
            s = 789    # 局部作用域
            print(s)
            print(x)
        return inner()
    outer()
    
  • 案例2、函数装饰器

    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
    # Author:shichao
    # File: .py
    
    
    # 装饰器无参数
    
    def hello():
        print("我是源函数")
    
    def decorator(func):         # func要接收一个函数
        def f():
            print("原函数开始执行")
            func()
            print("原函数执行结束")
    
        return f() # 返回函数体
    
    # 把装饰器传入函数,调用内部函数
    decorator(hello)
    
  • 案例3、函数装饰器使用“@”调用装饰器

    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
    # Author:shichao
    # File: .py
    
    
    # 装饰器: 无参数装饰器"@"
    
    
    def test_dec(func):
        def f():
            print("test功能刚开始执行")
            func()
            print("test功能执行结束")
    
        return f
    @test_dec
    
    # 需要调用的装饰器,需要放到装饰器下面
    def test():
        print("我测试装饰器无参数")
    
    
    test()
    
  • 案例4、函数装饰器:带参数

    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
    # Author:shichao
    # File: .py
    
    
    def decorator(func):
        def f(*args):
            print("原函数开始执行了")
            func(*args)
            print("原函数执行结束了")
    
        return f
    
    @decorator
    def hello(*args):
        print(*args)
    
    hello("我是原函数")
    
  • 案例5、函数装饰器:使用*args和**kwargs

    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
    # Author:shichao
    # File: .py
    
    
    # 使用**kwargs
    def decorator(func):
        def f(*args,**kwargs):
            print("原函数开始执行了")
            func(*args,**kwargs)
            print("原函数执行结束了")
    
        return f
    
    @decorator
    def hello(*args, **kwargs):
        print(args,kwargs)
        print("我是一个求和函数,只在执行")
    
    hello(4,5,a=1,b=2)
    

标签:函数,作用域,python,func,print,装饰,def
From: https://www.cnblogs.com/scajy/p/17029582.html

相关文章

  • 高阶函数map和filter
    1.高阶函数内建高阶函数:map()、filter()高阶函数至少满足两个任意的一个条件能接收一个或多个函数作为输入输出一个函数2.高阶函数map的使用map()函数:根据......
  • python-函数-常用内建函数
    1.函数-常用内建函数内建函数python解释器内置了很多函数,你可用直接使用它们在前面学习过的内建函数有:print()、len()、open()、range()内建函数描述map()......
  • python-内建函数-排序函数sorted函数
    1.排序函数sorted()函数:对所有可迭代的对象进行排序操作语法格式:sorted(iterable,*,key=None,reverse=False)key:指定带有单个参数的函数,用于从interable的......
  • python-内建函数-拼接函数join
    1.python-内建函数-拼接函数joinjoin()函数:将序号中的元素以指定的字符串连接,生成一个新的字符串。示例:示例1:拼接字符串s="lizhenliang"r='.'.join(s)p......
  • python-内建函数-反转函数reversed
    1.内建函数-反转函数reversed函数reversed()函数:返回一个反转的迭代器语法格式:reversed(seq)示例:列表反向n=[1,2,3]print(list(reversed(n)))2.......
  • python-内建函数-多迭代对象聚合
    1.python-内建函数-多迭代对象聚合zip()函数:对多个可迭代对象创建一个聚合,返回一个元组的迭代器示例:x=[1,2,3]y=[4,5,6]zipped=zip(x,y)print(list(zippe......
  • python-内建函数-最大值、最小值和求和函数
    1.python-最大值、最小值和求和函数min()返回可迭代对象中最小的元素max()返回可迭代对象中最大的元素sum()对可迭代对象求和2.案例最大值#!/usr/bin/envp......
  • 极客编程python入门-内建模块base64
    base64Base64是一种用64个字符来表示任意二进制数据的方法。用记事本打开exe、jpg、pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,......
  • [Java 8] (1) 函数式编程简介
    思维方式的转变以从一个城市集合中寻找是否存在Chicago为例:习惯的方式booleanfound=false;for(Stringcity:cities){if(city.equals("Chicago")){......
  • python爬虫之抓取彼岸壁纸
    喜欢壁纸的小伙伴经常苦恼于不能找到高清壁纸,网络上手动搜索费时费力,而且格式大小不适合电脑还会失真。那么我们该如何通过python爬虫实现高效快速爬取高清图片呢?下面的代码......