递归,三目运算,匿名函数,迭代器

1:递归

一:什么是递归
迭代器是间接或者直接调用自己本身
二:代码演示
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中没有做过优化,其它语言有过优化

2:目运算或者三元运算

x,y=3,5
res = x if x > y else y
print(res)

3:匿名函数

匿名就是没有名字的函数

def foo(): # 这是有名函数
    print('from foo')
    
lambda x:x**2 # 这是是匿名函数
func = lambda x:x**2
func(3)  

4:内置函数

还没有讲到,有空就补上去吧

5:迭代器对象和可迭代对象

一:什么是迭代?
迭代是一个重复的功能,他和循环是不一样的,迭代是在上一个结果作为开始的,循环就是重复的一个结果。
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:总结

优点
	它提供了一种不需要索引的迭代循环
	节省内存,惰性运算
缺点
	数据长度无法计算,只有结束时才知道有几个值
	只能往前取值,不能往后取值
	

猜你喜欢

转载自www.cnblogs.com/wait59/p/13179766.html