مسیرها
/
Python
Python
/
تمرین‌ها
/
واژگان خواهر کوچک
واژگان خواهر کوچک

واژگان خواهر کوچک

تمرین یادگیری

مقدمه

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

یک مقدار ثابت 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."

>>> escapes = 'If needed, a \'slash\' can be used as an escape character within a string when switching quote styles won\'t work.'

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

>>> triple_quoted =  '''Three single quotes or "double quotes" in a row allow for multi-line string literals.
  Line break characters, tabs and other whitespace are fully supported.

  You\'ll most often encounter these 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.
    '''

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

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'
>>> 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]
>>> separator.join(upper_words)
 'upper 🌟 uppercrust 🌟 uppercase 🌟 upperclassmen 🌟 uppermost 🌟 uppercut'

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

creative = '창의적인'

>>> creative[0]
'창'

>>> creative[2]
'적'

>>> creative[3]
'인'

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

creative = '창의적인'

>>> creative[-4]
'창'

>>> creative[-2]
'적'

>>> creative[-1]
'인'

در Python نوع جداگانه‌ای به نام «نویسه» یا «رون» وجود ندارد، بنابراین نمایه‌گذاری یک رشته یک 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 = '🌟🌟🌙🌟🌟⭐'
sun_and_moon = '🌞🌙🌞🌙🌞🌙🌞🌙🌞'

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

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

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

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

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

>>> sun_and_moon[::2]
'🌞🌞🌞🌞🌞'

>>> sun_and_moon[:-2:2]
'🌞🌞🌞🌞'

>>> sun_and_moon[1:-1:2]
'🌙🌙🌙🌙'

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

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


>>> cat_ipsum.split()[-1]
'hooman.'


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

جداکننده‌های <str>.split() می‌توانند بیش از یک نویسه باشند. برای تطبیق تقسیم، از کل رشته استفاده می‌شود.


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

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

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


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

# Note that there are more code points than perceived glyphs or characters
>>> 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 :  ့

دستورالعمل‌ها

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

این تکلیف چهار فعالیت دارد که هر کدام مجموعه‌ای از متن یا واژه برای کار کردن دارند.

1. افزودن پیشوند به یک واژه

یکی از رایج‌ترین پیشوندها در انگلیسی un است که معنی «نه» می‌دهد. در این فعالیت، خواهر شما باید با افزودن un به واژه‌ها، واژه‌های منفی یا همان «نه» را بسازد.

تابع add_prefix_un(<word>) را پیاده‌سازی کنید که word را به‌عنوان پارامتر می‌گیرد و واژه‌ای تازه با پیشوند un برمی‌گرداند:

>>> add_prefix_un("happy")
'unhappy'

>>> add_prefix_un("manageable")
'unmanageable'

2. افزودن پیشوندها به گروه‌های واژه

چهار پیشوند رایج دیگر هم هست که کلاس خواهر شما روی آن‌ها کار می‌کند: en (به معنی «قرار دادن در» یا «پوشاندن با»), pre (به معنی «پیش» یا «به جلو»), auto (به معنی «خود» یا «همان») و inter (به معنی «میان» یا «در میان»).

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

تابع make_word_groups(<vocab_words>) را پیاده‌سازی کنید که vocab_words را به‌عنوان پارامتر به این شکل می‌گیرد: [<prefix>, <word_1>, <word_2> .... <word_n>]، و رشته‌ای برمی‌گرداند که پیشوند در آن به هر واژه اعمال شده و چنین شکلی دارد: '<prefix> :: <prefix><word_1> :: <prefix><word_2> :: <prefix><word_n>'.

در اینجا نیازی به ساختن حلقه‌ی for یا while برای پردازش ورودی نیست. خوب فکر کنید که به‌جای آن از کدام متدهای رشته (و جداکننده‌ها) می‌توانید استفاده کنید.

>>> make_word_groups(['en', 'close', 'joy', 'lighten'])
'en :: enclose :: enjoy :: enlighten'

>>> make_word_groups(['pre', 'serve', 'dispose', 'position'])
'pre :: preserve :: predispose :: preposition'

>> make_word_groups(['auto', 'didactic', 'graph', 'mate'])
'auto :: autodidactic :: autograph :: automate'

>>> make_word_groups(['inter', 'twine', 'connected', 'dependent'])
'inter :: intertwine :: interconnected :: interdependent'

3. حذف پسوند از یک واژه

ness پسوندی رایج است که به معنی «حالت بودن» است. در این فعالیت، خواهر شما باید با حذف پسوند ness واژه‌ی ریشه‌ی اصلی را پیدا کند. اما البته قاعده‌های املایی آزاردهنده‌ای هم هست: اگر واژه‌ی ریشه در اصل به یک حرف بی‌صدا و پس از آن «y» ختم می‌شد، آن «y» به «i» تغییر می‌کرد. حذف «ness» باید آن «y» را در چنین واژه‌های ریشه‌ای بازگرداند. مثلاً happiness --> happi --> happy.

تابع remove_suffix_ness(<word>) را پیاده‌سازی کنید که یک word می‌گیرد و واژه‌ی ریشه را بدون پسوند ness برمی‌گرداند.

>>> remove_suffix_ness("heaviness")
'heavy'

>>> remove_suffix_ness("sadness")
'sad'

4. استخراج و تبدیل یک واژه

پسوندها اغلب برای تغییر نقش دستوری یک واژه به کار می‌روند. رسمی رایج در انگلیسی «verbing» یا «verbifying» است، یعنی جایی که یک صفت با افزودن پسوند en به یک فعل تبدیل می‌شود.

در این کار، خواهر شما می‌خواهد با بیرون کشیدن یک صفت از یک جمله و تبدیل آن به فعل، روی «verbing» واژه‌ها تمرین کند. خوشبختانه همه‌ی واژه‌هایی که باید اینجا تبدیل شوند «باقاعده» هستند، یعنی برای افزودن پسوند به تغییر املایی نیازی ندارند.

تابع adjective_to_verb(<sentence>, <index>) را پیاده‌سازی کنید که دو پارامتر می‌گیرد. یک sentence که واژه‌ی واژگان در آن به کار رفته، و index آن واژه پس از جدا شدن اجزای آن جمله. تابع باید صفت استخراج‌شده را به شکل یک فعل برگرداند.

>>> adjective_to_verb('I need to make that bright.', -1 )
'brighten'

>>> adjective_to_verb('It got dark as the sun set.', 2)
'darken'
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Python Exercism

آماده‌اید واژگان خواهر کوچک را شروع کنید؟

در Exercism ثبت‌نام کنید تا Python را همراه با 17 مفهوم146 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.