day13-迭代器、三元表达式、列表生成式、字典生成式、生成器生成式、递归、汉诺塔问题

迭代器

1、不是函数

2、除了数字类型,所有数据类型都是可迭代对象

迭代器对象

#含有__iter__和__next__方法的对象就叫迭代器对象,可迭代对象使用__iter__变成迭代器对象
#只有文件是迭代器对象
#迭代器对象的作用:提供了一种不依赖索引取值的方式
#可迭代对象使用__iter__()方法变成迭代器对象,迭代器使用__iter__()是迭代器(本身)

for循环原理

dic = {'a':1, 'b':2, 'c':3}
dic_iter = dic.__iter__()
while True:
    try:
    	dic_iter.__next__()
	except StopIteration:
        break

三元表达式

print(x if x >y else print(y))

列表生成式

lt = [i for i in range(10)]

字典生成式

#zip()
#res = zip(lt1, lt2, str1, ...)
'''
res是一个迭代器,__next__会返回一个元组
zip()会把括号内的每一个可迭代对象的第一个元素拿出来放到一个元组中
'''

lt1 = ['a', 'b', 'c']
lt2 = [1, 2, 3]

dic = {k: v  for k, v in zip(lt1, lt2)}
print(dic)

生成器生成式

生成器generator:本质是迭代器,是一个自定义的迭代器

lt1 = (i for i in range(5))

生成器

生成器:含有yield关键字的函数叫生成器

def func1():
    yield  3
    yield  4
print(func1)  #function
print(func1())  #generator

f = func1()
print(f.__next__())  #3

#yield的特性
#1、暂停函数 2、通过next取值

#return的特性
#1、终止函数 2、通过调用函数取值

递归

函数内部直接或间接调用函数本身

每一次递归,不会结束函数,并且每次递归都会开辟新的内存空间,真正的递归要有退出条件

'''
def fun1():  #死递归
	fun1()
fun1()
'''

汉诺塔

def move(n ,a, buffer, c):
    if n == 1:
        print(a, '->', c)
    move(n-1, a, c, b)  # 1)
    move(1, a, b, c)  # 2)
    move(n-1, b, a, c)  # 3)
move(3, 'a', 'b', 'c')
'''
>>>
a -> c
a -> b
c -> b
a -> c
b -> a
b -> c
a -> c

1)把n-1个棋子,通过缓冲区b,从a移到c
2)把最底下的棋子,从a移到c
3)同1),把n-1个棋子,通过缓冲a,从b移到c
'''

posted on 2019-09-24 21:08  shenblogs  阅读(110)  评论(0)    收藏  举报

导航