博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
迭代器 生成器 列表推导式 生成器表达式的一些总结
阅读量:5094 次
发布时间:2019-06-13

本文共 3165 字,大约阅读时间需要 10 分钟。

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)
 

 

 

 

 
 

转载于:https://www.cnblogs.com/HoneyTYX/p/9047203.html

你可能感兴趣的文章
常见的js算法面试题收集,es6实现
查看>>
IO流写出到本地 D盘demoIO.txt 文本中
查看>>
(转)linux sort,uniq,cut,wc命令详解
查看>>
关于ExecuteNonQuery执行的返回值(SQL语句、存储过程)
查看>>
UVa540 Team Queue(队列queue)
查看>>
Screening technology proved cost effective deal
查看>>
【POJ2699】The Maximum Number of Strong Kings(网络流)
查看>>
spring boot配置跨域
查看>>
BZOJ 1996 合唱队(DP)
查看>>
进击吧!阶乘——大数乘法
查看>>
安卓学习资料推荐-25
查看>>
Mysql数据库备份和还原常用的命令
查看>>
关于退出当前页面在火狐的一些问题
查看>>
【项目实施】项目考核标准
查看>>
spring-aop AnnotationAwareAspectJAutoProxyCreator类
查看>>
经典入门_排序
查看>>
Redis Cluster高可用集群在线迁移操作记录【转】
查看>>
二、spring中装配bean
查看>>
VIM工具
查看>>
javascript闭包
查看>>