zoukankan      html  css  js  c++  java
  • 迭代器和高阶函数

    一. 迭代器

    1. 什么是迭代器

    能被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator 迭代器是对象)

    2. 概念

    迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复都是局域上一次的结果而继续的,单纯的重复并不是迭代

    3. 特征

    并不依赖索引,而通过next指针(内存地址寻址)迭代所有数据,一次只取一个值,
    而不是一股脑的把所有数据放进内存,大大节省空间

    4. 可迭代性对象

    """如果一个对象中含有__iter__这个成员,说明该数据是可迭代性对象"""
    setvar = {"白金鸽","杨特","郝建康"}
    # 查看该对象中的成员,dir
    lst = dir(setvar)
    if '__iter__' in lst:
        print("该数据是可迭代性数据")
    print(lst)

    5. 迭代器

    '''

    for循环遍历时,底层利用迭代器,先把该数据变成迭代器,通过next地址next地址寻址的方式,找到该数据

    如果是迭代器,一定是可迭代器

    如果是可迭代对象,不一定是迭代器

    '''

    1.如何变成一个迭代器

    # it = iter(setvar)
    it = setvar.__iter__()
    lst = dir(it)
    print(lst)

    2.如何判断一个迭代器 __iter__ + __next__

    if "__iter__" in lst and "__next__" in lst:
        print("该数据是迭代器")

    3.如何调用一个迭代器

    """next调用时,是单向不可逆的过程,一条路走到黑"""
    # 方法一
    res = next(it)
    print(res)
    res = next(it)
    print(res)
    res = next(it)
    print(res)
    # res = next(it) error
    # print(res)

    4.重置迭代器

    it = iter(setvar)
    # res = next(it)
    res = it.__next__()
    print(res)
    
    # 方法二
    print("<=========>")
    for i in it:
        print(i)
    # next(it) error 单项不可逆的过程
    
    # 方法三
    print("<=========>")
    setvar = {"白金鸽","杨特","郝建康","于盛林","杨业","王娟娟","草配线","孟凡伟"}
    it = iter(setvar)  # setvar.__iter__()
    for i in range(8):
        print(next(it))
    View Code

    5.可以使用Iterator ,Iterable 来判断是否是迭代器或者可迭代对象

    from collections import Iterator , Iterable
    res = isinstance(it,Iterator) # True
    res = isinstance(it,Iterable) # True
    res = isinstance(setvar,Iterator) # False
    res = isinstance(setvar,Iterable) # True
    print(res)

    二 高阶函数 --- map

    map(func,Iterable): 处理数据
    功能:
        把Iterable中的数据一个一个的传递到func函数当中处理,处理之后的结果通过迭代器一个一个获取
    参数:
        func: 内置或者自定义函数
        Itreable: 可迭代性数据(容器类型数据 range对象 迭代器)
    返回值:
        迭代器
    
    
    单纯的调用map函数,不能立刻执行;
    通过调用迭代器,才能执行map中的函数体;
    调用一次迭代器,就运行一次map函数
    
    
    注意点  : 参数和返回值必不可少

    #
    (1) ["1","2","3","4"] => [1,2,3,4] lst = ["1","2","3","4"] lst_new = [] for i in lst: # print(int(i)) lst_new.append(int(i)) print(lst_new) 改写: it = map(int,lst) for i in it: print(i,type(i)) print(list(it))

    小练习:

    有个字典 dic = { 97 : "a" , 98 : "b" , 99 : 'c'} ,给与['a','b','c'] 返回 [97,98,99]
    # 方法一
    lst1 = []
    for k,v in dic.items():
        if v in lst:
            lst1.append(k)
    print(lst1)
    
    def func(n):
        for k,v in dic.items():
            dic_new[v] = k
            return dic_new[n]
    
    it = map(func,lst)
    print(next(it))
    print(next(it))

    三高阶函数 --- reduce

    reduce(func,Iterable): 计算数据
    功能:
        先把Iterable中的前两个数据拿出来,扔到func中做处理,得到一个结果,
        在拿当前结果和Iterable的下一个值在继续扔到func做计算
        以此类推
        直到最后返回结果
    参数:
        func: 自定义函数
        Iterable: 可迭代性对象(容器类型数据,range对象,迭代器)
    返回值:
        计算最后的结果

    小练习:

    # (1) [5,4,8,8] => 5488
    普通
    lst = [5,4,8,8]
    strvar = ''
    for i in lst:
        strvar += str(i)
    res = int(strvar)
    print(res , type(res) )
    
    # 使用reduce进行改造
    from functools import reduce
    def func(x,y):
        return x *10 + y
    lst = [5,4,8,8]
    res = reduce(func,lst)
    print(res',type(res))
    
    # lambda 改造
    print(reduce(  lambda x,y : x*10 + y  , lst))
    lst = [1,12,435,234,122,2]  => 过滤掉偶数,保留奇数
    lst = [1,12,435,234,122,2] 
    lst_new = []
    for i in lst:
        if i % 2 == 1:
            lst_new.append(i)
    print(lst_new)
    
    
    
    # 使用filter进行改造
    
    def func(n):
        if n % 2 == 1:
            return True
        else:
            return False
    
    it = filter(func,lst)
    lst = list(it)
    print(lst)

    # 使用lambda 进行改造
    print(list(filter( lambda n : True if n % 2 == 1 else False , lst )))

    三高阶函数 --- sorted 

    sorted(Iterable,reverse=False,key=函数)
    功能:
        排序数据
    参数:
        Iterable : 可迭代对象(容器类型数据 range对象 迭代器)
        reverse : 正序或者倒叙 reverse = False (从小到大)
        key      : 内置或者自定义方法
    返回值:
        排序后的数据(列表)

    1.从小到大

    lst = [-9,18,13,16,99,87]
    res = sorted(lst)
    print(res)

    2.从大到小

    res = sorted(lst,reverse=True)
    print(res)

    3.按照绝对值,内置函数进行排序

    lst = [-99,-9,-100,1]
    # print(sorted(lst))
    res = sorted(lst,key=abs)
    """
    sort 和 sorted的区别:
    [sorted] 推荐
    1.sorted 可以对所有的容器类型数据排序
    2.返回一个新的列表
    [sort]
    1.sort 只能对列表这一个类型进行排序
    2.针对于原有的列表进行排序
    """
  • 相关阅读:
    覆盖索引和联合索引
    docker是个啥?
    golang--解决邮件发送标题乱码问题
    爬虫-爬取美少女壁纸
    漫谈--ssh协议-中间人攻击
    golang--常用的字符串操作
    干支纪年
    JS实现纯前端将数据导出Excel两种方式亲测有效
    猴子吃香蕉-Java岗位面试题
    content:"26A1"特殊字符和图标记录
  • 原文地址:https://www.cnblogs.com/whc6/p/14083417.html
Copyright © 2011-2022 走看看