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中使用上下文管理器自动关闭文件是一个常见的习惯用法:
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对象永远不会被关闭!
或者是吗?
我想缩写我用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)