Моя попытка отточить свои навыки Python

Эта серия преследует две цели:

  1. Разрабатывать многофункциональные приложения для Raspberry Pi и других сред Linux на языке, родном для среды.
  2. Чтобы иметь возможность использовать популярность 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 или что-нибудь столь же банальное. Он также будет короче!

источники