可调用对象(callable)
Python中的可调用对象包括以下七种:
- 用户使用def或lambda语句创建的函数。
- 使用C语言(CPython)实现的内置函数,如time.strftime()和len()。
- 使用C语言实现的方法,如dict.get()。
- 方法,在类的定义体中定义的函数。
- 类。
- 类的实例,需要定义__call__()方法后的类的实例。
- 使用yeild关键字的函数或方法。
将可调用对象转换成迭代器,使用下面的方法:
iter(callable, sentinel) -> iterator
可迭代对象(iterable)
Python中可迭代的对象包括列表、集合、元组、字典、字符串和文件对象,这些对象都内置了__iter__()方法。 将可迭代对象转换成迭代器,使用下面的方法:
iter(iterable) -> iterator
# 或
iterable.__iter__()
迭代器(iterator)
既有内置__iter__()方法又有内置__next__()方法的对象。迭代器调用__iter__()方法后还是迭代器本身,调用__next__()方法可以获取迭代器中的元素。可调用对象用法:
n = [1, 2, 3, 4, 5]
idx = -1
def value():
global idx
idx += 1
return n[idx]
nums = iter(value, 4)
while True:
# print(next(nums, -1))
print(nums.__next__())
结果:
可迭代对象用法:
key_value = {1: 'y', 2: 'x', 3: 'z'}
key_value = key_value.__iter__()
# key_value = iter(key_value)
while True:
print(key_value.__next__())
迭代器中元素耗尽时会抛出StopIteration异常,结果:
迭代器优点:
- 提供了一种通用不依赖索引的迭代取值方式;
- 同一时刻在内存中只存在一个值,更节省内存。
迭代器缺点:
- 取值不如按照索引的方式灵活,不能取指定的某一个值,只能往后取,不能往前去
- 无法预测迭代器的长度。
生成器(generator)
生成器是一种自定义的迭代器,本质上是迭代器。生成器有两种:元组生成器和函数生成器。元组生成器类似于列表生成式,如下所示是用元组创建的一个生成器:
gener = (i for i in range(1000))
函数生成器由yield关键字标识。yield关键字有return和暂停的功能;yield语句执行后下次迭代将会从yeild后的语句开始而不是从函数开头的语句开始执行。用法如下所示:
def gener():
sum = 0
for i in range(1000):
x = yield i
sum += (x + i)
print('---sum:', sum)
g = gener() # g是生成器对象
next(g) # 与g.__next__()功能一样
g.send(8) # 向生成器中传值:第一次迭代必须send(None),send给x
g.close() # 关闭生成器,此后不可再迭代
调用一次next()方法,下次调用时函数生成器从sum+=(x+i)开始执行。可使用send方法往生成器中传值,使用close方法关闭生成器。