迭代器、生成器、推导式
作者:互联网
#内部含有__iter__方法的都是可迭代对象 for i in '123': print(i) print(dir('123'))#输出对象所有内部方法 print('__iter__' in dir(str))#True print('__iter__' in dir(dict))#True print('__iter__' in dir(list))#True print('__iter__' in dir(set))#True print('__iter__' in dir(int))#False print('__iter__' in dir(bool))#False #迭代器:可迭代对象通过__iter__()方法可以转换成迭代器,满足迭代器协议 #内部含有 __iter__() 和 __next__() 方法的就是迭代器 a = [1, 2, 3] a_obj = a.__iter__() print(a_obj)#<list_iterator object at 0x7fdabad7ffd0> #1、迭代器取值 .__next__(),惰性机制 print(a_obj.__next__())#1 print(a_obj.__next__())#2 print(a_obj.__next__())#3 #2、for循环,对迭代对象执行__iter__()转换成迭代器,然后使用迭代器协议实现循环 for i in a_obj: print('i', i) #判断是否迭代器 #第一种方式: print('__next__' in dir(a_obj))#True #第二种方式 from collections import Iterable#迭代对象 from collections import Iterator#迭代器 #isinstance 判断一个对象是否是一个已知的类型,类似type(),比type()更广泛,考虑继承关系 print(isinstance('123', Iterable))#True print(isinstance('123', Iterator))#False print(isinstance(a_obj, Iterable))#True print(isinstance(a_obj, Iterator))#True #迭代器特点: """ 1、节省内存 2、满足惰性机制 3、取值过程不可逆 """ #生成器:本质也是迭代器,满足迭代器特点, 是Python写的迭代器 #1、通过生成器函数构建;2、通过生成器推导式构建 def test1(): print('test1') yield 123 a = 1 b = 2 print(a) print(b) yield a test1_obj = test1()#生成器对象初始化 print(test1_obj)#<generator object test1 at 0x7f8dcba69ac0> print(test1_obj.__next__())#test1 123 #每个__next__()执行到yield停止,下次__next__()继续执行 print(test1_obj.__next__())#1 2 1 #2、send 把值赋给上一个yield, 所以第一个不能用send,需要用next def test3(): print("test3") # yield 1 a = yield 1 print("test3", a) yield 2 print("test3", a) yield 3 test3_obj = test3() print(test3_obj.__next__(), 'M')#test3 1 M print(test3_obj.send(555), "M2")#test3 555 2 M2 print(test3_obj.send(666), "M3")#test3 555 3 M3 #3、最后一个yield无法获取send的值 #列表推导式。一句话生成需要的列表 #优点:简单 #缺点:不能debug,占内存 #普通类别 li = [] for i in range(1, 6): li.append(i) #推导式 L1 = [i for i in range(1, 6)]#[变量 for 变量 in 可迭代对象] 遍历模式 print(L1) L2 = ["test%s" % (i) for i in range(1, 6)]# 变量是可加工的 print(L2) L3 = [i + 'test' for i in L2] print(L3) ##[变量 for 变量 in 可迭代对象 if 条件] 筛选模式 L3 = [i for i in range(1, 101) if i % 2 == 1] print(L3) #生成器表达式,与推导式类似,使用小括号 #(变量 for 变量 in 可迭代对象) #优点,节省内存 L4 = (i for i in range(1, 6)) print(type(L4)) #*扩展: 还有字典推导式、集合推导式,例: #字典推导式 dic1 = {'name': 'Jerry', 'age': 30} dic2 = {k: v for k, v in dic1.items() if k == 'name'} print(dic2) #集合推导式 L5 = [1, 2, 3, 5, 6, 6, 7] s1 = {i for i in L5} print(s1) #练习 #求20以内所有能被3整除数的平方 L6 = [i**2 for i in range(1, 20) if i % 3 == 0] print(L6) #将列表中包含两个a的元素放到新列表中 L7 = [['aa', 'bb'], ['cc', 'acac']] L8 = [y for x in L7 for y in x if y.count('a') == 2] print('L8', L8) #将字典的key,value对调 dic3 = {'k1': 'v1', 'k2': 'v2'} dic4 = {v: k for k, v in dic3.items()} print(dic4)
标签:__,test3,obj,迭代,推导,生成器,next,print 来源: https://www.cnblogs.com/ggsdddup/p/16383154.html