• 可迭代-迭代器-生成器


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

    需要掌握的知识点:

    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},
                        ]
    
                    </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> inner(arg):
                        </span><span style="color: #0000ff;">for</span> item <span style="color: #0000ff;">in</span><span style="color: #000000;"> arg:
                            </span><span style="color: #0000ff;">yield</span> {<span style="color: #800000;">'</span><span style="color: #800000;">id</span><span style="color: #800000;">'</span>:item[<span style="color: #800000;">'</span><span style="color: #800000;">id</span><span style="color: #800000;">'</span>], <span style="color: #800000;">'</span><span style="color: #800000;">name</span><span style="color: #800000;">'</span>:item[<span style="color: #800000;">'</span><span style="color: #800000;">name</span><span style="color: #800000;">'</span>],<span style="color: #800000;">'</span><span style="color: #800000;">age</span><span style="color: #800000;">'</span>:item[<span style="color: #800000;">'</span><span style="color: #800000;">id</span><span style="color: #800000;">'</span>]+item[<span style="color: #800000;">'</span><span style="color: #800000;">age</span><span style="color: #800000;">'</span><span style="color: #000000;">]}
    
    
                    </span><span style="color: #0000ff;">return</span> render(request,<span style="color: #800000;">'</span><span style="color: #800000;">test.html</span><span style="color: #800000;">'</span>,{<span style="color: #800000;">'</span><span style="color: #800000;">user_list</span><span style="color: #800000;">'</span>:inner(user_list)})</pre>
    
    复制代码

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

    复制代码
                    class Foo(object):
                        def __init__(self,data):
                            self.data = data
    
                    </span><span style="color: #0000ff;">def</span> <span style="color: #800080;">__iter__</span><span style="color: #000000;">(self):
                        </span><span style="color: #0000ff;">for</span> item <span style="color: #0000ff;">in</span><span style="color: #000000;"> self.data:
                            </span><span style="color: #0000ff;">yield</span><span style="color: #000000;"> item     
    
                </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> test(request):
                    user_list </span>=<span style="color: #000000;"> [
                        {</span><span style="color: #800000;">'</span><span style="color: #800000;">id</span><span style="color: #800000;">'</span>:1,<span style="color: #800000;">'</span><span style="color: #800000;">name</span><span style="color: #800000;">'</span>:<span style="color: #800000;">'</span><span style="color: #800000;">alex</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">age</span><span style="color: #800000;">'</span>:19<span style="color: #000000;">},
                        {</span><span style="color: #800000;">'</span><span style="color: #800000;">id</span><span style="color: #800000;">'</span>:2,<span style="color: #800000;">'</span><span style="color: #800000;">name</span><span style="color: #800000;">'</span>:<span style="color: #800000;">'</span><span style="color: #800000;">eric</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">age</span><span style="color: #800000;">'</span>:18<span style="color: #000000;">},
                    ]
                    obj </span>=<span style="color: #000000;"> Foo(user_list)
                    </span><span style="color: #0000ff;">return</span> render(request,<span style="color: #800000;">'</span><span style="color: #800000;">test.html</span><span style="color: #800000;">'</span>,{<span style="color: #800000;">'</span><span style="color: #800000;">user_list</span><span style="color: #800000;">'</span>:obj})</pre>
    
    复制代码

    测试:

    复制代码
    # 方式三:利用类、__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()
    复制代码
  • 相关阅读:
    博客园主题故障记录及哔哩哔哩主题备份
    Cesium中的primitive竖立流光飞线
    PostgreSQL密码重置方法_WOLF
    软著代码整理技巧总结
    mapboxGL轨迹展示与播放_LZUGIS
    转载 博客园主题——Bili2.0
    为影像数据去除无效值_慕名ArcGIS
    CesiumJS如何自定义浮框
    Cesium中的primitive流光轨迹
    Cesium 地形采样点
  • 原文地址:https://www.cnblogs.com/maaosheng/p/11618794.html
Copyright © 2020-2023  润新知