第十三天:迭代器、递归

迭代器

迭代器不是一个函数,它就是一个称呼

可迭代对象

含有.__iter__方法的数据类型就叫做可迭代对象

x = 0

s = 'abc'
s.__iter__()
lt = [1,2,3]
lt.__iter__()
tup = (1,)
tup.__iter__()
dic = {'a':1}
dic.__iter__()
se = {1}
se.__iter__()

只有数字类型不能点出来__iter__方法,所以只有数字类型不是可迭代对象,其余数据类型都是可迭代对象。

迭代器对象

迭代器提供了一种不依赖索引取值的方式

含有._iter__方法和 .__next__的就叫做迭代器对象

可迭代对象使用__iter__后可以变为迭代器,迭代器使用__iter__后依然是迭代器

只有文件是可迭代器对象,只用文件在不用iter方法时可以使用__next__方法

for循环的原理

for循环本质就是一个while循环,只不过是一个可以定可控的while循环

dic_iter = dic.__iter__()
while True :
	try :
		print(dic_iter.__next__())
	except StopIterration:
		break
	

三元表达式

a = 10
b = 20
if a < b
	print(a)
else:
	print(b)
	
	
	
# 三元表达式写法
print(a if a<b else b)

列表推导式

# 生成一个0-9的列表

lt = []
for i range (10)
	lt.append(i)
print(lt)

# 列表推导式
print([i for in range(10)])

字典生成式

dic = {}
for i in range(10)
	dic[i] = i
print(dic)


# 字典生成式
print({i :i for i in range(10)})

zip()方法

res = zip([1,2,3],[1,2,3],'abc') # res 是一个迭代器,__iter__返回元组
print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res)


# (1, 1, 'a')
# (2, 2, 'b')
# (3, 3, 'c')
# <zip object at 0x0000025909DFDD88>


# 通过zip使两个列表生成字典
lt1 = [1,2,3]
lt2 = ['a','b','c']

print({k: v * 2 for k ,v in zip(lt1,lt2)})
# {1: 'aa', 2: 'bb', 3: 'cc'}

生成器生成式

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

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

def scq():
	yeild 3
	yelid 4
print(scq())
# <generator object scq at 0x000001E1F3DC0830>
res = scq()
print(res.__next__)
print(res.__next__)

yield的作用:

  1. 暂停函数
  2. 通过调用函数拿到值
def range1(start)
	count = 0
	while count <0:
		yield count
		count += 1
res = range1(10)
print(res.__next__)
print(res.__next__)
print(res.__next__)

递归

递归就是函数内部直接或间接调用函数本身

递归的实现

函数+分支语句

递归本身是一个函数,需要函数定义的方式去描述

函数内部,采用分支语句对输入的参数进行判断,不能陷入死递归

递归函数的两个特性:

链条:计算过程中存在规律

基例:退出的条件也就是递归的最末端,存在一个或多个不需要再递归的基例。

每一次递归都不会结束函数,并且每一次递归都会开辟内存空间,将函数拷贝一份进去继续执行,直到退出条件成立,完成递归。

# 每次加2
def age(x):
    if x == 0:
        return 18
    x -= 1
    return age(x) + 2


res = age(6)
print(res)  # 32


# 计算n的阶乘
def fact(n):
    if n = 0:
        return 1
    else:
        return n*fact(n-1)

当传的初值为6时,因为它不等于0,所以他会执行age(5)+2

但是他也不知道age(5)的值,所以计算机就会开辟一个新的内存空间去计算age(5)的值,同理计算机会一直计算age(4),age(3)直到x == 0,得到age(0)的值,然后再逐步把值传给age(1),age(2),直到age(6).最后得出age(6)的值。

posted @ 2019-09-24 21:28  KONNE  阅读(128)  评论(0编辑  收藏  举报