it-swarm.asia

كيف يمكنني أن أسلسل str و int الأجسام؟

إذا حاولت القيام بما يلي:

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

أحصل على الخطأ التالي في Python 3.x:

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

... وخطأ مماثل في Python 2.x:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects

كيف يمكنني التغلب على هذه المشكلة؟

56
Zero Piraeus

المشكلة هنا هي أن المشغل + له (على الأقل) معنيان مختلفان في Python: بالنسبة للأنواع الرقمية ، فهذا يعني "إضافة الأرقام معًا":

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

... وبالنسبة لأنواع التسلسل ، فهذا يعني "تسلسل تسلسل":

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

كقاعدة عامة ، لا يقوم Python بتحويل الكائنات بشكل ضمني من نوع إلى آخر1 لجعل العمليات "منطقية" ، لأن ذلك سيكون مربكًا: على سبيل المثال ، قد تعتقد أن '3' + 5 يجب أن يعني '35' ، لكن شخصًا آخر قد يعتقد أنه يجب أن يعني 8 أو حتى '8'.

وبالمثل ، لن تسمح لك بايثون بتسلسل نوعين مختلفين من التسلسل:

>>> [7, 8, 9] + 'ghi'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "str") to list

لهذا السبب ، يلزمك إجراء التحويل بشكل صريح ، سواء كان ما تريده هو تسلسل أو إضافة:

>>> 'Total: ' + str(123)
'Total: 123'
>>> int('456') + 789
1245

ومع ذلك ، هناك طريقة أفضل . اعتمادًا على إصدار Python الذي تستخدمه ، هناك ثلاثة أنواع مختلفة من تنسيق السلاسل المتاحة2، والتي لا تسمح لك فقط بتجنب عدة عمليات +:

>>> 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.'

... ولكن تسمح لك أيضًا بالتحكم في كيفية عرض القيم:

>>> 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).'

سواء أكنت تستخدم ٪ interpolation ، str.format() / أو f - سلاسل متروك لك:٪ interpolation كان حولك الأطول (ومألوف لدى الأشخاص الذين لديهم خلفية في C) ، str.format() غالبًا ما يكون أكثر قوة ، ولا تزال السلاسل f أكثر قوة (ولكنها متوفرة فقط في Python 3.6 والإصدارات الأحدث).

هناك بديل آخر يتمثل في استخدام حقيقة أنه إذا أعطيت print وسيطات موضع متعددة ، فسوف ينضم إلى تمثيلات السلاسل الخاصة بهم معًا باستخدام وسيطة الكلمة الرئيسية sep (التي يتم افتراضها بـ ' '):

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

... لكن هذا عادةً ليس مرنًا مثل استخدام قدرات تنسيق السلسلة المضمنة في Python.


1 على الرغم من أنه يستثني أنواعًا رقمية ، إلا أن معظم الأشخاص يتفقون على الشيء "الصحيح" الذي يجب القيام به:

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

2 في الواقع أربعة ... ولكن سلاسل القالب نادرا ما تستخدم وحرج بعض الشيء.

83
Zero Piraeus

TL ؛ DR

  1. إما: print("You have " + str(things) + " things.") (طريقة المدرسة القديمة)

  2. أو: print("You have {} things.".format(things)) (طريقة Pythonic الجديدة والمستحسنة)


تفسير لفظي أكثر قليلاً:
على الرغم من عدم وجود أي شيء غير مغطى من إجابةZero Piraeus الممتازة أعلاه ، سأحاول "تصغيرها قليلاً:
لا يمكنك تسلسل سلسلة ورقم (من أي نوع) في الثعبان لأن هذه الكائنات لها تعريفات مختلفة لعامل الجمع (+) غير المتوافقة مع بعضها البعض (في حالة str + يُستخدم للتسلسل ، في حالة الرقم يتم استخدامه لإضافة رقمين معًا). لذلك من أجل حل هذا "سوء الفهم" بين الأشياء:

  1. تتمثل الطريقة القديمة للمدرسة في تحويل الرقم إلى سلسلة باستخدام طريقة str(anything) ثم توصيل السلسلة بسلسلة أخرى.
  2. الطريقة الأكثر الموصى بها من Pythonic هي استخدام format الطريقة التي تعد متعددة الاستخدامات (ليس عليك أن تأخذ Word الخاص بي عليها ، اقرأ الوثائق و هذه المقالة)

المتعة و القيام قراءةZero Piraeus الإجابة عليه بالتأكيد يستحق وقتك!

6
John Moutafis

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 ]

مرجع

  1. تنسيق سلسلة نمط printf
  2. أنواع مدمجة -> str.format
  3. حرفية السلسلة المنسقة
2
ngub05