Вывод текста в python с помощью print()
Содержание:
- Method 3: Explicitly print to the file
- Basic print command examples
- Функция filter
- Операции над строками
- Вводная информация о строках
- Кодировка
- Method 4: Use the logging module
- Задания для самоподготовки
- Common Stumbling Blocks¶
- Запуск
- Method 2: Redirect sys.stdout to the file
- OrderedDict objects¶
- Форматирование
- #2 Форматирование строк “По новому” (str.format)
- Library Changes¶
- Вывод значений переменных с помощью print()
Method 3: Explicitly print to the file
We can directly specify the file to be printed in the call to , by mentioning the file keyword argument.
For example, the below snippet prints to the file .
print('Hi', file=open('output.txt', 'a')) print('Hello from AskPython', file=open('output.txt', 'a')) print('exit', file=open('output.txt', 'a'))
The file now has the three lines appended to it, and we have successfully printed to !
Using a context manager
However, this method isn’t the best way to resolve this situation, due to the repeated calls to on the same file. This wastes time, and we can do better!
The better way would be to explicitly use a context manager statement, which takes care of automatically closing the file and using the file object directly.
with open("output.txt", "a") as f: print('Hi', file=f) print('Hello from AskPython', file=f) print('exit', file=f)
This gives the same result as before, appending the three lines to , but is now much faster, since we don’t open the same file again and again.
Basic print command examples
print something
Where something is an item or expression of any data type. We can print some data types directly, but most of that can be printed out by the print statement in a straightforward way.
Following are the few examples of print command you can use in your program to write anything on the console or terminal window.
Example1: Printing strings in python
>>> print "Jhon" Jhon
>>> print "Jhon Kennedy" Jhon Kennedy
>>> print "Hi, I am Python." Hi, I am Python.
Above examples shows simple print string or a sentence which enclosed within double-quote marks.
Example2: Printing numbers in python. When playing with a number, we can do simple mathematical with a print statement as shown below.
>>> print 25 25
>>> print 2*2 4
>>> print 2 + 5 + 9 16
Above examples shows print integer including simple math functions.
Функция filter
Следующая
аналогичная функция – это filter. Само ее название говорит, что
она возвращает элементы, для которых, переданная ей функция возвращает True:
filter(func, *iterables)
Предположим, у
нас есть список
a=1,2,3,4,5,6,7,8,9,10
из которого
нужно выбрать все нечетные значения. Для этого определим функцию:
def odd(x): return x%2
И далее, вызов
функции filter:
b = filter(odd, a) print(b)
На выходе
получаем итератор, который можно перебрать так:
print( next(b) ) print( next(b) ) print( next(b) ) print( next(b) )
Или, с помощью
цикла:
for x in b: print(x, end=" ")
Или же
преобразовать итератор в список:
b = list(filter(odd, a)) print(b)
Конечно, в
качестве функции здесь можно указывать лямбда-функцию и в нашем случае ее можно
записать так:
b = list(filter(lambda x: x%2, a))
И это бывает гораздо
удобнее, чем объявлять новую функцию.
Функцию filter можно применять
с любыми типами данных, например, строками. Пусть у нас имеется вот такой
кортеж:
lst = ("Москва", "Рязань1", "Смоленск", "Тверь2", "Томск") b = filter(str.isalpha, lst) for x in b: print(x, end=" ")
и мы вызываем
метод строк isalpha, который
возвращает True, если в строке
только буквенные символы. В результате в консоли увидим:
Москва Смоленск
Тверь Томск
Операции над строками
Прежде чем перейти к функциям для работы со строками, следует рассмотреть основные операции с ними, которые позволяют быстро преобразовывать любые последовательности символов. При помощи знака плюс можно производить конкатенацию строк, соединяя их вместе. В следующем примере продемонстрировано объединение this is new и text.
Пользуясь символом умножения, программист получает возможность дублировать строку любое количество раз. В данном коде слово text записывается в новую строку трижды.
Как и в случае с числами, со строками можно использовать операторы сравнения, например двойное равно. Очевидно, что литералы some text и some new text разные, поэтому вызов метода print выводит на экран булево значение False для строк string и newString.
Операции над строками позволяют получать из них подстроки, делая срезы, как с обычными элементами последовательностей. В следующем примере, необходимо лишь указать нужный интервал индексов в квадратных скобках, помня, что нумерация осуществляется с нуля.
Вводная информация о строках
Как и во многих других языках программирования, в Python есть большая коллекция функций, операторов и методов, позволяющих работать со строковым типом.
Литералы строк
Литерал – способ создания объектов, в случае строк Питон предлагает несколько основных вариантов:
Если внутри строки необходимо расположить двойные кавычки, и сама строка была создана с помощью двойных кавычек, можно сделать следующее:
Разницы между строками с одинарными и двойными кавычками нет – это одно и то же
Какие кавычки использовать – решать вам, соглашение PEP 8 не дает рекомендаций по использованию кавычек. Просто выберите один тип кавычек и придерживайтесь его. Однако если в стоке используются те же кавычки, что и в литерале строки, используйте разные типы кавычек – обратная косая черта в строке ухудшает читаемость кода.
Кодировка строк
В третьей версии языка программирования Python все строки представляют собой последовательность Unicode-символов.
В Python 3 кодировка по умолчанию исходного кода – UTF-8. Во второй версии по умолчанию использовалась ASCII. Если необходимо использовать другую кодировку, можно разместить специальное объявление на первой строке файла, к примеру:
Максимальная длина строки в Python
Максимальная длина строки зависит от платформы. Обычно это:
- 2**31 — 1 – для 32-битной платформы;
- 2**63 — 1 – для 64-битной платформы;
Константа , определенная в модуле
Конкатенация строк
Одна из самых распространенных операций со строками – их объединение (конкатенация). Для этого используется знак , в результате к концу первой строки будет дописана вторая:
При необходимости объединения строки с числом его предварительно нужно привести тоже к строке, используя функцию
Сравнение строк
При сравнении нескольких строк рассматриваются отдельные символы и их регистр:
- цифра условно меньше, чем любая буква из алфавита;
- алфавитная буква в верхнем регистре меньше, чем буква в нижнем регистре;
- чем раньше буква в алфавите, тем она меньше;
При этом сравниваются по очереди первые символы, затем – 2-е и так далее.
Далеко не всегда желательной является зависимость от регистра, в таком случае можно привести обе строки к одному и тому же регистру. Для этого используются функции – для приведения к нижнему и – к верхнему:
Как удалить строку в Python
Строки, как и некоторые другие типы данных в языке Python, являются неизменяемыми объектами. При задании нового значения строке просто создается новая, с заданным значением. Для удаления строки можно воспользоваться методом , заменив ее на пустую строку:
Или перезаписать переменную пустой строкой:
Обращение по индексу
Для выбора определенного символа из строки можно воспользоваться обращением по индексу, записав его в квадратных скобках:
Индекс начинается с 0
В Python предусмотрена возможность получить доступ и по отрицательному индексу. В таком случае отсчет будет вестись от конца строки:
Кодировка
Чтобы задать необходимую кодировку для используемых в строках символов в Python достаточно поместить соответствующую инструкцию в начало файла с кодом, как это было сделано в следующем примере, где используется utf-8. С помощью префикса u, который стоит перед литералом, можно помечать его соответствующей кодировкой. В то же время префикс b применяется для литералов строк с элементами величиной в один байт.
Производить кодирование и декодирование отдельных строк с заданной кодировкой позволяют встроенные методы decode и encode. Аргументом для них является название кодировки, как в следующем примере кода, где применяется наименование utf-8.
Method 4: Use the logging module
We can use Python’s logging module to print to the file. This is preferred over Method 2, where explicitly changing the file streams is not be the most optimal solution.
import logging # Create the file # and output every level since 'DEBUG' is used # and remove all headers in the output # using empty format='' logging.basicConfig(filename='output.txt', level=logging.DEBUG, format='') logging.debug('Hi') logging.info('Hello from AskPython') logging.warning('exit')
This will, by default, append the three lines to . We have thus printed to the file using , which is one of the recommended ways of printing to a file.
Задания для самоподготовки
1. Поставить в
соответствие следующим английским символам русские буквы:
h – х, e – е, l – л, o – о, w – в, r – р, d – д
и преобразовать строку «hello world!» в русские символы.
2. Дан текст:
t = «»»Куда ты скачешь
гордый конь,
И
где опустишь ты копыта?
О
мощный властелин судьбы!
Не
так ли ты над самой бездной,
На высоте, уздой железной
Россию
поднял на дыбы?»»»
Необходимо
выделить каждое второе слово из этого стихотворения и представить результат в
виде упорядоченного списка. (Подумайте как реализовать алгоритм с наименьшими
затратами по памяти).
3. Реализовать
алгоритм для нахождения всех делителей натурального числа N. Число N вводится с
клавиатуры. Для начала можно реализовать простым перебором всех N возможных чисел
(делителей). Затем, подумайте, как можно оптимизировать по скорости этот
алгоритм.
Видео по теме
Python 3 #1: установка и запуск интерпретатора языка
Python 3 #2: переменные, оператор присваивания, типы данных
Python 3 #3: функции input и print ввода/вывода
Python 3 #4: арифметические операторы: сложение, вычитание, умножение, деление, степень
Python 3 #5: условный оператор if, составные условия с and, or, not
Python 3 #6: операторы циклов while и for, операторы break и continue
Python 3 #7: строки — сравнения, срезы строк, базовые функции str, len, ord, in
Python 3 #8: методы строк — upper, split, join, find, strip, isalpha, isdigit и другие
Python 3 #9: списки list и функции len, min, max, sum, sorted
Python 3 #10: списки — срезы и методы: append, insert, pop, sort, index, count, reverse, clear
Python 3 #11: списки — инструмент list comprehensions, сортировка методом выбора
Python 3 #12: словарь, методы словарей: len, clear, get, setdefault, pop
Python 3 #13: кортежи (tuple) и операции с ними: len, del, count, index
Python 3 #14: функции (def) — объявление и вызов
Python 3 #15: делаем «Сапер», проектирование программ «сверху-вниз»
Python 3 #16: рекурсивные и лямбда-функции, функции с произвольным числом аргументов
Python 3 #17: алгоритм Евклида, принцип тестирования программ
Python 3 #18: области видимости переменных — global, nonlocal
Python 3 #19: множества (set) и операции над ними: вычитание, пересечение, объединение, сравнение
Python 3 #20: итераторы, выражения-генераторы, функции-генераторы, оператор yield
Python 3 #21: функции map, filter, zip
Python 3 #22: сортировка sort() и sorted(), сортировка по ключам
Python 3 #23: обработка исключений: try, except, finally, else
Python 3 #24: файлы — чтение и запись: open, read, write, seek, readline, dump, load, pickle
Python 3 #25: форматирование строк: метод format и F-строки
Python 3 #26: создание и импорт модулей — import, from, as, dir, reload
Python 3 #27: пакеты (package) — создание, импорт, установка (менеджер pip)
Python 3 #28: декораторы функций и замыкания
Python 3 #29: установка и порядок работы в PyCharm
Python 3 #30: функция enumerate, примеры использования
Common Stumbling Blocks¶
This section lists those few changes that are most likely to trip you
up if you’re used to Python 2.5.
Print Is A Function
The statement has been replaced with a
function, with keyword arguments to replace most of the special syntax
of the old statement (PEP 3105). Examples:
Old print "The answer is", 2*2 New print("The answer is", 2*2) Old print x, # Trailing comma suppresses newline New print(x, end=" ") # Appends a space instead of a newline Old print # Prints a newline New print() # You must call the function! Old print >>sys.stderr, "fatal error" New print("fatal error", file=sys.stderr) Old print (x, y) # prints repr((x, y)) New print((x, y)) # Not the same as print(x, y)!
You can also customize the separator between items, e.g.:
print("There are <", 2**32, "> possibilities!", sep="")
which produces:
There are <4294967296> possibilities!
Note:
-
The function doesn’t support the “softspace” feature of
the old statement. For example, in Python 2.x,
would write ; but in Python 3.0,
writes . -
Initially, you’ll be finding yourself typing the old
a lot in interactive mode. Time to retrain your fingers to type
instead! -
When using the source-to-source conversion tool, all
statements are automatically converted to
function calls, so this is mostly a non-issue for
larger projects.
Views And Iterators Instead Of Lists
Some well-known APIs no longer return lists:
-
methods , and
return “views” instead of lists. For example,
this no longer works: . Use instead (this works in Python 2.5 too and is just
as efficient). -
Also, the , and
methods are no longer supported. -
and return iterators. If you really need
a list and the input sequences are all of equal length, a quick
fix is to wrap in , e.g. ,
but a better fix is
often to use a list comprehension (especially when the original code
uses ), or rewriting the code so it doesn’t need a
list at all. Particularly tricky is invoked for the
side effects of the function; the correct transformation is to use a
regular loop (since creating a list would just be
wasteful).If the input sequences are not of equal length, will
stop at the termination of the shortest of the sequences. For full
compatibility with from Python 2.x, also wrap the sequences in
, e.g. becomes
. -
now behaves like used to behave, except
it works with values of arbitrary size. The latter no longer
exists. -
now returns an iterator.
Ordering Comparisons
Python 3.0 has simplified the rules for ordering comparisons:
-
The ordering comparison operators (, , , )
raise a TypeError exception when the operands don’t have a
meaningful natural ordering. Thus, expressions like , or are no longer valid, and e.g. raises instead of returning
. A corollary is that sorting a heterogeneous list
no longer makes sense – all the elements must be comparable to each
other. Note that this does not apply to the and
operators: objects of different incomparable types always compare
unequal to each other. -
and no longer accept the
cmp argument providing a comparison function. Use the key
argument instead. N.B. the key and reverse arguments are now
“keyword-only”. -
The function should be treated as gone, and the
special method is no longer supported. Use for sorting,
with , and other rich comparisons as needed.
(If you really need the functionality, you could use the
expression as the equivalent for .)
Integers
-
PEP 237: Essentially, renamed to .
That is, there is only one built-in integral type, named
; but it behaves mostly like the old type. -
PEP 238: An expression like returns a float. Use
to get the truncating behavior. (The latter syntax has
existed for years, at least since Python 2.2.) -
The constant was removed, since there is no
longer a limit to the value of integers. However,
can be used as an integer larger than any practical list or string
index. It conforms to the implementation’s “natural” integer size
and is typically the same as in previous releases
on the same platform (assuming the same build options). -
The of a long integer doesn’t include the trailing
anymore, so code that unconditionally strips that character will
chop off the last digit instead. (Use instead.) -
Octal literals are no longer of the form ; use
instead.
Запуск
Поток запускается путем вызова метода модуля передачи объекта Thread.
t1.start()
Он должен вызываться не более одного раза для каждого объекта потока. Он организует вызов метода объекта в отдельном потоке управления.
Этот метод вызовет если будет вызван более одного раза для одного и того же объекта потока.
Поток вызывается в программе, которая сама по себе является процессом. Таким образом, во время выполнения потока основная программа также продолжает свое выполнение.
Следовательно, мы можем приостановить деятельность основной программы (выполняемой основным потоком) до завершения созданного потока.
Method 2: Redirect sys.stdout to the file
Usually, when we use the print function, the output gets displayed to the console.
But, since the standard output stream is also a handler to a file object, we can route the standard output to point to the destination file instead.
The below code is taken from our previous article on stdin, stdout and stderr. This redirects the to the file.
import sys # Save the current stdout so that we can revert sys.stdou after we complete # our redirection stdout_fileno = sys.stdout sample_input = # Redirect sys.stdout to the file sys.stdout = open('output.txt', 'w') for ip in sample_input: # Prints to the redirected stdout (Output.txt) sys.stdout.write(ip + '\n') # Prints to the actual saved stdout handler stdout_fileno.write(ip + '\n') # Close the file sys.stdout.close() # Restore sys.stdout to our old saved file handler sys.stdout = stdout_fileno
Output (Assume that is a newly created file)
vijay@AskPython:~# python output_redirection.py Hi Hello from AskPython exit root@ubuntu:~# cat output.txt Hi Hello from AskPython exit
OrderedDict objects¶
Ordered dictionaries are just like regular dictionaries but have some extra
capabilities relating to ordering operations. They have become less
important now that the built-in class gained the ability
to remember insertion order (this new behavior became guaranteed in
Python 3.7).
Some differences from still remain:
-
The regular was designed to be very good at mapping
operations. Tracking insertion order was secondary. -
The was designed to be good at reordering operations.
Space efficiency, iteration speed, and the performance of update
operations were secondary. -
Algorithmically, can handle frequent reordering
operations better than . This makes it suitable for tracking
recent accesses (for example in an LRU cache). -
The equality operation for checks for matching order.
-
The method of has a different
signature. It accepts an optional argument to specify which item is popped. -
has a method to
efficiently reposition an element to an endpoint. -
Until Python 3.8, lacked a method.
- class (items)
-
Return an instance of a subclass that has methods
specialized for rearranging dictionary order.New in version 3.1.
- (last=True)
-
The method for ordered dictionaries returns and removes a
(key, value) pair. The pairs are returned in
LIFO order if last is true
or FIFO order if false.
- (key, last=True)
-
Move an existing key to either end of an ordered dictionary. The item
is moved to the right end if last is true (the default) or to the
beginning if last is false. Raises if the key does
not exist:>>> d = OrderedDict.fromkeys('abcde') >>> d.move_to_end('b') >>> ''.join(d.keys()) 'acdeb' >>> d.move_to_end('b', last=False) >>> ''.join(d.keys()) 'bacde'
New in version 3.2.
In addition to the usual mapping methods, ordered dictionaries also support
reverse iteration using .
Equality tests between objects are order-sensitive
and are implemented as .
Equality tests between objects and other
objects are order-insensitive like regular
dictionaries. This allows objects to be substituted
anywhere a regular dictionary is used.
Changed in version 3.5: The items, keys, and values
of now support reverse iteration using .
Changed in version 3.6: With the acceptance of PEP 468, order is retained for keyword arguments
passed to the constructor and its
method.
Changed in version 3.9: Added merge () and update () operators, specified in PEP 584.
Форматирование
Выполнить форматирование отдельных частей строки, задав в качестве ее компонентов некие объекты программы позволяет символ %, указанный после литерала. В следующем примере показано, как строковый литерал включает в себя не только текст, но также строку и целое число. Стоит заметить, что каждой переменной в круглых скобках должен соответствовать специальный символ в самом литерале, обладающий префиксом % и подходящим значением.
В приведенном ниже фрагменте кода демонстрируется использование форматирования для вывода строки с выравниванием по правому краю (общая длина символов указана как 10).
Данная таблица содержит в себе все управляющие символы для форматирования строк в Python, каждый из которых обозначает определенный объект: числовой либо же символьный.
Символ | Назначение |
%d, %i, %u | Число в 10-ричной системе исчисления |
%x, %X | Число в 16-ричной системе исчисления с буквами в нижнем и верхнем регистре |
%o | Число в 8-ричной системе исчисления |
%f, %F | Число с плавающей точкой |
%e, %E | Число с плавающей точкой и экспонентой в нижнем и верхнем регистре |
%c | Одиночный символ |
%s, %r | Строка из литерала и обычная |
%% | Символ процента |
Более удобное форматирование выполняется с помощью функции format. Ей необходимо передать в качестве аргументов объекты, которые должны быть включены в строку, а также указать места их расположения с помощью числовых индексов, начиная с нулевого.
В следующем примере показано как можно отцентрировать строку, воспользовавшись методом format и специальными символами. Изначальный текст здесь перемещается в самый центр строки, в то время как пустое пространство заполняется символом *.
Следующая таблица отображает специальные символы для выравнивания строк и вывода чисел с необходимым форматом знаков для положительных и отрицательных объектов.
Символ | Назначение |
‘ ’ | Выравнивание строки по правому краю с символами-заполнителями слева |
‘=’ | Выравнивание с символами-заполнителями после знака числа, но перед его цифрами |
‘^’ | Выравнивание строки по центру с символами-заполнителями с обеих сторон |
‘+’ | Применение знака для любых чисел |
‘-‘ | Применение знака для отрицательных чисел и ничего для положительных |
‘ ‘ | Применение знака для отрицательных чисел и пробела для положительных |
#2 Форматирование строк “По новому” (str.format)
Python 3 предоставил новый способ форматирования, который также был внесен в раннюю версию Python 2.7. Этот “новый стиль” форматирования строк избавляется от специального синтаксиса оператора % и делает синтаксис для форматирования строк более регулярным. Теперь форматирование обрабатывается вызовом .format() в объекте строки.
Вы можете использовать format(), чтобы выполнить простое позиционное форматирование, также, как мы делали это по старинке:
Python
print(‘Hello, {}’.format(name))
# Вывод: ‘Hello, Bob’
1 2 |
print(‘Hello, {}’.format(name)) # Вывод: ‘Hello, Bob’ |
Или, вы можете сослаться на свои подстановки переменных по имени, и использовать их в том порядке, в котором вам хочется. Это достаточно мощный способ, так как он позволяет повторно упорядочить порядок отображения без изменения переданных функции format() аргументов:
Python
print(
‘Hey {name}, there is a 0x{errno:x} error!’.format(
name=name, errno=errno
)
)
# Вывод: ‘Hey Bob, there is a 0xbadc0ffee error!’
1 2 3 4 5 6 7 |
print( ‘Hey {name}, there is a 0x{errno:x} error!’.format( name=name,errno=errno ) ) |
Однако, официальная документация Python 3 не делает явных рекомендаций по использованию старого форматирования:
По этому я лично пытаюсь работать str.format при продвижении нового кода. Начав с Python 3.6, есть еще один способ форматирования ваших строк. Рассмотрим его в следующем разделе!
Library Changes¶
Due to time constraints, this document does not exhaustively cover the
very extensive changes to the standard library. PEP 3108 is the
reference for the major changes to the library. Here’s a capsule
review:
-
Many old modules were removed. Some, like (no
longer used) and (replaced by ), were
already deprecated by PEP 4. Others were removed as a result
of the removal of support for various platforms such as Irix, BeOS
and Mac OS 9 (see PEP 11). Some modules were also selected for
removal in Python 3.0 due to lack of use or because a better
replacement exists. See PEP 3108 for an exhaustive list. -
The package was removed because its presence in the
core standard library has proved over time to be a particular burden
for the core developers due to testing instability and Berkeley DB’s
release schedule. However, the package is alive and well,
externally maintained at https://www.jcea.es/programacion/pybsddb.htm. -
Some modules were renamed because their old name disobeyed
PEP 8, or for various other reasons. Here’s the list:Old Name
New Name
_winreg
winreg
ConfigParser
configparser
copy_reg
copyreg
Queue
queue
SocketServer
socketserver
markupbase
_markupbase
repr
reprlib
test.test_support
test.support
-
A common pattern in Python 2.x is to have one version of a module
implemented in pure Python, with an optional accelerated version
implemented as a C extension; for example, and
. This places the burden of importing the accelerated
version and falling back on the pure Python version on each user of
these modules. In Python 3.0, the accelerated versions are
considered implementation details of the pure Python versions.
Users should always import the standard version, which attempts to
import the accelerated version and falls back to the pure Python
version. The / pair received this
treatment. The module is on the list for 3.1. The
module has been turned into a class in the
module. -
Some related modules have been grouped into packages, and usually
the submodule names have been simplified. The resulting new
packages are:-
(, , ,
, , ). -
(, ).
-
(, ,
, , ,
). -
(all -related modules except
). The target audience of doesn’t
really care about . Also note that as of Python
2.6, the functionality of has been greatly enhanced. -
(, , ,
). -
(, ,
).
-
Some other changes to standard library modules, not covered by
PEP 3108:
Вывод значений переменных с помощью print()
При выводе строки, содержащей присвоенное переменной значение, достаточно указать через запятую нужный идентификатор (имя переменной). Тип переменной указывать не следует, поскольку print преобразует данные любого типа в строки.Приведем пример:
a = 0
b = ‘Python from scratch’
print(a,’– число, а‘,b,’– строка.’)
0 – число, а Python from scratch – строка.
Еще один инструмент для передачи значений переменных на вывод – метод format. Print при этом выступает в качестве шаблона, в котором вместо имен переменных в фигурных скобках указываются индексы позиционных аргументов:
a = 0
b = ‘Python from scratch’
print(‘{0} является числом, а {1} – строкой.’.format(a,b))
0 является числом, а Python from scratch – строкой.
Вместо format может быть использован символ %, который работает по тому же принципу заполнителей (в предыдущем примере роль заполнителей выполняли фигурные скобки). В этом случае номера индексов заменяются типом данных, получаемым функцией:
- заполнитель %d применяют для числовых данных;
- заполнитель %s – для строк.
a = 0
b = ‘Python from scratch’
print(‘%d является числом, а %s – строкой.’%(a,b))
0 является числом, а Python from scratch – строкой.
Если вместо заполнителя для целых чисел %d указать %s, функция print преобразует число в строку, и код сработает правильно. Но при замене %s на %d будет выведено сообщение об ошибке, поскольку обратная конвертация не осуществляется.