迭代器
迭代器就是迭代的工具,每一次迭代(重复)都是基于上一次的结果,计算机中的迭代开发就是基于软件的上一个版本更新
可迭代对象
python中一切皆对象,但不都是可迭代对象,可以使用__iter__
方法的才是可迭代对象
可迭代对象:python内置str,list,tuple,dict,set,file都是可迭代对象
迭代器对象
可迭代对象执行__iter__
方法得到的返回值就是迭代器对象
特点
- 内置
__next__
方法,执行该方法会拿到迭代器对象中的一个值 - 内置有
__iter__
方法,执行该方法会拿到迭代器本身 - 文件本身就是迭代器对象
缺点
- 取值麻烦,只能一个一个取,且只能往后取,值被取后就没了
- 无法使用len()方法获取长度
for循环原理
for循环称为迭代器循环,in后必须是可迭代对象
迭代器使用__iter__
方法后拿到的还是迭代器自身,所以for循环不用考虑in后是迭代器对象还是可迭代对象
对可迭代对象使用__iter__
方法后变成一个迭代器对象,这个迭代器对象只占用一小块内存空间,在使用__next__
后才会一个一个地输出值
三元表达式
三元表达式就是将if...else...条件判断写在一行里得出一个值的形式
条件成立时的返回值 if 条件 else 条件不成立时的返回值
列表推导式
列表推导式是通过一行来构建我们需要的列表,但不推荐使用
常用写法为:[结果 for 变量 in 可迭代对象]
字典生成式
字典生成式是通过一行来构建我们需要的字典
lst1 = ['myz','yzm']
lst2 = ['gao','shuai']
dic = {lst1[i]:lst2[i] for i in range(len(lst1))}
print(dic)
{'myz': 'gao', 'yzm': 'shuai'}
zip方法
zip方法可以像拉链一样,把两个对象一对一地作为键值对存储在字典中
res = zip('abcd',[1,2,3,4])
dic = dict()
for k,v in res:
dic[k] = v
print(dic)
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
或者可以直接写成:
print({k:v for k,v in zip('abcd',[1,2,3,4])})
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
生成器
yield关键字
在函数中如果出现yield关键字,再调用函数,就不会继续执行代码,而是返回一个值,这个功能和return类似,但有区别就是yield不会终止函数
生成器表达式:
# 生成器表达式
tup = (i for i in range(10))
print(tup.__next__())
print(tup.__next__())
print(tup.__next__())
0
1
2
# 列表推导式
lis = [i for i in range(10)]
print(lis)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
生成器的好处就是不会把容器元素里的元素一下全部拿出来,用一个拿一个,极大的减少了内存的占用
递归
递归就是函数调用函数自己,类似于循环,但这个循环必须要有结束条件
def f1(i):
print(i)
i += 1
if i > 5:
return
f1(i)
f1(0)
0
1
2
3
4
5
与之前的闭包外观结构不同,闭包对函数的调用在返回值里而且在函数定义之外调用