از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
راهنمای کارآموزی رشته در پایتون
سرفصلهای مطلب
معرفی
یکی از اولین چیزهایی که هنگام یادگیری اصول برنامه نویسی با آن مواجه می شوید، مفهوم رشته است. مانند زبان های برنامه نویسی مختلف، رشته های پایتون آرایه هایی از بایت ها هستند که کاراکترهای یونیکد را نشان می دهند – آرایه یا دنباله ای از کاراکترها. پایتون، بر خلاف بسیاری از زبان های برنامه نویسی، تفاوتی ندارد شخصیت نوع داده و کاراکترها رشته هایی با طول 1 در نظر گرفته می شوند.
شما می توانید یک رشته را با استفاده از گیومه های تک یا دوتایی تعریف کنید، به عنوان مثال، a = "Hello World"
یا a = 'Hello World'
. برای دسترسی به یک عنصر خاص از یک رشته، باید از براکت های مربع (()
) با نمایه کاراکتری که می خواهید به آن دسترسی داشته باشید (نمایه سازی از 0 شروع می شود). صدا زدن a(0)
برای مثال، برمیگشت H
.
همانطور که گفته شد، بیایید نگاهی به این مثال کد بیندازیم:
a = 'Hello World'
b = 'Hello World'
c = 'Hello Worl'
print(a is b)
print(a == b)
print(a is c+'d')
print(a == c+'d')
تمام رشته هایی که مقایسه می کنیم مقدار آنها را حفظ می کنند Hello World
(a
، b
، و c +'d'
). ممکن است شهودی باشد که فرض کنیم خروجی خواهد بود True
برای همه این اظهارات
با این حال، زمانی که ما کد را اجرا می کنیم، به این نتیجه می رسد:
True
True
False
True
چیزی که ممکن است در مورد این خروجی غیرمعمول به نظر برسد این است که a is c + 'd'
برمی گرداند False
، در حالی که یک بیانیه بسیار مشابه است a is b
برمی گرداند True
. با این کار می توان نتیجه گرفت که a
و b
همان شی هستند، در حالی که c
یک متفاوت است، حتی اگر ارزش یکسانی داشته باشند.
اگر با تفاوت بین آن آشنا نیستید ==
و is
– is
بررسی می کند که آیا متغیرها به یکسان اشاره می کنند یا خیر شی در حافظه، در حالی که ==
بررسی می کند که آیا متغیرها یکسان هستند یا خیر ارزش.
این تمایز بین a
، b
و c
محصول است رشته کارآموزی.
توجه داشته باشید: محیطی که کد را در آن اجرا میکنید بر روش کار درونسازی رشته تأثیر میگذارد. نمونه های قبلی نتایج اجرای کد به عنوان یک اسکریپت در یک محیط غیر تعاملی با استفاده از آخرین نسخه فعلی پایتون (نسخه 3.8.5) بود. رفتار هنگام استفاده از آن متفاوت خواهد بود console/Jupyter به دلیل روش های مختلف بهینه سازی کد یا حتی بین نسخه های مختلف پایتون.
این به این دلیل است که محیط های مختلف سطوح بهینه سازی متفاوتی دارند.
رشته کارآموزی
رشته ها هستند اشیاء تغییرناپذیر در پایتون این بدان معنی است که وقتی رشته ها ایجاد می شوند، نمی توانیم آنها را تغییر یا به روز کنیم. حتی اگر به نظر می رسد که یک رشته تغییر یافته است، در زیر هود، یک کپی با مقدار تغییر یافته ایجاد شده و به متغیر اختصاص داده شده است، در حالی که رشته اصلی ثابت می ماند.
بیایید سعی کنیم یک رشته را اصلاح کنیم:
name = 'Wtack Abuse!'
name(0) = 'S'
به عنوان رشته name
تغییرناپذیر است، این کد شکست خواهد خورد روی خط آخر:
name(0) = 'S'
TypeError: 'str' object does not support item assignment
توجه داشته باشید: اگر واقعاً میخواهید یک کاراکتر خاص از یک رشته را تغییر دهید، میتوانید رشته را به یک شیء قابل تغییر تبدیل کنید. list
و عنصر مورد نظر را تغییر دهید:
name = 'Wtack Abuse!'
name = list(name)
name(0) = 'S'
name = "".join(name)
print(name)
که خروجی مورد نظر را به ما می دهد:
رسانگار!
دلیل اینکه ما میتوانیم کاراکتر را در لیست (و نه در رشته) تغییر دهیم این است که لیستها قابل تغییر هستند – به این معنی که میتوانیم عناصر آنها را تغییر دهیم.
رشته داخلی یک است process فقط از ذخیره سازی یک نسخه از هر مقدار رشته مجزا در حافظه.
این بدان معناست که وقتی دو رشته با مقدار یکسان ایجاد می کنیم – به جای تخصیص حافظه برای هر دوی آنها، در واقع فقط یک رشته به حافظه متعهد می شود. دیگری فقط به همان محل حافظه اشاره می کند.
با توجه به این اطلاعات، اجازه دهید به ابتدا برگردیم Hello World
مثال:
a = 'Hello World'
b = 'Hello World'
c = 'Hello Worl'
وقتی رشته a
ایجاد می شود، کامپایلر بررسی می کند که آیا Hello World
در حافظه داخلی وجود دارد. از آنجایی که اولین بار این مقدار رشته است، پایتون یک شی ایجاد می کند و این رشته را در حافظه و نقاط ذخیره می کند. a
به این مرجع
چه زمانی b
ایجاد شده است، Hello World
توسط کامپایلر در حافظه داخلی پیدا می شود، بنابراین به جای ایجاد رشته دیگری، b
به سادگی به حافظه اختصاص داده شده قبلی اشاره می کند.
a is b
و a == b
در این مورد.
در نهایت وقتی رشته را ایجاد می کنیم c = 'Hello Worl'
، کامپایلر شی دیگری را در حافظه داخلی نمونه سازی می کند زیرا نمی تواند همان شی را برای مرجع پیدا کند.
وقتی مقایسه می کنیم a
و c+'d'
، دومی به ارزیابی می شود Hello World
. با این حال، از آنجایی که پایتون در طول زمان اجرا، اینترنینگ را انجام نمی دهد، به جای آن یک شی جدید ایجاد می شود. بنابراین، از آنجایی که هیچ کارآموزی انجام نشد، این دو نیستند همان شیء و is
برمی گرداند False
.
در مقابل is
اپراتور، ==
عملگر مقادیر رشته ها را پس از محاسبه مقایسه می کند زمان اجرا اصطلاحات – Hello World == Hello World
.
در آن زمان، a
و c+'d'
از نظر ارزشی یکسان هستند، بنابراین این باز می گردد True
.
تایید
بیایید ببینیم شناسه از اشیاء رشته ای که ایجاد کردیم. این id(object)
تابع در پایتون شناسه را برمی گرداند object
، که در طول عمر شی مذکور منحصر به فرد بودن آن تضمین شده است. اگر دو متغیر به یک شی اشاره کنند، فراخوانی می شود id
همان شماره را برمی گرداند:
letter_d = 'd'
a = 'Hello World'
b = 'Hello World'
c = 'Hello Worl' + letter_d
d = 'Hello Worl' + 'd'
print(f"The ID of a: {id(a)}")
print(f"The ID of b: {id(b)}")
print(f"The ID of c: {id(c)}")
print(f"The ID of d: {id(d)}")
این منجر به:
The ID of a: 16785960
The ID of b: 16785960
The ID of c: 17152424
The ID of d: 16785960
فقط c
شناسه متفاوتی دارد همه ارجاعات اکنون به شیء با همان اشاره دارند Hello World
ارزش. با این حال، c
در زمان کامپایل محاسبه نشد، بلکه در زمان اجرا محاسبه شد. زوج d
، که با اضافه کردن آن ایجاد کردیم 'd'
شخصیت اکنون به همان شی اشاره می کند که a
و b
اشاره به
رشته ها چگونه درون می شوند
در پایتون، رشتهها را میتوان بر اساس دو روش درونسازی کرد روی تعامل برنامه نویس:
- کارآموزی ضمنی
- کارآموزی صریح
کارآموزی ضمنی
پایتون به طور خودکار برخی رشته ها را در لحظه ایجاد آنها کارآموزی می کند. اینکه آیا رشته ای داخل شده باشد یا نه بستگی دارد روی چند عامل:
-
تمام رشتههای خالی و رشتههای طول 1 داخل هستند.
-
تا نسخه 3.7، پایتون استفاده می کرد بهینه سازی سوراخ چشمی، و تمام رشته های بیش از 20 کاراکتر داخل نشده بودند. با این حال، در حال حاضر از آن استفاده می کند بهینه ساز AST، و (بیشتر) رشته ها تا 4096 کاراکتر داخل هستند.
-
نام توابع، کلاس، متغیرها، آرگومانها و غیره به طور ضمنی درونسازی شدهاند.
-
کلیدهای لغت نامه هایی که برای نگهداری ویژگی های ماژول، کلاس یا نمونه استفاده می شوند، درونی هستند.
-
رشتهها فقط در زمان کامپایل درون میشوند، به این معنی که اگر مقدار آنها در زمان کامپایل محاسبه نشود، درونسازی نمیشوند.
- این رشته ها به عنوان مثال تعبیه می شوند:
a = 'why' b = 'why' * 5
- عبارت زیر در محاسبه می شود زمان اجرا بنابراین رشته داخل نشده است.
b = "".join(('w','h','y'))
-
رشته هایی که دارای کاراکترهایی جدا از ASCII هستند به احتمال زیاد داخل نمی شوند.
اگر یادتان باشد این را گفتیم 'Hello Worl' + letter_d
در زمان اجرا محاسبه شد و بنابراین اینترن نخواهد شد. از آنجایی که هیچ استاندارد ثابتی وجود ندارد روی درونسازی رشته، یک قانون کلی خوب برای استفاده، ایده کامپایل-زمان/زمان اجرا است، که در آن میتوانید فرض کنید که اگر بتوان آن را در زمان کامپایل محاسبه کرد، یک رشته درونسازی میشود.
کارآموزی صریح
ما اغلب با رشتههایی مواجه میشویم که تحت شرایط درونسازی ضمنی در پایتون قرار نمیگیرند، اما راهی وجود دارد که هر رشتهای را که میخواهید اینترن کنید. یک تابع در وجود دارد sys
ماژول فراخوانی شد intern(immutable_object)
، این تابع به پایتون می گوید که آن را ذخیره کند immutable_object
(رشته در مورد ما) در جدول حافظه داخلی.
شما می توانید هر نوع رشته ای را به صورت زیر کارآموزی کنید:
import sys
c = sys.intern('Hello World'+'!')
می بینیم که این در مثال قبلی ما کار می کند:
import sys
letter_d = 'd'
a = sys.intern('Hello World')
b = sys.intern('Hello Worl' + letter_d)
print(f"The ID of a: {id(a)}")
print(f"The ID of b: {id(b)}")
print(f"a is b? {a is b}")
خروجی را می دهد:
The ID of a: 26878464
The ID of b: 26878464
a is b? True
اکنون که می دانیم چگونه و کدام رشته ها در پایتون اینترن شده اند. یک سوال باقی می ماند – چرا کارآموزی رشته ای معرفی شد؟
مزایای کارآموزی رشته ای
کارآموزی رشته دارای چندین مزیت است:
- ذخیره حافظه: ما هرگز مجبور نیستیم دو شیء رشته را به طور جداگانه در حافظه ذخیره کنیم، اگر آنها یکسان هستند. هر متغیر جدید با محتوای یکسان فقط به مرجع در جدول داخلی اشاره می کند. اگر به دلایلی می خواهید فهرستی حاوی تک تک کلمات و ظاهر آن در جین آستن داشته باشید غرور و تعصببدون اینترن صریح، به 4.006.559 بایت نیاز دارید و با درونسازی صریح هر کلمه، تنها به 785.509 بایت حافظه نیاز دارید.
- مقایسه سریع: مقایسه رشتههای داخلی بسیار سریعتر از رشتههای غیراینترن شده است که زمانی مفید هستند که برنامه شما مقایسههای زیادی داشته باشد. این به این دلیل اتفاق می افتد که برای مقایسه رشته های داخلی، به جای مقایسه محتویات، فقط باید مقایسه کنید که آیا آدرس حافظه آنها یکسان است یا خیر.
- جستجوی سریع فرهنگ لغت: اگر کلیدهای جستجو داخلی هستند، مقایسه را می توان با مقایسه اشاره گر به جای مقایسه رشته ها انجام داد، که کار می کند. روی همان اصل نکته قبلی
معایب کارآموزی رشته ای
با این حال، رشتههای داخلی دارای برخی اشکالات و نکاتی هستند که باید قبل از استفاده در نظر بگیرید:
- هزینه حافظه: در صورتی که برنامه شما دارای تعداد زیادی رشته با مقادیر متفاوت و در مجموع مقایسه های نسبتاً کمتری باشد زیرا خود جدول داخلی حافظه را مصرف می کند. به این معنی که اگر رشته های نسبتا کمی دارید و مقایسه های زیادی بین آنها دارید، می خواهید رشته ها را کارآموزی کنید.
- هزینه زمان: تماس به
intern()
عملکرد گران است زیرا باید جدول داخلی را مدیریت کند. - محیط های چند رشته ای: حافظه داخلی (جدول) یک منبع جهانی در یک محیط چند رشته ای است که همگام سازی آن نیاز به اصلاح دارد. این بررسی ممکن است فقط زمانی مورد نیاز باشد که به جدول داخلی دسترسی داشته باشید، یعنی زمانی که یک رشته جدید ایجاد می شود، اما می تواند گران باشد.
نتیجه
با استفاده از رشتههای داخلی، مطمئن میشوید که فقط یک شی ایجاد میشود، حتی اگر رشتههای متعددی با محتوای یکسان تعریف کنید. با این حال، باید تعادل بین مزایا و معایب کارآموزی رشته را در نظر داشته باشید و تنها زمانی از آن استفاده کنید که فکر می کنید برنامه شما می تواند سودمند باشد.
همیشه به یاد داشته باشید که اگر از رشته های داخلی استفاده می کنید، نظرات یا مستندات را اضافه کنید تا سایر اعضای تیم بدانند که چگونه با رشته ها در برنامه برخورد کنند.
در حالی که نتایج ممکن است بر اساس اجرای مفسر پایتون شما و همچنین محیطی که کد خود را در آن اجرا می کنید متفاوت باشد، قطعا باید با آن بازی کنید. intern()
عملکرد خود را با آن راحت کنید. این مفهوم می تواند به شما در بهبود طراحی و عملکرد کدتان کمک کند. ممکن است در مصاحبه شغلی بعدی نیز به شما کمک کند.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-16 13:36:04