在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开发人员将如何原生/自然地实现相同的功能。
答案 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循环更昂贵。他们往往会针对解决方案简单得多的问题生成更昂贵的解决方案