码迷,mamicode.com
首页 > 编程语言 > 详细

python-迭代器和生成器

时间:2018-07-18 16:59:13      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:的区别   err   程序   instance   一个   传递   def   分类   ati   

#迭代器
#dir(),可查看对象或类的内部定义了哪些函数.
# print(dir(int))
# print(dir(list))
# tu = (1,)
# print(dir(tu))

#__iter__() 得到可迭代对象的迭代器
lst = [1,2,3,4,5,6,7,8,9]
it = lst.__iter__()

#__next__() 得到迭代器中的元素
# print(it.__next__())
# print(it.__next__())
# print(it.__next__())
# print(it.__next__())
#已到迭代器的最后一个元素再执行__next__()会报error stopiteration.

#生成器
#1.通过生成器函数获取生成器
#2.通过各种推导式来实现生成器
#3.通过数据的转换也可获取生成器

#什么是生成器?
#自己通过python写的迭代器就是生成器

#return和yield的区别
#函数中是return,执行这个函数时会产生一个返回值,当函数在执行过程中遇到return会直接终止函数
#函数中时yield,执行函数时,就不再是函数的执行了,而是通过函数获取了一个生成器对象.yield也返回一个值,
#但不会终止函数,通过__next__()可执行到下一个yield.
def func():
print(111)
yield 222
print(333)
yield 444

gen = func()
ret0 = gen.__next__()
print(ret0)
ret1 = gen.__next__()
print(ret1)
#当函数运行到最后一个yield,再执行__next__()程序会报错

#send()和__next__()的区别
#send()和__next__()一样都会让程序执行到下一个yield
#send()可以给上一个yield的位置传递值,不能给最后一个yield传递值,在第一次执行生成器代码时不能使用send(),但可使用__next__()












# li = []
# for i in range(1,14):
# li.append(‘python%d期‘%i)
# print(li)
#
# l2 = [i for i in range(1,14)]
# print(l2)
#
# l3 = [‘python%s期‘%i for i in range(1,14)]
# print(l3)
#
# l4 = [‘技师%s号‘%i for i in range(16)]
# print(l4)
#
# l5 = [‘护士%s号‘%i for i in range(1,14,2)]
# print(l5)

#可迭代对象
# 内部含有__iter__()方法的就是可迭代对象
# 可迭代对象不能直接取值,因为内部没有__next__()方法

#可迭代对象-->生成器
# obj.__iter__()
# iter(obj)

#迭代器的优点
# 1.节省内存
# 2.惰性机制
# 3.单向不可逆

#如何判断可迭代对象
# (‘__iter__‘ in dir(obj))
# isinstance(obj,)
# lst = []
# from collections import Iterable
# print(isinstance(lst,Iterable))
# from collections import Iterator
# print(isinstance(lst,Iterator))

#文件句柄时迭代器

#生成器表达式,列表推导式
#分类:循环模式 筛选模式
#循环模式:[变量或者加工收的变量 for 变量 in Iterable]
# lst = [i for i in range(11)]
# print(lst)
# lst1 = [‘python%s期‘%i for i in range(1,11)]
# print(lst1)

#优点:节省代码,看着高大上
#缺点:不好排错
#整体:
#凡是用列表推导式构造的列表对象,用其他方法都可构建.非常复杂的列表,列表推导式是构造不出的.

#筛选模式:[变量或加工后的变量 for 变量 in Iterable if 条件]
# l1 = [i**2 for i in range(11)]
# print(l1)
#
# l2 = [i**2 for i in range(31) if i % 3 == 0]
# print(l2)
#
# l3 = [i for i in range(1,101,2)]
# print(l3)
#
# l3 = [i for i in range(101) if i % 2 == 1]
# print(l3)

# names = [[‘Tom‘,‘Billy‘,‘Jefferson‘,‘Andrew‘,‘Wesley‘,‘Stevne‘,‘Joe‘],[‘Alice‘,‘Jill‘,‘Ana‘,‘Wendy‘,‘Jennifer‘,‘Sherry‘,‘Eva‘]]
# lst = [el for lst1 in names for el in lst1 if el.upper().count(‘E‘) == 2]
# print(lst)

python-迭代器和生成器

标签:的区别   err   程序   instance   一个   传递   def   分类   ati   

原文地址:https://www.cnblogs.com/v-yure/p/9329294.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!