Python迭代器生成器与生成式
Python迭代器生成器与生成式
什么是迭代
迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。
例如for循环
a = ['abc', 123, ['4', 45]]
for i in a:
print(i)
#==========输出=============
abc
123
['4', 45]
for就是把这个列表迭代了一遍,但是根据迭代的定义每一次迭代得到的结果会作为下一次迭代的初始值。这也没看到用了上一次的值啊。
这里介绍两个函数__iter__()和__next__,一个可迭代序列(同时它也是一个对象),它有一个__iter__()方法,可以返回一个迭代器对象,这个迭代器对象里面有一个__next__()方法,它可以将迭代器对象一个一个向下迭代。
例如上例
a = ['abc', 123, ['4', 45]]
#print(a.__iter__())
x = a.__iter__()
print(x.__next__())
print(x.__next__())
print(x.__next__())
##其实还有一种迭代形式,一个调用内置方法一个调用外部方法罢了
x = iter()
next(x)
next(x)
next(x)
x = iter(a)
print(next(x))
print(next(x))
print(next(x))
#===========输出结果=========
abc
123
['4', 45]
abc
123
['4', 45]
但是如果再加一个print(x.__next__())的话python会抛出一个异常。
然后我们可以结合while循环就可以大致猜出for迭代时的内部执行机理了。
a = ['abc', 123, ['4', 45]]
y = a.__iter__()
while True:
try:
print(y.__next__())
except StopIteration:
break
#===========输出================
abc
123
['4', 45]
这样就把列表a迭代完了。
什么是生成式
要创建一个列表,就要有一个中括号,里面的数据就是列表的内容。如果我要创建一个列表,列表里面有按顺序的1~100所有的整数,一个一个输入吗?
有人可能说用循环,例如
x = []
for i in range(1, 101):
x.append(i)
确实这样是可以的,但是有了生成式可能会更加简单一点
x = [i for i in range(1, 101)]
再中括号里面,一个应该写入数据的地方放一个循环,在C语言看来这简直就是疯了。不过这也体现了python的灵活强大。
其实中括号里面除了加for循环还能加条件判断,例如
x = [i for i in range(1, 101) if i % 2 and not i % 3]
#列举出所有1~100能被3整除不能被2整除的数
除了list列表有这种操作以外,还有字典可以这样操作
字典
dict1 = {i:i + 1 for i in range(1, 101)if i % 2 and not i % 3 }
执行结果
{3: 4, 9: 10, 15: 16, 21: 22, 27: 28, 33: 34, 39: 40, 45: 46, 51: 52, 57: 58, 63: 64, 69: 70, 75: 76, 81: 82, 87: 88, 93: 94, 99: 100}
应该能看出点什么来了,也挺简单。
什么是生成器
就是有一个跟return差不多的东西yield,return返回之后程序就退出了,但是yield会把程序暂停,然后等你需要的时候来继续执行,但是跟return又有一点不一样,yield是迭代器的一种,返回的是一个生成器对象,需要借用next()函数来进行迭代。
其实yield就是一种特殊的迭代器。
def sc1():
yield 'one'
yield 'two'
def sc2():
return 'one'
s1 = sc1()
s2 = sc2()
print(type(s1))
print(type(next(s1)))
print(type(s2))
输出
<class 'generator'>
<class 'str'>
<class 'str'>
对于生成器的使用,最简单的例如
def sc():
print('进入函数1')
yield 'one'
print('进入函数2')
yield 'two'
s = sc()
print(next(s))
print(next(s))
#============输出===========
进入函数1
one
进入函数2
two
使用与迭代器几乎一模一样
用这个生成一个斐波拉契数列可以这样写
def feb(x):
count = 0
a = 0
b = 1
while count < x:
yield a
a, b = b, a + b
count += 1
这样就会生成一个斐波拉契数列前x项的可迭代序列
可以测试一下,用for循环迭代它
for i in feb(10):
print(i,end=' ')
输出
0 1 1 2 3 5 8 13 21 34
Python迭代器生成器与生成式的更多相关文章
- Python 迭代器&生成器
1.内置参数 Built-in Functions abs() dict() help() min() setattr() all() dir() hex() next() slice ...
- python 迭代器 生成器
迭代器 生成器 一 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...
- Python 迭代器&生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发
本节大纲 迭代器&生成器 装饰器 基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...
- python迭代器,生成器,推导式
可迭代对象 字面意思分析:可以重复的迭代的实实在在的东西. list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定) 专业角度: ...
- Python迭代器生成器,私有变量及列表字典集合推导式(二)
1 python自省机制 这个是python一大特性,自省就是面向对象的语言所写的程序在运行时,能知道对象的类型,换句话说就是在运行时能获取对象的类型,比如通过 type(),dir(),getatt ...
- Python迭代器,生成器,装饰器
迭代器 通常来讲从一个对象中依次取出数据,这个过程叫做遍历,这个手段称为迭代(重复执行某一段代码块,并将每一次迭代得到的结果作为下一次迭代的初始值). 可迭代对象(iterable):是指该对象可以被 ...
- 4.python迭代器生成器装饰器
容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中.通常这类数据结构把所有的元素存储在内存中 ...
- python迭代器生成器
1.生成器和迭代器.含有yield的特殊函数为生成器.可以被for循环的称之为可以迭代的.而可以通过_next()_调用,并且可以不断返回值的称之为迭代器 2.yield简单的生成器 #迭代器简单的使 ...
- Python迭代器生成器,模块和包
1.迭代器和生成器 2.模块和包 1.迭代器 迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和__next__()方法. 其中__it ...
随机推荐
- 深入理解java中main方法
理解main方法语法 深入理解main方法: 解释main方法的形式:public static void main(String[] args){} main方法调用者:虚拟机 java虚拟机需要调 ...
- SharkCTF2021 Classic_Crypto_king2
crypto类题. 题面如下: 前面的代码给出了原理:后面的字符串第一行是print出的key,第二行是密文. 加密原理是,首先对table进行乱序处理,然后将明文flag按照(顺序table--&g ...
- VS2019 及 Visual Assist X 安装配置
Visual Studio 2019 安装 下载 https://visualstudio.microsoft.com/zh-hans/downloads/ 安装 设置 扩大 Solution Con ...
- PinPoint单节点部署及客户端配置方法
在一次做项目中,需要涉及全链路压测,为了更好定位链路中某一节点可能会出现的问题,在繁忙之余,快速部署及应用了该链路工具,分享给大家~ 话不多说,开始部署~ 一.环境配置1.1 获取需要的依赖包进入ho ...
- LeetCode:链表专题
链表专题 参考了力扣加加对与链表专题的讲解,刷了些 leetcode 题,在此做一些记录,不然没几天就没印象了 出处:力扣加加-链表专题 总结 leetcode 中对于链表的定义 // 定义方式1: ...
- 攻防世界 web2.robots
输入ip/robots.txt,显示出了flag目录,直接访问.
- linux shell脚本中的开头#!/bin/bash的含义
对于linux上需要执行 的shell脚本,通常第一行的内容是 #!/bin/bash 当然有很多时候不规范的写法可以忽略掉这一句,执行起来好像也是ok,结果没什么不一样 .. 这只是因为在我们常用 ...
- 有向路径检查 牛客网 程序员面试金典 C++ Python
有向路径检查 牛客网 程序员面试金典 C++ Python 题目描述 对于一个有向图,请实现一个算法,找出两点之间是否存在一条路径. 给定图中的两个结点的指针DirectedGraphNode* a, ...
- ST表 求 RMQ(区间最值)
RMQ即Range Minimum/Maximun Query,中文意思:查询一个区间的最小值/最大值 比如有这样一个数组:A{3 2 4 5 6 8 1 2 9 7},然后问你若干问题: 数组A下标 ...
- Windows7下面手把手教你安装Django - Hongten
我所使用的操作系统是Windows7,内存是2G 在搜索了一些资料发现,对于Django的安装,详细的真的很少,都说的很简化,然而,这篇blog可以手把手教你成功安装Django 对于Django的详 ...