python函数进阶之变量的作用域、内置函数、匿名函数

10.1 命名空间
  • 概述

    • 命名空间指的是保存程序中的变量名和值的地方.本质上是一个字典,字典的key就是变量名,value就是变量对应的数据.
    • 局部命名空间: 函数内部
    • 全局命名空间, python文件中
    • 内置命名空间: python解释器层面, builitins, python各个系统层级
  • 访问命名空间

    • 局部命名空间使用locals()函数来访问
    • 全局命名空间的访问使用 globals() 函数访问
  • 命名空间加载顺序

    • 内置命名空间–>全局命名空间–>局部命名空间
  • 命名空间的查找顺序

    • 使用某个变量时, 先从局部命名空间查找, 如果找到了就停止搜索,如果没有找到,去全局命名空间查找,找到了停止,如果没有找到,去内置命名空间去查找,如果没找到就报错
10.2 作用域
  • 概述

    • 作用域指的是变量在程序中的可应用范围

    • 作用域按照变量的定义位置可以划分为四类即:L, E, G, B

      • Local( 函数内部 ) 局部作用域

      • Enclosing(嵌套函数的外层函数内部)嵌套作用域

      • Global(模块全局)全局作用域

      • Built-in(内建)内建作用域

        image-20200819190700244

  • 内层作用域访问外层作用域的顺序

    • L–>E–>G–>B

      • *内层作用中可以访问,外层作用域当中数据*

        *在外层作用域中,不能访问内层作用域中的数据*

    • 在 Python 中,模块(module),类(class)、函数(def、lambda)会产生新的作用域

      条件判断(if……else)、循环语句(for x in data)、异常捕捉不会产生作用域

      在分支,循环,异常处理中声明的变量,作为范围是属于当前作用域的

10.3 全局变量和局部变量
  • 在函数中定义的变量称为局部变量, 只在函数内部生效
  • 在程序一开始的定义的变量称为全局变量,全局变量的作用域是整个函数
  • 当全局变量是不可变数据类型,函数无法修改全局变量的值, 强制修改会报错
  • 在局部变量中可以访问全局变量
  • 当全局变量是可变数据类型,函数可以修改全局变量,修改后,全局变量中的数据会受影响
10.4 global和nonlocal
  • global可以将局部变量变成一个全局变量

    image-20200819191546021

  • nonlocal关键字可以在内函数中修改外层(非全局)变量

    image-20200819191710591

10.5 内置高阶函数

image-20200819191750295

  • abs() 绝对值函数

    • image-20200819192035545
  • max() 最大值函数

    • max(iterable, key, default) 求迭代器的最大值

    • 其中 iterable 为迭代器,max 会 for i in … 遍历一遍这个迭代器

    • 然后将迭代器的每一个返回值当做参数传给 key=func 中的 func

    • 然后将 func 的执行结果传给 key,然后以 key 为标准进行大小的判断

      image-20200819192445325

  • map() 映射函数

    • 有两个参数,第一个参数是一个函数,第二个参数是可迭代的内容

    • 函数会依次作用在可迭代内容的每一个元素上进行计算,然后返回一个新的可迭代内容

    • 例如: 将列表lst1 = [1,2,3] 的每个值都乘以2

      image-20200819192753618

  • filter() 过滤函数

    • 用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表

    • 该函数接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断 , 然后返回 True 或 False,最后将返回 True 的元素放到新列表中

    • 例如: 将列表lst=[1,2,3,4,5,6,7,8,0] 过滤出所有的偶数

      In [24]: lst=[1,2,3,4,5,6,7,8,0]                                                                       
      
      In [25]: def fun(item): 
          ...:     if item%2 == 0: 
          ...:         return True 
          ...:                                                                                               
      
      In [26]: filter(fun,lst)                                                                               
      Out[26]: <filter at 0x7fd52c7c0160>
      
      In [27]: list(filter(fun, lst))                                                                        
      Out[27]: [2, 4, 6, 8, 0]
      
      
  • zip() 函数

    • 接受任意多个可迭代对象作为参数 , 将对象中对应的元素打包成一个 tuple

    • 返回一个可迭代的 zip 对象 . 这个可迭代对象可以使用循环的方式列出其元素

    • 若多个可迭代对象的长度不一致 , 则所返回的列表与长度最短的可迭代对象相同

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-isJ2vI5u-1597844873209)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200819194514705.png)]

    • 案例: 通过t1=(“a”,”b”),t2=(“c”,”d”) 生成[{“a”:”c”},{“b”:”d”}]

      t1 = ("a","b")
      t2 = ("c","d")
      res = list(zip(t1,t2))
      def fun(item):
      	d = dict()
      	d[item[0]] = item[1]
      	return d
      print(list(map(fun,res)))
      
10.6 匿名函数
  • 匿名函数的定义使用lambda

  • 本质为一个函数,没有名字的函数,针对简单函数提供的一种简洁的操作语法

  • 语法格式

    • 变量 = lambda [参数1,参数2…] : 表达式

    • 参数:可选,通常以逗号分隔的变量表达式形式,也就是位置参数

    • 注意 : 表达式中不能包含 循环,return , 可以包含 if…else… 语句(三元表达式)

    • 表达式计算的结果直接返回

    • 匿名函数用处: 一般配合高阶函数使用

    • 优点: 代码简洁,

    • 缺点: 可读性差难于理解, 不推荐使用

    • 案例: 使用filter函数过滤所有的奇数 lst = [1,2,3,4,5,6,7,8,9,10]

      •   In [8]: list(filter(lambda x : x%2==0, lst))                                                           
          Out[8]: [2, 4, 6, 8, 10]
          
        
10.7 嵌套作用域和lambda
  • lambda 表达式也会产生一个新的局部作用域。在 def 定义的函数中嵌套 labmbda 表达式能够看到所有 def 定义的函数中可用的变量

    •   # 例1
        def make_actions():
            acts = []
            for i in range(5):
                acts.append(lambda x: i ** x)
            return acts
        funcs = make_actions()
        print(funcs[0](2))   # 16  
        print(funcs[1](2))	 # 16
        print(funcs[2](2))   # 16
        
        
        # 例2
        def make_actions():
            acts = []
            for i in range(5):
                acts.append(lambda x, y=1: i ** x)
            return acts
        funcs = make_actions()
        print(funcs[0](2))   # 0
        print(funcs[1](2))	 # 1
        print(funcs[2](2))   # 4
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序烂人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值