可迭代-迭代器-生成器

如果获取的数据不是直接可以展示的结构---三种操作方式

如果获取的数据不是直接展示的结构,一下有三中方式

需要掌握的知识点:

1、yield返回的是一个生成器,只有在迭代的时候才会一个一个的被执行

问题:

  2、什么是可迭代对象?

    答:有__iter__方法的就是可迭代对象,返回的是一个迭代器,也可以返回一个生成器

  3、什么是迭代器?

    答:有__next__方法的就是迭代器,迭代器是往前一个一个的取值,但是不能生成值

  4、什么是生成器

    答:生成器是基于迭代器的,不仅取值还能生成值。被执行后返回的是一个生成器

return和yield的不同:

  return只能返回一次,return是结束本次函数执行的标志

  yield可以返回多次,yield调用next才会别执行

方案一:循环一次,生成数据

user_list = [
                        {‘id‘:1,‘name‘:‘alex‘,‘age‘:19},
                        {‘id‘:2,‘name‘:‘eric‘,‘age‘:18},
             ]
             new_user_list = []
             for item in user_list:
                  item["age"] = item["id"]+item["age"]
                  new_user_list.append(item["age"])
             return render(request,‘test.html‘,{‘user_list‘:new_user_list})

方案二:利用yield来实现

    def test(request):
                    user_list = [
                        {‘id‘:1,‘name‘:‘alex‘,‘age‘:19},
                        {‘id‘:2,‘name‘:‘eric‘,‘age‘:18},
                    ]

                    def inner(arg):
                        for item in arg:
                            yield {‘id‘:item[‘id‘], ‘name‘:item[‘name‘],‘age‘:item[‘id‘]+item[‘age‘]}

                    return render(request,‘test.html‘,{‘user_list‘:inner(user_list)})

方案三:利用类、__iter__、yield实现,自定义的可迭代对象

                class Foo(object):
                    def __init__(self,data):
                        self.data = data

                    def __iter__(self):
                        for item in self.data:
                            yield item     

                def test(request):
                    user_list = [
                        {‘id‘:1,‘name‘:‘alex‘,‘age‘:19},
                        {‘id‘:2,‘name‘:‘eric‘,‘age‘:18},
                    ]
                    obj = Foo(user_list)
                    return render(request,‘test.html‘,{‘user_list‘:obj})

测试:

# 方式三:利用类、__iter__、yield实现
class Foo(object):
    def __init__(self,arg):
        self.arg = arg
    def __iter__(self):
        for item in self.arg:
            yield item
            yield {"age":item["age"]+item["id"]}
def test():
    user_list = [
        {"id": 222, "name": "haiyan", "age": 33},
        {"id": 2, "name": "zzz", "age": 13}
    ]
    obj = Foo(user_list)   #一实例化类就会去调用__init__方法
    for i in obj:   #会先执行__iter__方法,,__iter__方法里面返回什么就循环的是什么 。    for循环的本质就是执行一个一个的next()方法
        print(i)
test()

原文地址:https://www.cnblogs.com/maaosheng/p/11618794.html

时间: 2024-10-28 07:54:01

可迭代-迭代器-生成器的相关文章

python之 可迭代 迭代器 生成器

0. 1.总结 (1) iterable 可迭代(对象) 能力属性 指一个对象能够一次返回它的一个成员,for i in a_list 而不需要通过下标完成迭代. 例子包括所有序列类型(list, str, tuple), 以及 dict, file, 还包括定义了 __iter__() 或 __getitem__() 方法的类实例. iterator 迭代器 具体实现 代表数据流的对象.重复调用迭代器的 next() (python3为 __next__()) 方法将依次返回流中的项.当没有更

迭代.迭代器.生成器.Python

迭代 如果给定一个 list 或 tuple,我们可以通过 for 循环来遍历这个 list 或 tuple ,这种遍历我们称为迭代 (Iteration). 可迭代:一个对象.物理或者虚拟存储的序列. list,tuple,strings,dictionary,set 以及生成器对象都是可迭代的,整数型是不可迭代的.那么,如何判断一个对象是可迭代对象呢?方法是通                      过 collections 模块的 Iterable 类型判断: [在 Python 中可

迭代器&迭代对象&生成器

迭代器 & 迭代对象 & 生成器 包含__next__ 和 __iter__两个方法的对象为迭代器 __next__方法返回单个元素 __iter__方法返回迭代器本身 可迭代对象包含__iter__方法,每次都实例化一个新的迭代器 因此,迭代器可以迭代,但是可迭代对象不一定是迭代器 生成器是一种特殊的迭代器 import re import reprlib RE_WORD = re.compile('\w+') class Sentence: def __init__(self, tex

Day4 - 迭代器&生成器、装饰器、Json & pickle 数据序列化、软件目录结构规范

---恢复内容开始--- 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 需求:列表a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求把列表里的每个值加1 1 a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 2 b = [] 3 for i in a: 4 b.append(i+1) 5 a = b 6 print(a) 普通青

函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数

函数嵌套名称空间与作用域闭包函数装饰器迭代器生成器三元表达式,列表解析,生成器表达式递归与二分法内置函数--------------------------------------------函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数def max(x,y): if x>y: return x else: return ydef max1(a,b,c,d): res=max(a,b) res2=max(res,c) res3=ma

[python]--迭代器,生成器补充

在python中,list,string,dict都是可迭代对象,可以通过for语句遍历. 迭代器 迭代器对象要求支持迭代器协议的对象,在python中,支持迭代器协议就算实现对象的__iter__()和next()方法.其中__iter__()方法返回迭代器对象本身; next()方法返回容器的下一个元素,在结尾时引发StopIteration异常 __iter__()和next()方法 这两个方法是迭代器最基本的方法,一个用来获得迭代器对象,一个用来获取容器中的下一个元素. 对于可迭代对象,

python中的迭代、生成器等等

本人对编程语言实在是一窍不通啊...今天看了廖雪峰老师的关于迭代,迭代器,生成器,递归等等,word天,这都什么跟什么啊... 1.关于迭代 如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)(Iteration的中文意思就是:反复.重复.迭代等).而这些for循环所遍历的对象(list or tuple 等)成为可迭代对象(Iterable). 也就是说"迭代"就是一个动作或者过程,可以把list或tup

函数---迭代器&生成器&列表解析&三元表达式

可迭代对象:obj.__iter__ 迭代器:iter1=obj.__iter() 1iter1.__next__ 2iter2.__next__ 迭代器: 优点:不依赖索引 惰性计算,节省内存 缺点: 不如按照索引的取值方便 一次性,只能往后取,不能回退 迭代器的应用: 提供了一种不依赖索引的统一的迭代方法 惰性计算,比如取文件的每一行 判断可是否是可迭代对象和迭代器 from collections import Iterable, Iterator # 导入模块功能 isinstance(

Python 迭代器&生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致 迭代器&