سازماندهی کد پایتون با استفاده از توابع – راهنمای کاربردی


پایتون یک زبان آسان است که غالباً برای اسکریپتنویسی، علوم داده و توسعه وب مورد استفاده قرار میگیرد. در این مقاله به بررسی روش تعریف و استفاده از تابعهای پایتون به عنوان روشی برای سازماندهی کد پایتون خواهیم پرداخت.
تابعها
تابع بخشی از کد است که میتوانیم به صورت مکرر در مکانهای مختلف فراخوانی کنیم. تابع با استفاده از کلیدواژه def به صورت زیر تعریف میشود:
1def greet(name):
2 print('Hello', name)
تابع greet فوق یک پارامتر دارد. ما میتوانیم یک آرگومان برای تعیین مقدار پارامتر در زمان فراخوانی کردن آن ارسال کنیم. تابعها همواره با کلیدواژه def تعریف میشوند، سپس نام تابع و سپس پرانتز میآید که میتواند شامل یک یا چند پارامتر و یا خالی باشد. در ادامه خط نخست با یک دونقطه پایان مییابد. کد تابع درون بلوک تابع، تورفتگی دارد. برای نمونه میتوانیم greet را به صورت زیر فراخوانی کنیم:
greet('Joe')
که نتیجه زیر را به دست میدهد:
Hello Joe
چنان که میبینید عبارت Joe که در آرگومان فراخوانی تابع greet ارسال کردهایم، روی صفحه نمایش مییابد.
تابعها میتوانند تابعهای دیگر را فراخوانی کنند. برای نمونه میتوانیم کد زیر را برای این که تابع greet، تابع دیگری را فراخوانی کند، بنویسیم:
1def greet(first_name, last_name):
2 print('Hello', full_name(first_name, last_name))
3def full_name(first_name, last_name):
4 return '%s %s' % (first_name, last_name)
5greet('Jane', 'Smith')
در کد فوق، تابع greet ما اقدام به فراخوانی تابع full_name میکند که نام کامل تشکیل یافته از ترکیب first_name و last_name را بازگشت میدهد.
در تابع full_name از کلیدواژه return برای بازگشت دادن نتیجه ترکیب پارامترهای first_name و last_name در یک رشته منفرد استفاده کردهایم. تابعها هر زمان که از کلیدواژه return در پایتون استفاده کنیم، خاتمه مییابند. هر چه پس از این کلمه بیاید، اجرا نخواهد شد. از این رو میتوانیم از return به صورت زیر برای بازگرداندن مقادیری که میخواهیم به صورت مشروط بازگشت یابند، استفاده کنیم:
1import random
2def crystal_ball(num):
3 if num == 1:
4 return 'It is a great day'
5 elif num == 2:
6 return 'It is a lucky day'
7 elif num == 3:
8 return 'It is an auspicious day'
9r = random.randint(1, 4)
10fortune = crystal_ball(r)
11print(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 مقدار را بازگشت میدهد، زیرا چیزی برای بازگشت وجود ندارد. این مقدار صرفاً یک مقدار روی صفحه نمایش میدهد. اگر کد زیر را بنویسیم:
1foo = print('Hello!')
2print(None == foo)
نتیجه زیر ارائه میشود:
Hello! True
دلیل این که مقدار فوق روی صفحه نمایش یافته، این است که print مقدار None بازگشت میدهد و از این رو مقداری که به foo انتساب مییابد، برابر با None خواهد بود. بنابراین None == foo مقدار True بازگشت میدهد.
آرگومانهای کلیدواژه
تابعهای پایتون میتوانند آرگومانهای نامدار داشته باشند. بدین ترتیب در زمان ارسال مقادیر به آرگومانها میدانیم که مقادیر مربوط به کدام آرگومانها هستند. برای نمونه میتوانیم پارامترهای نامدار را به صورت زیر ارسال کنیم:
1def full_name(first_name, last_name):
2 return '%s %s' % (first_name, last_name)
3print(full_name(first_name='Jane', last_name='Smith'))
در کد فوق، با نوشتن دستور زیر full_name را فرامیخوانیم:
1full_name(first_name='Jane', last_name='Smith')
اکنون میدانیم که 'Jane' به عنوان مقدار پارامتر first_name و 'Smith' به عنوان مقدار پارامتر ارسال میشود.
پشته فراخوانی
«پشته فراخوانی» (Call Stack) ساختمان دادهای است که به ما اعلام میکند کدام تابعها و با چه ترتیبی فراخوانی شدهاند. تابعهایی که زودتر فراخوانی شدهاند، در انتهای پشته قرار میگیرند و آنها که دیرتر فراخوانی شدهاند، در مراتب بالاتر قرار میگیرند. برای نمونه در مثالی که در بخش قبل داشتیم:
1def greet(first_name, last_name):
2 print('Hello', full_name(first_name, last_name))
3def full_name(first_name, last_name):
4 return '%s %s' % (first_name, last_name)
5greet('Jane', 'Smith')
تابع greet در پشته فراخوانی در انتها و full_name در بالا قرار خواهد داشت.
دامنه محلی و سراسری
متغیرهایی که درون یک تابع قرار دارند دارای دامنه محلی (Local) هستند. این متغیرها صرفاً درون تابع یا تابع داخلی تودرتو قابل دسترسی هستند و نمیتوان خارج از تابع به آنها ارجاع داد.
هر چیزی که در فایل پایتون در سطح فوقانی قرار داشته باشد، دارای دامنه سراسری است. متغیرهای با دامنه سراسری (Global) میتوانند از درون هر چیزی که در داخل تابعها قرار دارد، مثلاً یک بلوک کد یا تابع دیگر مورد دسترسی قرار گیرند. به مثال زیر توجه کنید:
1x = 1
2def show_x():
3 print(x)
4show_x()
در کد فوق، میتوانیم از داخل تابع show_x به x ارجاع بدهیم، زیرا x دارای دامنه سراسری است. از سوی دیگر اگر کد زیر را داشته باشیم:
1def show_x():
2 x = 1
3print(x)
با خطایی مواجه میشویم که اعلام میکند x تعریف نشده است.
با استفاده از دامنهها، میتوانیم دامنه کدی که میتواند موجب بروز باگ شود را محدود کنیم. به این ترتیب دیگر لازم نیست در زمان عیبیابی کل برنامه را بگردیم.
سخن پایانی
تابعها برای سازماندهی کد در بخشهای با قابلیت استفاده مجدد به کار میروند. توابع پارامترها را میگیرند و آنها را با ارسال آرگومانها فراخوانی میکنیم. از تابعها برای بازگشت موارد مختلف با کلیدواژه return استفاده میکنیم. مقادیر بازگشتی از یک تابع میتوانند به متغیرهای دیگر انتساب یابند. متغیرهای درون تابعها دارای دامنه محلی هستند و نمیتوان از خارج از تابع به آنها دسترسی داشت. از سوی دیگر متغیرها در سطح فوقانی کد دارای دامنه سراسری هستند و میتوانیم از درون هر تابعی به آنها دسترسی داشته باشیم.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای زبان برنامه نویسی پایتون
- مجموعه آموزشهای برنامهنویسی
- گنجینه آموزش های برنامه نویسی پایتون (Python)
- زبان برنامه نویسی پایتون (Python) — از صفر تا صد
- نصب پایتون در ویندوز — از صفر تا صد
==