ویرگول
ورودثبت نام
امیرحسین ناظوری
امیرحسین ناظوری📕 عاشق یادگیری و به اشتراک‌گذاری دانش -- آیدی من تو شبکه های اجتماعی : mrNazouri13
امیرحسین ناظوری
امیرحسین ناظوری
خواندن ۴ دقیقه·۳ روز پیش

بررسی توابع (Functions) در Python

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

ویدیو مربوط به این مقاله: (کلیک کن)

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

# ساختار کلی تابع def function_name(parameters): # body of the function return parameters print(function_name("arguments"))

همینطور که گفته شد، parameter یعنی ورودی هایی که موقع ساخت تابع تعریف میشن و argument ورودهایی هست که موقع فراخانی تابع ارسال میشن.

def function_test(): 5 + 6 print(function_test()) # result: None

یک کلمه کلیدی وجود داره به اسم return که مقدار بازگشتی یک تابع رو مشخص میکنه. اگه یک تابعی، return نداشته باشه، مقدار None رو برمیگردونه. یه مثال دیگه:

def function_test(): print("hello") print(function_test())

این تابع هم return نداره ولی اومدم داخل print فراخانی و چاپش کردم! بنابراین اول hello چاپ میشه چون تابع فراخانی شد و دستور داخلش نمایش داده شد، سپس دستور print میگرده دنبال مقداری که تابع برگشت داده باشه و چون چیزی نیست (چون از return استفاده نکردم) مقدار None رو نمایش میده.

def function_test(): return "a", "b" print(function_test())

من میتونم چندین مقدار رو با return برگردونم که همشون داخل یک tuple قرار میگیرن.

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

def function_test(): print("1") return "*" * 20 print("2") # این اجرا نمیشه

در ادامه کد بالا به این مثال دقت کن:

my_var = function_test print(my_var)

اینجا متغیر جدید رو برابر کردم با همون تابعی که دارم، یعنی نیومدم تابع رو اجرا کنم (چون پرانتز نزاشتم) و تو خط بعد متغیر جدید رو صدا زدم که بدون مشکل تابع اجرا شد.

بریم با حالت های مختلف نوشتن argument آشنا بشیم.

def function_test(a, b, c): print(f"max : {max(a, b, c)}") function_test(10, 9, 6) # max : 10

تو کد بالا حالت نرمال نوشتن و تعیین argument رو میبینید که به ازای هر parameter یک argument قرار دادم تا هرکدوم به ترتیب در جای پارامترش قرار بگیره.

حالت بعدی اینه که بیام اسم پارامتر هارو مشخص کنم و بگم فلان argument به کدوم parameter فرستاده بشه.

def function_test(a, b, c): print(f"max : {max(a, b, c)}") function_test(a = 10, b = 9, c = 6) # max : 10

میتونم بدین شکل هم عمل کنم:

function_test(10, 9, c = 6)

اگه بخوام این مدلی آرگومان بدم باید آرگومان های تعیین شده رو آخر کار بزارم یعنی حالت زیر خطا میده:

function_test(a = 10, 9, 6)

و همچنین میتونیم یک iterable هم برای آرگومان قرار بدم ولی قبلش باید یک ستاره بزارم تا حالت unpack داشته باشه. مثال:

function_test(*[1, 99, 20])


بریم با حالت های مختلف نوشتن parameter آشنا بشیم.

def function_test(a, b, c) pass

حالت عادی. باید معادل همین پارامتر ها، آرگومان بگیره و ترتیب هم مهمه.

تو حالت دیگه‌، میشه مقدار پیشفرض برای پارامتر تعیین کرد که اگه هیچ آرگومانی براش نیومد اون مقدار پیشفرض براش تنظیم بشه.

def function_test(a, b = 5): print(a * b) function_test(3) # 15

اگه چند پارامتر داریم، باید پارامترهای مقدار پیشفرض رو آخر کار قرار بدیم.

اگه عملگر * رو موقع تعریف پارامتر قرار بدیم، بجای unpack کردن، عمل pack کردن رو انجام میده.
اگه یک * بزاریم میاد موارد اضافه رو داخل یک تاپل نگه میداره.

def function_test(a, b, *c): print(f"a : {a} - b : {b} - c : {c}") function_test(1, 2, 3, 4, 5, 6, 7) # a : 1 - b : 2 - c : (3, 4, 5, 6, 7)

درنهایت، علامت یا عملگر * تو قسمت آرگومان ها، میاد اون iterable رو unpack میکنه. ولی تو قسمت پارامترها میاد اون مقدار هارو کنار هم قرار میده و تبدیل به یک iterable میکنه.

اگه قبل پارامتر بجای یک ستاره، دوتا ستاره بزارم، مقدارش دیکشنری میشه و باید موقع تنظیم آرگومان مثل زیر عمل کنم:

def function_test(**my_dict): print(my_dict) function_test(name = "amirhosein", family = "nazouri", age = 20, job = "programmer")

خروجی:

{"name": "amirhosein", "family": "nazouri", "age": 20, "job": "programmer"}


در ادامه توضیحات بالا به این کد دقت کن:

def function_test(name, **my_dict): print(name) print(my_dict) function_test(name = "amirhosein", family = "nazouri", age = 20, job = "programmer")

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

amirhosein {"family": "nazouri", "age": 20, "job": "programmer"}

نکته. اگه قراره باشه تو قسمت پارامترها، از یک ستاره و دو ستاره استفاده کنیم، باید از اسم های زیر استفاده کنیم:

def test(*args, **kwargs)

مثال:

def function_test(a, b = None, *args, **kwargs): print(a) print(b) print(args) print(kwargs) function_test(22, "test", "yoho", name = "amirhosein", family = "nazouri", age = 20, job = "programmer")

خروجی:

22 test ("yoho",) {"name": "amirhosein", "family": "nazouri", "age": 20, "job": "programmer"}


آخرین نکته‌ی این مقاله.
برای argument یک تابع، میشه یک تابع دیگه رو قرار داد.

def greet(name): print(f"Hello {name}") def process_name(func, name): func(name) process_name(greet, "amirhosein") # Hello amirhosein
برنامه نویسیپایتونpythonکامپیوتراینترنت
۱
۰
امیرحسین ناظوری
امیرحسین ناظوری
📕 عاشق یادگیری و به اشتراک‌گذاری دانش -- آیدی من تو شبکه های اجتماعی : mrNazouri13
شاید از این پست‌ها خوشتان بیاید