yield的应用——QTreeWidgetItem的迭代

[i]最近学python 用 pyside,所以做个笔记[/i]

在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的方法来解决。用[b]yield[/b]。

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值