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

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

در این مطلب به بررسی 30 ترفند مهم و مفید پایتون می‌پردازیم که در موارد مختلف به اجرای آسان‌تر کارها در پایتون کمک می‌کند. با ما تا انتهای این فهرست همراه باشید.

1. از پایتون 3 استفاده کنید

از ابتدای سال 2020 میلادی، پایتون 2 دیگر پشتیبانی رسمی نمی‌شود. همه مثال‌هایی که در این مطلب بررسی می‌شوند مربوط به پایتون 3 هستند. اگر هنوز از پایتون نسخه 2.7 استفاده می‌کنید، پیشنهاد می‌کنیم همین الان به پایتون 3 ارتقا دهید. اگر از مک استفاده می‌کنید می‌توانید از Homebrew برای ارتقای بی‌دردسر پایتون بهره بگیرید.

2. بررسی کمترین نسخه مورد نیاز پایتون

در کدهای خود می‌توانید کمترین نسخه پایتون را تعیین کنید تا مطمئن شوید که کاربران اسکریپت شما را با نسخه ناسازگاری از پایتون اجرا نمی‌کنند. بدین منظور از بررسی ساده زیر استفاده کنید:

1if not sys.version_info > (2, 7):
2   # berate your user for running a 10 year
3   # python version
4elif not sys.version_info >= (3, 5):
5   # Kindly tell your user (s)he needs to upgrade
6   # because you're using 3.5 features

3. از IPython استفاده کنید

30 ترفند مهم و مفید پایتون

IPython (+) اساساً یک پوسته بهبود یافته است. عمده اهمیت آن به جهت تکمیل خودکار است؛ اما امکانات دیگری نیز دارد. برای نمونه برخی دستورهای جالب داخلی دارد که در ادامه به برخی از آن‌ها اشاره می‌کنیم:

  • cd% – برای تغییر دایرکتوری کاری جاری
  • edit% – برای باز کردن یک ادیتور و اجرای کد وارد شده پس از بستن ادیتور
  • env% – برای نمایش متغیرهای محیطی جاری
  • pip install [pkgs]% – برای نصب پکیج‌ها بدون ترک پوسته تعاملی
  • time% و timeit% – برای زمان‌بندی اجرای کد پایتون

برای مشاهده فهرست کامل به این آدرس (+) بروید.

قابلیت مفید دیگر IPython ارجاع به خروجی دستور قبلی است. In و Out اشیای واقعی هستند. می‌توانید از آن‌ها برای استفاده از خروجی سوم به صورت Out[3] بهره بگیرید. IPython را با دستور زیر نصب کنید:

pip3 install ipython

4. خلاصه لیست

«خلاصه لیست» (List Comprehensions) می‌تواند جایگزین حلقه‌های زشت for شود که برای پر کردن لیست‌ها استفاده می‌شوند. ساختار مقدماتی یک خلاصه لیست به صورت زیر است:

[expression for item in list if conditional]

در ادامه مثال کاملاً ساده‌ای از پر کردن یک لیست با استفاده از یک دنباله از اعداد را می‌بینید:

1mylist = [i for i in range(10)]
2print(mylist)
3# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

از آنجا که می‌توانید از یک عبارت استفاده کنید، می‌توانید محاسباتی نیز روی آن اجرا کنید:

1squares = [x**2 for x in range(10)]
2print(squares)
3# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

حتی می‌توانید یک تابع بیرونی را فراخوانی کنید:

1def some_function(a):
2    return (a + 5) / 2
3    
4my_formula = [some_function(i) for i in range(10)]
5print(my_formula)
6# [2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0]

در نهایت می‌توانید از if برای فیلتر کردن لیست استفاده کنید. در این مثال تنها مقادیری را نگه می‌داریم که بر 2 بخش‌پذیر باشند:

1filtered = [i for i in range(20) if i%2==0]
2print(filtered)
3# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

5. بررسی مصرف حافظه اشیا

با استفاده از ()sys.getsizeof می‌توان وضعیت مصرف حافظه از سوی اشیای مختلف را بررسی کرد:

1import sys
2
3mylist = range(0, 10000)
4print(sys.getsizeof(mylist))
5# 48

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

1import sys
2
3myreallist = [x for x in range(0, 10000)]
4print(sys.getsizeof(myreallist))
5# 87632

6. بازگشت مقادیر چندگانه

تابع‌ها در پایتون می‌توانند بدون نیاز به یک دیکشنری، لیست یا کلاس بیش از یک متغیر را بازگشت دهند. طرز کار آن چنین است:

1def get_user(id):
2    # fetch user from database
3    # ....
4    return name, birthdate
5
6name, birthdate = get_user(4)

این موضوع در مورد تعداد محدودی از مقادیر بازگشتی مصداق دارد. اما هر چیزی که از 3 مقدار تجاوز کند باید در یک کلاس (داده) قرار گیرد.

7. استفاده از کلاس‌های داده

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

  • کلاس داده کمترین مقدار کد را لازم دارد.
  • می‌توان کلاس‌های داده را مقایسه کرد زیرا __eq__ پیاده‌سازی شده است.
  • می‌توانید به سهولت کلاس را به منظور دیباگ کردن پرینت کنید، زیرا __repr__ نیز پیاده‌سازی شده است.
  • کلاس‌های داده نیازمند «سرنخ نوع» (type hints) هستند که احتمال بروز باگ را کاهش می‌دهد.

در ادامه مثالی از طرز کار یک کلاس داده را می‌بینید:

1from dataclasses import dataclass
2
3@dataclass
4class Card:
5    rank: str
6    suit: str
7    
8card = Card("Q", "hearts")
9
10print(card == card)
11# True
12
13print(card.rank)
14# 'Q'
15
16print(card)
17Card(rank='Q', suit='hearts')

8. تعویض درجای متغیر

ترفند جالب زیر موجب می‌شود که چندین خط کد صرفه‌جویی کنید:

1a = 1
2b = 2
3a, b = b, a
4print (a)
5# 2
6print (b)
7# 1

9. ادغام دیکشنری‌ها (پایتون 3.5 به بالا)

از پایتون 3.5 به بعد ادغام دیکشنری‌ها آسان‌تر شده است:

1dict1 = { 'a': 1, 'b': 2 }
2dict2 = { 'b': 3, 'c': 4 }
3merged = { **dict1, **dict2 }
4print (merged)
5# {'a': 1, 'b': 3, 'c': 4}

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

10. مرتب‌سازی حالت عنوان

این نیز یکی از ترفندهای مفید پایتون محسوب می‌شود:

1mystring = "10 awesome python tricks"
2print(mystring.title())
3'10 Awesome Python Tricks'

11. افراز یک رشته به یک لیست

امکان افراز یک رشته به یک لیست از رشته‌ها وجود دارد. در مثال زیر از کاراکتر space برای افراز رشته استفاده می‌کنیم:

1mystring = "The quick brown fox"
2mylist = mystring.split(' ')
3print(mylist)
4# ['The', 'quick', 'brown', 'fox']

برای افراز روی فضاهای خالی می‌توانید به spilt هیچ آرگومانی ندهید. به صورت پیش‌فرض همه موارد پشت سرهم فضای خالی به عنوان یک فضای خالی منفرد محسوب می‌شوند. بنابراین استفاده از ()mystring.split نتیجه مشابهی دارد.

12. ایجاد یک رشته از لیستی از رشته‌ها

این ترفند عکس ترفند قبلی است. این بار یک رشته را از روی لیستی از رشته‌ها ایجاد می‌کنیم و بین آن‌ها یک کاراکتر فاصله قرار می‌دهیم:

1mylist = ['The', 'quick', 'brown', 'fox']
2mystring = " ".join(mylist)
3print(mystring)
4# 'The quick brown fox'

دلیل این که از (" ")mylist.join استفاده نکردیم این است که تابع ()String.join می‌تواند نه‌تنها لیست‌ها بلکه هر شیء تکرارپذیر (iterable) را به هم الحاق کند. قرار دادن آن درون رشته از پیاده‌سازی کارکرد مشابه در موارد مختلف جلوگیری می‌کند.

13. ایموجی

30 ترفند مهم و مفید پایتون

این ترفند بیشتر در زمان تحلیل شبکه‌های اجتماعی به کار می‌آید. ابتدا ماژول ایموجی را با دستور زیر نصب کنید:

pip3 install emoji

زمانی که نصب شد می‌توانید به صورت زیر عمل کنید:

1import emoji
2result = emoji.emojize('Python is :thumbs_up:')
3print(result)
4# 'Python is ?'
5
6# You can also reverse this:
7result = emoji.demojize('Python is ?')
8print(result)
9# 'Python is :thumbs_up:'

برای کسب اطلاعات بیشتر و مشاهده مثال‌ها و مستندات به این صفحه (+) مراجعه کنید.

14. برش دادن یک لیست

ساختار مقدماتی برش دادن به صورت زیر است:

a[start:stop:step]

Start ،Stop و Step اختیاری هستند. اگر آن‌ها را پر نکنید مقادیر پیش‌فرضشان به صورت زیر است:

  • 0 برای start
  • انتهای رشته برای end
  • 1 برای step

به مثال زیر توجه کنید:

1# We can easily create a new list from 
2# the first two elements of a list:
3first_two = [1, 2, 3, 4, 5][0:2]
4print(first_two)
5# [1, 2]
6
7# And if we use a step value of 2, 
8# we can skip over every second number
9# like this:
10steps = [1, 2, 3, 4, 5][0:5:2]
11print(steps)
12# [1, 3, 5]
13
14# This works on strings too. In Python,
15# you can treat a string like a list of
16# letters:
17mystring = "abcdefdn nimt"[::2]
18print(mystring)
19# 'aced it'

15. معکوس کردن رشته‌ها و لیست‌ها

می‌توان از نماد slice که در بخش قبلی توضیح دادیم برای معکوس کردن یک رشته یا لیست استفاده کرد. با استفاده از مقدار گام منفی 1- عناصر معکوس می‌شوند:

1revstring = "abcdefg"[::-1]
2print(revstring)
3# 'gfedcba'
4
5revarray = [1, 2, 3, 4, 5][::-1]
6print(revarray)
7# [5, 4, 3, 2, 1]

16. نمایش بچه گربه‌ها

در این ترفند بهانه‌ای به دست آورده‌ایم تا بالاخره تصویری از بچه‌گربه‌ها نمایش دهیم. البته با استفاده از این ترفند می‌توانید گراف‌ها و نمودارها را نیز نمایش دهید. ابتدا Pillow (+) را نصب کنید که یک فورک از کتابخانه تصویر پایتون محسوب می‌شود:

pip3 install Pillow

سپس تصویر زیر را در فایلی به نام kittens.jpg دانلود کنید:

30 ترفند مهم و مفید پایتون

اینک می‌توانید با استفاده از کد زیر تصویر را از کد پایتون نمایش دهید:

1from PIL import Image
2
3im = Image.open("kittens.jpg")
4im.show()
5print(im.format, im.size, im.mode)
6# JPEG (1920, 1357) RGB

همچنین می‌توانید این کار را مستقیماً از IPython انجام دهید:

30 ترفند مهم و مفید پایتون

Pillow می‌تواند کارهای بسیار بیشتری از نمایش تصاویر انجام دهد. با استفاده از آن می‌توان تصاویر را تحلیل کرد، اندازه آن‌ها را تغییر داد، آن‌ها را فیلتر کرد، بهبود بخشید و موارد مختلفی روی آن‌ها اجرا نمود. برای دیدن همه قابلیت‌های آن به مستنداتش (+) مراجعه کنید.

17. از ()map استفاده کنید

یکی از تابع‌های داخلی پایتون ()map نام دارد. ساختار آن چنین است:

map(function, something_iterable)

بنابراین باید تابعی برای اجرا به آن بدهیم و سپس شیئی ارسال کنیم که با تابع اجرا کند. این شیء می‌تواند هر شیء تکرارپذیر باشد. در مثال زیر از یک لیست استفاده کرده‌ایم:

1def upper(s):
2    return s.upper()
3    
4mylist = list(map(upper, ['sentence', 'fragment']))
5print(mylist)
6# ['SENTENCE', 'FRAGMENT']
7
8# Convert a string representation of
9# a number into a list of ints.
10list_of_ints = list(map(int, "1234567")))
11print(list_of_ints)
12# [1, 2, 3, 4, 5, 6, 7]

کد فوق را بررسی کنید و به جای لیست از یک ()map استفاده کنید.

18. دریافت عناصر یکتا از لیست یا رشته

با ایجاد یک مجموعه به وسیله تابع ()set می‌توانید همه عناصر یکتا را از یک لیست یا شیء شبه لیست به دست آورید:

1mylist = [1, 1, 2, 3, 4, 5, 5, 5, 6, 6]
2print (set(mylist))
3# {1, 2, 3, 4, 5, 6}
4
5# And since a string can be treated like a 
6# list of letters, you can also get the 
7# unique letters from a string this way:
8print (set("aaabbbcccdddeeefff"))
9# {'a', 'b', 'c', 'd', 'e', 'f'}

19. یافتن مقدار دارای بیشترین فراوانی

برای یافتن مقداری با بیشترین فراوانی در یک لیست یا رشته می‌توانید به صورت زیر عمل کنید:

1test = [1, 2, 3, 4, 2, 2, 3, 1, 4, 4, 4]
2print(max(set(test), key = test.count))
3# 4

در کد فوق:

  • ()Max بزرگ‌ترین مقدار لیست را بازگشت می‌دهد. آرگومان key یک تابع آرگومان منفرد برای سفارشی‌سازی ترتیب مرتب‌سازی می‌گیرد که در این مورد test.count است. این تابع روی هر آیتم تکرارپذیر اعمال می‌شود.
  • test.count یک تابع داخلی لیست است. یک آرگومان می‌گیرد و تعداد رخدادهای آرگومان را می‌شمارد. بنابراین test.count(1) مقدار 0 و test.count(1) مقدار 4 بازگشت می‌دهد.
  • Set(test) همه مقادیر یکتای تست را بازگشت می‌دهد که برابر با {1, 2, 3, 4} است.

از این رو در یک خط منفرد از کد همه مقادیر یکتای تست را به دست آوردیم که برابر با {1, 2, 3, 4} است. سپس max تابع list.count را روی آن‌ها اعمال می‌کند و مقدار بیشینه را بازگشت می‌دهد.

20. ایجاد نوار پیشروی

هر کسی می‌تواند نوار پیشروی خاص خود را بسازد که کار جذابی محسوب می‌شود. اما استفاده از پکیج progress موجب سهولت کار می‌شود:

pip3 install progress

اکنون می‌توانید یک نوار پیشروی را با کمترین تلاش ایجاد کنید:

1from progress.bar import Bar
2
3bar = Bar('Processing', max=20)
4for i in range(20):
5    # Do some work
6    bar.next()
7bar.finish()

انیمیشن زیر همه انواع نوارهای پیشروی را نمایش می‌دهد:

30 ترفند مهم و مفید پایتون

21. استفاده از _ در یک پوسته تعاملی

در IPython می‌توانیم نتیجه آخرین عبارت را با عملگر زیرخط (_) به صورت زیر به دست آوریم:

In [1]: 3 * 3
Out[1]: 9

In [2]: _ + 3
Out[2]: 12

کد فوق در پوسته پایتون نیز کار می‌کند. به علاوه پوسته IPython امکان استفاده از out[n] برای به دست آوردن مقدار In[n] را نیز فراهم می‌سازد. مثلاً out[1] در مثال فوق مقدار 9 را به دست می‌دهد.

22. ایجاد سریع وب سرور

با استفاده از دستور زیر می‌توانید به سرعت یک وب سرور ایجاد کرده و محتوای دایرکتوری جاری را روی آن عرضه کنید:

python3 -m http.server

این دستور در موادی مفید است که بخواهید برخی موارد را با همکار خود به اشتراک بگذارید و یا بخواهید یک سایت HTML ساده را تست کنید.

23. رشته‌های چندخطی

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

روش دیگر که ترجیح بیشتری دارد این است که چند خط را با هم الحاق کنیم تا امکان قالب‌بندی مناسب کد فراهم شود. تنها عیب این روش آن است که باید آن را صراحتاً در خط جدید قرار دهید:

1s1 = """Multi line strings can be put
2        between triple quotes. It's not ideal
3        when formatting your code though"""
4
5print (s1)
6# Multi line strings can be put
7#         between triple quotes. It's not ideal
8#         when formatting your code though
9        
10s2 = ("You can also concatenate multiple\n" +
11        "strings this way, but you'll have to\n"
12        "explicitly put in the newlines")
13
14print(s2)
15# You can also concatenate multiple
16# strings this way, but you'll have to
17# explicitly put in the newlines

24. عملگر سه‌تایی برای انتساب شرطی

این هم یکی از روش‌های منسجم‌تر ساختن کد در عین حفظ خوانایی است:

[on_true] if [expression] else [on_false]

به مثال زیر توجه کنید:

x = "Success!" if (y == 2) else "Failed!"

25. شمارش رخدادها

می‌توانید از Counter از کتابخانه collections برای به دست آوردن شماره همه عناصر یکتا در یک لیست استفاده کنید.

1from collections import Counter
2
3mylist = [1, 1, 2, 3, 4, 5, 5, 5, 6, 6]
4c = Counter(mylist)
5print(c)
6# Counter({1: 2, 2: 1, 3: 1, 4: 1, 5: 3, 6: 2})
7
8# And it works on strings too:
9print(Counter("aaaaabbbbbccccc"))
10# Counter({'a': 5, 'b': 5, 'c': 5})

26. زنجیره‌سازی عملگرهای مقایسه

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

1x = 10
2
3# Instead of:
4if x > 5 and x < 15:
5    print("Yes")
6# yes
7
8# You can also write:
9if 5 < x < 15:
10    print("Yes")
11# Yes

27. افزودن رنگ بیشتر

30 ترفند مهم و مفید پایتون

با استفاده از Colorama (+) می‌توان مقداری رنگ بیشتر به ترمینال بخشید:

1from colorama import Fore, Back, Style
2
3print(Fore.RED + 'some red text')
4print(Back.GREEN + 'and with a green background')
5print(Style.DIM + 'and in dim text')
6print(Style.RESET_ALL)
7print('back to normal now')

28. کار با تاریخ

ماژول python-dateutil (+) اکستنشن‌های قدرتمندی برای ماژول تاریخ و زمان استاندارد ارائه می‌کند. آن را به صورت زیر نصب کنید:

pip3 install python-dateutil

با استفاده از این کتابخانه کارهای جالب زیادی می‌توان انجام داد. ما صرفاً یک مثال را معرفی می‌کنیم که به طور خاص مفید است: در این مثال تاریخ‌ها را از فایل‌های لاگ و نظایر آن به صورت فازی تحلیل می‌کنیم:

1from dateutil.parser import parse
2
3logline = 'INFO 2020-01-01T00:00:01 Happy new year, human.'
4timestamp = parse(log_line, fuzzy=True)
5print(timestamp)
6# 2020-01-01 00:00:01

صرفاً به خاطر داشته باشید که وقتی کارکرد datetime استاندارد پایتون جواب نمی‌دهد، می‌توانید از ماژول python-dateutil استفاده کنید.

29. تقسیم صحیح

30 ترفند مهم و مفید پایتون

در پایتون 2 عملگر تقسیم (/) به صورت پیش‌فرض تقسیم صحیح انجام می‌دهد، مگر این که یکی از عملوندهای آن عدد اعشاری باشد. بنابراین رفتاری مانند زیر دارد:

# Python 2
5 / 2 = 2
5 / 2.0 = 2.5

در پایتون 3 عملگر تقسیم به صورت پیش‌فرض تقسیم اعشاری انجام می‌دهد و عملگر // به عملگر تقسیم صحیح اختصاص یافته است. بنابراین وضعیت زیر برقرار است:

Python 3
5 / 2 = 2.5
5 // 2 = 2

برای این که با انگیزه این تغییر به صورت کامل آشنا شوید به این آدرس (+) بروید.

30. تشخیص charset با chardet

می‌توان از ماژول chardet برای تشخیص charset یک فایل استفاده کرد. این ماژول در مواردی که بخواهیم فایل‌های بزرگی از متن تصادفی را تحلیل کنیم بسیار به کار می‌آید. آن را به صورت زیر نصب کنید:

pip install chardet

اکنون یک ابزار خط فرمان اضافی دارید که chardetect نام دارد و به صورت زیر مورد استفاده قرار می‌گیرد:

chardetect somefile.txt
somefile.txt: ascii with confidence 1.0

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

سخن پایانی

به این ترتیب به پایان این فهرست کاربردی با موضوع معرفی 30 ترفند مفید و مهم پایتون رسیدیم. امیدواریم از مطالعه این مطلب بهره‌مند شده باشید.

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

==

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

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