python迭代器和生成器

可迭代对象

  • 可以更新迭代实实在在的值
  • 内部含有'__iter__'方法
  • 优点:操作方法多,操作灵活,直观
  • 缺点:占用内存

 

迭代器

  • 可以更新迭代的一个工具
  • 内部含有'__iter__'且含有'__next__'方法
  • 优点:节省内存,惰性机制
  • 缺点:不直观,操作慢,操作方法单一,不走回头路

 

生成器

  • python社区,生成器与迭代器看成是一种。生成器的本质就是迭代器。唯一的区别:生成器是我们自己用python代码构建的数据结构。迭代器都是提供的,或者转化得来的。
  • 获取生成器的三种方式:
    • 生成器函数
    • 生成器表达式
    • python内部提供的一些
# 生成器函数 yield
def func():
    print(1)
    print(2)
    yield 3
    a = 1
    b = 2
    c = a+b
    yield 4

ret = func()
print(next(ret))
...

# 一个next对应一个yield
# yield from
def func():
    l1 = [1,2,3,4,5]
    l2 = ['a','b','c']
    yield from l1
    yield from l2

ret = func()
for i in ret:
    print(i)    # 1,2,3,4,5,a,b,c 不会进行交替输出

# 将l1列表变成迭代器返回

 

生成器表达式-列表推导式

  • 用一行代码构建一个复杂有规律的列表
  • 列表推导式
    • 循环模式 [变量 for 变量 in iterable]
    • 筛选模式[变量 for 变量 in iterable if 条件]
# 从python1期到python100期写入列表lst
lst = [f'python{i}' % i for i in range(1,101)]

# 三十以内可以被三整除的数
lst = [i for i in range(30) if i % 3 is 0]

# 找到嵌套列表中名字含有两个‘e’的所有名字
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
         ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]

lst = [name for lst in names for name in lst if name.count('e') >= 2]

# 拆分写法
lst = []
for lst in names:
    for name in lst:
        if name.count('e')>=2
            lst.append(name)

 

生成器表达式

同列表推导式只是将 [] 换成 ()  生成的是一个生成器

 

字典推导式

# 根据名字应该也能猜到,推到出来的是字典
lst1 = ['jay','jj','meet']
lst2 = ['周杰伦','林俊杰','郭宝元']
dic = {lst1[i]:lst2[i] for i in range(len(lst1))}
print(dic)

 

集合推导式

lst = [1,2,3,-1,-3,-7,9]
s = {abs(i) for i in lst}
print(s)

 

你可能感兴趣的:(python,#,python函数)