迭代 三元。。。

叠加多个装饰器:
1.装饰器的加载顺序是:自下而上
2.装饰器内wrapper函数的执行顺序是:自上而下
即先把离原始index最近的装饰器加载进去使index的地址变成第一个装饰器的wrppper1(index),在加载第二个
装饰器的时候使index的内存地址变成wrppper1(index)的内存地址即wrppper2(wrppper1(index))



迭代器:

1.什么是迭代器?
迭代指的是一个重复的过程,每一次重复都是基于上一次的结果而来的。
类似:
li=['a','b','c','d']
i=0
while i<len(li):
print(li[i])
i+=1
迭代器指的是迭代取值的工具,该工具的特点是可以不依赖索引取值。

2.为什么要用迭代器?
1.就是为了找出一种通用的可以不依赖与做一名的迭代取值方式
2.




3.如何要用迭代器?
可迭代的对象:但凡内置有。__inter__方法的对象都称之为可迭代对象
(str,list,tuple,dict,set,文件对象)
迭代器对象 :即内置有__iter__方法,又内置有__next__方法
(文件对象)
调用可迭代对象的__iter__会得到一个迭代器对象
调用可迭代器对象的__iter__会得到迭代器本身


4.总结迭代器的优缺点:
优点:1.提供了一种通用的可以不依赖于索引的迭代取值方式
2.同一时刻在内存中只有一个值,更加节省内存

缺点:1.取指定值不如索引灵活
2.无法预知迭代器数据的个数
3.只能一次使用基于上一次的next的结果执行下一次,一旦想重新使用只能重新生成



可迭代对象可以转换称迭代器对象:调用可迭代对象内置的__iter__方法会有一个返回值,该返回值是可迭代器对象。
li={'a':11,'b':22,'c':34,'d':55}
iter_li=li.__iter__()
print(iter_li)
res1=iter_li.__next__()
print(res1)
res2=iter_li.__next__()
print(res2)
两次取值不同





for循环准确的说应该是迭代器循环
1.先调用in后面那个值的__iter__方法,得到迭代器对象。
2.执行迭代器,__next()__方法得到一个返回值,然后赋值给一个变量,运行循环体代码,
循环反复,直到迭代器取完值......



自定义迭代器:
yield关键字:只能用在函数内
在函数内但凡包含yield关键字,再去执行函数,就不会立刻运行函数体代码了
会得到一个返回值,该返回值称之为生成器对象,生成器本质就是迭代器。

总结yield:
1.提供一种自定义迭代器的解决方案
2.yield可用于返回值
yield VS return
相同点:都可以用于返回值
不同点:yield可以暂停函数,返回多次值;return作为返回值只返回一次值就结束函数

例子:
def func():
print('xxxxx1')
yield 1
print('xxxxx2')
yield 2
g=func()
res=next(g)
print(res)#返回值是打印1
res2=next(g)
print(res2)
超出报错







三元表达式:
def max2(x,y):
if x>y:
return x
else:
return y
相当于:
res=x if x>y else y


列表生成式:
l=[]
for i in range(1,11):
if i>4:
res='egg%s'%i
l.append(res)
print(l)
相当于:
l=['egg%s'%i for i in range(1,11) i
f i>4]
print(l)


列表元素更改__添加
names=['egon','apple','alxe']
L=[‘%s_ab’%name for name in names if name !=‘apple’ ]


字典生成式
Items=[(‘name’,’egon’) ,(‘age’,’18’), (‘sex’,’male’)]
dic={}
for k,v in items:
dic[k]=v
print(dic)
相当于:
res={k:v for k,v in items if k !=’sex’}
print(res)



生成器表达式:
res=(i**2 for i in range(3))




posted @ 2018-09-28 15:11  路口有雾  阅读(162)  评论(0编辑  收藏  举报