پایتون

رشته ها در پایتون – بررسی و آموزش

در ادامه سری آموزشهای پایتون، در دومین بخش از آن به بررسی رشته ها در پایتون خواهیم پرداخت و به صورت خلاصه شما را با این نوع رایج از داده ها، آشنا خواهیم کرد.

پایتون  برای کار با رشته ها یک کلاس پیش ساخته ای بنام str دارد که قابلیت های زیادی را به ما ارائه می دهد (ماژول string نسخه قدیمی تر این کلاس است که توصیه می کنیم از آن استفاده نکنید). یک رشته در پایتون با علامت نقل قول تکی ( ‘ ) یا دوتایی ( ” ) مشخص میشود که البته نقل قول تکی رایجتر است. با این توصیف، ‘Google’ و “Google” هر دو یک رشته را در پایتون نمایش می دهند.

قوانینی که در سایر زبانها راجع به کاراکترهای خاص و نمایش آنها در رشته ها داریم هم در پایتون به قوت خود باقیست و کافیست قبل از کاراکتر های ویژه مانند تب، انتهای خط، علامت اسلش و مانند آن از کاراکتر \ استفاده کنیم. مثلاً  t\ برای بیان یک فاصله به اندازه یک تب و n\ برای نمایش انتهای خط در یک رشته به کار می رود.

یک استثنای کوچک در این زمینه در پایتون داریم : یک رشته که با نقل قول دوتایی شروع شود،می تواند شامل نقل قول تکی هم باشد بدون استفاده از \. بنابراین رشته “I didn’t do it” یک رشته معتبر در پایتون است و بالعکس؛ یک رشته که با نقل قول دوتایی شروع شود می تواند شامل نقل قول تکی هم باشد بدون کاراکتر \ مانند ‘I didn”t do it’.

یک رشته میتواند در چندین خط امتداد داشته باشد به شرطی که در انتهای خط کاراکتر \ را به تنهایی استفاده کنیم که به مفسر پایتون اعلام کنیم هنوز رشته ما تمام نشده است. البته نقل قول های سه تایی رشته ای که دو طرف آن “”” باشد هم می تواند در چندین خط به صورت معمولی قرار گیرد.

در پایتون رشته ها تغییر ناپذیرند (immutable)؛ یعنی بعد از اینکه یک متغیر رشته ای، مقداری را به خود گرفت و در حافظه ایجاد شد، امکان تغییر آن وجود ندارد( در جاوا هم رشته ها تغییر ناپذیرند). بنابراین هر زمان که شما عملیاتی را روی یک یا چند رشته انجام میدهید که باعث تغییر آنها شود، در حقیقت رشته جدیدی را پایتون برای شما درحافظه خواهد ساخت و مقادیر قبلی حافظه به صورت خودکار پاک خواهند شد. بعنوان مثال، وقتی دو رشته ‘hello’  و ‘there’ را با عملگر + به هم می چسبانیم، در حقیقت رشته جدیدی را در حافظه با مقدار ‘hellothere’ ساخته ایم و هیچ کدام از دو مقدار تشکیل دهنده آن تغییر نکرده اند.

هر کدام از کاراکترهای یک رشته از طریق عملگر استاندارد [] قابل  دسترسی است و همانند جاوا و ++C، پایتون از ایندکس صفر رشته ها را ایندکس گذاری میکند. رشته ‘hello’ را در نظر بگیرید که کاراکترهای تشکیل دهنده آن از ایندکس صفر تا چهار قابل دسترسی اند و str[1] به ما کاراکتر ‘e’ را برمیگرداند. اگر ایندکسی که داخل براکت استفاده می شود خارج از محدوده رشته ما باشد خطا رخ می دهد و برنامه شما متوقف خواهد شد.سبک پایتون ( برخلافperl) هنگام برخورد به یک خطا این است که کل برنامه متوقف خواهد شد.

تابع len به ما طول یک رشته را برمیگرداند و از توابع پرکاربرد پایتون به شمار می رود (تابع len و عملگر [] روی تمام مجموعه داده های آرایه مانند در پایتون مانند رشته، لیست، مجموعه و تاپل هم به کار می روند) و حواستان باشد که هیچگاه از شناسه len به عنوان نام یک متغیر در برنامه هایتان استفاده نکنید چون با اینکار، عملکرد پیش فرض این تابع اعمال نخواهد شد.

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


s = 'hi'
print s[1]          ## i
print len(s)        ## ۲
print s + ' there'  ## hi there

برخلاف جاوا در پایتون وقتی از عملگر + استفاده میکنید بطور خودکار اعداد و دیگر نوع ها به رشته تبدیل نمی شود و عمل تبدیل متغیرهای غیررشته ای به رشته را باید خودمان انجام بدهیم. برای اینکار هم از تابع معروف ()str استفاده خواهیم کرد : این تابع هر محتوایی را به رشته تبدیل میکند و میتوان نتیجه این تابع را با رشته های دیگر ترکیب کرد. در قطعه کد زیر در خط دوم به خطا بر خواهیم خورد چون یک عدد را با یک رشته ترکیب کرده ایم و شکل درست آن، کدیست که در خط سوم نوشته شده است :


pi = 3.14
##text = 'The value of pi is ' + pi      ## NO, does not work
text = 'The value of pi is '  + str(pi)  ## yes

در پایتون برای اعداد عملگرهای + و – و * به روش معمول ریاضی عمل میکند و عملگر ++ و — در پایتون وجود ندارد ولی عملگرهای =+ و=- در پایتون کار میکند.
برای تقسیم صحیح هم باید از عملگر // استفاده شود. ۱=۵//۶ ( عملگر / تقسیم معمولی ولی // تقسیم با حذف قسمت اعشار آن می باشد.)

عملگر print در پایتون برای چاپ یک متغیر در کنسول به کار می رود و به طور خودکار، محتوای ارسال شده به آن را در یک خط چاپ می کند. اگر در ابتدای یک رشته  و قبل از علامت های نقل قول، پیشوند r را قرار دهیم، آنگاه مفسر پایتون، بدون در نظر گرفتن عمل \ رشته را برمیگرداند یعنی هیچ پردازشی روی رشته انجام نمی دهدو هر چیزی که درون رشته باشد عیناً چاپ خواهد شد.

اگر از پیشوند u استفاده کنیم آنگاه مفسر پایتون، رشته را به یونیکد تبدیل کرده و نتیجه را به صورت یونیکد پردازش خواهد کرد که برای کار با رشته های غیر لاتین، حواسمان باید به این نکته باید باشد. (پایتون برای رشته های یونیکد توابع و کلاسهای متنوعی دارد که با آنها به تدریج آشنا خواهید شد)


raw = r'this\t\n and that'
print raw     ## this\t\n and that

multi = """It was the best of times.
It was the worst of times."""

توابع مفید برای کار با رشته ها

در اینجا برخی از رایج ترین متدهایی که برروی رشته ها اجرا می شود را بیان میکنیم. توضیح اینکه یک متد شبیه یک تابع است اما روی یک شی اجرا میشود و همانطور که گفتیم کلاس string در پایتون، برای کار با رشته ها طراحی شده است و هر رشته ای در برنامه، یک شی یا متغیر از این کلاس است و می توان روی هر رشته ای، تمام توابع زیر را استفاده کرد.

توضیح اینکه اگر s یک متغیر رشته ای باشد آنگاه () s.lower متد lower را روی آن اجرا میکند و نتیجه اجرای آن یک رشته جدید خواهد بود که تمام حروف آن به شکل کوچک انگلیسی تبدیل شده است. با هم این توابع را مرور می کنیم و یادتان باشد که این ها متد هستند یعنی برای استفاده از آنها باید ابتدا نام متغیر رشته ای خود را بنویسید و بعد عملگر نقطه و بعد هم توابع زیر را صدا بزنید :

  • ()lower(), upper : این توابع رشته را به صورت حروف بزرگ یا به حروف کوچک برمیگرداند.
  • ()strip : این تابع رشته ای جدید را با حذف فضاهای خالی از ابتدا و انتهای رشته فعلی برمیگرداند.
  • ()isalpha()/isdigit()/.isspace : تست میکند آیا رشته ما تمام کاراکترهایش رشته یا عدد یا فضای خالیست.
  • startswith(‘other’),endswith(‘other’) : تست میکند که آیا رشته ما با عبارت ‘other’ شروع و یا پایان یافته است .
  • find(‘other’) : رشته ای که بعنوان پارامتر other داده ایم را در رشته اصلی جستجو می کند.اگر وجود داشت، ایندکس شروع رشته جستجو شده را برمیگرداند در غیر اینصورت عدد (۱-) را برمیگرداند
  • replace(‘old’, ‘new’) : رشته old را درشته اصلی جستجو و رشته  new را جایگزین آن میکند و خروجی را به عنوان یک رشته جدید برمیگرداند.
  • split(‘delim’) : این تابع مفید، رشته را بر اساس کاراکتر ‘delim’ که معمولاً کاراکتر فضای خالیست، تجزیه می کند یعنی یک لیست برمیگرداند که رشته اصلی بر اساس کاراکتر ذکر شده، به چندین زیر رشته تقسیم می شود. اگر کاراکتر جداکننده را فضای خالی وارد کنیم، لیست ذکر شده، حاوی تک تک کلمات جمله اصلی خواهد بود .
  • join(list) : دورشته و یا بیشتر را با هم الحاق میکند.

برش های یک رشته (زیر بخش ها یا Slice)

Slice یا برش در حالت کلی،‌ یک روش مفید برای اشاره به زیر بخش های متوالی از یک مجموعه (که معمولا رشته یا لیست است) می باشد.

s[start:end] در واقع برشی از رشته  s  را برمیگرداند که شروع عناصر آن از ایندکس start  و پایان عناصر برگشتی زیربخش تا ایندکس end از رشته s می باشد.

برای مثال فرض کنید رشته  s دارای مقدار hello می باشد، همانطور که گفتیم پایتون رشته ها را از چپ به راست و از صفر شروع به ایندکس گذاری میکند و اگر بخواهیم از انتهای رشته آدرس دهی کنیم، (از راست به چپ)  شروع ایندکس گذاری ما از ۱- می باشد.

“s = “Hello

hello

  • ‘s[1:4] is ‘ell: برشی از رشته s را برمیگرداند که از ایندکس ۱ شروع شده و تا ایندکس ۴ (نه خود ایندکس ۴) ادامه می یابد.
  • ‘s[1:] is ‘ello : برشی از رشته s را برمیگرداند که از ایندکس ۱ شروع شده و تا انتهای رشته ادامه دارد.(وقتی ایندکس انتهایی تعیین نشود، به صورت پیش فرض، انتهای رشته در نظر گرفته می شود)
  • ‘s[:] is ‘Hello : برشی از رشته s را برمیگرداند که از ایندکس ۰ شروع شده(وقتی ایندکس ابتدایی تعیین نشود، از ایندکس ۰ در نظر گرفته میشود) و تا انتهای رشته ادامه می یابد که در واقع یک کپی از اصل رشته به ما می دهد (یک راه برای کپی رشته و لیست )
  • ‘s[1:100] is ‘ello : برشی از رشته s را برمیگرداند که از ایندکس ۱ شروع شده و تا ایندکس ۱۰۰ ادامه دارد (در صورتی که ایندکسی که استفاده میکنیم بیش از طول رشته ما باشد، مفسر پایتون آنرا به اندازه طول رشته کوتاه میکند)

در روش استاندارد ایندکس گذاری، شروع شاخص از عدد ۰ شروع می شود که برای دسترسی به کاراکترهای ابتدای رشته کافیست شماره متناظر با آن کاراکتر را داشته باشیم. پایتون یک راه دیگر هم برای دسترسی به کاراکترهای یک رشته به ما پیشنهاد می کند و آن هم استفاده از اعداد منفی ست که دسترسی به کاراکترهای انتهای رشته را برای ما تسهیل میکند. در این روش کاراکتر آخر رشته ، شاخص منهای یک، کاراکتر ماقبل آخر، عدد منهای دو و به همین ترتیب سایر کاراکترها با عددی منفی متناظر با فاصله شان از انتهای رشته شناخته می شوند. مثلا s[-1] به ما آخرین کاراکتر رشته را میدهد و s[-2] به کاراکتر ماقبل آخر اشاره دارد و قس علیهدا. بنابراین یادتان باشد که ایندکس هایی با اعداد منفی همیشه از انتهای رشته حساب می شود.

  • ‘s[-1] is ‘o : آخرین کاراکتر رشته s را برمیگرداند.
  • ‘s[-4] is ‘e’: کاراکتر ۴ (از راست به چپ) را برمیگرداند.
  • ‘s[:-3] is ‘He : برشی از رشته s را برمیگرداند که از ایندکس ۰ شروع می شود و تا رسیدن به کاراکتر ۳ ادامه خواهد داشت.
  • ‘s[-3:] is ‘llo : برشی با شروع از کارکتر ۳ (از راست به چپ) و تا انتهای رشته را به ما بر میگرداند(وقتی ایندکس انتهایی تعیین نشود پیش فرض آن طبق آنچه قبلاً اشاره شد، انتهای رشته در نظر گرفته می شود)

برای هر ایندکسی که درنظر بگیرید، این تساوی همیشه برقرار خواهد s[:n] + s[n:] == s  که حتی برای n های منفی و خارج از محدوده هم کار میکند. در بخش لیست ها هم این قوانین را خواهیم دید.

String % – قالب بندی یک رشته

پایتون عملگری دارد که مشابه ()printf امکان ساختن یک رشته به شکل دلخواه را به ما میدهد. عملگر %  در سمت چپ خود رشته ای شبیه به ورودی تابع printf را می گیرد که درون آن معمولاً از متغیرهای مختلف استفاده شده است (  Hint: %d int, %s string, %f/%g floating point ) و در سمت راست خود، یک تاپل (مقادیری درون پرانتز که با ویرگول از هم جدا شده اند) از متغیرهای متناظر با رشته سمت چپ را می گیرد و وظیفه این عملگر هم این است که مقادیر متغیرها را از سمت راست برداشته و درون رشته سمت چپ با قالبی که برنامه نویس تعیین کرده است قرار می دهد. مثال زیر را ببینید :

,


# % operator
text = "%d little pigs come out or I'll %s and %s and %s" % (3, 'huff', 'puff', 'blow down')

در این مثال به جای اینکه چندین رشته مختلف را با علمگر + به هم بچسبانیم، ابتدا شکل خروجی و ظاهر رشته مورد نظر خودمان را تعیین می کنیم و هر جا مقدار متغیری باید ظاهر شود از نماد مربوطه به آن استفاده می کنیم و در سمت راست عملگر % هم تک تک متغیرهایی که باید مقدار آنها در رشته اصلی قرار گیرد را درون یک پرانتر، ذکر می کنیم .

i18n Strings (Unicode) – کار با رشته های یونیکد

رشته ها در پایتون ۲ به صورت پیش فرض یونیکد نیستند و  فقط بایت های ساده حاوی کدهای اسکی هستند ( در پایتون ۳ این پیش فرض به یونیکد تغییر کرده است) برای ایجاد یک رشته یونیکد باید پیشوند u را قبل از آن به کار بریم.

ustring = u'A unicode \u018e string \xf1' > ustring u'A unicode \u018e string \xf1'

دقت کنید که یک رشته یونیکد نوعی متفاوت با str دارد اما چون هر دو نوع رشته های اسکی (str) و یونیکد از کلاس basestring‌ ارث بری دارند، بیشتر توابعی که با رشته های معمولی کار می کنند، رشته های یونیکد را هم می پذیرند.

برای تبدیل یک رشته یونیکد به یک رشته معمولی (آرایه ای از بایت ها) با کدینگ متفاوت مثلاً utf-8، می توان از تابع s.encode(‘utf-8’)  استفاده کرد این امر زمانی که مجبورید از توابع معمولی و قدیمی تر برای کار  با رشته ها استفاده کنید مفید خواهد بود. برای تبدیل یک رشته معمولی با کدگذاری مشخص، از تابع unicode‌ می توانید استفاده کنید که نتیجه آن یک رشته یونیکدی خواهد بود. توضیح اینکه هر کاراکتر یونیکد به دو بایت برای ذخیره سازی نیاز دارد و مکانیزم ذخیره سازی آن با رشته های معمولی متفاوت است . مثال زیر نحوه استفاده از این دو تابع را به شما نشان می دهد :


## (unistring from above contains a unicode string)
> s = unistring.encode('utf-8')
> s
'A unicode \xc6\x8e string \xc3\xb1'  ## bytes of utf-8 encoding
> t = unicode(s, 'utf-8')             ## Convert bytes back to a unicode string
> t == unistring                      ## It's the same as the original, yay!

True

دقت کنید که تابع معروف print در پایتون ۲ فقط با رشته های اسکی کار می کند و برای چاپ یک رشته یونیکد و غیر لاتین، باید حتماً از توابع فوق برای تبدیل آنها به رشته های معمولی و سپس چاپ آنها استفاده کنید. در ادامه آموزش و  در بخش کار با فایلها، مثالی را از خواندن فایلهای یونیکد و نمایش آنها به شما ارائه خواهیم کرد.

یک مزیت عمده پایتون ۳ بر پایتون ۲ راحتی کار با رشته های یونیکد در آن است که توصیه می کنیم برای کار با متون فارسی حتماً از نسخه ۳ پایتون استفاده کنید.

دستور شرطی if

پایتون از {} برای محصور کردن بلوک دستورات if,for,while  و …استفاده نمیکند.در عوض از علامت : و تورفتگی ها و فضای خالی برای نمایش گروهی از دستورات استفاده میکند.

به عنوان اولین قدم در پایتون به بررسی سریع دستور if‌ می پردازیم . در تست بولین دستور if (یعنی عبارت جلوی if) نیازی نیست که از پرانتز استفاده کنیم (تفاوت بزرگ c++ / جاوا) و دستور if ما میتواند elif و else داشته باشد.(elif: منظور مخفف دستور else if است). از طرفی، مشابه با زبان C، هر مقداری میتواند در تست بولین if استفاده بشود با این تفسیر که مقدار صفر و none و  ۰ و رشته خالی و لیست خالی و دیکشنری خالی معادل نادرست یا False‌ خواهند بود و سایر مقادیر ، همه به عنوان درست یا True در نظر گرفته می شوند.
همچنین پایتون دارای دستورات مقایسه ای ==، =، <، <=،>،> = است که بر خلاف جاوا و c عملگر == برای رشته ها هم قابل استفاده است.
عملگرهای منطقی پایتون هم and , or , not هسنتد ( پایتون از && و ||و ! سبک c استفاده نمیکند).

با این توضیحات، مثال زیر باید برای شما کاملاً قابل درک باشد :


if speed >= 80:
    print 'License and registration please'
if mood == 'terrible' or speed >= 100:
    print 'You have the right to remain silent.'
elif mood == 'bad' or speed >= 90:
    print "I'm going to have to write you a ticket."
    write_ticket()
else:
    print "Let's try to keep it under 80 ok?"

اگر برای بار اول ، خودتان کد فوق را بنویسید احتمالاً یادتان خواهد رفت که جلوی if‌ عملگر : را قرار دهید و یا اینکه شرط if را در یک پرانتز خواهید نوشت …. کمی طول می کشد تا از حال و هوای C‌ و جاوا خارج شوید (اگر قبلاً با آنها کار کرده اید). از طرفی لازم نیست آخر هر خط، سمی کالون بگذارید!!!

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


if speed >= 80: print 'You are so busted'
else: print 'Have a nice day'

با ما همراه باشید تا در جلسه آینده به لیست ها در پایتون بپردازیم …..

1 دیدگاه

  1. پیشنهاد می کنم در صورت امکان آموزش GoLang هم اضافه شود

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

دکمه بازگشت به بالا