Sara Akrami
Sara Akrami
خواندن ۷ دقیقه·۳ سال پیش

انواع روش های فرمت رشته ها در پایتون

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

بیایید وارد عمل بشیم، زیرا چیزهای زیادی برای گفتن داریم. برای اینکه یک مثال ساده برای آزمایش داشته باشیم، فرض کنیم متغیرهای زیر را برای کار با آنها دارید:

error = 50159747054
name = 'Bob'

بر اساس این متغیرها، می خواهید یک رشته خروجی حاوی یک پیام خطای ساده ایجاد کنید:

'Hey Bob, there is a 0xbadc0ffee error!'

1- قالب بندی رشته "سبک قدیمی" (اپراتور%)شماره 1 قالب بندی رشته "سبک قدیمی" ( اپراتور%)

رشته ها در پایتون یک عملیات داخلی منحصر به فرد دارند که با عملگر % قابل دسترسی است. این به شما امکان می دهد قالب بندی موقعیتی ساده را به راحتی انجام دهید. اگر تا به حال با یک تابع به سبک printf در C کار کرده باشید، فوراً متوجه خواهید شد که چگونه این کار می کند. در اینجا یک مثال ساده است:


>>> 'Hello, %s' % name
"Hello, Bob"


من از مشخص‌کننده فرمت %s در اینجا استفاده می‌کنم تا به پایتون بگویم کجا مقدار name را که به‌عنوان یک رشته نشان داده می‌شود جایگزین کند.

مشخص کننده های فرمت دیگری نیز وجود دارد که به شما امکان می دهد فرمت خروجی را کنترل کنید. برای مثال، می‌توان اعداد را به نماد هگزادسیمال تبدیل کرد یا برای ایجاد جداول و گزارش‌هایی با فرمت‌بندی زیبا، فضای خالی اضافه کرد.(به Python Docs: “printf-style String Formatting مراجعه کنید)

در اینجا، می توانید از مشخص کننده فرمت %x برای تبدیل مقدار int به رشته و نمایش آن به عنوان یک عدد هگزادسیمال استفاده کنید:

>>> '%x' % errno
'badc0ffee'

اگر بخواهید چندین جایگزین در یک رشته ایجاد کنید، نحو قالب بندی رشته "سبک قدیمی" کمی تغییر می کند. از آنجایی که عملگر % تنها یک آرگومان می گیرد، باید سمت راست را در یک تاپل بپیچید، مانند:


>>> 'Hey %s, there is a 0x%x error!' % (name, errno)
'Hey Bob, there is a 0xbadc0ffee error!'


همچنین می توان در رشته قالب خود به جایگزینی متغیرها با نام اشاره کرد، اگر نقشه ای را به عملگر % ارسال کنید:

>>> 'Hey %(name)s, there is a 0x%(errno)x error!' % {
... "name": name, "errno": errno }
'Hey Bob, there is a 0xbadc0ffee error!'


این باعث می‌شود رشته‌های قالب شما نگهداری آسان‌تر و در آینده اصلاح شوند. لازم نیست نگران این باشید که ترتیبی که در مقادیر ارسال می کنید با ترتیب ارجاع مقادیر در رشته قالب مطابقت داشته باشد. البته نکته منفی این است که این تکنیک به کمی تایپ بیشتر نیاز دارد.

مطمئنم برای شما این سوال پیش آمده است که چرا این قالب بندی به سبک printf، قالب بندی رشته ای "سبک قدیمی" نامیده می شود. از نظر فنی با قالب‌بندی «سبک جدید» در پایتون 3 جایگزین شد، که در ادامه در مورد آن صحبت خواهیم کرد.

2- قالب بندی رشته "سبک جدید" (str.format)


پایتون 3 روش جدیدی را برای قالب بندی رشته معرفی کرد که بعداً به پایتون 2.7 نیز افزوده شد. این قالب بندی رشته "سبک جدید" از دستور خاص %-operator خلاص می شود و نحو قالب بندی رشته را منظم تر می کند. اکنون قالب بندی با فراخوانی ().format روی یک شی رشته انجام می شود.

شما می‌توانید از format() برای قالب‌بندی موقعیتی ساده استفاده کنید، دقیقاً مانند قالب‌بندی “سبک قدیم”:


>>> 'Hello, {}'.format(name)
'Hello, Bob'


یا می توانید با نام به جایگزین های متغیر خود مراجعه کرده و به هر ترتیبی که می خواهید از آنها استفاده کنید. این یک ویژگی کاملاً قدرتمند است زیرا امکان تنظیم مجدد ترتیب نمایش بدون تغییر آرگومان های ارسال شده به ()format:

>>> 'Hey {name}, there is a 0x{errno:x} error!'.format(
... name=name, errno=errno)
'Hey Bob, there is a 0xbadc0ffee error!'


3 -رشته درون یابی / f-strings (Python 3.6+)


پایتون 3.6 یک رویکرد قالب‌بندی رشته جدیدی به نام رشته‌های فرمت‌شده یا «f-strings» اضافه کرد. این روش جدید قالب‌بندی رشته‌ها به شما امکان می‌دهد از عبارات پایتون تعبیه‌شده در ثابت‌های رشته استفاده کنید. در اینجا یک مثال ساده وجود دارد تا به شما احساسی نسبت به این ویژگی بدهد:


>>> f'Hello, {name}!' 'Hello, Bob!'


همانطور که می بینید، این پیشوند ثابت رشته را با حرف "f" نشان می دهد - از این رو نام "f-strings" است. این نحو قالب بندی جدید قدرتمند است. از آنجا که می توانید عبارات پایتون دلخواه را جاسازی کنید، حتی می توانید حساب درون خطی را با آن انجام دهید. این مثال را بررسی کنید:


>>> a = 5
>>> b = 10
>>> f'Five plus ten is {a + b} and not {2 * (a + b)}.'
'Five plus ten is 15 and not 30.'

رشته های قالب بندی شده یک ویژگی تجزیه کننده پایتون است که رشته های f را به مجموعه ای از ثابت ها و عبارات رشته تبدیل می کند. سپس آنها برای ساختن رشته نهایی به هم می پیوندند.

تصور کنید تابع ()greet زیر را دارید که حاوی یک رشته f است:

>>> def greet(name, question): ... return f&quotHello, {name}! How's it {question}?&quot ... >>> greet('Bob', 'going') &quotHello, Bob! How's it going?&quot


وقتی تابع را جدا می‌کنید و آنچه در پشت صحنه می‌گذرد را بررسی می‌کنید، خواهید دید که رشته f در تابع به چیزی شبیه به زیر تبدیل می‌شود:

>>> def greet(name, question): ... return &quotHello, &quot + name + &quot! How's it &quot + question + &quot?&quot


پیاده سازی واقعی کمی سریعتر از آن است زیرا از کد عملیاتی BUILD_STRING به عنوان بهینه سازی استفاده می کند. اما از نظر عملکردی یکسان هستند:

در صحنه ها، خواهید دید که رشته f در تابع به چیزی شبیه به زیر تبدیل می شود:

>>> import dis
>>> dis.dis(greet)
2 0 LOAD_CONST 1 ('Hello, ')
2 LOAD_FAST 0 (name)
4 FORMAT_VALUE 0
6 LOAD_CONST 2 ("! How's it ")
8 LOAD_FAST 1 (question)
10 FORMAT_VALUE 0
12 LOAD_CONST 3 ('?')
14 BUILD_STRING 5
16 RETURN_VALUE


لفظ رشته ای همچنین از نحو رشته فرمت موجود متد ()str.format پشتیبانی می کند. این به شما امکان می‌دهد همان مشکلات قالب‌بندی را که در دو بخش قبلی در مورد آن صحبت کردیم، حل کنید:


>>> f"Hey {name}, there's a {errno:#x} error!"
"Hey Bob, there's a 0xbadc0ffee error!"

4- رشته های الگو (کتابخانه استاندارد)

در اینجا یک ابزار دیگر برای قالب بندی رشته ها در پایتون وجود دارد: رشته های قالب. این یک مکانیسم ساده تر و کم قدرت است، اما در برخی موارد ممکن است دقیقاً همان چیزی باشد که شما به دنبال آن هستید.

بیایید نگاهی به یک مثال ساده تبریک بیاندازیم:

>>> from string import Template
>>> t = Template('Hey, $name!')
>>> t.substitute(name=name)
'Hey, Bob!'


در اینجا مشاهده می کنید که باید کلاس Template را از ماژول رشته داخلی پایتون وارد کنیم. رشته های الگو یک ویژگی اصلی زبان نیستند اما توسط ماژول رشته در کتابخانه استاندارد ارائه می شوند.

تفاوت دیگر این است که رشته های قالب اجازه تعیین کننده های قالب را نمی دهند. بنابراین برای اینکه مثال رشته خطای قبلی کار کند، باید شماره خطای int را به صورت دستی به یک رشته هگزا تبدیل کنید:

>>> templ_string = 'Hey $name, there is a $error error!'
>>> Template(templ_string).substitute(
... name=name, error=hex(errno))
'Hey Bob, there is a 0xbadc0ffee error!'

در اینجا مشاهده می کنید که باید کلاس Template را از ماژول رشته داخلی پایتون وارد کنیم. رشته های الگو یک ویژگی اصلی زبان نیستند اما توسط ماژول رشته در کتابخانه استاندارد ارائه می شوند.

تفاوت دیگر این است که رشته های قالب اجازه تعیین کننده های قالب را نمی دهند. بنابراین برای اینکه مثال رشته خطای قبلی کار کند، باید شماره خطای int را به صورت دستی به یک رشته هگزا تبدیل کنید:

>>> templ_string = 'Hey $name, there is a $error error!'
>>> Template(templ_string).substitute(
... name=name, error=hex(errno))
'Hey Bob, there is a 0xbadc0ffee error!'

که عالی کار کرد.

بنابراین چه زمانی باید از رشته های قالب در برنامه های پایتون خود استفاده کنید؟ به نظر من، بهترین زمان برای استفاده از رشته های قالب زمانی است که رشته های فرمت شده تولید شده توسط کاربران برنامه خود را مدیریت می کنید. به دلیل کاهش پیچیدگی، رشته های الگو انتخاب مطمئن تری هستند.

از کدام روش قالب بندی رشته ای باید استفاده کنید؟

من کاملاً متوجه شدم که داشتن انتخاب بسیار برای نحوه قالب بندی رشته های خود در پایتون می تواند بسیار گیج کننده باشد. این یک نشانه عالی برای از بین بردن این اینفوگرافیک فلوچارت مفیدی است که برای شما تهیه کرده ام:



مترجم: سارا اکرمی

منبع:

https://realpython.com/python-string-formatting/


پایتونرشته در پایتونایجاد فرمت رشته در پایتونآموزش رشته ها در پایتونرشته ها
شاید از این پست‌ها خوشتان بیاید