一 迭代器

能被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)

执行

[root@node10 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)

执行

[root@node10 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)

执行

[root@node10 python]# python3 test.py t test.py

True

False

0

1

遍历迭代器

it = iter(range(10))

for i in it:

print(i)

执行

[root@node10 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)

执行

[root@node10 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

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)

执行

[root@node10 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)

执行

[root@node10 python]# python3 test.py

1

2

3

4

[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)

执行

[root@node10 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)

执行

[root@node10 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)

执行

[root@node10 python]# python3 test.py

[1, 2, 3, 4]

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

使用字符串拼接

lst=["5","4","9","9"]

res=''.join(lst)

print(res)

执行

[root@node10 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))

执行

[root@node10 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)

执行

[root@node10 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)

执行

[root@node10 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转换

执行

root@node10 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)))

执行

[root@node10 python]# python3 test.py

5499

5499

使用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)

执行

[root@node10 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)

执行

[root@node10 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)

执行

[root@node10 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)

执行

[root@node10 python]# python3 test.py

534

pythonmapiter_018.Python迭代器以及map和reduce函数相关推荐

  1. Python中的map和reduce函数简介

    1.从参数方面来讲: map()函数: map()包含两个参数,第一个是参数是一个函数,第二个是序列(列表或元组).其中,函数(即map的第一个参数位置的函数)可以接收一个或多个参数. reduce( ...

  2. python十九:map,filter,reduce函数

    # 处理序列中的每个元素,得到的结果是一个'列表',该'列表'元素个数及位置与原来一样 def map_practice(func, lt_num):lt_new = []for i in lt_nu ...

  3. Python中lambda、zip、map、reduce函数的使用

    一.lambda表达式 lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数.lambda所表示的匿名函数的内容应该是很简单的,如果复杂的话,干脆就重新 ...

  4. python3中map函数_python3中map()和reduce()函数

    Python内建了map()和reduce()函数. 现在,我们用Python代码实现: def f(x): return x * x r = map(f, [1, 2, 3, 4, 5, 6, 7, ...

  5. python lambda map reduce_简单了解python filter、map、reduce的区别

    这篇文章主要介绍了简单了解python filter.map.reduce的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python中有一些 ...

  6. Python中map和reduce函数?

    1.从参数方面来讲: map()函数: map()包含两个参数,第一个是参数是一个函数,第二个是序列(列表或元组).其中,函数(即map的第一个参数位置的函数)可以接收一个或多个参数. reduce( ...

  7. 【Python】利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456

    微信公众号 题目来源:[廖雪峰的官方网站-map/reduce] 利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456: from functo ...

  8. Python学习笔记——map和reduce实现str2float函数

    利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456: from functools import reducedef str2float(s) ...

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

    提起map和reduce想必大家并不陌生,Google公司2003年提出了一个名为MapReduce的编程模型[1],用于处理大规模海量数据,并在之后广泛的应用于Google的各项应用中,2006年A ...

最新文章

  1. 基于R的信用评分卡模型解析
  2. 设置Windows XP自动登录的两种方法
  3. 安装phpstudy之后发现80端口被占用
  4. Spring Beans 初始化流程分析
  5. 【MyBatis框架】SqlMapConfig剖析
  6. 【Java从0到架构师】Linux 基础知识、常用命令
  7. 网站导航(站点地图)
  8. Oracle数据库中dml提交,奇怪,ORACLE的触发器的DML操作,没有COMMIT,居然也能真正的提交掉???...
  9. 蓝牙技术|蓝牙音频LE Audio的技术特点
  10. 系统设计.如何设计一个秒杀系统(完整版)
  11. mac辅助功能授权无效
  12. 基于tensorflow和卷积神经网络的电影推荐系统的实现
  13. MySQL忘记/无root密码,强制修改root密码
  14. Oracle sql 按指定顺序产生序列号
  15. Warning: .config does not exists一生一芯
  16. Excel不够用,快试试这款企业报表工具
  17. python取元素_python 如何提取对象内的元素
  18. ultraedit编译java_在UltraEdit中编译和运行Java程序
  19. SAP MM模块简单介绍
  20. FreeModbus开源协议栈的移植和详解(三)- RTU协议代码分析

热门文章

  1. 写了个散列算法... 用来获取字符串的哈希. 超高效.10亿以下几乎无碰撞.
  2. 电脑开机出现英文“ERROR:System fan has failed”的错误提示
  3. CentOS下rsync数据同步备份
  4. Debian完全卸载清理MySQL服务器
  5. 查看unix和linux的HBA卡的WWN地址
  6. shell脚本备份MySQL
  7. 【MapReduce】MapReduce工作机制
  8. 【SQL】SELECT 语句
  9. 使用fdisk创建好了分区,但是在生成物理卷出现“Device /dev/sdb2 not found (or ignored by filtering).“解决方法
  10. SQL 2005数据库转为2000的终极解决方案