python平方数迭代器_Python三大神器之迭代器详解

我们将要来学习python的重要概念迭代和迭代器,通过简单实用的例子如列表迭代器和xrange。

可迭代

一个对象,物理或者虚拟存储的序列。list,tuple,strins,dicttionary,set以及生成器对象都是可迭代的,整型数是不可迭代的。如果你不确定哪个可迭代哪个不可以,你需要用python内建的iter()来帮忙。

>>> iter([1,2,3])

>>> iter({1:2, 2:4})

>>> iter(1234)

Traceback (most recent call last):

File "", line 1, in

iter(1234)

TypeError: 'int' object is not iterable

iter()为list返回了listiterator对象,为dictionary返回了dictionary-keyiterator对象。类似对其他可迭代类型也会返回迭代器对象。

iter()用在自定义的类型会怎样呢?我们先自己定义一个String类:

class String(object):

def __init__(self, val):

self.val = val

def __str__(self):

return self.val

st = String('sample string')

那么,st是可迭代的吗?

>>> iter(st)

TypeError: 'String' object is not iterable

你可能会有几个问题要问:

怎么让自定义的类型可迭代?

iter()究竟做了些什么?

让我们补充String类来找找答案

class String(object):

def __init__(self, val):

self.val = val

def __str__(self):

return self.val

def __iter__(self):

print "This is __iter__ method of String class"

return iter(self.val) #self.val is python string so iter() will return it's iterator

>>> st = String('Sample String')

>>> iter(st)

This is __iter__ method of String class

在String类中需要一个’__iter__’方法把String类型变成可迭代的,这就是说’iter’内部调用了’iterable.__iter__()’

别急,不是只有增加’__iter()’方法这一种途径

class String(object):

def __init__(self, val):

self.val = val

def __str__(self):

return self.val

def __getitem__(self, index):

return self.val[index]

>>> st = String('Sample String')

>>> iter(st)

‘itr’也会调用’iterable.__getitem__()’,所以我们用’__getitem__’方法让String类型可迭代。

如果在String类中同时使用’__iter__()’和’__getitem__()’,就只有’__iter__’会起作用。

自动迭代

for循环会自动迭代

for x in iterable:

print x

我们可以不用for循环来实现吗?

def iterate_while(iterable):

index = 0

while(i< len(iterable)):

print iterable[i]

i +=1

这样做对list和string是管用的,但对dictionary不会奏效,所以这绝对不是python式的迭代,也肯定不能模拟for循环的功能。我们先看迭代器,等下回再过头来。

迭代器

关于迭代器先说几条………..

1. 迭代器对象在迭代过程中会会产生可迭代的值,`next()`或者`__next()__`是迭代器用来产生下一个值的方法。

2. 它会在迭代结束后发出StopIteration异常。

3. `iter()`函数返回迭代器对象

4. 如果`iter()`函数被用在迭代器对象,它会返回对象本身

我们试一试模仿for循环

def simulate_for_loop(iterable):

it = iter(iterable)

while(True):

try:

print next(it)

except StopIteration:

break

>>> simulate_for_loop([23,12,34,56])

23

12

34

56

前面我们看过了iterable类,我们知道iter会返回迭代器对象。

现在我们试着理解迭代器类的设计。

class Iterator:

def __init__(self, iterable)

self.iterable = iterable

.

.

def __iter__(self): #iter should return self if called on iterator

return self

def next(self): #Use __next__() in python 3.x

if condition: #it should raise StopIteration exception if no next element is left to return

raise StopIteration

我们学了够多的迭代和迭代器,在python程序中不会用到比这更深的了。

但是为了学习的目的我们就到这儿。。。。

欢迎加入我的QQ群`923414804`与我一起学习,群里有我学习过程中整理的大量学习资料。加群即可免费获取

列表迭代器

你可能会在面试中写这个,所以打起精神来注意了

class list_iter(object):

def __init__(self, list_data):

self.list_data = list_data

self.index = 0

def __iter__(self):

return self

def next(self): #Use __next__ in python 3.x

if self.index < len(self.list_data):

val = self.list_data[self.index]

self.index += 1

return val

else:

raise StopIteration()

我们来用`list_iter`自己定义一个列表迭代器

class List(object):

def __init__(self, val):

self.val = val

def __iter__(self):

return list_iter(self.val)

>>> ls = List([1,2,34])

>>> it = iter(ls)

>>> next(it)

1

>>> next(it)

2

>>> next(it)

34

>>> next(it)

Traceback (most recent call last):

File "", line 1, in

next(it)

File "", line 13, in next

raise StopIteration()

StopIteration

xrange

从一个问题开始——xrange是迭代还是迭代器?

我们来看看

>>> x = xrange(10)

>>> type(x)

几个关键点:

1. `iter(xrange(num))`应该被支持

2. 如果`iter(xrange(num))`返回同样的对象(xrange类型)那xrange就是迭代器

3. 如果`iter(xrange(num))`返回一个迭代器对象那xrange就是迭代

>>> iter(xrange(10))

它返回了rangeiterator,所以我们完全可以叫它迭代器。

让我们用最少的xrange函数实现自己的xrange

xrange_iterator

class xrange_iter(object):

def __init__(self, num):

self.num = num

self.start = 0

def __iter__(self):

return self

def next(self):

if self.start < self.num:

val = self.start

self.start += 1

return val

else:

raise StopIteration()

my xrange

class my_xrange(object):

def __init__(self, num):

self.num = num

def __iter__(self):

return xrange_iter(self.num)

>>> for x in my_xrange(10):

print x,

0 1 2 3 4 5 6 7 8 9

我喜欢在这里总结这篇文章,欢迎发表评论和疑问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言规范标准中英文,C语言中英文翻译资料.doc

C语言中英文翻译资料.docThe C Programming LanguageC is a high-level programming language developed by Dennis Ritchie and Brian Kernighan at Bell Labs in the mid-1970s. Although originally designed as a systems programming language, C has proved to be a powe…

lvm 扩展根目录_Lvm扩展根目录容量

2、新加一块硬盘&#xff0c;我的是sdb先创建物理卷[rootredhat6-3~]#fdisk/dev/sdbCommand(mforhelp):nCommandactioneextendedpprimarypartition(1-4)pPartitionnumber(1-4):1Firstcylinder(1-261,default1):(回车&#xff0c;默认将所有空间分配给第一个主分区)Usingdefault…

c语言趣味程序设计编程100例精解,c趣味编程100例

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include #include #include #include #include #include #include using namespace std;void z1();void z2();void z3();void z4();void z5();void z6();void z7();void z8();int c3(int, int);int draw(int(*)(double),…

SQL语言深入

数据库系统 数据库系统主要有以下 3 个组成部分&#xff1a; 1 . 数据库&#xff1a;用于存储数据的地方。 2 . 数据库管理系统&#xff1a;用于管理数据库的软件。 3 . 数据库应用程序&#xff1a;为了提高数据库系统的处理能力所使用的管理数据库库的软件补充。 数据库管…

tb项目管理实践_项目经理与项目管理整理

项目经理职责&#xff1a;要想项目的分配尽可能地准确&#xff0c;任务分配者必须了解项目研发相关的技术。进行产品开发过程中的业务目标、进度、成本、质量控制。挑选项目团队并进行团队建设&#xff0c;激发、鼓舞和改进团队的生产效率。识别项目干系人&#xff0c;定期向干…

加法的横式竖式教案c语言,20以内竖式加减法教案

【www.ahanw.cn--活动致辞】活动意图&#xff1a;数学的加减法运算很重要。特别是20以内的加减法是各种数字运算的基础。学好20以内的加减法&#xff0c;有利于活化孩子的头脑&#xff0c;发展孩子的思维。活动目标&#xff1a;1、感知进位加、退位减的算法&#xff0c;整理和归…

github随时同步代码_GitHub代码下载和同步

1.下载git客户端https://git-scm.com/ssh-keygen -C "youremail.address" -t rsa2. 把下面文件的内容复制到 https://github.com/settings/keysWindows:C:\Users\GengZhaoyun\.ssh\id_rsa.pubLinux:.ssh\id_rsa.pub测试是否配制正确ssh -T gitgithub.com显示Hi gengz…

c语言10个数求立方合并输出,C语言 求出100~999之间的所有“水仙花数”并输出...

“水仙花数”是指一个三位数&#xff0c;其各位数字的立方和确好等于该数本身&#xff0c;如&#xff1b;153&#xff1d;1&#xff0b;5&#xff0b;3?&#xff0c;则153是一个“水仙花数”。在数论中&#xff0c;水仙花数(Narcissistic number)也称为自恋数、自幂数、阿姆斯…

lstm 变长序列_keras在构建LSTM模型时对变长序列的处理操作

我就废话不多说了&#xff0c;大家还是直接看代码吧~补充知识&#xff1a;RNN(LSTM)数据形式及Padding操作处理变长时序序列dynamic_rnnSummaryRNN样本一样&#xff0c;计算的状态值和输出结构一致&#xff0c;也即是说只要当前时刻的输入值也前一状态值一样&#xff0c;那么其…

c语言平面向量加法考点,平面向量的加减法怎么死活都不会?有没有什么口诀?例如:向量AB+BC=?向量OA-OB=?向量AB-CB=?有没有什么口诀!...

设a(x,y),b(x,y).1、向量的加法向量的加法满足平行四边形法则和三角形法则.ABBCAC.ab(xx,yy).a00aa.向量加法的运算律&#xff1a;交换律&#xff1a;abba&#xff1b;结合律&#xff1a;(ab)ca(bc).2、向量的减法如果a、b是互为相反的向量,那么a-b,b-a,ab0.0的反向量为0AB-ACC…

乘基取整法是什么_数字逻辑电路-学习指南

数字逻辑电路-学习指南一、判断题(判断结果为真(T)或为假(F)1&#xff0e;()逻辑函数的真值表是惟一的&#xff0c;但表达式不一定是惟一的。2&#xff0e;()在基数乘除法中&#xff0c;整数部分的转换采用“除基取余”法&#xff0c;小数部分的转换采用“乘基取整”法。3&…

C语言定义直线的数据类型,C语言 | 数据类型

原标题&#xff1a;C语言 | 数据类型1.变量与常量数据在程序的世界中&#xff0c;可以让计算机按照指令做很多事情&#xff0c;如进行数值计算、图像显示、语音对话、视频播放、天文计算、发送邮件、游戏绘图以及任何我们可以想象到的事情。要完成这些任务&#xff0c;程序需要…

pyqt5生成py的文件为什么是c 语言,如何使用PyQt5在python中创建文件对话框

我有一个名为PDFviewer的python类&#xff0c;在运行该程序时&#xff0c;系统将显示一个窗口&#xff0c;该窗口处理button(打开文件夹)&#xff0c;它将打开一个文件对话框&#xff0c;允许用户选择一个目录并显示其中的文件。在问题是&#xff0c;当我尝试单击按钮时&#x…

nosql简答什么是最终一致性_可靠消息最终一致性方案中预发送作用是什么

可靠消息最终一致性方案的核心流程①上游服务投递消息如果要实现可靠消息最终一致性方案&#xff0c;一般你可以自己写一个可靠消息服务&#xff0c;实现一些业务逻辑。首先&#xff0c;上游服务需要发送一条消息给可靠消息服务。这条消息说白了&#xff0c;你可以认为是对下游…

android汽车音频焦点方案,管理音频焦点  |  Android 开发者  |  Android Developers

两个或两个以上的 Android 应用可同时向同一输出流播放音频。系统会将所有音频流混合在一起。虽然这是一项出色的技术&#xff0c;但却会给用户带来很大的困扰。为了避免所有音乐应用同时播放&#xff0c;Android 引入了“音频焦点”的概念。一次只能有一个应用获得音频焦点。当…

neo4j browser执行脚本后不提示用时_还不懂什么是分层自动化测试的,有赞的实践经历告诉你...

来源&#xff1a;https://testerhome.com/articles/19109# 背景先理一下自动化测试的概念&#xff0c;从广义上来说&#xff0c;一切通过工具(程序)的方式来代替或者辅助手工测试的行为都可以成为自动化。从狭义上来说&#xff0c;通过编写脚本的方式&#xff0c;模拟手工测试…

android+自定义alertdialog,安卓自定义AlertDialog

AlertDialog.png使用方法 example:DialogUtil.showAlertDialog(getActivity(), R.mipmap.restart, "退出提示", "你确定要退出吗&#xff1f;"),"确定", "取消", true, new DialogUtil.AlertDialogBtnClickListener() {Overridepublic…

eclipse跳转到指定行快捷键_用什么快捷键可以跳到下一个一样的?

Ctrl Shift O: 引入imports语句Ctrl Shift T: 打开Open Type查找类文件Ctrl Shift F4: 关闭打开的所有窗口Ctrl Shift F: 整形Ctrl Alt ↓(↑) : 向下(上)复制本行 (搞笑)Ctrl D : 删除本行Ctrl O: Open declarations F3 : Open DeclarationCtrl E : 打开编辑器(切…

android 跟随动画,Android实现View拖拽跟随手指移动效果

今天想实现这个功能&#xff0c;但是网上搜索代码&#xff0c;都是利用setPadding&#xff0c;setMargin 等方法去实现的&#xff0c;这在Android 4.0 以前是没问题的&#xff0c;但是&#xff0c;android 4.0 后系统已经提供了更简单的方法给我们用了&#xff0c;就是setTrans…

mysql datetime 后面带了很多0_面试官:MySQL 表设计要注意什么?

作者 孤独烟来自公众号&#xff1a;孤独烟引言大家应该知道烟哥最近要(tiao 咳咳咳)&#xff0c;嗯&#xff0c;不可描述&#xff01;随手讲其中一部分知识&#xff0c;都是一些烟哥自己平时工作的总结以及经验。大家看完&#xff0c;其实能避开很多坑。而且很多问题&#xff0…