دوره H پایتون – فصل 2: ساختار کنترلی – درس 5: لیست‌ها/آرایه‌ها

دوره H پایتون – فصل 2: ساختار کنترلی – درس 5: لیست‌ها/آرایه‌ها

دوره H برنامه نویسی پایتون
فصل دوم: ساختار کنترلی پایتون
درس پنجم: لیست ها در پایتون (آرایه‌ها)


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

برای شروع این مطلب آموزشی، ابتدا بایستی با مفهوم آرایه آشنا شوید؛ لذا اگر نمی‌دانید آرایه چیست و چه کاربردی دارد، مقاله «مفهوم آرایه در برنامه نویسی» را مطالعه کنید.

آرایه / لیست در پایتون

پایتون بصورت built-in (داخلی)، از آرایه پشتیبانی نمی‌کند! اما لیست‌ها وجود دارند که می‌توان از آنها به جای آرایه استفاده کرد و همانند آرایه‌ها هستند. و همانطور که در مفهوم آرایه گفته شد، برخی از زبان‌ها نیازی به تعریف نوع آرایه ندارند! یعنی می‌توان داخل یک آرایه، هم عدد قرار داد، هم رشته و …! و حالا پایتون نیز همانند زبان PHP اینگونه است!

در پایتون برای تعریف یک لیست، از دو براکت استفاده می‌‍شود. وآیتم‌های داخل براکت، با یک ویرگول از یکدیگر جدا می‌شوند؛ و طبیعتا برای دسترسی به هر عضو لیست، از ایندکس آن استفاده خواهد شد. برای مثال:

words = ["Hello", "world", "!"]
print(words[0])
print(words[1])
print(words[2])

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

خروجی این کد:

>>>
Hello
world
!
>>>

همانطور که می‌بینید، ایندکس اولین خانه 0 است که عبارت «Hello» درون آن قرار دارد.

یک لیست خالی

برای تعریف یک لیست خالی، می‌توان آن را بدون آیتم تعریف کرد. برای مثال:

empty_list = []
print(empty_list)

خروجی این کد:

>>>
[]
>>>

انواع داده در یک لیست

همانطور که اشاره شد، در پایتون نیازی به تعریف نوع آیتم‌هایی که می‌توانند داخل یک لیست قرار بگیرند وجود ندارد و بنابراین می‌توان انواع داده را درون یک لیست قرار داد! برای مثال:

number = 3
things = ["FuLLKade", 0, [1, 2, number], 4.56]
print(things[1])
print(things[2])
print(things[2][2])

در این لیست که نام آن things است، به ترتیب آیتم‌های زیر قرار دارند:

  • رشته‌ای با مقدار «FuLLKade»
  • عدد int با مقدار 0
  • یک لیست درون لیست!!
  • در نهایت یک float با مقدار 4.56

گفته شد داخل این لیست، یک لیست درون لیست قرار دارد و اگر به ایندکس 2 دقت کنید، یک لیست جدید است که درون آن دو int و یک متغیری به نام number قرار گرفته است! بنابراین می‌توان داخل یک لیست، یک لیست دیگری قرار داد. همچنین داخل لیست‌ها می‌توان از متغیرها نیز استفاده کرد؛ یا خروجی یک تابع یا متد را مستقیم در آن قرار داد.

خروجی کد بالا بصورت زیر خواهد شد:

>>>
0
[1, 2, 3]
3
>>>

در واقع قرار دادن آرایه‌ای جدید درون آرایه‌ی فعلی، باعث ایجاد بُعدِ دوم می‌شود! لذا همانطور که در مثال بالا دیدید، اگر بخواهیم مثلا مقدار number را در لیست داخلی چاپ کنیم، بصورت زیر عمل خواهیم کرد:

print(things[2][2])
رشته‌ها نیز همانند لیست‌ها هستند! مثلا در بالا اگر بنویسیم print(things[0][0])، مقدار F نمایش داده خواهد شد! و از این رو می‌توان گفت که رشته، مجموعه‌ای از یک یا چند کاراکتر می‌باشد.

پردازش لیست‌ها

تغییر مقادیر داخل لیست:
ما می‌توانیم مقدار آیتمی را در یک لیست تغییر دهیم. برای مثال:

nums = [7, 7, 7, 7, 7]
nums[2] = 5
print(nums)

و نتیجه کد بالا:

>>>
[7, 7, 5, 7, 7]
>>>


جمع و ضرب لیست‌ها:
می‌توان لیست‌ها را همانند رشته‌ها جمع و ضرب کرد! اما نمی‌توان آنها را تقسیم و تفریق نمود! البته ماژولهایی وجود دارند که این امکان را ایجاد می‌کنند؛ اما فعلا با آنها کاری نداریم. به مثال زیر دقت کنید:

nums = [1, 2, 3]
print(nums + [4, 5, 6])
print(nums * 3)

خروجی کد بالا:

>>>
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 1, 2, 3, 1, 2, 3]
>>>

در هنگام جمع، لیست دوم به انتهای لیست اول اضافه شده و در هنگام ضرب نیز لیست چند برابر شده است!


بررسی وجود داشتن یک مقدار در لیست
با استفاده از کلمه‌ی کلیدی in، می‌توان بررسی کرد که آیا یک مقداری درون یک لیست وجود دارد یا نه! و این بررسی، مقدار بولی True یا False را ایجاد می‌کند. برای مثال:

words = ["FuLLKade", "egg", "spam", "sausage"]
print("FuLLKade" in words)
print("egg" in words)
print("tomato" in words)

خروجی این کد:

>>>
True
True
False
>>>

پس از این روش می‌توان در شرط‌ها نیز استفاده کرد! همچنین فراموش نکنید که در بررسی‌های in، نوع مقدار نیز بررسی می‌شود و اگر ما “1” را بررسی کنیم، حتما بایستی یک رشته باشد تا True برگردد و اگر چنانجه یک عدد باشد، False برگردانده می‌شود.

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

بررسی وجود نداشتن یک مقدار در لیست
این مورد نیز برعکس مورد قبل بوده و از کلیدواژه‌ی not به‌همراه in استفاده می‌شود. برای مثال:

nums = [1, 2, 3]
print(not 4 in nums)
print(4 not in nums)
print(not 3 in nums)
print(3 not in nums)

خروجی کد بالا:

>>>
True
True
False
False
>>>

توابع لیست‌ها

اگرچه با مفهوم تابع، متد، کلاس و آبجکت در فصل بعدی آشنا خواهیم شد؛ اما فعلا به صورت کلیشه‌ای به توضیحات و مثال‌ها توجه کنید.

متد append
در لیست‌ها، از متد append برای اضافه کردن یک مقدار جدید به لیست استفاده می‌شود. این مقدار، به انتهای لیست اضافه خواهد شد و برای مثال اگر آخرین آیتمِ لیست، ایندکس 2 را داشته باشد، این مقدار جدید نیز ایندکس 3 را به خود خواهد گرفت.

nums = [1, 2, 3]
nums.append(4)
print(nums)

خروجی کد بالا:

>>>
[1, 2, 3, 4]
>>>

نکته
در واقع append یک متد از کلاس List است که در فصل بعدی این موارد را توضیح خواهیم داد.

تابع len
برای بدست آوردن تعداد آیتم‌های یک لیست و به عبارتی طول لیست، می‌توان از len استفاده کرد و همچنین از آن می‌توان برای رشته‌ها نیز استفاده کرد. برای مثال:

nums = [1, 3, 5, 2, 4]
print(len(nums))

>>>
5
>>>

نکته
برخلاف append که یک متد از کلاس List بود، len یک تابعِ نورمال هست! یعنی نیازی نیست تا ابتدا لیست را نوشته و سپس با قرار دادن یک علامت نقطه، همانند متد append آن را صدا بزنیم. بلکه len بصورت کلی و خارج از هرکلاسی تعریف شده است. برای اطلاعات بیشتر، وارد لینک «تابع چیست؟! متد چیست؟!» شوید.

متد insert
این متد نیز همانند append است؛ با این تفاوت که به کمک آن می‌توان مقدار را به هر ایندکس دلخواهی اضافه کرد. برای مثال:

words = ["Python", "fun"]
words.insert(1, "is")
print(words)

خروجی کد بالا:

>>>
[‘Python’, ‘is’, ‘fun’]
>>>

در این مثال، خود لیست در ابتدا شامل دو مقدار بود و بنابراین ایندکس‌های 0 و 1 داخل آن تعریف شده بودند. وقتی ما is را به ایندکس 1 اضافه کردیم، در واقع مقادیر موجود از ایندکس 1 به بعد، یک واحد به جلوتر منتقل شدند تا مقدار جدید در آن بین قرار گیرد و به عبارتی insert به جای مقدار قبلی قرار نمی‌گیرد، بلکه مقدار جدیدی را به یک ایندکس اضافه می‌کند که باعث حرکت بقیه خانه‌ها به جلو می‌شود.


متد index
این متد با گرفتن یک مقدار، به دنبال اولین ایندکسی می‌گردد که آن مقدار را درون خود دارد:

letters = ['f', 'u', 'l', 'l', 'k', 'a', 'd', 'e']
print(letters.index('f'))
print(letters.index('l'))
print(letters.index('e'))
print(letters.index('z'))

خروجی کد بالا:

>>>
0
2
7
ValueError: ‘z’ is not in list
>>>


متدها و توابع مفید دیگری که برای list ها وجود دارند:

  • تابع max(list): برگرداندن آیتمی که بیشترین مقدار را دارد.
  • تابع min(list): برگرداندن آیتمی که کمترین مقدار را دارد.
  • متد list.count(obj): برگرداندن دفعات تکرار یک مقدار در لیست.
  • متد list.remove(obj): حذف یک مقدار از یک لیست! البته فقط اولین مقدار را حذف می‌کند.
  • متد list.reverse(): برعکس کردن یک لیست!

تابع range

تابع range، برای ایجاد سریع‌ترِ یک لیست متوالی از اعداد، مورد استفاده قرار می‌گیرد! برای مثال، اگر بخواهیم یک لیست ایجاد کنیم که 10 عدد داخل آن قرار داشته باشد، بصورت زیر عمل می‌کنیم: (این لیست از 0 شروع شده و تا یکی کمتر از مقدار وارد شده که در اینجا برابر 10 می‌باشد ادامه خواهد یافت.)

numbers = list(range(10))
print(numbers)

خروجی کد بالا:

>>>
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>

در کد بالا می‌بینید که مقدار کلاس range را در تابع list ریختیم تا به لیست تبدیل شود! چرا که خود تابع range یک آبجکت از کلاس Range ایجاد می‌کند. و ما از تابع list برای تبدیل آن به آبجکت لیست و قرار دادنش در متغیر numbers استفاده کردیم. در آینده که با مفهوم توابع، متدها، کلاس‌ها و آبجکت‌ها آشنا شدید، این چیزها را بهتر درک خواهید کرد.


تعیین شروع range به جای 0 از یک عدد دیگر:
اگر بخواهیم شروع range از 0 نباشد، بایستی بصورت زیر عمل کرد:

numbers = list(range(3, 8))
print(numbers)

print(range(20) == range(0, 20))

خروجی کد بالا:

>>>
[3, 4, 5, 6, 7]

True
>>>

همانطور که می‌بینید، از دو ورودی استفاده کردیم و در ورودی اول، نقطه شروع و در ورودی دوم، نقطه پایانی را مشخص نمودیم. همچنین در ادامه، یک شرط را بررسی کردیم تا نشان دهیم که اگر مقدار نقطه شروع را 0 قرار دهیم، یا نقطه شروعی برای range تعیین نکنیم، هردو باهم یکی هستند. و در واقع پیشفرض آن 0 است.


تعیین فاصله آیتم‌های range
تا به اینجا در دو مثال قبلی، اختتلاف بین آیتم‌ها برابر 1 بود؛ اما اگر بخواهیم آیتم‌ها بیشتر از 1 واحد از هم اختلاف داشته باشند، می‌توان از ورودی سوم تابع range استفاده کرد. برای مثال:

numbers = list(range(5, 20, 2))
print(numbers)

خروجی کد بالا:

>>>
[5, 7, 9, 11, 13, 15, 17, 19]
>>>

همانطور که می‌بینید، آیتم‌ها دو واحد از هم فاصله دارند. (همچنین ببینید: مطالعه‌ی بیشتر در مورد تابع range)


در درس بعدی، به حلقه for اشاره خواهیم کرد؛ و همچنین با استفاده از آن، یک لیست را پیامیش یا iterate می‌کنیم.

درس بعدیدرس قبلی

پاسخ دهید

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

cp-codfk

نظرات ثبت شده بدون دیدگاه

توضیحات پیشنهادی نظرات اشتراک