3. Неформальний вступ до Python¶
У наступних прикладах вхід і вихід відрізняються наявністю або відсутністю підказок (>>> і …): щоб повторити приклад, ви повинні ввести все після підказки, коли з’явиться підказка; рядки, які не починаються з підказки, виводяться з інтерпретатора. Зауважте, що другорядна підказка в окремому рядку у прикладі означає, що ви повинні ввести порожній рядок; це використовується для завершення багаторядкової команди.
Ви можете перемкнути відображення підказок і вихід, натиснувши >>>
у верхньому правому куті вікна прикладу. Якщо ви приховаєте підказки та вивід для прикладу, ви зможете легко скопіювати та вставити рядки введення у свій інтерпретатор.
Багато прикладів у цьому посібнику, навіть ті, що вводяться в інтерактивному вікні, містять коментарі. Коментарі в Python починаються з символу решетки #
і тягнуться до кінця фізичного рядка. Коментар може з’явитися на початку рядка або після пробілу чи коду, але не в рядковому літералі. Хеш-символ у рядковому літералі є просто хеш-символом. Оскільки коментарі призначені для прояснення коду та не інтерпретуються Python, їх можна опустити під час введення прикладів.
Деякі приклади:
# this is the first comment
spam = 1 # and this is the second comment
# ... and now a third!
text = "# This is not a comment because it's inside quotes."
3.1. Використання Python як калькулятора¶
Давайте спробуємо кілька простих команд Python. Запустіть інтерпретатор і дочекайтеся первинної підказки >>>
. (Це не повинно зайняти багато часу.)
3.1.1. Числа¶
The interpreter acts as a simple calculator: you can type an expression at it
and it will write the value. Expression syntax is straightforward: the
operators +
, -
, *
and /
can be used to perform
arithmetic; parentheses (()
) can be used for grouping.
For example:
>>> 2 + 2
4
>>> 50 - 5*6
20
>>> (50 - 5*6) / 4
5.0
>>> 8 / 5 # division always returns a floating point number
1.6
Цілі числа (наприклад, 2
, 4
, 20
) мають тип int
, ті з дробовою частиною (наприклад 5.0
, 1.6
) мають тип float
. Ми побачимо більше про числові типи пізніше в підручнику.
Division (/
) always returns a float. To do floor division and
get an integer result you can use the //
operator; to calculate
the remainder you can use %
:
>>> 17 / 3 # classic division returns a float
5.666666666666667
>>>
>>> 17 // 3 # floor division discards the fractional part
5
>>> 17 % 3 # the % operator returns the remainder of the division
2
>>> 5 * 3 + 2 # floored quotient * divisor + remainder
17
У Python можна використовувати оператор **
для обчислення степенів [1]:
>>> 5 ** 2 # 5 squared
25
>>> 2 ** 7 # 2 to the power of 7
128
Знак рівності (=
) використовується для призначення значення змінній. Після цього результат не відображається до наступного інтерактивного запиту:
>>> width = 20
>>> height = 5 * 9
>>> width * height
900
Якщо змінна не «визначена» (присвоєно значення), спроба використати її призведе до помилки:
>>> n # try to access an undefined variable
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'n' is not defined
Є повна підтримка для плаваючої коми; оператори з операндами змішаного типу перетворюють цілий операнд на плаваючу крапку:
>>> 4 * 3.75 - 1
14.0
В інтерактивному режимі останній надрукований вираз призначається змінній _
. Це означає, що коли ви використовуєте Python як настільний калькулятор, продовжувати обчислення дещо легше, наприклад:
>>> tax = 12.5 / 100
>>> price = 100.50
>>> price * tax
12.5625
>>> price + _
113.0625
>>> round(_, 2)
113.06
Користувач має розглядати цю змінну як доступну лише для читання. Не призначайте їй явно значення — ви створили б незалежну локальну змінну з такою самою назвою, маскуючи вбудовану змінну своєю чарівною поведінкою.
Окрім int
і float
, Python підтримує інші типи чисел, такі як Decimal
і Fraction
. Python також має вбудовану підтримку комплексних чисел і використовує j
або J
суфікс для позначення уявної частини (наприклад, 3+5j
).
3.1.2. Text¶
Python can manipulate text (represented by type str
, so-called
«strings») as well as numbers. This includes characters «!
», words
«rabbit
», names «Paris
», sentences «Got your back.
», etc.
«Yay! :)
». They can be enclosed in single quotes ('...'
) or double
quotes ("..."
) with the same result [2].
>>> 'spam eggs' # single quotes
'spam eggs'
>>> "Paris rabbit got your back :)! Yay!" # double quotes
'Paris rabbit got your back :)! Yay!'
>>> '1975' # digits and numerals enclosed in quotes are also strings
'1975'
To quote a quote, we need to «escape» it, by preceding it with \
.
Alternatively, we can use the other type of quotation marks:
>>> 'doesn\'t' # use \' to escape the single quote...
"doesn't"
>>> "doesn't" # ...or use double quotes instead
"doesn't"
>>> '"Yes," they said.'
'"Yes," they said.'
>>> "\"Yes,\" they said."
'"Yes," they said.'
>>> '"Isn\'t," they said.'
'"Isn\'t," they said.'
In the Python shell, the string definition and output string can look
different. The print()
function produces a more readable output, by
omitting the enclosing quotes and by printing escaped and special characters:
>>> s = 'First line.\nSecond line.' # \n means newline
>>> s # without print(), special characters are included in the string
'First line.\nSecond line.'
>>> print(s) # with print(), special characters are interpreted, so \n produces new line
First line.
Second line.
Якщо ви не хочете, щоб символи, перед якими стоїть \
, інтерпретувалися як спеціальні символи, ви можете використовувати необроблені рядки, додавши r
перед першою лапкою:
>>> print('C:\some\name') # here \n means newline!
C:\some
ame
>>> print(r'C:\some\name') # note the r before the quote
C:\some\name
There is one subtle aspect to raw strings: a raw string may not end in
an odd number of \
characters; see
the FAQ entry for more information
and workarounds.
Рядкові літерали можуть займати кілька рядків. Одним із способів є використання потрійних лапок: """..."""
або '''...'''
. Кінець рядків автоматично включається в рядок, але можна запобігти цьому, додавши \
в кінці рядка. Наступний приклад:
print("""\
Usage: thingy [OPTIONS]
-h Display this usage message
-H hostname Hostname to connect to
""")
створює наступний вихід (зауважте, що початковий новий рядок не включено):
Usage: thingy [OPTIONS]
-h Display this usage message
-H hostname Hostname to connect to
Рядки можна об’єднати (склеїти) за допомогою оператора +
і повторити за допомогою *
:
>>> # 3 times 'un', followed by 'ium'
>>> 3 * 'un' + 'ium'
'unununium'
Два або більше рядкових літералів (тобто ті, що взяті в лапки) поруч один з одним автоматично об’єднуються.
>>> 'Py' 'thon'
'Python'
Ця функція особливо корисна, коли ви хочете розірвати довгі рядки:
>>> text = ('Put several strings within parentheses '
... 'to have them joined together.')
>>> text
'Put several strings within parentheses to have them joined together.'
Це працює лише з двома літералами, але не зі змінними чи виразами:
>>> prefix = 'Py'
>>> prefix 'thon' # can't concatenate a variable and a string literal
File "<stdin>", line 1
prefix 'thon'
^^^^^^
SyntaxError: invalid syntax
>>> ('un' * 3) 'ium'
File "<stdin>", line 1
('un' * 3) 'ium'
^^^^^
SyntaxError: invalid syntax
Якщо ви хочете об’єднати змінні або змінну та літерал, використовуйте +
:
>>> prefix + 'thon'
'Python'
Рядки можуть бути індексованими (з індексом), при цьому перший символ має індекс 0. Немає окремого типу символу; символ - це просто рядок розміру один:
>>> word = 'Python'
>>> word[0] # character in position 0
'P'
>>> word[5] # character in position 5
'n'
Індекси також можуть бути від’ємними числами, щоб почати відлік справа:
>>> word[-1] # last character
'n'
>>> word[-2] # second-last character
'o'
>>> word[-6]
'P'
Зауважте, що оскільки -0 дорівнює 0, від’ємні індекси починаються з -1.
In addition to indexing, slicing is also supported. While indexing is used to obtain individual characters, slicing allows you to obtain a substring:
>>> word[0:2] # characters from position 0 (included) to 2 (excluded)
'Py'
>>> word[2:5] # characters from position 2 (included) to 5 (excluded)
'tho'
Індекси зрізів мають корисні значення за замовчуванням; пропущений перший індекс за замовчуванням дорівнює нулю, пропущений другий індекс за замовчуванням відповідає розміру рядка, що нарізається.
>>> word[:2] # character from the beginning to position 2 (excluded)
'Py'
>>> word[4:] # characters from position 4 (included) to the end
'on'
>>> word[-2:] # characters from the second-last (included) to the end
'on'
Зверніть увагу, що початок завжди включається, а кінець завжди виключається. Це гарантує, що s[:i] + s[i:]
завжди дорівнює s
:
>>> word[:2] + word[2:]
'Python'
>>> word[:4] + word[4:]
'Python'
Один із способів запам’ятати, як працюють зрізи, — уявити собі індекси як такі, що вказують між символами, при цьому лівий край першого символу має номер 0. Тоді правий край останнього символу рядка з n символів має індекс n, наприклад:
+---+---+---+---+---+---+
| P | y | t | h | o | n |
+---+---+---+---+---+---+
0 1 2 3 4 5 6
-6 -5 -4 -3 -2 -1
Перший рядок чисел задає положення індексів 0…6 у рядку; другий рядок дає відповідні від’ємні індекси. Фрагмент від i до j складається з усіх символів між краями, позначених i та j відповідно.
Для невід’ємних індексів довжина зрізу є різницею індексів, якщо обидва знаходяться в межах. Наприклад, довжина word[1:3]
дорівнює 2.
Спроба використати занадто великий індекс призведе до помилки:
>>> word[42] # the word only has 6 characters
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
Однак індекси зрізів поза діапазоном обробляються витончено, коли використовуються для зрізу:
>>> word[4:42]
'on'
>>> word[42:]
''
Рядки Python не можна змінити — вони immutable. Таким чином, призначення індексованої позиції в рядку призводить до помилки:
>>> word[0] = 'J'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> word[2:] = 'py'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
Якщо вам потрібен інший рядок, вам слід створити новий:
>>> 'J' + word[1:]
'Jython'
>>> word[:2] + 'py'
'Pypy'
Вбудована функція len()
повертає довжину рядка:
>>> s = 'supercalifragilisticexpialidocious'
>>> len(s)
34
Дивись також
- Тип текстової послідовності — str
Рядки є прикладами типів послідовностей і підтримують загальні операції, які підтримують такі типи.
- Рядкові методи
Рядки підтримують велику кількість методів для основних перетворень і пошуку.
- f-strings
Рядкові літерали, які мають вбудовані вирази.
- Синтаксис рядка формату
Інформація про форматування рядка за допомогою
str.format()
.- Форматування рядків у стилі printf
Старі операції форматування, що викликані, коли рядки є лівим операндом оператора
%
, описані більш детально тут.
3.1.3. списки¶
Python знає кілька складених типів даних, які використовуються для групування інших значень. Найбільш універсальним є список, який можна записати як список розділених комами значень (елементів) у квадратних дужках. Списки можуть містити елементи різних типів, але зазвичай усі елементи мають однаковий тип.
>>> squares = [1, 4, 9, 16, 25]
>>> squares
[1, 4, 9, 16, 25]
Як і рядки (та всі інші вбудовані типи sequence), списки можна індексувати та нарізати:
>>> squares[0] # indexing returns the item
1
>>> squares[-1]
25
>>> squares[-3:] # slicing returns a new list
[9, 16, 25]
Списки також підтримують такі операції, як конкатенація:
>>> squares + [36, 49, 64, 81, 100]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
На відміну від рядків, які є immutable, списки мають тип mutable, тобто їх вміст можна змінювати:
>>> cubes = [1, 8, 27, 65, 125] # something's wrong here
>>> 4 ** 3 # the cube of 4 is 64, not 65!
64
>>> cubes[3] = 64 # replace the wrong value
>>> cubes
[1, 8, 27, 64, 125]
You can also add new items at the end of the list, by using
the list.append()
method (we will see more about methods later):
>>> cubes.append(216) # add the cube of 6
>>> cubes.append(7 ** 3) # and the cube of 7
>>> cubes
[1, 8, 27, 64, 125, 216, 343]
Simple assignment in Python never copies data. When you assign a list to a variable, the variable refers to the existing list. Any changes you make to the list through one variable will be seen through all other variables that refer to it.:
>>> rgb = ["Red", "Green", "Blue"]
>>> rgba = rgb
>>> id(rgb) == id(rgba) # they reference the same object
True
>>> rgba.append("Alph")
>>> rgb
["Red", "Green", "Blue", "Alph"]
Усі операції надрізу повертають новий список із запитаними елементами. Це означає, що наступний фрагмент повертає неглибоку копію списку:
>>> correct_rgba = rgba[:]
>>> correct_rgba[-1] = "Alpha"
>>> correct_rgba
["Red", "Green", "Blue", "Alpha"]
>>> rgba
["Red", "Green", "Blue", "Alph"]
Також можливе призначення фрагментам, і це навіть може змінити розмір списку або повністю його очистити:
>>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> letters
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> # replace some values
>>> letters[2:5] = ['C', 'D', 'E']
>>> letters
['a', 'b', 'C', 'D', 'E', 'f', 'g']
>>> # now remove them
>>> letters[2:5] = []
>>> letters
['a', 'b', 'f', 'g']
>>> # clear the list by replacing all the elements with an empty list
>>> letters[:] = []
>>> letters
[]
Вбудована функція len()
також застосовується до списків:
>>> letters = ['a', 'b', 'c', 'd']
>>> len(letters)
4
Можна вкладати списки (створювати списки, що містять інші списки), наприклад:
>>> a = ['a', 'b', 'c']
>>> n = [1, 2, 3]
>>> x = [a, n]
>>> x
[['a', 'b', 'c'], [1, 2, 3]]
>>> x[0]
['a', 'b', 'c']
>>> x[0][1]
'b'
3.2. Перші кроки до програмування¶
Of course, we can use Python for more complicated tasks than adding two and two together. For instance, we can write an initial sub-sequence of the Fibonacci series as follows:
>>> # Fibonacci series:
... # the sum of two elements defines the next
... a, b = 0, 1
>>> while a < 10:
... print(a)
... a, b = b, a+b
...
0
1
1
2
3
5
8
Цей приклад представляє кілька нових функцій.
Перший рядок містить множинне призначення: змінні
a
іb
одночасно отримують нові значення 0 і 1. В останньому рядку це використовується знову, демонструючи, що вирази праворуч усі сторони оцінюються перш ніж виконати будь-яке завдання. Вирази правої частини обчислюються зліва направо.Цикл
while
виконується, доки виконується умова (тут:a < 10
) remains true. In Python, like in C, any non-zero integer value is true; zero is false. The condition may also be a string or list value, in fact any sequence; anything with a non-zero length is true, empty sequences are false. The test used in the example is a simple comparison. The standard comparison operators are written the same as in C:<
(less than),>
(більше),==
(дорівнює),<=
(less than or equal to),> =
(більше або дорівнює to) і!=
(не дорівнює).Тіло циклу має відступ: відступ — це спосіб групування операторів у Python. У інтерактивному запиті ви повинні ввести табуляцію або пробіл для кожного рядка з відступом. На практиці ви підготуєте складніші введення для Python за допомогою текстового редактора; усі пристойні текстові редактори мають функцію автоматичного відступу. Коли складений оператор вводиться в інтерактивному режимі, після нього має йти порожній рядок, щоб вказати завершення (оскільки аналізатор не може вгадати, коли ви ввели останній рядок). Зауважте, що кожен рядок у базовому блоці має мати однаковий відступ.
Функція
print()
записує значення аргументів, які вона надає. Він відрізняється від простого написання виразу, який ви хочете написати (як ми робили раніше в прикладах калькулятора), тим, як він обробляє кілька аргументів, величини з плаваючою комою та рядки. Рядки друкуються без лапок, а між елементами вставляється пробіл, щоб ви могли гарно форматувати речі, наприклад:>>> i = 256*256 >>> print('The value of i is', i) The value of i is 65536
Аргумент ключового слова end можна використовувати, щоб уникнути нового рядка після виводу або завершити вивід іншим рядком:
>>> a, b = 0, 1 >>> while a < 1000: ... print(a, end=',') ... a, b = b, a+b ... 0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,
Виноски