zoukankan      html  css  js  c++  java
  • 闭包,生成器,迭代器

    闭包

    函数内部再定义一个函数并且这个函数用到了外边的函数的变量,那么将这个函数以及用到的一些变量称为闭包。

    • 闭包作用:提高代码可复用性。
    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))
    

    生成器

    在Python 中,这种一遍循环一遍计算的机制,称为生成器: generator,节省大量的空间。

    可以通过next()函数获得生成器的下一个返回值。

    1. 创建生成器

      G = (x*2 for x in range(5))
      >>>G
      >>><generator object <genexpr> at 0x7f626c132db0>
      
    2. 斐波拉契数列

      著名的斐波拉契数列(Fibonacci),除第⼀个和第⼆个数外,任意⼀
      个数都可由前两个数相加得到:
      
      def fib(times):
      	n = 0
      	a,b = 0,1
      	while n<times:
      		yield b
      		a,b = b,a+b
      		n+=1
      	return 'done'
      
      >>>F=fib(5)
      >>>next(F)
      >>>1
      
    3. 捕获Stoplteration

      while True:
      	try:
      		x = next(g)
      		print("value:%d"%x)
      	except StopIteration as e:
      		print("生成器返回值:%s"%e.value)
      		break
      
      value:1
      value:1
      value:2
      value:3
      value:5
      生成器返回值:done
      
    4. send

      例子:执行到yield时,gen函数作⽤暂时保存,返回i的值;temp接收下次
      c.send("python"),send发送过来的值,c.next()等价c.send(None)
      
      def gen():
      	i = 0
      	while i <5:
      		temp = yield i
      		print(temp)
      		i+=1
      
      In [45]: f.send('haha')
      haha
      Out[45]: 1
      

    可迭代对象

    直接作用于for 循环的数据类型:

    1、是集合数据类型,如list、tuple、dict、set、str等;

    2、generator,包括生成器和带yield的generator function

    作用于for循环的对象都是可迭代对象: iterable

    1. 判断是否可以迭代

      可以使用isinstance()判断一个对象是否是iterable对象:
      from collections import Iterable
      In [51]: isinstance([], Iterable)
      Out[51]: True
      In [52]: isinstance({}, Iterable)
      Out[52]: True
      
      

    迭代器

    • 可以被next()函数调用并不断返回下一个值的对象称为迭代器: iterator

    • isinstance() 判断一个对象是否是 iterator 对象

      In [56]: from collections import Iterator
      In [57]: isinstance((x for x in range(10)), Iterator)
      Out[57]: True
      In [58]: isinstance([], Iterator)
      Out[58]: False
      
    • iter()函数

      生成器都是iterator 对象,但是list,dict,str虽然是iterable,却不是iterator

      把list、dict、str等iterable 变成iterator 可以使用iter()函数

      In [62]: isinstance(iter([]), Iterator)
      Out[62]: True
      In [63]: isinstance(iter('abc'), Iterator)
      Out[63]: True
      

    总结

    • 凡是可以作用于for循环的对象都是iterable类型
    • 凡是可作用于next()函数的对象都是iterator类型
    • 集合数据类型如list、dict、str等是iterable但不是iterator,不过可以通过iter()函数获得一个iterator对象。
  • 相关阅读:
    Scrapy选择器和持久化
    SQLAlchemy
    Python数据库连接池DBUtils
    flask应用上下文和g
    flask请求上下文源码解析
    flask的session源码流程和第三方组件
    430软狗不喂狗后系统起不来的问题
    VS2008 快捷键大全
    未能加载或程序集“XXXX,Version=0.0.0.0,Culter=neutral,PublicKeyToken=null”或它的某一个依赖项。试图加载格式不正确的程序。
    用vs2008打开vs2005项目
  • 原文地址:https://www.cnblogs.com/sunjingjingking/p/10203464.html
Copyright © 2011-2022 走看看