zoukankan      html  css  js  c++  java
  • 迭代器、生成器、函数的递归调用、二分法

    一:迭代器

      1.什么是迭代?

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

      下列循环单纯重复:

            while True:
                print(1)
    
            # 基于索引的迭代取值
            l=['a','b','c']
            i=0
    
            while i < len(l):
                print(l[i])
                i+=1
    View Code

      2.什么是迭代器?

      迭代器是重复取值的工具

      3.为什么要用迭代器?

      迭代器

      优点:

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

        2.更节省内存

      缺点:

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

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

      4.如何用迭代器?

      可迭代的对象:strlist upledictset文件对象

        只要内置有__iter__方法的对象都称为可迭代的对象

      迭代器对象:文件对象

        即内置有__iter__方法,又内置有__next__方法的对象都称之为迭代器对象。

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

    s='abcdef'
    l=['a','b','c']
    d={'k1':111,'k2':222,'k3':333}
    
    iter_d=d.__iter__()
    # print(iter_d)
    监测是否执行完毕
    try:
        print(iter_d.__next__())
        print(iter_d.__next__())
        print(iter_d.__next__())
        print(iter_d.__next__())
    except StopIteration:
        print('取值完毕')
    View Code
    #while循环
    d={'k1':111,'k2':222,'k3':333}
    iter_d=d.__iter__()
    while True:
        try:
            v=iter_d.__next__()
            print(v)
        except StopIteration:
            break
    
    #for循环
    for k in d:
        print(k)
    for循环和while循环对比

      for循环的底层原理:

        1.调用in后面的那个值/对象的__iter__方法,拿到一个迭代器对象iter_obj

        2.调用迭代器对象iter_obj.__next__()将得到的返回值赋值变量名k,循环往复直到取值完毕抛出异常StopIteration

        3.捕捉异常结束循环

    二:生成器

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

      如何得到生成器?

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

      总结yield:

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

        2.yield & return

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

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

    def my_range(start,stop,step=1):
        while start < stop: # 5 < 5
            yield start # 3
            start+=step #start=5
    自定义起始位置的循环取值

    三:函数的递归调用

      1.函数的递归调用:

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

      2.递归调用必须满足两个条件:

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

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

    以下递归只是单纯的重复,没有意义:

    def func():
        print(1)
        print(2)
        print(3)
        func()
    
    func()
    
    def bar():
        print('from bar')
        foo()
    
    def foo():
        print('from foo')
        bar()
    
    foo()
    View Code

      3.递归有两个明确的阶段:

        1.回溯

        2.递推

    age(5)=age(4)+2
    age(4)=age(3)+2
    age(3)=age(2)+2
    age(2)=age(1)+2
    age(1)=18
    
    age(n)=age(n-1)+2  # n > 1
    age(1)=18          # n = 1
    
    递归:
    def age(n):
        if n == 1:
            return 18
        return age(n-1)+2
    
    print(age(5))
    求年龄

    四:二分法

      具体以例为证:

    nums=[3,5,7,11,13,23,24,76,103,111,201,202,250,303,341]
    
    def binary_search(list1,find_num):
        print(list1)
        if len(list1) == 0:
            print('not exist')
            return
        mid_index=len(list1) // 2
        if find_num > list1[mid_index]:
            # in the right
            binary_search(list1[mid_index + 1:],find_num)
        elif find_num < list1[mid_index]:
            # in the left
            binary_search(list1[:mid_index],find_num)
        else:
            print('find it')
    
    binary_search(nums,201)
    查找数字201

      

  • 相关阅读:
    POJ 2029 (二维树状数组)题解
    HDU 4819 Mosaic (二维线段树&区间最值)题解
    HDU 1823 Luck and Love (二维线段树&区间最值)题解
    POJ1061 青蛙的约会(扩展欧几里得)题解
    POJ 2155 Matrix (二维树状数组)题解
    POJ 1751 Highways(最小生成树&Prim)题解
    HDU 6148 Valley Numer (数位DP)题解
    HDU3652 B-number(数位DP)题解
    HDU 4734 (数位DP)题解
    HDU 2089 不要62 (数位DP)题解
  • 原文地址:https://www.cnblogs.com/liuxiaolu/p/10058736.html
Copyright © 2011-2022 走看看