python迭代器和生成器 案例

python推导式

for 后面是可迭代类型就可以

##列表推导式(list)
[输出表达式 for 临时变量 In iterable]
*[输出表达式 for 临时变量 In iterable if 条件表达式(条件成立的东西输出结果)] *
[输出表达式 for 临时变量 In iterable for 临时变量 In iterable if 条件表达式(条件成立的东西输出结果)]
[输出表达式1 if条件 else 输出表达式2 for 临时变量 In iterable for 临时变量 In iterable if 条件表达式(条件成立的东西输出结果)]
python推崇简单明了—对于复杂的内容封装成函数

#找出30以内能被3整除的数
a=[0-29]
c=[i for i in range(30) if i%3==0]
print(c)
a=[0-29]
c=[i*i for i in range(30) if i%3==0]
print(c)

从名字里找出符合条件的
传统方法

result=[]
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
 ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva', 'Elven']]
for item in names:
    for i in item:
        if i.count('e')==2:
            print(i)
            result.append(i)
print(result)

列表推导式方法

result=[i for item in names for i in item  if i.count('e')==2]
print(result)

如果一个数能被2整除 且能被四整除返回字符串类型 不能被四整除返回 浮点类型
列表推导方法

c=[str(i)  if i%4==0 else float(i)  for i in range(100) if i%2==0 ]
print(c)

传统方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

for x in range(6):
    if x%2==0:
        for y in range(6):
            if y%2==1:
                result.append((x,y))
print(result)
result=[(x,y) for x in range(6) if x%2==0 for y in range(6) if y%2==1]
print(result)

##字典推导式(dict){key :value if 条件 else value2 for 临时变量 In iterable if 条件表达式}

#列表
[i for i in x if expres]
#字典
{key:value for item in obj}
dic={'a':1,'b':2,'c':3,'d':4}
result={key:dic[key] for key in dic if key!='a'}
print(result)

##集合推导式(set)set会去重
练习题
在这里插入图片描述

q3={'a':10,'b':34}
result={value:key for key,value in q3.items()}
print(result)
result={}
for key,value in q4.items():
    result[key.lower()]=q4.get(key.lower(),0)+q4.get(key.upper(),0)
print(result)
q4 = {'B': 3, 'a': 1, 'b': 6, 'c': 3, 'A': 4}
result = {key.lower(): q4[key.lower()]+q4[key.upper()] if key.lower() in q4 and key.upper() in q4 else q4[key] for key in q4}
print(result)

容器

容器:把多个元素组织在一起的数据结构,in,not in

迭代器

可迭代对象:可返回迭代对象 (面试最佳:可迭代对象定义了一个_iter_方法,_iter_方法返回一个迭代器)

如何判断对象是不是迭代器

  1. iter,next(y),y.next()
  2. isinstance(obj,Iterable)
  3. from collections.abc import Iterable
    print(isinstance(‘avb’,Iterable))
    print(isinstance(a,Iterable))

迭代器特点----不占空间 惰性求值 lazy

  1. 将可迭代对象通过iter() ==》获取迭代器
  2. 只能通过next 向后取值,不能通过下标随机取值,不能往回去取值
  3. 迭代器所有类型的 列表 、元组类型
  4. 有状态==》内部会记录一些数据 告诉我们取到几了 不存储我们所有数据 只存储当前的状态和方法
  5. 生成无限序列 10~+
  6. 在这里插入图片描述

在这里插入图片描述

生成器

生成器是特殊的迭代器
生成器表达式
生成器函数 => 定义了一个函数,在这个函数中有yield关键字
生成器函数 => 调用该函数会创建一个生成器
在这里插入图片描述
产生字符串需要cup疯狂计算
数据超过缓冲区大小就会写入磁盘
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
面试问题:
(1)可迭代对象和迭代器的区别?

  • 面试官更想听 实战 应用层面的东西
  • 区别 各自的优缺点+应用场景

(2)迭代器和生成器的区别?

  • 生成器是一种特殊的迭代器
  • 迭代器 =》 定义一个类 =》 自己去实现__iter__,__next__方法
  • 生成器 =》 生成器函数(yield自动生成__iter__,__next__方法),生成器表达式
    为什么要使用生成器?因为效率。
    使用生成器表达式取代列表推导式可以同时节省 cpu 和 内存(RAM)。
    如果你构造一个列表(list)的目的仅仅是传递给别的函数,
    比如 传递给tuple()或者set(), 那就用生成器表达式替代吧!
    生成器表达式:类似于列表推导,只不过是把一对大括号[]变换为一对小括号()。但是,生成器表达式是按需产生一个生成器结果对象,要想拿到每一个元素,就需要循环遍历。
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值