python-day13~14_迭代器_生成器
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-day13~14_迭代器_生成器,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3948字,纯文字阅读大概需要6分钟。
内容图文
1,迭代器
# print(dir([])) #告诉我列表拥有的所有方法
# 只要是能被for循环的数据类型 就一定拥有__iter__方法
# print([].__iter__())
# 一个列表执行了__iter__()之后的返回值就是一个迭代器
# Iterable 可迭代的 -- > __iter__ #只要含有__iter__方法的都是可迭代的
# [].__iter__() 迭代器 -- > __next__ #通过next就可以从迭代器中一个一个的取值
# 只要含有__iter__方法的都是可迭代的 —— 可迭代协议
# 双下方法
# print([1].__add__([2]))
# print([1]+[2])
# class A:
# # def __iter__(self):pass
# def __next__(self):pass
#
# a = A()
# print(isinstance(a,Iterator))
# print(isinstance(a,Iterable))
# 迭代器的概念
# 迭代器协议 —— 内部含有__next__和__iter__方法的就是迭代器
# 迭代器协议和可迭代协议
# 可以被for循环的都是可迭代的
# 可迭代的内部都有__iter__方法
# 只要是迭代器 一定可迭代
# 可迭代的.__iter__()方法就可以得到一个迭代器
# 迭代器中的__next__()方法可以一个一个的获取值,遇到yield会停下,没遇到yield会报错
#for
#只有 是可迭代对象的时候 才能用for
#当我们遇到一个新的变量,不确定能不能for循环的时候,就判断它是否可迭代
# for i in l:
# pass
#iterator = l.__iter__()
#iterator.__next__()
#迭代器的好处:
# 从容器类型中一个一个的取值,会把所有的值都取到。
# 节省内存空间
#迭代器并不会在内存中再占用一大块内存,
# 而是随着循环 每次生成一个
# 每次next每次给我一个
2,生成器函数
#生成器函数
# def generator():
# print(1)
# return 'a'
#
# ret = generator()
# print(ret)
#只要含有yield关键字的函数都是生成器函数
# yield不能和return共用且需要写在函数内
# 程序遇到yield会暂停,并返回yield后面的值。yield关键字后面如还有代码,则生成器仍驻留在内存中,可被接着调用
# def generator():
# print(1)
# yield 'a'
# #生成器函数 : 执行之后会得到一个生成器作为返回值
# ret = generator()
# print(ret)
# print(ret.__next__())
# def generator():
# print(1)
# yield 'a'
# print(2)
# yield 'b'
# yield 'c'
# g = generator()
# for i in g:
# print(i)
# ret = g.__next__()
# print(ret)
# ret = g.__next__()
# print(ret)
# ret = g.__next__()
# print(ret)
3,
# def generator():
# print(123)
# content = yield 1
# print('=======',content)
# print(456)
# arg = yield 2
# ''''''
# yield #如果生成器最后一个yield之后没有返回值,但还有代码要跑,也需要用一个空yield来结束
# g1 = generator()
# g2 = generator()
# g1.__next__()
# g2.__next__()
# print('***',generator().__next__())
# print('***',generator().__next__())
# g = generator()
# ret = g.__next__()
# print('***',ret)
# ret = g.send('hello') #send的效果和next一样
# print('***',ret)
#send 获取下一个值的效果和next基本一致
#只是在获取下一个值的时候,给上一yield的位置传递一个数据
#使用send的注意事项
# 第一次使用生成器的时候 是用next获取下一个值
# 函数中的最后一个yield不能接受外部的值
4,预激生成器,预激生成器的装饰器
5,生成器表达式
# egg_list=['鸡蛋%s'%i for i in range(10)] #列表推导式
#生成器表达式
# g = (i for i in range(10))
# print(g) #生成器
# for i in g:
# print(i)
生成器Generator:
本质:迭代器,所以拥有__iter__方法和__next__方法
特点:惰性运算,开发者自定义
使用生成器的优点:
延迟计算,一次返回一个结果。也就是说,它不会一次生成所有的结果,这对于大数据量处理,将会非常有用
#列表解析 sum([i for i in range(100000000)])#内存占用大,机器容易卡死 #生成器表达式 sum(i for i in range(100000000))#几乎不占内存
6,推导式
#[每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型] #遍历之后挨个处理
#[满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件] #筛选功能
# #30以内所有能被3整除的数
# ret = [i for i in range(30) if i%3 == 0] #完整的列表推导式
# g = (i for i in range(30) if i%3 == 0) #完整的生成器推导式
# print(ret)
#字典推导式
# 例一:将一个字典的key和value对调
# mcase = {'a': 10, 'b': 34}
# #{10:'a' , 34:'b'}
# mcase_frequency = {mcase[k]: k for k in mcase}
# print(mcase_frequency)
#集合推导式,自带结果去重功能
# squared = {x**2 for x in [1, -1, 2]}
# print(squared)
作业:www.cnblogs.com/eva-j/articles/7213953.html
内容总结
以上是互联网集市为您收集整理的python-day13~14_迭代器_生成器全部内容,希望文章能够帮你解决python-day13~14_迭代器_生成器所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。