# 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. Текст

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.

String literals can span multiple lines. One way is using triple-quotes: `"""..."""` or `'''...'''`. End of lines are automatically included in the string, but it’s possible to prevent this by adding a `\` at the end of the line. The following example:

    print("""\
    Usage: thingy [OPTIONS]
         -h                        Display this usage message
         -H hostname               Hostname to connect to
    """)

produces the following output (note that the initial newline is not included):

    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 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]

Просте присвоєння в Python ніколи не копіює дані. Коли ви присвоюєте список змінній, змінна посилається на існуючий список. Будь-які зміни, які ви вносите до списку через одну змінну, будуть видно через всі інші змінні, які на нього посилаються.:

    >>> 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 за допомогою текстового редактора; усі пристойні текстові редактори мають функцію автоматичного відступу. Коли складений оператор вводиться в інтерактивному режимі, після нього має йти порожній рядок, щоб вказати завершення (оскільки аналізатор не може вгадати, коли ви ввели останній рядок). Зауважте, що кожен рядок у базовому блоці має мати однаковий відступ.

- The `print()` function writes the value of the argument(s) it is given. It differs from just writing the expression you want to write (as we did earlier in the calculator examples) in the way it handles multiple arguments, floating point quantities, and strings. Strings are printed without quotes, and a space is inserted between items, so you can format things nicely, like this:

      >>> 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,

Виноски

[1]

Оскільки `**` має вищий пріоритет, ніж `-`, `-3**2` буде інтерпретовано як `-(3**2)` і, таким чином, призведе до `-9`. Щоб уникнути цього та отримати `9`, ви можете використовувати `(-3)**2`.

[2]

На відміну від інших мов, спеціальні символи, такі як `\n`, мають однакове значення з одинарними (`'...'`) і подвійними (`"..."`) лапками. Єдина різниця між ними полягає в тому, що в одинарних лапках вам не потрібно екранувати `"` (але вам потрібно екранувати `\'`) і навпаки.