Jak połączyć obiekty str i int?

Jeśli spróbuję wykonać następujące czynności:

things = 5
print("You have " + things + " things.")

Dostaję następujący błąd w Pythonie 3.x:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: must be str, not int

... i podobny błąd w Pythonie 2.x:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
Jak mogę obejść ten problem?
Author: Zero Piraeus, 2014-09-05

3 answers

Problem polega na tym, że operator + ma (co najmniej) dwa różne znaczenia w Pythonie: dla typów numerycznych oznacza "Dodaj liczby razem":

>>> 1 + 2
3
>>> 3.4 + 5.6
9.0

... a dla typów sekwencji oznacza "konkatenować sekwencje":

>>> [1, 2, 3] + [4, 5, 6]
[1, 2, 3, 4, 5, 6]
>>> 'abc' + 'def'
'abcdef'

Z reguły Python nie implicite konwertuje obiektów z jednego typu na drugi1 aby operacje "miały sens", ponieważ byłoby to mylące: na przykład można by pomyśleć, że '3' + 5 powinno oznaczać '35', ale ktoś inny może pomyśleć, że powinno to oznaczać 8 lub nawet '8'.

Podobnie Python nie pozwoli Ci połączyć dwóch różnych typów sekwencji:

>>> [7, 8, 9] + 'ghi'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "str") to list
Z tego powodu musisz wykonać konwersję jawnie, niezależnie od tego, czy chcesz konkatenować, czy dodać:]}
>>> 'Total: ' + str(123)
'Total: 123'
>>> int('456') + 789
1245

Jednakże, jest lepszy sposób . W zależności od używanej wersji Pythona, dostępne są trzy różne rodzaje formatowania łańcuchów2, które nie tylko pozwalają na unikaj wielu operacji +:

>>> things = 5

>>> 'You have %d things.' % things  # % interpolation
'You have 5 things.'

>>> 'You have {} things.'.format(things)  # str.format()
'You have 5 things.'

>>> f'You have {things} things.'  # f-string (since Python 3.6)
'You have 5 things.'

... ale także pozwalają kontrolować, jak wartości są wyświetlane:

>>> value = 5
>>> sq_root = value ** 0.5
>>> sq_root
2.23606797749979

>>> 'The square root of %d is %.2f (roughly).' % (value, sq_root)
'The square root of 5 is 2.24 (roughly).'

>>> 'The square root of {v} is {sr:.2f} (roughly).'.format(v=value, sr=sq_root)
'The square root of 5 is 2.24 (roughly).'

>>> f'The square root of {value} is {sq_root:.2f} (roughly).'
'The square root of 5 is 2.24 (roughly).'

Czy używasz % interpolacji, str.format(), lub F-stringi zależy od Ciebie: % interpolacja jest najdłuższa (i jest znana ludziom z tła w C), str.format() jest często potężniejsza i f-stringi są jeszcze potężniejsze (ale dostępne tylko w Pythonie 3.6 i nowszych).

Inną alternatywą jest użycie faktu, że jeśli podasz print wiele argumentów pozycyjnych, połączy ich reprezentacje łańcuchowe razem za pomocą argumentu słowa kluczowego sep (który domyślnie ' '):

>>> things = 5
>>> print('you have', things, 'things.')
you have 5 things.
>>> print('you have', things, 'things.', sep=' ... ')
you have ... 5 ... things.

... ale zwykle nie jest to tak elastyczne, jak korzystanie z wbudowanych w Pythona możliwości formatowania łańcuchów.


1 chociaż czyni wyjątek dla liczb typy, w których większość ludzi zgodziłaby się co do "słuszności": {]}

>>> 1 + 2.3
3.3
>>> 4.5 + (5.6+7j)
(10.1+7j)

2 właściwie cztery ... ale ciągi szablonów {[59] } są rzadko używane i nieco niezręczne.

 68
Author: Zero Piraeus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-27 17:10:38

TL; DR

  1. Albo: print("You have " + str(things) + " things.") (Stary school way)

  2. Lub: print("You have {} things.".format(things)) (nowy pyton i zalecany sposób)


Trochę bardziej słowne Wyjaśnienie:
Chociaż jest coś, co nie jest objęte doskonałą @ Zero Pireus odpowiedź powyżej, postaram się" zminimalizować " to trochę :
W Pythonie nie można łączyć łańcucha znaków i liczby (dowolnego rodzaju), ponieważ obiekty te mają różne definicje operator plus (+), który nie jest ze sobą zgodny (w przypadku str + służy do konkatenacji, w przypadku liczby służy do dodawania dwóch liczb razem). Aby więc rozwiązać owo "nieporozumienie" pomiędzy obiektami:

  1. old school way to cast the number to string with the str(anything) Metoda, a następnie połącz wynik z innym sznurek.
  2. bardziej pythonicznym i zalecanym sposobem jest użycie metody format, która jest bardzo wszechstronna (nie masz aby uwierzyć mi na słowo, przeczytaj dokumentację i ten Artykuł)

Baw się dobrze i rób przeczytaj odpowiedź @Zero Pireus na pewno warto poświęcić swój czas!

 4
Author: John Moutafis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-01 16:42:22

Python 2.x

  1. 'You have %d things.' % things [1]
  2. 'You have {} things.'.format(things) [2]

Python 3.6+

  1. 'You have %d things.' % things [1]
  2. 'You have {} things.'.format(things) [2]
  3. f'You have {things} things.' [3]

Odniesienie

  1. printf-Style String formatowanie
  2. typy wbudowane - > str.format
  3. sformatowane literały łańcuchowe
 -2
Author: ngub05,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-02 20:27:51