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? 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.
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
-
Albo:
print("You have " + str(things) + " things.")
(Stary school way) -
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:
- old school way to cast the number to string with the
str(anything)
Metoda, a następnie połącz wynik z innym sznurek. - 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!
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
Python 3.6+
-
'You have %d things.' % things
[1] -
'You have {} things.'.format(things)
[2] -
f'You have {things} things.'
[3]
Odniesienie
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