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领域的表现层的三种技术--jsp、freemarker、velocity
10月份忙碌的参加秋招并获得了5个成都.上海.广州等不同地区的工作offer,最终选择了广州,11月底来到公司实习,很快,就跟进了公司的项目了,原本以为可以和宣讲会时报的志愿一样--Java开发,但是 ...
- Windows 10下CUDA及cuDNN的安装 —— Pytorch
Windows 10下CUDA及cuDNN的安装 CUDA简介与下载地址 CUDA(ComputeUnified Device Architecture),是显卡厂商NVIDIA推出的运算平台. CU ...
- .Net微信服务商平台ApiV3接口
最近做个对接微信服务商平台的小程序项目,大概要实现的流程是:a)特约商户进件 > b)生成带参数的小程序码 > c)小程序支付 > d)分账,记录一下,希望能对需要的朋友有所帮助 开 ...
- 安装早期老版本 Visual Studio
安装早期老版本 Visual Studio https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/
- C++ 类继承 笔记(初步)
本节内容源于对C++ primer第13章的学习,这本书把C++的原理将得明明白白.网上的博客往往讲得一头雾水.到头来还不如看原书本. 问题 首先给出一题: #include<stdio.h&g ...
- 用css写三角形
html部分 <div class="triangle></div> css部分 .triangle{ width:0; height:0; overflow:hid ...
- vue3.x全局插件和组件
做vue项目的时候,总有一些小组件或者工具类,我们需要频繁的使用,每个使用的地方再去引用相对比较麻烦,当然也有一些好处,尤其是配合组件异步加载的时候,能最更好的减少项目首次加载的体积,从而优化一些体验 ...
- AIApe问答机器人Scrum Meeting 4.27
Scrum Meeting 3 日期:2021年4月27日 会议主要内容概述:汇报两日工作. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 李明昕 后端 Tas ...
- [no code][scrum meeting] Alpha 11
项目 内容 会议时间 2020-04-17 会议主题 OCR紧急技术风险分析 会议时长 30min 参会人员 PM+OCR组成员 $( "#cnblogs_post_body" ) ...
- OO第四单元
OO第四单元总结 第四单元架构设计 第一次作业 uml类图 这次作业我采取的基本思路就是根据指令来建造一个简易的类图,用于查询,其中umlclass中包含了umlAttraibute,umlOpera ...