闭包、生成器、迭代器

闭包

闭包的定义:内部函数对外部函数作⽤域⾥变量的引⽤(⾮全局变量) , 则称内部函数为

闭包

闭包的作用:1.闭包具有提⾼代码可复⽤性 2.当我们需要更多的参数传递, 减少代码的可移植性时,我们就创建一个闭包.

闭包的使用:我们需要构建一个嵌套函数,把外部函数的变量拿来给内部函数用,常用的方法有:1.使用 nonlocal

2.将内部函数名用外部变量接受,再来调用,就可以访问内部函数


# 使用nonlocal

def funX():
    x = 5
    def funY():
        nonlocal x
        x *= x
        return x
    return funY
funX()()

# 为什么使用闭包的例子

def line_conf(a, b):
  def line(x):
      return a*x + b
  return line
line1 = line_conf(1, 1)
line2 = line_conf(4, 5)
print(line1(5))
print(line2(5))

生成器

生成器的定义:

​ 普通函数里面添加yield关键字,就成为了生成器,并具有了迭代器的特性。

​ 参数 :yield 作用,1.生成器的标志 2.将yield后面的值返回

生成器的作用:

  1. 节约内存
  2. 迭代到下⼀次的调⽤时, 所使⽤的参数都是第⼀次所保留下的, 即是
    说, 在整个所有函数调⽤的参数都是第⼀次所调⽤时保留的, ⽽不是新
    创建的

生成器的使用:

def fib(max):
  n =0
  a,b=0,1
  while n <max:
      print(b)  #显示此时的b
      a,b = b, a+b
      n +=1 
  return 'done' # 返回一个迭代值



# 改成生成器

def fib(max):
  n =0
  a,b = 0,1
  while n<max:
      yield b   # 改成yield,既是返回值,又是生成器的标志
      a,b = b, a+b
      n +=1
  return 'done'

迭代器

迭代器的定义:

​ 1.可进行迭代的对象,可用for循环进行遍历的都是可迭代对象

​ 2.能够使用for循环进行迭代遍历的有:集合数据类型:如list、tuple、dict、set、str;generator,包括生成器和generator function.

迭代器的作用:

​ 3.如果有很多值,列表就会占用太多的内存,而迭代器则占用更少内存。

​ 4.迭代器从第一个元素开始访问,直到所有的元素被访问完结束,只能往前不会后退

迭代器的使用:


# 用类将斐波拉契数改写成迭代器

class Fibs():
      def __init__(self,max):
          self.max = max
        self.a = 0
        self.b = 1

    def __iter__(self):
          return self
    def __next__(self):
          fib = self.a  # 定义初始值
        if fib > self.max:
              raise StopIteration
        self.a,self.b = self.b , self.a + self.b
        return fib
if __name__ = '__main__':
      fib = fibs(5)
  print(list(fib)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
闭包在编程中有很多应用场景,以下是一些常见的例子: 1. 数据封装和私有变量:闭包可以用来创建私有变量,从而实现数据封装和保护。这在模块化编程和面向对象编程中非常有用。 2. 函数工厂:闭包可以用来创建一系列相关的函数,这些函数共享相同的外部变量。这在创建类似于Python中的装饰或JavaScript中的高阶函数时非常有用。 3. 延迟执行和计时闭包可以用来实现延迟执行和定时功能。例如,在JavaScript中,setTimeout和setInterval函数使用闭包来实现延迟执行和定时功能。 4. 记忆化(Memoization):闭包可以用来实现记忆化,即缓存函数的计算结果,以便在后续调用中重用。这可以提高函数的性能,特别是在处理计算密集型任务时。 5. 事件处理和回调函数:在JavaScript等事件驱动的编程环境中,闭包常用于实现事件处理和回调函数。闭包可以捕获事件处理函数的上下文,使得事件处理函数可以访问其所需的外部变量。 6. 部分应用(Partial Application)和柯里化(Currying):闭包可以用来实现部分应用和柯里化,这是一种将多参数函数转换为一系列单参数函数的技术。这可以简化函数调用,使得代码更加简洁和可读。 7. 实现生成器:在某些编程语言中,例如Python和JavaScript,闭包可以用来实现生成器,这是一种用于遍历数据结构的高效方法。
最新发布
07-14

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值