码迷,mamicode.com
首页 > 其他好文 > 详细

可迭代-迭代器-生成器

时间:2019-10-03 00:31:40      阅读:95      评论:0      收藏:0      [点我收藏+]

标签:code   迭代器   self   object   问题   获取   foo   ext   list   

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

需要掌握的知识点:

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()
技术图片

 

可迭代-迭代器-生成器

标签:code   迭代器   self   object   问题   获取   foo   ext   list   

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

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