در شماره گذشته با تعدادی از ترفندهای کاربردی زبان برنامهنویسی پایتون آشنا شدیم. در این بخش ادامه این ترفندها را بررسی میکنیم. همه ی این نکات، ترفندها ، منابع لازم و غیره که در مسیر یادگیری نیاز دارید را در بوت کمپ پایتون میتوانید یاد بگیرید.
سربارگذاری عملگرها در پایتون
یکی از کاربردیترین ویژگیهای زبانهای برنامهنویسی، قابلیت سربارگذاری عملگرها (Operator Overloading) است. در حین آموزش در بوت کمپ برنامه نویسی قابلیت فوق به برنامهنویسان اجازه میدهد عملگرهای مختلف تعریف شده در زبان برنامهنویسی را با اشیاء یک کلاس خاص که توسط خودشان تعریف میشود استفاده کنند. بهطور مثال، با استفاده قابلیت سربارگذاری عملگرها میتوان از عملگر +، به غیر از جمع کردن انواع متغیرهای حاوی مقادیر عددی، برای متصل کردن (Concatenating) دو متغیر حاوی مقادیر رشتهای استفاده کرد. به بیان دقیقتر، برنامهنویس میتواند از عملگرهای استاندارد پایتون، برای انجام گروه خاصی از عملیات روی یک شیء تعریف شده توسط کاربر (user Defined) استفاده کند.
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
دستور pprint
دستور print در زبان برنامهنویسی پایتون پاسخگوی بخش عمدهای از نیازهای برنامهنویسان است. با این حال، هنگامیکه برنامهنویس قصد چاپ اشیاء بزرگ و متداخل را دارد، خروجی این دستور چندان جالب توجه نیست. یکی از بهترین ترفندهای برنامهنویسی در پایتون برای ساختار دادن به نمایش دادهها در خروجی، استفاده از ماژول pretty-print یا pprint در زبان برنامهنویسی پایتون است. این ماژول، اشیاء ساخت یافته و پیچیده را به شکل مرتب و خوانا در خروجی نمایش میدهد.
import requests
import pprinturl = ‘https://randomuser.me/api/?results=1’
users = requests.get(url).json()pprint.pprint(users)
تکخطیهای قدرتمند
تاکنون تلاش کردهاید چند خط را بخوانید و در میان دستورات شرطی اشتباه کنید؟ اگر با چنین مشکلی روبرو شدهاید دستورات تکخطی پایتون مناسب شما هستند. برای نمونه دستورات شرطی زیر را در نظر بگیرید:
>>> if alpha > 7:
>>> beta = 999
>>> elif alpha == 7:
>>> beta = 99
>>> else:
>>> beta = 0
این کد را میتوان به شکل زیر کاملاً سادهسازی کرد:
>>> beta = 999 if alpha > 7 else (beta = 99 if alpha == 7 else 0)
این قابلیت کاملا کاربردی و قدرتمندی است. شما میتوانید به کدهایی که مینویسید توجه کنید و همواره جاهایی را پیدا کنید که میتوانید از دستورات تکخطی در آنها استفاده کنید. علاوه بر دستورات شرطی، حلقههای for را نیز میتوان سادهسازی کرد. برای نمونه کد دوبل کردن لیستی از اعداد صحیح در چهار خط به صورت زیر:
>>> lst = [1, 3, 5]
>>> doubled = []
>>> for num in lst:
>>> doubled.append(num*2)
را میتوان به صورت تک خطی زیر سادهسازی کرد:
>>> doubled = [num * 2 for num in lst]
البته اگر همه چیز را در دستورات تکخطی به شکل زنجیرهوار بنویسید باعث سردرگمی میشود. بنابراین، باید مطمئن شوید در کدهای خود بیش از حد از دستورات تکخطی استفاده نمیکنید، زیرا برخی برنامهنویسان معتقد هستند که استفاده فراوان از دستورات تکخطی کار حرفهای نیست.
>>> import pprint; pprint.pprint(zip((‘Byte’, ‘KByte’, ‘MByte’, ‘GByte’, ‘TByte’), (1 << 10*i for i in xrange(5))))
ماژول Queue
زبان برنامهنویسی پایتون، از طریق ماژول Queue، امکان برنامهنویسی چندریسمانی (Multithreading) را ارایه میکند. با استفاده از این ماژول، برنامهنویسان قادر به پیادهسازی ساختارهای دادهای صف (Queue Data Structures) هستند. این ساختارهای دادهای به برنامهنویسان اجازه میدهند عناصر را با توجه به یک قانون خاص، اضافه و بازیابی کنند. بهطور مثال، صفهای خروج به ترتیب ورود (First In, First Out | FIFO) اشیاء را به ترتیبی که در آن وارد صف شدهاند، بازیابی میکنند و صفهای آخرین ورودی / اولین خروجی (Last In, First Out | LIFO)، به برنامهنویس اجازه میدهند به جدیدترین اشیاء اضافه شده به صف، زودتر از دیگر از اشیاء دست پیدا کنند. صفهای اولویت (Priority Queues) نیز به کاربران اجازه میدهند، اشیاء را به ترتیبی که ذخیره شدهاند، بازیابی کنند.
پیشنهاد مقالات: آموزش کار با ماژول در پایتون
#!/usr/bin/python3
import _thread
import time
# Define a function for the thread
def print_time( threadName, delay):
count = 0
while count < 5:
time.sleep(delay)
count += 1
print (“%s: %s” % ( threadName, time.ctime(time.time()) ))
# Create two threads as follows
try:
_thread.start_new_thread( print_time, (“Thread-1”, 2, ) )
_thread.start_new_thread( print_time, (“Thread-2”, 4, ) )
except:
print (“Error: unable to start thread”)
while 1:
pass
__repr__
در هنگام تعریف یک کلاس یا یک شیء در زبان برنامهنویسی پایتون، آماده کردن یک نمایش رسمی از اشیاء کلاس در قالب رشته متنی (String)، باعث بهبود خوانایی کدها میشود.
>>> file = open(‘file.txt’, ‘r’)
>>> print(file)
<open file ‘file.txt’, mode ‘r’ at 0x10d30aaf0>
این گروه از ترفندهای برنامه نویسی در پایتون عیبیابی کدها را سادهتر میکنند. با استفاده از دستورات زیر، میتوان چنین امکانی را به تعریف کلاسها اضافه کرد:
class someClass:
def __repr__(self):
return “<some description here>”someInstance = someClass()# prints <some description here>
print(someInstance)
دستکاری سریع رشتهها
دستکاری رشتهها واقعا خستهکننده است، اما پایتون برخی میانبرهای پنهان برای سادهسازی عمده این قبیل کارها دارد. برای معکوسسازی یک رشته میتوانیم 1-:: را مانند اندیسهای لیست اضافه کنیم:
>>> a = “ilovepython”
>>> print a[::-1]
nohtypevoli
همین ترفند را میتوانیم در مورد یک فهرست از اعداد صحیح استفاده کنیم تا دستکاری رشتهها در پایتون به فرایندی ساده تبدیل شود. بهطور مثال، اگر میخواهید یک جمله را با استفاده از متغیرهای از پیش تعریف شده str1, str2 و lst3 در خروجی به صورت زیر ارائه کنید:
>>> str1 = “Totally”
>>> str2 = “Awesome”
>>> lst3 = [“Omg”, “You”, “Are”]
کافی است از متد ()join. و عملگرهای حسابی برای ایجاد جمله مطلوب خود استفاده کنید:
>>> print ‘ ‘.join(lst3)
Omg You Are
>>> print ‘ ‘.join(lst3)+’ ‘+str1+’ ‘+str2
Omg You Are Totally Awesome
علاوه بر دستکاری رشته، پیشنهاد میشود از عبارتهای منظم یا به عبارت دقیقتر با قاعده (regex) برای جستوجوی مؤثر رشتهها و الگوهای فیلتراسیون استفاده کنید.

کتابخانه sh
زبان برنامهنویسی پایتون، یکی از بهترین زبانها برای اسکریپتنویسی (Scripting) است. زبانهای اسکریپتنویسی، زبانهای برنامهنویسی محیطهای زمان اجرا (Run-Time Environment) هستند که برای خودکارسازی اجرای وظایف در این محیطها استفاده میشوند. کتابخانه sh، به برنامهنویسان اجازه میدهد تا برنامهها را به راحتی و مانند اجرای یک تابع، فراخوانی کنند. استفاده از این کتابخانه، یکی از ترفندهای برنامهنویسی در پایتون محسوب میشود و برای خودکارسازی جریانهای کاری و وظایف در محیط برنامهنویسی پایتون استفاده میشود:
import sh
sh.pwd()
sh.mkdir(‘new_folder’)
sh.touch(‘new_file.txt’)
sh.whoami()
sh.echo(‘This is great!’)
قابلیت تعریف Type Hints
یکی از مهمترین ترفندهای برنامهنویسی در پایتون برای ارتقاء خوانایی کدها، به ویژه برای برنامهنویسان حرفهای، قابلیت Type Hints است. در زبان برنامه نویسی پایتون، ضرورتی ندارد برای متغیرها، توابع، کلاسها و سایر موارد، نوع دادهای (Datatype) تعریف شود. این قابلیت، امکان توسعه سریع برنامهها را فراهم میآورد. با این حال، کوچکترین مشکل مرتبط با نوع دادهای، باعث بروز خطای زمان اجرا (Run-Time Error) میشود. از نسخه 3.5 پایتون به بعد، برنامهنویسان میتوانند از قابلیت Type Hints در هنگام تعریف توابع استفاده کنند. بهطور مثال،
def addTwo(x : Int) -> Int:
return x + 2
کد بالا برای پایتون مشخص میکند که نوع دادهای مورد انتظار برای متغیر x و خروجی تابع، از نوع Int یا صحیح است. علاوه بر این، برنامهنویسان میتوانند برای نوعها یا ساختارهای دادهای، نام مستعار (Alias) انتخاب کنند.
from typing import ListVector = 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 resultx = [[1.0, 0.0], [0.0, 1.0]]
y = [[2.0, 1.0], [0.0, -2.0]]z = addMatrix(x, y)
به کارگیری قابلیت Type Hints، خوانایی کدهای نوشته شده به زبان پایتون را افزایش میدهد. علاوه بر این، احتمال وقوع خطاهای زمان اجرا (مرتبط با نوع دادهای) در برنامهها کم میشود. این قابلیت، به ویژه در پروژههای بزرگ و پیچیده نرمافزاری، بسیار کاربردی است.
ماژول uuid
یکی از سادهترین و سریعترین روشهای تولید شناسههای یکتای عمومی (Universally Unique IDs)، استفاده از ماژول UUID در کتابخانه استاندارد پایتون است. بهطور مثال:
import uuid
user_id = uuid.uuid4()
print(user_id)
چنین کدی، یک عدد 128 بیتی تصادفی تولید میکند که در بیشتر موارد یکتا است، زیرا 2 به توان 122 شناسه یکتا، توسط این ماژول تولید میشود. در این حالت، احتمال پیدا کردن نسخههای تکراری (Duplicates) در یک مجموعه، پایین است. بهطور مثال، با داشتن حدود 1 تریلیون شناسه یکتا، احتمال پیدا کردن نسخههای تکراری، یک در یک میلیارد است.
ترکیب تو در توی لیستها
Itertools یکی از محبوبترین کتابخانههای پایتون است. فرض کنید کدی حاوی دهها لیست دارید و پس از برخی دستکاریها با لیستهای تو در توی کاملاً درهمتنیدهای روبرو شدهاید. Itertools دقیقاً همان چیزی است که برای رفع این آشفتگی نیاز دارید.
>>> import itertools
>>> flatten = lambda x: list(itertools.chain.from_iterable(x))
>>> s = [[‘”‘, ‘An’, ‘investment’], [‘in’], [‘knowledge’], [‘pays’], [‘the’, ‘best’], [‘interest.”‘, ‘–‘], [‘Benjamin’], [‘Franklin’]]
>>> print(‘ ‘.join(flatten(s)))
” An investment in knowledge pays the best interest.” — Benjamin Franklin
همانگونه که مشاهده میکنید، میتوانیم لیستها و رشتههای تو در تو را با استفاده از ()join. و itertools با هم ترکیب کنیم. متد ()combinations. در itertools ابزار قدرتمندی برای بازگشت دادن طول زیر دنبالهای از عناصر iterable ورودی است.
محیطهای مجازی
یکی از مهمترین ترفندهای برنامه نویسی در پایتون برای کاهش خطاهای اجرایی، استفاده از محیطهای مجازی برای مدیریت پروژههای نرمافزاری در پایتون است. بهطور معمول، احتمال این موضوع زیاد است که یک برنامهنویس، بهطور همزمان روی بیش از یک پروژه کار کند. در برخی مواقع، دو پروژه مختلف به نسخههای متفاوتی از یک وابستگی (Dependency) نرمافزاری (ماژول، تابع، بسته و سایر موارد) یکسان احتیاج دارند. قابلیت تولید محیطهای مجازی در پایتون، به برنامهنویسان اجازه میدهد تا بتوانند از نسخههای مختلف وابستگیها در پروژههای خود استفاده کنند.
python -m venv my-project
source my-project/bin/activate
pip install all-the-modules
با استفاده از کدهای بالا، این امکان وجود دارد که تمامی نسخههای مستقل از پایتون را، روی یک کامپیوتر استفاده کنید.
ماژول دسترسی به واسط برنامهنویسی کاربردی ویکیپدیا
دانشنامه ویکیپدیا یک واسط برنامهنویسی کاربردی عالی برای دسترسی نرمافزاری به دانش و اطلاعات آزاد موجود در این دانشنامه، در اختیار برنامهنویسان قرار داده است. ماژول ویکیپدیا در پایتون، امکان دسترسی آسان به این واسط را در زبان برنامهنویسی پایتون به شکل زیر فراهم میکند.
import wikipedia
result = wikipedia.page(‘freeCodeCamp’)
print(result.summary)
for link in result.links:
print(link)
این ماژول، مانند وبسایت اصلی، امکاناتی از قبیل دسترسی به صفحات در زبانهای مختلف، ابهامزدایی از صفحات، بازیابی تصادفی صفحات و سایر موارد را در اختیار کاربران قرار میدهد.
ماژول PyYAML برای YAML
زبان YAML سرنام YAML Ain’t Markup Language یک زبان قالببندی داده است. این زبان در اصل ابرمجموعه (Superset) زبان JSON به شمار میرود، به این معنا که تمامی قالبهای دادهای تعریف شده به وسیله JSON، توسط تجزیهکننده (Parser) زبان YAML قابل تجزیه و تحلیل نحوی (Parse) هستند. با اینحال، برعکس JSON، این ماژول میتواند اشیاء پیچیدهتری را ذخیره کند و به عناصر خودش ارجاع دهد. علاوه بر این، امکان نوشتن توضیحات برای فایلهای پیکربندی نیز وجود دارد. از طریق ماژول PyYAML، امکان استفاده از YAML در پایتون وجود دارد.
$ pip install pyyaml
import yaml
با استفاده از ماژول PyYAML، میتوان اشیاء تعریف شده از هر نوع دادهای در زبان پایتون و ، اشیاء هر کلاس تعریف شده به وسیله کاربر را ذخیره کرد.
ساختمانهای داده ساده
یکی از نکات جالب توجهی که در ارتباط با زبان پایتون وجود دارد، بهکارگیری دستورات تکخطی برای مقداردهی اولیه ساختمانهای داده است:
>>> def tree(): return defaultdict(tree)
در کدی که در بخش فوق نشان داده شده است، یک درخت تعریف میشود که لغتنامهای است که مقدارهای پیشفرض آن درختها هستند. توابع تکخطی دیگری مثل تولیدکننده اعداد اول نیز به شرح زیر در دسترس قرار دارند:
>>> reduce( (lambda r,x: r-set(range(x**2,N,x)) if (x in r) else r),
range(2,N), set(range(2,N)))
این مدل توابع را روی سایتهایی مثل گیتهاب یا Stack Overflow قابل رویت هستند. پایتون کتابخانههای قدرتمندی مانند Collections نیز دارد که به حل طیف متنوعی از مسائل واقعی بدون نوشتن کدهای طولانی کمک میکنند.
>>> from collections import Counter
>>> myList = [1,1,2,3,4,5,3,2,3,4,2,1,2,3]
>>> print(Counter(myList))
Counter({2: 4, 3: 4, 1: 3, 4: 2, 5: 1})
تابع zip
یکی از جذابترین ترفندهای برنامهنویسی پایتون، تابع ()zip است. این تابع، تعدادی شیء قابل تکرار را به عنوان ورودی دریافت و فهرستی از چندتاییها را در خروجی تولید میکند. هر چندتایی، عناصر یک شیء ورودی را بر اساس شاخص مکانی آنها گروهبندی میکند. علاوه بر این، برای انجام معکوس این عملیات، از تابع ()zip* استفاده میشود.
keys = [‘a’, ‘b’, ‘c’]
vals = [1, 2, 3]
zipped = dict(zip(keys, vals))
پیشنهاد مقالات: کار با دیکشنری در پایتون
کلام آخر
در این مطلب و مطلب شماره قبل سعی کردیم شما را با کاربردیترین ترفندهای زبان برنامهنویسی پایتون آشنا کنیم. بیشتر این ترفندها، برای سادهسازی روند برنامهنویسی و خوانایی کدهای پایتون استفاده میشوند. ترفندهای برنامه نویسی پایتون در یادگیری برنامه نویسی ، امکان استفاده از ظرفیت کامل این زبان برنامهنویسی را در اختیار برنامهنویسان قرار میدهند.


