可迭代对象(Iterable)
表面来看就是可以作用于for循环的对象,实质上Iterable对象要求实现了 _ _ iter_ _ 特殊方法
如果还能通过索引进行访问,要求对象实现了 _ _ getitem _ _ 特殊方法
迭代器(Iterator)
表面来看就是可以被next内置函数调用,并不断返回下一个数据,当没有下一个数据时则抛出StopIteration异常,实质上Iterator对象要求实现了 _ _ next _ _ 和 _ _ iter _ _ 特殊方法
迭代器对象必定是可迭代对象,但可迭代对象不一定是迭代器
str, bytes, tuple, list, dict, set它们是可迭代对象,但并不是迭代器,可以通过调用内置函数iter将它们转换为迭代器
在python3中,如果定义了一个类,类中有 iter(self),next(self)两个函数,则该类具有了迭代器的属性,
具体性质体现在:
如果该类的对象出现在一个for循环中,那么for循环会自动通过__iter__标志识别这是一个可迭代的类,继而自动调用__next__()函数
示例:
class Fab(object):
def __init__(self,max,):
self.max=max
self.n,self.a,self.b=0,0,1
def __iter__(self):
return self
def __next__(self):
if self.n < self.max:
out = self.b
self.a,self.b=self.b,self.a+self.b
self.n = self.n+1
return out
raise StopIteration()
for i in Fab(6):
print(i)
返回结果:
1
1
2
3
5
8
for语句内部运行原理
首先调用in关键字后面的对象的 _ _ iter _ _ 方法,这个方法必须返回一个Iterator,然后调用该Iterator的next方法并将该方法的返回值赋给for关键字后面的变量,执行一次循环体,重复进行这个操作直到next方法抛出StopIteration异常为止,循环就结束了
生成器(Generator)
惰性计算序列,主要有两种实现方式:
-
生成器表达式(Generator Expression),适合构造简单的生成器
-
使用yield关键字的函数对象(Generator Function),适合构造复杂的生成器
** 例如**:nums1 = [x for x in range(1000) if x % 3 == 0] # 列表推导式print(type(nums1), len(nums1)) print(nums1) 这是列表的进阶式 在0~1000的列表中找出能被3整除的数
下面只是生成器的表达式,是不是和上面的有些相似呢
nums2 = (x for x in range(1000) if x % 3 == 0) # 生成器表达式
print(type(nums2))
print(nums2)
print(next(nums2))
print(next(nums2))
print(nums2.__next__())
for i in nums2:
print(i)
**结果:**
3 6 9 12
15
18
21
24
27
30
33
36
39
42
45
**.......**
生成器必定是迭代器,所以生成器也是可迭代的
列表和元组都是将所有数据准备好存放在内存空间中,当数据量很大时将消耗大量内存空间,并且还不能表示无限数量的数据,而生成器并没有存放所有数据,存放的只是产生数据的算法代码,在我们需要获得一个数据时,它会执行算法代码产生一个数据返回给我们,所以生成器适合表示通过一定算法可以推导出来的大量数据,甚至是无限个数据
装饰器(Decorator)
通常作用就是在不改变函数内部实现的情况下为函数增加一些额外的功能
掌握下面几种情况的装饰器的语法规则:
- 被装饰函数无参,无返回值;
- 被装饰函数有参,无返回值;
- 被装饰函数有参,有返回值;
- 装饰器带有参数;
- 通用装饰器的写法
例如:
def sunsd(func):
def inner(n):
r=func(n)
print("%s的累加和为"%n,r)
return inner
@sunsd
def sum(n):
s,i=0,0
while i<=n:
s+=i
i+=1
return s
sum(100)
结果:
100的累加和为 5050
下面再两个例子:
def sunad(funs):
def innera():
print("{")
funs()
print("}")
return innera
@sunad
def Hoe():
print("hello,word")
Hoe()
结果为:
{
hello,word
}
======================可以带参数的装饰器=============================
def sunhub(style):
def sunhub_innera(funa):
def innera(n):
print("<%s>累加为"%style,n)
r=funa(n)
print("</%s>结果为"%style,r)
return innera
return sunhub_innera
@sunhub("b")
def plus(n):
w,j=0,0
while j<=n:
w+=j
j+=1
return w
plus(100)
结果为:
<b>累加为 100
</b>结果为 5050