Строки в python

Практическая работа

  1. Напишите программу (файл user.py), которая запрашивала бы у пользователя: — его имя (например, «What is your name?») — возраст («How old are you?») — место жительства («Where are you live?») После этого выводила бы три строки: «This is » «It is » «(S)he live in » Вместо , , должны быть данные, введенные пользователем. Примечание: можно писать фразы на русском языке, но если вы планируете стать профессиональным программистом, привыкайте к английскому.

  2. Напишите программу (файл arithmetic.py), которая предлагала бы пользователю решить пример 4 * 100 — 54. Потом выводила бы на экран правильный ответ и ответ пользователя. Подумайте, нужно ли здесь преобразовывать строку в число.


  3. Запросите у пользователя четыре числа. Отдельно сложите первые два и отдельно вторые два. Разделите первую сумму на вторую. Выведите результат на экран так, чтобы ответ содержал две цифры после запятой.

Странности, которые не странности

На первый взгляд мне показалось странным, что тип range не включает правую границу, но потом добрый человек мне неучу где мне нужно поучиться и оказалось, что всё вполне логично.

Отдельная большая тема это округления (хотя это проблема общая практически для всех языков программирования), помимо того, что округление используется какое угодно кроме того, что все изучали в школьном курсе математики, так на это ещё накладываются проблемы преставления чисел с плавющей точкой, отсылаю к подробной статье. Грубо говоря вместо привычного, по школьному курсу математики, округления по алгоритма используется алгоритм , которые уменьшает вероятность искажений при статистическом анализе и поэтому рекомендуется стандартом IEEE 754.

Также я не мог понять почему , а потом, другой добрый человек, , что это неизбежно следует из самого математического определения, по которому, остаток не может быть отрицательным, что и приводит к такому необычному поведению для отрицательных чисел. ACHTUNG! Теперь это опять странность и я ничего не понимаю, см. сей .

Спецификация изменяется во время реализации

  • Для обеспечения согласованности с другими подобными исключениями, а также чтобы не вводить новое название, которое не обязательно будет удобно для конечных пользователей, первоначально предложенный подкласс TargetScopeError для SyntaxError был убран и понижен до обычного SyntaxError.
  • Из-за ограничений в анализе таблицы символов CPython, эталонная реализация выражения присваивания вызывает SyntaxError для всех случаев использования внутри итераторов. Раньше это исключение возникало только если имя создаваемой переменной совпадало с тем, которое уже используется в итерационном выражении. Это может быть пересмотрено при наличии достаточно убедительных примеров, но дополнительная сложность кажется нецелесообразной для чисто «гипотетических» вариантов использования.

Кортежи в Python

Кортежи (tuples)- ещё один тип данных в Python, схожий со списками и содержит в себе элементы, разделённые запятыми. В отличии от списков — элементы в кортеже ограничиваются круглыми скобками .

Основное различие между (lists) и (tuples): списки ограничиваются квадратными скобками ( ) и их элементы и размер могут изменены, тогда как кортежи ограничиваются круглыми скобками ( ) и не могут быть изменены. Кортежи можно представлять себе как списки, но в read-only «режиме». Например:

>>> tuple = ( 'abcd', 786 , 2.23, 'john', 70.2  )
>>> tinytuple = (123, 'john')
>>> print tuple
('abcd', 786, 2.23, 'john', 70.2) # вывести все элементы кортежа;
>>> print tuple
abcd # вывести первый элемент кортежа;
>>> print tuple
(786, 2.23) # вывести второй и третий элементы;
>>> print tuple
(2.23, 'john', 70.2) # выввести все элементы, начиная с третьего;
>>> print tinytuple * 2
(123, 'john', 123, 'john') # вывести все элементы два раза;
>>> print tuple * 2
(786, 2.23, 786, 2.23) # вывести второй и третий элементы два раза;
>>> print tuple + tinytuple
('abcd', 786, 2.23, 'john', 70.2, 123, 'john') # вывести объединённые элементы кортежей;

Следующий пример не сработает с кортежем, так как мы попытаемся изменить данные в нём, но — сработает со списком:

t>>> tuple = ( 'abcd', 786 , 2.23, 'john', 70.2  )
>>> list = 
>>> tuple = 1000
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment # сообщение об ошибке - кортеж не поддерживает переназначение элемента;
>>> list = 1000
>>> print list
1000 # но это работает с элементом списка.

Присваивание значений переменным

Переменные в Python не нуждаются в обязательном их объявлении для выделения им памяти. Объявление (присваивание, назначение и т.п.) переменной и выделение памяти для хранения её значения выполняется в тот момент, когда вы задаёте какие-то данные (присваиваете значение) этой переменной. Для этого используется символ равенства ().

Операнд с левой стороны знака равенства, который в данном случае является оператором, указывает имя переменной, а операнд с правой стороны — значение, которое будет хранится в этой переменной. Например:

>>> counter = 100          # целое число (integer);
>>> miles   = 1000.0       # числ ос плавающей точкой (floating);
>>> name    = "John"       # строка (string);
>>> print counter
100
>>> print miles
1000.0
>>> print name
John

Тут и «» — это значения, присвоенные переменным , и соответственно.

Strip и zfill

Еще одна важная функция — это возможность удалять из строки лишние начальные и конечные символы. Для этого у нас есть семейство функций :

  • Удалить пробелы по умолчанию.
  • Удалить пробелы слева или справа.
  • Удалить произвольные символы.
test_string_with_spaces = '     The quick brown fox jumps over the lazy dog    '
test_string_with_spaces.strip()

Out: 'The quick brown fox jumps over the lazy dog'

test_string_with_spaces.lstrip()

Out: 'The quick brown fox jumps over the lazy dog    '

test_string_with_spaces.rstrip()

Out: '     The quick brown fox jumps over the lazy dog'

test_string.rstrip('g')

Out: 'The quick brown fox jumps over the lazy do'

Кроме того, есть полезная функция для дополнения чисел ведущими нулями:

'29'.zfill(10)

Out: '0000000029'

'xA1'.zfill(4)

Out: '0xA1'

#3 Интерполяция строк / f-Строки (Python 3.6+)

Python 3.6 Добавил новый подход форматирования строк под названием форматированные строчные литералы, или “f-строки”. Этот новый способ форматирования строк позволяет вам использовать встроенные выражения Python внутрь строковых констант. Вот простой, наглядный пример:

Python

name = ‘Bob’ print(f’Hello, {name}!’)

# Вывод: ‘Hello, Bob!’

1 2 3 4

name=’Bob’

print(f’Hello, {name}!’)

  # Вывод: ‘Hello, Bob!’

Как вы видите, это добавляет префикс к константе строки с буквой “f” — следовательно, названием становится “f-strings”. Этот новый синтаксис форматирования — очень мощный. Так как вы можете вставлять произвольные выражения Python, вы можете даже проводить встроенную арифметику. Посмотрим на пример:

Python

a = 5 b = 10 print(f’Five plus ten is {a + b} and not {2 * (a + b)}.’)

# Вывод: ‘Five plus ten is 15 and not 30.’

1 2 3 4 5


a=5

b=10

print(f’Five plus ten is {a + b} and not {2 * (a + b)}.’)

  # Вывод: ‘Five plus ten is 15 and not 30.’

Форматированные строчные литералы — это особенность парсера Python, которая конвертирует в серию строчных констант и выражений. Затем, они соединяются и составляют итоговую строку.

Представьте, что у вас есть следующая функция greet(), которая содержит :

Python

def greet(name, question): return f»Hello, {name}! How’s it {question}?»

print(greet(‘Bob’, ‘going’))

# Вывод: «Hello, Bob! How’s it going?»

1 2 3 4 5 6 7

defgreet(name,question)

returnf»Hello, {name}! How’s it {question}?»

print(greet(‘Bob’,’going’))

  # Вывод: «Hello, Bob! How’s it going?»

Когда вы разбираете функцию, и смотрите, что происходит за кулисами, вы увидите, что f-строка в функции трансформируется в нечто, похожее на следующее:

Python

def greet(name, question): return «Hello, » + name + «! How’s it » + question + «?»

1 2


defgreet(name,question)

return»Hello, «+name+»! How’s it «+question+»?»

Python

>>> import dis >>> dis.dis(greet) 2 0 LOAD_CONST 1 (‘Hello, ‘) 2 LOAD_FAST 0 (name) 4 FORMAT_VALUE 0 6 LOAD_CONST 2 («! How’s it «) 8 LOAD_FAST 1 (question) 10 FORMAT_VALUE 0 12 LOAD_CONST 3 (‘?’) 14 BUILD_STRING 5 16 RETURN_VALUE

1 2 3 4 5 6 7 8 9 10 11

>>>importdis

>>>dis.dis(greet)

2LOAD_CONST1(‘Hello, ‘)

2LOAD_FAST(name)

4FORMAT_VALUE

6LOAD_CONST2(«! How’s it «)

8LOAD_FAST1(question)

10FORMAT_VALUE

12LOAD_CONST3(‘?’)

14BUILD_STRING5

16RETURN_VALUE

Строчные литералы также поддерживают существующий синтаксис формата строк метода str.format(). Это позволяет вам решать те же проблемы с форматированием, которые мы рассматривали в двух предыдущих разделах:

Python

print(f»Hey {name}, there’s a {errno:#x} error!»)

# Вывод: «Hey Bob, there’s a 0xbadc0ffee error!»

1 2 3

print(f»Hey {name}, there’s a {errno:#x} error!»)

  # Вывод: «Hey Bob, there’s a 0xbadc0ffee error!»

Новые форматированные строчные литералы аналогичны шаблонным литералам (Template Literals) в JavaScript, которые были добавлены в ES2015. Я думаю это достаточно хорошее нововведение в Python, и я бы с радостью пользовался ими на каждодневной основе (в Python 3). Вы можете узнать больше о форматированных строчных литералах в интернете.


С этим читают