我在 Windows 7 x64 上使用 pydev,我发现生成器函数中的断点被忽略(如果我注释掉yield,一切正常)。
然后我发现了一个旧的 SO question Python debugger step in generators?
答案是“我刚刚测试了 eclipse,它将在安装 pydev 的情况下进行调试。”
但是当我测试代码时,断点仍然被忽略。
def example(n):
i = 1
while i <= n:
yield i
i += 1
print "hello"
print "goodbye"
if __name__ == '__main__':
example(8)
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
我正在使用一个返回生成器的库。有没有办法在不使用多个next()语句的情况下从特定迭代开始?
在一个简单的 for 循环中,我可以执行以下操作。
array = [2, 5, 1, 4, 3]
for i in array [2:]:
# do something
Run Code Online (Sandbox Code Playgroud)
在发电机中,我不能做如上所示。相反,我必须使用多个next ()语句从第三个索引开始。尝试执行与 for 循环相同的操作时,我收到一条错误消息,指出“生成器不可编写脚本”。
下面实现了一个控制流包装器,co使异步代码只能由yield关键字描述。
这基本上是什么async/await在ESwhatever引擎盖下呢?
co(function*() {
console.log('...');
yield one();
console.log('...');
yield two();
})
function co(gFn) {
var g = gFn();
return Promise.resolve()
.then(go);
function go() {
var result = g.next();
if(result.done) {
return;
}
if(isPromise(result.value)) {
return result.value.then(go); // Promises block until resolution.
}
return Promise.resolve(result);
}
}
function isPromise(o) {
return o instanceof Promise;
}
function one() {
return new Promise(resolve => setTimeout(() => (console.log('one'), resolve()), 1000));
}
function two() {
return new …Run Code Online (Sandbox Code Playgroud)我正在尝试使用 php 生成有效的站点地图。逻辑很简单。我将所有 ^(.+)index_sitemal.xml 请求转发到 .htaccess 中的 index_sitemap.php 文件。PHP脚本如下:
<?php
header( "content-type: application/xml; charset=UTF-8" );
echo '<?xml version="1.0" encoding="UTF-8"?>'."\n";
echo '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'."\n";
$len = 10; // to take
$min = 50; // minimum
$max = 100; // maximum
$range = [];
foreach (range(0, $len - 1) as $i) {
while(in_array($num = mt_rand($min, $max), $range));
$range[] = $num;
echo '<sitemap><loc>http://'.$_SERVER['SERVER_NAME'].'/sitemap/'.$num.'.xml</loc></sitemap>'."\n";
}
echo '</sitemapindex>';
?>
Run Code Online (Sandbox Code Playgroud)
在浏览器中显示良好。
图片链接 - (抱歉,声誉低)https://i.ibb.co/4ZmLJ1D/Screenshot-at-Jan-29-10-47-01.png
但是在尝试验证 xml 时,我遇到了类型错误。
图片链接 - (对不起,声誉低)https://i.ibb.co/Ws11cBj/Screenshot-at-Jan-29-10-55-28.png
有没有办法使用php显示动态站点地图?
我正在构建一个类似于生成器的通用接口,该生成器将数据从一个流传输到另一个流,以最终完成以下操作:
file |> toCsv |> filter |> sort |> filter...
Run Code Online (Sandbox Code Playgroud)
我知道如何对向量/片段进行排序,但是如何将传入的流/迭代器排序而不将其全部放入向量中?
stream.iter().collect_sorted()
Run Code Online (Sandbox Code Playgroud)
我需要融合向量,树,文件,数据库等,因此有时我不知道全部消耗不知道传入数据的大小。
我不反对存储结果。问题是排序与切片/向量有关。我需要能够:
stream.iter().collect_sorted()
Run Code Online (Sandbox Code Playgroud)
代替:
datasource |> Algo.sort |> next...
Run Code Online (Sandbox Code Playgroud)
针对不同的用例存在不同的排序算法,因此最终我希望对现有数据应用最好的排序方法:
let data = datasource |> into_vec
data.sort()
data |> next...
Run Code Online (Sandbox Code Playgroud) 我编写了一个简单的生成器函数,该函数接受一个可能包含子列表的列表,并尝试展平该列表:
因此[1,[2,3],4,[5,[6,7],8]]应产生1,2,3,4,5,6,7,8
如果我只想打印出值(而不是生成器),它看起来像这样,这可行:
# Code A
def flatten_list_of_lists(my_list):
for element in my_list:
if isinstance(element, list):
flatten_list_of_lists(element)
else:
print(element)
my_list = [1, [2, 3], 4, [5, [6, 7], 8]]
flatten_list_of_lists(my_list)
Run Code Online (Sandbox Code Playgroud)
并按预期打印出1,2,3,4,5,6,7,8
但是,当我将代码更改为此:
# Code B
def flatten_list_of_lists(my_list):
for element in my_list:
if isinstance(element, list):
flatten_list_of_lists(element)
else:
yield element
for i in flatten_list_of_lists(my_list):
print(i)
Run Code Online (Sandbox Code Playgroud)
只是将打印转换为成品,程序仅打印出1,4。
我将在下面粘贴有效的代码。但是我想知道为什么以前的代码不起作用?如果代码A正确地“打印”了数字,为什么代码B不能正确地“屈服”数字呢?
似乎我对生成器如何使用递归有基本的误解。
该代码实际上有效:
# Code C
def flatten_list_of_lists_v2(my_list):
for element in my_list:
if isinstance(element, list):
for sub_element in flatten_list_of_lists_v2(element):
yield sub_element
else:
yield element
l = [] …Run Code Online (Sandbox Code Playgroud) In python3 range built with help of generators
对数时间— O(log n)当算法在每一步中减少输入数据的大小时,被称为具有对数时间复杂度。例如,如果我们要在生成器的帮助下打印前10位数字,则首先将得到一个元素,因此剩下的9个元素必须处理,然后再得到第二个元素,因此剩下的8个元素必须处理
for index in range(0, len(data)):
print(data[index])
Run Code Online (Sandbox Code Playgroud)
当我检查python生成器的时间复杂度时,它说O(n)。
由于每次它只生成一个输出(因为我们需要这样做),__next__
因此每次将生成1个单位成本。
我可以对此进行解释吗
我有一个index.ts导出生成器函数的文件
export function* myFunction() { [...] }
Run Code Online (Sandbox Code Playgroud)
它可以正常工作--isolatedModules = false但无法编译--isolatedModules = true
编译过程中的错误信息:
All files must be modules when the '--isolatedModules' flag is provided. TS1208
Run Code Online (Sandbox Code Playgroud) 我有一个调用 API 并生成数据的函数。后来我用来next()从生成器中检索数据,但是由于我不知道有多少数据要“提取”,我最终会执行next()直到它引发StopIteration异常。
def get_data():
source = API_Instance()
yield source.get_some_data()
def parse_data():
data = get_data()
while True:
try:
row_data = next(data)
print(row_data)
except StopIteration:
break
Run Code Online (Sandbox Code Playgroud)
这似乎是一种糟糕的方法。有没有办法避免 Try/Except 块?像知道发电机已用尽的方法吗?(找不到更好的词来形容它)
例子:
from timeit import timeit
print(timeit("5 in [i for i in range(0, 100)]"))
print(timeit("5 in map(int, range(0, 100))"))
Run Code Online (Sandbox Code Playgroud)
这是结果:
3.771566713000084
0.9066896029999043
Run Code Online (Sandbox Code Playgroud)
python 3.8.5(我也认为这没有提到python版本^_^)
generator ×10
python ×6
python-3.x ×2
async-await ×1
asynchronous ×1
debugging ×1
http-headers ×1
iteration ×1
iterator ×1
javascript ×1
list ×1
php ×1
pydev ×1
recursion ×1
redux-saga ×1
rust ×1
sitemap ×1
sorting ×1
typescript ×1
xml ×1
yield ×1