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

    一、迭代器

    1、什么是迭代器?

     什么是迭代?

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

    什么是迭代器?

      迭代取值的工具

    2、为什么要用迭代器?

    迭代器

      优点:

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

    ​   2.更节省内存

     缺点:

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

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

    3、如何用迭代器

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

    ​   但凡内置有__iter__方法的对象都可以称之为可迭代对象

       迭代器对像:文件对象

    ​   既内置有__iter__方法又内置有__next__方法的对象称之为迭代器对象


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

    d={'k1':111,'k2':222,'k3':333}
    iter_d=d.__iter__()
      while True:
        try:
          v=iter_d.__next__()
        print(v)
        except StopIteration:
          break
    try execpt 检测异常

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


    以后用:
    iter_d=iter(d)
    print(next(iter_d))

    二、生成器

    生成器是一种自定义的迭代器
    如何得到生成器?
      但凡函数内出现yield关键字,再去调用函数不会立即执行函数体代码,会得到一个返回值,该返回值就是生成器对象,既自定义的迭代器
      return只能返回一次值,yield可以返回多次值
    def func():
      print('first')
      yield 1
      print('second')
      yield 2
      print('third')
      yield 3
    g=func()
    res1=next(g)
    print(res1)
    res2=next(g)
    print(res2)
    res3=next(g)
    print(res3)

    nex(g)

    总结yield
    1.提供一种自定义迭代器的解决方案
    2.yield&return
      相同点:都可以返回值,返回值没有类型限制个数限制
      不同点:return只能返回一次值,yield却可以让函数暂停在某一个位置,可以返回多次值

    自己写一个可以造无穷个值的range功能
    def my_range(start,stop,step):
      while True:
        if start<stop:
          yield start
          start+=step
    for i in my_range(1,5,2):
      print(i)

    三、函数递归调用与二分法

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

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

    递归有两个明确的阶段:
    1.回溯
    2.递推
    def age(n):
      if n == 1:
        return 18
      else:
        return age(n-1)+2
    print(age(5))

    l=[1,[2,[3,[4,[5,[6,[7,[8,[9,]]]]]]]]]
    def func(list1):
      for item in list1:
        if type(item) is not list:
          print(item)
      else:
        func(item)
    func(l)

    2.二分法
    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 #结束循环用break,结束函数要用return
      mid_index = len(list1)//2
      if find_num >list1[mid_index]:
        binary_search(list1[mid_index+1:],find_num)
      elif find_num < list1[mid_index]:
        binary_search(list1[:mid_index], find_num)
      else:
        print('find it')
    binary_search(nums,205)

    二分法是算法的一种,用来解决查找的问题
    算法:如何高效解决问题的方法
    算法都是用解决固定的问题

  • 相关阅读:
    做问答系统是对题目修改的bug
    控件treetable使用
    百度地图API --地理位置定位
    按每十分钟查询数据
    《deetom》项目开发历程<六> 免登陆
    poj 3348
    poj 1556
    poj 1269
    poj 3304
    R 540
  • 原文地址:https://www.cnblogs.com/lizeqian1994/p/10060581.html
Copyright © 2011-2022 走看看