پایتون زبانی هست که هم سادهست و هم عمیق.
تو این پست میخواهیم یه سری مفاهیم پایهای و نسبتاً پیشرفتهتر رو با مثال مرور کنیم:
بررسی مفاهیم کتابخانه، ماژول و پکیج
داک استرینگ، راهنمای نگارش PEP8
ماژول های array و تابع lambda
توابع map, filter, reduce
اگه میخوای کدهای تمیزتر و حرفهایتری بنویسی، این پست برات مفیده.
ماژول یعنی یک فایل پایتون که داخلش کدهای آمادهای مثل توابع و کلاسها نوشته شدهاند و میتوانی آن را در برنامهات وارد (import) کنی.
پکیج یعنی وقتی چند ماژول مرتبط را در یک پوشه (directory) کنار هم میگذاری و در آن پوشه یک فایل مخصوص به نام (__init__) قراربدی، آن مجموعه میشود یک پکیج.
فایل پایتونی (__init__) باعث میشه پایتون تشخیص دهد که یک پوشه، یک پکیج است، نه فقط یک فولدر معمولی.
کتابخانه مجموعهای از پکیجها و ماژولها است که برای یک هدف خاص ساخته شدهاند.
فرض کن یک شهر داری:
کتابخانه (Library) = خود شهر
پکیج (Package) = محلههای شهر
ماژول (Module) = خانههای داخل محله
توابع و کلاسها = وسایل داخل خانه
مثال: NumPy یک کتابخانه است (مجموعه بزرگی از پکیجها و ماژولها برای کار با آرایهها و محاسبات عددی)
ساختار داخلی NumPy چیزی شبیه این است:
numpy/ __init__.py core/ __init__.py numeric.py multiarray.py shape_base.py linalg/ __init__.py linalg.py fft/ __init__.py fftpack.py random/ __init__.py generator.py mt19937.py ...
همانطور که از ساختار بالا مشخص است، numpy یک کتابخانه است که مجموعه ای از پکیج های مختلفی مانند core, linalg, fft, random و غیره است (مانند یک شهر و محله هایش)
هر پکیج مانند random شامل ماژول های مختلفی مانند random می باشد (محله و خانه های آن)
هر ماژول مانند random نیز توابع مختلفی دارد که می توانیم از آنها استفاده کنیم مانند rand() (مانند خانه و وسایل داخلی آن)
numpy.random.rand از کجا میآید؟
import numpy as np np.random.rand(3,3)
PEP 8 یه راهنمای نگارش کد در پایتون هست.
رعایت کردنش باعث میشه کدت برای خودت و بقیه خواناتر و قابل فهمتر باشه.
مثال: استفاده از فاصله بعد از کاما، حداکثر ۷۹ کاراکتر در هر خط، نامگذاری متغیرها با حروف کوچک
برای مستندسازی تابعها، کلاسها و ماژولها از داکاسترینگ استفاده میکنیم. این یه رشته چندخطی با """ است.
def factorial(n): """محاسبه فاکتوریل یک عدد صحیح نامنفی""" if n == 0: return 1 return n * factorial(n - 1)
اگر بخواهیم مفهومی به اسم آرایه که همه عنصر های آن از یک جنس هستند (مثلاً همه integer) را در پایتون پیاده سازی کنیم از این ماژول استفاده می کنیم.
import array a = array.array('i', [1, 2, 3]) # 'i' یعنی اعداد صحیح print(a[0]) # خروجی: 1
لامبدا توابع کوچک و بینام هستن. فقط یه عبارت دارن و از return استفاده نمیکنن.
square = lambda x: x ** 2 print(square(5)) # خروجی: 25
این سه تابع روی iterableها (لیست، تاپل، دیکشنری و ...) کار میکنن.
map: همه عناصر رو نگه میداره، ولی تابع روی هر کدوم اجرا میشه.
filter: فقط عناصری که شرط تابع رو برگردونن نگه میداره.
reduce: همه عناصر رو به یه مقدار واحد تبدیل میکنه (نیازمند functools.reduce).
from functools import reduce my_list = [1, 2, 3, 4] square = lambda x: x ** 2 even = lambda x: x % 2 == 0 add = lambda x, y: x + y print(list(map(square, my_list))) # [1, 4, 9, 16] print(list(filter(even, my_list))) # [2, 4] print(reduce(add, my_list)) # 10
توضیح قطعه کد بالا:
تابع map یک تابع را روی تمام اعضای یک لیست اعمال میکند و نتیجهها را در یک آبجکت جدید برمیگرداند.
یعنی به هر عنصر از my_list میگوید: «تو را به تابع square میفرستم تا مربعات را حساب کند.»
تابع filter برعکس map چیزی را تغییر نمیدهد؛ فقط مواردی که شرط خاصی را دارند، نگه میدارد.
در اینجا تابع even بررسی میکند که عدد زوج است یا نه. پس همه مقادیر فرد حذف میشوند.
تابع reduce کمی متفاوت است:
به جای برگرداندن لیستی از نتایج، کل لیست را به یک مقدار واحد تبدیل میکند.
تابع add دو به دو اعضای لیست را جمع میکند تا به یک نتیجه نهایی برسد:
(((1 + 2) + 3) + 4) = 10
یعنی reduce برای تجمیع (aggregate) دادههاست.