1、双下方法
很少直接调用的方法。一般情况下,是通过其他语法触发的
__name__ 查看函数名的方法
__doc__ 查看函数注释的方法
def index(): '''返回值''' a = 'asdfg' return a index() print(index.__name__) print(index.__doc__)
__add__() 相加
a = 1 b = 2 print(a.__add__(b))
__iter__() 迭代器方法
__next__() 迭代器一个一个的取值
__length_hint__() 获取迭代器中元素的长度
__setstate__() 根据索引值指定从哪里开始迭代
2、迭代器
1)迭代:以将某个数据集内的数据“一个挨着一个的取出来”,就叫做迭代。
2)可迭代:可以被for循环的数据集是可迭代的,所以字符串(str)、列表(list)、元组(tuple)、字典(dict)、集合(set)都是可迭代的。
3)可迭代协议:满足内部可以实现__iter__()方法的要求。
4)迭代器协议:满足拥有__iter__()和__next__()方法的要求
5)关系:迭代器一定可迭代,可迭代的通过调用__iter__()方法就能得到一个迭代器
6)迭代器特点:
* 很方便使用,且所有的数据只能取一次
* 节省内存空间
from collections import Iterable from collections import Iterator print(isinstance([],Iterator)) # 迭代器 False print(isinstance([],Iterable)) # 可迭代的 True
# 构造数据类型 from collections import Iterable from collections import Iterator class A: def __iter__(self):pass def __next__(self):pass a = A() print(isinstance(a,Iterator)) print(isinstance(a,Iterable))
3、dir()方法
返回某类数据集中所有的方法
4、生成器
1)生成器的本质就是迭代器
2)生成器的表现形式
* 生成器函数
* 生成器表达式
3)生成器函数:
* 含有yield关键字的函数就是生成器函数
* 特点:
1. 调用函数的之后函数不执行,返回一个生成器
2. 每次调用__next__()方法的时候会取到一个值
3. 直到取完最后一个,在执行next会报错
def generator(): for i in range(20): yield '哇哈哈%s'%i g = generator() #调用生成器函数得到一个生成器 print(list(g)) ret = g.__next__() #每一次执行g.__next__就是从生成器中取值,预示着生成器函数中的代码继续执行 print(ret)
4)从生成器中取值的几个方法
# __next__():一个一个的取值,取一个释放一个,不占用内存
# for:占用内存
# 数据类型的强制转换 : 占用内存