Krótki kod nie jest lepszy kod. Krótki kod to nie szybszy kod. Krótki kod nie jest możliwym do utrzymania kodem. Teraz powiedziawszy, że to jest dobre, aby twoje poszczególne elementy były zwięzłe i proste.
Oto co zrobię:
def split_odd_even(number_list):
return {
'odds': filter(lambda n: (n % 2) != 0, number_list),
'evens': filter(lambda n: (n % 2) == 0, number_list)
}
def string_to_ints(string):
return map(int, numbers.strip().split())
numbers = '1 2 3 4 5 6 7 8 9 10'
nums = split_odd_even(string_to_ints(numbers))
print nums
To daje mi:
{'odds': [1, 3, 5, 7, 9], 'evens': [2, 4, 6, 8, 10]}
Chociaż ten kod faktycznie dodaje kilka linii długości, stało się znacznie bardziej jasne, jaki program jest robiąc, jak to aplikowaliśmy, każdy komponent kodu wykonał tylko jedną rzecz.
Nawet dodaliśmy dwie funkcje, najbardziej widoczną część kodu upadł z tego:
numbers = '1 2 3 4 5 6 7 8'
nums = {'evens': [], 'odds': []}
for number in numbers.split(' '):
if int(number) % 2:
nums['odds'].append(number)
else:
nums['evens'].append(number)
do tego:
numbers = '1 2 3 4 5 6 7 8 9 10'
nums = split_odd_even(string_to_ints(numbers))
I właśnie czytając te dwie linie , wiemy, że numbers
jest konwertowany z ciągu znaków na listę int
s, a następnie dzielimy te liczby na nieparzyste i parzyste, i przypiszemy wynik do nums
.
Aby wyjaśnić aa kilka rzeczy, które mogą nie być znane wszystkim:
map()
wywołuje funkcję dla każdego elementu w list
(lub tuple
lub inny iterable) i zwraca nową listę wynik wywołania funkcji dla każdego elementu. W tym przypadku używamy go do wywoływania int()
dla każdej pozycji na liście.
filter()
wywołuje funkcję dla każdego elementu w list
(lub tuple
lub inny iterable), która zwraca True
lub False
dla każdej pozycji (dobrze, truthy or falsey) i zwraca listę elementów, które oceniona True
gdy funkcja jest nazywany.
Wyrażenia Lambda (lambda
) są jak "mini-funkcje", które biorą argumenty i mogą być tworzone na miejscu.
osiągnąć to, co? –
Twój kod jest łatwy do zrozumienia i zawiera zaledwie kilka linii. Używa podstawowych bloków kodujących Pythona. Właściwie wolę to od niektórych bardziej ezoterycznych odpowiedzi. –