سطح مقدماتی (Beginner Level)
در پایتون، اکثر برنامهنویسان تازهکار برای ذخیره مجموعهای از دادهها از List (لیست) استفاده میکنند. اما پایتون یک ماژول داخلی به نام array نیز دارد که ساختاری شبیه به آرایههای زبان C فراهم میکند.
تفاوت اصلی اینجاست: لیستها میتوانند هر نوع دادهای را در کنار هم نگه دارند (مثلاً عدد و متن)، اما آرایه (Array) فقط میتواند دادههایی از یک نوع مشخص (مثلاً فقط اعداد صحیح) را ذخیره کند. این محدودیت باعث میشود آرایهها در شرایط خاص بسیار بهینهتر از لیستها باشند.
۱. ساخت آرایه و کدهای نوع (Type Codes)
برای استفاده از آرایه، ابتدا باید ماژول array را ایمپورت کنید. هنگام ساخت آرایه، باید نوع دادهای که قرار است ذخیره شود را با یک کاراکتر خاص به نام Type Code مشخص کنید.
رایجترین کدهای نوع عبارتند از:
'i': عدد صحیح (Integer) علامتدار (حداقل 2 بایت)'f': عدد اعشاری (Float) (4 بایت)'d': عدد اعشاری دقیق (Double) (8 بایت)'u': کاراکتر یونیکد (قدیمی)
در اینجا چند مثال برای ساخت آرایه میبینیم.
مثال اول: ساخت یک آرایه ساده از اعداد صحیح
در این مثال یک آرایه از نوع 'i' میسازیم و آن را چاپ میکنیم.
مثال دوم: ساخت آرایه اعشاری
در این مثال از کد 'f' برای ذخیره اعداد اعشاری استفاده میکنیم. دقت کنید که اعداد صحیح به صورت خودکار به اعشاری تبدیل میشوند.
مثال سوم: خطا در نوع داده (Static)
این کد نشان میدهد که اگر سعی کنید دادهای ناهمخوان (مثل متن) را در آرایهی عددی بریزید، چه اتفاقی میافتد. این کد برای اجرا نیست زیرا خطا میدهد، اما برای درک مفهوم ضروری است.
# Example 3: Type Mismatch (Snippet)
import array as arr
# This will raise a TypeError because "Hello" is not an integer
try:
my_array = arr.array('i', [1, 2, "Hello"])
except TypeError as e:
print(e)
۲. دسترسی و پیمایش (Access & Traversal)
دسترسی به عناصر آرایه دقیقاً مشابه لیستها است. شما میتوانید از اینکس (Index) برای دسترسی به یک آیتم خاص و از Slicing برای دریافت بخشی از آرایه استفاده کنید.
مثال اول: دسترسی با ایندکس و تغییر مقدار
مثال دوم: پیمایش با حلقه For
مثال سوم: برش (Slicing) (Static)
این کد نشان میدهد چگونه میتوان بخشی از آرایه را جدا کرد. خروجی اسلایسینگ نیز یک شیء از نوع array خواهد بود.
# Example 3: Slicing syntax (Snippet)
import array as arr
data = arr.array('i', [1, 2, 3, 4, 5, 6, 7, 8])
# Get elements from index 2 to 5
sub_array = data[2:5]
# Result logic: array('i', [3, 4, 5])
۳. عملیات پایه (افزودن و حذف)
آرایهها متدهای مشابهی با لیست برای مدیریت عناصر دارند:
append(x): اضافه کردن به انتهای آرایه.insert(i, x): اضافه کردن در ایندکس خاص.pop(i): حذف و برگرداندن آیتم در ایندکس خاص.remove(x): حذف اولین رخداد یک مقدار خاص.
مثال اول: اضافه کردن داده (Append & Insert)
مثال دوم: حذف داده (Pop & Remove)
سطح پیشرفته (Professional Level)
در سطح حرفهای، استفاده از ماژول array معمولاً به دلیل نیاز به کارایی حافظه (Memory Efficiency) یا تعامل با دادههای باینری سطح پایین صورت میگیرد. اگرچه numpy برای محاسبات علمی استاندارد است، اما array بخشی از کتابخانه استاندارد پایتون است و نیازی به نصب پکیج خارجی ندارد.
۱. مدیریت حافظه و بافرها (Buffer Info & Size)
برخلاف لیستها که سربار (Overhead) زیادی برای هر آبجکت دارند، آرایهها دادهها را به صورت فشرده در حافظه ذخیره میکنند. متد buffer_info() آدرس حافظه و تعداد عناصر را برمیگرداند و itemsize اندازه هر عنصر به بایت را نشان میدهد.
مثال اول: بررسی اطلاعات حافظه
مثال دوم: تعریف تابع برای محاسبه حجم (Static)
این تابع کمکی میتواند برای مقایسه حجم تقریبی استفاده شود.
# Example 2: Helper function definition (Snippet)
import sys
def get_deep_size(obj):
"""Calculates the approximate memory footprint"""
return sys.getsizeof(obj)
۲. تبدیل به بایت و رشته (Serialization)
یکی از کاربردهای اصلی آرایهها، تبدیل سریع دادهها به رشتههای بایتی (Byte Strings) برای ذخیرهسازی در فایل یا ارسال در شبکه است. متدهای tobytes() و frombytes() (در نسخههای قدیمیتر tostring و fromstring) برای این کار استفاده میشوند.
مثال اول: تبدیل آرایه به بایت
مثال دوم: بازسازی آرایه از بایت
۳. عملیات فایل (File I/O)
آرایهها میتوانند مستقیماً محتوای خود را به صورت باینری (بدون نیاز به تبدیل به متن) در فایل بنویسند و بخوانند. این کار با tofile() و fromfile() انجام میشود که بسیار سریعتر از خواندن/نوشتن متنی است.
مثال اول: نوشتن و خواندن فایل باینری
نکته: در این مثال از فایل موقت استفاده میکنیم.
مثال دوم: مدیریت استثناها هنگام خواندن (Static)
هنگام استفاده از fromfile، اگر فایل به اندازه کافی داده نداشته باشد، EOFError رخ میدهد.
# Example 2: Handling EOF (Snippet)
import array as arr
def safe_load(file_obj, count):
new_arr = arr.array('d')
try:
new_arr.fromfile(file_obj, count)
except EOFError:
print("Warning: File ended unexpectedly.")
return new_arr
۴. تفاوت با NumPy (نکته حرفهای)
در محیطهای حرفهای علوم داده، ماژول array اغلب با کتابخانه numpy مقایسه میشود.
- ماژول
array: استاندارد، سبک، محدود به آرایههای یکبعدی، عملیات ریاضی برداری ندارد (مثلاً نمیتوانید بنویسیدarr * 2). - کتابخانه
numpy: نیاز به نصب دارد، سنگینتر، پشتیبانی از چندبعدی، دارای عملیات ریاضی برداری قدرتمند.
مثال اول: محدودیت عملیات ریاضی در array (Static)
این کد نشان میدهد که ضرب آرایه در عدد در ماژول استاندارد array به معنای تکرار آرایه است (مثل لیست)، نه ضرب ریاضی تکتک عناصر.
# Example 1: Behavior of multiplication (Snippet)
import array as arr
a = arr.array('i', [1, 2])
# This creates array('i', [1, 2, 1, 2]), it does NOT multiply elements by 2!
result = a * 2
مثال دوم: شبیهسازی عملیات برداری با map یا comprehension
اگر نخواهید از numpy استفاده کنید، برای انجام محاسبات روی آرایه باید از روشهای زیر استفاده کنید: