迭代器

迭代是Python最强大的功能之一,是访问集合元素的一种方式。

迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器有两个基本的方法:iter() 和 next()。

字符串,列表或元组对象都可用于创建迭代器:

迭代器简介

dir():

  dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。

print(dir([]))
print(dir())

iterable,可迭代的。

只要是能够被for 循环的数据类型,就一定拥有__iter__方法。使用了此方法之后,就变成了迭代器。

可迭代对象含有iter()方法,但不一定含有next()方法,迭代器包含二者。__next__方法可以一个一个的获取值。

s = 's1'
x = s.__iter__()#iter方法创建的是迭代器
# x = iter(s)
print(x)
print(x.__next__())#next方法输出迭代器的下一个元素
print(next(x))

如果没有了下一个元素,会引发异常

可迭代对象:有__iter__方法、无__next__方法

迭代器:既有__iter__方法、也有__next__方法

s = ''#可迭代对象
print('__iter__' in set(dir(s)))
print('__next__' in set(dir(s)))
s1 = s.__iter__()#迭代器
print('__iter__' in dir(s1))
print('__next__' in dir(s1))

附加:1、

from collections import Iterable
from collections import Iterator
print(isinstance([],Iterator))#sinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。
print(isinstance([],Iterable))

  2、

from collections import Iterable
from collections import Iterator
class A:
def __iter__(self):pass
def __next__(self):pass a = A()
print(isinstance(a,Iterator))#sinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。
print(isinstance(a,Iterable))

  3、

from collections import Iterable
from collections import Iterator
class A:
# def __iter__(self):pass
def __next__(self):pass a = A()
print(isinstance(a,Iterator))#sinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。
print(isinstance(a,Iterable))

只有是可迭代对象才能用for;

当我们遇到一个变量,不确定是否能够for循环,可以判断其是否可迭代。

x = False
y = 123
z = (1,2,3)
print('__iter__' in dir(x))
print('__iter__' in dir(y))
print('__iter__' in dir(z))

附加1:

li = [1,2,3,4]
li1 = [1,2,3] # print(li - li1)#列表与列表无法直接相减,转换成集合
print(set(li)-set(li1))
print(list(set(li)-set(li1)))

附加2:enumerate(枚举)

li = [1,2,3,4]
print(list(enumerate(li)))
print(tuple(enumerate(li)))

附加3:

import sys#引入sys模块
li = [1,2,3,4]
it = iter(li)#创建迭代器对象
for i in it:
try:
print(i)
except StopIteration:#异常处理
sys.exit()

迭代器的优点:

  从容器类型中一个一个的取值,会把所有的值都取到;

  节省内存空间

    迭代器并不会在内存中占用一大块内存,而是随着循环,每次生成一个。(next)

生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator)。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。

调用一个生成器函数,返回的是一个迭代器对象。

生成器简介

def generator():
for i in range(2000000):
i = 'happy day%s'%i
yield i
x = generator()#返回的是一个迭代器
print(x)
print(x.__next__())
print(x.__next__())
print(x.__next__())

1、

def generator():
for i in range(2000000):
i = 'happy day%s'%i
yield i
x = generator()#返回的是一个迭代器
s = 0
for i in range(200):
if s < 2:
print(x.__next__())
s += 1
print('ooooooo',x.__next__())

2、

def generator():
for i in range(2000000):
i = 'happy day%s'%i
yield i
x = generator()#返回的是一个迭代器
s1 = 0
for j in x:
print(j)
if s1 < 2:
s1 += 1
else:break#不break,就会一直print
print('ooooooo', x.__next__())

附加1:斐波那契数列

def f(num):
n,a,b = 0,0,1
while n < num:
print(b,end=' ')
a,b = b,a+b
n += 1
f(5)

附加2:斐波那契数列

import sys
def fei(num):
n,a,b = 0,0,1
while True:
if n >= num:
return
a,b = b,a+b
n += 1
yield b
x = fei(5)#返回的是一个迭代器
print(x)
while True:
try:
print(next(x),end=' ')
except StopIteration:
sys.exit()

监听文件输入:动态输入、动态监听

动态向文件中输入新内容,会输出新内容,并且你可以做筛选之类。

def sea(file):
f = open(file,encoding='utf-8')
while True:
line = f.readline()
if line.strip():#每次输入新内容的回车去掉,不然会有空行
yield line.strip()#每次输入新内容的回车去掉,不然会有空行
g = sea('test')#创建的文件
for i in g:
# if '你想查找的内容' in g:
print(i)

pass

python学习日记(迭代器、生成器)-乱七八糟的更多相关文章

  1. Python学习日记(十) 生成器和迭代器

    使用dir()我们可以知道这个数据类型的内置函数有什么方法: print(dir(int)) print(dir(bool)) print(dir([])) print(dir({})) print( ...

  2. python学习日记(生成器函数进阶)

    迭代器和生成器的概念 迭代器 对于list.string.tuple.dict等这些容器对象,使用for循环遍历是很方便的.在后台for语句对容器对象调用iter()函数.iter()是python内 ...

  3. Python学习 :迭代器&生成器

    列表生成式 列表生成式的操作顺序: 1.先依次来读取元素 for x 2.对元素进行操作 x*x 3.赋予变量 Eg.列表生成式方式一 a = [x*x for x in range(10)] pri ...

  4. Python学习day17 迭代器&生成器

    迭代器&生成器 1. 迭代器 1.1 迭代器 迭代:迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果.每一次对过程的重复称为一次"迭代" 迭代器:帮助对某种对象 ...

  5. python学习10—迭代器、三元表达式与生成器

    python学习10—迭代器.三元表达式与生成器 1. 迭代器协议 定义:对象必须提供一个next方法,执行该方法或者返回迭代中的下一项,或者返回一个StopIteration异常,以终止迭代(只能往 ...

  6. Python 学习日记(第三周)

    知识回顾 在上一周的学习里,我学习了一些学习Python的基础知识下面先简短的回顾一些: 1Python的版本和和安装 Python的版本主要有2.x和3.x两个版本这两个版本在语法等方面有一定的区别 ...

  7. Python学习日记 --day2

    Python学习日记 --day2 1.格式化输出:% s d  (%为占位符 s为字符串类型 d为数字类型) name = input('请输入姓名') age = int(input('请输入年龄 ...

  8. python学习日记(基础数据类型及其方法01)

    数字 int 主要是用于计算的,常用的方法有一种 #既十进制数值用二进制表示时,最少使用的位数i = 3#3的ASCII为:0000 0011,即两位 s = i.bit_length() print ...

  9. Python学习笔记之生成器、迭代器和装饰器

    这篇文章主要介绍 Python 中几个常用的高级特性,用好这几个特性可以让自己的代码更加 Pythonnic 哦 1.生成器 什么是生成器呢?简单来说,在 Python 中一边循环一边计算的机制称为 ...

随机推荐

  1. Python魔法函数

    python中定义的以__开头和结尾的的函数.可以随意定制类的特性.魔法函数定义好之后一般不需要我们自己去调用,而是解释器会自动帮我们调用. __getitem__(self, item) 将类编程一 ...

  2. ImportError: DLL load failed: 找不到指定的模块。

    这里用的anacoda,报错是找不到DLL,可能是该DLL的环境变量没配置,配置系统环境变量: 重启一下pycharm,OK.

  3. scrapy框架爬取妹子图片

    首先,建立一个项目#可在github账户下载完整代码:https://github.com/connordb/scrapy-jiandan2 scrapy startproject jiandan2 ...

  4. Vue基础(ES6)

      起步 1.扎实的HTML/CSS/Javascript基本功,这是前置条件. 2.不要用任何的构建项目工具,只用最简单的<script>,把教程里的例子模仿一遍,理解用法.不推荐上来就 ...

  5. CRM系统(第二部分)

      阅读目录 一.讲师与学生简介 二. 初始化 ,studyrecord, 三.初始化 course_record:批量生成学习记录 四. 考勤  url跳转 五.录入成绩 六.highcharts表 ...

  6. jmeter操作数据库

    1)     jmeter不能直接连数据库,需要先添加jar包. 然后将jar包的路径添加到下图: 2)     操作数据库之前要知道数据库的信息(ip.端口号.账号.密码),操作哪个数据库就连哪个: ...

  7. jvisualvm中VisualGC插件提示:不受此JVM支持

    Visual GC插件「不受此JVM支持」问题 - djp567的博客 - CSDN博客https://blog.csdn.net/djp567/article/details/78662047 jv ...

  8. [转帖]Windows和Linux对决(多进程多线程)

    Windows和Linux对决(多进程多线程) https://blog.csdn.net/world_2015/article/details/44920467 太长了 还没看完.. 还是没太理解好 ...

  9. [转帖]linux sed命令

    linux sed命令就是这么简单 https://www.cnblogs.com/wangqiguo/p/6718512.html 用到的最多的就是一个sed -i 's/nn/mm/' 的命令了. ...

  10. spring AOP源码分析(一)

    对于springAOP的源码分析,我打算分三部分来讲解:1.配置文件的解析,解析为BeanDefination和其他信息然后注册到BeanFactory中:2.为目标对象配置增强行为以及代理对象的生成 ...