万事开头难

迭代器和高阶函数

一. 迭代器

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.针对于原有的列表进行排序
"""
posted @ 2020-12-03 22:43  Bo7-w  阅读(81)  评论(0编辑  收藏  举报