الدرس الثالث من تعلم بايثون ..الدوال Functions

بلندر و بايثون

مـا أجمـل البسـاطـة فى زمـن التعقيد …. تعلم بلندر و بايثون ببساطة

الدرس الثالث من تعلم بايثون ..الدوال Functions

الدوال …Functions


النقاط الأساسية :

1 – مقدمة .
2 -  الوحدة ….Module
 3 -  كيفية تعريف دالة جديدة.
4 -  دوال بمدخلات ..Argument
5 – مثال لحساب حجم  إسطوانة.

قبل البدء

تكلمنا فى المقال السابق عن المتغيرات و الثوابت و أدوات الإدخال و العمليات الحسابية و فى هذا المقال سنتكلم عن الدوال و كيفية إستخدامها و الإستفادة منها و أهميتها مع ضرب الأمثلة المتعددة فالبمثال يتضح المقال .
ترجمة كلمة Functions يعنى وظيفة أو دالة ؛ الدالة فى الرياضيات هى علاقة بين متغير تابع و متغير مستقل مثلا دالة تدرس العلاقة بين س المتغير المستقل و ص المتغير التابع .

ص = س – 1
# نكتبها كدالة هكذا
 ص=د(س) = س – ا

يعنى عند تغيير قيمة س تتغير قيمة ص تبعا لهذا التغير فنقول ؛ د(5)= 5 – 1 إذا د(5) = 4 يعنى قيمة ص عندما نضع قيمة س بخمسة . الرقم الذى بين القوسين يسمى مدخل argument و النتيجة تسمى القيمة المرجوعة أو العائدة return value إذا الدالة تأخذ قيمة مدخلة و تعطيك نتيجةو هناك دالة تأخذ قيمتين مثلا :

دالة ج = د(س , ص ) = 6س + 7 ص
د(5 ,3) = 6 * 5 + 7 * 3

و قد تتعدد المدخلات و تكون دالة ج دالة فى (س و ص ) و هذا تبسيط جدا لمفهوم الدوال فهى مجال واسع فى علم الرياضيات .

الدوال فى بايثون

لكل دالة إسم معين تستدعيها به فمثلا دالة تحديد النوع type

>>> type(“32″)


# لاحظ أنه حدد النوع كنص لإنها بين علامتى تنصيص

>>> srings = type(“32″)
>>> print strings
>>> type(32)

كتبنا إسم الدالة و بعدها قوسين و بينهم المدخل المراد تطبيق الوظيفة المعينة عليه و هى تحديد نوع المتغير .

>>> type(32.01)


هنا حدد المتغير 32.01 كرقم عشرى float .
دالة int تحول الرقم العشرى float أو الرقم الذى بين علامات تنصيص و تحوله إلى رقم صحيح integer و لا تقبل النصوص

>>> int(“32″)
32
>>> int(3.99999)
3
>>> int(“World”)
ValueError: invalid literal for int() with base 10: ‘World’

و كذلك دالة float تأخذ متغير العدد الصحيح و تحوله إلى عشرى و العدد العشرى الذى بين علامات تنصيص و لا تقبل النصوص أيضا .

 >>> float(32)
32.0
>>> float(“3.14159″)
3.14159

و دالة str التى تغير نوع المتغيرات إلى نوع نصى

>>> x=5
>>> x=str(x)
>>> type(x)


>>> str(5.555)
‘5.555′
ما الفائدة من تحويل الرقم الصحيح إلى عشرى ؟
أكتب هكذا و تأكد من النتج
>>> minute = 59
>>> minute/60
0
الناتج صفر لماذا ؟ لإنه المفسر يقوم بإخراج النتائج بالأعداد الصحيحة فقط و ما الحل ؟ الحل هو جعل نوع المتغير minute كنوع عشرى بالدالة float
>>> float(minute) / 60
0.98333333333333328

أو كتابة المقسوم عليه 60 هكذا 60.0 فيعرف المفسر أن نوع هذا المتغير رقم عشرى .

>>> minute = 59
>>> minute / 60.0
0.983333333333

هذه بعض دوال البايثون و هى كثيرة جدا .
الوحدة …. Module
الوحدة هى ملف يحتوى على مجموعة دوال لغرض معين و الوحدة يجب عمل إستيراد لها مثلا يوجد فى البايثون وحدة الرياضيات بها مجموعة دوال للعمليات الرياضية مثل حساب الزوايا المثلثية ” جا و جتا و ظا و .. “ و كيفية إستيراد الوحدة باﻷمر import و لابد من عمل إستيراد قبل تنفيذ أى دالة منها .

>>> import math

لإستخدام دوال الوحدة تكتب إسم الوحدة متبوعا بنقطة و بعدها إسم الدالة ” و القوسين لإدخال المدخلات ”

>>> x=math.log10(30.0)
>>> print x
1.47712125472

هذاالدالة لحساب لوغاريتم 30.0 للأساس 10 و لو لم نكتب الرقم 10 تصبح دالة اللوغاريتم للأساس الطبيعى e
أفتح محرر النصوص المفضل لديك و أكتب هذا البرنامج البسيط

import math
angle=input(” Enter your angle ..” )
print “the result sin(your angle is ” , math.sin(angle)
print “the result cos(your angle is ” , math.cos(angle)
print “the result tan(your angle is ” , math.tan(angle)

السطر الأول هو إستيراد للوحدة التى نريدها و السطر الثانى هو متغير إسمه angle بدالة الإدخال input و هى دالة إدخال لا تقبل إلا الأرقام فقط .

و السطر الثانى هو الأمر print و به دالة جيب الزاوية sin و هكذا إستخدمنا cos و tan . كما يمكن وضع مصطلح أو تعبير ( expression) كمدخل( argument ) للدوال و الدالة ما هى إلا تعبير فمثلا :

x = math.sqrt(math.log(10.0))

قمت بإدخال دالة آخرى داخل الدالة الأصلية فالدالة الأصلية () math.sqrt هى لحساب الجذر التربيعى للمدخل و المدخل عبارة عن دالة تحسب قيمة اللوغاريتم .
كيفية تعريف دالة جديدة
تستطيع بلغة البايثون أن تقوم بتعريف دالة “وظيفة ” جديدة لإستخدامها و الفائدة من عمل دالة هى توفير للخطوات فتقوم بعمل دالة تنجز وظيفة معينة فيما بعد فهى تقلل أسطر البرنامج و تسهل عمل مراجعة و تطوير للبرنامج و تفوق بايثون فى هذا المجال بشكل ملحوظ فهى لغة مفضلة عند علماء الرياضيات و الباحثين و المهندسين و مصممى الرسوم ثلاثية الأبعاد و برمجة الألعاب فهى أشهر اللغات فى برمجة الألعاب فهى قوية و سهلة .. تعالى نتعرف عن كيفية تعريف دالة جديدة داخل البايثون . لماذا تسمى بتعريف ؟ لإنك بكل ببساطة تقوم بتعريف المفسر أن هذه دالة سيستخدمها و تعريف الدالة يبدأ بكلمة def ثم إسم الدالة ثم قوسين ثم تنهيها بـ : و هذا يسمى رأس الدالة و الجزء الثانى يبدأ فى السطر التالى للرأس بعد أربعة مسافات من أول السطر و يكون فيه الأوامر و البيانات المختلفة (STATEMENTS) فلنضرب مثال لتعريف دالة ..

def NAME( LIST OF PARAMETERS ):
STATEMENTS

أسماء الدول تتبع نفس قوانين تسمية المتغيرات التى ذكرتها فى المقال السابق و لا تسمى دالة بإسم متغير قمت بتسميته أو دالة آخرى بنفس الإسم و بين القوسين يكون المدخل و فى السطر الثانى بعد أربع مسافات يبدأ جسم الدالة و يمكن وضع عدد غير محدود من البيانات .

def your_name():
print “ Your name”

هذه دالة تقوم بطباعة إسم Your name إسمها your_name و الأقواس الفارغة () تشير إلى أن هذه الدالة لا تأخذ مدخلات و السطر الثانى يحوى بيان (STATEMENT ) للطباعة .

و كيفية إستخدامها فى ملف نصى (script) هكذا ” قد سبق و بينت فى المقال الأول الفرق بين كتابة البرنامج فى ملف نصى script و إستخدام المفسر التفاعلى للغة البايثون بكتابة كلمة python فى سطر الأوامر “
def your_name():
print ” Your name “
your_name()
و ناتج هذا البرنامج سيكون تنفيذ أمر الطباعة .فأستخدام الدالة هو بكتابة إسمها متبوعا بقوسين و لو كانت تحتاج مدخلات فتكتب داخل القوسين المدخلات كما سنوضح و لو لا تحتاج فتكون كما هى فارغة .
يمكن إستدعاء دالة داخل دالة آخرى فلنرى فى هذا المثال و لنفترض إن البرنامج يحتوى على الدالة السابقة أيضا , و نضيف دالة جديدة
def my_name():
print “ My name is sherif “
و الدلة القادمة ستحوى الدالتين السابقتين your_name و my_name

 

def my_your_name():
my_name()
your_name()

ثم تقوم بتنفيذها فى سطر جديد () my_your_name
سيكون شكل الملف النصى هكذا

 

def your_name():
print ” Your name “
def my_name():
print ” My name is sherif “
def my_your_name():
my_name()
your_name()
my_your_name()

و الناتج سيكون هكذا” نكتب بايثون متبوعة بإسم الملف my_your_name.py “

[sherif@localhost ~]$ python my_your_name.py
My name is sherif
Your name

لاحظ أنه عندما تستدعى دالة فمن المنطقى أن تكون معرفة مسبقا فالمفسر يبدأ البرنامج من السطر الأول ثم الثانى و هكذا فلابد من الترتيب فى تعريف الدوال و إستدعائها .

دوال بمدخلات argument

لتعريف دالة بمدخلات لابد بوضع بارمتر داخل القوسين و البارمترات هى كالمتغيرات لكنها قاصرة على الدالة فقط فمثلا

def two_man(man):
print man , man

لإستدعاء الدالة ضع مدخلات مكان البارمتر man نكتب الدلة و بين القوسين أى قيمة بدلا من كلمة man و هذه الكلمة يمكن تغييرها لأى إسم

two_man(“sherif”)
two_man(555)

 

الناتج بعدها
sherif sherif
555 555
يمكن وضع بيان فى المدخل فمثلا
two_man(6*4)

 

أو متغير سبق إدخاله
dist=” Fedora and Joatha “
two_man(dist)

 

سيكون الناتج بطبع المتغير مرتين .

و يمكن تعريف دالة بمدخلين مثلا نقوم بعمل دالة لجمع شيئين
def cat_twice(part1, part2):
cat = part1 + part2
print cat
هنا سيأخذ قيميتن و لتنفيذ الدالة لابد من إدخال قيمتين عددية أو نصية
cat_twice(“me “,” you”)
cat_twice(5,10)
سيضم كلمتين me و you و سيجمع الرقمين 5 و 10 جرب أنت بنفسك و شكل الملف النصى سيكون هكذا
def cat_twice(part1, part2):
cat = part1 + part2
print cat
cat_twice(“me “,” you”)
cat_twice(5,10)

لاحظ هنا أن هناك متغير داخل الدالة إسمه cat حاول عمل أمر طباعة له print cat ستجد أن المفسر يعطيك خطأ معناه أن هذا المتغير لم يتم التعرف عليه .. لماذا ؟ لإن المتغيرات داخل الدوال محلية و قاصرة على داخل الدالة فقط و ليس لها أى علاقة بباقى البرنامج .
الدوال المنتجة و الغير منتجة
إستكمالا على البرنامج السابق قم بعمل متغير يساوى الدالة (cat_twice(5,10 و سمه مثلا result

result=cat_twice(5,10)
print result

ستجد أن قيمة result هى None لكـن لماذا ؟ و لماذا الدوال الآخرى كدوال وحدة math تقوم بحفظ القيمة ؟

هناك نوعين من الدوال دالة منتجة و دالة غير منتجة فالدالة قاصرة على تنفيذها و لا تقوم بإرجاع قيمة معينة فى الذاكرة و لكن كى تقوم بإرجاع أو حفظ قيمة المخرجات تحتاج إلى وضع أمر return و سنرى بالمثال كيف نستخدمه و الدوال التى كتبنها لا تحتوى على return . سنكتب دالة تقوم بحساب مساحة الدائرة و قانون المساحة هو حاصل ضرب ط فى تربيع نصف القطر

import math
def area(radius):
temp = math.pi * radius**2
return temp
area_c=area(5)
print area_c
فى هذا البرنامج لن يعطيك قيمة المتغير بـ None بل سيعطيك قيمة حقيقية و يمكن إختصار الدالة هكذا
def area(radius):
return math.pi * radius**2

و لكن السابقة أفضل عند مراجعة البرنامج و إكتشاف الأخطاء . و دالة math.pi هى قيمة باى أو ط 22/7 أو 3.14 .

إسطوانة
نريد كتابة برنامج يقوم بحساب حجم الإسطوانة .قانون حجم الإسطوانة هو عبارة عن حاصل ضرب مساحة القاعدة فى الإرتفاع و القاعدة هى دائرة . إذا المدخلات هى إرتفاع الإسطوانة و نصف قطر قاعدتها و أفضل طريقة لكتابة البرنامج هى التدرج مع البرنامج فلنبدأ بكتابة شكل الدالة . هى دالة ستحتاج إلى مدخلين الإرتفاع h و نصف القطر r و بما إن القاعدة دئرة فسنستخدم دالة حساب مساحة الدائرة و نبدأ بكتابة شكل الدالة


import math
def area(radius):
temp = math.pi * radius**2
return temp
def cylender_valume(h,r):
return 0.0

و قم بتجربة البرنامج أولا و تأكد من عدم وجود أخطاء و بعد ذلك سنبدأ بحساب مساحة القاعدة و هى بإستدعاء الدالة الأولى لحساب مساحة الدائرة و أعلم أنه أى سطر برمجى بعد جملة return ليس له أى قيمة فالإضافة ستكون قبلها فستصبح الدالة هكذا

def cylender_valume(h,r):
radius = area(r)
return 0.0
و قم بتجربة البرنامج و تأكد من عدم وجود أخطاء و بعد ذلك نبدأ بحساب الحجم
def cylender_valume(h,r):
radius = area(r)
valume = h * radius
return 0.0

تأكدت أن البرنامج صحيح ؟ قم بعمل return للحجم و بعد ذلك نريد عمل مدخلات و تطبيق للدالة و إنهاء البرنامج

و يصبح شكل البرنامج النهائى هكذا

import math
def area(radius):
temp = math.pi * radius**2
return temp
def cylender_valume(h,r):
radius = area(r)
valume = h * radius
return valume
R = input(” Enter the radius of cylender ” )
H = input(” Enter the height of cylender ” )
valume = cylender_valume(R,H)
print valume

و لنا لقاء بمشيئة الله تعالى فى العدد القادم .



5 تعليقات

  1. ياااااااااااااااااااااااااااااااااااااااااااااااااااااااه
    اخير عدت
    اربعه اشهر من الانقطاع وهانا قد عدت لمتابعه الدروس
    وفقك الله اخي الشريف احمد
    جزاك الله خير الجزاء وجعلك رفيق النبي صلى الله عليه وسلم في الجنة

  2. يا هلااااااااااااااااااااااااااااااااااا
    حمد لله بالسلامة :)

  3. وانت بالف سلامه اخي احمد

  4. لماذا توقفت عن كتابتها في مجله لينوكس الرائعه

  5. الحقيقة أبتعدت عن البايثون هذه الفترة
    لكن لى عودة بإذن الله عما قريب

اترك تعليقاً :

من فضلك انتبه : تم تفعيل إدارة التعليقات لذا قد تتأخر إضافة تعليقك . لا توجد أدني حاجة لإضافة تعليقك مرة أخرى !!