018.Python迭代器以及map和reduce函数

一 迭代器

  • 能被next进行调用,并且不断返回下一个值的对象
  • 特征:迭代器会生成惰性序列,它通过计算把值依次的返回,一边循环一边计算而不是一次性得到所有数据
  • 优点:需要数据的时候,一次取一个,可以大大节省内存空间.而不是一股脑的把所有数据放进内存.
  • 可以遍历无限量的数据
  • next调用迭代器时,方向是单向不可逆的.

1.1 可迭代性对象

__iter__ 如果这个数据类型含有__iter__ 方法 我们就说他是可迭代对象

dir 获取当前数据内置的方法和属性.

setvar = {1,2,"abc",54,"dd"}
for i in setvar:
        print(i)
lst = dir(setvar)
print(lst)
print("__iter__" in lst)

执行

dd
1
2
54
abc
[‘__and__‘, ‘__class__‘, ‘__contains__‘, ‘__delattr__‘, ‘__dir__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__gt__‘, ‘__hash__‘, ‘__iand__‘, ‘__init__‘, ‘__init_subclass__‘, ‘__ior__‘, ‘__isub__‘, ‘__iter__‘, ‘__ixor__‘, ‘__le__‘, ‘__len__‘, ‘__lt__‘, ‘__ne__‘, ‘__new__‘, ‘__or__‘, ‘__rand__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__ror__‘, ‘__rsub__‘, ‘__rxor__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__sub__‘, ‘__subclasshook__‘, ‘__xor__‘, ‘add‘, ‘clear‘, ‘copy‘, ‘difference‘, ‘difference_update‘, ‘discard‘, ‘intersection‘, ‘intersection_update‘, ‘isdisjoint‘, ‘issubset‘, ‘issuperset‘, ‘pop‘, ‘remove‘, ‘symmetric_difference‘, ‘symmetric_difference_update‘, ‘union‘, ‘update‘]
True

1.2 迭代器

可迭代型数据:可以遍历的数据
for 循环在遍历集合的时候,在底层用next方法实现的集合的调用

区别

可迭代对象 -> 迭代器  不可直接调用 -> 可直接调用的过程

如何变成迭代器

(1) iter (2)__iter__()  #这两个方法可以变成迭代器

如何遍历迭代器?

(1) next (2)__next__()

如何判断迭代器?

__iter__ __next__ 如果含有这两个方法,就说他是迭代器

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

setvar = {1,2,"abc",54,"dd"}
it = iter(setvar)
lst = dir(it)
print(lst)
print(‘__iter__‘ in lst and ‘__next__‘ in lst)
res = next(it)
print(res)
res = next(it)
print(res)
res = next(it)
print(res)
res = next(it)
print(res)
res = next(it)
print(res)

执行

[[email protected] python]# python3 test.py t test.py
[‘__class__‘, ‘__delattr__‘, ‘__dir__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__gt__‘, ‘__hash__‘, ‘__init__‘, ‘__init_subclass__‘, ‘__iter__‘, ‘__le__‘, ‘__length_hint__‘, ‘__lt__‘, ‘__ne__‘, ‘__new__‘, ‘__next__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘]
True
1
2
dd
54
abc

1.3 判断是否是可迭代对象或者迭代器

  • from .. import 从哪个模块 ... 引入 ...东西
  • 从collections模块 引入 Iterator类型(迭代器类型) Iterable(可迭代对象)

判断集合的迭代属性

from collections import Iterator,Iterable
# 判断集合的迭代属性
setvar = {1,2,"abc",54,"dd"}
res = isinstance(setvar,Iterable)
print(res)
res = isinstance(setvar,Iterator)
print(res)

执行

[[email protected] python]# python3 test.py t test.py
True
False

判断range对象的迭代属性

from collections import Iterator,Iterable
# 1.判断集合的迭代属性
setvar = {1,2,"abc",54,"dd"}
print(isinstance(range(10),Iterable)) # True
print(isinstance(range(10),Iterator)) # False

#使用iter方法,可以把一个可迭代对向变成一个迭代器
it = iter(range(10))
res = next(it)
print(res)
res = next(it)
print(res)

执行

[[email protected] python]# python3 test.py t test.py
True
False
0
1

遍历迭代器

it = iter(range(10))
for i in it:
        print(i)

执行

[[email protected] python]# python3 test.py
0
1
2
3
4
5
6
7
8
9

1.4 迭代器的越界现象错误

it = iter(range(10))
for i in it:
        print(i)res = next(it)print(res)

执行

[[email protected] python]# python3 test.py
0
1
2
3
4
5
6
7
8
9
Traceback (most recent call last):
  File "test.py", line 4, in <module>
    res = next(it)
StopIteration

StopIteration 是迭代器的越界现象错误,是因为没有值了

1.5 重置迭代器

it = iter(range(10))
# for i in it:
        # print(i)

# 使用for 和 next 搭配来遍历迭代器for i  in range(3):
        res = next(it)
        print(res)

执行

[[email protected] python]# python3 test.py
0
1
2

二  高阶函数

  • 能够把函数当成参数传递的就是高阶函数 (map reduce sorted filter)

2.1 map(func,iterable)

功能:把iterable里面的数据一个一个的拿出来,扔到func当中进行处理,然后把处理之后的结果放到迭代器当中,最终返回迭代器
参数:
    func:自定义函数 或者 内置函数
    iterable:可迭代对象(常用:容器类型数据,range对象,迭代器)
返回值:
    迭代器

["1","2","3","4"] 变成整型 [1,2,3,4]

listvar =  ["1","2","3","4"]
lst = []
for i in listvar:
        print(i,type(i))     #打印数值并输出类型
        res = int(i)         #强制转换成整型
        lst.append(res)      #塞进空列表
print(lst)

执行

[[email protected] python]# python3 test.py
1 <class ‘str‘>
2 <class ‘str‘>
3 <class ‘str‘>
4 <class ‘str‘>
[1, 2, 3, 4]

使用map实现

  • 每次从listvar当中拿出一个值 ,
  • 放到int函数当中进行强转,处理后的结果扔到迭代器当中
  • 依次类推,直到所有数据拿完为止.
listvar =  ["1","2","3","4"]
from collections import Iterator,Iterable
it = map(int,listvar)
print(isinstance(it,Iterator))
print(isinstance(it,Iterable))
#next取值
res = next(it)
print(res)
res = next(it)
print(res)
res = next(it)
print(res)
res = next(it)
print(res)

执行

[[email protected] python]# python3 test.py
True
True
1
2
3
4

使用for循环取值

listvar =  ["1","2","3","4"]
from collections import Iterator,Iterable
it = map(int,listvar)
print(isinstance(it,Iterator))
print(isinstance(it,Iterable))
for i in it:
        print(i)

执行

[[email protected] python]# python3 test.py
True
True
1
2
3
4

list类型强转

使用list强转迭代器可以瞬间拿到迭代器中所有数据

listvar =  ["1","2","3","4"]
from collections import Iterator,Iterable
it = map(int,listvar)
lst = list(it)
print(lst)

执行

[[email protected] python]# python3 test.py
[1, 2, 3, 4]

[“5”,“4”,“9”,“9"] 转换为5499

使用字符串拼接

lst=["5","4","9","9"]
res=‘‘.join(lst)
print(res)

执行

[[email protected] python]# python3 test.py
5499

[1,2,3,4] 转为[2,4,6,8]

lst = []
for i in [1,2,3,4]:
        res = i * 2
        lst.append(res)
print(lst)

使用map

如果使用自定义方法,切记要加上return 返回值

from collections import Iterator,Iterable
lst = [1,2,3,4]
def func(n):
        return n * 2
it = map(func,lst)
print(isinstance(it,Iterator))
print(list(it))

执行

[[email protected] python]# python3 test.py
True
[2, 4, 6, 8]

{97:‘a‘,98:‘b‘,99:‘c‘}   [‘a‘,‘b‘,‘c‘] =>[97,98,99]

打印出键

dic = {97:"a",98:"b",99:"c"}
for i in dic:
        print (i)

执行

[[email protected] python]# python3 test.py
97
98
99

使用item打印键值对,并反转

dic = {97:"a",98:"b",99:"c"}
dic2={}
for a,b in dic.items():
        dic2[b] =a
print(dic2)

执行

[[email protected] python]# python3 test.py
{‘a‘: 97, ‘b‘: 98, ‘c‘: 99}

正常顺序

使用map

lst = [‘a‘,‘b‘,‘c‘]
def func(n):
        dic = {97:"a",98:"b",99:"c"}
        dic2={}
        for a,b in dic.items():
                dic2[b] =a
        return dic2[n]
it = map(func,lst)      #func是自定义函数,lst是可迭代对象
print (list(it))        #list(it)强制list转换

执行

[email protected] python]# python3 test.py
[97, 98, 99]

2.2 reduce函数

reduce(func,iterable)
功能:
    计算
    首先把iterable 当中的两个值拿到func当中进行运算,计算的结果在和iterable中的第三个值
    拿到func中计算,依次类推.返回最终的结果
参数:
    func 自定义函数 或者 内置函数
    iterable 可迭代对象(常用:容器类型数据 range对象 迭代器)
返回值:
    最终的计算结果

[5,4,9,9] 转换为5499

使用上个方式不能成功

lst=[5,4,9,9]
res=‘‘.join(lst)
print(res)

执行报错

先取出转为字符串类型,合并在转

strvar = ‘‘
for  i in [5,4,9,9]:
        strvar += str(i)
print(strvar,type(strvar))
print(int(strvar),type(int(strvar)))

执行

[[email protected] python]# python3 test.py
5499 <class ‘str‘>
5499 <class ‘int‘>

使用reduce实现

逻辑实现

5*10 +4 = 54
54*10+9 = 549
549*10+9 = 5499

普通示例

lst = [5,4,9,9]
it = iter(lst)
res1 = next(it)
res2 = next(it)
total = res1 * 10 + res2
print(total)

for i in it:
        #54
        # 54 * 10 + 9 = 549
        # 549 * 10 + 9 = 5499
        total = total * 10 + i
print(total)

执行

[[email protected] python]# python3 test.py
54
5499

reduce实现

from functools import reduce
def func(x,y):
        return x*10 + y
lst = [5,4,9,9]
res = reduce(func,lst)
print(res)

执行

[[email protected] python]# python3 test.py
5499

实现过程

先把列表中5和4拿出来放到func函数中用x,和 y来接收参数
x*10+y  => 5*10+4 =54
第二次 拿54 和 9两个值扔到func当中进行运算
x*10+y  => 54 * 10 + 9 => 549
第三次 拿549 和 9 两个值扔到func当中进行运算
x*10+y => 549 * 10 + 9 => 5499
到此所有计算完毕 ,返回5499

"534" => 534 不使用int强转实现

from functools import reduce
strvar = "534"
def func(x,y):
        return x*10 + y   这里变成字符串拼接,而不是一个数字计算

res = reduce(func,list(strvar))
print(res)

执行

[[email protected] python]# python3 test.py
555555555535555555555355555555553555555555535555555555355555555553555555555535555555555355555555553555555555534

正确方式

from functools import reduce
strvar = "534"
def func(x,y):
        return x*10 + y

# res = reduce(func,list(strvar))
# print(res) error

def func2(n):
        dic = {‘0‘:0,‘1‘:1,‘2‘:2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9} #定义一个字典,定义字符串和对应键值对
        return dic[n]     #遇到对应字符串的键,返回该键的值

it = map(func2,"534")     #相当于吧字符串迭代取出,放进func执行
# print(list(it))         #这个使用list强转就是[5,3,4]
res = reduce(func,it)     #取出it的迭代数据,使用func进行计算
print(res)

执行

[[email protected] python]# python3 test.py
534

原文地址:https://www.cnblogs.com/zyxnhr/p/12285770.html

时间: 2024-09-30 15:43:31

018.Python迭代器以及map和reduce函数的相关文章

【python】filter,map和reduce函数介绍

filter(function, iterable)map(function, iterable)reduce(function, sequence) filter将 function依次作用于iterable的每个元素,如果返回值为true, 保留元素,否则从iterable里面删除.function必须返回是一个bool类型的函数.例如: def test(x): return (x > 3) filter(test, [1, 2, 3, 4, 5]) =====> [4, 5] map将

Python自学笔记-map和reduce函数(来自廖雪峰的官网Python3)

感觉廖雪峰的官网http://www.liaoxuefeng.com/里面的教程不错,所以学习一下,把需要复习的摘抄一下. 以下内容主要为了自己复习用,详细内容请登录廖雪峰的官网查看. Python内建了map()和reduce()函数. 我们先看map.map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回. 举例说明,比如我们有一个函数f(x)=x2,要把这个函数作用在一个list [1, 2, 3,

Python中的map与reduce函数简介

1.从参数方面来讲: map()函数: map()包含两个参数,第一个是参数是一个函数,第二个是序列(列表或元组).其中,函数(即map的第一个参数位置的函数)可以接收一个或多个参数. reduce()函数: reduce() 第一个参数是函数,第二个是 序列(列表或元组).但是,其函数必须接收两个参数. 2.从对传进去的数值作用来讲: map()是将传入的函数依次作用到序列的每个元素,每个元素都是独自被函数"作用"一次:(请看下面的栗子) reduce()是将传人的函数作用在序列的第

python练习之map()和reduce()函数

利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字.输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']: 1 def normalize(name): 2 name=name.lower() 3 name=name[0].upper()+name[1:] 4 return name 5 6 7 8 9 10 # 测试: 11 L1 = ['adam', 'LISA', 'barT'] 12 L2 = l

map和reduce函数的使用

map和reduce函数是定义在Array中的两个方法,可用于提高处理数组的性能和简化代码. 关于它们的概念,参考Google这篇大名鼎鼎的论文"MapReduce: Simplified Data Processing on Large Clusters". map map函数是一个高阶函数,它会调用传入的函数来隐式的处理Array中的每一个元素,因此当我们确定好需要对数组中的每个元素进行的操作时,可先定义好处理的方法, 然后在通过map函数将定义好的函数作为参数传进去,这样浏览器就

Python中map和reduce函数

①从参数方面来讲: map()函数: map()包含两个参数,第一个是参数是一个函数,第二个是序列(列表或元组).其中,函数(即map的第一个参数位置的函数)可以接收一个或多个参数. reduce()函数: reduce() 第一个参数是函数,第二个是 序列(列表或元组).但是,其函数必须接收两个参数. ②从对传进去的数值作用来讲: map()是将传入的函数依次作用到序列的每个元素,每个元素都是独自被函数"作用"一次:(请看下面的栗子) reduce()是将传人的函数作用在序列的第一个

python的map和reduce函数

map函数时python的高级内置函数 语法为:map(function, iterable, ...) 参数:function -- 函数iterable -- 一个或多个序列 将function作用于iterable序列中的每一个元素,并将调用的结果返回 主要是为了并行运算,非常高效 1. 一个输入参数,输入为列表 # 1. 一个参数 def map_func(x): res = x**2 return res a1 = map(map_func, [1,2,3]) #直接返回的是objec

Python里的map、reduce、filter、lambda、列表推导式

Map函数: 原型:map(function, sequence),作用是将一个列表映射到另一个列表, 使用方法: def f(x): return x**2 l = range(1,10) map(f,l) Out[3]: [1, 4, 9, 16, 25, 36, 49, 64, 81] Reduce函数 原型:reduce(function, sequence, startValue),作用是将一个列表归纳为一个输出,使用方法: def f2(x,y): return x+y reduce

(转)Python函数式编程——map()、reduce()

转自:http://www.jianshu.com/p/7fe3408e6048 1.map(func,seq1[,seq2...]) Python 函数式编程中的map()函数是将func作用于seq中的每一个元素,并用一个列表给出返回值.如果func为None,作用通zip().当seq只有一个时,将func函数作用于这个seq的每一个元素上,得到一个新的seq. 举个例子来说明,(假设我们想要得到一个列表中数字%3的余数,那么可以写成下面的代码): >>> print map(la