ویدیو آموزش ساخت تابع با def در پایتون

October 2021


فانکشن چیست؟

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

 

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

 

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


 

تعریف یک تابع با کلمه کلیدی def

بیایید با تبدیل کلاسیک "Hello, world!" شروع کنیم. برنامه را به یک تابع تبدیل کنید.

 

ما یک فایل متنی جدید در ویرایشگر متن مورد نظر خود ایجاد می کنیم و برنامه را hello.py می نامیم. سپس ، تابع را تعریف می کنیم.

 

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

 

در این مورد ، ما یک تابع با نام hello() تعریف می کنیم:

def hello():

 

این دستور اولیه برای ایجاد یک تابع را تنظیم می کند.

 

از اینجا، ما خط دوم را با یک فاصله 4 فضا اضافه می کنیم تا دستورالعمل های عملکرد را ارائه دهیم. در این صورت ، ما Hello, World! را چاپ می کنیم به کنسول:

def hello():
    print("Hello, World!")

 

فانکشن ما در حال حاضر به طور کامل تعریف شده است، اما اگر برنامه را در این مرحله اجرا کنیم، از آنجا که ما تابع را صدا نکردیم، هیچ اتفاقی نمی افتد.

 

بنابراین ، خارج از بلوک تابع تعریف شده، بیایید تابع را با hello () فراخوانی کنیم:

def hello():
    print("Hello, World!")

hello()

 

حالا ، بیایید برنامه را اجرا کنیم:

python hello.py

 

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

Hello, World!

 

توابع میتوانند پیچیده تر از تابع hello() هستند که در بالا تعریف کردیم. به عنوان مثال، ما می توانیم برای حلقه ها، دستورات شرطی و موارد دیگر در بلوک تابع خود استفاده کنیم.

 

به عنوان مثال ، تابع تعریف شده در زیر از یک شرط برای بررسی اینکه آیا ورودی متغیر name حاوی حروف صدادار است یا نه استفاده می کند، سپس از حلقه for برای تکرار حروف رشته name استفاده می کند.

# Define function names()
def names():
    # Set up name variable with input
    name = str(input('Enter your name: '))
    # Check whether name has a vowel
    if set('aeiou').intersection(name.lower()):
        print('Your name contains a vowel.')
    else:
        print('Your name does not contain a vowel.')

    # Iterate over name
    for letter in name:
        print(letter)

# Call the function
names()

 

تابع names() که در بالا تعریف کردیم یک عبارت شرطی و یک حلقه for ایجاد می کند و نشان می دهد که چگونه می توان کد را در یک تعریف تابع سازماندهی کرد. با این حال، بسته به هدف ما از برنامه و نحوه تنظیم کد، ممکن است بخواهیم عبارت شرطی و حلقه for را به عنوان دو تابع جداگانه تعریف کنیم.

 

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


 

کار با پارامتر‌ها در توابع پایتون

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

 

پارامتر یک موجودیت نامگذاری شده در تعریف تابع است ، و آرگومانی را که تابع می تواند بپذیرد مشخص می کند.

 

بیایید یک برنامه کوچک ایجاد کنیم که پارامترهای x ، y و z را در نظر بگیرد. ما یک تابع ایجاد می کنیم که پارامترها را در پیکربندی های مختلف به هم اضافه می کند. مجموع اینها توسط تابع چاپ می شود. سپس تابع را فراخوانی کرده و اعداد را به تابع منتقل می کنیم.

def add_numbers(x, y, z):
    a = x + y
    b = x + z
    c = y + z
    print(a, b, c)

add_numbers(1, 2, 3)

 

ما برای پارامتر x عدد 1 ، برای پارامتر y عدد 2 و 3 برای پارامتر z را وارد کردیم. این مقادیر با هر پارامتری به ترتیب داده شده مطابقت دارند.

 

این برنامه اساساً ریاضیات زیر را بر اساس مقادیری که به پارامترها ارسال کردیم انجام می دهد:

a = 1 + 2
b = 1 + 3
c = 2 + 3

 

این تابع همچنین a ، b و c را چاپ می کند و بر اساس ریاضیات بالا انتظار داریم a برابر 3 ،مقدار b برابر 4 و مقدار c برابر 5 باشد. برنامه را اجرا کنیم:

python add_numbers.py


# OUTPUT
3 4 5

 

وقتی 1 ، 2 و 3 را به عنوان پارامتر به تابع add_numbers() منتقل می کنیم ، خروجی مورد انتظار را دریافت می کنیم.

 

پارامترها آرگومان هایی هستند که معمولاً در تعریف تابع به عنوان متغیر تعریف می شوند. وقتی متد را اجرا می کنید و آرگومان ها را به تابع منتقل می کنید ، می توان به آنها مقادیر اختصاص داد.


 

آرگومان‌های کلیدی - Keyword Arguments

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

 

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

 

بیایید یک تابع ایجاد کنیم که اطلاعات پروفایل کاربر را به ما نشان دهد. ما پارامترها را در قالب username (در نظر گرفته شده به عنوان یک رشته) و followers (در نظر گرفته شده به عنوان یک عدد صحیح) به آن منتقل می کنیم.

# Define function with parameters
def profile_info(username, followers):
    print("Username: " + username)
    print("Followers: " + str(followers))

 

در دستور تعریف تابع، username و followers در پرانتز تابع profile_info() قرار دارند. بلوک تابع اطلاعات مربوط به کاربر را به صورت رشته چاپ می کند و از دو پارامتر استفاده می کند.

 

اکنون می توانیم تابع را فراخوانی کرده و پارامترهایی را به آن اختصاص دهیم:

def profile_info(username, followers):
    print("Username: " + username)
    print("Followers: " + str(followers))

# Call function with parameters assigned as above
profile_info("sammyshark", 945)

# Call function with keyword arguments
profile_info(username="AlexAnglerfish", followers=342)

 

در فراخوانی تابع اول، ما اطلاعات را با نام کاربری sammyshark و فالوورهای 945 پر کرده ایم، در فراخوانی تابع دوم از آرگومان های کلید واژه استفاده کرده و مقادیر را به متغیرهای آرگومان اختصاص می دهیم.

 

بیایید برنامه را اجرا کنیم:

python profile.py


# OUTPUT
Username: sammyshark
Followers: 945
Username: AlexAnglerfish
Followers: 342

 

خروجی usernames و تعداد followers هر دو کاربر را به ما نشان می دهد.

 

این همچنین به ما اجازه می دهد تا ترتیب پارامترها را تغییر دهیم، مانند این مثال از همان برنامه با فراخوانی متفاوت:

def profile_info(username, followers):
    print("Username: " + username)
    print("Followers: " + str(followers))

# Change order of parameters
profile_info(followers=820, username="cameron-catfish")

 

وقتی برنامه را دوباره با دستور python profile.py اجرا می کنیم ، خروجی زیر را دریافت می کنیم:

Username: cameron-catfish
Followers: 820

 

از آنجا که تعریف تابع همان ترتیب دستورات print() را حفظ می کند، اگر از آرگومان های کلیدی استفاده کنیم، مهم نیست که آنها را به چه ترتیبی به فراخوانی تابع منتقل می کنیم.


 

مقادیر پیش‌فرض آرگومان‌ها در تابع پایتون

ما همچنین می توانیم مقادیر پیش فرض را برای یک یا هر دو پارامتر ارائه دهیم. بیایید یک مقدار پیش فرض برای پارامتر followers با مقدار 1 ایجاد کنیم:

def profile_info(username, followers=1):
    print("Username: " + username)
    print("Followers: " + str(followers))

 

در حال حاضر ، ما می توانیم تابع را فقط با تابع username اختصاص داده اجرا کنیم، و تعداد followers به طور خودکار روی 1 تنظیم می شود. ما همچنین می توانیم تعداد followers را در صورت تمایل تغییر دهیم.

def profile_info(username, followers=1):
    print("Username: " + username)
    print("Followers: " + str(followers))

profile_info(username="JOctopus")
profile_info(username="sammyshark", followers=945)

 

وقتی برنامه را با دستور python profile.py اجرا می کنیم ، خروجی زیر را دریافت می کنیم:

Username: JOctopus
Followers: 1
Username: sammyshark
Followers: 945

 

ارائه پارامترهای پیش فرض با مقادیر می تواند به ما این امکان را بدهد که از تعریف مقادیر برای هر آرگومانی که پیش فرض دارد ، بگذریم.


 

برگرداندن یک مقدار در توابع پایتون - Returning a Value

شما می توانید یک مقدار پارامتر را به یک تابع منتقل کنید، و یک تابع همچنین می تواند یک مقدار تولید کند.

 

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

 

تا اینجا ، ما از دستور print() به جای دستور return در توابع خود استفاده کرده ایم. بیایید برنامه ای ایجاد کنیم که به جای چاپ، یک متغیر را برگرداند.

 

در یک فایل متنی جدید به نام square.py ، ما برنامه ای ایجاد می کنیم که پارامتر x را به صورت توان در آورده و متغیر y را برمی گرداند.

def square(x):
    y = x ** 2
    return y

result = square(3)
print(result)

 

می توانیم برنامه را اجرا کرده و خروجی را ببینیم:

python square.py


# OUTPUT
9

 

عدد صحیح 9 به عنوان خروجی بازگردانده می شود ، چیزی که ما با درخواست از پایتون برای یافتن توان 3 انتظار داریم.

 

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

def square(x):
    y = x ** 2
    # return y

result = square(3)
print(result)

 

حالا بیایید برنامه را دوباره اجرا کنیم:

python square.py

# OUTPUT
None

 

بدون استفاده از دستور return در اینجا ، برنامه نمی تواند مقداری را برگرداند ، بنابراین مقدار به صورت پیش فرض روی None نیست.

 

به عنوان مثال دیگر ، در برنامه add_numbers.py بالا ، می توانیم دستور print() را با دستور return عوض کنیم.

def add_numbers(x, y, z):
    a = x + y
    b = x + z
    c = y + z
    return a, b, c

sums = add_numbers(1, 2, 3)
print(sums)

 

خارج از تابع ، مبالغ متغیر را برابر sums تابع 1 ، 2 و 3 قرار می دهیم که در بالا انجام دادیم. سپس ما یک متغیر sums را چاپ کردیم.

 

بیایید برنامه را دوباره اجرا کنیم ، در حالی که دستور return را دارد:

python add_numbers.py


# OUTPUT
(3, 4, 5)

 

ما همان اعداد 3 ، 4 و 5 را به عنوان خروجی دریافت می کنیم که قبلاً با استفاده از دستور print() در تابع دریافت کرده بودیم. این بار به صورت چندتایی ارائه می شود زیرا لیست عبارت دستور return حداقل یک کاما دارد.

 

توابع بلافاصله هنگامی که به دستور return ضربه می زنند ، خروج می کنند یا خیر ، مقداری را برمی گردانند.

def loop_five():
    for x in range(0, 25):
        print(x)
        if x == 5:
            # Stop function at x == 5
            return
    print("This line will not execute.")

loop_five()

 

با استفاده از دستور return در حلقه for تابع به پایان می رسد، بنابراین خطی که خارج از حلقه است اجرا نمی شود. اگر به جای آن از دستور break استفاده می کردیم، فقط حلقه در آن زمان خارج می شد و آخرین خط print() اجرا می شد.

 

دستور return از یک تابع خارج می شود و ممکن است وقتی یک پارامتر صادر می شود ، مقدار را برگرداند.


 

نتیجه گیری

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


5:49:03


0

intro

10:38

رایگان

1

variable

13:57

رایگان

2

string

19:22

رایگان

3

list

8:46

رایگان

4

while

9:6

رایگان

5

if

8:37

رایگان

6

for

6:12

رایگان

7

range

4:17

رایگان

8

break, continue, pass

9:15

رایگان

9

functions

12:32

رایگان

10

list methods

12:11

رایگان

11

tuple

8:29

رایگان

12

set

7:47

رایگان

13

dictionary

9:19

رایگان

14

module

10:40

رایگان

15

fstring

5:35

رایگان

16

format

7:34

رایگان

17

working with file

17:14

رایگان

18

scope

6:25

رایگان

19

class

12:15

رایگان

20

methods

20:19

رایگان

21

class variable

14:7

رایگان

22

class/static method

13:25

رایگان

23

inheritance

17:6

رایگان

24

special methods

9:50

رایگان

25

access points

11:12

رایگان

26

property

6:54

رایگان

27

exception

21:17

رایگان

28

standard library

12:51

رایگان

29

docString

10:49

رایگان

30

virtualenv

11:2

رایگان


دوره‌های پیشنهادی

دوره اول آموزش جنگو(django)

دوره اول آموزش جنگو(django)

دوره آموزش مقدماتی FastAPI

دوره آموزش مقدماتی FastAPI

دوره اول آموزش فلسک(Flask)

دوره اول آموزش فلسک(Flask)

ارسال نظر

تلاش میکنم سوالات شما را در کمتر از یک روز پاسخ بدم

علیرضا

October 2021

سلام استاد
اگه از type hint استفاده کنیم توی ورودی و خروجی توابع مثل زیر
def greeting(name: str) -> str
پایتون اول چک میکنه که اون ورودی و خروجی تابع از همون نوع هست که تعیین کردیم یا خیر؟
آیا این کار روی سرعت اجرای برنامه و performance تاثیرمنفی داره؟ چون چنتا چک کردن اضافه توسط هسته پایتون داره انجام میشه
بعضیا میگن type hint استفاده بشه چون خوانایی کد رو هم بالا میبره

پیشنهاد خودتون چی هست ؟ type hint بزاریم برای ورودی و خروجی توابع یا خیر؟ تاثیرش روی سرعت و پرفورمنس چیه ؟ خوانایی چطور ؟ خلاصه اولویت رو چی قرار بدیم ؟

سپاس

ارسال نظر


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

October 2021

سلام
type hint هیچ تاثیری روی سرعت و پرفورمنس نداره. پایتون هم اصلا چک نمیکنه که ورودی و خروجی با type hint یکی باشه.
فقط برای این هست که بقیه برنامه نویس ها بتونن بفهمن که چطور از کدتون استفاده کنن.
در ویدیو زیر درموردشون توضیح دادم:
https://www.mongard.ir/one_part/31/python-annotations/