ترفندهای برنامه نویسی در پایتون — از صفر تا صد

۱۰۰۳ بازدید
آخرین به‌روزرسانی: ۱۴ تیر ۱۴۰۲
زمان مطالعه: ۱۶ دقیقه
ترفندهای برنامه نویسی در پایتون — از صفر تا صد

بدون شک در حال حاضر، «زبان برنامه‌نویسی پایتون» (Python Programming Language)، محبوب‌ترین و پرکاربردترین زبان برنامه‌نویسی در سطح جهان است؛ به ویژه، برای برنامه‌نویسان و محققان حوزه «هوش مصنوعی» (Artificial Intelligence) و «یادگیری ماشین» (Machine Learning). در این مطلب سعی شده است تا مهم‌ترین، پرکاربردترین و از همه مهم‌تر، مفیدترین ترفندهای برنامه نویسی در پایتون مورد بررسی قرار گیرند. از مهم‌ترین دلایل محبوبیت و کاربرد وسیع این زبان برنامه‌نویسی، در میان جامعه برنامه‌نویسان، می‌توان به موارد زیر اشاره کرد:

  • «قواعد دستوری» (Syntax) زبان برنامه‌نویسی پایتون بسیار ساده است و سبب می‌شود که یادگیری آن برای کاربران و برنامه‌نویسان مبتدی، بسیار ساده باشد.
  • زبان برنامه‌نویسی پایتون، در تمامی کاربردهایی که نیاز به برنامه‌نویسی برای انجام یک سری وظایف خاص باشد (نظیر برنامه‌نویسی کنترلی، هوش مصنوعی، تجاری و سایر موارد)، قابل استفاده خواهد بود.
  • زبان برنامه‌نویسی پایتون، مجموعه‌ای غنی از «ماژول‌ها» (Modules) و «کتابخانه‌های» (Libraries) نرم‌افزاری دارد که کار برنامه‌نویسان را بسیار ساده می‌کند.

بسیاری از «مهندسان هوش مصنوعی» (AI Engineers) و «دانشمندان داده» (Data Scientist)، از زبان برنامه‌نویسی پایتون برای انجام فعالیت‌های کاری روزانه خود استفاده می‌کنند. بسیاری از ترفندهای ارائه شده در این مطلب، علاوه بر اینکه برای برنامه‌نویسان هوش مصنوعی قابل استفاده است، برای برنامه‌نویسان دیگری که از پایتون استفاده می‌کنند نیز مفید خواهد بود.

ترفندهای برنامه نویسی در پایتون

مهم‌ترین و پرکاربردترین ترفندهای برنامه نویسی در پایتون

بسیاری از ترفندهای برنامه نویسی در پایتون و پیاده‌سازی آن‌ها، در راهنمای ارائه شده به همراه «کتابخانه استاندارد پایتون» (Python Standard Library) قرار دارند. همچنین، برخی از کتابخانه‌های معرف پایتون نظیر PyPi، مجموعه‌ غنی از اطلاعات مرتبط با کاربردهای توابع تعریف شده را در اختیار کاربران و برنامه‌نویسان قرار می‌دهند.

علاوه بر این، وب‌سایت‌ها و منابع تحت وب زیادی وجود دارند که اطلاعات مفیدی، در رابطه با ماژول‌ها و ابزارهای معروف زبان برنامه‌نویسی پایتون در اختیار کاربران قرار می‌دهند [+]. مطالعه این دسته از منابع، برای تمامی کاربران و برنامه‌نویسانی که از زبان برنامه‌نویسی پایتون برای انجام کارهای خود استفاده می‌کنند، به شدت توصیه می‌شود.

دستورات all و any

یکی از دلایلی که سبب محبوبیت روزافزونِ زبان برنامه‌نویسی پایتون شده است، «خوانایی» (Readability) و «رسایی» (Expressive) بالای آن است. یکی از ترفندهای برنامه نویسی در پایتون جهت بالا بردن خوانایی کدها، استفاده از دستورات all و any است.

1x = [True, True, False]
2if any(x):
3    print("At least one True")
4if all(x):
5    print("Not one False")
6if any(x) and not all(x):
7    print("At least one True and one False")

این دسته از دستورات پایتون، برای بیان and و or متوالی در پایتون مورد استفاده قرار می‌گیرند. دستور any، در صورتی که یکی از آیتم‌ها True باشد، مقدار True خروجی می‌دهد. همچنین، در صورتی که لیست خالی باشد و یا همه آیتم‌ها False باشند، مقدار False را در خروجی تولید می‌کند. خیلی از برنامه‌نویسان، به شوخی اظهار می‌کنند که زبان برنامه‌نویسی پایتون، «شبه‌کد اجرایی» (Executable Pseudocode) است. هنگام برخورد با کدهایی از این دست، واقعا نمی‌توان منکر این قضیه شد که کدهای زبان برنامه‌نویسی پایتون، شبه‌کد اجرایی هستند.

بسته نرم‌افزاری bashplotlib

یکی دیگر از ترفندهای برنامه نویسی در پایتون برای نمایش گرافی اطلاعات و داده‌ها، بسته نرم‌افزاری bashplotlib است. در صورتی که نیاز به تولید و نمایش گراف در «کنسول» (Console) زبان برنامه‌نویسی پایتون داشته باشید، می‌توانید از طریق کد زیر، بسته bashplotlib را نصب و استفاده کنید. با استفاده از دستورات این بسته، قادر به تولید و نمایش گراف در کنسول برنامه‌نویسی پایتون خواهید بود.

1$ pip install bashplotlib

ترفندهای برنامه نویسی در پایتون

مجموعه‌ نو‌ع‌های داده‌ای (collections) در پایتون

زبان برنامه‌نویسی پایتون، «نوع‌‌های داده‌ای» (Data Types) استاندارد و پیش‌فرضِ بسیار خوبی را برای استفاده کاربران و برنامه‌نویسان فراهم آورده است.

با این حال، برخی از نوع‌های داده‌ای تعریف شده، بعضا رفتارهای غیر منتظره‌ای از خود نشان می‌دهند. استفاده از مجموعه نوع‌های داده‌ای تعریف شده در ماژول collections، یکی از ترفندهای برنامه نویسی در پایتون است.

1from collections import OrderedDict, Counter
2# Remembers the order the keys are added!
3x = OrderedDict(a=1, b=2, c=3)
4# Counts the frequency of each character
5y = Counter("Hello World!")

مجموعه نوع‌های داده‌ای تعریف شده در ماژول collections، توسط کتابخانه استاندارد پایتون در اختیار کاربران و برنامه‌نویسان قرار گرفته است. این «افزونه» (Add-on)، بر پایه نوع‌های داده‌ای استاندارد در زبان پایتون طراحی شده است و نوع‌‌های داده‌ای جدیدی در اختیار برنامه‌نویسان قرار می‌دهد. برخی از نوع‌های داده‌ای این افزونه، عبارتند از:

  • نوع داده‌ای ()namedtuple
  • نوع داده‌ای deque
  • نوع داده‌ای ChainMap
  • نوع داده‌ای Counter
  • نوع داده‌ای OrderedDict
  • نوع داده‌ای defaultdict
  • نوع داده‌ای UserDict
  • نوع داده‌ای UserList
  • نوع داده‌ای UserString

دستور dir

این امکان برای برنامه‌نویسان در زبان پایتون فراهم شده است که با استفاده از دستور dir، «ویژگی‌های مشخصه» (Attributes) یک «شیء» (Object) تعریف شده  و معتبر در زبان برنامه‌نویسی پایتون را نمایش دهند.

برای این کار، کافی است از طریق «واسط خط فرمان» (Command Line Interface) پایتون، دستوراتی مشابه دستورات زیر  را اجرا کنید:

1dir()
2dir("Hello World")
3dir(dir)

این ترفند کاربردی، برای آن دسته از برنامه‌نویسانی که به صورت تعاملی در پایتون برنامه‌نویسی انجام می‌دهند و به شکل پویا، اشیاء و ماژول‌های استفاده شده در برنامه خود را مورد کاوش قرار می‌دهند، بسیار مفید خواهد بود. وقتی که تابع dir بدون آرگومان فراخوانی شود، لیستی از نام‌ها یا شناسه‌های موجود در «حوزه محلی» (Local Scope) ارجاع شناسه‌های برنامه، در خروجی تولید خواهد شد. در صورتی که یک شیء به عنوان آرگومان، در هنگام فراخوانی تابع ارسال شود، لیستی از ویژگی‌های مشخصه معتبر آن شیء در خروجی نمایش داده خواهد شد.

دستور from __future__ import

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

1from __future__ import print_function
2from future import standard_library
3standard_library.install_aliases()
4from future.builtins import next
5from future.builtins import object
6import configparser                 # Py3-style import
7
8class Upper(object):
9    def __init__(self, iterable):
10        self._iter = iter(iterable)
11    def __next__(self):             # Py3-style iterator interface
12        return next(self._iter).upper()
13    def __iter__(self):
14        return self
15
16itr = Upper('hello')
17print(next(itr), end=' ')           # Py3-style print function
18for letter in itr:
19    print(letter, end=' ')

دستور geopy

یکی دیگر از ترفندهای برنامه نویسی در پایتون برای یکپارچه‌سازی ویژگی‌های مفید در برنامه، استفاده از بسته geopy است. شاید برای بسیاری از برنامه‌نویسان، یکپارچه‌سازی ویژگی‌های جغرافیایی (Geographical) در برنامه‌هایشان، کار طاقت‌فرسا، زمان‌گیر و چالش‌برانگیزی باشد.

استفاده از بسته geopy، چنین کاری را ساده می‌کند.

1$ pip install geopy

در این بسته نرم‌افزاری، «واسط‌های برنامه‌نویسی کاربردی» (Application Programming Interface) بسیاری از سرویس‌های ارائه دهنده خدمات جغرافیایی، یکپارچه‌سازی شده‌اند. چنین امکانی به کاربران اجازه می‌دهد تا آدرس کامل، طول و عرض جغرافیایی و حتی ارتفاع یک مکان خاص را به دست آورند.

1from geopy.geocoders import Nominatim
2geolocator = Nominatim(user_agent="specify_your_app_name_here")
3location = geolocator.geocode("175 5th Avenue NYC")
4print(location.address)
5Flatiron Building, 175, 5th Avenue, Flatiron, New York, NYC, New York, ...
6print((location.latitude, location.longitude))
7(40.7410861, -73.9896297241625)
8print(location.raw)
9{'place_id': '9167009604', 'type': 'attraction', ...}
10
11location = geolocator.reverse("52.509669, 13.376294")
12print(location.address)
13Potsdamer Platz, Mitte, Berlin, 10117, Deutschland, European Union
14print((location.latitude, location.longitude))
15(52.5094982, 13.3765983)
16print(location.raw)

همچنین، کلاس بسیار مفیدی برای محاسبه فاصله در این بسته تعبیه شده است. این کلاس، فاصله میان دو مکان جغرافیایی را با استفاده از رابطه «فاصله هندسی» (Geodesic Distance)، محاسبه می‌کند.

1from geopy.distance import geodesic
2newport_ri = (41.49008, -71.312796)
3cleveland_oh = (41.499498, -81.695391)
4print(geodesic(newport_ri, cleveland_oh).miles)

دستور howdoi

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

یکی از ترفندهای برنامه نویسی در پایتون برای حل چنین مشکلی، استفاده از ابزار بسیار مفیدی به نام howdoi، در رابط خط فرمان پایتون است.

1$ pip install howdoi

کاربران می‌توانند سؤال‌های برنامه‌نویسی خود را، از طریق کدهای زیر از این ابزار بپرسند. این ابزار سعی می‌کند تا جوابی در رابطه با پرسش مطرح شده، در خروجی تولید کند.

1$ howdoi vertical align css
2$ howdoi for loop in java
3$ howdoi undo commits in git

شایان توجه است که ابزار howdoi، کدهای خروجی را از روی جواب‌های موجود در وب‌سایت StackOverflow استخراج می‌کند. در نتیجه، ممکن است در برخی از مواقع، اطلاعات مفیدی در اختیار کاربران قرار نگیرد.

1$ howdoi print stack trace python
2> import traceback
3>
4> try:
5>     1/0
6> except:
7>     print '>>> traceback <<<'
8>     traceback.print_exc()
9>     print '>>> end of traceback <<<'
10> traceback.print_exc()
11
12$ howdoi convert mp4 to animated gif
13> video=/path/to/video.avi
14> outdir=/path/to/output.gif
15> mplayer "$video" \
16>         -ao null \
17>         -ss "00:01:00" \  # starting point
18>         -endpos 10 \ # duration in second
19>         -vo gif89a:fps=13:output=$outdir \
20>         -vf scale=240:180
21
22$ howdoi create tar archive
23> tar -cf backup.tar --exclude "www/subf3" www

دستورات بسته inspect

یکی از ترفندهای برنامه نویسی در پایتون برای درک بهتر عملیاتِ پشت صحنه اجرای کدها، استفاده از بسته inspect است. این بسته، به برنامه‌نویس اجازه می‌دهد تا با عملیات پشت صحنه، در هنگام اجرای کدهایشان در پایتون آشنا شوند. به عنوان نمونه، به مثال انتزاعی زیر توجه کنید:

1def module_funct(arg1, arg2 = 'default', *args):
2    """This is a module-level function."""
3    local_var = arg1 * 3
4    return local_var
5
6class X(object):
7    """Definition for X class."""
8
9    def __init__(self, name):
10        self.name = name
11
12    def get_name(self):
13        "Returns the name of the instance."
14        return self.name
15
16x_obj = X('sample_instance')
17
18class Y(X):
19    """This is the Y class, 
20    child of X class.
21    """
22
23    # This method is not part of X class.
24    def do_something(self):
25        """Anything can be done here."""
26
27    def get_name(self):
28        "Overrides version from X"
29        return 'Y(' + self.name + ')'

این قطعه، یک ماژول نوشته شده توسط کاربر را نمایش می‌دهد. با استفاده از بسته inspect، برنامه‌نویس قادر خواهد بود تا «کد منبع» (Source Code) ماژول و جزئیات مرتبط با اشیاء تعریف شده در آن را مورد بررسی قرار دهد.

1import inspect
2import sample
3
4for name, data in inspect.getmembers(sample):
5    if name.startswith('__'):
6        continue
7    print('{} : {!r}'.format(name, data))

ترفندهای برنامه نویسی در پایتون

همچنین، از بسته inspect می‌توان برای بررسی توابع و کد منبع بسته inspect استفاده کرد. به عنوان نمونه، با استفاده از قطعه کد زیر، کد منبع بسته inspect نمایش داده می‌شود.

1import inspect
2print(inspect.getsource(inspect.getsource))
3print(inspect.getmodule(inspect.getmodule))
4print(inspect.currentframe().f_lineno)

کتابخانه Jedi

یکی از مهم‌ترین ترفندهای برنامه نویسی در پایتون، جهت کدنویسی سریع‌تر، استفاده از کتابخانه Jedi است. این کتابخانه، امکاناتی نظیر «تکمیل خودکار» (َAutocompletion) و «تحلیل کد» (Code Analysis) را در اختیار برنامه‌نویسان پایتون قرار می‌دهد.

استفاده از این کتابخانه، برای تمامی برنامه‌نویسان و در هر سطحی از مهارت برنامه‌نویسی توصیه می‌شود.

ترفندهای برنامه نویسی در پایتون

دستور kwargs**

در هنگام یادگیری کدنویسی به یک زبان برنامه‌نویسی خاص، نقاط عطف زیادی در این مسیر برای یک برنامه‌نویس وجود خواهد داشت. در زبان برنامه‌نویسی پایتون، یادگیری استفاده از دستور kwargs**، قطعا یکی از این نقاط عطف و یکی از مهم‌ترین ترفندهای برنامه‌نویسی در زبان پایتون خواهد بود.

پیش از اینکه دستور kwargs** توضیح داده شود، لازم است تا با Dictionary در زبان برنامه‌نویسی پایتون آشنا شوید. در پایتون، Dictionary «مجوعه‌ای نامرتب» (Unordered Collection) از مقادیر داده‌ای است که برای ذخیره مقادیر داده‌ها در قالبی شبیه به نوع داده‌ای «نقشه» (Map) مورد استفاده قرار می‌گیرد.

1# Creating an empty Dictionary 
2Dict = {} 
3print("Empty Dictionary: ") 
4print(Dict) 
5  
6# Creating a Dictionary  
7# with Integer Keys 
8Dict = {1: 'FaraDars', 2: 'For', 3: 'Knowledge'} 
9print("\nDictionary with the use of Integer Keys: ") 
10print(Dict) 
11  
12# Creating a Dictionary  
13# with Mixed keys 
14Dict = {'Name': 'FaraDars', 1: [1, 2, 3, 4]} 
15print("\nDictionary with the use of Mixed Keys: ") 
16print(Dict) 
17  
18# Creating a Dictionary 
19# with dict() method 
20Dict = dict({1: 'FaraDars', 2: 'For', 3:'Knowledge'}) 
21print("\nDictionary with the use of dict(): ") 
22print(Dict) 
23  
24# Creating a Dictionary 
25# with each item as a Pair 
26Dict = dict([(1, 'FaraDars'), (2, 'For')]) 
27print("\nDictionary with each item as a pair: ") 
28print(Dict)
Empty Dictionary: 
{}

Dictionary with the use of Integer Keys: 
{1: 'FaraDars', 2: 'For', 3: 'Knowledge'}

Dictionary with the use of Mixed Keys: 
{1: [1, 2, 3, 4], 'Name': 'FaraDars'}

Dictionary with the use of dict(): 
{1: 'FaraDars', 2: 'For', 3: 'Knowledge'}

Dictionary with each item as a pair: 
{1: 'FaraDars', 2: 'For'}

استفاده از دو ستاره (**) در کنار نام یک شیء تعریف شده از نوع dictionary، به برنامه‌نویس اجاز می‌دهد تا در هنگام فراخوانی تابع، این شیء را به عنوان یک «آرگومان نام‌دار» (Named Arguments) به توابع پاس دهد. کلیدهای تعریف شده در شیء، نام آرگومان‌های پاس داده شده به تابع و مقادیر کلیدها، مقادیر آرگومان‌های پاس داده شده خواهند بود.

1dictionary = {"a": 1, "b": 2}
2def someFunction(a, b):
3    print(a + b)
4    return
5# these do the same thing:
6someFunction(**dictionary)
7someFunction(a=1, b=2)

این ترفند زمانی مفید است که برنامه‌نویس تمایل به تعریف توابعی دارد که از آرگومان‌های نام‌دار (که هنوز تعریف نشده‌اند) به عنوان آرگومان‌های ورودی استفاده می‌کنند.

دستورات List comprehensions

یکی از مفیدترین ترفندهای برنامه نویسی در پایتون برای بالا بردن خوانایی کدها، استفاده از عبارات List comprehensions است. این دسته از عبارات، برای مختصر‌سازی کدهای لازم برای تولید لیست‌های خوانا (Readable) در زبان برنامه‌نویسی پایتون مورد استفاده قرار می‌گیرند.

عبارات List comprehensions، شامل تعدادی «کروشه» (Brackets) حاوی عبارات برنامه‌نویسی هستند. پس از آن، معمولا یک حلقه for (ساده یا تو در تو) و تعدادی (0 یا بیشتر) عبارت if در این لیست ظاهر خواهد شد. این دسته از عبارات، نوشتن کدهای تمیز و خوانا در زبان برنامه‌‎نویسی پایتون را ممکن می‌کنند. نمونه‌ای از این عبارات در قطعه کد زیر آمده است.

1numbers = [1,2,3,4,5,6,7]
2evens = [x for x in numbers if x % 2 is 0]
3odds = [y for y in numbers if y not in evens]
4cities = ['London', 'Dublin', 'Oslo']
5def visit(city):
6    print("Welcome to "+city)
7for city in cities:
8    visit(city)

دستور ()map

در زبان برنامه‌نویسی پایتون، «برنامه‌نویسی تابعی» (Functional Programming) از طریق برخی از ویژگی‌های تعبیه‌شده در این زبان برنامه‌نویسی، امکان‌پذیر شده است. یکی از مهم‌ترین و مفیدترین ویژگی‌های برنامه‌نویسی تابعی در زبان پایتون، تابع ()map است؛ به ویژه، زمانی که این ویژگی در ترکیب با توابع ()lambda مورد استفاده قرار می‌گیرد.

تابع lambda، یک «تابع بی‌نام» (Anonymous Function) در زبان برنامه‌نویسی پایتون محسوب می‌شود. این تابع می‌تواند به هر تعداد، آرگومان به عنوان ورودی دریافت کند ولی تنها یک عبارت خواهد داشت. عبارت تعریف شده در تابع lambda اجرا و نتیجه خروجی تولید می‌شود.

1x = [1, 2, 3]
2y = map(lambda x : x + 1 , x)
3# prints out [2,3,4]
4print(list(y))

در مثال بالا، تابع ()map یک تابع ساده lambda را روی هر کدام از عناصر موجود در متغیر x اعمال می‌کند. خروجی چنین عملیاتی یک شیء از نوع map است. شیء خروجی را می‌توان به یک «شیء قابل تکرار» (Iterable Object) نظیر list یا «چندتایی» (Tuple) در زبان پایتون تبدیل کرد.

ماژول newspaper3k

استفاده از این ماژول، یکی از جالب‌ترین ترفندهای برنامه نویسی در پایتون محسوب می‌شود. ماژول newspaper3k، به برنامه‌‎نویسان این امکان را می‌دهد که مقالات خبری و «فرا داده» (Metadata) همراه آن‌ها را از سایت‌های معروف خبری دنیا بازیابی و در برنامه‌های خود یکپارچه‌سازی کنند.

همچنین، این ماژول قادر است تا تصاویر، متن و اسامی نویسندگان مقالات خبری را نیز بازیابی کند.

1$ pip install newspaper3k
1from newspaper import Article
2
3article = Article('https://www.nytimes.com/2017/12/01/opinion/trump-national-monuments-bears-ears.html')
4article.download()
5article.parse()
6article.nlp()
1article.authors
['Bruce Babbitt']
1article.text
"Photo\n\nAmerica's wild places survive..."
1article.keywords
['national', 'president', 'american', 'monuments', 'york', ...]

سربارگذاری عملگرها در پایتون

یکی از مهم‌ترین ویژگی‌های موجود در زبان‌های برنامه‌نویسی، امکان «سربارگذاری عملگرها» (Operator Overloading) است. این امکان به کاربران و برنامه‌نویسان اجازه می‌دهد تا عملگرهای مختلف تعریف شده در زبان برنامه‌نویسی را با اشیاء یک کلاس خاص (تعریف شده به وسیله کاربر) مورد استفاده قرار دهند.

به عنوان نمونه، با استفاده قابلیت سربارگذاری عملگرها می‌توان از عملگر (+)، علاوه بر جمع کردن انواع متغیرهای حاوی مقادیر عددی، برای «الحاق کردن» (Concatenating) دو متغیر حاوی مقادیر رشته‌ای نیز استفاده کرد. به عبارت دیگر، برنامه‌نویس قادر است از عملگرهای استاندارد موجود در پایتون، برای انجام دسته‌ای از اعمال خاص روی یک شیء «تعریف شده توسط کاربر» (user Defined) استفاده کند.

1class Thing:
2    def __init__(self, value):
3        self.__value = value
4    def __gt__(self, other):
5        return self.__value > other.__value
6    def __lt__(self, other):
7        return self.__value < other.__value
8something = Thing(100)
9nothing = Thing(0)
10# True
11something > nothing
12# False
13something < nothing
14# Error
15something + nothing

دستور pprint

دستور print تعبیه شده در زبان برنامه‌نویسی پایتون، به راحتی قادر است تمامی نیازهای برنامه‌نویسان را مرتفع کند. با این حال، زمانی که برنامه‌نویس قصد چاپ اشیاء بزرگ و تو در تو را دارند، خروجی چندان خوشایندی چاپ نخواهد شد. یکی از بهترین ترفندهای برنامه نویسی در پایتون برای ساختار دادن به نمایش داده‌ها در خروجی، استفاده از ماژول pretty-print یا pprint در زبان برنامه‌نویسی پایتون است.

این ماژول، اشیاء ساخت یافته و پیچیده را به شکل مرتب و خوانا در خروجی نمایش می‌دهد.

1import requests
2import pprint
3url = 'https://randomuser.me/api/?results=1'
4users = requests.get(url).json()
5pprint.pprint(users)

خروجی:

1{'info': {'page': 1,
2          'results': 1,
3          'seed': 'a7e03dec1d39fb27',
4          'version': '1.2'},
5 'results': [{'cell': '210-817-4115',
6              'dob': {'age': 53, 'date': '1965-10-09T03:55:52Z'},
7              'email': 'noémie.mitchell@example.com',
8              'gender': 'female',
9              'id': {'name': '', 'value': None},
10              'location': {'city': 'sidney',
11                           'coordinates': {'latitude': '-63.0441',
12                                           'longitude': '166.9550'},
13                           'postcode': 'T2A 3E9',
14                           'state': 'saskatchewan',
15                           'street': '7546 elgin st',
16                           'timezone': {'description': 'Alaska',
17                                        'offset': '-9:00'}},
18              'login': {'md5': '8aa2f62ab947da8a166961926155485c',
19                        'password': 'litle',
20                        'salt': 'ejnuGQDL',
21                        'sha1': 'eabfe9287058b8ad497e20dbea0fad92aaba9851',
22                        'sha256': '1333ec32920615a473132a8df9893169ba4df81890358e37ee7ebcf0194fd590',
23                        'username': 'brownostrich458',
24                        'uuid': 'da01c7ce-5123-458b-b984-a66e5c06bc50'},
25              'name': {'first': 'noémie',
26                       'last': 'mitchell',
27                       'title': 'miss'},
28              'nat': 'CA',
29              'phone': '703-773-0051',
30              'picture': {'large': 'https://randomuser.me/api/portraits/women/31.jpg',
31                          'medium': 'https://randomuser.me/api/portraits/med/women/31.jpg',
32                          'thumbnail': 'https://randomuser.me/api/portraits/thumb/women/31.jpg'},
33              'registered': {'age': 2, 'date': '2016-10-30T10:10:00Z'}}]}

ماژول Queue

زبان برنامه‌نویسی پایتون، از طریق ماژول Queue، امکان برنامه‌نویسی «چندریسمانی» (Multithreading) را برای برنامه‌نویسان فراهم آورده است. با استفاده از این ماژول، برنامه‌نویسان قادر به پیاده‌سازی «ساختارهای داده‌ای صف» (Queue Data Structures) هستند. چنین ساختارهای داده‌ای به برنامه‌نویسان امکان می‌دهند تا عناصر را با توجه به یک قانون خاص، اضافه و بازیابی کنند.

به عنوان نمونه، صف‌های «خروج به ترتیب ورود» (First In, First Out | FIFO) اشیاء را به ترتیبی که در آن وارد صف شده‌اند، بازیابی می‌کنند و صف‌‎های «آخرین ورودی‎ / اولین خروجی» (Last In, First Out | LIFO)، به برنامه‌نویس اجازه می‌دهند تا به جدیدترین اشیاء اضافه شده به صف، زودتر از دیگر از اشیاء دسترسی داشته باشد. «صف‌های اولویت» (Priority Queues) نیز به کاربران اجازه می‌دهند، اشیاء را به ترتیبی که ذخیره شده‌اند، بازیابی کنند.

1import _thread
2import time
3
4# Define a function for the thread
5def print_time( threadName, delay):
6   count = 0
7   while count < 5:
8      time.sleep(delay)
9      count += 1
10      print ("%s: %s" % ( threadName, time.ctime(time.time()) ))
11
12# Create two threads as follows
13try:
14   _thread.start_new_thread( print_time, ("Thread-1", 2, ) )
15   _thread.start_new_thread( print_time, ("Thread-2", 4, ) )
16except:
17   print ("Error: unable to start thread")
18
19while 1:
20   pass

خروجی:

Thread-1: Fri Feb 19 09:41:39 2016
Thread-2: Fri Feb 19 09:41:41 2016
Thread-1: Fri Feb 19 09:41:41 2016
Thread-1: Fri Feb 19 09:41:43 2016
Thread-2: Fri Feb 19 09:41:45 2016
Thread-1: Fri Feb 19 09:41:45 2016
Thread-1: Fri Feb 19 09:41:47 2016
Thread-2: Fri Feb 19 09:41:49 2016
Thread-2: Fri Feb 19 09:41:53 2016

دستور __repr__

در هنگام تعریف یک کلاس یا یک شیء در زبان برنامه‌نویسی پایتون، فراهم آوردن یک نمایش رسمی از اشیاء کلاس در قالب «رشته متنی» (String)، تاثیر زیادی در خوانایی کدهای نوشته شده خواهد داشت. به عنوان نمونه:

1file = open('file.txt', 'r')
2print(file)
<open file 'file.txt', mode 'r' at 0x10d30aaf0>

این دسته از ترفندهای برنامه نویسی در پایتون عیب‌یابی کدها را به مراتب ساده‌تر می‌کند. با استفاده از قالب زیر، می‌توان چنین امکانی را به تعریف کلاس‌‌ها اضافه کرد:

1class someClass:
2    def __repr__(self):
3        return "<some description here>"
4someInstance = someClass()
5# prints <some description here>
6print(someInstance)

کتابخانه sh

زبان برنامه‌نویسی پایتون، یکی از بهترین زبان‌ها برای «اسکریپتینگ» (Scripting) است. زبان‌های اسکریپتینگ، زبان‌های برنامه‌نویسی برای «محیط‌های زمان اجرا» (Run-Time Environment) هستند که جهت خودکارسازی اجرای وظایف در این محیط‌ها به کار گرفته می‌شوند.

کتابخانه sh، به برنامه‌نویسان اجازه می‌دهد تا برنامه‌ها را به راحتی و مانند اجرای یک تابع، فراخوانی کنند. استفاده از این کتابخانه، یکی از ترفندهای برنامه نویسی در پایتون محسوب می‌شود و برای خودکارسازی «جریان‌های کاری» (Workflows) و وظایف، درون محیط برنامه‌نویسی پایتون مورد استفاده قرار می‌گیرد.

1import sh
2sh.pwd()
3sh.mkdir('new_folder')
4sh.touch('new_file.txt')
5sh.whoami()
6sh.echo('This is great!')

قابلیت تعریف Type Hints

یکی از مهم‌ترین ترفندهای برنامه نویسی در پایتون برای ارتقاء خوانایی کدها، به ویژه برای برنامه‌نویسان حرفه‌ای، استفاده از قابلیت Type Hints است. در زبان برنامه نویسی پایتون، لازم نیست برای «متغیرها» (Variables)، «توابع» (Functions)، «کلاس‌ها» (Classes) و سایر موارد، «نوع داده‌ای» (Datatype) تعریف شود.

چنین قابلیتی، امکان توسعه سریع برنامه‌ها را برای برنامه‌نویسان فراهم می‌آورد. با این حال، کوچکترین مشکل مرتبط با نوع داده‌ای، سبب ایجاد «خطای زمان اجرا» (Run-Time Error) در برنامه می‌شود. از نسخه 3.5 پایتون به بعد، این امکان برای برنامه‌نویسان فراهم شده است تا از قابلیت Type Hints در هنگام تعریف توابع استفاده کنند. به عنوان نمونه:

1def addTwo(x : Int) -> Int:
2    return x + 2

کد بالا برای پایتون مشخص می‌کند که نوع داده‌ای مورد انتظار برای متغیر x و خروجی تابع، از نوع Int یا صحیح است. همچنین، برنامه‌نویسان قادرند تا برای نوع‌ها یا ساختارهای داده‌ای، «نام مستعار» (Alias) انتخاب کنند.

1from typing import List
2Vector = List[float]
3Matrix = List[Vector]
4def addMatrix(a : Matrix, b : Matrix) -> Matrix:
5  result = []
6  for i,row in enumerate(a):
7    result_row =[]
8    for j, col in enumerate(row):
9      result_row += [a[i][j] + b[i][j]]
10    result += [result_row]
11  return result
12x = [[1.0, 0.0], [0.0, 1.0]]
13y = [[2.0, 1.0], [0.0, -2.0]]
14z = addMatrix(x, y)

استفاده از قابلیت Type Hints، خوانایی کدهای نوشته شده به زبان پایتون را به شدت افزایش می‌دهد. همچنین، احتمال وقوع خطاهای زمان اجرا (مرتبط با نوع داده‌ای) در برنامه‌ها کاهش می‌یابد. این قابلیت، به ویژه در پروژه‌های بزرگ و پیچیده نرم‌افزاری، بسیار کاربردی است.

ماژول uuid

یکی از ساده‌ترین و سریع‌ترین روش‌های تولید «شناسه‌های یکتای عمومی» (Universally Unique IDs)، استفاده از ماژول UUID در کتابخانه استاندارد پایتون است. به عنوان نمونه:

1import uuid
2user_id = uuid.uuid4()
3print(user_id)

چنین کدی، یک عدد 128 بیتی تصادفی تولید خواهد کرد که با احتمال قریب به یقین، یکتا خواهد بود. در واقع، چیزی حدود $$2^{122}$$ شناسه یکتا، توسط این ماژول قابل تولید است. در چنین حالتی، احتمال پیدا کردن «نسخه‌های تکراری» (Duplicates) در یک مجموعه، به شدت پایین خواهد بود. به عنوان نمونه، با داشتن حدود 1 تریلیون شناسه یکتا، احتمال پیدا کردن نسخه‌های تکراری، یک در یک میلیارد است.

محیط‌های مجازی

یکی از مهم‌ترین ترفندهای برنامه نویسی در پایتون جهت کاهش خطاهای اجرایی، استفاده از «محیط‌های مجازی» (Virtual Environments) برای مدیریت پروژه‌های نرم‌افزاری در پایتون است. احتمال اینکه یک برنامه‌نویس، به طور همزمان روی بیش از یک پروژه مشغول به کار باشد، بسیار زیاد است.

متاسفانه، در برخی از مواقع، دو پروژه مختلف به نسخه‌های متفاوتی از یک «وابستگی» (Dependency) نرم‌افزاری (ماژول، تابع، بسته و سایر موارد) یکسان احتیاج دارند. قابلیت تولید محیط‌های مجازی در پایتون، به برنامه‌نویسان اجازه می‌دهد تا بتوانند از نسخه‌های مختلف وابستگی‌ها در پروژه‌های خود استفاده کنند.

1python -m venv my-project
2source my-project/bin/activate
3pip install all-the-modules

با استفاده از کدهای بالا، این امکان برای شما وجود دارد که تمامی نسخه‌های «مستقل» (Standalone) از پایتون را، روی یک کامپیوتر استفاده کنید.

ماژول دسترسی به واسط برنامه‌نویسی کاربردی ویکی‌پدیا

وب‌سایت «دانش‌نامه ویکی‌پدیا» (Wikipedia Encyclopedia)، یک واسط برنامه‌نویسی کاربردی بسیار عالی برای دسترسی نرم‌افزاری به دانش و اطلاعات آزاد موجود در این دانش‌نامه، در اختیار برنامه‌نویسان قرار می‌دهد. ماژول ویکی‌پدیا در پایتون، امکان دسترسی آسان به این واسط را در زبان برنامه‌نویسی پایتون فراهم می‌کند.

1import wikipedia
2result = wikipedia.page('freeCodeCamp')
3print(result.summary)
4for link in result.links:
5    print(link)

این ماژول، مانند وب‌سایت اصلی، امکاناتی از قبیل دسترسی به صفحات در زبان‌های مختلف، «ابهام‌زدایی از صفحات» (Page Disambiguation)، بازیابی تصادفی صفحات و سایر موارد را در اختیار کاربران قرار می‌دهد.

ماژول PyYAML برای YAML

زبان YAML که مخفف عبارت (YAML Ain’t Markup Language) است، یک زبان «قالب‌بندی داده» (Data Formatting) است. این زبان، «ابرمجموعه» (Superset) زبان JSON محسوب می‌شود؛ یعنی، تمامی قالب‌های داده‌ای تعریف شده به وسیله JSON، توسط «پارسر» (Parser) زبان YAML قابل تجزیه و تحلیل نحوی (Parse) هستند.

برخلاف JSON، این ماژول می‌تواند اشیاء پیچیده‌تری را ذخیره کند و به عناصر خودش نیز ارجاع دهد. همچنین، امکان نوشتن «توضیحات» (Comments) برای «فایل‌های تنظیمات» (Configuration Files) فراهم شده است.

از طریق ماژول PyYAML، امکان استفاده از YAML در پایتون وجود دارد.

1$ pip install pyyaml
2import yaml

با استفاده از ماژول PyYAML، می‌توان اشیاء تعریف شده از هر نوع داده‌ای در زبان پایتون و همچنین، اشیاء هر کلاس تعریف شده به وسیله کاربر را ذخیره کرد.

تابع zip

یکی از جالب‌ترین ترفندهای برنامه نویسی در پایتون، استفاده از تابع ()zip است. تابع zip، یک تابع تعبیه‌شده در زبان برنامه نویسی پایتون است. این تابع، تعدادی «شیء قابل تکرار» (Iterable Objects) را به عنوان ورودی دریافت و لیستی از چندتایی‌ها را به عنوان خروجی تولید می‌کند. هر چندتایی، عناصر یک شیء ورودی را بر اساس شاخص مکانی آن‌ها گروه‌بندی می‌کند. همچنین، برای انجام معکوس این عملیات، از تابع (()zip*) استفاده می‌شود.

1keys = ['a', 'b', 'c']
2vals = [1, 2, 3]
3zipped = dict(zip(keys, vals))

جمع‌بندی

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

پایتون، یک زبان برنامه‌نویسی با امکانات متنوع و بسیار خوش‌ساخت است. ترفندهای برنامه نویسی در پایتون، امکان استفاده از پتانسیل کامل این زبان برنامه‌نویسی را در اختیار کاربران قرار می‌دهند.

اگر نوشته بالا برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

^^

بر اساس رای ۸ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
Medium
نظر شما چیست؟

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