Python 为冰雹序列创建生成器表达式 创建了以下生成器函数:

Python 为冰雹序列创建生成器表达式 创建了以下生成器函数:,python,generator,list-comprehension,Python,Generator,List Comprehension,这对我来说是一个hailstone序列的生成器函数,现在我尝试从生成器表达式(一个线性表达式)生成相同的输出 我正试图朝着这个方向发展: hailstone = (num // 2 if num % 2 == 0 else num * 3 + 1 for i in range("something here")) 其中num作为第一个数字传递。 我注意到使用范围可能不是正确的路径,但我需要一个停止条件 我想弄明白的主要事情是: 如何将next()输出传回generator以生成序列 如何提供停

这对我来说是一个hailstone序列的生成器函数,现在我尝试从生成器表达式(一个线性表达式)生成相同的输出

我正试图朝着这个方向发展:

hailstone = (num // 2 if num % 2 == 0 else num * 3 + 1 for i in range("something here"))
其中num作为第一个数字传递。 我注意到使用范围可能不是正确的路径,但我需要一个停止条件

我想弄明白的主要事情是:
  • 如何将next()输出传回generator以生成序列
  • 如何提供停止条件

  • 执行此任务是否有帮助?

    如注释中所述,生成器表达式不是此处作业的正确工具。生成器表达式和列表理解旨在从现有iterable生成iterable。它们在这里不是很合适,因为您没有可迭代的现有iterable

    理解到生成器表达式的任何使用都是强制的,我会通过迭代无限iterable来实现,然后在满足条件时进行:

    from itertools import count, takewhile
    
    def next_hailstone(n):
        return n // 2 if n % 2 == 0 else n * 3 + 1
    
    last = 1000  # Starting number
    infinite_seq = (last := next_hailstone(last) for _ in count(0))
    finite_seq = takewhile(lambda n: n > 1, infinite_seq)
    
    print(list(finite_seq))
    
    注:

    • 这需要Python3.8+使用(
      :=
      )。如果没有赋值表达式,很难从一个迭代到下一个迭代来维护状态,这是这个问题所需要的(另一个迹象表明这是工作的错误工具)

    • count(0)
      只是提供一个无限的可数。您可以用任何可以永远迭代的东西来替换它(比如一个只有无限
      的生成器函数,而包含
      循环不产生任何

    • 我在这里写的基本上是一个缩减。如果你/你的老师坚持要花哨,那么完成这样任务的内置工具就是。我是一名函数式程序员,我喜欢
      reduce
      。但实际上,在大多数情况下,一个简单的循环更合适

    • 请不要在真实代码中这样做。同样,生成器表达式和列表理解之类的构造旨在从现有的iterables创建新的iterables。其他任何东西都可以说是对它们的滥用


    如评论中所述,生成器表达式不是此处作业的正确工具。生成器表达式和列表理解旨在从现有iterable生成iterable。它们在这里不是很合适,因为您没有可迭代的现有iterable

    理解到生成器表达式的任何使用都是强制的,我会通过迭代无限iterable来实现,然后在满足条件时进行:

    from itertools import count, takewhile
    
    def next_hailstone(n):
        return n // 2 if n % 2 == 0 else n * 3 + 1
    
    last = 1000  # Starting number
    infinite_seq = (last := next_hailstone(last) for _ in count(0))
    finite_seq = takewhile(lambda n: n > 1, infinite_seq)
    
    print(list(finite_seq))
    
    注:

    • 这需要Python3.8+使用(
      :=
      )。如果没有赋值表达式,很难从一个迭代到下一个迭代来维护状态,这是这个问题所需要的(另一个迹象表明这是工作的错误工具)

    • count(0)
      只是提供一个无限的可数。您可以用任何可以永远迭代的东西来替换它(比如一个只有无限
      的生成器函数,而包含
      循环不产生任何

    • 我在这里写的基本上是一个缩减。如果你/你的老师坚持要花哨,那么完成这样任务的内置工具就是。我是一名函数式程序员,我喜欢
      reduce
      。但实际上,在大多数情况下,一个简单的循环更合适

    • 请不要在真实代码中这样做。同样,生成器表达式和列表理解之类的构造旨在从现有的iterables创建新的iterables。其他任何东西都可以说是对它们的滥用


    没有很好的方法将这样的while循环转换为生成器表达式,while循环依赖于主体内部的值作为停止的条件。只要使用这个。要使用生成器表达式,您需要生成一个无限序列,然后使用
    take\u while
    函数或其他什么。生成器表达式通常在您提前知道要进行多少次迭代(或至少知道可能的最大迭代次数)时使用。对于列表理解/生成器表达式来说,迭代直到条件被表示是一个糟糕的用例,因为这些结构意味着迭代现有的iterables。是的,理解结构是围绕在iterables上表示映射/过滤转换而设计的。它们并不是要成为一个包罗万象的东西,把所有的东西都变成一行。Python是一种足够动态的语言,可以让你做各种各样的胡闹,所以我想有某种方法可以实现你想要的,但你绝对不应该这样做。
    hailstone=lambda num:(num if I==0 else(num:=num//2)if num%2==0 else(num:=num*3+1)对于I,u在枚举(iter(lambda:num,1))中)
    它很难看,不要用它。@AndrejKesely巧妙地使用了iter的双参数形式,但男孩是粗俗的
    iter(lambda:num,1)
    。。。我想我更喜欢takewhile,我真的不喜欢这个函数。没有好的方法把while循环变成生成器表达式,它依赖于体内的值作为停止的条件。只要使用这个。要使用生成器表达式,您需要生成一个无限序列,然后使用
    take\u while
    函数或其他什么。生成器表达式通常在您提前知道要进行多少次迭代(或至少知道可能的最大迭代次数)时使用。对于列表理解/生成器表达式来说,迭代直到条件被表示是一个糟糕的用例,因为这些结构意味着迭代现有的iterables。是的,理解结构是围绕在iterables上表示映射/过滤转换而设计的。它们并不是要成为一个包罗万象的东西,把所有的东西都变成一行。Python是一个非常有用的工具