ویدیو آشنایی عمیق با function در پایتون

امیرحسین بیگدلو July 2023

 در پایتون functionها یک شی هستند میتوان آنها را در یک متغیر ذخیره کرد، میتوان آنها را به عنوان آرگومان ارسال کرد و ویژگی های دیگری که در این ویدیو میبینید.

 

در سال 2009 'خودو ون رسوم' سازنده پایتون، مقاله ای نوشت با عنوان First class everything که بخشی از اون مقاله رو براتون میارم(لینک مقاله) :

One of my goals for Python was to make it so that all objects were "first class." By this, I meant that I wanted all objects that could be named in the language (e.g., integers, strings, functions, classes, modules, methods, etc.) to have equal status. That is, they can be assigned to variables, placed in lists, stored in dictionaries, passed as arguments, and so forth.
یکی از هدف های من در طراحی پایتون این بود که همه چیز یک آبجکت باشه. منظورم اینکه تمام چیزهایی که در پایتون پیدا میشن مثل integers, strings, functions, classes و... یک وضعیت رو داشته باشند که ما بتونیم با همه اینها به یک شکل رفتار کنیم. مثلا اونها رو داخل یک متغیر یا لیست یا دیکشنری ذخیره کنیم یا حتی اونها رو به عنوان یک آرگومان ارسال کنیم.

 

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

 

همه چیز آبجکت است - everything is an object

اینی که ما میگیم هر چیزی یک آبجکت هستش رو چجوری میتونیم ثابت کنیم؟! داخل پایتون یک متد شگفت انگیز وجود داره به اسم type. با استفاده از این متد میتونید موجودیت هر چیزی رو ببینید:

>> type( 2 )          # <class 'int'>
>> type( 'iran' )     # <class 'str'>
>> type( [1, 2, 3] )     # <class 'list'>
>> type( print )     # <class 'builtin_function_or_method'>
>> type( type )     # <class 'type'>

def show(): pass
>> type( show )    # <class 'function'>

import datetime
>> type( datetime ) # <class 'module'>

 

تمام چیزهایی که در پایتون میبینید یک کلاس(آبجکت) هستند.

 

خب که چی؟

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

 

1. فانکشن‌ ها آبجکت هستند - Fuctions are objects

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

def show(name):
    return f 'Hello {name}' 

x = show   # don't put parentheses
x( 'amir' )

>> Hello amir

 

همونطور که در مثال بالا میبینید فانکشن show رو داخل متغیر x ذخیره کردیم. این یکی از فواید آبجکت بودن فانکشن هاست.

 

2. فانکشن ها را میتوانید در داده ها ذخیره کنید - Functions can be stored in data structures

شما میتونید فانکشن‌ها رو داخل دنباله هایی مثل لیست‌ها، تاپل‌ها، دیکشنری‌ها... ذخیره کنید:

def show(name):
    print( f ' Hello { name.upper() } ' )

x = [ show, str.capitalize, str.lower ]

for i in x:
    i ('AmIrHOssEin')

>> Hello AMIRHOSSEIN
>> Hello Amirhossein
>> Hello amirhossein

 

در مثال بالا یک فانکشن داریم که مقدار name رو میگیره و اون رو به حروف بزرگ تبدیل میکنه و همراه Hello چاپ میکنه. بعد یک لیست ایجاد کردیم از چند فانکشن که در آخر داخل اون لیست حلقه زدیم و به تک تک اون فانکشن ها رو اجرا کردیم.

 

3. فانکشن ها میتوانند به فانکشن های دیگر ارسال شوند Functions can be passed to other functions (higher-order functions)

شما میتونید فانکشن‌ها رو به عنوان آرگومان ارسال کنید به دیگر فانکشن‌ها:

def show(name):
    print( f'Hello {name}' )

def shoot(func):
    return func('amir')

shoot(show)

>> Hello amir

به فانکشن‌هایی که یک فانکشن دیگه رو به عنوان پارامتر قبول کنند higer-order گفته میشه.

 

4. فانکشن های تودرتو - Inner Functions

امکان تعریف توابع درون توابع دیگر وجود دارد. به چنین توابع، توابع داخلی گفته می شود. در اینجا یک مثال از یک تابع با دو عملکرد داخلی وجود دارد:

def parent():
    print("Printing from the parent() function")

    def first_child():
        print("Printing from the first_child() function")

    def second_child():
        print("Printing from the second_child() function")

    second_child()
    first_child()

 

وقتی تابع parent() صدا میزنید چه اتفاقی می افتد؟ یک دقیقه در این باره فکر کن. خروجی به شرح زیر خواهد بود:

>>> parent()
Printing from the parent() function
Printing from the second_child() function
Printing from the first_child() function

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

 

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

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'first_child' is not defined

 

هرگاه parent() را فراخوانی کنید، توابع داخلی first_child () و second_child () نیز فراخوانی می شوند. اما به دلیل وسعت محلی آنها، خارج از تابع parent() در دسترس نیستند.

 

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

دوره های آموزش پروژه محور و پیشرفته پایتون

دوره آموزش الگوریتم‌نویسی در پایتون

دوره آموزش پایتون

ویدیو آموزش function در پایتون

آموزش فانکشن‌های بازگشتی در پایتون

بازکردن آرگومان های یک تابع در پایتون

ویدیوهای مشابه



آموزش NotImplemented در پایتون
امیرحسین بیگدلو

ارسال نظر


ali teymouri

2 ماه قبل پاسخ به نظر

عالی بود امیرجان مرسی ازت

ارسال نظر



مریم

1 سال قبل پاسخ به نظر

سلام
وقت بخیر، دوره برنامه نویسی فانکشنال که در این ویدیو اشاره کردید، الان در وبلاگتون هست؟

ارسال نظر



امیرحسین بیگدلو

1 سال قبل

سلام
دوره فانکشنال کنسل شده و دیگه ضبط نمیکنم

MARI

1 سال قبل پاسخ به نظر

واقعا خسته نباشید ، جز بهترین افراد برای اموزش پایتونید

ارسال نظر



Ali Sharifi

1 سال قبل پاسخ به نظر

ویدئو آموزشی مناسب ، اندازه ، کافی ، با مثال های خوب و باز کردن مباحث به جا و عالی بود ... خسته نباشید مهندس واقعا لذت بردیم .

ارسال نظر



ehsan

2 سال قبل پاسخ به نظر

عالی
بسیار ممنون از توضیحات خوب شما

ارسال نظر



شکوه

2 سال قبل پاسخ به نظر

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

ارسال نظر



shayan

2 سال قبل پاسخ به نظر

سلام
عالی بود خسته نباشید
اگ امکانش بود ی تک قسمتیم بزارین در همین مورد nested function ها ولی سه تا فانکشن تو در تو باشن
با تشکر

ارسال نظر



باب

2 سال قبل پاسخ به نظر

درود فراوان

خیلی خوب بود
مرسی 3> 3>

ارسال نظر



farid

3 سال قبل پاسخ به نظر

حرف شما درست منظور من دوره ای بود که در دقیقه 21 تا 22 این ویدیو اشاره شده بهش شاید منظورم رو بد رسوندم به هر حال بابت زحماتی که میکشید و اموزش ها با کیفیتی که تهیه میکنید یک دنیا ممنونم.

ارسال نظر



امیرحسین بیگدلو

3 سال قبل

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


Mahdi

2 سال قبل

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


امیرحسین بیگدلو

2 سال قبل

در ضمن چطوری در جنگو میان و برنامه های حرفه ای میسازن؟؟؟؟؟؟؟؟؟
:(((((
این سوالت اینقدر عجیب بود که اصلا نمیدونم چی بگم

farid

3 سال قبل پاسخ به نظر

منتظر دوره پایتون فانکشنال بی صبرانه هستم :)))

ارسال نظر



امیرحسین بیگدلو

3 سال قبل

:|
بیخود منتظر نباشید. پایتون زبان فانکشنال نیست و به درد برنامه‌نویسی فانکشنال هم نمیخوره، اما خب یکسری ویژگی‌هایی داره که میتونه ادای برنامه‌نویسی فانکشنال رو در بیاره.
اگه به برنامه‌نویسی فانکشنال علاقه‌مندید زبان GO رو امتحان کنید.

مونگارد