Моя попытка отточить свои навыки Python
Эта серия преследует две цели:
- Разрабатывать многофункциональные приложения для Raspberry Pi и других сред Linux на языке, родном для среды.
- Чтобы иметь возможность использовать популярность Python в мире машинного обучения.
Пока я не закончу с основами, не будет никакого кода, непосредственно относящегося к двум заявленным целям. Но надо с чего-то начинать!
Темой сегодняшнего поста будут… списки!
Я не начинаю с переменных и типов, потому что я их уже знаю. И весь смысл этого в том, чтобы каталогизировать мой процесс обучения. Полное раскрытие; Я тоже знаю списки. НО списки между языками имеют массу нюансов, которые стоит обсудить.
Последняя часть преамбулы: все это будет сделано в последней версии Python 3 (3.6.1 на момент написания). Я знаю, что Python 2.7 используется ВЕЗДЕ… Но Python 3 — это будущее языка, и я не собираюсь начинать далеко за кривой мощности.
Хорошо! Не будем больше медлить.
Во-первых, для ясности, список — это структура данных. В Python это называется списком, но в других языках это эквивалент массива.
Во-вторых, поставляются ли наши списки с классными методами, как в JS или Ruby? Например, будет ли list.length возвращать число или неопределенное значение?
Я хотел бы отметить, что я использую Visual Studio CODE с включенным PYLINT для написания этого кода. PYLINT лает на вас, когда вы пытаетесь создать список в нижнем регистре. Поэтому имена в моем списке будут написаны с большой буквы.
Причина:
При проверке имен PYLINT различает константы, переменные, классы и т. д. Любое имя, которое не находится внутри функции/класса, будет считаться константой, все остальное — переменной.
print(LIST.length)
Результат
AttributeError: ‘list’ object has no attribute ‘length’
Так что видимо нет. Хм. Это ЯВЛЯЕТСЯ объектом, но не имеет атрибута длины. Google говорит использовать len ()?
# Let's learn about lists. """Let's learn a bit about lists""" # # Define the list # FIRST = [1, 2, 3, 4, 5] # # Should print 5 # print(len(FIRST))
Результат:
5
Успех!
Это не означает, что НЕТ методов записи через точку для списков. Давайте проверим некоторые из них.
# Let's do some stuff with dot notation """Let's do some stuff with dot notation""" # # Define the list # LIST1 = [1, 2, 3, 4, 5] # # APPEND # LIST1.append(6) LIST1.append(7) # # At index 5, insert int 6 # LIST1.insert(5, 6) # # I love this remove method. It removes the first element that it # matches. # LIST1.remove(6) # # I also love this method. get the index of an item by it's value # INDEX_OF_3 = LIST1.index(3) print(INDEX_OF_3) print(LIST1) # END
Результат:
2 [1, 2, 3, 4, 5, 6, 7]
Прохладный. Ку-ку круто.
Проверьте ссылку Google в источниках внизу страницы, чтобы увидеть больше методов для списков.
Индексные ссылки
Ссылка на индекс — это средство доступа к определенным элементам в списке.
…и пока мы это делаем, давайте сделаем несколько условных выражений.
# Let's play with index references. """Let's play with index references""" # # Define the list # LIST = [1, 2, 3, 4, 5] # # This should print 1 # if LIST[2] == 3: print(1)
Результат:
1
Вы можете ссылаться на элементы из списка, помещая его порядковый номер в скобки после имени списка.
Выше я напечатал один, чтобы структурировать это как модульный тест. Я расскажу о модульных тестах в одной из пятничных статей о Python, но лучше познакомиться с этой концепцией как можно раньше, потому что разработка через тестирование — отличная практика.
Как насчет копий списков и ссылок?
Давайте составим список, а затем назначим этот список другой переменной. Что случится?
# Let's do some more with indirect references """Let's do some more with indirect references""" # # Define the list(s) # LIST = [1, 2, 3, 4, 5] LISTCOPY = LIST # # Print same if they are the same (should this be a function????!!!) # if LIST[2] == LISTCOPY[2]: print('same') # # Change the third index of the SECOND list. # LIST[2] = 345 # # Show that the index is actually changed. # print(LIST[2]) # # Print 'same' if they are the same. # if LIST[2] == LISTCOPY[2]: print('same')
Результат:
same 345 same
Структура данных, на которую ссылается LISTCOPY, является точно такой же структурой данных в памяти, что и исходная переменная LIST.
Создание уникального списка
Что делать, если я не хочу создавать ссылку на существующий список? Что, если вместо этого я хочу сделать копии того же списка? Когда копия изменяется, остальные остаются неизменными.
# Let's create a copy of a list, and not a reference. """Let's create a copy of a list, and not a reference""" # # Define the list, WITH A FUNCTION # def list_maker(): """list maker creates a list, then returns it""" new_list = [1, 2, 3, 4, 5] return new_list # # Assign the list to two variables. # LIST1 = list_maker() LIST2 = list_maker() # # modify an item within the second list. # LIST2[2] = 343 if LIST1[2] == LIST2[2]: print('same') else: print('not same') print(LIST1) print(LIST2) # END
Результат:
not same [1, 2, 3, 4, 5] [1, 2, 343, 4, 5]
Использование функции для возврата списка не создает ссылку на один список. Если вы измените список, созданный с использованием значения, возвращаемого функцией, это не повлияет на другие списки, созданные с помощью этой функции.
Подведение итогов
Это все на сегодня. Думаю, на следующей неделе о списках будет еще один пост, а затем мы перейдем к функциям. Python не задумывался как функциональный язык, но я думаю, что понимание функций — самая важная часть любого языка программирования. Даже в объектно-ориентированных языках, таких как Python.
Итак, на этом, если вы дочитали до этого места, спасибо! Надеюсь, вам понравилось, и я постараюсь воплотить эту идею писать на Python в определенные дни недели.
P.S.
Публикация Python в пятницу вечером в 23:40 по восточному стандартному времени едва ли считается Python в пятницу, я понимаю это. Может быть, я назову его Python Parlay или что-нибудь столь же банальное. Он также будет короче!
источники