首页 > 编程语言 > 详细

python函数之迭代器、生成器、函数递归、三元表达式和生成式

时间:2021-07-02 19:51:11      阅读:27      评论:0      收藏:0      [点我收藏+]

迭代器

1 什么是迭代器

  迭代器就是用来迭代取值的工具

  什么是迭代?
      迭代就是一个重复的过程,但是每次重复都是基于上一次的结果进行的

      # 单纯的重复不叫迭代
      while True:
          1+1

      # 下面才是迭代的过程
      count = 1
      while count < 5:
          print(count)
          count += 1

2、为何要用迭代器

  优点
  (1) 找到一种通用的迭代取值方案->for循环
  (2)惰性计算,节省内存

  缺点:
      1、不能取指定的值,只能往后next
      2、迭代器对象是一次性的:一个迭代器对象值取干净了,不能继续取了

3、什么是可迭代对象

  内置有__iter__方法的对象都是可迭代对象
      "abc".__iter__()
      [1, 2, 3].__iter__()
      (1, 2, 3).__iter__()
      {"x": 1, "y": 2}.__iter__()
      {1, 2, 3, 4}.__iter__()
  调用可迭代对象的__iter__()会得到一个返回值,该返回值是迭代器对象

4、什么是迭代器对象

  可迭代对象执行obj.__iter__()得到的结果就是迭代器对象
  而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象
    文件类型是迭代器对象:
        open(‘a.txt‘).__iter__()
        open(‘a.txt‘).__next__()

ps:迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象

5、如何用迭代器

    dic={‘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,这样太麻烦了,于是有了for循环
      dic={‘a‘:1,‘b‘:2,‘c‘:3}
      for k in dic:
        print(dic[k])
  for工作原理:
    1、调用in后那个对象的__iter__方法,得到一个迭代器对象iter_names
    2、x=next(iter_names),然后运行循环体代码
    3、重复步骤2,直到取完值,抛出异常,for循环会帮我们捕捉异常结束循环

生成器

什么是生成器

  只要函数内部包含有yield关键字,再调用函数不会立即执行函数体代码,而会返回一个生成器对象,而生成器对象本质就是一个自定义的迭代器对象
    def func():
        print(‘====>first‘)
        yield 1
        print(‘====>second‘)
        yield 2
        print(‘====>third‘)
        yield 3
        print(‘====>end‘)

    g=func()
    print(g) #<generator object func at 0x0000000002184360> 
  ps:yield 对比 return
        相同点:都可以返回任意类型、任意个数的值
        不同点:return只能返回值一次值,函数就立即结束,yield可以返回多次值,yield可以暂停函数的运行

函数递归

1、什么是函数递归

   函数递归是函数嵌套调用的一种特殊格式,即在调用一个函数时,在其内部又调用了自己
   递归应该分为两个阶段
      1、回溯:回溯就是从外向里一层一层递归调用下去,回溯阶段必须要有一个明确地结束条件,
          每进入下一次递归时,问题的规模都应该有所减少(否则,单纯地重复调用自身是毫无意义的)
      2、递推: 递推就是从里向外一层一层结束递归

2、为何要用函数递归

  函数递归提供了一种基于函数实现的新的循环机制

ps:python中的递归效率低且没有尾递归优化
3、递归实现二分法

想从一个按照从小到大排列的数字列表中找到指定的数字,
  遍历的效率太低,用二分法(算法的一种,算法是解决问题的方法)可以极大低缩小问题规模

    l=[1,2,10,30,33,99,101,200,301,311,402,403,500,900,1000] #从小到大排列的数字列表

    def search(n,l):
        print(l)
        if len(l) == 0:
            print(‘not exists‘)
            return
        mid_index=len(l) // 2
        if n > l[mid_index]:
            #in the right
            l=l[mid_index+1:]
            search(n,l)
        elif n < l[mid_index]:
            #in the left
            l=l[:mid_index]
            search(n,l)
        else:
            print(‘find it‘)


    search(3,l)

三元表达式

  def max2(x,y):
    if x > y:
        return x
    else:
        return y
  res=max2(10,20)
  print(res)
三元表达式就是把上述代码精简
  代码格式:条件成立时的返回值 if 条件 else 条件不成立时的返回值
    x = 10
    y = 20
    res = x if x > y else y
    print(res)

生成式

列表生成式

l=[结果 for循环 条件]
print(l = ["ok" for i in range(10) if i > 3])

字典生成式

print({"k%s" %i:i for i in range(3)})

集合生成式

print({i for i in range(3)})

生成器表达式

print(i for i in range(5))

python函数之迭代器、生成器、函数递归、三元表达式和生成式

原文:https://www.cnblogs.com/zty78/p/14963537.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!