۵ ویژگی حرفه‌ای پایتون

ترجمه و تالیف : ارسطو عباسی
تاریخ انتشار : 18 اسفند 98
خواندن در 2 دقیقه
دسته بندی ها : پایتون

 پایتون یکی از زیباترین زبان‌های برنامه‌نویسی است. با وجود سینتکس ساده پایتون می‌توان گفت که پایتون به اندازه کافی قدرتمند نیز است. اما آیا شما به عنوان یک برنامه‌نویس مبتدی پایتون از تمام ویژگی‌های آن استفاده می‌کنید؟

ویژگی‌های حرفه‌ای هر زبان برنامه‌نویسی را معمولاً می‌توان از طریق تجربه‌ها و تمارین بسیار زیاد بدست آورد.  برای مثال فکر کنید که در حال حل یک پروژه برنامه‌نویسی هستید و در این روند به مشکلی برمی‌خورید. حال سراغ حل آن مشکل از طریق Stackoverflow می‌روید بعد از آن متوجه می‌شوید که برای حل مشکل شما یکسری راهکار وجود دارد اما برخی از آن‌ها سینتکس عجیب و غریبی دارند در بین این موارد، رویکردی بهینه را مشاهده خواهید کرد. در این حالت است که تعجب کرده و از خودتان می‌پرسید که چرا تا به حال چنین سینتکسی را مشاهده نکرده بودید. یادگیری با خطا و آزمون یکی از زیباترین راه‌حل‌ها در بین رویکردهای یادگیری برنامه‌نویسی در دنیاست. 

حال در این مطلب از وبسایت راکت قصد داریم در ارتباط با ۵ ویژگی‌ حرفه‌ای صحبت کنیم که به احتمال زیاد تا به حال با آن‌ها کار نکرده‌اید.

ویژگی‌ اول: توابع Lambda

تابع Lambda یکی از ویژگی‌های محبوب پایتون است که به شما اجازه می‌دهد تا توابع ناشناسی را بنویسید. منظور از ناشناس آن است که این دسته از توابع نام ندارند و تنها برای اجرا کردن سریع یک عملیات از آن‌ها استفاده می‌شود.

در توابع عادی پایتون ما از دستور def استفاده می‌کنیم اما در Lambda ما به روش عبارات عمل می‌کنیم. برای مثال:

x = lambda a, b : a * b

در این حالت ما دو ورودی a و b را در اختیار داشته و خروجی را برابر حاصل‌ضرب این دو مورد قرار داده‌ایم:

print(x(5, 6)) # prints '30'

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

ویژگی دوم: Map

Map() یک تابع داخلی پایتون است که برای اعمال یک تابع روی رشته‌ای از عناصر مانند لیست و یا دیکشنری استفاده می‌شود. سینتکس این تابع بسیار ساده بوده و قابلیت خوانایی بالایی نیز دارد:

def square_it_func(a):
    return a * a

x = map(square_it_func, [1, 4, 7])
print(x) # prints '[1, 16, 49]'

def multiplier_func(a, b):
    return a * b

x = map(multiplier_func, [1, 4, 7], [2, 5, 8])
print(x) # prints '[2, 20, 56]'

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

ویژگی‌ سوم: Filtering

تابع داخلی Filter شباهت زیادی با تابع Map دارد، شباهت آن‌ها نیز در این است که هر دو یک تابع را می‌توانند روی رشته‌ای از عناصر اعمال کنند. اما تفاوت کلیدی در آنجاست که تابع Filtering عناصری را برمی‌گرداند که خروجی آن‌ها برابر با True باشد. بنابراین اگر ما یک تابع با قابلیت return True داشته باشیم در این حالت اگر المانی از لیست خروجی True داشته باشد به خروجی برگشت داده خواهد شد. 

# Our numbers
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

# Function that filters out all numbers which are odd
def filter_odd_numbers(num):

    if num % 2 == 0:
        return True
    else:
        return False

filtered_numbers = filter(filter_odd_numbers, numbers)

print(filtered_numbers)
# filtered_numbers = [2, 4, 6, 8, 10, 12, 14]    

در مثال بالا تابع اصلی وظیفه فیلتر اعداد زوج و فرد را دارد. ورودی تابع اگر زوج باشد مقدار True برگشت داده خواهد شد و اگر فرد باشد مقدار False. حال از آنجایی که تابع filter تنها موارد True را برمی‌گرداند، تمام زوج‌های موجود در لیست numbers برگشت داده خواهد شد.

ویژگی‌ چهارم: Itertools

ماژول Itertools مربوط به پایتون مجموعه‌ای از ابزارها برای کار با iteratorها را به ما ارائه می‌کند. اگر با iteratorها آشنایی ندارید باید بگویم که یک داده iterator داده‌ای‌است که قابلیت پیمایش در یک حلقه را دارد. برای مثال لیست و تاپل دو مورد از این نوع‌های داده‌ای هستند.

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

from itertools import *

# Easy joining of two lists into a list of tuples
for i in izip([1, 2, 3], ['a', 'b', 'c']):
    print i
# ('a', 1)
# ('b', 2)
# ('c', 3)

# The count() function returns an interator that 
# produces consecutive integers, forever. This 
# one is great for adding indices next to your list 
# elements for readability and convenience
for i in izip(count(1), ['Bob', 'Emily', 'Joe']):
    print i
# (1, 'Bob')
# (2, 'Emily')
# (3, 'Joe')    

# The dropwhile() function returns an iterator that returns 
# all the elements of the input which come after a certain 
# condition becomes false for the first time. 
def check_for_drop(x):
    print 'Checking: ', x
    return (x > 5)

for i in dropwhile(should_drop, [2, 4, 6, 8, 10, 12]):
    print 'Result: ', i

# Checking: 2
# Checking: 4
# Result: 6
# Result: 8
# Result: 10
# Result: 12


# The groupby() function is great for retrieving bunches
# of iterator elements which are the same or have similar 
# properties

a = sorted([1, 2, 1, 3, 2, 1, 2, 3, 4, 5])
for key, value in groupby(a):
    print(key, value), end=' ')
    
# (1, [1, 1, 1])
# (2, [2, 2, 2]) 
# (3, [3, 3]) 
# (4, [4]) 
# (5, [5]) 

ویژگی پنجم: Generatorها

توابع Generator به شما اجازه می‌دهند تا بتوانید تابعی را تعریف کنید که مانند یک iterator کار کرده و می‌تواند در یک حلقه استفاده شود. یک Generator عناصری را ایجاد کرده و آن‌ها را در حافظه نگه‌داری می‌کند. تابع xrange() در پایتون از Generatorها برای ایجاد لیست استفاده می‌کند. 

در مثال زیر می‌توانید شیوه ساخت یک لیست را در دو حالت عادی و با استفاده از generatorها مشاهده کنید:

# (1) Using a for loop
numbers = list()

for i in range(1000):
    numbers.append(i+1)
    
total = sum(numbers)

# (2) Using a generator
 def generate_numbers(n):
     num = 0
     while num < n:
         yield num
         num += 1
 total = sum(generate_numbers(1000))
 
 # (3) range() vs xrange()
 total = sum(range(1000 + 1))
 total = sum(xrange(1000 + 1))

در پایان

در این مطلب از وب‌سایت راکت ما سعی داشتیم تا پنج ویژگی حرفه‌ای از زبان برنامه‌نویسی پایتون را به شما معرفی کنیم. برای یادگیری بیشتر موضوعات مربوط به پایتون به شما پیشنهاد می‌کنم دوره آموزشی «آموزش پایتون» را مشاهده کنید.

منبع

گردآوری و تالیف ارسطو عباسی
آفلاین
user-avatar

من ارسطو‌ام :) کافی نیست؟! :)

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر لازم است ابتدا وارد سایت شوید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید