【问题标题】:Simple infinite iterator in PythonPython中的简单无限迭代器
【发布时间】:2021-11-15 07:17:15
【问题描述】:

几天前,我作为初级 Python 开发人员开始在朋友的初创公司工作,我们是唯一的员工。

我注意到他有时会编写奇怪的代码。例如:

@pytest.fixture
def create_user_model_test_data():
    positive_numbers_iterator = (
        lambda n: type("DeclarativeParametrizedNumbersInfiniteIterator", (), {
            "__iter__": lambda self: self,
            "__next__": staticmethod(
                (
                    lambda n:
                    (
                        lambda arg_dict:
                        lambda: (
                            arg_dict.update({"n": arg_dict["n"] + 1}) or arg_dict["n"] - 1,
                        )
                    )
                    ({"n": n})
                )
                (n)
            )
        })
        ()
    )
    positive_numbers_starting_from_zero_iterator = positive_numbers_iterator(0)
    # FIXME: dont know why python needs a while to iterate a sequence but anyways
    while "1":
        for n in next(map(next, [positive_numbers_starting_from_zero_iterator])):
            if n == 20: return
            create_user(name=f"user-{n}", role=["admin", "user"][n % 2])

我建议改成这样:

N = -1
def iterate_numbers():
    N += 1
    return N

但是,他说它是不纯的,不是声明性的,不能参数化。我说没有问题,声明式的方式很丑,但他回答说Python很丑,你可以在Haskell中写一个简单的声明式无限迭代器,现在正在考虑用Haskell重写整个项目。我喜欢 Python 并且想学习它,我不知道 Haskell 也不想学习。

请告诉我如何在不改变全局变量的情况下在 Python 中编写一个简单的声明性参数化纯无限数序列,我不想学习 Haskell,我需要说服他坚持使用 Python。

编辑:请注意,迭代器只能用 1 行代码编写,这很好,但我已将其格式化,以便您轻松理解它

【问题讨论】:

  • 注意,你的朋友接近使用突变arg_dict.update。无论如何,您只需要itertools.count
  • 注意,您的iterate_numbers 函数根本不是迭代器
  • @juanpa.arrivillaga 是的,.update 是笑话的一部分。另外,create_user 有副作用
  • @Pablo 和 # FIXME: dont know why python needs a while to iterate a sequence but anyways 疯了。

标签: python iterator global-variables sequence declarative


【解决方案1】:

这是一个返回无限数生成器的函数。您也可以定义起点。

def iterate_numbers(start=0):
    while True:
        yield start
        start += 1

【讨论】:

  • 但是为什么呢?只需使用itertools.count
  • 我也想建议,但是你没有从中学习,但是在你了解它的工作原理之后你肯定可以使用它。
猜你喜欢
  • 1970-01-01
  • 2011-05-25
  • 2023-04-01
  • 2021-10-08
  • 2010-10-11
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
相关资源
最近更新 更多