zoukankan      html  css  js  c++  java
  • 10.迭代器与高阶函数

    迭代器与高阶函数

    一.迭代器

    # 迭代器
    """
    迭代器:
        能被next()函数调用,并且不断返回下一个值的对象叫做迭代器(Iterator,迭代器也是对象)
    概念:
        迭代器是迭代取值的工具,迭代是一个重复的过程,每次重复都基于上一次结果而继续
        单纯的重复并不是迭代
    特征:
        并不依赖索引,而是通过next指针(内存地址寻址)方式迭代所有数据,
        每次只取一个值,并不是一次性把所有数据放进内存,大大节省空间
    """
    # 一.可迭代对象   (容器类型数据,range对象,迭代器)
    """
    如果一个对象中含有__iter__这个成员,说明该对象是可迭代对象
    dir:
        查看对象中的成员,返回的是一个列表
    """
    # 二.迭代器
    """
    如果一个对象中含有__iter__和__next__这两个成员,说明该对象是迭代器
    """
    strvar="生死看淡"
    # 1.如何把一个对象变成一个迭代器 iter()
    it=iter(strvar)
    # 2,如何判断一个对象是不是迭代器
    lst=dir(it)
    if "__iter__" in lst and "__next__" in lst:
        print("该数据是迭代器")
    # 3.如何调用迭代器
    """
    next()函数调用时,是单向不可逆的过程,一条路走到黑,直到没有可迭代数据报错
    """
    # 方法一:使用next()调用,一次调取一个数据
    print(next(it)) #生
    print(next(it)) #死
    print(next(it)) #看
    print(next(it)) #淡
    # print(next(it)) #报错 StopIteration停止迭代
    
    # 方法二:使用for遍历迭代器
    it=iter(strvar) #重置迭代器
    for i in it:
        print(i)
    
    # 方法三:使用for和next(),提取一部分迭代器中的数据
    it=iter(strvar) #重置迭代器
    for i in range(3): #调用前三个数据
        print(next(it))
    
    # 方法四:通过list,tuple,set强转迭代器获取数据
    it=iter(strvar) #重置迭代器
    print(list(it))
    it=iter(strvar) #重置迭代器
    print(tuple(it))
    it=iter(strvar) #重置迭代器
    print(set(it))    
        
    # 4.可以使用Iterator(迭代器),Iterabal(可迭代对象) 判断对象是什么数据
    from collections import Iterator,Iterable   #先导入函数
    res=isinstance(strvar,Iterator) #False 不是迭代器
    res=isinstance(strvar,Iterator) #False 不是迭代器
    res=isinstance(it,Iterator) #True 是迭代器
    res=isinstance(it,Iterable) #True 是可迭代对象
    print(res)
    
    # 三.自定义迭代器
    """
    斐波那契数列
    """
    class Fib(object):
    
        def __init__(self, max):
            self.max = max
            self.n, self.a, self.b = 0, 0, 1
    
        def __iter__(self):
            return self
    
        def __next__(self):
            if self.n < self.max:
                r = self.b
                self.a, self.b = self.b, self.a + self.b  # 这次结果作为下次的初始值
                self.n = self.n + 1
                return r
            raise StopIteration()
    
    
    for i in Fib(10):
        print(i)
    
    

    二.高阶函数

    ​ 定义:能够把函数当成参数传递的就是高阶函数(map,reduce,filter,sorted)

    1.map(func,Iterable):处理数据
    """
    功能:
        把Iterable中的数据一个一个的传递到func函数中进行处理,处理的结果通过迭代器一个一个的获取  
    参数:
        func:内置函数或自定义函数
        Iterable:可迭代性数据(容器类型数据,range对象,迭代器)
    返回值:    迭代器
    执行过程:
        单纯的调用map函数,不能立即执行;通过调用迭代器,才能执行map中的函数;调用一次,执行一次
    """
    # 1.把["1","2","3"]变成[1,2,3]
    lst=["1","2","3"]
    it=map(int,lst) #不调用不执行,使用的是内置函数
    print(list(it))    #调用才执行map函数
    
    # 2.把["1","2","3"]变成[5,10,15]
    lst=["1","2","3"]
    def func(n):    #自定义函数必须有参数和返回值
        return int(n)*5
    it=map(func,lst)    #使用自定义函数
    print(list(it))
    
    
    2.reduce(func,Iterable):计算数据
    """
    功能:
        先把Iterable中前两个数据拿出来,扔到func函数中进行处理,得出一个结果,
        再把得到的结果和Iterable中下一个数据,继续扔到func函数处理
        以此类推.....直到返回结果
    参数:
        func:内置函数或者自定义函数
        Iterable:可迭代性数据(容器类型数据,range对象,迭代器)
    返回值:    计算最后的结果
    注意:
        使用reduce函数时,必须先导入reduce函数
        from functools import reduce
    """
    # 1.[1,2,3,4]=>1234
    from functools import reduce
    lst=[1,2,3,4]
    # 方法一:
    def func(x,y):
        return x*10 + y
    res=reduce(func,lst)
    print(res)
    # 方法二:使用lambda
    print(reduce(lambda x,y : x*10 + y , lst))
    
    
    3.filter(func,Iterable):过滤数据
    """
    功能:
        把Iterable中的数据通过func函数返回值控制数据是否保留
        return True 保留, return False 舍弃
    参数:
        func:自定义函数
        Iterable:可迭代型数据(容器类型数据,range对象,迭代器)
    返回值:    迭代器
    """
    # 过滤掉偶数,保留奇数
    lst=[1,22,3,34,65,3,52,33,54]
    def func(n):
        return n%2==1
    it=filter(func,lst)
    print(list(it))
    
    # 使用lambda改造
    print(list(filter(lambda n:n%2==1,lst)))
    
    
    4.sorted(Iterable,reverse=False,key=func):排序
    """
    功能: 排序
    参数:
        Iterable:可迭代型数据(容器类型数据,range对象,迭代器)
        reverse:是否反转,默认为False->代表正序,改成True->代表倒序
        key     :指定函数,内置或者自定义函数
    返回值: 排序后的数据,是一个列表
    """
    # sort和sorted的区别
    """
    sort:
        1.只能对列表这一个数据类型进行排序
        2.针对原有的列表进行排序
    sorted:
        1.可以对所有的容器类型数据进行排序(字典只取键)
        2.返回一个新的列表
    """
    # 1.从小到大
    strvar="23647356"
    res=sorted(strvar)
    print(res)
    # 2.从大到小
    lst=[22,4,1,55,3,-6,-23]
    res=sorted(lst,reverse=True)
    print(res)
    
    # 3.使用内置函数,按照绝对值大小排序
    tup=(-21,2,4,12,-4,-343)
    res=sorted(tup,key=abs)
    print(res)
    
    # 4.自定义函数排序(按余数排序)
    set1={12,33,5,-34,54,37}
    def func(n):
        return n%10
    res=sorted(set1,key=func)
    print(res)
    
    # 5.按字母排序
    """按照ASCII编码进行排序,默认从小到大"""
    strvar="32dsfjl343sdf325jdklsJHd34j"
    res=sorted(strvar)
    print(res)
    
    # 6.对汉字排序(无规律可循)
    lst=["呵呵","奥迪","光头强",'热']
    res=sorted(lst)
    print(res)
    
  • 相关阅读:
    darknet yolo 使用gpu
    Application of Opposition-Based Reinforcement Learning in Image Segmentation
    图像质量评估 (IQA) 论文笔记: Deep Neural Networks for No-Reference and Full-Reference Image Quality Assessment
    论文笔记:DEEP LEARNING FOR MONAURAL SPEECH SEPARATION
    python函数中的参数*args和**kwargs的含义和用法
    论文笔记:DualCNN(结构和细节分别训练)
    pytorch中为Module和Tensor指定GPU
    Pytorch中的torch.gather函数的含义
    Django(其二)
    第六章Django
  • 原文地址:https://www.cnblogs.com/jia-shu/p/14083440.html
Copyright © 2011-2022 走看看