02,迭代器 可迭代对象: 内部含有__iter__ 遵循可迭代协议 dir 显示里面的所有方法 有 __iter__ 的方法就是 可迭代对象
# print(dir('123')) # '__iter__'# print('__iter__' in dir([1, 2, 3]))# print('__iter__' in dir({'name':'alex'}))# print('__iter__' in dir({'name'}))# print('__iter__' in dir((1, 2, 3)))# print('__iter__' in dir(1)) # False# print('__iter__' in dir(True)) # False
迭代器:可迭代对象.__iter__()可以转换成迭代器 ,满足迭代器协议
# l = [1, 2, 3]# l_obj = l.__iter__()# print(l_obj)
内部含有__iter__且__next__ 迭代器的取值的两种方法:
# 迭代器的取值两种方法:# 方法一:__next__()# print(l_obj.__next__())# print(l_obj.__next__())# print(l_obj.__next__())# print(l_obj.__next__())
# 方法二 for循环# for i in l_obj:# print(i)# print('__next__' in dir(l_obj))
判断 __iter__ 在不在dir(对象中) isinstance()
from collections import Iterablefrom collections import Iteratorprint(isinstance('123', Iterable))print(isinstance('123', Iterator))
# 实际上可迭代对象是不可以一个一个的一次取值的,因为他没有__next__方法。 # for循环提供一个机制: # 1,将可迭代对象转化成迭代器。 # 2,利用__next__进行取值。 # 3,用try异常处理方法防止报错。
迭代器的特点 : 节省内存。 满足惰性机制。 取值过程单向不可逆。 for 循环的机制:
# l = [1, 2, 3, 4, 5]# l_obj = l.__iter__()# while True:# try:# print(l_obj.__next__())# except Exception:# break
03,生成器 本质上是迭代器,用python代码构建的。
# 1,通过生成器函数构建。 # 2,通过生成器推导式构建。 构建过程:
# def func1():# print(11)# print(333)# yield 222# print(666)# yield 777# g_obj = func1() # 生成器对象 generator object# print(g_obj.__next__())# print(g_obj.__next__())
PS:
# def cloth1():# for i in range(1,10001):# print('衣服%s' % i)# # cloth1()### def cloth2():# for i in range(1,10001):# yield '衣服%s' % i## g = cloth2()# for i in range(1,51):# print(g.__next__())## for i in range(1, 151):# print(g.__next__())
yield send 和 next 区别
def func1(): count = yield 222 print(count) yield 777 yield 888g_obj = func1() # 生成器对象 generator objectprint(g_obj.__next__())print(g_obj.send('wusir'))
# 1,send 具有next功能。 # 2,send 可以给上一个yield传值。 # 3, 第一个取值不能使用send. # 4,最后一个yield不会得到send的值。、
# 列表推导式: 能用列表推导式完成的,用python代码都可以完成。 用一句话构建一个你想要的列表。 # 优点:简单,稍微难理解。 # 缺点: 不能用debug。
格式 : [ 变量(加工后的变量) for 变量 in 可迭代对象 ] 遍历模式
li = [i for i in range(1, 12)]
# li = ['alex', 'wusir', 'taibai', 'nvshen', 'ritian']# li = ['python%s期' % i for i in range(1, 12)]# print(li)
# [ 变量(加工后的变量) for 变量 in 可迭代对象 ] 遍历模式 # [ 变量(加工后的变量) for 变量 in 可迭代对象 if 判断] 筛选模式
# l1 = [i for i in range(1, 101) if i % 2 == 0]# print(l1)
#1,筛选,100以内所有的奇数。# l2 = [i for i in range(1, 101) if i % 2 == 1]# l2 = [i for i in range(1, 101, 2)]# print(l2)#2,10以内所有数的平方。 [1,4,9,16.。。100]# print([i*i for i in range(1, 11)])#3,将100以内所有内被三整除的数留到列表中。# print([i for i in range(1,101) if i % 3 == 0])
#30以内所有能被3整除的数的平方# print([i*i for i in range(1, 31) if i % 3 ==0])
# 列表推导式 简单明了,但是占内存 # 生成器表达式 节省内存,不易看出。
# names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],# ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]# l3 = [ name for i in names for name in i if name.count('e') == 2] # print(l3)
字典
mcase = { 'a': 10, 'b': 34}mcase_frequency = {mcase[k]: k for k in mcase}print(mcase_frequency)