python:类4——魔法方法(定制序列、迭代)、生成器、推导式
一、定制序列(容器类型)
- 协议(Protocols)与其他编程语言中的接口很相似,它规定你哪些方法必须要定义。然而,在Python中的协议就显得不那么正式。事实上,在Python中,协议更像是一种指南。
- 定制容器的协议
- 如果你希望定制的容器是不可变的话,你只需要定义__len__()和__getitem__()方法 (str、tuple)
- 如果你希望定制的容器是可变的话,你需要定义_len__()、__getitem__()、__setitem__()和__delitem__()方法 (list)
- 例:编写一个不可变的自定义列表,要求记录列表中每个元素被访问的次数
1 class CountList():
2 def __init__(self, *args):
3 self.l = [x for x in args]
4 self.count = {}.fromkeys(range(len(self.l)), 0)
5
6 def __len__(self):
7 return len(self.l)
8
9 def __getitem__(self, index):
10 self.count[index] += 1
11 return self.l[index]
二、迭代
- 定义:迭代就类似循环,每一次重复的过程称为一次迭代的过程,每一次迭代的结果将作为下一次迭代的初始值
- 提供迭代方法的容器称为迭代器,如:list,字符串,字典
- 通常用for i in “xx”,用于触发迭代操作;while循环实现for

- iter()——容器对象调用iter()就得到它的迭代器
- next()——调用next()迭代其就会返回下一个值,如果没有值可以返回了python就会抛出一个叫做StopIteration
In [105]: s = "fichc" In [106]: it = iter(s) In [107]: next(it)
Out[107]: 'f' In [108]: next(it)
Out[108]: 'i'- __iter__()——返回迭代器本身(对应iter()方法)
- __next__()——决定迭代器的规则(对应next()方法)
- Fibs数列(下一个值是前两个的和):
1 class Fibs():
2 def __init__(self, a, b):
3 self.a = a
4 self.b = b
5 def __iter__(self):
6 return self
7 def __next__(self):
8 self.a, self.b = self.b, self.a + self.b
9 return self.a In [128]: a = test.Fibs(1, 2) In [129]: it = iter(a) In [130]: next(it)
Out[130]: 2 In [131]: next(it)
Out[131]: 3 In [121]: a = test.Fibs(1, 2) In [122]: for each in a:
...: if each < 20: #也可以把判断放到__next__(self),通过if xxx: raise StopIteration
...: print(each)
...: else:
...: break
...:
2
3
5
8
13
三、乱入:生成器generator
- 迭代器和生成器是python引入的最强大的概念
- 生成器是迭代器的一种实现,因为定义生成器需要写个类,生成器只需要一个yield
- 生成器的发明使得python模仿协同程序的概念得以实现。协同程序就是可以运行的独立函数调用,函数可以暂停或者挂起,并在需要的时候从程序离开的地方继续或者重新开始
- 像一个会暂停,又能回来的return
- 可以使用next()一次执行一回,也可以用for循环一次去不打印
1 #coding:utf8
2 def myGen():
3 print('生成器被执行')
4 yield 1
5 yield 2 In [137]: myG = test.myGen()
In [138]: next(myG)
生成器被执行
Out[138]: 1 #在yield1暂停
In [139]: next(myG)
Out[139]: 2 #在yield暂停
In [140]: next(myG)
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-140-bf2e9b04d728> in <module>()
----> 1 next(myG)
StopIteration: 斐波那契数列也可以用到yield
def libs():
a = 0
b = 1
while True:
a, b = b, a + b
yield a- 列表推倒式
a = [i for i in range(100) if not (i % 2) and i % 3]
[2, 4, 8, 10, 14, 16, 20, 22, 26, 28, 32, 34, 38, 40, 44, 46, 50, 52, 56, 58, 62, 64, 68, 70, 74, 76, 80, 82, 86, 88, 92, 94, 98]python3还有字典推导式
b = {i:i % 2 == 0 for i in range(10)}
{0: True, 1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False}- 集合set推导式
In [154]: {i for i in [1,2,1,3]}
Out[154]: {1, 2, 3}
- 生成器推导式,可以next(e),作为函数的参数时,可以省略最外边的括号。
In [156]: e = (i for i in range(10))
Out[156]: <generator object <genexpr> at 0x7fa1635bb518>
生成器推到式若果作为函数的参数,可以直接写推导式,不用写圆括号;也可以加上
>>> sum(i for i in range(100) if i %2)
2500- 没有元组推导式,元组推导式其实得到的就是生成器推导式;没有字符串推导式
python:类4——魔法方法(定制序列、迭代)、生成器、推导式的更多相关文章
- python类之魔法方法
python类之魔法方法: class A(object): def __init__(self,x): self.x = x def __neg__(self): print('-v') def _ ...
- python day 11: 类的补充,元类,魔法方法,异常处理
目录 python day 11 1. 类的补充 1.1 通过反射来查找类,创建对象,设置对象的属性与方法 1.2 类的魔法方法:getitem,setitem 1.3 元类__metaclass__ ...
- Python学习笔记之面向对象编程(三)Python类的魔术方法
python类中有一些方法前后都有两个下划线,这类函数统称为魔术方法.这些方法有特殊的用途,有的不需要我们自己定义,有的则通过一些简单的定义可以实现比较神奇的功能 我主要把它们分为三个部分,下文也是分 ...
- python里的魔法方法1(构造与析构)
魔法方法——构造与析构 1.python编程的魔法方法: (1)魔法方法总是被双下划线包围,例如__init__: (2)魔法方法是面向对象的python的一切. 2.__new__(class[,… ...
- python 类属性与方法
Python 类属性与方法 标签(空格分隔): Python Python的访问限制 Python支持面向对象,其对属性的权限控制通过属性名来实现,如果一个属性有双下划线开头(__),该属性就无法被外 ...
- 第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解
第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解 一. 引言 上两节介绍了构造方法的语法及参数,说明了构造方法是Python的类创建实例后首先执行的方法,并说明如果类 ...
- 12.Python略有小成(生成器,推导式,内置函数,闭包)
Python(生成器,推导式,内置函数,闭包) 一.生成器初始 生成器的本质就是迭代器,python社区中认为生成器与迭代器是一种 生成器与迭代器的唯一区别,生成器是我们自己用python代码构建成的 ...
- Python函数04/生成器/推导式/内置函数
Python函数04/生成器/推导式/内置函数 目录 Python函数04/生成器/推导式/内置函数 内容大纲 1.生成器 2.推导式 3.内置函数(一) 4.今日总结 5.今日练习 内容大纲 1.生 ...
- Python之路-迭代器 生成器 推导式
迭代器 可迭代对象 遵守可迭代协议的就是可迭代对象,例如:字符串,list dic tuple set都是可迭代对象 或者说,能被for循环的都是可迭代对象 或者说,具有对象.__iter__方法的都 ...
随机推荐
- 百万年薪python之路 -- 文件操作练习
1.有如下文件,a1.txt,里面的内容为: 老男孩是最好的学校, 全心全意为学生服务, 只为学生未来,不为牟利. 我说的都是真的.哈哈 分别完成以下的功能: a,将原文件全部读出来并打印. with ...
- vue系列---snabbdom.js使用及源码分析(九)
一:什么是snabbdom? 在学习Vue或React中,我们了解最多的就是虚拟DOM,虚拟DOM可以看作是一颗模拟了DOM的Javascript树,主要是通过vnode实现一个无状态的组件,当组件状 ...
- 手绘风格的 JS 图表库:Chart.xkcd
本文作者:HelloGitHub-kalifun 图表库千万个今天 HelloGitHub 给大家推荐个很有"特色"的图表库:一个手绘风格的 JS 图表库 -- Chart.xkc ...
- Java基础(三十二)JDBC(2)连接数据库
一.连接数据库的过程 连接数据库的过程:加载数据库驱动程序,不过只需在第一次访问数据库时加载一次,然后在每次访问数据库时创建一个Connection实例,然后执行操作数据库的SQL语句,并返回执行结果 ...
- gulp源码分析
一.整体结构分析 整体结构 通过在nodejs环境对源码的打印,我们最终得到的gulp实例行如下图.那么我们gulp实例上的属性和方法是如何生成的呢? Gulp { domain: null, _ev ...
- 使用MySQL,SQL_MODE有哪些坑,你知道么?
SQL_MODE是MySQL中的一个系统变量(variable),可由多个MODE组成,每个MODE控制一种行为,如是否允许除数为0,日期中是否允许'0000-00-00'值. 为什么需要关注SQL_ ...
- yii2中commands的简单应用
class HelloController extends Controller { /** * This command echoes what you have entered as the me ...
- 小白学 Python(16):基础数据类型(函数)(上)
人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...
- 在虚拟机上的关于NFS网络文件系统
小知识: NFS(Network Files System)即网络文件系统,NFS文件系统协议允许网络中的主机通过TCP/IP协议进行资源共享,NFS客户端可以像使用本地资源一样读写远端NFS服务端的 ...
- lua程序设计(一)
摘要:lua程序设计第二版学习笔记 脚本语言的基础语法大都比较简单,这里只列举一些lua独有,或者需要特别注意的语法点. 书中前三章的内容是一些惯常的引言,基础数据类型,运算符等内容,相对简单,这里就 ...