ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

迭代器、生成器、推导式

2022-06-16 19:37:19  阅读:159  来源: 互联网

标签:__ test3 obj 迭代 推导 生成器 next print


#内部含有__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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有