View Categories

7.1. تنسيق الإخراج الأنيق

6 دقيقة

7.1. تنسيق الإخراج الأنيق

هناك عدة طرق لتقديم إخراج البرنامج؛ يمكن طباعة البيانات في نموذج قابل للقراءة الإنسان، أو مكتوبة إلى ملف للاستخدام في المستقبل. سيناقش هذا الفصل بعض الاحتمالات، والبداية مع 7.1. تنسيق الإخراج الأنيق .

لقد واجهنا حتى الآن طريقتين لكتابة القيم: عبارات التعبير ودالة print (). (الطريقة الثالثة هي استخدام طريقة الكتابة () لكائنات الملف ؛ يمكن الرجوع إلى ملف الإخراج القياسي باسم SYS.Stdout. راجع مرجع المكتبة لمزيد من المعلومات حول هذا.)

غالبًا ما تريد المزيد من التحكم في تنسيق الإخراج الخاص بك أكثر من مجرد طباعة القيم المفصولة بالفضاء. هناك عدة طرق لتنسيق الإخراج.

  • لاستخدام حرفي السلسلة المنسقة ، ابدأ سلسلة مع F أو F قبل علامة الاقتباس الفتح أو علامة اقتباس ثلاثية. داخل هذه السلسلة ، يمكنك كتابة تعبير بيثون بين الأحرف {و) يمكن أن تشير إلى المتغيرات أو القيم الحرفية.
>>> year = 2016

>>> event = 'Referendum'

>>> f'Results of the {year} {event}'

'Results of the 2016 Referendum'
  • تتطلب طريقة Str.format () سلاسل المزيد من الجهد اليدوي. لا يزال بإمكانك استخدام {و} لتحديد المكان الذي سيتم فيه استبدال المتغير ويمكن أن يوفر توجيهات تنسيق مفصلة ، ولكن ستحتاج أيضًا إلى توفير المعلومات المراد تنسيقها.
·       >>> yes_votes = 42_572_654

·       >>> no_votes = 43_132_495

·       >>> percentage = yes_votes / (yes_votes + no_votes)

·       >>> '{:-9} YES votes  {:2.2%}'.format(yes_votes, percentage)

·       ' 42572654 YES votes  49.67%'
  • أخيرًا ، يمكنك القيام بكل السلسلة التي تتعامل مع نفسك باستخدام عمليات تقطيع السلسلة والتسلسل لإنشاء أي تخطيط يمكنك تخيله. يحتوي نوع السلسلة على بعض الطرق التي تؤدي عمليات مفيدة لسلاسل الحشو إلى عرض عمود معين.

عندما لا تحتاج إلى إخراج فاخر ولكنك تريد فقط عرضًا سريعًا لبعض المتغيرات لأغراض تصحيح الأخطاء ، يمكنك تحويل أي قيمة إلى سلسلة مع وظائف REPR () أو STR ().

تهدف وظيفة STR () إلى إرجاع تمثيلات القيم التي يمكن قراءتها إلى حد ما ، في حين أن RepR () تهدف إلى توليد تمثيلات يمكن قراءتها بواسطة المترجم (أو سوف يفرض بناء جملة إذا لم يكن هناك بناء جملة مكافئ). بالنسبة للكائنات التي ليس لديها تمثيل معين للاستهلاك البشري ، ستعيد STR () نفس قيمة REPR (). العديد من القيم ، مثل الأرقام أو الهياكل مثل القوائم والقواميس ، لها نفس التمثيل باستخدام أي من الوظائف. السلاسل ، على وجه الخصوص ، لها تمثيلان متميزان.

بعض الأمثلة:

>>> s = 'Hello, wrld.'
>>> str(s)
'Hello, world.'
>>> repr(s)
"'Hello, world.'"
>>> str(1/7)
'0.14285714285714285'
>>> x = 10 * 3.25
>>> y = 200 * 200
>>> s = 'The value of x is ' + repr(x) + ', and y is ' + repr(y) + '...'
>>> print(s)
The value of x is 32.5, and y is 40000...
>>> # The repr() of a string adds string quotes and backslashes:
... hello = 'hello, world\n'
>>> hellos = repr(hello)
>>> print(hellos)
'hello, world\n'
>>> # The argument to repr() may be any Python object:
... repr((x, y, ('spam', 'eggs')))
"(32.5, 40000, ('spam', 'eggs'))"

تحتوي وحدة السلسلة على فئة قالب توفر طريقة أخرى لاستبدال القيم في سلاسل ، وذلك باستخدام العناصر النائبة مثل $ x واستبدالها بالقيم من القاموس ، ولكنها توفر تحكمًا أقل بكثير في التنسيق.

7.1.1. تنسيق سلسلة حرفية #

تتيح لك تنسيق حرفي السلسلة المنسقة (تسمى أيضًا السلاسل F للاختصار) تضمين قيمة تعبيرات Python داخل السلسلة عن طريق بادئة السلسلة مع F أو F و Crinting Expressions as {expression}.

يمكن لمحدد التنسيق الاختياري متابعة التعبير. هذا يسمح بمزيد من التحكم في كيفية تنسيق القيمة. يدور المثال التالي PI إلى ثلاثة أماكن بعد العشرية:

>>> import math

>>> print(f'The value of pi is approximately {math.pi:.3f}.')

The value of pi is approximately 3.142.

إن تمرير عدد صحيح بعد “:” سيؤدي إلى أن يكون هذا الحقل الحد الأدنى من الأحرف. هذا مفيد لصنع الأعمدة.

>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
>>> for name, phone in table.items():
...     print(f'{name:10} ==> {phone:10d}')
...
Sjoerd     ==>       4127
Jack       ==>       4098
Dcab       ==>       7678

يمكن استخدام المعدلات الأخرى لتحويل القيمة قبل تنسيقها. “! A” ينطبق ASCII () ، “! s” ينطبق str () ، و “! r” يطبق repr ():

>>> animals = 'eels'
>>> print(f'My hovercraft is full of {animals}.')
My hovercraft is full of eels.
>>> print(f'My hovercraft is full of {animals!r}.')
My hovercraft is full of 'eels'.

للحصول على مرجع على مواصفات التنسيق هذه ، راجع الدليل المرجعي لمواصفات التنسيق المصغرة.

7.1.2. طريقة تنسيق السلسلة () #

الاستخدام الأساسي لطريقة str.format () يشبه هذا:

>>> print('We are the {} who say "{}!"'.format('knights', 'Ni'))

We are the knights who say "Ni!"

يتم استبدال الأقواس والأحرف داخلها (تسمى حقول التنسيق) بالكائنات التي تم تمريرها في طريقة str.format (). يمكن أن استخدام رقم بين الأقواس للإشارة إلى موضع الكائن الذي تم تمريره في طريقة Str.format ().

>>> print('{0} and {1}'.format('spam', 'eggs'))
spam and eggs
>>> print('{1} and {0}'.format('spam', 'eggs'))
eggs and spam

إذا تم استخدام وسيطات الكلمات الرئيسية في طريقة str.format () ، تتم الإشارة إلى قيمها باستخدام اسم الوسيطة.

>>> print('This {food} is {adjective}.'.format(
...       food='spam', adjective='absolutely horrible'))
This spam is absolutely horrible.

يمكن الجمع بين وسيطات الكلمات والكلمات الرئيسية بشكل تعسفي:

>>> print('The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred',
                                                       other='Georg'))
The story of Bill, Manfred, and Georg.

إذا كان لديك سلسلة تنسيق طويلة حقًا لا تريد تقسيمها ، فسيكون من الرائع أن تمكنت من الرجوع إلى المتغيرات التي يتم تنسيقها بالاسم بدلاً من الموضع. يمكن القيام بذلك ببساطة عن طريق تمرير القولون واستخدام قوسين مربع “[] للوصول إلى المفاتيح.

>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print('Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; '
...       'Dcab: {0[Dcab]:d}'.format(table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678

يمكن أيضًا القيام بذلك عن طريق تمرير الجدول كوسائط للكلمة الرئيسية مع تدوين “**”.

>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print('Jack: {Jack:d}; Sjoerd: {Sjoerd:d}; Dcab: {Dcab:d}'.format(**table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678

هذا مفيد بشكل خاص في تركيبة مع فانيس الوظيفة المدمجة () ، والذي يعيد القاموس الذي يحتوي على جميع المتغيرات المحلية.

على سبيل المثال ، تنتج الأسطر التالية مجموعة من الأعمدة المحاذاة بشكل ترنيمة تعطي الأعداد الصحيحة ومربعاتها ومكعباتها:

>>> for x in range(1, 11):
...     print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x))
...
 1   1    1
 2   4    8
 3   9   27
 4  16   64
 5  25  125
 6  36  216
 7  49  343
 8  64  512
 9  81  729
10 100 1000

للحصول على نظرة عامة كاملة على تنسيق السلسلة مع STR.Format () ، راجع بناء جملة سلسلة التنسيق.

7.1.3. تنسيق السلسلة اليدوية #

>>> for x in range(1, 11):
...     print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ')
...     # Note use of 'end' on previous line
...     print(repr(x*x*x).rjust(4))
...
 1   1    1
 2   4    8
 3   9   27
 4  16   64
 5  25  125
 6  36  216
 7  49  343
 8  64  512
 9  81  729
10 100 1000

(لاحظ أنه تمت إضافة المسافة الواحدة بين كل عمود بالطريقة التي تعمل بها Print (): إنها تضيف دائمًا مسافات بين حججها.)

تعمل طريقة str.rjust () على كائنات السلسلة التي تعبر عن سلسلة في حقل بعرض معين عن طريق حشوها بمسافات على اليسار. هناك طرق مماثلة str.ljust () و str.center (). هذه الأساليب لا تكتب أي شيء ، فهي تُرجع فقط سلسلة جديدة. إذا كانت سلسلة الإدخال طويلة جدًا ، فإنها لا تقطعها ، ولكنها تعيدها دون تغيير؛ سيؤدي ذلك إلى تعبئة تخطيط العمود الخاص بك ولكن هذا عادة ما يكون أفضل من البديل ، والذي سيكون يكذب بشأن قيمة ما. (إذا كنت تريد حقًا اقتطاع ، يمكنك دائمًا إضافة عملية شريحة ، كما هو الحال في X.Ljust (n) [: n].)

هناك طريقة أخرى، str.zfill () ، والتي تقوم بوسادة سلسلة رقمية على اليسار مع الأصفار. إنه يفهم عن علامات الزائد والنقص:

>>> '12'.zfill(5)
'00012'
>>> '-3.14'.zfill(7)
'-003.14'
>>> '3.14159265359'.zfill(5)
'3.14159265359'

7.1.4. تنسيق السلسلة القديم #

يمكن أيضًا استخدام مشغل ٪ (Modulo) لتنسيق السلسلة. بالنظر إلى قيم ٪ “سلسلة” ، يتم استبدال مثيلات ٪ في السلسلة بعناصر صفر أو أكثر من القيم. تُعرف هذه العملية عادةً باسم الاستيفاء. على سبيل المثال:

>>> import math
>>> print('The value of pi is approximately %5.3f.' % math.pi)
The value of pi is approximately 3.142.

يمكن العثور على مزيد من المعلومات في قسم تنسيق السلسلة على غرار PrintF.

error: Content is protected !!
Scroll to Top