python3迭代器
一、前提
1.dir()函数
dir()函数带参数时,返回参数的属性和方法列表;不带参数时,返回当前范围内变量、方法和定义的类型列表
# dir(参数):带参数,返回参数的属性和方法
s = ''
print(dir(s))
print(dir([]))
2.双下法
双下法:带双下划线的方法。双下很少被直接调用,一般通过其它语法触发效果
l1 = [2, 1]
l2 = [1, 2]
print(l1 + l2) # l1+l2 -> l1.__add__(l2),通过python解释器转化
print(l1.__add__(l2))
二、可迭代协议
1.可迭代协议:只要含有__iter__方法,就是可迭代的
2.判断
# 方法1,判断是否含义__iter__方法
l1 = list(range(10))
res = '__iter__' in dir(l1)
if res:
print('l1,可迭代')
else:
print('l1,不可迭代')
# 方法2,通过导入模块
from collections import Iterable, Iterator # from collections import Iterable 被弃用 s = 'Hello, World!'
res = isinstance(s, Iterable)
if res:
print('s,可迭代')
else:
print('s,不可迭代')
三、迭代器协议
1.迭代器协议:含有__iter__和__next__方法,就是迭代器
2.获取迭代器
li = list(range(5))
iterator = li.__iter__() # __iter__()方法的返回值,就是迭代器,将可迭代变成迭代器
print(iterator)
3.判断
# 方法1,通过__iter__和__next__方法判断
li = list(range(-5, 0))
# li = list(range(-5, 0)).__iter__() # list不是迭代器,但list.__iter__()是迭代器
_iter = '__iter__' in dir(li)
_next = '__next__' in dir(li)
if _iter and _next:
print("li,是迭代器")
else:
print('li,不是迭代器')
# 方法2,通过导入模块
from collections.abc import Iterator
li = list(range(10))
if isinstance(li, Iterator):
print('l1,是迭代器')
else:
print('li,不是迭代器')
4.遍历
1)__next__
"""
__next__()方法
只要迭代器才有__next__()方法
__next__()方法,从迭代器中一个一个取值 """
l1 = list(range(10, -5, -1))
count = 0
iterator = l1.__iter__()
while count < 5:
count += 1
print(iterator.__next__()) # 输出前五个元素
print('>>>', iterator.__next__()) # 输出第六个元素
2)for循环
"""
for循环1
对象是可迭代,但不是迭代器
使用for循环,实质是通过for循环创建一个迭代器
所以,每次使用for循环都会创建一个新的迭代器 """
l1 = list(range(10, -5, -1))
count = 0
for i in l1(): # l1是可迭代对象,不是迭代器
count += 1
print(i)
if count > 5:
break
for i in l1(): # for循环内部创建一个新的迭代器
print(i)
"""
for循环2
对象是迭代器
使用for循环,不用通过for循环内部另创一个迭代器
所以,每次使用for循环使用的都是同一个迭代器 """
l1 = list(range(10, -5, -1))
count = 0
iterator = l1.__iter__()
for i in iterator: # iterator是迭代器
count += 1
print(i)
if count > 5:
break
for i in iterator: # 重新开始for循环,使用的依然是同一个迭代器
print(i)
四、迭代器的优点
1.从容器类型中取值,不需要索引、key等
2.降低内存消耗
原因:迭代器的数据通过for循环或__next__()方法加载到内存,而不是一次加载全部数据
五、总结
1.迭代器一定可迭代,可迭代不一定是迭代器
2.可迭代一定可以使用for循环,可以使用for循环一定可迭代
3.for循环,通过内部处理:可迭代->迭代器
4.迭代器:取容器类型的值,不依靠索引、key等
减低内存的消耗
5.可迭代,可以通过__iter__()方法变成迭代器
6.通过判断是否可迭代,来确定是否使用for循环
python3迭代器的更多相关文章
- Python3+迭代器与生成器
转载Python3 迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素 ...
- python014 Python3 迭代器与生成器
Python3 迭代器与生成器迭代器迭代是Python最强大的功能之一,是访问集合元素的一种方式..迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结 ...
- python3 迭代器(Iterator)和生成器(generator)
一.迭代器定义: 迭代是访问集合元素的一种方式,迭代器是一个可以记住遍历位置的对象: 集合数据类型如list.dict.str等是Iterable但不是Iterator,不过可以通过iter()函数获 ...
- Python3迭代器与生成器
迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...
- python3 迭代器
''' 迭代:重复的过程,并且每次迭代的结果都是下次迭代的初始值 可迭代的 Iterable 迭代器 Iterator iter(数据) == 数据.__iter__() 将数据转换为迭代器 next ...
- python3: 迭代器与生成器(1)
1. 手动遍历迭代器 你想遍历一个可迭代对象中的所有元素,但是却不想使用for循环. >>> items = [1, 2, 3] >>> # Get the ite ...
- python3迭代器和生成器
1.手动访问迭代器中的元素 #要手动访问迭代器中的元素,可以使用next()函数 In [3]: with open('/etc/passwd') as f: ...: try: ...: while ...
- Python3 迭代器和生成器
想要搞明白什么是迭代器,首先要了解几个名词:容器(container).迭代(iteration).可迭代对象(iterable).迭代器(iterator).生成器(generator). 看图是不 ...
- Python3 迭代器,生成器,装饰器
1.迭代器 迭代器有两个基本方法,iter()和next(),next()完成后会引发StopIteration异常 a='abcdef' b=iter(a) #创建迭代器对象 print(type( ...
- python3 迭代器,生成器
一 .什么是迭代 1. 重复 2.下次重复一定是基于上一次的结果而来 while True: cmd=input(':') print(cmd) l=[1,2,3,4] count=0 while c ...
随机推荐
- linux 读者/写者自旋锁
内核提供了一个自旋锁的读者/写者形式, 直接模仿我们在本章前面见到的读者/写者旗标. 这些锁允许任何数目的读者同时进入临界区, 但是写者必须是排他的存取. 读者写者锁有 一个类型 rwlock_t, ...
- springboot+jpa分页(Pageable+Page)
Pageable+Page实现分页无需配置,也不需要加入jar包(maven依赖) Controller控制层 package com.gxuwz.late.controller; import co ...
- 【Git】git-filter-branch - Rewrite branches
1.命令使用场景 ①Removing sensitive data from a repository(https://help.github.com/en/github/authenticating ...
- Python7_内置函数总结
Python Built-In 函数: str(obj) :输入(对象),返回一个对象的string格式: isinstance(object,classinfo):判断一个对象是否是一个已知的类型, ...
- android studio 配置HTTP proxy
Android SDK在线更新镜像服务器 南阳理工学院镜像服务器地址: mirror.nyist.edu.cn 端口:80 中国科学院开源协会镜像站地址: IPV4/IPV6: mirrors.ope ...
- AOP 事物连接,记忆连接数据库,连接池
<?xml version="1.0" encoding="UTF-8"?><beans xmlns:xsi="http://www ...
- Linux 命令整理 vim
Vim 一.官方网站 http://www.vim.org 二.背景 所有的 Unix Like 系统都会内建 vi 文书编辑器,但是在我们编程这里开发使用最多的要数 vim命令了. 三.操作 三种 ...
- Visual Studio 2019 编译.Net Core Console项目出现【MSB4018 The "CreateAppHost" task failed unexpectedly】 错误
需要测试一个小东东,使用Visual Studio 2019新建了一个.Net Core的Console程序,但是在编译的时候一直报错,死活编译不通过. 错误信息: Severity Code Des ...
- 006一句话解决主机pc,Vmware虚拟机,开发板之间的ping问题
- c++ 基础知识回顾 继承 继承的本质就是数据的copy
c++ 基础知识笔记 继承 什么是继承 继承就是子类继承父类的成员属性以及方法 继承的本质就是 数据的复制 是编译器帮我们做了很多操作 class Base { public: Base(){ cou ...