day13总结
迭代器
迭代器不是函数,只是一个称呼
python中一切皆对象(数据类型)
可迭代对象:含有.__iter__方法的数据类型就叫做可迭代对象
除了数字类型,所有数据类型都是可迭代对象
迭代器对象:含有.__iter__和.__next__方法的对象就是迭代器对象
为什么要有迭代器对象:提供了不依赖索引取值的手段
for循环原理(for循环本质就是while循环,只不过是一个一定可控的while循环)
dic_iter = dic.__iter__()
# while True:
# try:
# print(dic_iter.__next__())
# except StopIteration:
# break
可迭代对象使用.__iter__变成迭代器对象
迭代器使用.__iter__依然是迭代器
可迭代对象不一定是迭代器对象,迭代器对象一定是可迭代对象
三元表达式
# if x > y:
# print(x)
# else:
# print(y)
三元表达式--》三目表达式
print(x) if x > y else print(y) # --> 仅作了解
条件成立走这里 if 条件 else 条件不成立走这里
列表推导式
lt = [i**2 for i in range(10)]
from typing import Iterable # 导出一个可迭代对象类型
print(isinstance(range(10),Iterable)) # 判断是否属于该数据类型
字典生成式
dic = {i:i**2 for i in range(10)}
zip()
# res = zip([1,2,3],[4,2,3,4,2,3,4,2,3],'abcadsfasdfasdf') # res是一个迭代器,__next__返回元组
# print(res.__next__()) # type:tuple
# print(res.__next__()) # type:tuple
# print(res.__next__()) # type:tuple
# # print(res.__next__()) # type:tuple
lt1 = ['a', 'b', 'c']
lt2 = [1, 2, 3]
dic = {k: v ** 2 for k, v in zip(lt1, lt2)}
print(dic)
lt = list('abc')
print(lt)
生成器生成式
generator 本质是一个迭代器 ---> 生成器: 本质就是迭代器,生成器就是一个自定义的迭代器
g = (i for i in range(10000000))
print(g)
# for i in g:
# print(i)
lt = [i for i in range(10000000)]
print(lt)
生成器表达式: 看成老母鸡,节省内存空间,用就下蛋
列表推导式: 看成一筐鸡蛋,非常占用内存空间
生成器
# 生成器:含有yield关键字的函数叫做生成器
def ge():
yield 3 # 一个yield相当于一个next; 暂停函数
yield 4
# print(ge()) # ge()得到一个生成器 --> 生成器本质是迭代器
g = ge() # 得到一个生成器
yield的特性
- 暂停函数
- 通过next取值
return的特性
- 终止函数
- 通过调用函数拿到值
写一个range方法
- 生成器
- 可变长参数
缺什么补什么,不管三七二十一,动手干
递归
# 传递 ; 回归
# 递归: 函数a内部直接调用函数a本身
# import sys
# sys.setrecursionlimit(10)
# print(sys.getrecursionlimit())
#
# def a():
# x = 1
# print(x)
# a()
#
#
# a()
每一次递归,会不会结束函数?不会,并且每一次递归都会开辟内存空间,如果一直开辟内存就炸掉了,所以最多递归1000次
真正的递归必须得要有 退出条件
递归:
- 函数内部调用函数自己
- 必须要有退出条件
- 递归必须要有规律