یکی از دلایل محبوبیت زبان برنامه نویسی پایتون قابلیت خوانایی و نزدیک بودن آن به زبان انگلیسی است به طوری که بیشتر وقت ها کدنویسی با این زبان مانند این است که بخواهیم یکسری به اصطلاح Pseudocode (شِبهکُد) را اجرا کنیم. در همین راستا در این مقاله قصد داریم تا برخی از کاربردیترین ماژولهای زبان پایتون به همراه چند مورد از ویژگی های محبوب این زبان را معرفی کنیم.
تابعهای ()all و ()any
این تابعها به صورت Built-in در زبان برنامهنویسی پایتون تعریف شدهاند که عملکرد آنها را در مثال زیر بیان میکنیم:
x = [True, True, False]
print(any(x))
print(all(x))
print(any(x) and not all(x))تابعهای ()any و ()all به منظور انجام عملیات منطقی AND و OR بر روی مقدار های یک آرایه مورد استفاده قرار میگیرند. همانطور که در مثال بالا میبینید، آرایهای به نام x با سه مقدار داریم که در خط دوم گفتهایم تابع ()any به ازای دریافت مقدارهای این آرایه، در صورتی مقدار True را در خروجی چاپ کند که حداقل یکی از مقدار های آرایه True باشد، یعنی انجام عملیات منطقیِ OR روی آرایه ی مد نظر است.
در خط سوم نیز گفتهایم که اگر تمامی مقدارهای آرایه True بود، در خروجی مقدار True را چاپ کند یعنی انجام عملیات منطقیِ AND روی مقدارهای آرایه است. دستور خط چهارم نیز در شرایطی مقدار True را در خروجی چاپ میکند که حداقل یکی از مقدارهای آرایه، True یا False باشد، نه همه ی آنها. به عبارتی، در شرایطی که حداقل یکی از مقدارهای این آرایه مخالف مابقی مقدارهای آن باشد، خروجی مقدار True خواهد بود یعنی انجام عملیات منطقی XOR است.
کتابخانه bashplotlib
این کتابخانه امکان ترسیم نمودار و به اصطلاح ویژولایز کردن دیتا در محیط کنسول را برای توسعه دهندگان فراهم میکند که نصب آن از طریق دستور زیر صورت میگیرد:
$ pip install bashplotlibو سپس آن را در برنامۀ خود بدین شکل ایمپورت (import) میکنیم:
import bashplotlibدر ادامه با استفاده از تابع زیر، میتوانیم نمودارهایی از جمله یک نمودار از نوع اِسکاتر و یا هیستوگرام مربوط به دیتای مد نظر را رسم نماییم:
plot_scatter(f, xs, ys, size, pch, colour, title)آرگومانها به ترتیب فایل مربوط به دیتای مد نظر برای مشخص کردن مختصات محورهای x و y، آرگومان مربوط به مختصات x در شرایطی که مختصات مشخصی در فایل اصلی بیان نشده باشد، آرگومان مربوط به مختصات y، اندازه ی کلی نمودار، شکل نقاط روی نمودار، رنگ نقاط و عنوان اصلی نمودار میباشد و برای رسم هیستوگرام نیز از دستور زیر استفاده میکنیم:
plot hist(f, height=20.0, bincount=None, pch='o', colour='white', title='', xlab=None, nosummary=True)که در آن هر یک از آرگومانها به ترتیب فایل دیتای مد نظر، ارتفاع نمودار بر حسب تعداد خطوط، تعداد هر یک از ستونهای نمودار، شکل ستونهای نمایش دادهشده در محیط ترمینال، رنگ آنها، عنوان نمایش دادهشده در بالای نمودار، xlab به منظور نمایش یا عدم نمایش lable مربوط به محور x و nosummary برای نمایش یا عدم نمایش محور y به کار میروند.
کتابخانه collections در پایتون
زبان برنامهنویسی پایتون به صورت پیشفرض یکسری دیتا تایپ از جمله int (مقادیر عددی صحیح)، float (عدد اعشاری)، str (مقادیر اِسترینگ یا رشتهای)، list (دنبالهای از مقادیر در قالب لیست) و غیره را دارد اما این در حالی است که ماژولی تحت عنوان collections امکان ارائۀ دیتا تایپهای بیشتری را برای دولوپرها فراهم میکند به طوری که داریم:
زبان برنامهنویسی پایتون به صورت پیشفرض یکسری دیتا تایپ از جمله int (مقدارهای عددی صحیح)، float (عدد اعشاری)، str (مقدارهای رشتهای)، list (دنبالهای از مقدارها در قالب لیست) و غیره را دارد اما این در حالی است که ماژولی تحت عنوان collections امکان ارائه ی دیتا تایپهای بیشتری را برای توسعه دهندگان فراهم میکند به طوری که داریم:
from collections import OrderedDict, Counter
# Remembers the order the keys are added!
x = OrderedDict(a= 5, b=4, c=9)
# Counts the frequency of each character
y = Counter("Hello World!")در کُد بالا ابتدا از ماژول collections کلاسهای OrderedDict و Counter را import کرده و در ادامه در خط سوم آبجکتی از روی کلاس OrderedDict تحت عنوان x ساختهایم که این آبجکت یک نوع داده ی دیکشنری با کلیدهای b ،a و c (دقیقا به همان ترتیب بیانشده به عنوان ورودی) ایجاد کند که در آنها مقدارها نیز برابر با مقدارهای ذکرشده در مقابل کلیدها خواهند بود. در خط پنجم از روی کلاس Counter آبجکتی تحت عنوان y ساختهایم که این کلاس تعداد تکتک حروف بهکاررفته در عبارت مشخصشده را در خروجی return کرده و در متغیر y ذخیره میکند.
💎💎 در مورد زبان برنامه نویسی پایتون بیشتر بدانید: ترفندهای کمتر شناخته شدهی پایتون که هر توسعهدهندهای باید بداند !
تابع ()dir
این تابع از پیش تعریفشده در پایتون، لیستی از اتربیوتها و متدهای بهکاررفته در داخل یک آبجکت را return میکند. برای مثال در کد زیر داریم:
import struct
dir()
dir(struct)
dir(dir)همانطور که در کد فوق میبینید، ماژولی دلخواه را ابتدا import کرده سپس تابع ()dir را اجرا میکنیم. این تابع تمامی اتربیوتهای مربوط به ماژولهای اِسکوپ جاری را در اختیار ما قرار خواهد داد اما در خط سوم نام ماژول struct را به عنوان آرگومان ورودی به این تابع دادهایم که منجر به این خواهد شد تا تمامی اتربیوتهای بهکاررفته در ماژول مذکور را در خروجی return کند. در خط چهارم نیز خود کلیدواژه ی dir را به عنوان آرگومان ورودی به این تابع دادهایم که به این وسیله تمامی متدها، آبجکتها و اتربیوتهای بهکاررفته در تابع ()dir در معرض دید ما قرار خواهد گرفت.
کتابخانه ایموجی در پایتون - emoji
ماژولی است که امکانی را در اختیار توسعه دهندگان قرار میدهد تا بتوانند با استفاده از زبان برنامهنویسی پایتون، ایموجی مد نظر خود را در خروجی به نمایش در آورند. در همین راستا، ابتدا باید ماژول مذکور را دانلود و نصب کنید که برای این منظور دستور زیر را اجرا میکنیم:
$ pip install emojiدر ادامه کلاس emojize از ماژول مذکور را ایمپورت کرده و در خط دوم آبجکتی تحت عنوان thum روی این کلاس میسازیم به طوری که کُد مربوط به ایموجی 👍 را به عنوان آرگومان ورودی به این کلاس داده و در خط سوم از برنامه خواستهایم تا نتیجهی حاصل از اجرای این کلاس که در آبجکت thum نگه داری میشود را در خروجی چاپ کند:
from emoji import emojize
thum = emojize(":thumbs_up:")
print(thum)در نهایت ایموجی 👍توسط تابع ()print چاپ خواهد شد.
__future__ در پایتون
پایتون ماژولی تحت عنوان __future__ دارا است که این امکان را در اختیار توسعه دهندگان قرار میدهد تا بتوانند ماژولها، متدها و کتابخانه های مد نظر خود را به گونهای تعریف کنند تا در نسخههای آیندهی این زبان امکان اجرای برنامه روی ویژگی های جدید ارائهشده برای ماژولها، متدها و کتابخانه های مذکور فراهم شود. بهکارگیری از این ماژول منجر به این خواهد شد تا برنامه ی مد نظر تا حدود زیادی با قابلیتهای نسخه ی جدید این زبان به اصطلاح Compatible (سازگار) باشد. برای مثال داریم:
from __future__ import print_function
print("Hello World!")همانطور که در کد بالا مشاهده میکنید، در خط اول کلاس print_function از ماژول __future__ را ایمپورت کردهایم وبه این ترتیب تابع ()print بر اساس آخرین فیچرهای ارائه شده برای این تابع اجرا خواهد شد که در خط دوم نیز تابع مذکور بر اساس قابلیتهای جدیدش، استرینگ ورودیِ !Hello World را چاپ خواهد کرد.
عنوان تبلیغ: خیلی سریع سادهترین زبان برنامهنویسی رو یاد بگیر!
کتابخانه geopy
این ماژول امکانی را در اختیار وب توسعه دهندگان قرار میدهد تا بتوانند با بهکارگیری از یکسری API به اصطلاح Third Party دادههایی مانند مختصات آدرس شهر، کشور و محل مورد نظر خود در سراسر جهان را بیابند. (برای آشنایی بیشتر با مفهوم API، به آموزش API چیست؟ مراجعه نمایید.) همچنین این ماژول کلاسی تحت عنوان distance دارا است که قابلیت محاسبه ی فاصله ی بین دو مکان را بر اساس واحد اندازهگیری مد نظر توسعه دهنده عرضه میکند. ابتدا با تایپ دستور زیر در command line، ماژول مذکور را دانلود و نصب میکنیم:
$ pip install geopyدر ادامه قصد داریم تا با اتصال به ایپیآی مربوط به سرویس گوگلمَپ، آدرس دقیق مکان مد نظر خود را بیابیم که در همین راستا کلاسی تحت عنوان GoogleV3 از ماژول مذکور را import کرده و در ادامه، منطقۀ مد نظر خود را در متغیری تحت عنوان place ذخیره میکنیم:
from geopy import GoogleV3
place = "221b Baker Street, London"
location = GoogleV3().geocode(place)
print(location.address)در خط سوم آبجکتی تحت عنوان location از روی کلاس GoogleV3 ساخته و متغیر place را به عنوان آرگومان ورودی به تابع ()geocode از این کلاس میدهیم تا در نهایت در خط چهارم آدرس دقیق مد نظر ما را توسط تابع ()print در خروجی چاپ کند.
ماژول howdoi در پایتون
این ماژول امکانی را برای توسعه دهندگان فراهم میکند تا به وسیله ی آن بتوانند به پاسخ برخی سؤالات خود دست یابند به طوری که بدون بستن ترمینال میتوانند جواب پرسشهای خود را در استک اورفلو جستجو کنند. اما باید به خاطر داشته باشیم که این ماژول پاسخ سؤالات را از میان بهترین پاسخهای ارائهشده در استک اورفلو برای ما به نمایش در خواهد آورد و ممکن است همواره مفیدترین راه حل عرضه نگردد! برای دانلود و نصب این ماژول نیز دستور زیر را در command line تایپ میکنیم:
$ pip install howdoiحال اقدام به تست این ماژول میکنیم:
howdoi vertical align css
howdoi for loop in java
howdoi undo commits in gitهمانطور که در ادامه میبینید، با استفاده از دستورهایی مانند آنچه در بالا مشاهده میکنید، میتوان به پاسخ برخی از سؤالات مد نظر خود دست پیدا کرد.
ماژول inspect در پایتون
این ماژول قابلیتی را برای توسعه دهندگان فراهم میکند تا بتوانند آنچه که در پشت صحنهی یک برنامه، متد و یا کُد اتفاق میافتد را درک کنند و نیاز به توضیح نیست که با فراخوانی خودِ ماژول نیز میتوان نحوۀ کار متدهای مربوط به این ماژول را مشاهده کرد.
در نمونه کد زیر، ابتدا ماژول مذکور را import کرده و به منظور چاپ و نمایش تمامی دیتای موجود در متد و یا کتابخانه مد نظر از یک ماژول خاص مورد استفاده قرار گرفته که در اینجا کلاس algorithms از ماژولی تحت عنوان networkx را به عنوان آرگومان ورودی در نظر گرفتهایم که این ماژول به منظور بررسی و مدیریت گرافها و شبکههای پیچیده به کار گرفته میشود که برای این منظور نیز ابتدا باید کلاس مذکور را از ماژول مد نظر import کنیم:
import inspect
from networkx import algorithms
print(inspect.getsource(algorithms))
print(inspect.getmodule(inspect.getmodule))
print(inspect.currentframe().f_lineno)خط چهارم از کد فوق نیز این قابلیت را در اختیار توسعه دهندگان قرار میدهد تا بتوانند در صورت نیاز مشخص کنند که یک کتابخانه، متد یا الگورریتم خاص به چه ماژولی تعلق دارد و در نهایت خط پنجم نیز شماره ی خط جاری مربوط به اجرای این قطعه کُد را در خروجی چاپ میکند (از جمله دیگر ویژگیهای مهم ماژول inspect میتوان به درک نحوه ی کار برنامه و همچنین امکان نوشتن مستندات مربوط به نرمافزار اشاره کرد.)
کتابخانه jedi
این کتابخانه امکان آنالیز و تکمیل خودکار کُد را برای توسعه دهندگان فراهم میکند و همچنین منجر به افزایش سرعت و بهرهوری در کدنویسی میشود. همچنین توسعه دهندگان میتوانند این کتابخانه را به عنوان افزونهای در IDE خود مورد استفاده قرار دهند (نیاز به توضیح است که پروژه ی IPython نیز برای توسعه ی اپلیکیشنهای خود، از این کتابخانه به عنوان ابزاری برای افزودن امکان تکمیل خودکار کد یا به اصطلاح Autocompletion استفاده میکند.)
kwargs** در پایتون
در پروسهی یادگیری هر زبان برنامهنویسی نقاط عطف زیادی در طی مسیر وجود دارد که در مورد زبان برنامهنویسی پایتون نیز درک قواعد kwargs** به عنوان یکی از این نقاط عطف به شمار میرود که دو ستاره در کنار یک آبجکت از نوع داده ی دیکشنری، این امکان را برای توسعه دهندگان فراهم میکند تا بتوانند محتویات آن دیکشنری را به عنوان آرگومانهای ورودی به یک تابع پاس دهند.
در واقع، کلیدها در این دیکشنری به عنوان نام آرگومانهای ورودی به تابع پاس داده میشوند و مقدارهای متناظر با هر یک از این کلیدها به عنوان مقدار ورودی به این تابع پاس داده شده و با این روش تابع مذکور فراخوانی شده و اجرا میشود. همانطور که در کد زیر میبینیم، ابتدا یک آبجکت از نوع داده ی دیکشنری تحت عنوان dictionary ساخته و دو آیتم در آن قرار دادیم که a و b کلید بوده و اعداد 1 و 2 به ترتیب مقدارهای متناظر آنها هستند:
dictionary = {"a": 1, "b": 2}
def sum(a, b):
print(a + b)
return
# these do the same thing:
sum(a = 1, b = 2)
sum(**dictionary)در ادامه تابعی تحت عنوان ()sum تعریف کردهایم و گفتهایم مقدارهای a و b را با هم جمع کرده و در نهایت حاصل جمع را چاپ کند. حال برای فراخوانی تابع مذکور دو روش را میتوانیم در پیش بگیریم. روش اول که رویکرد رایجی برای فراخوانی تابعها میباشد، همانند دستور خط ششم، گفتهایم که به ازای دو آرگومان عددیِ 1 و 2 تابع ()sum فراخوانی شده و این دو عدد را با هم جمع کرده و نتیجه را در خروجی چاپ کند.
اما روش دومبه این صورت است که نوع دادۀ دیکشنری تعریفشده را به عنوان آرگومان ورودی به تابع مد نظر پاس دهیم که برای این منظور نیز میتوانیم نام دیکشنری مذکور را به همراه دو علامت ** به این تابع بدهیم و همانطور که در دستور خط هفتم مشاهده میکنید، از تابع ()sum خواستهایم تا مقدارهای منتسب به متغیر dictionary را به عنوان مقدار ورودی دریافت کرده و آنها را باهم جمع کند و نتیجه را در خروجی چاپ کند. در واقع، این ماژول برای زمانی مفید است که توسعه دهندگان بخواهند تابعی بنویسند که خود این تابع قابلیت نامگذاری آرگومانهای ورودی را داشته باشد که از قبل نامگذاری نشدهاند.
دیتا تایپ list
زبان برنامهنویسی پایتون این قابلیت را دارا است تا دستورهای کدنویسی در آن به شکل واضح و تمیز نوشته شوند به طوری که بسیار نزدیک به زبان گفتار خوانده میشود که برای مثال در کد زیر از دیتا تایپ (نوع داده) لیست استفاده کردهایم و همانطور که مشاهده میکنید، ابتدا یک متغیر از نوع لیست تحت عنوان numbers ساخته و مقدارهای مد نظر را در آن ذخیره کردهایم:
numbers = [1,2,3,4,5,6,7]
evens = [x for x in numbers if x % 2 is 0]
odds = [y for y in numbers if y not in evens]در ادامه، متغیری تحت عنوان evens تعریف کردهایم که تمامی مقدارهای داخل لیست به شرط آنکه باقیمانده ی تقسیم هر یک از این مقدارها بر عدد دو، برابر با صفر باشد، در این متغیر ذخیره میشود؛ به عبارت بهتر، این متغیر تمامی مقدارهای زوج از لیست مذکور را نگاهداری میکند و در خط سوم نیز گفتهایم که تمامی مقدارهای موجود در لیست منهای مقدارهای ذخیرهشده در متغیر evens را ذخیره کند به طوری که این متغیر تمامی مقدارهای فرد موجود در لیست را نگاهداری میکند.
در مورد قطعه کد زیر باید بگوییم که ابتدا متغیری از نوع لیست تحت عنوان cities تعریف کرده و سه مقدار string را در آن ذخیره کردهایم و در ادامه تابعی تحت عنوان ()visit تعریف کردهایم و پارامتری تحت عنوان city را به عنوان آرگومان ورودی به این تابع پاس دادهایم. در خط سوم گفتهایم که آرگومان ورودی به این تابع، city، با رشته ی «Welcome to» به اصطلاح کانکَت شده و توسط تابع()print چاپ شود:
cities = ['London', 'Dublin', 'Oslo']
def visit(city):
print("Welcome to "+city)
for cname in cities:
visit(cname)حال در ادامه باید تابع تعریفشده را فراخوانی کنیم و برای این که این تابع به ازای تمامی مقدارهای موجود در لیست cities اجرا شود، باید متغیری تعریف کنیم تا قابلیت پیمایش این لیست را داشته باشد. بنابراین همانطور که در خط چهارم مشاهده میکنید، متغیری تحت عنوان cname تعریف کرده و گفتهایم که تمامی مقدارهای موجود در لیست cities در این متغیر ذخیره شده و به ازای هر یک از آنها یک بار تابع ()visit فراخوانی شود:
Welcome to London
Welcome to Dublin
Welcome to Osloکه در نتیجهی این فراخوانیها، سه عبارت فوق در خروجی چاپ خواهند شد.
تابع map در پایتون
زبان پایتون قابلیت برنامهنویسی functional را برای توسعه دهندگان فراهم میکند که در همین راستا تابع ()map یکی از بهترین تابعهای به اصطلاح Built-in در این زبان است که در ترکیب با تابعهای lambda عملکرد بهتری ارائه میدهد. (در توضیح تابع lambda باید گفت که این کلمه ی کلیدی در زبان برنامهنویسی پایتون امکان نوشتن یکسری تابعهای به اصطلاح Anonymous یا «بینام» را برای توسعه دهندگان فراهم میکند به طوری که ابتدا کلمه ی کلیدی lambda و به دنبال آن نام یکسری آرگومان ورودی مد نظر و در ادامه علامت : و پس از آن نیز تنها دستور مُجاز برای اِعمال روی آرگومانهای ورودی مذکور نوشته میشود.)
در مورد نحوه ی عملکرد تابع ()mapنیز باید گفت که این تابع ابتدا یک آرایه ی جدید میسازد تا مقدارهای حاصل از فراخوانی تابع مد نظر توسعه دهنده به ازای هر یک از اِلِمانهای آرگومان ورودی را در آن ذخیره کند و به خاطر داشته باشیم که این متد مقدارهای آرایۀ اصلی را تغییر نمیدهد:
x = [1, 2, 3]
z=lambda b : b + 1
y = map(z , x)
# prints out [2,3,4]
print(list(y))همانطور در کد فوق مشاهده میکنید، ابتدا آرایهای تحت عنوان x تعریف کردهایم که سه مقدار عددی در آن نگاهداری میشود و در ادامه تابع بینام lamba را تعریف کردهایم که آن را به متغیری فرضی تحت عنوان z منتسب نمودهایم و نیاز به توضیح نیست که ذکر این نام در تمامی نقاط برنامه به معنای فراخوانی تابع متناظر آن است. در ادامه متغیری تحت عنوانb را به عنوان آرگومان ورودی به تابع بینام مذکور داده و گفتهایم دستور b+1 را به ازای هر یک از مقدارهای ورودی اجرا کند. در واقع، این تابع هر مقداری را به عنوان ورودی دریافت کند آن را با عدد1 جمع کرده و در خروجی return میکند.
حال نوبت به اِعمال تابع ()map روی تابع بینام lambda میرسدبه این معنی که ()map تابع بینام منتسب به متغیر z را به ازای تمامی مقدارهای آرایۀ x فراخوانی کرده و مقدارهای حاصله را در آرایهای جدید تحت عنوان y ذخیره میکند؛ به عبارت بهتر، تابع ()map منجربه این خواهد شد تا دستور x+1 به ازای تمامی مقدارهای آرایۀ x اجرا شده و در متغیر y نگاهداری شوند و در ادامه این مقدارها با تابع از پیش تعریفشده ی ()list در قالب مقدارهایی از نوع داده ی لیست در معرض دید ما قرار خواهند گرفت.
newspaper3k در پایتون
این کتابخانه در زبان پایتون امکانی را برای توسعه دهندگان فراهم میکند تا بتوانند مقالات خبری و متادیتاهای مرتبط با آنها را از طیف وسیعی از نشریات بینالمللی موجود در وبسایتهای مختلف به اصطلاح پارس کرده و به دیتای آنها از جمله تصاویر، متن و نام نویسندگان دسترسی پیدا کنند. همچنین این کتابخانه برخی از قابلیتهای NLP (پردازش زبان طبیعی) را به منظور بررسی مقالات مد نظر دارا است. برای دانلود و نصب این ماژول ابتدا دستور زیر را در command line اجرا میکنیم:
$ pip install newspaper3kحال در ادامه قصد داریم تا یکی از مقالات منتشرشده در سکان آکادمی را با بهکارگیری از این ماژول مورد بررسی قرار دهیم. ابتدا کتابخانه Article از این ماژول را import میکنیم و همانطور که در کد زیر میبینید:
from newspaper import Article
url = 'https://sokanacademy.com/blog/9215/post'
article = Article(url)
article.download()
article.parse()
article.authorsآدرس مقاله ی مد نظر خود را در متغیری تحت عنوان url ذخیره میکنیم و در خط سوم آبجکتی تحت عنوان article از روی کلاس ()Article ساخته و متغیر url را به عنوان پارامتر ورودی به این تابع میدهیم و در ادامه و در خط چهارم تابع ()download از این کتابخانه را روی این آبجکت فراخوانی کرده و گفتهایم مقاله ی مد نظر از url مذکور را دانلود کند و در ادامه تابع ()parse از این کلاس را روی آبجکت مذکور فراخوانی کرده و گفتهایم که این مقاله را پارس کند. در نهایت در خط آخر از برنامه خواستهایم تا متاتگهای موجود در آن صفحه ی وب را بررسی کرده و مقدار متناظر با تگی تحت عنوان authors در صفحه ی وب مد نظر را در خروجی return کند.
اپراتور اورلودینگ
زبان برنامهنویسی پایتون دارای عملگرهایی است که به صورت کلاسهای به اصطلاح Built-in در این زبان تعریف شدهاند که از جمله مهمترین عملگرها در این زبان میتوان موارد زیر را نام برد:
- ()add
- ()sub
- ()lt
- ()gt
که هر یک از آنها به ترتیب برای جمع دو عدد، تفریق دو عدد، چک کردن کوچکتر یا مساوی و چک کردن بزرگتر یا مساوی بودن دو عدد به کار میروند و هر یک از این کلاسها متدهای خاصی را دارند که در هنگام ساخت آبجکتی از روی کلاس مد نظر، این متدها فراخوانی میشوند که برای مثال میتوان به ترتیب متدهای زیر را نام برد:
- ()__add__
- ()__sub__
- ()__lt__
- ()__gt__
حال اگر بخواهیم رفتار هر یک از این عملگرها را تغییر دهیم، باید متدهایی که در هنگام ساخت آبجکت جدید از این کلاسها فراخوانی میشوند را متناسب با نیاز خود تغییر دهیم و برای این منظور کلاسی دلخواه تعریف کرده و متدهای مد نظر خود را در آن Overload میکنیم.
به طور مثال، در کد زیر قصد داریم تا رفتار متدهای ()lt و ()gt را تغییر دهیم و همانطور که ملاحظه میکنید، در ابتدا کلاسی تحت عنوان Thing تعریف کردهایم که در حین ایجاد هر گونه آبجکتی از کلاس متد ()__init__ از کلاس مذکور به منظور مقداردهی اولیه به آن فراخوانی میشود که اولین آرگومان این متد self است که اشاره به خود کلاس دارد و بیانگر این است که آبجکت ساختهشده متعلق به این کلاس خاص است و آرگومان دوم نیز بیانگر پارامتری است که قرار است به عنوان آرگومان ورودی برای هر آبجکت ساختهشده از این کلاس در نظر گرفته شود:
class Thing:
def __init__(self, value):
self.__value = value
def __gt__(self, other):
return self.__value > other.__value
def __lt__(self, other):
return self.__value < other.__value
something = Thing(100)
nothing = Thing(0)
# True
something > nothing
# False
something < nothing
# Error
something + nothingبنابراین متدی تحت عنوان ()__init__ برای این کلاس تعریف کرده و دو آرگومان self و value را به آن میدهیم که self اشاره بر تعلق این متد به کلاس Thing داشته و value نیز بیانگر آرگومانی است که در هنگام ساخت آبجکت جدید از این کلاس باید مقداردهی شود.
دستور خط سوم بیانگر این موضوع است که اتربیوت _value در تمامی آبجکتهای ساختهشده از کلاس Thing باید به مقدار آرگومان value از این کلاس اختصاص داده شوند. حال در خط چهارم قصد داریم تا عملکرد متد ()gt را تغییر دهیم که برای این منظور تابع ()__gt__ از این کلاس را فراخوانی کرده و دو آرگومان ورودی self و other را به آن اختصاص میدهیم که آرگومان self به منظور اشاره بر کلاسی تعریف شده که این متد متعلق به آن است و other نیز به عنوان آرگومان ورودی به آبجکت ساختهشده از این کلاس اختصاص خواهد یافت که در ادامه و در خط پنجم گفتهایم که مقدار اولیۀ اختصاصیافته به آبجکت این کلاس را با مقدار تعریفشده برای آبجکت جدید از این کلاس مقایسه کند و در صورتی که مقدار اولیه بزرگتر از مقدار جدید بود، عبارت True را در خروجی return کند.
حال در خط ششم قصد داریم تا عملکرد متد ()lt را تغییر دهیم که روال کار همانند توضیحات بیانشده در رابطه با متد ()gt میباشد با این تفاوت که در خط هفتم گفتهایم که مقدار اولیۀ اختصاصیافته به آبجکت این کلاس را با مقدار جدید تعریفشده به آبجکت جدید از این کلاس مقایسه کند و در صورتی که مقدار اولیه کوچکتر از مقدار جدید بود، عبارت True را return کند.
در ادامه آبجکتی جدید از کلاس Thing تحت عنوان something میسازیم و مقدار ورودی 100 را به آن میدهیم و آبجکتی دیگر از این کلاس تحت عنوان nothing ساخته و مقدار ورودی 10 را به آن میدهیم حال برای اینکه دستورهای مربوط به دو خط یازدهم و سیزدهم اجرا شوند (دو آبجکت مد نظر با هم مقایسه شوند)، مفسر پایتون چک میکند که آیا متدهای مربوط به عملگرهای مقایسه در داخل این کلاس تعریف شدهاند یا خیر و همانطور که میبینیم دو متد ()__lt__ و ()__gt__ در این کلاس تعریف شدهاند و از همین روی این متدها فراخوانی شده و از آنجایی که مقدار ورودی 100 بزرگتر از عدد 10 است، دستور خط یازدهم عبارت True را return میکند وبه این ترتیب نیز دستور خط سیزدهم عبارت False را return میکند.
اما در مورد خط پانزدهم باید گفت که هنگامی که مفسر پایتون به عملگر + میرسد، چک میکند که آیا متد مربوط به این عملگر یا به عبارتی ()__add__ در کلاس Thing تعریف شده است یا خیر و همانطور که در کد فوق میبینید، متدی تحت این عنوان در این کلاس تعریف نشده است و بنابراین اجرای دستور خط پانزدهم منجر به ارور خواهد شد.
ماژول pprint
این ماژول امکانی را برای توسعه دهندگانی پایتون فراهم میآورد تا بتوانند برخی دیتا استراکچرهای پیچیده و یا تودرتو در قالب جیسون را به شکلی زیبا و خوانا در خروجی چاپ کنند. گرچه تابع ()print نیز همین کار را انجام میدهد اما این در حالی است که تابع ()print در مورد چاپ دادههای پیچیده از قابلیت خوانایی پایینی برخوردار است که در همین راستا مثال زیر را برای ماژول pprint مورد بررسی قرار میدهیم:
import requests
import pprint
url = 'https://randomuser.me/api/?results=1'
users = requests.get(url).json()
pprint.pprint(users)همانطور که در کد بالا میبینید، ابتدا ماژول requests را در برنامه import میکنیم که به منظور دریافت دیتای مربوط به یک یوآرال خاص در قالب جیسون به کار گرفته میشود و در ادامه ماژول pprint را import کرده و متغیری تحت عنوان url را به منظور نگاهداری آدرس وبپیج مد نظر تعریف میکنیم. در ادامه آبجکتی تحت عنوان users از کلاس ()get مربوط به ماژول requests ساختهایم تا دیتای مد نظر را از آدرس یوآرال مذکور و در قالب جیسون فِچ کرده و در آن نگاهداری کند که در ادامه این متغیر را به عنوان آرگومان ورودی به تابع ()pprint از ماژول pprint دادهایم تا دیتای مد نظر را به شکلی ساختاریافته در خروجی چاپ کند.
صَف (queue) در پایتون
زبان پایتون قابلیت برنامهنویسی به اصطلاح Multithreading (چندنَخی) را دارا است که در آن برخی از دستورالعملهای برنامه امکان اجرا به صورت Concurrent (موازی) را دارند که این قابلیت با بهکارگیری از ماژول استاندارد Queue در این زبان تسهیل میشود.
این ماژول امکان ساخت دیتا استراکچرهایی از نوع صَف را برای توسعه دهندگان فراهم میکند به طوری که قابلیت هندل کردن برخی از تَسکها بر اساس یکسری قوانین خاص برای ایشان فراهم میشود که یکی از این قوانین، First In First Out یا به اختصار FIFO است که در آن هر یک از تَسکها به همان ترتیبی که وارد صف شدهاند اجرا میشوند و قانون بعدی Last In First Out یا به اختصار LIFO است که بر اساس این قانون نیز اولین تَسک اضافهشده به صف در ابتدا اجرا میشود و در نهایت قانون دیگری وجود دارد که در آن توسعه دهندگان برای هر یک از تَسکهای موجود در صف، اولویتهای متفاوتی را تعریف میکنند و تَسکی که از اولویت بالاتری برخوردار بوده در ابتدا بازیابی و اجرا میشود.
متد __repr__
این مورد هم یکی از تابعهای Built-in در زبان پایتون است که توسعه دهندگان میتوانند تابع مذکور را برای نمایش یک توصیف رسمی از فیچرهای آبجکت مد نظر خود استفاده کنند. برای مثال در کُد زیر داریم:
file = open('test.txt', 'r')
print(file)در کد بالا، آبجکتی تحت عنوان file از تابع ()open ساخته و دو آرگومان را به عنوان ورودی به این تابع پاس دادهایم که هر یک از این آرگومانها به ترتیب مربوط به نام فایلی است که به عنوان ورودی به تابع مذکور دادهایم و آرگومان دوم هم بیانگر سطح دسترسی ما به فایل مد نظر است که در اینجا کیوورد r اشاره به کلمۀ Read دارد و بیانگر این موضوع است که سطح دسترسی ما به این فایل صرفاً «خواندن» فایل بوده و نمیتوانیم چیزی را از آن حذف و یا به آن اضافه کنیم.
در ادامه و در خط دوم از برنامه خواستهایم تا اطلاعات فایل مذکور که در متغیر file ذخیره شده است را در خروجی چاپ کند که یک روال معمول برای نمایش اطلاعات فایل مد نظر است و در شرایطی که بخواهیم توصیفی به اصطلاح کاستومایزشده از این فایل در معرض دیدمان قرار گیرد، از فانکشن ()__repr__ استفاده میکنیم که برای این منظور داریم:
class someClass:
def __repr__(self):
return "<some description here>"
someInstance = someClass()
# prints <some description here>
print(someInstance)همانطور که در کد فوق میبینید، تابع ()__repr__ متناسب با نیاز توسعه دهندگان اورلود شده است که در همین راستا این متد را در کلاسی تحت عنوانِ دلخواهِ someClass تعریف کرده و آرگومان self به این متد داده شده است که اشاره به تعلق این متد به کلاس someClass دارد و دستور خط سوم نیز بیانگر این موضوع است که متد مذکور توضیحی متناسب با نیاز توسعه دهنده را در خروجی ریترن کند. در ادامه و در خط چهارم آبجکتی تحت عنوان someInstance از کلاس مذکور ساختهایم و در خط پنجم این آبجکت را به توسعه دهنده ()print پاس دادهایم تا نتیجه را در خروجی چاپ کند.
کتابخانه sh
این کتابخانه اینترفیسی را برای توسعه دهندگان فراهم میآورد تا بتوانند پِراسسهای زیرشاخۀ برنامه را به صورت یکپارچه و تحت عنوان یک تابع معمولی فراخوانی کنند و به برخی از کتابخانههای متفاوت مورد نیاز برای اجرای هر یک از این پِراسسها دسترسی پیدا کرده و آنها را هندل کنند که برای مواردی همچون خودکارسازی وُرکفلوها و هندل کردن تَسکهای مختلف به صورت یکپارچه مفید است.
تایپ هینت Type Hint در پایتون
پایتون یک زبان برنامهنویسی به اصطلاح داینامیک تایپ استبه این معنی که برای تعریف نوع متغیرها، تابعها و کلاسها نیاز نیست که دیتا تایپ مربوط به هر یک از آنها را در برنامه مشخص کنیم که این فیچر منجر به افزایش سرعت توسعه ی نرمافزار میشود اما این در حالی است که عدم تعریف دیتا تایپ در نوشتن کدها معایبی نیز دارا است که از جمله مهمترین آنها میتوان به ارورهای ناشی از عدم تشخیص دیتا تایپ در پروژههای بزرگ و کاهش خوانایی کُد اشاره کرد که در همین راستا از نسخۀ 3.5 به بعدِ پایتون، ویژگی Type Hint در پایتون به این زبان افزوده شد که امکان اشارۀ مستقیم به دیتا تایپ متغیرها و همچنین خروجی تابعهای برنامه را برای توسعه دهندگان فراهم کرده است. برای مثال در کد زیر داریم:
def addTwo(x : int) -> int:
return x + 2در کُد فوق تابعی تحت عنوان ()addTwo تعریف کردهایم و پارامتر x را به عنوان آرگومان ورودی به آن پاس دادهایم و پس از علامت : گفتهایم که پارامتری ورودیِ x باید از نوع int (عدد صحیح) باشد و علامت <- و پس از آن کلمۀ int بدین معنا هستند که خروجی تابع مذکور نیز از جنس int خواهد بود که در نهایت در خط دوم گفتهایم که عدد ورودی را با عدد 2 جمع کرده و در خروجی ریترن کند.
همچنین زبان پایتون فیچری تحت عنوان Type Aliase دارا است که در آن میتوان دیتا تایپ مد نظر خود را به یک متغیر فرضی منتسب کرد. در واقع، یک نام مستعار به دیتا تایپ مد نظر خود اختصاص میدهیم تا در صورت نیاز به ذکر آن در طِی برنامه، با ذکر این نام مستعار پیچیدگی کُد کاهش یافته و موجب خوانایی بیشتر آن میشود و برای این منظور زبان پایتون ماژولی تحت عنوان typing دارا است:
import typing
Vector = List[float]
Matrix = List[Vector]
def addMatrix(a : Matrix, b : Matrix) -> Matrix:
result = []
for i,row in enumerate(a):
result_row =[]
for j, col in enumerate(row):
result_row += [a[i][j] + b[i][j]]
result += [result_row]
return result
x = [[1.0, 0.0], [0.0, 1.0]]
y = [[2.0, 1.0], [0.0, -2.0]]
z = addMatrix(x, y)در توضیح کد فوق باید بگوییم که ابتدا ماژول typing را ایمپورت کرده و در خط دوم نام مستعار Vector را به دیتا تایپ «لیستی از اعداد اعشاری» اختصاص دادهایم و در خط سوم نیز گفتهایم که برای نوع دادۀ «لیستی از یکسری Vector» که بیانکنندۀ لیستهای تودرتو از اعداد اعشاری بوده یا به عبارتی لیستی متشکل از چند سطر از اعداد اعشاری میباشد، نام مستعار Matrix را انتخاب کردهایم.
در ادامه و در خط چهارم تابعی تحت عنوان addMatrix را تعریف کردهایم و قصد داریم تا این فانکشن دو ماتریس فرضی a و b را با هم جمع کند که در همین راستا به تابع addMatrix دو آرگومان ورودی a و b را دادهایم و دیتا تایپ هر دو را Matrix تعیین کردهایم (Matrix یک نام مستعار برای دیتا تایپ لیستی چند سطری از اعداد اعشاری میباشد) و گفتهایم که خروجی این تابع نیز از نوع Matrix خواهد بود.
در خط پنجم متغیر result را تعریف کردهایم که قرار است تا خروجی حاصل از جمع دو ماتریس را نگاهداری کند و در خط ششم دو متغیر تحت عنوان i و row را تعریف کردهایم که بتوانیم اِلِمانهای هر یک از سطرهای ماتریس مد نظر را پیمایش کنیم.
در ادامه تمامی سطرهای پیمایششده از ماتریس مذکور را در متغیری تحت عنوان result_row ذخیره خواهیم کرد و کیورد enumerate نیز به عنوان شمارندهای در جهت پیمایش تکتک اِلِمانهای هر سطر از این ماتریس به کار گرفته شده است. در خط هشتم دو متغیر j و col تعریف کردهایم تا بتوانیم هر یک از عناصر موجود در سطرهای ماتریس result_row را پیمایش کنیم که به معنی پیمایش اِلِمانهای موجود در هر ستون از سطرهای ماتریس مذکور میباشد و در خط نهم نیز از برنامه خواستهایم تا اِلِمانهای متناظر از هر ستون و سطر مربوطه را با هم جمع کرده و در ماتریس result_row نگاهداری کند که در نهایت مقادیر هر یک از سطرهای این ماتریس را با هم جمع کرده و نتیجه را در ماتریس result ذخیره کردهایم.
برای فراخوانی این تابع نیز دو ماتریس تحت عناوین x و y تعریف کرده و به عنوان آرگومان ورودی به تابع مذکور میدهیم و همانطور که در خط آخر از کُد فوق میبینید، آبجکتی تحت عنوان z از تابع ()addMatrix ساخته و دو ماتریس x و y را به عنوان ورودی به این تابع دادهایم که نتیجۀ حاصل از جمع این دو ماتریس در متغیر z نگاهداری خواهد شد.
uuid در پایتون
UUID مخفف عبارت Universally Unique Identifier است و ماژولی تحت همین عنوان نیز در پایتون امکان تولید اعداد تصادفی منحصربهفرد به طول 128 بیت را در اختیار توسعه دهندگان قرار میدهد به طوری که میتوان از این اعداد به عنوان یک شناسهی منحصربهفرد به منظور شناسایی داکیومنتها، هاستها، کلاینتهای مد نظر و هر آنچه که نیاز به نامگذاری یونیک دارند استفاده کرد. برای مثال در کد زیر داریم:
import uuid
user_id = uuid.uuid4()
print(user_id)در کد فوق، ابتدا ماژول مربوطه را ایمپورت کرده و در ادامه با فراخوانی فانکشن ()uuid4 از این ماژول، عددی رندوم تولید خواهد شد که این عدد در متغیری تحت عنوان user_id نگاهداری میشود که با اجرای دستور خط سوم عدد تصادفی مذکور توسط فانکشن ()print چاپ میشود.
محیط مجازی پایتون
در زبان برنامهنویسی پایتون ممکن است برای توسعهی اپلیکیشنها در برخی شرایط خاص نیاز به استفاده از پکیجها و یا ماژولهایی داشته باشیم که متعلق به نسخههای متفاوتی از این زبان باشند. برای مثال اپلیکیشن «الف» نیاز به یک ماژول خاص از پایتون نسخهی سه داشته اما این در حالی است که اپلیکیشن «ب» نیاز به همین ماژول از نسخۀ دوم این زبان دارد که در چنین شرایطی سولوشن مناسب برای حل این مشکل ساخت یک به اصطلاح Virtual Environment (محیط مجازی) است که با استفاده از آن بتوانیم نسخهی دیگری از این زبان را نیز روی سیستم خود نصب کنیم که زبان برنامهنویسی پایتون برای ساخت و مدیریت این محیط روی سیستم، ماژولی تحت عنوان venv دارا است که برای دانلود و نصب آن دستور زیر را در کامندلاین تایپ میکنیم:
$ python3 -m venv my-projectهمانطور که در دستور فوق مشخص است، نسخۀ پایتون مد نظر خود را نوشته و در ادامه نام ماژول مورد نیاز برای ساخت محیط مجازی را آوردهایم و به دنبال آن نیز دایرکتوری مناسب برای ساخت این محیط را وارد میکنیم. درون این دایرکتوری یکسری دایرکتوریهای زیرشاخۀ دیگر به منظور نصب ماژولها و دیپندسیهای مورد نیاز اپلیکیشن ایجاد خواهند شد که بدین منظور هم ابتدا باید محیط مجازی ساختهشده را اَکتیو کنیم و در همین راستا دستور زیر را اجرا میکنیم:
$ source my-project/bin/activateدر نهایت داریم:
$ pip install all-the-modulesمیتوانیم ماژولهای مد نظر خود را روی این محیط و با اجرای دستور فوق نصب کنیم.
wikipedia
وبسایت ویکیپدیا یکسری API دارا است که این امکان را در اختیار توسعه دهندگان قرار میدهند تا بتوانند با دسترسی به آنها از دیتای عظیم وبسایت استفاده کنند و در همین راستا نیز زبان برنامهنویسی پایتون ماژولی تحت عنوان wikipedia دارد که قابلیت دسترسی به این وب سرویس را در اختیار توسعه دهندگان قرار میدهد. همچنین این ماژول قابلیت پشتیبانی از زبانهای مختلفی همچون انگلیسی، فارسی و غیره را دارا است و از جملۀ دیگر ویژگیهای این ماژول میتوان به توانایی تشخیص پیجها، تاپیکها و مطالبی با عناوین مشابه اشاره کرد. همانطور که در کد زیر میبینید:
import wikipedia
result = wikipedia.page('Persian Language')
print(result.summary)
for link in result.links:
print(link)ابتدا ماژول wikipedia را ایمپورت کرده و در خط دوم گفتهایم که اطلاعات مربوط به واژگان «Persian Language» را از وبسایت ویکیپدیا فِچ کرده و در متغیر result ذخیره کند و در خط سوم دیتای جمعآوریشده توسط فانکشن ()print چاپ میشود. در ادامه و در خط چهارم هم گفتهایم که به ازای تمامی لینکهای موجود در دیتای جمعآوریشده، لینکهایی را در خروجی چاپ کند که در عنوان آنها یکی از کلماتِ «Persian» و «Language» به کار رفته باشد.
xkcd در پایتون
در داکیومنتهای مربوط به برخی ماژولهای استاندارد پایتون شاهد برخی طرحهای تصویری آمیخته به طنز هستیم که در همین راستا وبسایت xkcd (سایتی برای انتشار طرحهای تصویری طنزآمیز در رابطه با زبان، لطیفه و ریاضیات) بخشی از مطالب خود را به انتشار طرحهای به اصطلاح Comic در رابطه با زبان پایتون اختصاص داده است مضاف بر اینکه این زبان ماژولی تحت عنوان xkcd دارا است که اینترفیسی را در اختیار توسعه دهندگان قرار میدهد تا بتوانند به این وبسایت دسترسی داشته و دیتای مد نظر خود را در قالب جیسون از آن بازیابی کنند. همچنین با اجرای دستور زیر در command line نیز میتوان به وبپیج طرحهای تصویری مربوط به زبان برنامهنویسی پایتون دسترسی یافت:
import antigravityنیاز به توضیح نیست که برای استفاده از فیچرهای ماژول xkcd ابتدا باید آن را طبق روال مثالهای قبل دانلود و نصب نمایید.
YAML
YAML مخفف عبارت YAML Ain’t Markup Language بوده و یک استاندارد رایج برای تبدیل دادهها به فرمتی است که دیتای مد نظر قابلیت انتقال، ذخیره و بازسازی در بستر وب را داشته باشد. همچنین استاندارد YAML یکسری فیچر به منظور نمایش دیتا دارا است که منجر بدین گشته تا به عنوان یک به اصطلاح Superset یا «زیرشاخه» از استاندارد جیسون به شمار آید که از جملۀ این فیچرها میتوان به امکان ذخیرهسازی آبجکتهای پیچیدهتر به همراه اِلِمانهای تشکیلدهندۀ آن و نوشتن فایلهای کانفیگ اشاره کرد.
در همین راستا، ماژول PyYAML امکان استفاده از فرمت دادهی YAML را در زبان برنامهنویسی پایتون برای توسعه دهندگان فراهم میآورد که این ماژول قابلیت ذخیرهسازی تمامی دیتاتایپها و آبجکتهای کلاسهای تعریفشده در برنامه را در اختیار ایشان قرار میدهد.
تابع zip
تابع از پیش تعریفشدۀ ()zip قابلیتی دارا است که طی آن مقادیری از آبجکتهای متعلق به دو لیست را دریافت کرده و آنها را به یک نوع دادۀ دیکشنری متشکل از مقادیر این دو آرایه تبدیل میکند. برای مثال در کد زیر داریم:
keys = ['a', 'b', 'c']
vals = [1, 2, 3]
zipped = dict(zip(keys, vals))در خط اول آرایهای تحت عنوانِ دلخواهِ keys را تعریف کرده و سه مقدار اِسترینگ را در آن ذخیره کردهایم و در خط دوم آرایۀ دیگری تحت عنوان vals تعریف کرده و سه مقدار عددی را در آن نگاهداری کردهایم. حال در ادامه با استفاده از دستور خط سوم، یک دیکشنری تحت عنوان zipped میسازیم که کلیدهای آن از آرایۀ keys و مقادیر متناظر آنها را از آرایۀ vals و دقیقاً بر اساس ترتیب مطرحشده در دو آرایه انتخاب میکنیم که نتیجۀ حاصل ذخیرهشده در متغیر zipped را به فانکشن از پیش تعریفشدۀ ()dict میدهیم تا خروجی را در قالب نوع دادۀ دیکشنری در معرض دید ما قرار دهد.
آنچه در این مقاله گفته شد، برخی از کاربردیترین قابلیتهای زبان برنامهنویسی پایتون بود که با آگاهی از آنها میتوان کدهای اثربخشتری نوشت. همچنین اگر علاقمند به دیگر مباحث مرتبط هستید، با دنبال کردن برچسب #پایتون میتوانید به لیستی از مقالات مربوطه دست یابید.
