ผลต่างระหว่างรุ่นของ "Python Programming/User-Defined Functions"

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
 
(ไม่แสดง 21 รุ่นระหว่างกลางโดยผู้ใช้ 3 คน)
แถว 7: แถว 7:
 
       .
 
       .
 
       .
 
       .
 +
โดยในตัวของฟังก์ชันเอง เราใช้คำสั่ง <tt>return</tt> เพื่อบอกให้ฟังก์ชันคืนค่่าที่เรากำหนดให้ คำสั่ง <tt>return</tt> มีรูปแบบดังต่อไปนี้
 +
return <<นิพจน์>>
 +
ยกตัวอย่างเช่น ถ้าเราจะประกาศฟังก์ชัน <tt>square(x)</tt> ซึ่งคืนค่า x ยกกำลังสอง ก็สามารถทำได้ดังนี้
 +
<syntaxhighlight lang="python">
 +
def square(x):
 +
    return x**2
 +
</syntaxhighlight>
 +
หลังจากประกาศฟังก์ชันแล้ว เราก็สามารถนำมันไปใช้ได้เหมือนฟังก์ชันพร้อมใช้ของไพทอนหรือฟังก์ชันที่ import มาจากโมดูลต่างๆ
 +
<pre title="interpreter">
 +
>>> square(100)
 +
10000
 +
>>> square(1+2)
 +
9
 +
>>> square(0.5)
 +
0.25
 +
>>> square(square(1.25))
 +
2.44140625
 +
</pre>
 +
 +
ในกรณีที่ฟังก์ชันที่ต้องการประกาศมี parameter มากกว่าหนึ่งตัว ให้ใช้คอมมา (,) คั่นระหว่าง parameter แต่ละตัว ยกตัวอย่างเช่นฟังก์ชัน <tt>lerp(a,b,x)</tt> (lerp ย่อมาจาก linear interpolation) ซึ่งคำนวณค่า a(1-x) + bx
 +
<syntaxhighlight lang="python">
 +
def lerp(a,b,x):
 +
    return a*(1-x) + b*x
 +
</syntaxhighlight>
 +
 +
<pre title="interpreter">
 +
>>> lerp(0,2,0.5)
 +
1.0
 +
>>> lerp(7,8,0.25)
 +
7.25
 +
>>> lerp(0,100,1)
 +
100
 +
</pre>
 +
 +
== การจัดย่อหน้า ==
 +
ถ้าฟังก์ชันที่เราต้องการนิยามมีหลายคำสั่ง คำสั่งทุกคำสั่งจะต้องเยื้องจากตำแหน่งของ <tt>def</tt> มาเป็นระยะเท่าๆ กัน เช่น
 +
 +
<syntaxhighlight lang="python">
 +
import math
 +
 +
def length(x0, y0, x1, y1):
 +
    return math.sqrt((x0-x1)**2 + (y0-y1)**2)
 +
 +
def triangle_area(xA, yA, xB, yB, xC, yC):
 +
    a = length(xA, yA, xB, yB)
 +
    b = length(xB, yB, xC, yC)
 +
    c = length(xC, yC, xA, yA)
 +
    s = (a+b+c)/2
 +
    return math.sqrt(s*(s-a)*(s-b)*(s-c))
 +
</syntaxhighlight>
 +
 +
<pre title="interpreter">
 +
>>> triangle_area(0,0,1,1,1,0)
 +
0.49999999999999978
 +
>>> triangle_area(0,1,-2,1,0,0)
 +
1.0
 +
</pre>
 +
ในที่นี้เราได้เขียนฟังก์ชัน <tt>length(x0, y0, x1, y1)</tt> เพื่อคำนวณความยาวของส่วนของเส้นตรงซึ่งเชื่อมระหว่างจุด (x0, y0) และ (x1, y1) ในระนาบคาร์ทีเชียน และฟังก์ชัน <tt>triangle_area(xA, yA, xB, yB, xC, yC)</tt> เพื่อคำนวณพื้นที่ของสามเหลี่ยมที่มีจุดยอดมุมอยู่ที่่จุด (xA, yA), (xB, yB), และ (xC, yC) โดยใช้สูตรของเฮรอน <math>\sqrt{s(s-a)(s-b)(s-c)}</math> เมื่อ a, b, และ c คือความยาวของด้านทั้งสามของสามเหลี่ยม และ <math>s = \frac{a+b+c}{2}</math>
 +
 +
ถ้าหากเราทำให้คำสั่งในฟังก์ชันเยื้องจาก def ไม่เท่ากัน ตัวแปรภาษาไพทอนจะฟ้องว่าโปรแกรมของเราผิดไวยากรณ์
 +
<pre title="interpreter">
 +
>>> def triangle_area(xA, yA, xB, yB, xC, yC):
 +
...    a = length(xA, yA, xB, yB)
 +
...  b = length(xB, yB, xC, yC)
 +
 
 +
  File "<pyshell#20>", line 3
 +
    b = length(xB, yB, xC, yC)
 +
  ^
 +
IndentationError: unexpected indent
 +
</pre>
 +
 +
นอกจากนี้คำสั่งในฟังก์ชันจะต้องเยื้องมาทางขวาของ <tt>def</tt> เท่านั้น จะอยู่ระดับเดียวกับ <tt>def</tt> หรือเยื้องไปทางซ้ายของ <tt>def</tt> ไม่ได้ กล่าวคือตัวแปรภาษาไพทอนจะบอกว่าการประกาศฟังก์ชัน
 +
<pre title="interpreter">
 +
>>> def length(x0, y0, x1, y1):
 +
... return math.sqrt((x0-x1)**2 + (y0-y1)**2)
 +
</pre>
 +
มีข้อผิดพลาด:
 +
<pre>
 +
File "User's code", line 2
 +
  return math.sqrt((x0-x1)**2 + (y0-y1)**2)
 +
        ^
 +
IndentationError: expected an indented block
 +
</pre>
 +
 +
การให้ความสำคัญกับการย่อหน้าสมบัติของภาษาไพทอนที่ไม่มีในภาษาโปรแกรมเชิงโครงสร้างอื่นๆ เช่น ภาษา C หรือภาษา Java '''ภาษาไพทอนใช้ย่อหน้าในการจัดการโครงสร้างของโปรแกรม โดยที่คำสั่งที่มีตำแหน่งย่อหน้าเท่ากับจะจัดว่าอยู่ในโครงสร้างย่อยเดียวกันในโปรแกรม และตัวแปรภาษาไพทอนจะไม่แปลโปรแกรมที่จัดย่อหน้าไม่ถูกต้อง''' ในขณะที่ภาษาอื่นๆ นั้นจะไม่สนใจว่าผู้เขียนโปรแกรมจะมีการจัดย่อหน้าโปรแกรมหรือมีการใช้ตัวอักษรช่องว่างต่างๆ เป็นอย่างไรเลย
 +
 
{{Python Programming/Navigation|Functions|Print Command}}
 
{{Python Programming/Navigation|Functions|Print Command}}

รุ่นแก้ไขปัจจุบันเมื่อ 04:00, 4 ตุลาคม 2558

ผู้ใช้ภาษาไพทอนสามารถเขียนฟังก์ชันขึ้นมาเองได้ โดยใช้คำสั่ง def ซึ่งมีไวยากรณ์ดังต่อไปนี้

def <<ชื่อฟังก์ชัน>>(<<รายชื่อ parameter>>):
    คำสั่ง 1
    คำสั่ง 2
    คำสั่ง 3
      .
      .
      .

โดยในตัวของฟังก์ชันเอง เราใช้คำสั่ง return เพื่อบอกให้ฟังก์ชันคืนค่่าที่เรากำหนดให้ คำสั่ง return มีรูปแบบดังต่อไปนี้

return <<นิพจน์>>

ยกตัวอย่างเช่น ถ้าเราจะประกาศฟังก์ชัน square(x) ซึ่งคืนค่า x ยกกำลังสอง ก็สามารถทำได้ดังนี้

def square(x):
    return x**2

หลังจากประกาศฟังก์ชันแล้ว เราก็สามารถนำมันไปใช้ได้เหมือนฟังก์ชันพร้อมใช้ของไพทอนหรือฟังก์ชันที่ import มาจากโมดูลต่างๆ

>>> square(100)
10000
>>> square(1+2)
9
>>> square(0.5)
0.25
>>> square(square(1.25))
2.44140625

ในกรณีที่ฟังก์ชันที่ต้องการประกาศมี parameter มากกว่าหนึ่งตัว ให้ใช้คอมมา (,) คั่นระหว่าง parameter แต่ละตัว ยกตัวอย่างเช่นฟังก์ชัน lerp(a,b,x) (lerp ย่อมาจาก linear interpolation) ซึ่งคำนวณค่า a(1-x) + bx

def lerp(a,b,x):
    return a*(1-x) + b*x
>>> lerp(0,2,0.5)
1.0
>>> lerp(7,8,0.25)
7.25
>>> lerp(0,100,1)
100

การจัดย่อหน้า

ถ้าฟังก์ชันที่เราต้องการนิยามมีหลายคำสั่ง คำสั่งทุกคำสั่งจะต้องเยื้องจากตำแหน่งของ def มาเป็นระยะเท่าๆ กัน เช่น

import math

def length(x0, y0, x1, y1):
    return math.sqrt((x0-x1)**2 + (y0-y1)**2)

def triangle_area(xA, yA, xB, yB, xC, yC):
    a = length(xA, yA, xB, yB)
    b = length(xB, yB, xC, yC)
    c = length(xC, yC, xA, yA)
    s = (a+b+c)/2
    return math.sqrt(s*(s-a)*(s-b)*(s-c))
>>> triangle_area(0,0,1,1,1,0)
0.49999999999999978
>>> triangle_area(0,1,-2,1,0,0)
1.0

ในที่นี้เราได้เขียนฟังก์ชัน length(x0, y0, x1, y1) เพื่อคำนวณความยาวของส่วนของเส้นตรงซึ่งเชื่อมระหว่างจุด (x0, y0) และ (x1, y1) ในระนาบคาร์ทีเชียน และฟังก์ชัน triangle_area(xA, yA, xB, yB, xC, yC) เพื่อคำนวณพื้นที่ของสามเหลี่ยมที่มีจุดยอดมุมอยู่ที่่จุด (xA, yA), (xB, yB), และ (xC, yC) โดยใช้สูตรของเฮรอน เมื่อ a, b, และ c คือความยาวของด้านทั้งสามของสามเหลี่ยม และ

ถ้าหากเราทำให้คำสั่งในฟังก์ชันเยื้องจาก def ไม่เท่ากัน ตัวแปรภาษาไพทอนจะฟ้องว่าโปรแกรมของเราผิดไวยากรณ์

>>> def triangle_area(xA, yA, xB, yB, xC, yC):
...     a = length(xA, yA, xB, yB)
...   b = length(xB, yB, xC, yC)
	  
  File "<pyshell#20>", line 3
    b = length(xB, yB, xC, yC)
   ^
IndentationError: unexpected indent

นอกจากนี้คำสั่งในฟังก์ชันจะต้องเยื้องมาทางขวาของ def เท่านั้น จะอยู่ระดับเดียวกับ def หรือเยื้องไปทางซ้ายของ def ไม่ได้ กล่าวคือตัวแปรภาษาไพทอนจะบอกว่าการประกาศฟังก์ชัน

>>> def length(x0, y0, x1, y1):
... return math.sqrt((x0-x1)**2 + (y0-y1)**2)

มีข้อผิดพลาด:

 File "User's code", line 2 
   return math.sqrt((x0-x1)**2 + (y0-y1)**2) 
        ^
IndentationError: expected an indented block 

การให้ความสำคัญกับการย่อหน้าสมบัติของภาษาไพทอนที่ไม่มีในภาษาโปรแกรมเชิงโครงสร้างอื่นๆ เช่น ภาษา C หรือภาษา Java ภาษาไพทอนใช้ย่อหน้าในการจัดการโครงสร้างของโปรแกรม โดยที่คำสั่งที่มีตำแหน่งย่อหน้าเท่ากับจะจัดว่าอยู่ในโครงสร้างย่อยเดียวกันในโปรแกรม และตัวแปรภาษาไพทอนจะไม่แปลโปรแกรมที่จัดย่อหน้าไม่ถูกต้อง ในขณะที่ภาษาอื่นๆ นั้นจะไม่สนใจว่าผู้เขียนโปรแกรมจะมีการจัดย่อหน้าโปรแกรมหรือมีการใช้ตัวอักษรช่องว่างต่างๆ เป็นอย่างไรเลย

หน้าก่อน: Functions สารบัญ หน้าต่อไป: Print Command