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)
原文地址:https://www.cnblogs.com/jia-shu/p/14083440.html