Нулевые значения — ложь, ненулевые значения — истина.
Вы можете использовать числа в логическом контексте, например, в операторе if. Нулевые значения — ложь, ненулевые значения — истина.
>>> def is_it_true(anything): ①
... if anything:
... print("да, это истина")
... else:
... print("нет, это ложь")
...
>>> is_it_true(1) ②
да, это истина
>>> is_it_true(-1)
да, это истина
>>> is_it_true(0)
нет, это ложь
>>> is_it_true(0.1) ③
да, это истина
>>> is_it_true(0.0)
нет, это ложь
>>> import fractions
>>> is_it_true(fractions.Fraction(1, 2)) ④
да, это истина
>>> is_it_true(fractions.Fraction(0, 1))
нет, это ложь
① | Вы знали, что можно определять свои собственные функции в интерактивной оболочке Python? Просто нажимайте клавишу ↵ Enter в конце каждой строки, а чтобы закончить ввод нажмите клавишу ↵ Enter на пустой строке. |
② | В логическом контексте, ненулевые целые числа — истина; значение 0 — ложь. |
③ | Ненулевые числа с плавающей точкой — истина; значение 0.0 — ложь. Будьте осторожны с этим! Если имеется малейшая ошибка округления (как вы могли видеть в предыдущем разделе,это вполне возможно), то Python будет проверять значение 0.0000000000001 вместо 0.0 и соответственно вернёт логическое значение True. |
④ | Дроби тоже могут быть использованы в логическом контексте. Fraction(0, n) — ложь для всех значений n. Все остальные дроби — истина. |
Списки
Списки — рабочая лошадка Python. Когда я говорю «список», вы, наверное, думаете: «это массив, чей размер я должен задать заранее и который может хранить элементы только одного типа» и т. п., но это не так. Списки намного интереснее.
Списки в Python похожи на массивы в Perl 5. Там переменные, содержащие массивы, всегда начинаются с символа @; в Python переменные могут называться как угодно, язык следит за типом самостоятельно. |
В Python список — это нечто большее, чем массив в Java (хотя список можно использовать и как массив, если это действительно то, чего вы хотите от жизни). Точнее будет аналогия с Java-классом ArrayList, который может хранить произвольные объекты и динамически расширяться по мере добавления новых элементов. |
Создание списка
Создать список легко: впишите все значения, через запятую, в квадратных скобках.
>>> a_list = ['a', 'b', 'mpilgrim', 'z', 'example'] ①
>>> a_list
['a', 'b', 'mpilgrim', 'z', 'example']
>>> a_list[0] ②
'a'
>>> a_list[4] ③
'example'
>>> a_list[-1] ④
'example'
>>> a_list[-3] ⑤
'mpilgrim'
① | Сначала вы определили список из пяти элементов. Обратите внимание, они сохраняют свой первоначальный порядок. Это не случайно. Список — это упорядоченный набор элементов. |
② | Список можно использовать как массив с нумерацией от нуля. Первый элемент не пустого списка будет всегда a_list[0]. |
③ | Последним элементом этого пятиэлементного списка будет a_list[4], потому что нумерация элементов в списке всегда начинается с нуля. |
④ | Используя отрицательный индекс, можно обратиться к элементам по их номеру от конца списка. Последний элемент не пустого списка будет всегда a_list[-1]. |
⑤ | Если вас сбивают с толку отрицательные индексы, то просто думайте о них следующим образом: a_list[-n] == a_list[len(a_list) - n]. В нашем примере a_list[-3] == a_list[5 - 3] == a_list[2]. |
Разрезание списка
a_list[0] — первый элемент списка a_list.
После того, как список создан, можно получить любую его часть в виде списка. Это называеться «slicing» — срез списка.
>>> a_list
['a', 'b', 'mpilgrim', 'z', 'example']
>>> a_list[1:3] ①
['b', 'mpilgrim']
>>> a_list[1:-1] ②
['b', 'mpilgrim', 'z']
>>> a_list[0:3] ③
['a', 'b', 'mpilgrim']
>>> a_list[:3] ④
['a', 'b', 'mpilgrim']
>>> a_list[3:] ⑤
['z', 'example']
>>> a_list[:] ⑥
['a', 'b', 'mpilgrim', 'z', 'example']
① | Вы можете получить часть списка, называемую «срезом», указав два индекса. В результате получается новый список, включающий в себя элементы исходного в том же порядке, начиная с первого индекса среза (в данном случае a_list[1]), до последнего, но не включая его (в данном случае a_list[3]). |
② | Срез работает, даже если один или оба индекса отрицательны. Если вам это поможет, можете думать об этом так: список читается слева направо, первый индекс среза определяет первый нужный вам элемент, а второй индекс определяет первый элемент, который вам не нужен. Возвращаемое значение всегда находится между ними. |
③ | Нумерация списков начинается с нуля, поэтому a_list[0:3] возвращает первые три элемента списка, начиная с a_list[0], заканчивая на (но не включая) a_list[3]. |
④ | Если левый индекс среза — 0, вы можете опустить его, 0 будет подразумеваться. Так, a_list[:3] — это то же самое,что и a_list[0:3], потому что начальный 0 подразумевается. |
⑤ | Аналогично, если правый индекс среза является длиной списка, вы можете его опустить. Так, a_list[3:] — это то же самое, что и a_list[3:5], потому что этот список содержит пять элементов. Здесь прослеживается явная симметрия. В этом пятиэлементном списке a_list[:3] возвращает первые 3 элемента, а a_list[3:] возвращает последние два элемента. На самом деле, a_list[:n] всегда будет возвращать первые n элементов, а a_list[n:] будет возвращать все остальные, независимо от длины списка. |
⑥ | Если оба индекса списка опущены, включаются все элементы списка. Но это не то же самое, что первоначальная переменная a_list. Это новый список, включающий все элементы исходного. Запись a_list[:] представляет собой простейший способ получения полной копии списка. |