وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

قالب بندی رشته ها با f-strings پایتون 3

0 63
زمان لازم برای مطالعه: 7 دقیقه


معرفی

پایتون 3.6 روش جدیدی را برای قالب بندی رشته ها معرفی کرد: f-Strings. این روش سریعتر از سایر روشهای قالب بندی رشته در پایتون است و به ما امکان می دهد عبارات پایتون را در یک رشته ارزیابی کنیم.

در این پست، روش‌های مختلفی را که می‌توانیم رشته‌ها را در پایتون قالب‌بندی کنیم، بررسی می‌کنیم. سپس نگاهی عمیق تر به f-Strings خواهیم داشت و به روش استفاده از آن در هنگام نمایش داده های مختلف نگاه خواهیم کرد.

قالب بندی رشته های سنتی در پایتون

قبل از ورود به f-Strings، اجازه دهید نگاهی به گزینه‌های قالب‌بندی رشته‌ای «سنتی» که در پایتون وجود دارد بیاندازیم. اگر فقط می‌خواهید در مورد f-Strings بیاموزید، بخش را بررسی کنید قالب بندی رشته ها با f-strings در این مقاله.

الحاق رشته

الحاق رشته به این معنی است که ما در حال ترکیب دو رشته برای ایجاد یک رشته جدید هستیم. در پایتون، ما معمولاً رشته‌ها را به هم متصل می‌کنیم + اپراتور.

در مفسر پایتون، بیایید از الحاق برای گنجاندن یک متغیر در یک رشته استفاده کنیم:

name = "Python"
print("I like " + name + " very much!")

خروجی زیر را خواهید دید:

I like Python very much!

الحاق رشته فقط کار می کند روی رشته های. اگر می خواهید داده های غیر رشته ای گنجانده شود، باید آن را به صورت دستی تبدیل کنید.

بیایید با الحاق یک عدد به یک رشته ببینیم:

age = (10 + 5) * 2
print("You wouldn't believe me, but I am only " + age + " years old")

با اجرای موارد بالا این خطا را مشاهده خواهید کرد:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str

حالا بیایید تبدیل کنیم age به یک رشته:

age = (10 + 5) * 2
print("You wouldn't believe me, but I am only " + str(age) + " years old")

مترجم به درستی نشان می دهد:

You wouldn't believe me, but I am only 30 years old

این روش همیشه سریع‌ترین روش برای پایتون برای ارزیابی نیست، همچنین مدیریت با متغیرهای زیادی برای انسان آسان نیست. بهتر است از روش های قالب بندی رشته اختصاصی پایتون استفاده کنید.

قالب بندی رشته ای به سبک C

قالب بندی رشته ای به سبک C، که به آن سبک printf نیز گفته می شود، از رشته ها به عنوان الگوهایی استفاده می کند که با علامت گذاری شده اند. % به طوری که می توان متغیرها را جایگزین کرد.

مثلا، %d به پایتون می گوید که ما یک عدد را جایگزین می کنیم، در حالی که %s به پایتون می گوید که ما یک رشته را جایگزین می کنیم.

به عنوان مثال، چند مکانیسم کنترل نیز وجود دارد %02d اطمینان حاصل می کند که عدد حداقل 2 رقمی است و اگر نباشد، بقیه با صفر پر می شود. ما می توانیم از یک نشانگر مانند استفاده کنیم %.4f برای جایگزینی اعشاری با دقیقاً 4 نقطه شناور در رشته.

در مفسر پایتون خود، کد زیر را تایپ کنید تا بتوانیم قالب بندی رشته به سبک C را در عمل مشاهده کنیم:

print('Here is an integer %02d' % 4)
print('And a float: %.2f' % 3.141592)
print("And a %s with %d replacements" % ("mess", 2))

خروجی شما باید این باشد:

Here is an integer 04
And a float: 3.14
And a mess with 2 replacements

همانطور که می بینید، با استدلال های بیشتر و بیشتر، این موضوع بسیار پیچیده و سخت می شود. بنابراین پایتون این کار را یک قدم جلوتر می‌برد و به شما اجازه می‌دهد از دیکشنری‌ها استفاده کنید % قالب بندی

اگرچه در زیبایی شناسی کلی آن بهبود چندانی حاصل نشده است، اما می تواند کمی کمک کند روی جبهه خوانایی

پیشنهاد می‌کنیم بخوانید:  Local و متغیرهای جهانی در پایتون

سعی کنید یک رشته به سبک C را با دیکشنری قالب بندی کنید:

print('Using %(dictionary)s format in C-style string formatting, here is %(num)d number to make it more interesting!' % {'dictionary': "named", "num": 1})

همانطور که می بینید، می توانیم نام را در داخل پرانتز بین آن ها مشخص کنیم % و بقیه شناسه

مترجم شما باید نمایش دهد:

Using named format in C-style string formatting, here is 1 number to make it more interesting!

اگر 42 سال گذشته را صرف توسعه در C نکرده‌اید، ممکن است نحو بالا مورد پسند شما نباشد. به این ترتیب، پایتون با استفاده از گزینه دیگری به ما می دهد format() روش روی رشته های.

تابع قالب () Python

این format() عملکرد شبیه به قالب بندی C-style عمل می کند، اما بسیار خواناتر است. با فراخوانی کار می کند format() روش روی رشته خود را در حالی که جایگزین های موجود در الگو را در براکت های فرفری ارائه می دهید – {}.

با استفاده از مفسر پایتون، ما از آن استفاده خواهیم کرد format() روشی برای قالب بندی یک رشته بیایید با جایگزینی یک رشته شروع کنیم:

print("This is a first {}".format("attempt!"))

خروجی خواهد بود:

This is a first attempt!

می‌توانیم چندین بار از براکت‌های فرفری استفاده کنیم و متغیرها را به ترتیب جایگزین کنیم:

print("And {} can add {} string too.".format("we", "more"))

خروجی:

And we can add more string too.

همچنین می توانیم متغیرهایی را که قالب بندی می کنیم نام ببریم:

print("String format also supports {dictionary} arguments.".format(dictionary="named"))

کد بالا باید print:

String format also supports named arguments.

در حالی که این روش بسیار خوانا است، پایتون با f-strings کارآمدتر است و در عین حال قابل خواندن است. بیایید نگاهی دقیق تر به f-Strings بیندازیم.

قالب بندی رشته ها با f-strings

F-strings یا حروف رشته ای قالب بندی شده، با یک پیشوند هستند f و حاوی فیلدهای جایگزین با بریس های فرفری باشد. آنها در زمان اجرا ارزیابی می شوند، که آنها را به سریع ترین گزینه قالب بندی رشته در پایتون تبدیل می کند (حداقل در اجرای استاندارد CPython).

ابتدا بررسی کنید که نسخه پایتون 3.6 یا بالاتر دارید:

$ python3 --version
Python 3.6.0

اگر نسخه پایتون شما کمتر از 3.6 است، برای استفاده از این ویژگی باید آن را ارتقا دهید.

حرف F-String با یک شروع می شود fو به دنبال آن هر نوع رشته ای (یعنی نقل قول تک، نقل قول دوگانه، نقل قول سه گانه)، سپس می توانید عبارت Python خود را در داخل رشته، در بین براکت های مجعد قرار دهید.

بیایید رشته ای را برای استفاده از رشته f در پوسته پایتون استفاده کنیم:

name = "f-String"
print(f"hello {name}!")

و اکنون آن را اجرا کنید تا جادو را ببینید:

hello f-String!

بسیار شبیه به استفاده از format() تابع. با این حال، ویژگی های زیادی دارد که با روش های قالب بندی دیگر در دسترس نیستند.

بیایید نگاهی به آن ویژگی ها بیندازیم، با رشته های چند خطی شروع می کنیم.

f-strings چند خطی

F-Strings رشته های چند خطی را امکان پذیر می کند، تنها کاری که باید انجام دهید این است که آنها را در پرانتز بپیچید:

name = "World"
message = (
  f"Hello {name}. "
  "This is from a multi-lined f-string. "
  f"Have a good day, {name}"
)
print(message)

این را خواهید دید روی چاپ شده:

Hello World. This is from a multi-lined f-string. Have a good day, World

فراموش نکنید که قرار دهید f به معنای واقعی کلمه در مقابل خطوطی که جایگزینی دارند. تعویض ها در غیر این صورت کار نمی کنند.

ارزیابی عبارات پایتون در f-strings

f-strings پایتون به شما امکان می دهد عبارات را درست در خود رشته انجام دهید. رشته زیر معتبر است:

number = 10
print(f"{number} + 1 = {number+1}")

و خروجی ها:

10 + 1 = 11

شما می توانید هر عبارت معتبری را که می خواهید اضافه کنید، به شرطی که کاراکترهای خاصی نداشته باشد. به عنوان مثال، می توانیم فراخوانی تابع داشته باشیم:

def func():
  return 42

print(f"func() = {func()}")

این برمی گرداند:

func() = 42

قالب بندی کلاس ها با f-strings

می توانید اشیاء ایجاد شده از کلاس ها را در یک رشته f قرار دهید. هر کلاس دارای دو روش مختلف است که به یک شی اجازه می دهد تا به یک رشته تبدیل شود:

  • این __str__() متد یک شی باید رشته ای را برگرداند که هم برای کاربر قابل نمایش باشد و هم برای او قابل درک باشد. این بدان معناست که نباید هیچ گونه اطلاعات محرمانه ای داشته باشد که باید از کاربر پنهان بماند، و نباید هیچ پیام اشکال زدایی داشته باشد.
  • این __repr__() متد یک شی باید رشته دقیق تری را که احتمالاً حاوی اطلاعات اشکال زدایی باشد، برگرداند.
پیشنهاد می‌کنیم بخوانید:  آموزش PyGame – چگونه یک بازی Alien Abduction بسازیم

f-strings به طور خودکار این را صدا می کند __str__() برای شیئی که به آنها ارائه می کنید.

بیایید f-Strings خود را با یک کلاس امتحان کنیم تا خودمان ببینیم. یک را ایجاد خواهیم کرد User کلاسی که نام ما و شناسه پایگاه داده مرتبط را که سیستم خیالی ما استفاده می کند ذخیره می کند.

یک فایل جدید به نام ایجاد کنید fstring_classes.py و موارد زیر را اضافه کنید:



class User:
    def __init__(self, name, db_id):
        self.name = name
        self.db_id = db_id

    def __str__(self):
        return f"User with name: {self.name}"

my_user = User("Sajjad", 12)
print(f"{my_user}")

در ترمینال خود، فایل را با پایتون اجرا کنید:

$ python fstring_classes.py

این برنامه نشان خواهد داد:

User with name: Sajjad

اگر بخواهیم از یک f-string با the استفاده کنیم __repr_() روش یک شی، شما می توانید یک قرار دهید !r در مقابل شیء شما که جایگزین می شود.

را ویرایش کنید fstring_classes.py فایل و خط آخر را تغییر دهید:

print(f"{my_user}")

به موارد زیر که شامل !r پسوند:

print(f"{my_user!r}")

حالا می توانیم دوباره این برنامه را اجرا کنیم:

$ python fstring_classes.py

و خروجی ما این خواهد بود:

User with name: Sajjad with id 12

مدیریت کاراکترهای خاص در f-strings

F-Strings، مانند هر رشته پایتون دیگری، از استفاده از بک اسلش برای فرار از کاراکترها پشتیبانی می کند. تمام موارد زیر f-strings پایتون معتبر هستند:

print(f'escaping with \\ is also possible, like: \'')

اجرای این اراده print:

escaping with \ is also possible, like: '

با این حال، یک محدودیت وجود دارد، ما نمی توانیم از بک اسلش در بریس های فرفری (بخش بیان رشته f) استفاده کنیم. اگر موارد زیر را در مفسر پایتون خود امتحان کنید:

print(f'{ord("\n")}')

با خطای زیر مواجه خواهید شد:

  File "<stdin>", line 1
SyntaxError: f-string expression part cannot include a backslash

همین محدودیت برای گیومه های هم نوع صادق است. کد زیر:

a = {"key": "value"}
print(f"the value is {a("key")}")

این خطای نحوی را به ما می دهد:

  File "<stdin>", line 1
    print(f"the value is {a("key")}")
                               ^
SyntaxError: invalid syntax

برای جلوگیری از این مشکلات، می توانیم آنها را خارج از رشته f محاسبه کنیم:

ord_newline = ord("\n")
print(f'{ord_newline}')

که چاپ می کند:

10

یا می توانیم از انواع مختلف نقل قول استفاده کنیم:

a = {"key": "val"}
print(f"The value is {a('key')}")

که نمایش می دهد:

The value is val

نتیجه

در این پست روش های مختلف قالب بندی رشته در پایتون را با تمرکز بررسی کردیم روی روش f-string در پایتون، ما برای گزینه‌ها خراب هستیم زیرا می‌توانیم رشته‌ها را به هم متصل کنیم، از قالب‌بندی C-Style با %، یا format() روش روی رشته های.

با این حال، با f-Strings، ما یک راه حل قابل خواندن دریافت می کنیم که پایتون برای آن بهینه سازی کرده است. جدا از مزایای سرعت، ما دیده‌ایم که f-Strings چگونه با ارزیابی عبارات و اشیاء از کلاس‌ها کار می‌کند.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-18 13:28:04

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید