`
icefire
  • 浏览: 125347 次
  • 性别: 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
分享到:
评论

相关推荐

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

    在实际开发中,yield关键字可以应用于各种场景,例如: 1. 实现自定义的集合类,例如实现一个自定义的ArrayList类。 2. 实现数据的枚举,例如枚举数据库中的数据。 3. 实现事件驱动的编程,例如在游戏开发中使用...

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

    在Python编程语言中,`yield`关键字提供了一种高效且灵活的方式来处理大型数据集或无限序列,尤其是在涉及迭代器、生成器等概念时更为突出。本文将详细介绍`yield`的工作原理以及如何在实际开发中有效利用它。 ####...

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

    在Python编程语言中,`yield`关键字主要用于生成器(generator),它允许函数作为一个迭代器,一次生成一个值,而不是一次性生成所有值。这种方式在处理大量数据或需要节省内存时非常有用。本文将深入探讨如何使用`...

    C#yield使用.zip

    在C#编程语言中,`yield`关键字是一个非常独特且强大的特性,主要用于迭代器方法,使得我们可以方便地创建自定义的枚举器类,而无需显式定义状态机。这在处理大量数据或生成序列时尤其有用,比如在实现懒加载、生成...

    14.Python中的迭代器协议1

    在实践中,Python中的迭代器协议可以应用于各种场景,例如,遍历列表、字典、集合等数据结构,或者实现自定义的迭代器来满足特定的需求。 通过使用Python中的迭代器协议,可以方便地实现可迭代对象的迭代,并且可以...

    yield表达式.pdf

    在应用方面,yield表达式可以用于创建自定义的迭代器。例如,Python内置函数range()返回一个range对象,而在早期版本中,xrange()函数返回一个xrange对象,后者就是通过yield表达式实现的。它在生成序列时不会创建...

    harmonyos2-yield-iter:产量迭代器

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

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

    在实际应用中,生成器不仅可以用于创建高效的迭代器,还可以在数据处理、流式数据计算等方面发挥作用,因为它能以一种惰性求值的方式工作,即只有在需要的时候才计算下一个值,这样可以显著减少内存消耗。...

    测试迭代.zip,迭代器、可迭代对象、生成器、生成器表达式的实验代码

    通过实验代码,你可以看到如何创建自定义迭代器和生成器,以及它们如何在实际问题中应用。这有助于提升对Python迭代机制的理解,并能更高效地处理大量数据或实现惰性计算。 在探索这些概念时,你可能会遇到以下场景...

    IteratorPattern 迭代设计模式

    C#中的`IEnumerator`接口和`yield return`关键字也是迭代器模式的实现。 在文件名称“IteratorPattern01”中,我们可以推测这可能是一个关于迭代器模式的示例代码或教程,可能包含了如何创建迭代器接口、具体迭代器...

    Pb中Yield()函数的使用[文].pdf

    Yield() 函数的主要功能是允许程序在执行耗时较长的操作时把控制权转让给其他应用。这样可以使程序更加友好,提高用户体验。例如,在执行一段耗时较长的代码时,可以插入 Yield() 函数,以便让用户能够进行其他操作...

    迭代器,生成器

    #### 五、迭代器和生成器的综合应用 在实际开发中,经常需要处理大量数据并进行复杂的运算。使用迭代器和生成器可以显著提高代码的可读性和性能。例如,可以结合使用自定义迭代器和生成器来处理大数据集,以避免一次...

    迭代器源码

    迭代器在处理集合数据时提供了极大的灵活性,广泛应用于各种数据结构如数组、列表、队列和堆等。在本篇中,我们将深入探讨迭代器的源码实现,并通过一个名为“迭代器Demo”的实例来具体阐述其工作原理。 首先,让...

    迭代器和生成器的区别

    3. 生成器是一个特殊的迭代器,具有简洁的实现方式和yield关键字的特殊作用。 4. 创建生成器的方法有两种:使用小括号和yield关键字的函数。 5. yield关键字的作用是保存当前运行状态和暂停执行,返回值时需要调用...

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

    yield 关键字可以广泛应用于各种场景中,例如数据处理、文件处理、网络处理等。yield 关键字可以让开发者使用惰性枚举,从而减少不必要的内存分配和数据处理。 在 Ayende 的例子中,我们可以看到使用 yield 关键字...

    深入讲解Python中的迭代器和生成器

    生成器是Python中一种特殊的迭代器,它使用关键字 `yield` 来生成序列。与普通函数不同,生成器函数会在每次调用 `yield` 时返回一个值,并保留函数的局部状态,使得下次调用时可以从上次中断的地方继续执行。 示例...

    ES6 迭代器与可迭代对象的实现

    在ES6中,迭代器被广泛应用于数组、集合、for-of循环、展开运算符(...)以及异步编程等领域。本文将探讨ES6迭代器和生成器的实现机制,以及可迭代对象的内部原理和使用方法。 迭代器是一种特殊对象,它遵循特定的...

    Python语言基础:迭代器和生成器.pptx

    本文将详细讲解这两个概念及其在Python语言中的应用。 **迭代器** 迭代器是Python中访问集合元素的一种方式,它具有记忆遍历位置的能力。一旦创建了迭代器对象,它会从集合的第一个元素开始访问,直至所有元素都被...

    java 线程让步(Yield)

    Java线程让步(Yield)是Java多线程编程中的一个重要概念,它涉及到线程调度和并发控制。在多线程环境下,线程让步意味着一个正在运行的线程主动放弃当前的时间片,以便其他就绪状态的线程有机会执行。这与线程的...

Global site tag (gtag.js) - Google Analytics