python生成器和迭代器理解,迭代法Python

  python生成器和迭代器理解,迭代法Python

  本文主要介绍Python中的一个新概念,即迭代器。迭代器的使用可以帮助我们提高代码的性能。让我们仔细看看迭代器。

  00-1010什么是迭代器以及如何生成迭代器迭代器函数-iterator()函数和next()函数可以迭代对象生成迭代器-迭代器的用法-演示案例

  

目录

  在python中,迭代是访问集合元素的一种非常强大的方式。迭代器是一个可以记住遍历位置的对象,所以不会像链表一样一次生成,而是在使用的时候才生成,节省了大量的内存资源。迭代器对象从集合中的第一个元素开始访问,直到所有元素都被访问。迭代器有iter方法:Iterator()和next()。

  这个解释可能不太直观。下面用一个生活的小栗子来解释一下,让大家有更深的理解。比如我们去超市买水果,刚好超市的服务人员在摆放苹果。工作人员告诉我们,需要等苹果都放好了才能拿,这样会浪费时间。(这个场景中,柜台上其实有苹果,但不允许出售。)

  然后我们就去橘子柜台,服务人员也在摆橘子。但是服务人员告诉我们可以直接拿橘子,不用等他放出来,这样会节省我们的时间。如果拿橘子的速度超过了服务人员,我们可以等服务人员放好后直接拿橘子,大大提高了买橘子的效率。

  迭代器类似于我们买橘子的场景。我们平时的程序都是一次性写入内存的。比如我们的列表里有几百个数据,都是一次性写入内存,这样我们就可以用了。但是,迭代器是按需加载的,内容中会放一点内容,所以我们可以立即使用内存中的数据进行逻辑处理。这样所有的数据都可以不用写入内存就可以使用,大大提高了使用效率。

  

什么是迭代器

  

如何生成迭代器

  Iter(iterable)从iterable对象返回迭代器,iterable必须是可以提供迭代器的对象。

  Next(迭代器)从迭代器中获取下一条记录。如果不能获得下一条记录,将触发stoptrerator异常。

  解释:

  1.迭代器只能向前取值,不能向后取值。

  2.iter迭代器函数可以返回一个可迭代对象的迭代器。

  示例:

  iter()函数介绍:生成迭代器对象

  iter()函数的用法:iter(iterable)

  参数介绍:iterable—iterable数据类型(如列表、字典、元组、集合类型等。)

  示例:

  iter([1,2,3])

  返回值:

  0x4f3bff0处的list_iterator

  next()函数简介:返回迭代器中的数据

  next()函数的用法:next(iterable)

  参数介绍:iterable—迭代器对象

  示例:

  iter_obj=iter([1,2,3])

  下一个(iter_obj)

  返回值:

  # 1,2,3

  #停止迭代

  综上所述,我们得出结论:

  Iter(iterable)从iterable对象返回迭代器,iterable必须是可以提供迭代器的对象。

  Next(iterable)从迭代器中获取下一条记录。如果无法获得下一条记录,将触发stoptrerator异常。

  示范案例如下:

  #编码:utf-8

  test_list=[1,3,5,7]

  Test_iter=iter(test_list) #让test_list提供一个可以访问自身的迭代器。

  Print(next(test_iter)) # 1从迭代器中获取值,并让迭代器获取l中的一个元素。

  打印(下一页

  (test_iter))     # 3

  print(next(test_iter))     # 5

  print(next(test_iter))     # 7

  print(next(test_iter))     # StopIterable 异常

  test_list 实际上是一个列表,但是被迭代器迭代之后。并不是一次性将列表放入内存中,而是每次放一个元素进入内存,然后被读取。(这就是我们说的按需加载)

  

  

  

可迭代的对象

  类似于list、tuple、str 等类型的数据可以使用for… in… 的循环遍历语法可以从其中依次拿到数据并进行使用,我们把这个过程称为遍历,也称迭代。python中可迭代的对象有list(列表)、tuple(元组)、dirt(字典)、str(字符串)set(集合)等。

  示例如下:

  

test_list = [1,2,3,4,5]

  test_dirt = {

   "name":"张三",

   "sex":"男",

   "age":33

   }

  test_tuple = (1,2,3,4,5)

  test_set = {1,2,3,3,4}

  for i in test_list:

   print(i)

  for i in test_dirt:

   print(i)

  for i in test_tuple:

   print(i)

  for i,j in test_set.items():

   print("%s:%s" % (i,j))

  # >>> 执行结果如下:

  # >>> test_list的元素为: 1

  # >>> test_list的元素为: 2

  # >>> test_list的元素为: 3

  # >>> test_list的元素为: 4

  # >>> test_list的元素为: 5

  # >>> test_dirt的元素为: name

  # >>> test_dirt的元素为: sex

  # >>> test_dirt的元素为: age

  # >>> test_tuple的元素为: 1

  # >>> test_tuple的元素为: 2

  # >>> test_tuple的元素为: 3

  # >>> test_tuple的元素为: 4

  # >>> test_tuple的元素为: 5

  # >>> test_set的元素为:1

  # >>> test_set的元素为:2

  # >>> test_set的元素为:3

  # >>> test_set的元素为:4

  

  

生成迭代器

  除了刚刚我们使用的 iter() 函数之外 ,我们还有其他方法生成迭代器:

  第一种:for循环生成方法 —> 我们可以在函数中使用 for 循环, 并对每一个 for 循环的成员使用 yield() 函数 [它的意思就是将每一个 for 循环成员放到一个迭代器对象中,不过只有被调用才会被放入。]

  示例如下:

  

def test():

      for i in range(10):

          yield i

  result = test()

  print(for 循环,第一次 \i\的值为:, next(result))

  print(for 循环,第二次 \i\的值为:, next(result))

  print(for 循环,第三次 \i\的值为:, next(result))

  print(for 循环,第四次 \i\的值为:, next(result))

  # >>> 执行结果如下:

  # >>> for 循环,第一次 i的值为: 0

  # >>> for 循环,第二次 i的值为: 1

  # >>> for 循环,第三次 i的值为: 2

  # >>> for 循环,第四次 i的值为: 3

  

  注意:超过10次异常会抛 StopIteration 的异常。

  第二种:for 循环一行生成迭代器对象。

  示例如下:

  

result = (i for i in [1, 2, 3])        # 将 for 循环在非函数中 赋值 给一个变量, 这也是生成一个迭代器变量的方法  

  print(for 循环,第一次 \i\的值为:, next(result))        # 使用 next 调用迭代器

  print(for 循环,第二次 \i\的值为:, next(result))

  print(for 循环,第三次 \i\的值为:, next(result))

  # >>> for 循环,第一次 i的值为: 1

  # >>> for 循环,第二次 i的值为: 2

  # >>> for 循环,第三次 i的值为: 3

  

  注意: next(result) 超过4次会抛 StopIteration 的异常。

  划重点:

  使用 for 循环生成的迭代器,可以不使用 next() 函数 也可以执行,(依然可以通过 for 循环 获取迭代器的数据)不仅如此,当我们调取完迭代器中的数据之后,程序不会抛出异常,相比较与 next() 函数要友好的多。

  示例如下:

  

result = (i for i in [1, 2, 3])

  for item in result:

      print(item)

  # >>> 执行结果如下:

  # >>> 1

  # >>> 2

  # >>> 3

  # 循环结束,程序正常退出,不会抛出 StopIteration 的异常

  

  

迭代器的用法 - 演示案例

  案例一:

  

def make_iter():

      for i in range(5):

          yield i

  iter_obj = make_iter()

  for i in iter_obj:

      print(i)

  print(----)

  for i in iter_obj:

      print(i)

  # >>> 执行结果如下:

  # >>> 0

  # >>> 1

  # >>> 2

  # >>> 3

  # >>> 4

  # >>> ----

  # >>> 从运行结果得出结论,当我们从内存中读取完迭代器所有的值后,内存就会被释放,不再循环输出。

  案例二:

  

iter_obj = (i for i in range(4))

  for i in iter_obj:

      print(i)

  print(=====)

  for i in iter_obj:

      print(i)

  # >>> 执行结果如下:

  # >>> 0

  # >>> 1

  # >>> 2

  # >>> 3

  # >>> =====

  # >>> 从运行结果得出结论,当我们从内存中读取完迭代器所有的值后,内存就会被释放,不再循环输出。

  迭代器 除了前文我们提到的 按需加载 ,可以提升我们的执行速度以外。

  还有另外一个原因,试想一下:如果我们的列表只有10个数据,那么读取的速度会很快。可能对资源(也就是我们的内存)占用的消耗不是很大;如果我们有一个成千上万甚至十万数据的列表,那么这些数据都要一次性的写入内存里,这么多的数据所消耗占用的资源必然会很大,甚至会撑爆我们的内存造成内存溢出,程序就会报错了。

  所以如果通过迭代器的方式,我们只需要用到一个数据就将一个数据扔到内存里并且被使用。这样既可以提高我们内存使用的效率,又可以减少我们内存的消耗。这也是我们平时使用迭代器的目的。

  到此这篇关于Python学习之迭代器详解的文章就介绍到这了,更多相关Python迭代器内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: