درک عمیق از function پایتون + ویدیو

سلام

امروز در رابطه با functionهای پایتون براتون میگم و در اونها عمیق میشیم که ببینیم اصلا 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. Functions can be nested (inner and outer functions)

5. Functions can capture local state (lexical closure)

6. Objects can behave like functions

سه تا مورد آخر چون پیچیده تر هستند بهتره که داخل ویدیو ببینیدشون.

https://www.aparat.com/v/6GLh7
اگر بازم دلتون خواست مباحث پیشرفته پایتون رو یاد بگیرید به وبسایت ما سر بزنید.
https://www.mongard.ir/
قلب و نظر شما باعث دلگرمی ماست.