آموزش رشته در پایتون
در این آموزش از کتاب برخط (Online) فارسی پایتون (Python)، نوع داده رشته (String) و کاربرد آن را مورد بررسی قرار می دهیم.
رشته یک ترتیب است
رشته ترتیبی از کارکترها می باشد. شما می توانید با استفاده از علامت کروشه به کارکترهای درون رشته دسترسی پیدا کنید:
>>> fruit = 'banana'
>>> letter = fruit[1]خط دوم مثال فوق کارکتر اول fruit را انتخاب کرده و آن را درون letter می ریزد.
عبارت درون کروشه را اندیس می نامند. اندیس به کاراکترهای درون یک ترتیب اشاره می کند.
ولی ممکن است چیزی را انتظار خواهید داشت را دریافت نکنید:
>>> print letter
aبرای اکثر افراد، اولین حرف از کلمه 'banana' حرف b می باشد، نه حرف a. ولی در علوم کامپیوتر اندیس اولین قسمت از رشته می باشد، و اولین قسمت صفر می باشد.
>>> letter = fruit[0]
>>> print letter
bبنابراین شاید بتوان به حالت طنز گفت که b صفرومین حرف 'banana' می باشد، a اولین و n نیز دومین حرف آن می باشد.
شما می توانید برای اندیس از هر عبارتی، شال متغیرها و عملگرهای استفاده کنید، ولی باید بخاطر داشت مقدار اندیس باید یک integer باشد، در غیر این صورت شما خطای زیر را دریافت خواهید کرد:
>>> letter = fruit[1.5]
TypeError: string indices must be integersطول رشته
len یک تابع داخلی پایتون می باشد که تعداد کاراکترهای موجود در یک رشته را بر می گرداند.
>>> fruit = 'banana'
>>> len(fruit)
6برای بدست آوردن آخرین حرف یک رشته، شما ممکن است همچین کاری را انجام دهید:
>>> length = len(fruit)
>>> last = fruit[length]
IndexError: string index out of rangeدلیل خطای فوق این است که هیچ در 'banana' با اندیس 6 وجود ندارد. به این دلیل که ما شمارش را از صفر شروع کردیم 6 حرف مورد نظر از 0 تا 5 شماره گذاری شده اند. برای بدست آوردن آخرین کاراکتر، شما باید یک واحد از lenght کم کنید.
>>> last = fruit[length-1]
>>> print last
aهمچنین شما می توانید از اندیس های منفی استفاده کنید، که به صورت بر عکس، یعنی از ابتدا به انتها رشته را شمارش می کند. عبارت fruit[-1] نشان دهنده اندیس آخر، fruit[-2] نشان دهنده اندیس یکی مانده به آخر می باشد و الی آخر ...
پیمایش با حلقه for
بسیاری از محاسبات نیاز به پردازش رشته دارند به طوری بتوانند در هربار یکی از کاراکترهای رشته را در اختیار داشته باشند و به نوبت هر کاراکتر را انتخاب کرده و کاری را روی آن انجام دهند و این موضوع را تا پایان رشته ادامه دهند. این الگوی پردازش پیمایش نام دارد. یکی از راه های نوشتن پیمایش استفاده از حلقه while می باشد:
index = 0
while index < len(fruit):
letter = fruit[index]
print letter
index = index 1این حلقه رشته را پیمایش کره و حروف داخل رشته را جدا جدا نمایش می دهد. شرط حلقه index < len(fruit) می باشد، بنابراین زمانی که index برابر با طول رشته شود، شرط False می شود، و بدنه حلقه دیگر اجرا نخواهد شد. آخرین کاراکتر مورد دسترسی اندیس len(fruti) - 1 می باشد، که آخرین کاراکتر رشته خواهد بود.
تمرین 1
تابعی بنویسید که یک رشته را به عنوان آرگومان دریافت کرده و حروف آن را به صورت وارونه نمایش دهد.
روش دیگر نوشتن یک پیمایش با استفاده از حلقه for می باشد:
for char in fruit:
print charهر بار درون حلقه، کاراکتر بعدی درون رشته به متغیر char نسبت داده می شود. حلقه تا جایی ادامه پیدا می کند که دیگر هیچ کارکتری درون رشته باقی نماند.
مثال زیر نحوه استفاده از به هم متصل کردن رشته و یک حلقه for برای تولید یک سری حروف به ترتیب حروف الفبا را نشان می دهد. در کتاب make Way for Ducklings اثر Robert McCloskey نام جوجه اردک ها Jack، Kack، Lack، Mak، Nack، Ouack، Pack و Ouack می باشد، خروجی حلقه زیر این نام ها را به ترتیب چاپ می کند.
prefixes = 'JKLMNOPQ'
suffix = 'ack'
for letter in prefixes:
print letter suffix
The output is:
Jack
Kack
Lack
Mack
Nack
Oack
Pack
Qackالبته، خروجی به طور کامل صحیح نیست، "Oauck" و "Quack" از نظر املایی غلط می باشند.
تمرین 2
کد فوق را جهت رفع مشکل اصلاح کنید.
برش های رشته
یک بند از یک رشته را یک برش می گویند. انتخاب یک برش، دقیقا انتخاب یک کاراکتر است.
>>> s = 'Monty Python'
>>> print s[0:5]
Monty
>>> print s[6:12]
Pythonعملگر [n:m] بخشی از رشته یعنی رشته را از کاراکتر n تا بر می گرداند، که شامل اولین برش یعنی عدد n می شود، ولی شامل m نمی شود. این رفتار کمی عجیب به نظر می رشد، ولی ممکن است همانطور که در تصویر 8-1 مشاهده می کنید به این تصور کمک کند که نقطه اندیس بین کارکترها می باشد.
شکل 1-8 | |
![]() | |
در صورتیکه اندیس اول (قبل از : را) از قلم بیاندازید، برش از ابتدا رشته شروع می کند و همچنین در صورتیکه اندیس دوم را از قلم بیاندازید، برش تا انتهای رشته ادامه پیدا می کند.
>>> fruit = 'banana'
>>> fruit[:3]
'ban'
>>> fruit[3:]
'ana'در صورتیکه اندیس اول بزرگتر یا مساوی اندیس دوم باشد، نتیجه یک رشته خالی خواهد بود که درون علامت کتیشن قرار خواهد گرفت.
>>> fruit = 'banana'
>>> fruit[3:3]
''یک رشته خالی حاوی هیچ کارکتری نبوده و طول آن 0 می باشد، ولی با این حال مانند باقی رشته ها خواهد بود.
رشته ها تغییر ناپذیر هستند
به نظر وسوسه انگیز می رسد به منظور تغییر یک کاراکتر در رشته از عملگر [] در سمت چپ یک انتساب استفاده کرد برای مثال:
>>> greeting = 'Hello, world!'
>>> greeting[0] = 'J'
TypeError: object does not support item assignment"object" در مثال فوق رشته و "item" کارکتری است که انتساب داده شده است. فعلا یک شیء همان مقدار می باشد، ولی بعدا شیء را به تفصیل توضیح خواهیم داد. item یکی از مقادیر موجود در ترتیب (sequence) می باشد.
دلیل خطای فوق این که است که رشته تغییر ناپذیر است، بدین معنی که نمی توان یک رشته موجود را تغییر داد. بهترین راهکار استفاده از یک رشته جدید است.
>>> greeting = 'Hello, world!'
>>> new_greeting = 'J' greeting[1:]
>>> print new_greeting
Jello, world!مثال فوق یک حرف جدید را به عنوان اولین حرف به برش greeting متصل می کند. انتساب فوق هیچ تاثیری بر رشته اصلی ندارد.
جستجو کردن
تابع زیر چه کاری انجام می دهد؟
def find(word, letter):
index = 0
while index < len(word):
if word[index] == letter:
return index
index = index 1
return -1در یک معنا، تابع فوق نقطه مقابل عملگر [] می باشد، بدین معنی که، به جای اینکه یک اندیس را گرفته و کاراکتر مرتبط با آن را بر گرداند، یک کاراکتر را گرفته و اندیس مربوط به کاراکتر را بر می گرداند. در صورتیکه کاراکتر مورد نظر پیدا نشود تابع -1 بر می گرداند.
این اولین مثالی است که جمله return درون حلقه قرار گرفته است. در صورتیکه word[index] == letter باشد، تابع حلقه را شکسته و به سرعت برگردانده می شود.
در صورتیکه کاراکتر در رشته وجود نداشته باشد، برنامه به طور عادی از حلقه خارج شده و -1 را بر می گرداند.
این توع الگوی محاسبه یعنی: پیمایش یک ترتیب و برگرداندن، هنگامی که چیزی که به دنبالش می باشیم را پیدا کردیم را جستجو می نامند.
استفاده از حلقه و شمارشگر
برنامه زیر تعداد کاراکتر a موجود در رشته را حساب می کند.
word = 'banana'
count = 0
for letter in word:
if letter == 'a':
count = count 1
print countبرنامه فوق الگوی محاسبه دیگری را نشان می دهد که شمارشگر نام دارد. متغیر count با مقدار اولیه 0 ایجاد شده و هر بار که کاراتر a در رشته یافت می شود یک واحد به آن اضافه می گردد. زمانی که حلقه خارج شود، متغیر count حاوی نتیجه خواهد بود یعنی تعداد a های موجود در رشته.
متدهای رشته
یک متد چیزی شبیه به تابع می باشد، بدین معنی که آرگون هایی را دریافت کرده و یک مقدار بر می گرداند، ولی در syntax با یکدیگر متفاوت هستند. برای مثال. برای مثال، متد upper یک رشته را دریافت کرده و یک رشته جدید بر می گرداند که در آن تمامی حروف به حروف بزرگ تبدیل شده اند.
به جای استفاده از یک تابع به عنوان مثال upper(word)، در مثال زیر از syntax متد استفاده شده است: word.upper().
>>> word = 'banana'
>>> new_word = word.upper()
>>> print new_word
BANANAاین حالت از نقطه گذاری نام متد را مشخص می کند، که upper می باشد، و نام رشته ای که متد بر روی آن اجرا می شود word می باشد. پرانتزهای خالی نشانگر این هستند که متد هیچ آرگومانی دریافت نمی کند.
اینگونه استفاده از متد را فراخوانی می نامند؛ در مورد فوق، خواهیم گفت که، ما در حال فراخوانی upper در word می باشیم.
همانطور که معلوم است، یک متد رشته با نام find وجود دارد که به طور قابل ملاحظه ای شبیه به تابعی است که پیش از این نوشتیم:
>>> word = 'banana'
>>> index = word.find('a')
>>> print index
1در مثال فوق، ما متد find را فراخوانی کرده و حرف مورد نظر خود را به عنوان پارامتر به آن ارسال کردیم.
در واقع، متد find کلی تر از تابعی است که ما قبلا نوشتیم، این متد نه تنها می تواند کاراکتر را پیدا کند، بلکه زیر رشته ها را نیز پیدا می کند:
>>> word.find('na')
2همچنین متد فوق یک آرگومان دیگر نیز دریافت می کند که مشخص می کند جستجو از کدام اندیس شروع شود:
>>> word.find('na', 3)
4بعلاوه آرگومان سوم که مشخص می کند جستجو در کدام اندیس پایان یابد:
>>> name = 'bob'
>>> name.find('b', 1, 2)
-1جستجوی فوق موفق نبود چرا که b در محدوده اندیس 1 تا 2 (نه خود 2) وجود نداشت.
عملگر in
کلمه in یک عملگر boolean می باشد که دو رشته را گرفته و در صورتی که رشته اول زیر رشته یا زیر مجموعه رشته دوم باشد مقدار True بر می گرداند.
>>> 'a' in 'banana'
True
>>> 'seed' in 'banana'
Falseبراث مثال، تابع زیر تمام حروف word1 را در صورتی که درون word2 باشد چاپ می کند.
def in_both(word1, word2):
for letter in word1:
if letter in word2:
print letterدر صورتیکه از نام های درست استفاده کنید، پایتون گاهی اوقات مانند زبان انگلیسی خوانده می شود: “for (each) letter in (the first) word, if (the) letter (appears) in (the second) word, print (the) letter.”
در زیر نتیجه مقایسه apples با oranges را با استفاده از تابع نوشته مشاهده می کنید:
>>> in_both('apples', 'oranges')
a
e
sمقایسه رشته ها
عملگرهای انتسابی برای رشته ها استفاده می شوند. مقایسه این که آیا دو رشته با هم مساوی هستند:
if word == 'banana':
print 'All right, bananas.'عملگرهای انتسابی دیگر برای قرار دادن لغات به ترتبی حروف الفبا کاربرد خواهند داشت:
if word < 'banana':
print 'Your word,' word ', comes before banana.'
elif word > 'banana':
print 'Your word,' word ', comes after banana.'
else:
print 'All right, bananas.'پایتون حروف بزرگ و کوچک را به همان روشی که در دنیای واقعی ما از آستفاده می کنیم، کنترل نمی کند. تمامی حروف بزرگ قبل از حروف کوچک می آیند، بنابراین:
Your word, Pineapple, comes before banana.رایج ترین روش برای درست کردن این مشکل این است که، قبل از انجام عمل مقایسه، رشته ها را به حروف کوچک تبدیل کنیم.
