相关疑难解决方法(0)

"yield"关键字有什么作用?

yieldPython中关键字的用途是什么?它有什么作用?

例如,我试图理解这段代码1:

def _get_child_candidates(self, distance, min_dist, max_dist):
    if self._leftchild and distance - max_dist < self._median:
        yield self._leftchild
    if self._rightchild and distance + max_dist >= self._median:
        yield self._rightchild  
Run Code Online (Sandbox Code Playgroud)

这是来电者:

result, candidates = [], [self]
while candidates:
    node = candidates.pop()
    distance = node._get_dist(obj)
    if distance <= max_dist and distance >= min_dist:
        result.extend(node._values)
    candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))
return result
Run Code Online (Sandbox Code Playgroud)

_get_child_candidates调用该方法时会发生什么?列表是否返回?单个元素?它又被召唤了吗?后续通话何时停止?


1.代码来自Jochen Schulz(jrschulz),他为度量空间创建了一个很棒的Python库.这是完整源代码的链接:模块mspace.

python iterator yield generator coroutine

9664
推荐指数
46
解决办法
212万
查看次数

在python中结合'with'和'yield'是否安全?

在python中使用上下文管理器自动关闭文件是一个常见的习惯用法:

with open('filename') as my_file:
    # do something with my_file

# my_file gets automatically closed after exiting 'with' block
Run Code Online (Sandbox Code Playgroud)

现在我想读几个文件的内容.数据的使用者不知道或不关心数据是来自文件还是非文件.它不想检查它收到的对象是否可以打开.它只是想从中获取内容.所以我创建了一个像这样的迭代器:

def select_files():
    """Yields carefully selected and ready-to-read-from files"""
    file_names = [.......]
    for fname in file_names:
        with open(fname) as my_open_file:
            yield my_open_file
Run Code Online (Sandbox Code Playgroud)

这个迭代器可以像这样使用:

for file_obj in select_files():
    for line in file_obj:
        # do something useful
Run Code Online (Sandbox Code Playgroud)

(注意,可以使用相同的代码来消耗不是打开的文件,而是使用字符串列表 - 这很酷!)

问题是:产生打开文件是否安全?

看起来像"为什么不呢?".消费者调用迭代器,迭代器打开文件,将其产生给消费者.消费者处理文件并返回下一个迭代器.迭代器代码恢复,我们退出'with'块,my_open_file对象关闭,转到下一个文件等.

但是,如果消费者永远不会回到下一个文件的迭代器呢?消费者内部发生异常.或者消费者在其中一个文件中发现了一些非常令人兴奋的内容,并愉快地将结果返回给任何人调用它?

迭代器代码在这种情况下永远不会恢复,我们永远不会到'with'块结束,my_open_file对象永远不会被关闭!

或者是吗?

python yield with-statement

29
推荐指数
2
解决办法
5360
查看次数

使用loadtxt缩写导入多个文件(Python)

我想缩写我用loadtxt导入多个文件的方式,我做下一个:

rc1    =loadtxt("20120701_Gp_xr_5m.txt", skiprows=19)
rc2    =loadtxt("20120702_Gp_xr_5m.txt", skiprows=19)
rc3    =loadtxt("20120703_Gp_xr_5m.txt", skiprows=19)
rc4    =loadtxt("20120704_Gp_xr_5m.txt", skiprows=19)
rc5    =loadtxt("20120705_Gp_xr_5m.txt", skiprows=19)
rc6    =loadtxt("20120706_Gp_xr_5m.txt", skiprows=19)
rc7    =loadtxt("20120707_Gp_xr_5m.txt", skiprows=19)
rc8    =loadtxt("20120708_Gp_xr_5m.txt", skiprows=19)
rc9    =loadtxt("20120709_Gp_xr_5m.txt", skiprows=19)
rc10   =loadtxt("20120710_Gp_xr_5m.txt", skiprows=19)
Run Code Online (Sandbox Code Playgroud)

然后我使用以下方法连接它们:

GOES   =concatenate((rc1,rc2,rc3,rc4,rc5,rc6,rc7,rc8,rc9,
                     rc10),axis=0)
Run Code Online (Sandbox Code Playgroud)

但我的问题是:我想减少所有这些吗?也许有FOR或类似的东西.由于文件是日期(字符串)的保证.

我当时想要做这样的事情

day = ####我不知道如何定义从01到31的字符串

data="201207"+day+"_Gp_xr_5m.txt"
Run Code Online (Sandbox Code Playgroud)

然后这样做,但我认为是不正确的

GOES=loadtxt(data, skiprows=19)
Run Code Online (Sandbox Code Playgroud)

import load numpy concatenation python-2.7

1
推荐指数
1
解决办法
7042
查看次数