DAY13 迭代器 三元表达式和字典生成式(了解) 生成器 递归
迭代器
可迭代对象
str/list/tuple/dict/set/file
拥有iter方法的对象
迭代器对象
file
拥有iter和next方法的对象
- 迭代器对象一定是可迭代对象;可迭代对象不一定是迭代器对象(文件是可迭代对象也是迭代器对象)
for循环原理
for i in lis
: 把lis生成可迭代对象,然后使用next方法取出一个个值,直到报错捕捉异常然后中断退出,所以for循环可以不基于索引取值
三元表达式
成立时干嘛 if 条件 else 不成立时干嘛
列表推导式
[i for i in range(10)]
字典生成式
{i:i for i in range(10)}
生成器
自定义的迭代器,函数内使用yield关键字
- yield: 接收函数返回值,但是会继续运行下面的代码,使用yield关键字调用的函数变成生成器
- return: 接收函数返回值,但是会终止函数的运行,使用return关键字调用的函数就是一个普通的函数
生成器表达式
(i for i in range(10))
- 生成器表达式生成的东西相当于老母鸡,需要的时候next拿个蛋出来
- 列表推导式就是一筐鸡蛋
递归
- 函数调用本身,必须得有终止条件
import time
lis = [i for i in range(10000000)]
def deco(func):
def wrapper(*args,**kwargs):
start = time.time()
res = func(*args,**kwargs)
end = time.time()
print(end-start)
return res
return wrapper
@deco
def find_num(num):
for i in lis:
if i == num:
print('找到了')
break
else:
print('没有被找到')
find_num(4567899)
- 分而冶治
@deco
def rec_find_num(num,lis):
lis_len = int(len(lis)/ 2) # 10.0
binary_num = lis[lis_len] # 10
print(lis)
print(binary_num)
if len(lis) == 1:
print('没找到')
return
if binary_num > num:
lis = lis[:lis_len]
rec_find_num(num,lis)
elif binary_num < num: # 10 < 18
lis = lis[lis_len+1:]
rec_find_num(num,lis)
else:
print('找到了')
lis = [i for i in range(10000000)] # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
rec_find_num(4567899,lis)
看五遍不过分
import time
def rec_find_num(num, lis):
"""递归版本"""
lis_len = int(len(lis) / 2) # 10.0
binary_num = lis[lis_len] # 10
if len(lis) == 1:
print('没找到')
return
if binary_num > num:
lis = lis[:lis_len]
rec_find_num(num, lis)
elif binary_num < num: # 10 < 18
lis = lis[lis_len + 1:]
rec_find_num(num, lis)
else:
print('找到了')
lis = [i for i in range(100000000)] # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
start = time.time()
rec_find_num(4567899900, lis)
end = time.time()
print(end - start) # 1.1569085121154785
import time
lis = [i for i in range(100000000)]
def time_count(func):
def wrapper(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
end = time.time()
print(end - start)
return res
return wrapper
@time_count
def find_num(num):
"""普通版本"""
for i in lis:
if i == num:
print('找到了')
break
else:
print('没有被找到')
find_num(4567899900) # 2.293410062789917