ผลต่างระหว่างรุ่นของ "Python Programming/User-Defined Functions"
Cardcaptor (คุย | มีส่วนร่วม) |
Chaiporn (คุย | มีส่วนร่วม) |
||
(ไม่แสดง 14 รุ่นระหว่างกลางโดยผู้ใช้ 2 คน) | |||
แถว 7: | แถว 7: | ||
. | . | ||
. | . | ||
− | โดยในตัวของฟังก์ชันเอง | + | โดยในตัวของฟังก์ชันเอง เราใช้คำสั่ง <tt>return</tt> เพื่อบอกให้ฟังก์ชันคืนค่่าที่เรากำหนดให้ คำสั่ง <tt>return</tt> มีรูปแบบดังต่อไปนี้ |
return <<นิพจน์>> | return <<นิพจน์>> | ||
ยกตัวอย่างเช่น ถ้าเราจะประกาศฟังก์ชัน <tt>square(x)</tt> ซึ่งคืนค่า x ยกกำลังสอง ก็สามารถทำได้ดังนี้ | ยกตัวอย่างเช่น ถ้าเราจะประกาศฟังก์ชัน <tt>square(x)</tt> ซึ่งคืนค่า x ยกกำลังสอง ก็สามารถทำได้ดังนี้ | ||
− | < | + | <syntaxhighlight lang="python"> |
− | + | def square(x): | |
− | + | return x**2 | |
− | + | </syntaxhighlight> | |
− | </ | ||
หลังจากประกาศฟังก์ชันแล้ว เราก็สามารถนำมันไปใช้ได้เหมือนฟังก์ชันพร้อมใช้ของไพทอนหรือฟังก์ชันที่ import มาจากโมดูลต่างๆ | หลังจากประกาศฟังก์ชันแล้ว เราก็สามารถนำมันไปใช้ได้เหมือนฟังก์ชันพร้อมใช้ของไพทอนหรือฟังก์ชันที่ import มาจากโมดูลต่างๆ | ||
<pre title="interpreter"> | <pre title="interpreter"> | ||
แถว 28: | แถว 27: | ||
ในกรณีที่ฟังก์ชันที่ต้องการประกาศมี parameter มากกว่าหนึ่งตัว ให้ใช้คอมมา (,) คั่นระหว่าง parameter แต่ละตัว ยกตัวอย่างเช่นฟังก์ชัน <tt>lerp(a,b,x)</tt> (lerp ย่อมาจาก linear interpolation) ซึ่งคำนวณค่า a(1-x) + bx | ในกรณีที่ฟังก์ชันที่ต้องการประกาศมี 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"> | <pre title="interpreter"> | ||
− | |||
− | |||
− | |||
>>> lerp(0,2,0.5) | >>> lerp(0,2,0.5) | ||
1.0 | 1.0 | ||
แถว 40: | แถว 41: | ||
</pre> | </pre> | ||
+ | == การจัดย่อหน้า == | ||
ถ้าฟังก์ชันที่เราต้องการนิยามมีหลายคำสั่ง คำสั่งทุกคำสั่งจะต้องเยื้องจากตำแหน่งของ <tt>def</tt> มาเป็นระยะเท่าๆ กัน เช่น | ถ้าฟังก์ชันที่เราต้องการนิยามมีหลายคำสั่ง คำสั่งทุกคำสั่งจะต้องเยื้องจากตำแหน่งของ <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"> | <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): | >>> 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> | ||
− | + | มีข้อผิดพลาด: | |
+ | <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 |