迭代器

day 13

一、迭代器

1、什么是迭代?什么是迭代器?

  迭代是一个重复的过程,并且每次重复都是基于上一次的结果而来。

  迭代器即迭代取值的工具。

2、为什么要用迭代器?

  迭代器的特点:

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

     b、更节省内存。

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

     b、取值一次性的,只能往后取,无法预测值的个数。

3、如何用迭代器:

  可迭代对象:但凡内置有__ iter__方法的对象都称之为可迭代对象,如:strlist upledictset文件对象。

  迭代器对象:既内置有__ iter__ 方法又内置有__ next__方法的对象都称之为迭代器对象,如文件。

  迭代器对象与可迭代对象的关系:

    迭代器对象 = 可迭代的对象.__ iter__()

    迭代器对象本身 = 迭代器对象. __ iter__()

# d={'k1':111,'k2':222,'k3':333}
# iter_d=d.__iter__()
# iter_d=iter(d)         #d.__iter__
# print(next(iter_d))    #iter_d.__next__()

二、生成器

1、生成器的定义

  在函数内,但凡出现yield关键字,在调用函数就不会执行函数体代码,会返回一个值,该值称为生成器。

  生成器的本质就是自定义的迭代器。

# def func():
#     print('first')
#     yield 1
#     print('second')
#     yield 2
#     print('third')
#     yield 3
#
# g=func()        #调用函数 函数的返回值即为一个生成器
# print(g)

2、return vs 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
# range(1,5,2) # 1 3
# for i in my_range(1,50000,2): # 1 3
#     print(i)

三、递归

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

2、递归调用必须要满足的两个条件:

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

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

3、递归的两个阶段:

a、回溯

  注意:一定要在满足某种条件时结束回溯,否则会无限的递归。

b、递推

# 递归的使用实例
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,203)

 

原文地址:https://www.cnblogs.com/peng-zhao/p/10058816.html