一、推导式
1.列表推导式
需求:如何快速生成0-100的列表
方法一:while循环
list1 = []
while i in range(101):
list1.append(i)
i += 1
print('list1的值为',list1)
方法二:FOR循环
list2 = []
for i in range(101):
list2.append(i)
print('list2的值为:',list2)
方法三:列表推导式
list3 = [i for i in range(101)]
print('list3的值为:',list3)
2.字典推导式
对于字典,它和列表、元组一样,也可以使用字典推导式来快速的生成一个字典,它的表现形式和列表推导式类似,只不过将列表推导式中的中括号[]改为大括号{}:
字典推导式的格式和列表推导式的格式基本相同,具体格式如下:
dictionaryname={key-Expression:value-Expression for循环语句}
例子:
str = 'dagertsadadas'
dic = {k:str.count(k) for k in str }print(dic)
例子2
nickname = ['钻天鼠','彻地鼠','穿山鼠','翻江鼠','锦毛鼠']
name = ['卢方','韩彰','徐庆','蒋平','白玉堂']
dic2 = {i[0]:i[1] for i in zip(nickname,name)}
print(dic2)
3.生成器表达式
优点:节约内存
使用next()进行取值
tu = (i for i in range(10))
print(tu)
输出结果,返回结果为生成器
<generator object <genexpr> at 0x000001C8A129C1B0>
还可以在函数中使用yield来生成,如:
def func():
for i in range(1,5):
yield i
什么是迭代器?
迭代器的范围比生成器更广,只要能够通过next()进行取值的都是迭代器。
迭代器协议
1、迭代协议
1.1、迭代协议:一种是包含iter方法的,另一种是包含getitem方法的(比如str对象就没有iter方法,但是一样能够迭代),只要对象中包含了这两种方法的任意一种,那么这个对象就可以进行迭代操作,也就是实现了迭代协议。
1.2、迭代器协议:
实现了迭代器协议的对象(实现方式:对象内部定义了一个iter()方法)
对象实现了__next__方法
__next__方法返回了某个数值(当然一般情况下,我们需要的是返回这个对象的特定的数字,并且按照一定的顺序进行依次返回)
__next__方法需要在值取完的时候,抛出stopiteration的错误信息。
1.3.可迭代对象:只要内部实现了迭代协议的就是一个可迭代对象(可迭代对象可以进行相关的迭代操作,比如for循环map函数等等)
所有的迭代器都是是可迭代对象
可迭代对象:能够通过for循环遍历的都是可迭代对象,可迭代对象内部只实现了__iter__方法
迭代器:内部实现了__iter__,__next__方法
生成器:生成器是迭代器的一种,在迭代器基础上增加了send(),close(0,throw() 方法
send方法:用于生成器方法
那么生成器和生成器有什么好处呢?生成器并不会一下子把所有的数据全部生成出来,生成器中保存的只是一个生成数据的相关算法,并不会把所有的数据都生成出来,只是在我们需要数据的时候,用生成器去生成一条数据就可以了,这样的话就节约了大量的内存空间。
4、生成器和迭代器的区别:
生成器属于迭代器的一种,如何区分迭代器和生或器?
1、生成器相比迭代器多了三种方法:send(), close(), throw()
send()方法。发送数据
close()方法:关闭生成器
throw()方法:
gen.throw(Exception, “Method throw called!”)
生成器<迭代器<可迭代对象