几种常见的迭代器

python中几种常见的迭代器(人生苦短,我用python)

​ 以下内容是我对python中几种常见的迭代器的理解,主要介绍了filter、map、reduce它们在python中的用法及案例。

一、filter
  1. filter:在python 2中filter是一个方法,但是在python 3中,filter是一个类,它主要用于过滤序列中的一些元素筛选元素

  2. filter的使用方法:

    filter(function, iterable):第一个参数是一个函数,第二参数是迭代对象,使用filter函数返回的结果为一个地址,我们需要通过迭代将地址中的元素取出来。

    # 找出里表中比3大的数;
    # 方法一:
    ages = [1, 2, 3, 4, 5]
    res = []
    for i in ages:
        if i > 3:
            res.append(i)
    print(res)
    # 运行结果:[4, 5]
    
    # 方法二:
    ages = [1, 2, 3, 4, 5]
    res = filter(lambda x: x > 3, ages)
    print(res)  #此时res中存的是filter返回的结果<filter object at 0x0000017786C37550>
    # len(res)  报错  迭代器返回的结果不能使用len求结果的长度
    
    # 此时我们如果想要得到res中保存得内容,就必须通过迭代
    # 01. 通过for循环
    for i in res:
        print(i)
        
    # 02.直接用list转换
    print(list(res))
    
    # 注:lsit也是可迭代的
    

    注意,当我们使用for循环将迭代器res中的内容取出来后,我们如果执行 print(list(res)),打印的结果为空,res中的内容已经被释放掉。

    总结:通过filter类方法,我们可以对一个序列进行过滤和筛选

二、map
  1. map类迭代器通常用于对一个序列进行相同的操作。比如,对序列同乘某个数或者,对列表内的网站进行统一修改时用map迭代器会非常的高效

  2. map的使用方法:

    map(function, iterable) 同样的,第一个参数是一个函数,第二个参数为迭代对象。

    # 将列表中的元素同乘2
    ages = [1, 2, 3, 4, 5]
    res = []
    for i in ages:
        i *= 2
        res.append(i)
    print(res)
    # 运行结果:[2, 4, 6, 8, 10]
    # 这个是常规方法,虽然能够达到最终的效果,但是不够简洁
    
    # 下面是使用map迭代器实现的:
    res = map(lambda x: x*2 ,ages)
    print(res)  
    # 如果直接打印res,我们可以发现,显示的是迭代器返回结果的地址:<map object at 0x0000013D42A87550>
    
    print(list(res))  
    # 运行结果:[2, 4, 6, 8, 10]
    # 同样都实现的目的,但是使用map更加简洁
    
三、reduce
  1. reduce 在python 2是一个内置函数,在python 3版本中被整合到了functools中了。reduce的主要功能是为了压缩运算

  2. reduce的使用方法:

    • 要使用reduce,我们必须要引入它所在的类文件,

      from functools import reduce
      
    • reduce(function, iterable, init) 前两个参数与filter和map的参数使用方法相同,第三个参数是迭代初始值,这个是我们人为给定的,根据要求给出即可即可。

      # 测试python是否为reduce的初始值设置默认值
      res = [1, 1, 2, 3, 4, 5, 6]
      print(reduce(lambda x, y: x + y, res))  # 在这里我没有设置初始值
      # 运行结果:22
      # 说明reduce初始值得默认值为0
      
  3. 案例:求出下面字典math的和。

    students = [
        {'id': 1001, 'name': '周伟',  'sex': None, 'verbal': 90, 'math': 90, 'tel': '13512345670'},
        {'id': 1002, 'name': '赵刚',  'sex': True, 'verbal': 56, 'math': 80, 'tel': '13512345678'},
        {'id': 1003, 'name': '李强',  'sex': True, 'verbal': 48, 'math': 70, 'tel': '13512345680'},
        {'id': 1004, 'name': '刘毅',  'sex': None, 'verbal': 92, 'math': 60, 'tel': '13512345688'},
        {'id': 1005, 'name': '孙坚',  'sex': True, 'verbal': 85, 'math': 50, 'tel': '13512345698'},
        {'id': 1006, 'name': '王小美',  'sex': False, 'verbal': 37, 'math': 40, 'tel': '13512345699'},
    ]
    
    def sums(x, y):
        return x+y["math"]
    print(reduce(sums, students, 0))   # 第三个参数表示x的初始值为0
    # 运行结果:390
    # 注意,这里的初始值要人为的设置,不然会报错  unsupported operand type(s) for +: 'dict' and 'int'
     
    print(reduce(lambda x, y: x+y["math"], students, 0))# 直接使用匿名函数
    # 运行结果:390
    

    常规方法就不展示了,大家可以自己去尝试一下。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值