gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 21:16:17 27 4
gpt4 key购买 nike

在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开发人员将如何原生/自然地实现相同的功能。

最佳答案

我认为在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']

This can also be done using nested list comprehensions which has been shown below:


# 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]

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

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

List Comprehensions are one of the most amazing features of Python. It is a smart and concise way of creating lists ...



这是一种非常 python 的态度,当某项功能使您在代码中使用它时感到很聪明时,这意味着该功能很好,即使它使其他人(或日后您自己)尝试阅读和了解您的代码。这种态度在Go中被强烈拒绝。

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

People have asked us for these kinds of features, and we say "no". One of the reasons is that, if you add these features, people are going to use them, that's why they're there. But they may be more expensive than a simple for loop. They tend to generate more expensive solutions to problems that have much simpler solutions

关于go - 模仿Python在Go列表中理解一系列数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58799055/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com