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

    一、迭代器
    1、什么是迭代器?
    迭代是一个重复的过程,但是每次重复都是基于上一次重复的结果而继续
    while True:
    # print()#这不是迭代,单纯的循环
    #基于索引的迭代取值
    l('a','b','c',)
    i=0
    while i < len(l):
    print(l[i])
    i+=1
    什么是迭代器
    迭代取值的工具

    2、为什么要用迭代器
    迭代器
    优点
    1、提供一个不依赖索引的迭代取值方式
    2、更节省内存
    缺点:
    1、不如索引取值方便
    2、取值是一次性的,只能往后取,无法预测值的个数


    3、如何用迭代器
    可跌打的对象:str/list/tuple/dict/set/文件对象
    但凡内置有__iter__的方法的对象都称之为可迭代对象
    迭代器对象:文件对象
    既内置有__iter__方法又内置有__next__方法对象都称之为迭代器对象

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

    s='abcdef'
    l=['a','b','c']
    d={'k1':111,'k2':222,'k3':333}
    iter_d=d.__iter__()
    try:
    print(iter_d.__next__())
    print(iter_d.__next__())
    print(iter_d.__next__())
    print(iter_d.__next__())
    except stopIteration:
    print('取值完毕')


    s='abcdef'
    l=['a','b','c']
    d={'k1':111,'k2':222,'k3':333}
    iter_d=d.__iter__()
    while Ture:
    try:
    v=iter_d.__next__()
    print(v)
    except StopIteration:
    break

    for k in d
    print(k)
    # for 循环的底层原理:
    1、调用in后面那个值/对象的_iter_方法,拿到一个迭代器对象iter_obj
    2、调用迭代器对象iter_obj._next_()将的到的返回值赋值变量名k,循环往复直到取值完毕抛出异常StopIteration
    3、捕捉异常直到结束

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

    def func()
    print('first')
    yield 1
    print('second')
    yield 2
    prind('third')
    yield 3
    g=func
    #print(g)
    next(g)


    总结yield:
    1、提供一种自定义迭代器解决方案
    2、yield & return
    相同点:都可以返回值,返回值没有类型限制/个数限制
    不同点ruturn只可以返回一个值,yield可以让函数体暂停某一个位置,可以返回多个值
    三、函数递归调用与二分法
    1、函数的递归调用:
    在调用一个函数的过程又直接又间接又调用该函数本身,称之为递归调用

    递归必须满足两个条件:
    1、每进行下一次递归调用,问题的规模都应该有所减少
    2、递归必须有一个明确的结束条件

    递归有两个明确的阶段:
    1、回溯
    2、递推

    以下是没有意义的的递归
    def func()
    print(1)
    print(2)
    print(3)
    func()
    func()

    def bar()
    print('for bar')
    foo()
    def foo()
    print('for foo')
    bar()
    foo()



    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
    l = [1, [2, [3, [4, [5, [6, [7, [8, [9, ]]]]]]]]]


    def func(lists): # 定义函数
    for item in lists: # 循环列表
    if type(item) is not list: # 判断值是否是列表
    print(item) # 不是则打印
    else:
    func(item) # 是则调用函数循环


    func(l)

    nums = [3, 5, 7, 11, 13, 23, 24, 76, 103, 111, 201, 202, 250, 303, 341]
    find_num = 203
    for num in nums: # 循环列表
    if num == find_num: # 如果值是203
    print('find it')
    break
    else:
    print('not exists')

    nums = [3, 5, 7, 11, 13, 23, 24, 76, 103, 111, 201, 202, 250, 303, 341]


    def func(listl, find_num): # 定义一个函数,参数为列表及需要的值
    print(listl)
    if len(listl) == 0: # 当寻找完列表为空
    print('not exists')
    return
    mid_index = len(listl) // 2 # 取中间数
    if find_num > listl[mid_index]: # 当寻找的值大于中间数
    func(listl[mid_index + 1:], find_num) # 调用函数继续在大于中间数的列表内寻找
    elif find_num < listl[mid_index]: # 当寻找的值小于中间数
    func(listl[:mid_index], find_num) # 调用函数继续在小于中间数的列表内寻找
    else: # 当寻找值等于中间数
    print('find it')


    func(nums, 202)
    
    
     
  • 相关阅读:
    几何服务,cut功能,输入要素target(修改后)内容。
    几何服务,cut功能,输入要素target(修改前)内容。
    ArcGIS Server,rest路径输入要素json 格式描述
    window对象的screen详解
    window对象的inner/outer/page/screen详解
    js的scroll详解
    js的client详解
    自己封装的操作DOM方法
    js模拟高级语言的重载
    charCode与keyCode的区别
  • 原文地址:https://www.cnblogs.com/liushen1995/p/10059170.html
Copyright © 2011-2022 走看看