迭代器
迭代器不是一个函数,它就是一个称呼
可迭代对象
含有.__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的作用:
- 暂停函数
- 通过调用函数拿到值
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)的值。