迭代器

迭代是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. Codeforces Round #485 (Div. 2)-B-High School: Become Human

    B. High School: Become Human time limit per test 1 second memory limit per test 256 megabytes input ...

  2. hana-banach定理

    1.  x1不是X除开G以外所有的空间 2.如果极大元不是全空间的话,根据前面的讨论,还可以延拓,这就和极大矛盾了

  3. vue单页面模板说明文档(1)

    Introduction This boilerplate is targeted towards large, serious projects and assumes you are somewh ...

  4. IdentityServer4【Introduction】之术语

    术语 在规范.文档和对象模型中使用了一些你应该了解的术语. IdentityServer IdentityServer是一个OpenID Connect的提供者,它实现了OpenID Connect和 ...

  5. Laravel自带SMTP邮件组件实现发送邮件(QQ、163、企业邮箱都可)

    Laravel自带SMTP邮件组件实现发送邮件(QQ.163.企业邮箱都可)     laravel自带SMTP邮件配置和遇到的坑 laravel自带SwiftMailer库,集成了多种邮件API,可 ...

  6. [转帖]xargs命令详解,xargs与管道的区别

    xargs命令详解,xargs与管道的区别 https://www.cnblogs.com/wangqiguo/p/6464234.html 之前一直说要学习一下 xargs 到现在为止也没学习.. ...

  7. AngularJS基于模块化的MVC实现

    AngularJS基于模块化的MVC实现 <!DOCTYPE html> <html> <head> <meta charset="UTF-8&qu ...

  8. Docker安装部署redis

    借鉴博客:https://my.oschina.net/u/3489495/blog/1825335 待续... >>>>>>>>>docker安 ...

  9. java学习之—排序

    package test3; public class Sort{ /** * 冒泡排序 * @param array */ public void bubbleSort(int[] array) { ...

  10. SQL Server2012数据库开启远程连接

    在我们使用SQL Server数据库的时候很重要的一点就是开启数据库的远程连接,这是因为很多时候数据库部署在远程的服务器上会比较方便,而部署在客户端的话,由于客户端不固定,所以需要经常去部署,这样容易 ...