标签:开发 lambda def 转换 结束 捕捉异常 直接 ict 效率
迭代器是间接或者直接调用自己本身
def foo():
print(‘from foo‘)
foo()
foo()
def bar():
print("from bar")
def test():
print("from test")
bar()
test()
回溯就是从外向里一层一层递归调用下去,回溯阶段必须要有一个明确地结束条件,每进入下一次递归时,问题的规模都应该有所减少(否则,单纯地重复调用自身是毫无意义的)
递推就是从里向外一层一层结束递归
l = [1,[2,3,[4,5,6,[7,8,9,10,[11,12,13,14,15,[16,17,18,19,29]]]]]]
def xx(l):
for i in l:
if type(i) == list:
xx(i)
else:
print(i)
递归效率低下,在python中没有做过优化,其它语言有过优化
x,y=3,5
res = x if x > y else y
print(res)
匿名就是没有名字的函数
def foo(): # 这是有名函数
print(‘from foo‘)
lambda x:x**2 # 这是是匿名函数
func = lambda x:x**2
func(3)
还没有讲到,有空就补上去吧
迭代是一个重复的功能,他和循环是不一样的,迭代是在上一个结果作为开始的,循环就是重复的一个结果。
while 1:
print("from while")
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
count = 0
while count < len(l):
print(l[count])
count +=1
上方两个demo一个是循环,一个是迭代。
list,tuple,str这三个数据类型都是可以索引取值,但是set,dict,file类型,是没有索引取值一说的。但是我们又要取值,所以语言开发者就是设计了可迭代对象
内置有__iter__方法的对象,都是可迭代数据类型
‘word‘.__iter__ # str
(1,).__iter__ # tuple
[1].__iter__ # list
{‘k1‘:1}.__iter__ #dict
{‘xx‘,‘oo‘}.__iter__ # set
open(‘db.txt‘).__iter__ # file
可迭代对象执行__iter__()得到的结果就是迭代器对象
迭代器对象:是内部含有__iter__和__next__两个方法的对象
f = opne(‘db.txt‘,encoding=‘utf-8‘,mode=‘rt‘)
f是迭代器对象
f.close()
五:迭代器对象的使用
dic={‘a‘:1,‘b‘:2,‘c‘:3}
iter_dic=dic.__iter__() # 得到迭代器对象,迭代器对象即有__iter__又有__next__,但是:迭代器.__iter__()得到的仍然是迭代器本身
iter_dic.__iter__() is iter_dic #True
print(iter_dic.__next__()) #等同于next(iter_dic)
print(iter_dic.__next__()) #等同于next(iter_dic)
print(iter_dic.__next__()) #等同于next(iter_dic)
# print(iter_dic.__next__()) #抛出异常StopIteration,或者说结束标志
#有了迭代器,我们就可以不依赖索引迭代取值了
iter_dic=dic.__iter__()
while True:
try:
k=next(iter_dic)
print(dic[k])
except StopIteration:
break
#这么写太麻烦了,需要我们自己捕捉异常,调用next,所以python为我们封装了fof迭代器循环
六:for循环
dic = {‘k0‘:0, "k2":1, "k3":3}
for key in dic:
print(dic[key])
使用for循环时,dic执行了__iter__()方法,转换成了迭代器。再根据迭代器的内置方法__next__(),一个一个取,等到值取完时。就推出了循环
7:总结
优点
它提供了一种不需要索引的迭代循环
节省内存,惰性运算
缺点
数据长度无法计算,只有结束时才知道有几个值
只能往前取值,不能往后取值
标签:开发 lambda def 转换 结束 捕捉异常 直接 ict 效率
原文地址:https://www.cnblogs.com/wait59/p/13179766.html