Python笔记24-----迭代器、生成器的使用(如嵌套列表的展开、树的遍历等)
一、递归yield使用
可把yield当做return,其作用是把一个函数变成一个迭代器。
1、嵌套列表展开
- def flatten(nested):
- if type(nested)==list:
- for sublist in nested:
- for i in flatten(sublist):
- yield i
- else:
- yield nested
- print(list(flatten([[[1],2],3,4,[5,[6,7]],8])))
- #结果为[1,2,3,4,5,6,7,8]
2、树的后序遍历
- def postorderTraversal(self, root):
- def iter(root):
- if root:
- for x in iter(root.left):
- yield x
- for x in iter(root.right):
- yield x
- yield root.val
- return list(iter(root))
2、建立所有的二叉搜索树
给定一个数n,从【1,2,……,n】能够建立多少棵不同的二叉搜索树
- class TreeNode:
- def __init__(self,root):
- self.val=root
- self.left=None
- self.right=None
#用生成器建立所有树- def builtTree(start,end):
- if start>end:
- yield None
- for j in range(start,end+1):
- for j_left in builtTree(start,j-1):
- for j_right in builtTree(j+1,end):
- root=TreeNode(j)
- root.left=j_left
- root.right=j_right
- yield root
#调用建树函数- def test(n):
- if n==0:
- return []
- return list(builtTree(1,n))
2、二叉搜索树按序输出
- class BSTIterator(object):
- def __init__(self, root):
- """
- :type root: TreeNode
- """
- self.stack=[]
- while root:
- self.stack.append(root)
- root=root.left
- def hasNext(self):
- """
- :rtype: bool
- """
- return len(self.stack)>0
- def next(self):
- """
- :rtype: int
- """
- node=self.stack.pop()
- x=node.right
- while x:
- self.stack.append(x)
- x=x.left
- return node.val
二、itertools
1、chain():
把一组迭代对象串联起来,形成一个更大的迭代器
若在多个对象执行相同的操作,但这些对象在不同的容器中,如果希望代码在不
失可读性的情况下避免写重复的循环
- from itertools import chain
- for c in itertools.chain('ABC', 'XYZ'):
- print(c)
- # 迭代效果:'A' 'B' 'C' 'X' 'Y' 'Z'
- a = [1, 2, 3, 4]
- b = [‘x’, ‘y’, ‘z’]
- for x in chain(a, b):
- print(x)
- #迭代结果:1,2,3,4,'x','y','z'
Python笔记24-----迭代器、生成器的使用(如嵌套列表的展开、树的遍历等)的更多相关文章
- 【python】Leetcode每日一题-扁平化嵌套列表迭代器
[python]Leetcode每日一题-扁平化嵌套列表迭代器 [题目描述] 给你一个嵌套的整型列表.请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数. 列表中的每一项或者为一个整数,或者是另 ...
- python各种模块,迭代器,生成器
从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能) 本质就是.py结尾的python文件(文件名:test.py,对应的模块名就是test) 包:用来从逻辑上组织模块的,本质就是一个目 ...
- python杂记-4(迭代器&生成器)
#!/usr/bin/env python# -*- coding: utf-8 -*-#1.迭代器&生成器#生成器#正确的方法是使用for循环,因为generator也是可迭代对象:g = ...
- Python学习 :迭代器&生成器
列表生成式 列表生成式的操作顺序: 1.先依次来读取元素 for x 2.对元素进行操作 x*x 3.赋予变量 Eg.列表生成式方式一 a = [x*x for x in range(10)] pri ...
- python学习笔记(5)--迭代器,生成器,装饰器,常用模块,序列化
生成器 在Python中,一边循环一边计算的机制,称为生成器:generator. 如: >>> g = (x * x for xin range(10)) >>> ...
- python基础6 迭代器 生成器
可迭代的:内部含有__iter__方法的数据类型叫可迭代的,也叫迭代对象实现了迭代协议的对象 运用dir()方法来测试一个数据类型是不是可迭代的的. 迭代器协议是指:对象需要提供next方法,它要么返 ...
- python中的迭代器&&生成器&&装饰器
迭代器iterator 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外, ...
- Python入门之迭代器/生成器/yield的表达方式/面向过程编程
本章内容 迭代器 面向过程编程 一.什么是迭代 二.什么是迭代器 三.迭代器演示和举例 四.生成器yield基础 五.生成器yield的表达式形式 六.面向过程编程 ================= ...
- python中的迭代器 生成器 装饰器
什么迭代器呢?它是一个带状态的对象,他能在你调用next()方法的时候返回容器中的下一个值,任何实现了__iter__和__next__()(python2中实现next())方法的对象都是迭代器,_ ...
随机推荐
- 「Poetize4」创世纪
在tyvj上怀疑爆栈了.....或许一定是我写挂了.以后调吧... UPD:bzoj上过了... 题解:https://blog.csdn.net/popoqqq/article/details/39 ...
- J2EE异常问题总结
http://blog.csdn.net/rchm8519/article/details/41624381 http://www.51testing.com/html/49/240349-14393 ...
- Myeclipse学习总结(6)——MyEclipse断点调试
当程序写好之后,如何调试呢? 我们在MyEclipse中jav添加断点,运行debug as-->open debug Dialog,然后在对话框中选类后--> Run在debug视图下. ...
- ajax提交数据遇到400异常,原因及解决方案
开发中遇到的问题, ajax的URL写的正确但是确无法正常跳转, 开发者模式下显示请求400异常. 前后台代码如下 ------------------------------------------ ...
- nodejs-EventEmitter
addListener(event, listener)为指定事件添加一个监听器到监听器数组的尾部. on(event, listener)为指定事件注册一个监听器,接受一个字符串 event 和一个 ...
- Oracle 中UNDO与REDO的差别具体解释
一 为了更清楚的看出2者差别,请看下表: UNDO ...
- 插入排序和冒泡排序(Swift版本)
插入排序(只记录代码不作详细分析) 插入排序将输入的元素一个个插入到已排序的队列里,对比是由后往前 代码: func insertSort<Elem: Comparable>(_ arr: ...
- angularjs1-1
<!DOCTYPE html> <html> <body> <header> <meta http-equiv="Content-Typ ...
- Python 加载数据
1. numpy data = np.loadtxt('./data/txtdata.csv') ⇒ data 是 numpy.ndarray 类型
- c++面向对象程序设计 谭浩强 第三章答案
2: #include <iostream> using namespace std; class Date {public: Date(int,int,int); Date(int,in ...