模仿Python在Go列表中理解一系列数字

时间:2019-11-11 09:51:34

标签: go

在Python中,我可以做类似的事情:

numbers = [i for i in range(5)]

这将导致:

>> [0, 1, 2, 3, 4]

我正在学习Go,所以我想尝试复制该过程:

package main

import "fmt"

func inRange(num int) []int {
    // Make a slice to hold the number if int's specified
    output := make([]int, num)

    // For Loop to insert data
    for i := 0; i < num; i++ {
        output[i] = i
    }
    return output
}

func main() {
    x := inRange(10)
    fmt.Print(x)
}

输出:

>> [0, 1, 2, 3, 4]

似乎很冗长,有没有更简单的方法可以在Go中实现呢?我也喜欢在python中将其变得更复杂

evens = [i for i in range(10) if i % 2 == 0]
>> [0, 2, 4, 5, 8]

这个问题不是如何使Go像Python那样工作,我想知道Go开发人员将如何原生/自然地实现相同的功能。

2 个答案:

答案 0 :(得分:4)

  

[I]您可以通过Go语言实现更简单的方法吗?

基本上没有。

您可以使用range稍微简化for循环,仅此而已。 经验法则:Go中没有魔术。

答案 1 :(得分:1)

我认为在Go中做到这一点的自然方法是仅视情况而定。当您尝试做一些非常基本的事情时(例如用升序数填充数组),使Python的列表推导看起来很吸引人的情况。如果它是一个简单的概念,我们应该能够简单地编写它。您在这里可能会不同意,但我想说的是分配一个升序的数字(甚至是数字)实际上不是一个典型的问题,似乎没有太大的用途。

具有列表理解能力的陷阱是,将它们用于更复杂的场景变得很诱人。以Geeks for geeks

为例
# 2-D List of planets 
planets = [['Mercury', 'Venus', 'Earth'], ['Mars', 'Jupiter', 'Saturn'], ['Uranus', 'Neptune', 'Pluto']] 

flatten_planets = [] 

for sublist in planets: 
    for planet in sublist: 

        if len(planet) < 6: 
            flatten_planets.append(planet) 

print(flatten_planets)

输出:

['Venus', 'Earth', 'Mars', 'Pluto']
  

这也可以使用嵌套列表理解来完成   如下所示:

# 2-D List of planets 
planets = [['Mercury', 'Venus', 'Earth'], ['Mars', 'Jupiter', 'Saturn'], ['Uranus', 'Neptune', 'Pluto']] 

# Nested List comprehension with an if condition 
flatten_planets = [planet for sublist in planets for planet in sublist if len(planet) < 6] 

print(flatten_planets) 

输出:

['Venus', 'Earth', 'Mars', 'Pluto']

尽管将4行代码减少到1条可能会令人满意,但是使用“理解”可以使代码对人类的理解较少。

此表达式...

[planet for sublist in planets for planet in sublist if len(planet) < 6]

似乎令人反感,正在发生相同数量的“嵌套”(事物列表理解使之消失),只是现在没有像缩进这样的视觉线索可以帮助我们理解它。我们必须仔细阅读此行,并重新构造脑海中的嵌套逻辑,以了解其工作原理。

我从中获得的这篇文章解释了这样的理解:

  

列表理解是Python最令人惊奇的功能之一。它   是创建列表的一种聪明简洁的方法...

这是一种非常蟒蛇的态度,当某项功能使您在代码中使用它时感到很聪明时,这意味着该功能很不错,即使它使其他人(或您以后)也很难尝试阅读和理解您的代码。 Go强烈拒绝这种态度。

Go的一位创作者Rob Pike对此话题提供了一个令人难忘的报价(我在这里释义)

  

人们要求我们提供此类功能,我们说“不”。原因之一是,如果添加这些功能,人们将使用它们,这就是它们在那里的原因。但是它们可能比简单的for循环更昂贵。他们往往会针对解决方案简单得多的问题生成更昂贵的解决方案