برنامه نویسی ۴۱۱ بازدید

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

تابع‌ها

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

def greet(name):
  print('Hello', name)

تابع greet فوق یک پارامتر دارد. ما می‌توانیم یک آرگومان برای تعیین مقدار پارامتر در زمان فراخوانی کردن آن ارسال کنیم. تابع‌ها همواره با کلیدواژه def تعریف می‌شوند، سپس نام تابع و سپس پرانتز می‌آید که می‌تواند شامل یک یا چند پارامتر و یا خالی باشد. در ادامه خط نخست با یک دونقطه پایان می‌یابد. کد تابع درون بلوک تابع، تورفتگی دارد. برای نمونه می‌توانیم greet را به صورت زیر فراخوانی کنیم:

greet('Joe')

که نتیجه زیر را به دست می‌دهد:

Hello Joe

چنان که می‌بینید عبارت Joe که در آرگومان فراخوانی تابع greet ارسال کرده‌ایم، روی صفحه نمایش می‌یابد.

تابع‌ها می‌توانند تابع‌های دیگر را فراخوانی کنند. برای نمونه می‌توانیم کد زیر را برای این که تابع greet، تابع دیگری را فراخوانی کند، بنویسیم:

def greet(first_name, last_name):
  print('Hello', full_name(first_name, last_name))
def full_name(first_name, last_name):
  return '%s %s' % (first_name, last_name)
greet('Jane', 'Smith')

در کد فوق، تابع greet ما اقدام به فراخوانی تابع full_name می‌کند که نام کامل تشکیل یافته از ترکیب first_name و last_name را بازگشت ‌می‌دهد.

در تابع full_name از کلیدواژه return برای بازگشت دادن نتیجه ترکیب پارامترهای first_name و last_name در یک رشته منفرد استفاده کرده‌ایم. تابع‌ها هر زمان که از کلیدواژه return استفاده کنیم، خاتمه می‌یابند. هر چه پس از این کلمه بیاید، اجرا نخواهد شد. از این رو می‌توانیم از return به صورت زیر برای بازگرداندن مقادیری که می‌خواهیم به صورت مشروط بازگشت یابند، استفاده کنیم:

import random
def crystal_ball(num):
  if num == 1:
    return 'It is a great day'
  elif num == 2:
    return 'It is a lucky day'
  elif num == 3:
    return 'It is an auspicious day'
r = random.randint(1, 4)
fortune = crystal_ball(r)
print(fortune)

درکد فوق، یک گزاره if داریم که هر زمان مقدار num برابر با 1 یا 2 یا 3 باشد چیز متفاوتی بازگشت می‌دهد.

  • اگر num برابر با 1 باشد، crystal_ball اقدام به بازگشت عبارت 'It is a great day' می‌کند.
  • اگر num برابر با 2 باشد، crystal_ball اقدام به بازگشت عبارت 'It is a lucky day' می‌کند.
  • اگر num برابر با 1 باشد، crystal_ball اقدام به بازگشت عبارت ‘It is an auspicious day’ می‌کند.

زمانی که چیزی بازگشت یابد، اجرای تابع crystal_ball متوقف می‌شود. سپس می‌توانیم مقدار بازگشتی را به متغیر دیگری انتساب دهیم تا به صورت زیر ذخیره شود:

fortune = crystal_ball(r)

در ادامه مقدار fortune پرینت می‌شود.

فیلم آموزشی مرتبط

مقدار None

در پایتون مقدار None نشان‌دهنده عدم وجود مقدار است. نوع None به صورت NoneType است. None یک حالت بسط یافته N است. می‌توانیم از آن برای بازگشت مقدار چیزی که نباید مقداری داشته باشد استفاده کنیم. برای نمونه، print مقدار را بازگشت می‌دهد، زیرا چیزی برای بازگشت وجود ندارد. این مقدار صرفاً یک مقدار روی صفحه نمایش می‌دهد. اگر کد زیر را بنویسیم:

foo = print('Hello!')
print(None == foo)

نتیجه زیر ارائه می‌شود:

Hello!
True

دلیل این که مقدار فوق روی صفحه نمایش یافته، این است که print مقدار None بازگشت می‌دهد و از این رو مقداری که به foo انتساب می‌یابد، برابر با None خواهد بود. بنابراین None == foo مقدار True بازگشت می‌دهد.

آرگومان‌های کلیدواژه

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

def full_name(first_name, last_name):
  return '%s %s' % (first_name, last_name)
print(full_name(first_name='Jane', last_name='Smith'))

در کد فوق، با نوشتن دستور زیر full_name را فرامی‌خوانیم:

full_name(first_name='Jane', last_name='Smith')

اکنون میدانیم که 'Jane' به عنوان مقدار پارامتر first_name و 'Smith' به عنوان مقدار پارامتر ارسال می‌شود.

پشته فراخوانی

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

def greet(first_name, last_name):
  print('Hello', full_name(first_name, last_name))
def full_name(first_name, last_name):
  return '%s %s' % (first_name, last_name)
greet('Jane', 'Smith')

تابع greet در پشته فراخوانی در انتها و full_name در بالا قرار خواهد داشت.

فیلم آموزشی مرتبط

دامنه محلی و سراسری

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

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

x = 1
def show_x():
  print(x)
show_x()

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

def show_x():
  x = 1
print(x)

با خطایی مواجه می‌شویم که اعلام می‌کند x تعریف نشده است.

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

فیلم آموزشی مرتبط

سخن پایانی

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

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

==

بر اساس رای ۱ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

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