菜鸟学Python第十三天

迭代器

  • 什么是迭代器

    • 迭代:迭代是一个重复的过程,但是每次重复都是基于上一次重复的结果而继续

    • 迭代器:迭代取值的工具

  • 为什要用迭代器

    • 优点

      1. 提供了一种不依赖索引的迭代取值方式

      2. 更节省内存

    • 缺点

      1. 不如按索引的取值方式灵活

      2. 取值一次性的,只能往后取,无法预测值的个数

如何用迭代器

  • 可迭代的对象: str/list/tuple/dict/set/文件

    但凡内置有__ iter __方法的对象都称之为迭代对象

  • 迭代器类型:

    既内置有__ iter __ 方法有内置有 __ next __方法的对象都称之为迭代器对象

  • 调用可迭代对象下__ iter __ 方法,会有一个返回值,该返回值就是内置的迭代器对象

# while 实现迭代取值
​
d = {'k1':111,'k2':222, 'k3':333}
iter_d = d.__iter__  # 将可迭代对象转化为迭代器对象
while True:
    try:  # 测试文件
        v = iter_d.__next__  # 迭代循环一个内容
        print(v)
    except StopIteration:  # 当错误内容正好是except即接收不报错
        break
        
# for 循环迭代取值(底层原理如上)
d = {'k1':111,'k2':222, 'k3':333}
for k in d:
    print(k)
    
    
# for循环的底层原理
# 1. 调用in后面的那个值/对象的__inter__方法,拿到一个迭代器对象iter_obj
# 2. 调用迭代器对象iter_obj.__next__()将得到的返回值赋值变量k,循环往复直到取值完毕抛出异常StopIteration
# 3. 捕捉异常结束循环

  


生成器

  • 什么是生成器

    生成器就是一种自定义的迭代器

    def func():  # 生成器
        print('first')
        yield 1
        print('second')
        yield 2
        print('third')
        yield 3
        
    for i in func():  # 迭代循环func内容
        print(i)
  • 如何得到生成器

    但凡函数内出现yield关键字,再去调用函数不会立刻执行函数体代码,会得到一个返回值,该返回值就是生成器对象,及自定义迭代器

  • 总结yield:

    1. 提供一种自定义迭代器的解决方案

    2. yield &return

      • 相同点: 都可以返回值,返回值没有类型限制和个数限制

      • 不同点: return只能返回一次值,yield却可以让函数暂停在某个位置,可以返回多次值。

 


 

递归函数与二分法

  • 函数的递归调用

    在调用一个函数的过程中又直接或者间接地调用该函数本身,称之为递归调用

    • 递归必须满足两个条件:

      1. 每进入下一次递归调用,问题的规模都应该有所减少

      2. 递归必须有一个明确的结束条件

    • 递归两个明确的阶段:

      1. 回溯:函数调用循环规模减少的过程

      2. 递推:循环结束一层层返回结果的过程

    # 实现5的阶乘5!
    def factorial(n):
        if n == 1:
            return 1
        else:
            return n * factorial(n - 1)
    ​
    ​
    print(factorial(5))
     
  • 二分法

    在有序的区间内查找时,使用二分法使对比范围缩小一半,大大提升了查找效率(普通查找需要一个个进行遍历,效率太低)

    # 在列表内查找值
    l1 = [1,2,3,4,6,7,8,9,13,23,24,25,26,29,30,40,48,55,60]
    def find_n(list1, num):
        if len(list1) == 0:
            print('not in')
            return
        x = list1[len(list1) // 2]
        if num > x:
            list1 = list1[len(list1) // 2 + 1:]
            return find_n(list1, num)
        elif num < x:
            list1 = list1[:len(list1) // 2]
            return find_n(list1, num)
        else:
            print('find it')
    ​
    ​
    find_n(l1, 23)
     

猜你喜欢

转载自www.cnblogs.com/liusijun113/p/10059461.html