Python特性——列表生成器、生成器;迭代与迭代器

列表生成器
列表生成器是顾名思义是用来生成列表的方法,例如:

输入:[x*x for x in range(1,11) ]
输出:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
  1. 可以加上if判断对输入进行筛选
  2. 可以使用两层循环
  3. 和字典结合使用方便
#列表生成器可以与if结合
[x*x for x in range(1,11) if x%2==0  ]
#可以使用两层循环
[m+n for m in 'ABC'for n in 'XYZ']
#与字典结合方便
d={'X':'A','Y':'B','Z':'C'}
*运行结果*
[4, 16, 36, 64, 100]
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
['X=A', 'Y=B', 'Z=C']

生成器generator
列表生成器可以直接生成列表,但内存是有限的,列表容量有限;且有时会造成存储空间的浪费。因此生成器应运而生,它是一种边循环边计算的机制。

  1. 创建generator的第一种方法:将列表生成式的[ ]改为( ) ;打印generator的每一个元素可以不断调用next( )函数获得generator的下一个返回值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误;或者直接使用for循环
  2. 创建generator的第二种方法:类似于函数的构造方式,使用yield关键词。和函数不同的地方在于函数是顺序执行的,遇到return语句返回;而generator的yield类似于函数的return函数,每次遇到yield语句就返回,再次执行时从上次返回的yield语句处继续执行
    3.第一种产生方法
    使用for循环
    第二种生产方式

迭代和迭代器

如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)

请使用迭代查找一个list中最小和最大值,并返回一个tuple
def findMinAndMax(L):
  if len(L)==0:
    return(None,None)
  else:
    max=L[0]
    min=L[0]
    for n in L:
      if n>max:
         max=n
      elif n<min:
         min=n
    return (min,max)
if findMinAndMax([]) != (None, None):
    print('测试失败!')
elif findMinAndMax([7]) != (7, 7):
    print('测试失败!')
elif findMinAndMax([7, 1]) != (1, 7):
    print('测试失败!')
elif findMinAndMax([7, 1, 3, 9, 5]) != (1, 9):
    print('测试失败!')
else:
    print('测试成功!')

可以直接作用于for循环的数据类型有以下几种:
一类是集合数据类型,如list、tuple、dict、set、str等;

一类是generator,包括生成器和带yield的generator function。
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable
可以使用isinstance()判断一个对象是否是Iterable对象

>>> from collections import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
>>> isinstance('abc', Iterable)
True
>>> isinstance((x for x in range(10)), Iterable)
True
>>> isinstance(100, Iterable)
False

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。

因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
把list、dict、str等Iterable变成Iterator可以使用iter()函数
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143178254193589df9c612d2449618ea460e7a672a366000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值