这篇文章主要介绍“python迭代、可迭代、迭代器的区别有哪些”,在日常操作中,相信很多人在python迭代、可迭代、迭代器的区别有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python迭代、可迭代、迭代器的区别有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
可迭代对象常见的有str、list、tuple、dict等,对这些容器访问其内部元素时可以用“对象[下标]”的方式。实际上是因为python对这些对象封装了getitem方法,以下通过斐波那契数列类的案例来了解getitem的定义方法。
class Fib(object): # count表示生成斐波那契数列的个数 def __init__(self, count): self.count = count # 保存前两个值 self.x = 0 self.y = 1 # 记录生成数列的下标 # 声明Fib类是可迭代的 def __iter__(self): return self def __getitem__(self, item): if isinstance(item, int): if item <= self.count: self.x = 0 self.y = 1 for x in range(item): result = self.x self.x, self.y = self.y, self.x + self.y return result else: raise TypeError('超出范围!') elif isinstance(item, slice): start, stop = item.start, item.stop l = [] self.x = 0 self.y = 1 for x in range(stop): if x >= start: l.append(self.x) self.x, self.y = self.y, self.x + self.y return l else: raise TypeError('参数不合要求!') fib6 = Fib(6) print(fib6[0:5]) print(fib6[6]) out: [0, 1, 1, 2, 3] 5
python解释器在遇到对象后跟方括号[]取值时,会调用该对象的getitem方法,若要赋值调用setitem方法,若要删除调用delitem方法。
实际上上述代码存在缺陷,表面是可迭代对象,实际是迭代器,因为每个元素都是实时生成的,而且不能对其修改。若尝试fib6[2]=5会报错。
class Fib(object): # count表示生成斐波那契数列的个数 def __init__(self, count): self.count = count self.x = 0 self.y = 1 self.index = 0 self.row = [] for x in range(self.count): self.row.append(self.x) self.x, self.y = self.y, self.x + self.y self.index += 1 # 声明Fib类是可迭代的 def __iter__(self): return self def __getitem__(self, item): if isinstance(item, int): if item <= self.count: return self.row[item] else: raise TypeError('超出范围!') elif isinstance(item, slice): start, stop = item.start, item.stop return self.row[start:stop] else: raise TypeError('参数不合要求!') def __setitem__(self, item, value): if isinstance(item, int): if item <= self.count: self.row[item] = value else: raise TypeError('超出范围!') else: raise TypeError('参数不合要求!') fib6 = Fib(6) print(fib6[:4]) fib6[2] = 5 print(fib6[:4]) out: [0, 1, 1, 2] [0, 1, 5, 2]
上述代码是真正的可迭代对象,因为每个元素都是保存在列表中,可以对其修改,例如尝试fib6[2]=5不会报错。
注:以上代码对slice第三参数未处理,修改值时也只能一个个改,但不影响深入理解可迭代对象。
到此,关于“python迭代、可迭代、迭代器的区别有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。