اشکال در متوجه نشدن توابع برنامه نویسی پایتون

سلام ممکنه درمورد این کد توضیح بدهید چرا 30 را چاپ میکنه ؟ لطفا خط به خط توضیح بدهید ؟

def add(x, y): return x + y def do_twice(func, x, y): return func(func(x, y), func(x, y)) a = 5 b = 10 print(do_twice(add, a, b))
پاسخ ها

sokanacademy forum
کاربر سکان آکادمی 6 سال پیش

سلام

در کد زیر یه تابع تعریف شده که 2 ورودی داره و یک خروجی که دو ورودی رو جمع میکنه و نتیجه رو در خروجی میده:

def add(x, y):
    return x + y

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

def do_twice(func, x, y):
    return func(func(x, y), func(x, y))

حالا یه فراخوانی که توی کد اومده رو در نظر بگیر:

do_twice(add, a, b)

تابع بالا رو یک بار با این ورودی ها ببین:

def do_twice(add, 5, 15):
    return add(add(5, 10), add(5, 10))

فقط ورودی های تابع do_twice رو جایگذاری کردم.

add(add(5, 10), add(5, 10))

در این قسمت کد، تابع add دو با محاسبه میشه و مقدار هرکدوم به شکل زیر میشه:

add(15, 15)

و دوباره ایم دو عدد میشن ورودی تابع add و جواب آخر میشه 30 !!!

sokanacademy forum
کاربر سکان آکادمی 6 سال پیش

ممنونم از توضیحاتتون ولی بازم متوجه نشدم ببیند الان این دستور 

do_twice(add, a, b)

چرا باید دو عدد a, b رو ادد کنم مگه این دستور یه تایع دیگه نیستش ؟ و اینکه این func  چیه ؟ متغییره پس چرا باید در تابع def add(x, y)

return x + y 

قرار بدهیم ؟ 

ببخشیید خودمم دقیقا نفهمیدم چی نوشتم متاسفانه خوب متوجه نشدم ممنون میشم راهنمایی کنید

sokanacademy forum
کاربر سکان آکادمی 6 سال پیش

ببنین اول کدتو به شکل زیر مرتب کن

def add(x, y):
    z = z + y
    return z


def do_twice(func, x, y):
    result = func(func(x, y), func(x, y))
    return result


a = 5
b = 10
print(do_twice(add, a, b))

حالا خط آخر رو ببین و هر ورودی که در خط آخر به تابع do_twice اعمال شده رو به تابع اصلی که در خط 6 هست، اعمال کن و کد به صورت زیر اجرا میشه:

a = 5
b = 10

do_twice(add, 5, 10)

def do_twice(add, 5, 15):
    result = add(add(5, 10), add(5, 10))
    result = add(15, 15)
    result = 30
    return 30

و در آخر 30 برگردونده میشه. func هم یک متغیره که در اینجا از به جای add میتونی هر چیز دیگه استفاده کنی. مثلا یه تابع تعریف کن به شکل زیر که عمل ضرب انجام میده:

def add(x, y):
    return x + y


def zarb(a, b):
    return a*b


def do_twice(func, x, y):
    return func(func(x, y), func(x, y))


a = 5
b = 10
print("zarb: ", do_twice(zarb, a, b))
print("ja'am: ", do_twice(add, a, b))

یعنی func یه نوع متغیر میشه که خود پایتون متوجه میشه که این متغیر همون تابع مورد نظره که قبلا تعریف شده.

sokanacademy forum
کاربر سکان آکادمی 6 سال پیش

ممنونم . یه بخشیش را متوجه شدم ولی بعضی جاهاش را نه متاسفانه الان چرا باید در اینجا 15 قرار بدهیم 

def do_twice(add, 5, 15):

مگه این کد نباید x=5 , y=10  قرار بدهیم ؟

def do_twice(add, 5, 15):
result = add(add(5, 10), add(5, 10))
result = add(15, 15)
result = 30
return 30

سوال دیگه اینکه چرا باید در اینجا از تابع add استفاده کنیم مگه do_twice  یه تایع دیگه هستش که سه ورودی داره چرا به جای result = func(func(x, y), func(x, y) از دستور 
result = add(add(5, 10), add(5, 10)) استفاده کردید؟

sokanacademy forum
کاربر سکان آکادمی 6 سال پیش

یه مفهومی است به اسم "محدوده تابع (function scope)" که میگه متغیر های مورد استفاده در داخل تابع، هیچ ارتباطی با بیرون تابع ندارن. یعنی هرچی داخل تابع استفاده میشه یک نوع نشانه (symbol) ازورودی تابع است.به مثال زیر توجه کن:

def add(x, y):
    a = x + y
    return a


add(5, 15)

# or 

a = 5
b = 10

add(a,b)

# or 

x = 5
y = 10

add(a,b)

# or

ali = 5
reza = 15

add(ali, reza)

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

در جواب سوال دومتون عرض کنم که من به جای چیزی از چیز دیگه استفاده نکردم. فقط ورودی ها رو در خود تابع جایگذاری کردم و خط به خط نتایج رو نشون دادم. یعنی :

def do_twice(add, 5, 15):
    # نتایج این ورودی های خط بالا میشه خط پایین
    result = add(add(5, 10), add(5, 10))
    # نتیجه خط بالا میشه خط پایین
    result = add(15, 15)
    # نتیجه خط بالا میشه خط پایین
    result = 30
    # خط بالا به عنوان خروجی تابع بصورت خط پائین جایگذاری میشه
    return 30

برای اینکه راحت یه کدی رو متوجه بشی و راحت بتونی خط به خط نتایج رو ببینی، دو راه داری، یکی اینکه بعد از هر دستور، یه print بذاری و نتایج رو خط به خط ببینی مثل کد زیر:

def add(x, y):
    print("x ", x)
    print("y ", y)
    print("x+y: ", x+y)
    return x + y

add(5,5)

def do_twice(func, x, y):
    print("x ", x)
    print("y ", y)
    print("function: ", func)
    return func(func(x, y), func(x, y))

do_twice(add, x, y)

که به این کار تست (test) یا اشکال یابی (debug) گفته میشه. و یا اینکه از یک محیط یکپارچه توسعه نرم‌افزار (Integrated development environment) یا به اصطلاح IDE استفاده کنی که کار دیباگ رو بصورت اتوماتیک و خط به خط نشون میده که خودم اکثرا از PyCharm استفاده میکنم.

موفق باشی

online-support-icon