一、递归yield使用

可把yield当做return,其作用是把一个函数变成一个迭代器。

1、嵌套列表展开

  1. def flatten(nested):
  2. if type(nested)==list:
  3. for sublist in nested:
  4. for i in flatten(sublist):
  5. yield i
  6. else:
  7. yield nested
  8. print(list(flatten([[[1],2],3,4,[5,[6,7]],8])))
  9.  
  10. #结果为[1,2,3,4,5,6,7,8]

2、树的后序遍历

  1. def postorderTraversal(self, root):
  2. def iter(root):
  3. if root:
  4. for x in iter(root.left):
  5. yield x
  6. for x in iter(root.right):
  7. yield x
  8. yield root.val
  9. return list(iter(root))

2、建立所有的二叉搜索树

给定一个数n,从【1,2,……,n】能够建立多少棵不同的二叉搜索树

  1. class TreeNode:
  2. def __init__(self,root):
  3. self.val=root
  4. self.left=None
  5. self.right=None
    #用生成器建立所有树
  6. def builtTree(start,end):
  7. if start>end:
  8. yield None
  9. for j in range(start,end+1):
  10. for j_left in builtTree(start,j-1):
  11. for j_right in builtTree(j+1,end):
  12. root=TreeNode(j)
  13. root.left=j_left
  14. root.right=j_right
  15. yield root
    #调用建树函数
  16. def test(n):
  17. if n==0:
  18. return []
  19. return list(builtTree(1,n))

 2、二叉搜索树按序输出

  1. class BSTIterator(object):
  2. def __init__(self, root):
  3. """
  4. :type root: TreeNode
  5. """
  6. self.stack=[]
  7. while root:
  8. self.stack.append(root)
  9. root=root.left
  10.  
  11. def hasNext(self):
  12. """
  13. :rtype: bool
  14. """
  15. return len(self.stack)>0
  16.  
  17. def next(self):
  18. """
  19. :rtype: int
  20. """
  21. node=self.stack.pop()
  22. x=node.right
  23. while x:
  24. self.stack.append(x)
  25. x=x.left
  26. return node.val

二、itertools

1、chain():

把一组迭代对象串联起来,形成一个更大的迭代器

若在多个对象执行相同的操作,但这些对象在不同的容器中,如果希望代码在不
失可读性的情况下避免写重复的循环

  1. from itertools import chain
  2.  
  3. for c in itertools.chain('ABC', 'XYZ'):
  4. print(c)
  5. # 迭代效果:'A' 'B' 'C' 'X' 'Y' 'Z'
  6.  
  7. a = [1, 2, 3, 4]
  8. b = [‘x’, y’, z’]
  9. for x in chain(a, b):
  10. print(x)
  11.  
  12. #迭代结果:1,2,3,4,'x','y','z'

Python笔记24-----迭代器、生成器的使用(如嵌套列表的展开、树的遍历等)的更多相关文章

  1. 【python】Leetcode每日一题-扁平化嵌套列表迭代器

    [python]Leetcode每日一题-扁平化嵌套列表迭代器 [题目描述] 给你一个嵌套的整型列表.请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数. 列表中的每一项或者为一个整数,或者是另 ...

  2. python各种模块,迭代器,生成器

    从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能) 本质就是.py结尾的python文件(文件名:test.py,对应的模块名就是test) 包:用来从逻辑上组织模块的,本质就是一个目 ...

  3. python杂记-4(迭代器&生成器)

    #!/usr/bin/env python# -*- coding: utf-8 -*-#1.迭代器&生成器#生成器#正确的方法是使用for循环,因为generator也是可迭代对象:g = ...

  4. Python学习 :迭代器&生成器

    列表生成式 列表生成式的操作顺序: 1.先依次来读取元素 for x 2.对元素进行操作 x*x 3.赋予变量 Eg.列表生成式方式一 a = [x*x for x in range(10)] pri ...

  5. python学习笔记(5)--迭代器,生成器,装饰器,常用模块,序列化

    生成器 在Python中,一边循环一边计算的机制,称为生成器:generator. 如: >>> g = (x * x for xin range(10)) >>> ...

  6. python基础6 迭代器 生成器

    可迭代的:内部含有__iter__方法的数据类型叫可迭代的,也叫迭代对象实现了迭代协议的对象 运用dir()方法来测试一个数据类型是不是可迭代的的. 迭代器协议是指:对象需要提供next方法,它要么返 ...

  7. python中的迭代器&&生成器&&装饰器

    迭代器iterator 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外, ...

  8. Python入门之迭代器/生成器/yield的表达方式/面向过程编程

    本章内容 迭代器 面向过程编程 一.什么是迭代 二.什么是迭代器 三.迭代器演示和举例 四.生成器yield基础 五.生成器yield的表达式形式 六.面向过程编程 ================= ...

  9. python中的迭代器 生成器 装饰器

    什么迭代器呢?它是一个带状态的对象,他能在你调用next()方法的时候返回容器中的下一个值,任何实现了__iter__和__next__()(python2中实现next())方法的对象都是迭代器,_ ...

随机推荐

  1. 「Poetize4」创世纪

    在tyvj上怀疑爆栈了.....或许一定是我写挂了.以后调吧... UPD:bzoj上过了... 题解:https://blog.csdn.net/popoqqq/article/details/39 ...

  2. J2EE异常问题总结

    http://blog.csdn.net/rchm8519/article/details/41624381 http://www.51testing.com/html/49/240349-14393 ...

  3. Myeclipse学习总结(6)——MyEclipse断点调试

    当程序写好之后,如何调试呢? 我们在MyEclipse中jav添加断点,运行debug as-->open debug Dialog,然后在对话框中选类后--> Run在debug视图下. ...

  4. ajax提交数据遇到400异常,原因及解决方案

    开发中遇到的问题, ajax的URL写的正确但是确无法正常跳转, 开发者模式下显示请求400异常. 前后台代码如下 ------------------------------------------ ...

  5. nodejs-EventEmitter

    addListener(event, listener)为指定事件添加一个监听器到监听器数组的尾部. on(event, listener)为指定事件注册一个监听器,接受一个字符串 event 和一个 ...

  6. Oracle 中UNDO与REDO的差别具体解释

    一 为了更清楚的看出2者差别,请看下表:                                               UNDO                             ...

  7. 插入排序和冒泡排序(Swift版本)

    插入排序(只记录代码不作详细分析) 插入排序将输入的元素一个个插入到已排序的队列里,对比是由后往前 代码: func insertSort<Elem: Comparable>(_ arr: ...

  8. angularjs1-1

    <!DOCTYPE html> <html> <body> <header> <meta http-equiv="Content-Typ ...

  9. Python 加载数据

    1. numpy data = np.loadtxt('./data/txtdata.csv') ⇒ data 是 numpy.ndarray 类型

  10. c++面向对象程序设计 谭浩强 第三章答案

    2: #include <iostream> using namespace std; class Date {public: Date(int,int,int); Date(int,in ...