Python教程:如果获取的数据不是直接可以展示的结构---三种操作方式
如果获取的数据不是直接展示的结构,一下有三中方式
需要掌握的知识点:
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来实现
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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()
本文来自博客园,作者:I'm_江河湖海,转载请注明原文链接:https://www.cnblogs.com/jhhh/p/16761187.html

浙公网安备 33010602011771号