ساختارهای داده

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

پایتون چهار ساختار داده داخلی دارد- list, tuple, dictionary و set. در این بخش خواهیم دید که چگونه از آنها استفاده کنیم و چگونه می توانند زندگی آسان تری را برای ما رقم بزنند.

List

یک list ساختار داده ای است که مجموعه ای مرتب از آیتم ها را در خود نگهداری می کند؛ یعنی شما قادر هستید دنباله ای از آیتم ها را در یک list ذخیره کنید. تصور کردن آن آسان است، مثلاً فهرستی از کالاهایی را در نظر بگیرید که قصد خرید آنها را دارید. با این تفاوت که احتمالاً در فهرست خریدتان هر مورد را در یک خط جداگانه می نویسید، درحالی که در پایتون بین هر آیتم ویرگول می گذاریم.

عناصر یک لیست باید درون براکت قرار بگیرند تا پایتون متوجه شود که شما درحال تعریف یک لیست هستید. پس از ایجاد یک لیست، می توانید عناصر موجود در آن را اضافه، حذف یا جست و جو کنید. از آنجایی که امکان اضافه یا حذف کردن عناصر وجود دارد، می گوییم list یک نوع داده تغییرپذیر است یعنی می توان داده های آن را تغییر داد.

مقدمه ای کوتاه بر شئ ها و کلاس ها

اگرچه تا اینجا به طور کلی بحث درباره اشیا و کلاس ها را به تعویق انداخته ام، توضیح مختصری نیاز است تا بتوانید مفهوم لیست ها را بهتر درک کنید. این موضوع را در later chapter با جزئیات بیشتری توضیح خواهم داد.

یک لیست نمونه ای از کاربرد اشیا و کلاس ها است. زمانی که از متغیری مانند i استفاده می کنیم و مقداری مانند عدد صحیح 5 را به آن نسبت می دهیم، می توانید آن را به عنوان ایجاد یک شئ (یعنی نمو نه ای) به نام i از کلاس (یعنی نوع) int در نظر بگیرید. در واقع، می توانید برای درک بهتر این موضوع help(int) را مطالعه کنید.

یک کلاس می تواند نیز روش هایی (methods) داشته باشد؛ یعنی توابعی که برای استفاده در ارتباط با همان کلاس تعریف شده اند. این قابلیت ها را فقط زمانی می توانید استفاده کنید که یک شئ از آن کلاس را در اختیار داشته باشید. برای مثال، پایتون روش append را برای کلاس list فراهم کرده است که به شما این اجازه را می دهد یک آیتم را به انتهای لیست اضافه کنید. به عنوان مثال، mylist.append('an item') رشته مورد نظر را به لیست mylist اضافه می کند. توجه کنید که برای دسترسی به روش های اشیا از نشانه گذاری نقطه ای استفاده می شود.

یک کلاس نیز می تواند فیلدهایی (fields) داشته باشد که چیزی جز متغیرهایی نیست که برای ارتباط با همان کلاس تعریف شده اند. این متغیرها/نام ها را تنها زمانی می توانید استفاده کنید که یک شئ از آن کلاس را داشته باشید. فیلدها نیز با استفاده از نشانه گذاری نقطه ای قابل دسترس هستند؛ برای مثال، mylist.field.

مثال را تحت عنوان ds_using_list.py ذخیره کنید:

# This is my shopping list
shoplist = ['apple', 'mango', 'carrot', 'banana']

print('I have', len(shoplist), 'items to purchase.')

print('These items are:', end=' ')
for item in shoplist:
    print(item, end=' ')

print('\nI also have to buy rice.')
shoplist.append('rice')
print('My shopping list is now', shoplist)

print('I will sort my list now')
shoplist.sort()
print('Sorted shopping list is', shoplist)

print('The first item I will buy is', shoplist[0])
olditem = shoplist[0]
del shoplist[0]
print('I bought the', olditem)
print('My shopping list is now', shoplist)

خروجی:

$ python ds_using_list.py
I have 4 items to purchase.
These items are: apple mango carrot banana
I also have to buy rice.
My shopping list is now ['apple', 'mango', 'carrot', 'banana', 'rice']
I will sort my list now
Sorted shopping list is ['apple', 'banana', 'carrot', 'mango', 'rice']
The first item I will buy is apple
I bought the apple
My shopping list is now ['banana', 'carrot', 'mango', 'rice']

نحوۀ عملکرد

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

همچنین از حلقۀ for..in برای پیمایش در سراسر آیتم های لیست استفاده کرده ایم. تا به اینجا، باید متوجه شده باشید که یک لیست نیز یک دنباله است. ویژگی دنباله ها را در later section مورد بررسی قرار خواهیم داد.

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

سپس با استفاده از روش append مربوط به شئ لیست، یک آیتم را به لیست اضافه می کنیم؛ همان طور که پیش تر توضیح داده شد. در مرحله بعد، با پرینت محتوای لیست، بررسی می کنیم که آیا آیتم موردنظر واقعاً به لیست اضافه شده است یا خیر. برای انجام این کار، کافی است لیست را به تابع print بدهیم تا محتوای آن را به شکل مرتبی نمایش دهد.

در مرحلۀ بعد، با استفاده از روش sort متعلق به لیست، لیست را مرتب می کنیم. مهم این است که بدانید این روش بر خود لیست تاثیر می گذارد و یک لیست تغییر یافته را بر نمی گرداند؛ این رفتار با نحوۀ عملکرد رشته ها متفاوت است. منظور ما از اینکه، لیست ها تغییرپذیر و رشته ها تغییرناپذیر هستند، نیز همین است.

سپس، هنگامی که خرید یک کالا در مارکت به پایان می رسد، می خواهیم آن را از لیست حذف کنیم. با استفاده از دستور del می توانیم به این هدف دست پیدا کنیم. در اینجا مشخص می کنیم کدام عنصر لیست باید حذف شود و دستور del آن را برای ما از لیست حذف می کند. ما مشخص می کنیم که می خواهیم نخستین عنصر لیست حذف شود، بنابراین از del shoplist[0] استفاده می کنیم. (به خاطر داشته باشید شمارش در پایتون از صفر آغاز می شود).

اگر می خواهید تمام روش های تعریف شده برای شئ لیست را مشاهده کنید، برای جزئیات بیشتر help(list) را ببینید.

تاپل (Tuple)

از تاپل ها برای نگهداری چند شئ در کنار یکدیگر استفاده می شوند. می توانید آنها را شبیه به لیست ها در نظر بگیرید، اما تاپل ها بسیاری از قابلیت هایی را که کلاس list در اختیار شما قرار می دهد ندارند. ویژگی اصلی تاپل ها این است که مانند رشته تغییرناپذیر هستند یعنی شما نمی توانید محتوای یک تاپل را تغییر دهید.

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

تاپل ها معمولاً در شرایطی استفاده می شوند که یک دستور یا یک تابع تعریف شده توسط کاربر بتواند با اطمینان فرض کند مجموعۀ مقادیر مورد نظر (یعنی تاپل مقادیر) تغییر نخواهد کرد.

مثال را با نام ds_using_tuple.py ذخیره کنید.

# I would recommend always using parentheses
# to indicate start and end of tuple
# even though parentheses are optional.
# Explicit is better than implicit.
zoo = ('python', 'elephant', 'penguin')
print('Number of animals in the zoo is', len(zoo))

new_zoo = 'monkey', 'camel', zoo    # parentheses not required but are a good idea
print('Number of cages in the new zoo is', len(new_zoo))
print('All animals in new zoo are', new_zoo)
print('Animals brought from old zoo are', new_zoo[2])
print('Last animal brought from old zoo is', new_zoo[2][2])
print('Number of animals in the new zoo is',
      len(new_zoo)-1+len(new_zoo[2]))

خروجی:

$ python ds_using_tuple.py
Number of animals in the zoo is 3
Number of cages in the new zoo is 3
All animals in new zoo are ('monkey', 'camel', ('python', 'elephant', 'penguin'))
Animals brought from old zoo are ('python', 'elephant', 'penguin')
Last animal brought from old zoo is penguin
Number of animals in the new zoo is 5

نحوۀ عملکرد

متغیر zoo به یک تاپل از آیتم ها اشاره دارد. مشاهده می کنیم که تابع len را می توان برای به دست آوردن طول تاپل استفاده کرد. این موضوع همچنین نشان می دهد که یک تاپل یک sequence نیز هست.

اکنون حیوانات را به یک باغ وحش جدید منتقل می کنیم، زیرا باغ وحش قدیمی درحال بسته شدن است. بنابراین، تاپل new_zoo شامل تعدادی حیوان است که از قبل در آنجا حضور دارند و همچنین حیواناتی که از باغ وحش قدیمی منتقل شده اند. خارج از این مثال، توجه داشته باشید که قرار کرفتن یک تاپل درون تاپل دیگر، هویت آن را از بین نمی برد.

می توانیم با مشخص کردن موقعیت یک آیتم درون یک جفت براکت، به عناصر تاپل دسترسی پیدا کنیم؛ درست مانند کاری که با لیست ها انجام دادیم. این کار عملگر اندیس گذاری (indexing) نام دارد. برای دسترسی به سومین آیتم در تاپل new_zoo از new_zoo[2] استفاده می کنیم و برای دسترسی به سومین عنصر سومین عنصر موجود در تاپل new_zoo از new_zoo[2][2] استفاده می کنیم. پس از درک این الگو، انجام آن بسیار ساده خواهد بود.

تاپل با 0 یا 1 عنصر

یک تاپل خالی با استفاده از یک جفت پرانتز خالی ساخته می شود مانند () = myempty. با این حال، تعریف تاپل با یک عنصر ساده نیست. باید پس از اولین (و تنها) آیتم، یک ویرگول قرار دهید تا پایتون بتواند بین یک تاپل و یک جفت پرانتز که یک شئ را در بر گرفته است، تمایز قائل شود. بنابراین اگر منظورتان ساخت تاپلی شامل عدد 2 است، باید بنویسید: singleton = (2, ).

نکته ای برای برنامه نویسان Perl

یک لیست درون یک لیست، هویت خود را از دست نمی دهد؛ یعنی بر خلاف Perl، لیست ها در پایتون تخت (flattened) نمی شوند. همین موضوع دربارۀ تاپل درون تاپل، یا تاپل درون لیست، یا لیست درون تاپل و موارد مشابه نیز صدق می کند. از دید پایتون، همه این ها صرفاً اشیائی هستند که درون یک شئ دیگر ذخیره شده اند.

دیکشنری(Dictionary)

یک دیکشنری شبیه یک دفترجه آدرس/تلفن است یعنی شما می توانید با دانستن نام یک شخص، آدرس یا اطلاعات تماس او را پیدا کنید. به بیان دیگر، در دیکشنری کلیدها (نام) را به مقادیر(جزئیات)، مرتبط می کنیم. توجه داشته باشید که کلید باید یکتا باشد؛ درست همانطور که اگر دو نفر دقیقاً نام های یکسانی داشته باشند، نمی توانید به تنهایی از روی نام اطلاعات صحیح را تشخیص دهید.

توجه کنید که برای کلیدهای دیکشنری فقط می توانید از اشیای تغییر ناپذیر (مانند رشته ها) استفاده کنید، اما مقادیر دیکشنری می توانند هم اشیای تغییرناپذیر و هم تغییرپذیر باشند. به بیان ساده، برای کلیدها فقط از اشیای ساده استفاده کنید.

جفت های کلیدها و مقادیر در یک دیکشنری با استفاده از ساختار d = {key1 : value1, key2 : value2} مشخص می شوند. توجه کنید که بین کلید و مقدار از دو نقطه استفاده می شود و جفت های کلید-مقدار نیز با ویرگول از یکدیگر جدا می شوند؛ همۀ این موارد نیز درون یک جفت آکولاد قرار می گیرند.

به خاطر داشته باشید که جفت های کلید-مقدار در دیکشنری به صورت ذاتی ترتیب خاصی ندارند. اگر ترتیب مشخصی می خواهید، باید پیش از استفاده از آنها خودتان آنها را مرتب کنید.

دیکشنری هایی که استفاده می کنید نمونه ها یا اشیائی از کلاس dict هستند.

مثال را تحت عنوان ds_using_dict.py ذخیره کنید:

# 'ab' is short for 'a'ddress'b'ook

ab = {
    'Swaroop': 'swaroop@swaroopch.com',
    'Larry': 'larry@wall.org',
    'Matsumoto': 'matz@ruby-lang.org',
    'Spammer': 'spammer@hotmail.com'
}

print("Swaroop's address is", ab['Swaroop'])

# Deleting a key-value pair
del ab['Spammer']

print('\nThere are {} contacts in the address-book\n'.format(len(ab)))

for name, address in ab.items():
    print('Contact {} at {}'.format(name, address))

# Adding a key-value pair
ab['Guido'] = 'guido@python.org'

if 'Guido' in ab:
    print("\nGuido's address is", ab['Guido'])

خروجی:

$ python ds_using_dict.py
Swaroop's address is swaroop@swaroopch.com

There are 3 contacts in the address-book

Contact Swaroop at swaroop@swaroopch.com
Contact Matsumoto at matz@ruby-lang.org
Contact Larry at larry@wall.org

Guido's address is guido@python.org

نحوۀ عملکرد

با استفاده از ساختاری که پیش تر توضیح دادیم، دیکشنری ab را ایجاد می کنیم. سپس با مشخص کردن کلید با استفاده از عملگر اندیس گذاری، به جفت های کلید-مقدار دسترسی پیدا می کنیم؛ درست مانند چیزی که در لیست ها و تاپل ها توضیح داده شد. نحو ساده را مشاهده کنید.

می توانیم جفت های کلید-مقدار را با استفاده از دوست قدیمی مان یعنی دستور del، حذف کنیم. کافیست دیکشنری و عملگر اندیس گذاری را برای کلیدی که باید حذف شود، مشخص کنیم و آن را به دستور del بدهیم. برای این کار نیازی نیست مقدار مربوط به کلید را بدانیم.

سپس، با استفاده از روش items دیکشنری به تک تک جفت های کلید-مقدار دسترسی پیدا می کنیم. این روش لیستی از تاپل ها را بر می گرداند که هر تاپل شامل یک جفت آیتم است_ کلید با مقدار همراه است. با استفاده از حلقۀ for..in این جفت ها را دریافت کرده و به ترتیب در متغیرهای name و address قرار می دهیم و سپس این مقادیر را در بلوک for پرینت می کنیم.

می توانیم با استفاده از عملگر اندیس گذاری و اختصاص یک مقدار به کلید، جفت های کلید-مقدار جدیدی نیز اضافه کنیم؛ همان کاری که در مثال بالا برای Guido انجام داده ایم.

شما قادر هستید با استفاده از عملگر in بررسی کنید که آیا یک کلید در دیکشنری وجود دارد یا خیر.

برای مشاهده لیستی از روش های کلاس dict، به help(dict) مراجعه کنید.

آرگومان های کلیدی و دیکشنری ها

اگر در توابع خود از آرگومان های کلیدی استفاده کرده باشید، در واقع از دیکشنری ها استفاده کرده اید! کمی به این موضوع فکر کنید جفت کلید-مقدار توسط شما در لیست پارامترهای تعریف تابع مشخص می شود و هنگامی که به متغیرهای داخل تابع دسترسی پیدا می کنید، در واقع به یک کلید از یک دیکشنری دسترسی پیدا کرده اید؛ چیزی که در اصطلاح طراحی کامپایلر جدول نماد (symbol table)_ نامیده می شود.

دنباله

لیست ها، تاپل ها و رشته ها نمونه هایی از دنباله ها هستند؛ اما دنباله ها دقیقاً چه چیزهایی هستند و چه ویژگی خاصی دارند؟

مهم ترین ویژگی های دنباله ها عبارتند از آزمون عضویت (یعنی عبارت های in و not in)، عملیات اندیس گذاری که به ما امکان می دهد مستقیماً یک آیتم خاص از دنباله را دریافت کنیم.

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

مثال را با نام ds_seq.py ذخیره کنید:

shoplist = ['apple', 'mango', 'carrot', 'banana']
name = 'swaroop'

# Indexing or 'Subscription' operation #
print('Item 0 is', shoplist[0])
print('Item 1 is', shoplist[1])
print('Item 2 is', shoplist[2])
print('Item 3 is', shoplist[3])
print('Item -1 is', shoplist[-1])
print('Item -2 is', shoplist[-2])
print('Character 0 is', name[0])

# Slicing on a list #
print('Item 1 to 3 is', shoplist[1:3])
print('Item 2 to end is', shoplist[2:])
print('Item 1 to -1 is', shoplist[1:-1])
print('Item start to end is', shoplist[:])

# Slicing on a string #
print('characters 1 to 3 is', name[1:3])
print('characters 2 to end is', name[2:])
print('characters 1 to -1 is', name[1:-1])
print('characters start to end is', name[:])

خروجی:

$ python ds_seq.py
Item 0 is apple
Item 1 is mango
Item 2 is carrot
Item 3 is banana
Item -1 is banana
Item -2 is carrot
Character 0 is s
Item 1 to 3 is ['mango', 'carrot']
Item 2 to end is ['carrot', 'banana']
Item 1 to -1 is ['mango', 'carrot']
Item start to end is ['apple', 'mango', 'carrot', 'banana']
characters 1 to 3 is wa
characters 2 to end is aroop
characters 1 to -1 is waroo
characters start to end is swaroop

نحوۀ عملکرد

ابتدا می بینیم چگونه با استفاده از اندیس ها، آیتم های منفرد یک دنباله را دریافت کنیم. به این کار عملیات subscription نیز گفته می شود. هرگاه عددی را همانند مثال بالا، درون براکت هایی پس از یک دنباله قرار دهید، پایتون آیتمی را که در آن موقعیت قرار دارد، برای شما دریافت می کند. به یاد داشته باشید که در پایتون شمارش از صفر آغاز می شود. بنابراین، shoplist[0] اولین عنصر و shoplist[3] چهارمین عنصر دنبالۀ shoplist را برمی گرداند.

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

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

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

بنابراین، shoplist[1:3] برشی از دنباله را برمی گرداند که از موقعیت 1 آغاز می شود، موقعیت 2 را شامل می شود و پیش از موقعیت 3 متوقف می شود؛ در نتیجه، برشی شامل دو عنصر ایجاد می شود. به طور مشابه، [:]shoplist یک کپی از کل دنباله را بر می گرداند.

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

همچنین می توانید آرگومان سومی را برای برش ایجاد کنید که گام برش است. (مقدار پیش فرض گام 1 است ):

>>> shoplist = ['apple', 'mango', 'carrot', 'banana']
>>> shoplist[::1]
['apple', 'mango', 'carrot', 'banana']
>>> shoplist[::2]
['apple', 'carrot']
>>> shoplist[::3]
['apple', 'banana']
>>> shoplist[::-1]
['banana', 'carrot', 'mango', 'apple']

توجه کنید که وقتی مقدار گام 2 باشد، آیتم های موجود در موقعیت های ...،0،2 را دریافت می کنیم. وقتی اندازه گام 3 باشد، عناصر موجود در موقعیت های 0،3 و موارد دیگر دریافت می شوند.

ترکیب های مختلف این مشخصات برش را به صورت تعاملی در مفسر پایتون امتحان کنید؛ یعنی در محیط خط فرمان، تا بتوانید نتیجه را بلافاصله مشاهده کنید. ویژگی فوق العاده دنباله ها این است که می توانید به تاپل ها، لیست ها و رشته ها به یک روش مشابه دسترسی پیدا کنید!

مجموعه(Set)

مجموعه ها، مجموعه هایی بدون ترتیب از اشیای ساده هستند. از آنها زمانی استفاده می شود که وجود یک شئ در یک مجموعه، از ترتیب آن یا تعداد دفعاتی که درآن ظاهر می شود، اهمیت بیشتری دارد.

با استفاده از مجموعه ها می توانید بررسی کنید که آیا یک عنصر عضو مجموعه است، آیا یک مجموعه زیر مجموعۀ، مجموعه دیگری هست، اشتراک دو مجموعه را پیدا کنید و موارد مشابه دیگر را نیز انجام دهید.

>>> bri = set(['brazil', 'russia', 'india'])
>>> 'india' in bri
True
>>> 'usa' in bri
False
>>> bric = bri.copy()
>>> bric.add('china')
>>> bric.issuperset(bri)
True
>>> bri.remove('russia')
>>> bri & bric # OR bri.intersection(bric)
{'brazil', 'india'}

نحوۀ عملکرد

اگر مفاهیم پایۀ نظریۀ مجموعه ها را که در درس ریاضی در مدرسه آموخته اید، به یاد داشته باشید، این مثال تا حد زیادی خودتوضیح است. اما اگر چنین نیست، می توانید عبارت های "set theory" و "Venn diagram" را در گوگل جست و جو کنید تا کاربرد مجموعه ها در پایتون را بهتر درک کنید.

ارجاع ها

هنگامی که یک شئ ایجاد می کنید و آن را به یک متغیر نسبت می دهید، متغیر فقط به آن شئ اشاره می کند و خود شئ نیست! به بیان دیگر، نام متغیر به بخشی از حافظه کامپیوتر شما اشاره می کند که شئ در آن ذخیره شده است. به این فرآیند، پیوند دادن (binding) نام به شئ گفته می شود.

به طور کلی، نیازی به نگرانی دربارۀ این موضوع نیست، اما یک اثر ظریف ناشی از ارجاع ها وجود دارد که باید از آن آگاه باشید:

مثال را تحت عنوان ds_reference.py ذخیره کنید:

print('Simple Assignment')
shoplist = ['apple', 'mango', 'carrot', 'banana']
# mylist is just another name pointing to the same object!
mylist = shoplist

# I purchased the first item, so I remove it from the list
del shoplist[0]

print('shoplist is', shoplist)
print('mylist is', mylist)
# Notice that both shoplist and mylist both print
# the same list without the 'apple' confirming that
# they point to the same object

print('Copy by making a full slice')
# Make a copy by doing a full slice
mylist = shoplist[:]
# Remove first item
del mylist[0]

print('shoplist is', shoplist)
print('mylist is', mylist)
# Notice that now the two lists are different

خروجی:

$ python ds_reference.py
Simple Assignment
shoplist is ['mango', 'carrot', 'banana']
mylist is ['mango', 'carrot', 'banana']
Copy by making a full slice
shoplist is ['mango', 'carrot', 'banana']
mylist is ['carrot', 'banana']

نحوۀ عملکرد

بخش عمدۀ توضیحات در کامنت ها ارائه شده است.

به خاطر داشته باشید که اگر بخواهید از یک لیست یا انواع مشابه دنباله ها یا اشیای پیچیده (نه اشیای آسان مانند اعداد صحیح)، یک کپی ایجاد کنید باید برای ساخت کپی از عملیات برش استفاده کنید. اگر فقط نام یک متغیر را به نام دیگری نسبت دهید، هردو نام به همان شئ «اشاره دارد» و اگر مراقب نباشید، این موضوع می تواند مشکل ساز شود.

نکته برای برنامه نویسان Perl

به یاد داشته باشید که یک دستور انتساب برای لیست ها کپی ایجاد نمی کند. باید از عملیات برش برای ایجاد یک کپی از دنباله استفاده کنید.

اطلاعات بیشتر دربارۀ رشته ها

پیش تر رشته ها را با جزئیات بررسی کردیم. پس چه چیز دیگری برای دانستن وجود دارد؟ خب، آیا می دانستید که رشته ها نیز اشیا هستند و روش هایی دارند که کارهایی از بررسی بخشی از رشته گرفته تا حذف فاصله ها را انجام دهند؟ در واقع، شما پیش تر از روش های رشته استفاده کرده اید... روش format!

رشته هایی که در برنامه ها استفاده می کنید، همگی اشیائی از کلاس str هستند. برخی از روش های کاربردی و مفید این کلاس در مثال بعد نشان داده شده است. برای مشاهدۀ لیست کامل این روش ها به help(str) مراجعه کنید.

مثال را با نام ds_str_methods.py ذخیره کنید:

# This is a string object
name = 'Swaroop'

if name.startswith('Swa'):
    print('Yes, the string starts with "Swa"')

if 'a' in name:
    print('Yes, it contains the string "a"')

if name.find('war') != -1:
    print('Yes, it contains the string "war"')

delimiter = '_*_'
mylist = ['Brazil', 'Russia', 'India', 'China']
print(delimiter.join(mylist))

خروجی:

$ python ds_str_methods.py
Yes, the string starts with "Swa"
Yes, it contains the string "a"
Yes, it contains the string "war"
Brazil_*_Russia_*_India_*_China

نحوۀ عملکرد

در اینجا نمونه های مختلفی از روش های رشته ها را در عمل مشاهده می کنیم. روش startswith برای بررسی این موضوع استفاده می شود که آیا رشته با رشته داده شده آغاز می شود یا خیر. عملگر in برای بررسی اینکه آیا این رشته داده شده بخشی از رشته دیگر است یا خیر، استفاده می شود.

روش find برای یافتن موقعیت زیررشتۀ داده شده درون رشته به کار می رود؛ اگر این روش نتواند زیر رشته را پیدا کند، مقدار 1- را بر می گرداند. کلاس str نیز روش مرتب و مفیدی به نام join دارد که که عناصر یک رشته را با استفاده از یک رشته به عنوان جداکننده به یکدیگر متصل می کند و یک رشته بزرگتر ایجاد می شود.

جمع بندی

در این بخش، ساختارهای داده داخلی مختلف پایتون را با جزئیات بررسی کردیم. این ساختارهای داده برای نوشتن برنامه هایی با اندازه قابل توجه، ضروری هستند.

اکنون که بخش عظیمی از مبانی پایتون را آموخته ایم، در ادامه به سراغ نحوۀ طراحی و نوشتن یک برنامۀ واقعی در پایتون خواهیم رفت.

results matching ""

    No results matching ""