迭代器
1.迭代器就是迭代的工具,迭代也可以说成是重复,并且每一次重复都是基于上一次的结果而来的,在python中一切皆对象.
2.可迭代对象:只要拥有__iter__方法的对象都是可迭代对象.
3.可迭代的对象有:python内置的str list tuplie dict set file 都是可迭代对象
- 特点:内置有__iter__方法的都叫可迭代的对象
迭代器对象
1.迭代器对象的概念
- 可迭代的对象执行
__iter__
方法得到的返回值,并且可以迭代对象会有一个__next__
方法,并且 文件本身就是迭代器对象
总结
1.可迭代对象:拥有iter方法的对象就是可迭代对象 推导:可迭代对象不一定是迭代器对象
2.迭代器对象:拥有iter方法和next方法的就是可以迭代对象, 推导:迭代器对象一定是可迭代对象
3.文件即是可迭代对象,也是迭代器对象
缺点:取值麻烦,只能一个一个取,并且只能往后取,值取了就没了
无法使用len()方法获取长度
for 循环原理
- for 循环称为迭代器循环,in后必须是可迭代的对象
解释:因为迭代器使用 __ iter__后还是迭代器本身,因此for循环不用考虑in后的对象是可迭代对象还是迭代器对象,
三元表达式
条件成立时返回值if条件else条件不成立时的返回值
x=10
y=20
x if x>y else y
列表推导式
[i for i in range(10)]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
字典生成式
print({i: i**2 for i in range(10)})
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
zip方法
res = zip('abcd',[1,2,3,4])
dic = dict()
for k,v in res:
dic[k] = v
print(dic)
# 方法二
print({k:v for k,v in zip('abcd',[1,2,3,4])})
生成器表达式
- 把列表推导式的[]换成(),就是生成器表达式
- 优点:省内存,一次只产生一个值在内存中
- 列表推导式相当于直接给你一筐鸡蛋,而生成器表达式相当于给你一只老母鸡
# 列表推导式
with open('52.txt', 'r', encoding='utf8') as f:
nums = [len(line) for line in f]
print(max(nums))
# 生成器表达式
with open('52.txt','r',encoding='utf8') as f:
nums = (len(line) for line in f)
print(max(nums)) # ValueError: I/O operation on closed file.
yield
yield的英文单词意思是生产,在函数中但凡出现yield关键字,再调用函数,就不会继续执行函数体代码,而是会返回一个值。
def func():
print('from 1')
yield
print('from 2')
yield
函数递归
函数的嵌套调用时:函数嵌套函数,函数的递归调用:它是一种特殊的嵌套调用,但是它在调用一个函数的过程中,又直接或间接的调用了它本身
def foo():
print('from foo')
foo()
foo() # 进入死循环
如果递归函数不断的调用函数自身,那么这个递归函数将会进入一个死循环,因此我们应该给递归函数一个明确的结束条件
1.直接调用:直接在函数内部调用函数自身
2.间接调用:不在原函数体内调用函数自身,而是通过其他的方法间接的调用函数自身
- 递归必须要有的两个明确阶段
1.递推:一层一层递归调用下去,进入下一层递归的问题规模都将会减小
2.回溯:递归碧玺要有一个明确的结束条件,找满足该条件开始一层一层回溯
3.递归的精髓在于通过不断的重复逼近一个最终的结果