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 ...
随机推荐
- Pytorch 实现简单线性回归
Pytorch 实现简单线性回归 问题描述: 使用 pytorch 实现一个简单的线性回归. 受教育年薪与收入数据集 单变量线性回归 单变量线性回归算法(比如,$x$ 代表学历,$f(x)$ 代表收入 ...
- 第十一章 Dockerfile安装Jenkins-2.249.3-1.1
一.安装Docker Docker部署Jenkins前提已经安装Docker,这边脚本安装Docker. #1.编写Docker安装脚本 [root@ip-10-0-12-212 ~]# vim In ...
- Windows 安装 gcc
Windows 安装 gcc ① 官网下载 GCC, the GNU Compiler Collection - GNU Project - Free Software Foundation (FSF ...
- SharkCTF2021 BabyGame
web类题. 访问题给页面,页面里没啥信息.抓包,发现: 访问它,发现是一个游戏. F12之后看调试器里的js代码,发现: console.log("balabalabala"); ...
- 基于Apache Hudi 的CDC数据入湖
作者:李少锋 文章目录: 一.CDC背景介绍 二.CDC数据入湖 三.Hudi核心设计 四.Hudi未来规划 1. CDC背景介绍 首先我们介绍什么是CDC?CDC的全称是Change data Ca ...
- 全连接层dense作用
参考来源
- python的虚拟环境Anaconda使用
Anaconda 使用conda常用命令 1.首先在所在系统中安装Anaconda.可以打开命令行输入conda -V检验是否安装以及当前conda的版本. 2.conda常用的命令. 1)con ...
- 微服务(三) Eureka注册中心和Ribbon负载均衡
1. Eureka注册中心 1.1 Eureka的结构和作用 在上一篇文章中 微服务(二)服务拆分及远程调用 order-service在发起远程调用的时候,该如何得知user-service实例的i ...
- SpringBoot小知识点
记录SpringBoot的小知识点 一.在 Spring 上下文刷新之前设置一些自己的环境变量 1.实现 EnvironmentPostProcessor 接口 2.spring.factories ...
- (一)、Docker 简介
1.Docker镜像是什么? 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件. 2.Do ...