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关键字

  1. yield: 接收函数返回值,但是会继续运行下面的代码,使用yield关键字调用的函数变成生成器
  2. 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
posted @ 2025-08-11 16:36  CHENHANG123  阅读(3)  评论(0)    收藏  举报