رش

رشته در Python

83 تمرین

درباره‌ی رشته

‏str در پایتون یک دنباله‌ی تغییرناپذیر از نقطه‌های کد یونیکد است. این‌ها می‌توانند شامل حروف، نشانه‌های اعراب، نویسه‌های موقعیت‌دهی، اعداد، نمادهای واحد پول، اموجی، نشانه‌گذاری، فاصله و نویسه‌های شکستن خط و موارد دیگر باشند.

برای بررسی عمیق اینکه یک رشته چه اطلاعاتی را رمزگذاری می‌کند (یا، «یک کامپیوتر چگونه می‌داند صفرها و یک‌ها را به حروف تبدیل کند؟»)، این پست وبلاگ همیشه کمک‌کننده است. مستندات پایتون هم یک آموزش یونیکد بسیار مفصل ارائه می‌دهد که به پشتیبانی پایتون از مشخصات یونیکد در ماژول‌های str، bytes و re، ملاحظات مربوط به زبان‌های محلی و برخی مشکلات رایج در رمزگذاری و ترجمه می‌پردازد.

رشته‌ها همه‌ی عملیات رایج دنباله را پیاده‌سازی می‌کنند و می‌توان با نحو for item in <str> یا for index, item in enumerate(<str>) روی آن‌ها پیمایش کرد. هر نقطه‌ی کد (رشته‌های با طول ۱) را می‌توان با شماره‌ی 0-based index از سمت چپ یا شماره‌ی -1-based index از سمت راست ارجاع داد.

رشته‌ها را می‌توان با <str> + <other str> یا <str>.join(<iterable>) به هم چسباند و با <str>.split(<separator>) تقسیم کرد. همچنین گزینه‌های بیشتری برای قالب‌بندی، سرهم‌بندی و الگوسازی ارائه می‌دهند.

یک مقدار ثابت str را می‌توان با کوتیشن تک ' یا دوگانه " تعریف کرد. نویسه‌ی فرار \ در صورت نیاز در دسترس است.


>>> single_quoted = 'These allow "double quoting" without "escape" characters.'

>>> double_quoted = "These allow embedded 'single quoting', so you don't have to use an 'escape' character."

رشته‌های چندخطی با ''' یا """ تعریف می‌شوند.

>>> triple_quoted = '''Three single quotes or "double quotes" in a row allow for multi-line string literals.
  Line break characters, tabs and other whitespace is fully supported. Remember - The escape "\" character is also available if needed (as can be seen below). 
  
  You\'ll most often encounter multi-line strings as "doc strings" or "doc tests" written just below the first line of a function or class definition.
    They\'re often used with auto documentation ✍ tools.
    '''

سازنده‌ی str(<object>) را می‌توان برای ساختن یا تبدیل رشته‌ها از سایر اشیا به کار برد:

>>> my_number = 42
>>> str(my_number)
...
"42"

هرچند می‌توان از سازنده‌ی str(<object>) برای تبدیل رشته‌ها استفاده کرد، اما شیء را پیمایش یا باز نمی‌کند. این با رفتار سازنده‌های سایر انواع داده مثل list()، set()، dict() یا tuple() تفاوت دارد و می‌تواند نتایج غافلگیرکننده‌ای داشته باشد.

>>> numbers = [1,3,5,7]
>>> str(numbers)
...
'[1,3,5,7]'

نقطه‌های کد درون یک str را می‌توان با شماره‌ی 0-based index از سمت چپ ارجاع داد:

creative = '창의적인'

>>> creative[0]
'창'

>>> creative[2]
'적'

>>> creative[3]
'인'

نمایه‌گذاری از سمت راست هم کار می‌کند و با -1-based index شروع می‌شود:

creative = '창의적인'

>>> creative[-4]
'창'

>>> creative[-2]
'적'

>>> creative[-1]
'인'

در پایتون نوع جداگانه‌ای به اسم «نویسه» یا «رون» وجود ندارد، بنابراین نمایه‌گذاری یک رشته یک str جدید با طول ۱ تولید می‌کند:


>>> website = "exercism"
>>> type(website[0])
<class 'str'>

>>> len(website[0])
1

>>> website[0] == website[0:1] == 'e'
True

زیررشته‌ها را می‌توان با نماد برش و با استفاده از <str>[<start>:<stop>:<step>] انتخاب کرد تا رشته‌ی جدیدی تولید شود. نتیجه شامل نمایه‌ی stop نمی‌شود. اگر start داده نشود، نمایه‌ی شروع ۰ خواهد بود. اگر stop داده نشود، نمایه‌ی stop انتهای رشته خواهد بود.

moon_and_stars = '🌟🌟🌙🌟🌟⭐'

>>> moon_and_stars[1:4]
'🌟🌙🌟'

>>> moon_and_stars[:3]
'🌟🌟🌙'

>>> moon_and_stars[3:]
'🌟🌟⭐'

>>> moon_and_stars[:-1]
'🌟🌟🌙🌟🌟'

>>> moon_and_stars[:-3]
'🌟🌟🌙'

رشته‌ها را می‌توان با <str>.split(<separator>) به رشته‌های کوچک‌تر شکست، که یک list از زیررشته‌ها برمی‌گرداند. استفاده از <str>.split() بدون هیچ آرگومانی رشته را روی فاصله‌های خالی تقسیم می‌کند.

>>> cat_ipsum = "Destroy house in 5 seconds command the hooman."
>>> cat_ipsum.split()
...
['Destroy', 'house', 'in', '5', 'seconds', 'command', 'the', 'hooman.']


>>> cat_words = "feline, four-footed, ferocious, furry"
>>> cat_words.split(',')
...
['feline', ' four-footed', ' ferocious', ' furry']


>>> colors = """red,
orange,
green,
purple,
yellow"""

>>> colors.split(',\n')
['red', 'orange', 'green', 'purple', 'yellow']

رشته‌ها را می‌توان با عملگر + به هم چسباند. این روش را باید کم به کار برد، چون کارایی چندانی ندارد و نگهداری‌اش آسان نیست.

language = "Ukrainian"
number = "nine"
word = "дев'ять"

sentence = word + " " + "means" + " " + number + " in " + language + "."

>>> print(sentence)
...
"дев'ять means nine in Ukrainian."

اگر قرار است یک list، tuple، set یا مجموعه‌ی دیگری از رشته‌های جداگانه در یک str واحد ترکیب شود، <str>.join(<iterable>) گزینه‌ی بهتری است:

# str.join() makes a new string from the iterables elements.
>>> chickens = ["hen", "egg", "rooster"] # Lists are iterable.
>>> ' '.join(chickens)
'hen egg rooster'

# Any string can be used as the joining element.
>>> ' :: '.join(chickens)
'hen :: egg :: rooster'

>>> ' 🌿 '.join(chickens)
'hen 🌿 egg 🌿 rooster'


# Any iterable can be used as input.
>>> flowers = ("rose", "daisy", "carnation")  # Tuples are iterable.
>>> '*-*'.join(flowers)
'rose*-*daisy*-*carnation'

>>> flowers = {"rose", "daisy", "carnation"}  # Sets are iterable, but output order is not guaranteed.
>>> '*-*'.join(flowers)
'rose*-*carnation*-*daisy'

>>> phrase = "This is my string"  # Strings are iterable, but be careful!
>>> '..'.join(phrase)
'T..h..i..s.. ..i..s.. ..m..y.. ..s..t..r..i..n..g'


# Separators are inserted **between** elements, but can be any string (including spaces).
# This can be exploited for interesting effects.
>>> under_words = ['under', 'current', 'sea', 'pin', 'dog', 'lay']
>>> separator = ' ⤴️ under' # Note the leading space, but no trailing space.
>>> separator.join(under_words)
'under ⤴️ undercurrent ⤴️ undersea ⤴️ underpin ⤴️ underdog ⤴️ underlay'

# The separator can be composed different ways, as long as the result is a string.
>>> upper_words = ['upper', 'crust', 'case', 'classmen', 'most', 'cut']
>>> separator = ' 🌟 ' + upper_words[0] # This becomes one string, similar to ' ⤴️ under'.
>>> separator.join(upper_words)
 'upper 🌟 uppercrust 🌟 uppercase 🌟 upperclassmen 🌟 uppermost 🌟 uppercut'

رشته‌ها همه‌ی عملیات رایج دنباله را پشتیبانی می‌کنند. هر نقطه‌ی کد را می‌توان در یک حلقه با for item in <str> پیمایش کرد. نمایه‌ها همراه با عناصر را می‌توان در یک حلقه با for index, item in enumerate(<str>) پیمایش کرد.


>>> exercise = 'လေ့ကျင့်'

# Note that there are more code points than perceived glyphs or characters.
# Care should be used when iterating over languages that use
# combining characters, or when dealing with emoji.
>>> for code_point in exercise:
...    print(code_point)
...
လ
ေ
့
က
ျ
င
်
့

# Using enumerate will give both the value and index position of each element.
>>> for index, code_point in enumerate(exercise):
...    print(index, ": ", code_point)
...
0 :  လ
1 :  ေ
2 :  ့
3 :  က
4 :  ျ
5 :  င
6 :  ်
7 :  ့

متدهای رشته

پایتون مجموعه‌ی غنی‌ای از متدهای رشته ارائه می‌دهد که می‌توانند در جست‌وجو، پاک‌سازی، تقسیم، تبدیل، ترجمه و بسیاری عملیات دیگر کمک کنند. گزیده‌ای از این متدها در تمرین دیگری پوشش داده شده است.

قالب‌بندی

پایتون همچنین مجموعه‌ی غنی‌ای از ابزارها برای قالب‌بندی و الگوسازی رشته‌ها ارائه می‌دهد و پردازش متن پیشرفته‌تر را از طریق ماژول‌های re (عبارات باقاعده)، difflib (مقایسه‌ی دنباله) و textwrap ممکن می‌کند. برای آشنایی عالی با قالب‌بندی رشته در پایتون، این پست در Real Python را ببینید. برای آشنایی با متدهای رشته، Strings and Character Data in Python را در همان سایت ببینید.

انواع و رمزگذاری‌های مرتبط

علاوه بر str (یک دنباله‌ی متنی)، پایتون انواع دنباله‌ی دودویی متناظری دارد که در سرویس‌های داده‌ی دودویی خلاصه شده‌اند: bytes (یک دنباله‌ی دودویی)، bytearray و memoryview برای ذخیره‌سازی و پردازش کارآمد داده‌ی دودویی. علاوه بر این، Streams امکان فرستادن و دریافت داده‌ی دودویی روی یک اتصال شبکه را بدون استفاده از کال‌بک فراهم می‌کنند.

ویرایش از طریق GitHub این پیوند در پنجره یا زبانه‌ی جدیدی باز می‌شود

رشته را یاد بگیرید

تمرین کردن قفل شده است

برای تمرین رشته قفل 4 تمرین دیگر را باز کنید