วันพุธที่ 16 พฤศจิกายน พ.ศ. 2559

บันทึกเรียนรู้ python: เงื่อนไขการควบคุม และการทำงานวนรอบ

การเขียนโปรแกรมแน่นอนต้องมีการกำหนดเงื่อนไขต่างๆ เพื่อควบคุมการทำงานให้เป็นไปตามที่เราต้องการ จะว่าไปแล้วเงื่อนไขควบคุมนี่แหละเป็นหัวใจสำคัญของการเขียนโปรแกรม และรวมไปถึงการสั่งให้ระบบทำงานตามจำนวนรอบที่เราต้องการ

การควบคุมเงื่อนไขในโปรแกรมอื่นจะมี if, switch หรือ case แต่สำหรับ python แล้วมีเพียงอย่างเดียวคือ if-elif-else โดยมีตัวอย่างการใช้งานดังนี้

#!/usr/bin/python
x = int(input("Please enter your number: "))
if x < 0:  
  print("Negative")
elif x == 0:  
  print("Zero")
elif x > 0:  
  print("Positive")
else:  
  print("Error")


จากตัวอย่างจะเหมือนการกำหนดเงื่อนไขโดย case หรือ switch โดยจะเริ่มจาก if ถ้าไม่ใช่แบบมีเงื่อนต่อก็ใช้ elif แต่ถ้ามีเพียง 2 ทางเลือกก็จะใช้ else ตัวอย่างเช่น

if x == 0:  
  print("Disabled")
else:  
  print("Enabled")

จากตัวอย่างนี้จะเลือกแค่ 0 หรือ 1 หรือเลือกปิดหรือเปิด

การทำงานวนรอบ (Loop) 

นอกจากเงื่อนการทำงานตามกำหนดแล้วในการเขียนโปรแกรมก็จะอาศัยการวนรอบในการทำงานต่างๆ เพื่อให้ได้ซึ่งผลลัพธ์ที่ต้องการ และโดยปกติแล้วการทำงานวนรอบนี้จะมีการใช้เงื่อนไขอยู่ภายในรอบเพื่อตรวจสอบด้วย

ลองศึกษาตัวอย่างโปรแกรมนี้จะทำให้ทราบถึงการวนรอบ และ

#!/usr/bin/python
loop = True
nTotal = 0
while loop:
  cGet = raw_input("Please enter your number: ")
  if cGet.isdigit():
    nNumber = int(cGet)
    nTotal = nTotal + 1
    print("You press number: {0}, count {1}".format(nNumber, nTotal))
    loop = True
  else:
    if cGet == 'z' or cGet == 'Z':
      loop = False
      print("Exit...")
    print("Please enter number from 0-9")

จากตัวอย่างเป็นการใช้ while... ซึ่งเป็นคำสั่งสำหรับวนรอบทำงานตามเงื่อนไข โดยโปรแกรมจะวนทำงานตราบเท่าที่เงื่อนไขหลัง while จะเป็นจริง

อธิบายคำสั่ง

loop = True 
สำหรับกำหนดให้ตัวแปรมีค่าเป็นจริง เพื่อให้ while ทำงานไปเรื่อยๆ จนกว่าตัวแปร loop จะเปลี่ยนเป็น False

nTotal = 0
กำหนดตัวแปร nTotal เริ่มที่ 0 เพื่อใช้นับจำนวนที่กดหมายเลข

cGet = raw_input("Please enter your number: ")
คำสั่งสำรับรับค่าจากคีย์บอร์ดแล้วนำไปเก็บไว้ในตัวแปร cGet ผ่านคำสั่ง raw_input และจะแสดงข้อความแจ้งให้ป้อนหมายเลข ในตัวอย่างนี้ใช้ raw_input แทนคำสั่ง input เพราะใช้งานได้ยืดหยุ่นกว่า input

if cGet.isdigit():
เป็นกาตรวจสอบว่าตัวแปร cGet เป็นตัวเลขหรือไม่ผ่านฟังค์ชัน isdigit() 

nNumber = int(cGet)
แปลงค่าตัวอักษรให้เป็นตัวเลขที่สามารถคำนวณได้ผ่านฟังค์ชัน int() เพราะตัวเลขที่ป้อนผ่านคำสั่ง raw_input() จะเป็นข้อมูลแบบตัวอักษร ทำให้ตัวเลขนั้นไม่สามารถนำไปคำนวณได้ 

nTotal = nTotal + 1
เพิ่มค่า nTotal ขึ้นครั้งละ 1 เป็นการนับจำนวนครั้งที่กดตัวเลข

print("You press number: {0}, count {1}".format(nNumber, nTotal))
พิมพ์ข้อความบอกตัวเลขที่กด และจำนวนครั้งที่กดตัวเลข (ไม่นับตัวอื่นๆ ที่กด)

loop = True
เมื่อกดตัวเลขก็แจ้งให้ระบบทราบว่ายังจะทำงานต่อ โดยกำหนดให้ตัวแปร loop = True (จริงๆ ในตัวอย่างนี้ไม่ใส่ก็ได้ เพราะ loop มีค่าเป็น True อยู่แล้ว 

else:
หากเงื่อนไขไม่เป็นไปตามเงื่อนไขหลัง if ก็จะเข้ามาอยู่ในการทำงานส่วนของ else 

    if cGet == 'z' or cGet == 'Z':
      loop = False
      print("Exit...")
    print("Please enter number between 0-9")

if cGet == 'z' or cGet == 'Z':
ถ้าไม่ได้กดปุ่มตัวเลขแล้วให้ตรวจสอบว่าปุ่มที่กดเป็นตัวอักษร z หรือ Z ไหม ถ้าใช่ก็ให้ทำงานหลังบรรทัดนี้ แต่ถ้าไม่ใช่ให้ข้ามไปยังบล็อกถัดไป

loop = False
กรณีที่ไม่ได้กดตัวเลข และปุ่มที่กดไม่ใช่ z หรือ Z ให้กำหนดตัวแปร loop เป็นเท็จ เพื่อจะออกจากเงื่อนไขของ while

print("Exit...")
พิมพ์คำว่า Exit... ออกทางหน้าจอ 

print("Please enter number between 0-9")
กรณีที่ไม่ได้กดปุ่มตัวเลขและไม่ใช่ตัวอักษร z หรือ Z ให้พิมพ์ข้อความบอกว่า กดปุ่มตัวเลขระหว่าง 0-9 

เมื่อถึงบรรทัดสุดท้ายก็จะวนกลับไปตรวจสอบในเงื่อนไขของ while อีก หากไม่ได้กดปุ่ม z หรือ Z โปรแกรมก็จะเริ่มให้ป้อนตัวเลขใหม่อีกครั้งตามเงื่อนไข while loop: ดังนั้นหากต้องการออกจากการวนรอบนี้ก็กำหนดค่าให้ loop เป็น False 

บล็อกในโปรแกรมตัวอย่าง


โปรแกรม python จะใช้เครื่องหมาย : สำหรับบล็อกของ loop, ฟังค์ชัน, คลาส, เงื่อนไข และใช้การเว้นวรรคหรือย่อหน้าเป็นบล็อกด้วย และให้ระวังว่า การเคาะเว้นวรรค กับกดปุ่ม Tab จะแตกต่างกัน ใช้ร่วมกันไม่ได้ ถีงแม้จะมีย่อหน้าเท่ากันก็ตาม และการย่อหน้าจะถือว่าระดับการย่อหน้าเท่ากัน คือ บล็อกเดียวกัน เช่น บรรทัดแรกเว้นวรรค 2 ช่องว่าง และบรรทัดต่อมาเว้นวรรค 3 ช่องว่างจะถือว่าเป็นบล็อกใหม่ ดังนั้นควรระวังให้มากที่สุด

ไม่มีความคิดเห็น:

แสดงความคิดเห็น

Gtk4 ตอนที่ 6 Defining a Child object

Defining a Child object A Very Simple Editor ในบทความที่ผ่านมาเราสร้างโปรแกรมอ่านไฟล์ชนิดข้อความ และในบทความนี้ก็จะมาปรับแต่งโปรแกรมกันสักหน...