`
icefire
  • 浏览: 123393 次
  • 性别: Icon_minigender_1
  • 来自: 深圳、重庆
社区版块
存档分类
最新评论

yield的应用——QTreeWidgetItem的迭代

阅读更多
最近学python 用 pyside,所以做个笔记

在Qt里,要是要遍历QTreeWidget所有节点,其中一个方法就是用QTreeWidgetItemIterator,但有个烦人的地方,这个东西在C++里还行,但在python里就太不python了。
it = QTreeWidgetItemIterator(tree)
while it.value():
    v = it.value()
    do_something()
    it += 1

天呀,这么多行代码,还必须用while和it += 1。
传统简化方法,在js里,最典型的简化方法就是用模板。
tree_item_loop = function(tree, fn) {
    it = QTreeWidgetItemIterator(tree)
    while (it.value()) {
        fn(it.value());
        it += 1
    }
}
tree_item_loop(tree, function(item){
    // 
})

在python里是这样
def tree_item_loop(tree, fn):
    it = QTreeWidgetItemIterator(tree)
    while it.value():
        s_item = it.value()
        fn(s_item)
        it += 1

def fn(item):
    pass
tree_item_loop(tree, fn)

但是在又有一个问题,如果我需要知道当前节点在遍历时的index咋办?在循环里计算index也就算了,但更要命的是,python和js不一样,js里,fn这个参数,其本身的参数可以任意,甚至可以不声明,也就是说,定义成
function some(item, index) {} 

或者
function(item) {} 

都是可以的,而python不行,必须要声明具体参数,即使是可变参数,也必须要声明,否则多传参数或少接收参数之类会报错。所以如果我要传index,所有传进来的fn就都必须是声明index或者 *args,这让调用者就郁闷了。

不过python既然这样无法解决,那么就用python的方法来解决。用yield
def tree_items(tree):
    it = QTreeWidgetItemIterator(tree)
    while it.value():
        yield it.value()
        it += 1


要遍历
for item in tree_items(tree):
    print item

好爽。再来要带index
for index, item in enumerate(tree_items(tree)):
    print index, item
0
0
分享到:
评论

相关推荐

    Python基于yield遍历多个可迭代对象

    主要介绍了Python基于yield遍历多个可迭代对象,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    python3基础篇(六)——迭代器与生成器,生成式

    python3基础篇(六)——迭代器与生成器,生成式 前言: 1 阅读这篇文章我能学到什么?   ——如果你觉得这是一篇不错的博文,希望你能给一个小小的赞,感谢您的支持。 目录python3基础篇(六)——迭代器与生成器...

    harmonyos2-yield-iter:产量迭代器

    yield编写迭代库来操作集合(数组)。您的 env 应该支持 ES6(和谐)。 ##特征 可链接:喜欢 iter(arr) .where(...) .map(..) .sort(..) .where() .groupBy(..) 使用 GeneratorFunction,大多数情况下只迭代...

    python中yield的用法详解——最简单,最清晰的解释

    主要介绍了python中yield的用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    C#使用yield关键字构建迭代器详解

    主要为大家详细介绍了C#使用yield关键字构建迭代器的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例

    主要介绍了Python 生成器,迭代,yield关键字,send()传参给yield语句操作,结合实例形式分析了Python生成器、迭代、yield关键字及异常处理相关操作技巧,需要的朋友可以参考下

    php和C#的yield迭代器实现方法对比分析

    yield关键字是用来方便实现迭代器的,免去了手工写迭代器的繁琐。迭代器常被用来实现协程,所以大部分的协程中都有yield关键字,可以参看unity3D的协程。 C#版本: 函数的返回类型必须为 IEnumerable、IEnumerable、...

    java 线程让步(Yield)

    java 线程让步(Yield) java 线程让步(Yield) java 线程让步(Yield)

    yield总结与实例

    二、yield是一个语法糖,为方便开发者提供的一种方便方法 三、yield返回类型为IEnumerator、IEnumerable、IEnumerator、IEnumerable 四、如果返回类型为IEnumerator编译时会实现一个实现了IEnumerator接口的类 五、...

    haxe-yield:用于Haxe的跨平台类似C#的`yield`生成器

    yield元数据定义迭代器块,并指示其中出现的函数,运算符(请参阅)或访问器是迭代器。 在使用yield语句定义迭代器时,会隐式创建一个额外的类来保存迭代状态,同样为自定义类型实现或模式(请参阅以获取示例)。 ...

    yield表达式.pdf

    讲解Python的yield表达式,因为这个关键字平常不常用,也容易产生歧义,不易 理解;所以这里把它单独拿出来讲解,它与return的区别,它和生成器的关系,它的通常用法。

    生成器、迭代器、可迭代对象、迭代协议的区别与联系

    生成器:使用了yield的函数就是生成器,它是一个返回迭代器对象的函数 可迭代对象:列表,字典,元素,字符串等,但可迭代对象并不一定是迭代器 from collections import Iterable, Iterator a = [1, 2, 3] ...

    使用C# yield关键字来提高性能和可读性

    使用C# yield关键字来提高性能和可读性

    python中yield的用法.docx

    Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。 python中yield的用法全文共3页,...

    Python库 | ffmpeg_progress_yield-0.1.2-py2.py3-none-any.whl

    python库,解压后可用。 资源全名:ffmpeg_progress_yield-0.1.2-py2.py3-none-any.whl

Global site tag (gtag.js) - Google Analytics