在Python中使用过滤器和发生器来生成无尽的质数
下面是一个Python程序,我发现使用 eratosthenes的筛子.它使用过滤器和发电机.我无法理解. def _odd_iter(): n = 1 while True: n = n + 2 yield n def _not_divisible(n): return lambda x: x % n > 0 def primes(): yield 2 it = _odd_iter() while True: n = next(it) yield n it = filter(_not_divisible(n), it) for n in primes(): if n
2 2024-01-23
编程技术问答社区
当你调用一个包含屈服的函数时会发生什么?
我阅读>>> def double_inputs(): ... while True: # Line 1 ... x = yield # Line 2 ... yield x * 2 # Line 3 ... >>> gen = double_inputs() >>> next(gen) # Run up to the first yield >>> gen.send(10) # goes into 'x' variable 如果我正确理解上述内容,这似乎意味着Python实际上等待next(gen)在功能正文中"跑到"到Line 2.换句话说,解释器将不开始执行功能的正文,直到我们调用next. 这实际上是正确的吗? 据我所知,Python没有进行AOT汇编,除了解析代码并确保其有效的Python之外,它并没有"向前看".它是否正确? 如果以上是正确的,那么python当我调用double_inputs()时如何知道它需要等到我打电话next(gen)才能进入循环whi
6 2024-01-09
编程技术问答社区
使用收益率来迭代一个数据存储器可能不会关闭连接?
这是一个示例代码,可以使用我在搜索搜索时在几个地方发现的收益关键字从数据库中检索数据: public IEnumerable ExecuteSelect(string commandText) { using (IDbConnection connection = CreateConnection()) { using (IDbCommand cmd = CreateCommand(commandText, connection)) { connection.Open(); using (IDbDataReader reader = cmd.ExecuteReader()) { while(reader.Read()) { yield re
2 2024-01-07
编程技术问答社区
C# IEnumerator/yield结构可能是坏的?
背景:我从数据库中获得了很多字符串,我想返回它们.传统上,这将是这样的: public List GetStuff(string connectionString) { List categoryList = new List(); using (SqlConnection sqlConnection = new SqlConnection(connectionString)) { string commandText = "GetStuff"; using (SqlCommand sqlCommand = new SqlCommand(commandText, sqlConnection)) { sqlCommand.CommandType = CommandType.StoredProcedure; sqlCo
0 2024-01-04
编程技术问答社区
把这个foreach收益率改写为linq收益率?
说我有以下代码(上下文缩小以保持问题范围有限) public static IEnumerable GetThemColors(){ var ids = GetThePrimaryIds(); foreach (int id in ids){ yield return GetColorById(id); } ids = GetTheOtherIds(); foreach (int id in ids){ yield return GetOtherColorsById(id); } } 我想将它们重写为这样的东西(当然不会编译 public static IEnumerable GetThemColors(){ GetThePrimaryIds().Select(id=>yield return GetColorById(id)); GetTheOth
0 2024-01-04
编程技术问答社区
序列化和Yield语句
是否可以序列化包含yield语句的方法(或包含这种方法的类),使得当您补充类时,保留了生成的迭代器的内部状态? 解决方案 是的,您可以做到这一点.有警告. 可以在此处找到用yield序列化方法的示例,可以在这里找到: http://www.agilekiwi.com/dotnet/countingdemo.cs ( web存档链接). 通常,试图在不做额外工作的情况下进行序列化将失败.这是编译器生成的类未用Serializable属性标记的.但是,您可以解决这个问题. 我会注意到它们没有序列化标记的原因是因为它们是实现细节,并且会受到未来版本的破坏变化,因此您可能无法在较新版本中对其进行估算. 与我在中提出的问题有关也为这种情况工作. 这是" hack"的源代码: // Copyright © 2007 John M Rusk (http://www.agilekiwi.com) // // You may use this source c
4 2024-01-04
编程技术问答社区
产量在LINQ之外是否有用?
每当我认为我可以使用收益率关键字时,我就会退后一步,看看它将如何影响我的项目.我总是最终返回一个收藏而不是Yeilding,因为我觉得维持Yeilding方法状态的开销并不能为我买太多.在几乎所有的情况下,我都返回收藏集,我觉得90%的时间将在集合中的所有元素上迭代,或者将在整个集合中寻求一系列元素. 我确实理解了它在LINQ中的有用性,但是我觉得只有Linq团队正在编写如此复杂的可查询对象,以使收益很有用. 有人写了像Linq一样有用的linq之类的东西吗? 解决方案 我最近必须以表达式类别的形式代表数学表达式.在评估表达式时,我必须用后阶树漫步穿越树结构.为了实现这一目标,我实现了这样的Ienumerable : public IEnumerator> GetEnumerator() { if (IsLeaf) { yield return this; } else {
0 2024-01-03
编程技术问答社区
产量如何实现懒惰加载的模式?
yield如何实现lazy loading的模式? 解决方案 收益率实施在需要之前才能达到代码. 例如,此代码: public IEnumerable GetInts() { yield return 1; yield return 2; yield return 3; } 实际上将编译成实现IEnumerable的嵌套类,GetInts()的主体将返回该类的实例. 使用反射器您可以看到: public IEnumerable GetInts() { d__6d d__d = new d__6d(-2); d__d.4__this = this; return d__d; } 编辑 - 添加有关GetInts实现的更多信息: 这种实现使其懒惰的方式基于Enumerator MoveNext() 方法.当生成枚举的嵌套类(示例中的
2 2024-01-03
编程技术问答社区
产量在现实生活中的应用是什么?
我知道yield有什么,我已经看过几个例子,但是我想不出现实生活中的应用,您是否使用它来解决一些特定的问题? (理想情况下,某些无法解决的问题) 解决方案 我意识到这是一个古老的问题(前乔恩·斯基特(Jon Skeet)?),但是我最近一直在考虑这个问题.不幸的是,这里的当前答案(我认为)没有提及收益率陈述的最明显优势. 收益率声明的最大好处是,它允许您迭代具有更有效的内存使用情况的非常大的列表,然后使用标准列表. 例如,假设您有一个返回100万行的数据库查询.您可以使用DataReader检索所有行并将它们存储在列表中,因此需要list_size * row_size字节的内存. ,或者您可以使用收益率语句创建迭代器,并且一次只能存储一行.实际上,这使您能够在大量数据上提供"流"功能. 此外,在使用迭代器的代码中,您使用一个简单的foreach循环,可以决定根据需要从循环中脱颖而出.如果您确实提早断裂,则只有需要前5行(例如). 关于:
2 2024-01-03
编程技术问答社区
C#: 产量返回范围/集合
我使用yield return关键字很多,但是当我想向IEnumerable添加范围时,我发现它缺乏.这是我想做的快速示例: IEnumerable SomeRecursiveMethod() { // some code // ... yield return SomeRecursiveMethod(); } 自然会导致错误,可以通过简单的循环来解决.有一个更好的方法吗?循环有点笨拙. 解决方案 不,恐怕没有. f# dis 用yield!支持这一点,但是C#中没有等效的 - 您基本上必须使用循环.抱歉...我感到你的痛苦.我在我的Edulinq博客之一,它会使事情变得更简单. 请注意,递归使用收益率可能很昂贵 - 请参阅 Wes Dyer在迭代器上的帖子有关更多信息(并提到四年前正在考虑的"收益率" ...) ) 其他解决方案 如果您已经有一个IEnumerable循环循环,并且返回类型为IEnumerabl
4 2024-01-03
编程技术问答社区
什么时候不使用产量(回报)?
这个问题在这里已经有一个答案: 这里有几个有用的问题,关于yield return的好处.例如, 是否有人可以使收益率更加美观 关键字 在C#屈服 关键字 什么是收益率关键字 我正在寻找不是使用yield return的想法.例如,如果我期望需要返回集合中的所有项目,那么 yield yield都不会有用,对吗? yield使用yield的情况是什么情况 解决方案 在哪些情况下,使用产量会限制,不必要,让我陷入困境,或者应避免使用? 在处理递归定义的结构时,仔细考虑使用"收益率返回"是一个好主意.例如,我经常看到这个: public static IEnumerable PreorderTraversal(Tree root) { if (root == null) yield break; yield return root.Value; foreach(T item in Preord
0 2024-01-02
编程技术问答社区
在C#中,"yield break; "的作用是什么?
我已经在msdn中看到了这种语法: yield break yield break ,但是我不知道它做什么.有人知道吗? 解决方案 它指定迭代器已经结束.您可以将yield break视为不返回值的语句. 例如,如果将函数定义为迭代器,则该功能的正文可能看起来像这样: for (int i = 0; i
0 2024-01-02
编程技术问答社区
产量声明的实施
我想知道 关于yield语句,以易于理解的形式. 我已经阅读了有关yield语句及其在实现迭代模式时的便利性.但是,大多数非常干.我想在封面下拿到Microsoft如何处理返回产量. 另外,什么时候使用屈服? 解决方案 yield通过内部构建状态机来起作用.下次退出并恢复该状态时,它将存储例程的当前状态. 您可以使用反射器查看编译器的实现方式. 当您要停止返回结果时,使用 yield break.如果您没有yield break,则编译器会在功能末尾假设一个(就像正常函数中的return;语句一样) 其他解决方案 正如Mehrdad所说,它构建了一台状态机. 以及使用反射器(另一个很棒的建议),您可能会发现我的有关Iterator Block实施的文章有用.如果不是finally块,那将是相对简单的 - 但它们引入了整个复杂性的额外尺寸! 其他解决方案 让我们稍微回去:yield关键字被翻译为许多其他人对状态机器所说的. 实际上,
0 2024-01-02
编程技术问答社区
将Ruby'的嵌套函数内部的收益率转换为Node.js
我正在尝试将Ruby代码的一块转换为node.js.关于yield的一件特殊的作品让我感到困惑.代码是这样的: each_pair(hash["args"][0]) do |key, value, pair| # perform operations end ... def each_pair(hash) hash["props"].each do |p| yield(p["key"], p["value"], p) end end 如果我正确读取此代码,则说"在哈希属性上迭代.对于每个元素,请回电到外部函数并使用给定的p["key"], p["value"], p值执行操作." 我无法真正理解JavaScript的外观.我很喜欢写更多的琐事.是否可以转换?我猜这是类似的: each_pair(hash["args"][0], function(key, value, pair) { // perform operati
2 2023-12-25
编程技术问答社区
递归生成器函数Python嵌套JSON数据
我正在尝试编写递归生成器函数,以使混合类型,列表和词典的嵌套JSON对象更平坦.我是为了自己的学习而进行的,因此避免从互联网上抓住一个例子,以确保我更好地了解正在发生的事情,但我认为这是函数中相对于该功能的正确位置循环. 传递给发电机函数的数据的来源是外圈的输出,它通过mongo集合迭代. 当我在与收益率语句同一地点使用打印语句时,我会得到我期望的结果,但是当我将其切换到收益率语句时,生成器似乎仅根据外循环的迭代而产生一个项目. 希望有人可以向我展示我出错的地方. columns = ['_id' , 'name' , 'personId' , 'status' , 'explorerProgress' , 'isSelectedForReview' ] db = MongoClient().abcDatabase coll = db.abcCollection def dic_recurse(dat
2 2023-12-25
编程技术问答社区
使用产量打印输出
这是从这里进行我正在使用yield语句,而不是return. 这是代码: class Measurements(): def __init__(self, value, other): self.value = value self.other = other class Criteria(): def __init__(self, new_value, measurements): self.new_value = new_value self.measurements = measurements def method(self): for measurement in self.measurements: if 20
2 2023-12-25
编程技术问答社区
Python在第一次StopIteration时退出消费者
这是我的 1个生成器 - 多个消费者 - 多个消费者StopIteration是发电机发出疲惫的方式,但不幸的是,我现在有许多例外处理代码在client>代码中的整个位置(对于下面的示例中的每个next()语句). 击中第一个StopIteration异常时,是否有更好的方法来退出meal内置的任何值? def client(course, take): meal = [] for _ in range(take): try: some_meal = next(course) meal.append(some_meal) except StopIteration: pass if take % 2 == 0: try: some_meal = next(course) meal.appe
0 2023-12-25
编程技术问答社区
使用超级代理的收益率返回请求对象而不是响应
根据超代理文档:超级代理文档 var res = yield request .get('http://local') .auth('tobi', 'learnboost') 但是,我发现var res不是res,它的req.这意味着我只能访问请求对象,而不是带有通常传递到end()链的获取数据的响应对象,这显然是我需要的. 有人会遇到这个吗?我想念什么吗? 解决方案 尽管您的问题是 gh ,我想知道,我想我粘贴了在这里也在这里.以下对我有好处! var res = yield Promise.resolve(request .get('http://local') .auth('tobi', 'learnboost'))
4 2023-12-25
编程技术问答社区
在函数中使用 "产量"。
我想在接收1个参数yield的函数中生成类似的东西,以生成: 1 1+2 1+2+3 … … 1+2+3+⋯+n−1+n 那是我的最后一次尝试: def suite(n): total = 0 for i in n: total+=i yield total 这就是我收到的: Traceback (most recent call last): File "notebook", line 4, in suite TypeError: 'int' object is not iterable 解决方案 您的错误在这里: for i in n: n是一个整数,而不是一个觉得.也许您想使用 xrange() xrange() (仅Python 2)或 range() (在Python 3上推荐): for i in range(n): 请
2 2023-12-25
编程技术问答社区