列表生成式
所谓的列表生成式,顾名思义,就是说可以生成list列表的表达式,是Python内置的非常简单却强大的可以用来创建list的生成式
基本的一个语法如下:
[变量表达式 for 变量 in 表达式 if 判断条件]
本质就是将for循环强制性写在一行,把结果写在for循环的最前面,然后使用[]括起来,
得到的就是一个由结果集组成的一个列表
案例1:实现list1 = [1,4,9,16,25,…,100]
list1 = [x*x for x in range(1,11)]
print(list1)
#[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
案例2:在案例1的基础上去除3的倍数
list1 = [x*x for x in range(1,11) if x%3 != 0]
print(list1)
#[1, 4, 16, 25, 49, 64, 100]
当然也可以使用两层循环,如下:
list1 = [m+n for m in 'ABC' for n in 'XYZ']
print(list1)
#['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
生成器
通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,如果我们仅仅需要访问前面几个元素,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?
这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Generator)
生成器就是一个能返回迭代器的函数,其实就是定义一个迭代算法,可以理解为一个特殊的迭代器
要创建一个generator,方法非常简单,只要把一个列表生成式的[]改成(),就创建了一个generator,基本语法如下:
g1 = (result for x in range(m,n))
注意:生成器只能迭代一遍
g1 = (x for x in range(10))
print(next(g1))
for x in g1:
print(x,end="\t")
运行如下:
0
1 2 3 4 5 6 7 8 9
例:自定义一个生成器函数,实现斐波那契数列
def fab(n):
pre, curr, count = 0, 1, 1
while count <= n:
yield curr
pre, curr = curr, pre + curr
count += 1
可迭代对象
- 能直接作用于for循环的对象我们统称为可迭代对象(Iterator)
- 我们可以使用isintance()判断一个对象是否是Iterator对象
- 常见的可迭代对象:
- list、set,dict,tuple,str,range
- 生成器
注意:使用Iterator判断的时候需要导入Iterable的包
from collections import Iterable
print(isinstance([],Iterable)) #True
print(isinstance((),Iterable)) #True
print(isinstance({},Iterable)) #True
print(isinstance("",Iterable)) #True
print(isinstance((x for x in range(10)),Iterable)) #True
print(isinstance(1,Iterable)) #False
迭代器
概述
不但能够作用于for循环,还可以被next函数调用,不断返回下一个值,直到最后出现StopIteration错误,表示无法返回下一个值,这样的对象我们就称之为迭代器(Iterator对象)
常见的只有生成器是迭代器,其他类型的都不是
from collections import Iterator
print(isinstance([],Iterator))
print(isinstance("",Iterator))
print(isinstance({},Iterator))
print(isinstance((),Iterator))
print(isinstance(range(10),Iterator))
print(isinstance((x for x in range(10)),Iterator))
运行结果如下:
False
False
False
False
False
True
迭代器与可迭代对象的关系:迭代器一定是可迭代对象,可迭代对象不一定是迭代器
例:使用迭代器实现python原生range的功能
class Range:
def __init__(self, start, stop=None, step=1):
if stop is None:
self.start = 0
self.stop = start
else:
self.start = start
self.stop = stop
self.step = step
def __iter__(self):
return self
def __next__(self):
if self.start < self.stop:
current = self.start
self.start += self.step
return current
else:
raise StopIteration()
例:自定义一个迭代器,实现斐波那契数列
class Fab:
def __init__(self, n):
self.prev = 0
self.curr = 1
self.count = 1
self.n = n
def __iter__(self):
return self
def __next__(self):
if self.count <= self.n:
temp = self.curr
self.pre, self.curr = self.curr, self.pre + self.curr
self.count += 1
return temp
else:
raise StopIteration()
Iterator转换
可以通过iter()函数将可迭代对象转为迭代器
from collections import Iterator
print(isinstance(iter([]), Iterator))
print(isinstance(iter(()), Iterator))
print(isinstance(iter({}), Iterator))
print(isinstance(iter(''), Iterator))
iter1 = iter([1,2,3])
print(type(iter1))
print(next(iter1))
运行结果如下:
True
True
True
True
<class 'list_iterator'>
1