Подражание пониманию списка Питонов в Go по диапазону чисел - PullRequest
0 голосов
/ 11 ноября 2019

В 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 достиг бы того жевещь родная / естественно.

Ответы [ 2 ]

4 голосов
/ 11 ноября 2019

[Есть ли более простой способ добиться этого в Go?

В основном нет.

Вы можете немного упростить цикл for с диапазоном, ноэто оно. Основное правило: в Го нет магии.

1 голос
/ 13 ноября 2019

Я думаю, что естественный способ сделать это в Go - это просто рассматривать вещи в каждом конкретном случае. Случаи, которые делают списки в Python действительно привлекательными, - это когда вы пытаетесь сделать что-то очень простое, например, заполнение массива возрастающими числами. Если это такая простая концепция, мы можем написать ее просто. Вы можете здесь не согласиться, но я бы сказал, что выделение списка возрастающих чисел (или даже чисел) на самом деле не является типичной проблемой и, похоже, не имеет особой цели.

Ловушка с пониманием списка состоит в том, чтостановится заманчивым использовать их для более сложных сценариев. Возьмите этот пример из Вундеркинды для гиков


# 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, Роба Пайка (я перефразирую здесь)

Люди спрашивали насдля такого рода функций, и мы говорим «нет». Одна из причин заключается в том, что, если вы добавите эти функции, люди будут их использовать, поэтому они там есть. Но они могут быть дороже, чем простой цикл. Они имеют тенденцию генерировать более дорогие решения проблем, которые имеют гораздо более простые решения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...