python day11

---恢复内容开始---

一 迭代器

1 迭代器是一个重复的过程,但是迭代器并不是单纯的重复,每次重复都是基于上一次重复的结果而继续的.

下列循环只是单纯的重复:

while True:
    print(1)
    print(2)
    print(3)

基于索引的迭代取值:

l=['a','b','c']
        i=0

        while i < len(l):
            print(l[i])
            i+=1

2 迭代器是取值的工具 这个工具的特点是可以不依赖索引取值

3 迭代器的优缺点:

优点: l 提供一种不依赖索引的迭代取值方式

         ll 更节省内存

缺点: l 不如按照索引的取值方式灵活

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

4 迭代器的用法:

    l 可迭代的对象:str\list\tuple\dict\set\文件对象

       但凡有_iter_方法的对象称之为可迭代对象

    ll 迭代器的对象:文件对象

       既内置有_lier_又内置有_next_方法的对象都称之为迭代器对象

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

d迭代器实例

ic={'a':1,'b':2,'c':3} iter_dic=dic.__iter__() #得到迭代器对象,迭代器对象即有__iter__又有__next__,但是:迭代器.__iter__()得到的仍然是迭代器本身 iter_dic.__iter__() is iter_dic #True print(iter_dic.__next__()) #等同于next(iter_dic) print(iter_dic.__next__()) #等同于next(iter_dic) print(iter_dic.__next__()) #等同于next(iter_dic) # print(iter_dic.__next__()) #抛出异常StopIteration,或者说结束标志 #有了迭代器,我们就可以不依赖索引迭代取值了 iter_dic=dic.__iter__() while 1: try: k=next(iter_dic) print(dic[k]) except StopIteration: break #这么写太丑陋了,需要我们自己捕捉异常,控制next,python这么牛逼,能不能帮我解决呢?能,请看for循环

二 for循环的底层原理:

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

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

       Stoplteration

    3 捕捉异常结束循环

例:

dic={'a':1,'b':2,'c':3}
for k in dic:
    print(dic[k])

三 生成器

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

例:

def my_range(start, stop, step=1):
    while start < stop:  # 5 < 5
        yield start  # 3
        start += step  # start=5


range(1, 5, 2)  # 1 3
for i in my_range(1, 5, 2):  # 1 3
    print(i)

  

总结:yield

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

     2 yield & return

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

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

四 函数的递归调用

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

        递归必须满足两个条件:

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

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

    2 如果递归只是单纯的重复,那就没有意义:

       例

def func():
    print(1)
    print(2)
    print(3)
    func()


func()

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

      l 回溯

     ll 递推

例: 

"""
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)

  

 

 

---恢复内容结束---

posted @ 2018-12-03 19:24  疯狂小摩的  阅读(138)  评论(0编辑  收藏  举报