Python – Keywords and Identifier

og:image

คีย์เวิร์ด(Keywords)

คีย์เวิร์ด(keywords) หรือ คำสงวนนั้นเป็นคำที่ถูกจำกัดไว้เพื่อใช้งานเฉพาะเจาะจงสำหรับภาษานั้น เราสามารถใช้คีย์เวิร์ดในการประกาศตัวแปร, ฟังก์ชัน, หรือ identifier ใดๆ

ในภาษา python นั้นการตั้งชื่อตัวพิมพ์เล็กหรือพิมพ์ใหญ่จะมีผลที่แตกต่างกัน โดยในเวอร์ชัน 3.3 จะมีคีย์เวิร์ดทั้งหมด 33 ตัว โดยส่วนใหญ่แล้วจะถูกเขียนด้วยตัวอักษรพิมพ์เล็ก ยกเว้นแต่คีย์เวิร์ด True, False, None ที่ตัวอักษรขึ้นต้นเป็นพิมพ์ใหญ่

คีย์เวิร์ดต่างๆ มีดังนี้

False class finally is return
None continue for lambda try
True def from nonlocal while
and del global not with
as elif if or yield
assert else import pass
break except in raise


คีย์เวิร์ด True และ False

บอกค่าความเป็นจริงเป็นเท็จ ตัวอย่างเช่น

a = 3+3
b = 2+4
a == b #(ผลคือ True)


คีย์เวิรด์ None
ค่าคงที่ซึ่งจะบ่งชี้ว่าไม่มีค่าใดๆ อยู่ หรือเป็นค่า null ควรระวังไว้ว่า ค่า None ไม่ได้หมายถึง False , 0, ลิสต์เปล่า (empty list) , ดิกชันนารีเปล่า( empty dictionary ) หรือ empty string ตัวอย่างเช่น

a = None #ระบุด้วยคีย์เวิร์ด None ซึ่งหมายถึงการไม่ระบุค่าใดๆ
b = None # ระบุด้วยคีย์เวิร์ด None ซึ่งหมายถึงการไม่ระบุค่าใดๆ
c = False # ระบุด้วยคีย์เวิร์ด False 
a == b # ผลคือ True
a == c # ผลคือ False

สำหรับฟังก์ชันที่ไม่มีการคืนค่า( void function ) โปรแกรมจะทำการคืนค่า None โดยอัตโนมัติ อีกทั้งหากทำงานในฟังก์ชันใด แล้วไม่เจอ return statement ประกาศไว้ ก็จะคืนค่า None กลับไปอัตโนมัติ เช่นกัน

def calculate_circle_area(radius):
    area = 3.14 * radius * radius
    return area

def calculate_circle_circumference(radius):
    circumference = 2 * 3.14 * radius

circle_area = calculate_circle_area(10) # เรียกฟังก์ชันซึ่งมีการคืนค่าของข้อมูล
print( circle_area )
# ผลก็คือมีการปรินท์ค่า 314
 
circle_circumference = calculate_circle_circumference(10) # เรียกฟังก์ชันซึ่งไม่มีการคืนค่าของข้อมูล
print( circle_circumference )
# ผลก็คือมีการปรินท์ค่า None เพราะได้ลืมประกาศการ return ค่ากลับมา โปรแกรมจึงคืนค่า None ให้อัตโนมัติ


คีย์เวิร์ด and, or, not

คือตัวดำเนินการเชิงตรรกะ ไว้เปรียบเทียบความเป็นจริงเท็จของข้อมูล

การใช้ and เปรียบเทียบ ผลจะเป็นจริงก็ต่อเมื่อ ตัวเปรียบเทียบทั้งสองตัวเป็นจริง

Truth table สำหรับ and

A B A and B
จริง(True) จริง(True) จริง(True)
จริง(True) เท็จ(False) เท็จ(False)
เท็จ(False) จริง(True) เท็จ(False)
เท็จ(False) เท็จ(False) เท็จ(False)
score = 82
if (score >= 80) and (score <= 100) :
    print( "Grade A" )
# ผลก็คือปรินท์ Grade A เพราะคะแนน 82 อยู่ในช่วงระหว่าง 80 - 100
# เงื่อนไขแรก คือ เปรียบเทียบว่า score >= 80 หรือไม่
# เงื่อนไขที่สอง คือ เปรียบเทียบว่า score <= 100 หรือไม่
# นักเรียนคนนี้จะได้เกรด A ก็ต่อเมื่อช่วงคะแนนที่ได้อยู่ระหว่าง 80 - 10

การใช้ or เปรียบเทียบ ผลจะเป็นจริงก็ต่อเมื่อ พจน์ใดพจน์หนึ่งเป็นจริง

Truth table สำหรับ or

A B A or B
จริง(True) จริง(True) จริง(True)
จริง(True) เท็จ(False) จริง(True)
เท็จ(False) จริง(True) จริง(True)
เท็จ(False) เท็จ(False) จริง(True)
exam_score = 70
paper_work = 90
if (exam_score > 80) or (paper_work > 80) :
    print( "Pass" )
# ผลก็คือปรินท์ว่า Pass แม้นว่า คะแนนสอบจะน้อยกว่า 80 แต่มีคะแนนงานมากกว่า 80 ก็ถือว่าผ่านแล้ว
# เงื่อนไขแรก คือ เปรียบเทียบว่า exam_score > 80 หรือไม่
# เงื่อนไขที่สอง คือ เปรียบเทียบว่า paper_work > 80 หรือไม่
# นักเรียนจะผ่านการสอบนี้ก็ต่อเมื่อ มีคะแนนสอบมากกว่า 80 หรือ มีคะแนนงานมากกว่า 80

not ใช้สำหรับสลับค่าความเป็นจริง หรือ เท็จ

Truth table สำหรับ or

A not A
จริง( True) เท็จ(False)
เท็จ(False) จริง(True)
apply_student = 10
if not (apply_student < 40):
    print( "course open" )
# ผลก็คือไม่มีการปรินท์ค่าใดๆ 
# คอร์สนี้จะเปิดก็ต่อเมื่อ มีนักเรียนสมัครเข้าเรียนไม่น้อยกว่า 40 คน


คีย์เวิร์ด as

ใช้เป็นตัว alias เมื่อทำการ import module ย่อยๆ และเพื่อที่จะตั้งชื่อ module นั้นๆ เป็นชื่ออื่นที่สะดวกแก่การเรียกใช้ภายในโปรแกรม

import numpy as np     # ทำการ import modules ชื่อ numpy แต่ภายในโปรแกรมเราจะเรียกอย่างย่อว่า np 
student_scores = [85, 70, 90, 69]   # กำหนด array ของคะแนนของนักเรียน
maximum_score = np.max(student_scores) # ใช้ฟังก์ชัน max ของ library numpy เพื่อหาค่าคะแนนที่มากที่สุดจากอาเรย์ที่กำหนด
print( maximum_score )
# จะทำการปรินท์ค่า 90 ออกมา


คีย์เวิร์ด assert

โดยส่วนใหญ่จะใช้เพื่อทำการ debug โปรแกรม เพราะบางครั้งเราต้องการตรวจสอบเงื่อนไขบางอย่างที่ไม่ต้องการให้เกิดในโปรแกรม หากเกิดเงื่อนไขดังกล่าวควรแจ้งให้เราทราบระหว่างทำการทดสอบ
วิธีการใช้ เราจะใช้ assert แล้วตามด้วยเงื่อนไขที่เราต้องการตรวจสอบ

score = 120
assert score <= 100
# ผลก็คือโปรแกรมจะคืนค่า AssertionError ออกมา
# เราทำการตรวจสอบค่า score ด้วยการใช้ assert เพราะต้องการให้ score ในโปรแกรมเรานั้นมีค่าน้อยกว่า 100 เท่านั้น

 

คีย์เวิร์ด break, continue
เราจะใช้คีย์เวิร์ดนี้ภายใน for และ while ลูป เพื่อต้องการจะเปลี่ยนแปลงเงื่อนไขปกติในการวนลูป

break ใช้เพื่อทำการหยุดการดำเนินการของลูปที่อยู่ในกลุ่มคำสั่งเดียวกันลง แล้วข้ามไปทำ คำสั่งต่อไปที่ถัดจากลูปนั้นๆ

for i in range(1, 10):
    if i==3:
        break
    print( i )
# ผลก็คือจะปรินท์ค่า 1, 2

continue ใช้ทำการหยุดเฉพาะลูปของรอบที่ทำอยู่ แล้วข้ามไปยังรอบต่อไปของลูปดังกล่าว

for i in range(1, 10):
    if i==3:
        continue
    print( i )
# ผลก็คือจะปรินท์ค่า 1, 2, 4, 5, 6, 7, 8, 9 ยกว้น 3


คีย์เวิร์ด class

ใช้เพื่อประกาศคลาสใหม่ที่สร้างขึ้น โดยการสร้างคลาสนั้นก็เหมือนเรานิยามวัตถุที่สามารถเทียบเคียงได้ในโลกจริงให้เป็นวัตถุหรือคลาสหนึ่งในโปรแกรม ซึ่งเป็นการใช้ concept ของ OOP(object-oriented programming) จะใช้ในการอธิบายถึง คุณลักษณะ(attribute) และ พฤติกรรม(methods) ของวัตถุนั้นๆ

class Course:
    lecturer = "Lecturer name"
    description = "Course description here"
    def calculate_average_score():
        ...

จากตัวอย่างข้างต้น เราทำการประกาศคลาสชื่อว่า Course ซึ่ง คลาสนี้มีคุณลักษณะ(attribute)สองอย่างคือ มีชื่อผู้สอน(lecturer) และ รายละเอียดของคอร์ส(description) และจะมีพฤติกรรม(method)ที่ทำได้ คือทำการคำนวณคะแนนเฉลี่ยของคะแนนที่นักเรียนสอบได้ในคลาส


คีย์เวิร์ด def

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

# ฟังก์ชันสำหรับคำนวณค่าเฉลี่ยของคะแนนของนักเรียน
def calculate_average_score(student_scores):
    total = 0
    for score in student_scores:
        total += score
    average_score = total/len(student_scores)
    return average_score

student_scores = [10, 15, 12, 13]
print( calculate_average_score(student_scores) )


คีย์เวิร์ด del
ใช้สำหรับลบการอ้างอิงถึงวัตถุ(object)ใดๆ

student_name = "David"
print( student_name )
# ผลก็คือจะปรินท์ชื่อนักเรียนว่า David
del student_name 
print( student_name )
# ผลก็คือโปรแกรมจะ Error เพราะว่าเราได้ลบการอ้างอิงถึงตัวแปรนั้นไปแล้ว


คีย์เวิร์ด if, else, elif
จะใช้เพื่อสร้างเงื่อนไขของการเรียกใช้แต่ละชุดคำสั่ง

  • ใช้ if เพื่อให้ทำคำสั่งภายในบล็อกดังกล่าวหากเงื่อนไขเป็นจริง
  • ใช้ elif เพื่อทำคำสั่งในบล็อกหากเงื่อนไขที่กำหนดไว้เป็นจริง และไม่ได้อยู่เป็นบล็อกแรก
  • ใช้ else เมื่อไม่เข้าเงื่อนไขใดๆ ใน if หรือ elif แล้ว ก็จะเข้ามาทำคำสั่งในบล็อกนี้
score = 70
if score < 60 :
    print( "Grade D" )
elif score < 70 :
    print( "Grade C" )
elif score < 80 : 
    print( "Grade B" )
else :
    print( "Grade A" )
# ผลที่ได้คือโปรแกรมจะปรินท์ค่า Grade B


คีย์เวิร์ด except, raise, try

ใช้สำหรับการดักจับข้อผิดพลาดที่เกิดขึ้นเพื่อสามารถระบุเงื่อนไขได้ว่าจะจัดการกับข้อผิดพลาดแต่ละแบบได้อย่างไร แทนที่จะให้โปรแกรมหยุดการทำงานไปเฉยๆ โดยไม่ทราบสาเหตุ  ตัวอย่างข้อผิดพลาดที่เกิดขึ้นมีดังนี้ IOError, ValueError, ZeroDivisionError, ImportError, NameError, TypeError, etc.
เราใช้ try…except เพื่อที่จะดักจับข้อผิดพลาดที่เกิดขึ้น และเราสามารถระบุว่าหากเกิดข้อผิดพลาดขึ้นเราต้องการจะให้โปรแกรมทำงานอย่างไร

def calculate_pass_percent(total_students, pass_students):
    try :
        pass_percent = pass_students/total_students * 100
    except:
        print( "Exception occur" )
        return
    return pass_percent

# เราใช้ try, except เพื่อที่จะตรวจสอบหากเกิดข้อผิดพลาดขึ้นเพราะในกรณีนี้ เพราะหากจำนวนนักเรียนที่ส่งเข้ามามีค่าเป็น 0 จะทำให้เกิดข้อผิดพลาดในการคำนวณได้


คีย์เวิร์ด finally
จะใช้ร่วมกับ try…except เพื่อที่จะให้แน่ใจว่า แม้ว่าจะมีข้อผิดพลาดเกิดขึ้น แต่กลุ่มของคำสั่งที่ระบุไว้ใน finally ก็จะถูกเรียกใช้แน่นอน ตัวอย่างการใช้ เช่นในกรณีต้องการ ปรับแต่งข้อมูล, บันทึกข้อมูล, ปิดไฟล์ทีได้เปิดไว้

f = open('score.txt', 'r')  # เปิดไฟล์ชื่อ 'score.txt'
try:
    score_str = f.read()    # ทำการอ่านข้อมูลจากไฟล์ที่เปิดไว้
    scores = score_str.split(',')
except:
    print("Cannot read data in file")
finally:
    f.close()


คีย์เวิร์ด for
ใช้สำหรับการวนลูป โดยทั่วไปมักจะใช้ for เมื่อเรารู้จำนวนรอบในการวนลูปที่แน่นอน

student_names = ["David", "Peter", "Mary", "Adam", "Paul", "Alex"]
for name in student_names:
    print("name: "+name)
# ผลที่ได้คือมีการปรินท์ค่า
# name: David
# name: Peter
# name: Mary
# name: Adam
# name: Paul
# name: Alex


คีย์เวิร์ด from, import
import
จะใช้สำหรับการ import modules ที่ต้องการใช้เข้ามายัง namespace ที่ใช้อยู่

import numpy as np
scores = [90, 75, 80, 69]
score_avg = np.average(scores) # เรียกใช้ฟังก์ชัน average จาก numpy ในการหาค่าเฉลี่ย
print( score_avg )
# ผลที่ได้คือทำการพิมพ์ 78.5 ออกมาซึ่งเป็นค่าคะแนนเฉลี่ย
# มีการเรียกใช้ modules numpy ซึ่งสามารถเรียกใช้ฟังก์ชันทั้งหมดของ modules นี้และทำการ alias ให้ชื่อกระทัดรัดขึ้นโดยใช้ชื่อว่า np
# จากนั้นทำการเข้าถึงฟังก์ชัน average จาก modules numpy โดยการเรียก np.average(parameters)

from…import
ใช้เพื่อทำการ import attribute/function ทีเฉพาะเจาะจงลงไป เข้ามาใช้ใน namespace ที่ใช้อยู่ แทนที่จะ import ทั้งหมดเข้ามา

from numpy import average
scores = [90, 75, 80, 69]
score_avg = average(scores) # เรียกใช้ฟังก์ชัน average จาก library numpy ในการหาค่าเฉลี่ย โดยไม่ต้องระบุถึงชื่อ module อีกเพราะเราได้อ้างถึงด้วย from...import ในบรรทัดด้านบนแล้ว 
print( score_avg )
# ผลที่ได้คือทำการพิมพ์ 78.5 ออกมาซึ่งเป็นค่าคะแนนเฉลี่ย
# มีการเรียกใช้ modules numpy แต่ทำการระบุว่าจะนำเข้ามาแค่ฟังก์ชันเดียวคือ ฟังก์ชัน average
# จากนั้นจึงสามารถเข้าถึงฟังก์ชัน average ได้เลยโดยไม่จำเป็นต้องอ้างถึงชื่อ modules อีก


คีย์เวิร์ด global
ใช้สำหรับประกาศว่า ตัวแปรภายในฟังก์ชันที่ต้องการ อนุญาติให้เข้าถึงได้จากภายนอกฟังก์ชันด้วย หากเราต้องการเพียงแค่อ่านค่าจากตัวแปรที่เป็น global จากภายในฟังก์ชัน เราไม่จำเป็นต้องประกาศ global ด้านหน้าตัวแปร แต่หากเราต้องการปรับเปลี่ยนค่าตัวแปรที่เป็น global  ภายในฟังก์ชันนั้นเราจำเป็นต้องประกาศ global หน้าตัวแปร ไม่เช่นนั้นแล้ว จะทำให้โปรแกรมสร้างตัวแปรที่เป็น local ขึ้นมาใช้แทน

globvar = 10
def read1():
    print(globvar)

def write1():
    global globvar
    globvar = 5

def write2():
    globvar = 15
    
read1()
write1()
read1()
write2()
read1()

# ผลก็คือโปรแกรมจะปรินท์ค่า
# 10
# 5
# 5
# เรียก read1() ครั้งแรก จะทำการปรินท์ค่าซึ่งประกาศไว้แล้ว คือ 10
# เรียก read1() ครั้งที่สอง เรียกใช้หลังการเรียกฟังก์ชัน write1() ซึ่งทำการแก้ไขค่า globar variable ชื่อ globvar ให้มีค่าเป็น 5 จึงทำการปรินท์ค่า 5 ออกมา
# เรียก read1() ครั้งที่สาม เรียกใช้หลังการเรียกฟังก์ชัน write2() ซึ่งทำการแก้ไขตัวแปรชื่อ globvar เช่นกันแต่เป็น local variable เพราะไม่มี keyword global นำหน้า เมื่อทำการปรินท์ค่าออกมา globvar จึงปรินท์ค่าเดิมคือ 5 ออกมา

คีย์เวิร์ด in
ใช้สำหรับทดสอบว่า ค่าใดๆ อยู่ในกลุ่มข้อมูลประเภท list, tuple, string, etc หรือไม่ โดยจะคืนค่าจริง หากค่านั้นๆ มีอยู่ในกลุ่มของข้อมูล

pass_students = ["Peter", "David", "Alex"]
is_peter_pass = "Peter" in pass_students
print ( is_peter_pass )
# ผลก็คือโปรแกรมจะปรินท์ค่า True ออกมา เนื่องจากรายชื่อ Peter อยู่ในรายชื่อของนักเรียนที่สอบผ่าน

การใช้ in อีกแบบคือใช้สำหรับ for ลูป ซึ่งใช้ในการเข้าถึงข้อมูลเป็นลำดับ

pass_students = ["Peter", "David", "Alex"]
for name in pass_students:
    print( name )
# ผลก็คือโปรแกรมจะปรินท์ค่า
# Peter
# David
# Alex


คีย์เวิร์ด is

ใช้สำหรับทดสอบความเหมือนกันของ 2 วัตถุ(object)ใดๆ ว่าคือตัวเดียวกันหรือไม่
โดยปกติแล้วตัวดำเนินการ == นั้นใช้สำหรับทดสอบว่าตัวแปรสองตัวเท่ากันหรือไม่ แต่เราจะใช้ is ก็ต่อเมื่อต้องการทดสอบว่าตัวแปรสองตัวอ้างอิงถึงวัตถุ( object )ตัวเดียวกันหรือไม่ ซึ่งก็คือชี้ไปที่หน่วยความจำตำแหน่งเดียวกันหรือไม่ ถ้าอ้างถึงตัวเดียวกันจะคืนค่าจริง
สำหรับ True, False และ None นั้น ไม่ว่าภายในโปรแกรมการจะอ้างถึงค่าดังกล่าวจากที่ใด ก็จะอ้างถึงวัตถุ(object)ตัวเดียวกัน ตัวอย่างเช่น ไม่ว่ากำหนดค่า None ให้ตัวแปรใดๆ  ทุกตัวจะชี้ไปที่หน่วยความจำตำแหน่งเดียวกัน

a = True is True
print( a )
# ปรินท์ค่า True ออกมา

b = False is False
print( b )
# ปรินท์ค่า True ออกมา

c = None is None
print( c )
# ปรินท์ค่า True ออกมา

d = None
e = None
f = d is e
print( f )
# ปรินท์ค่า True ออกมา

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

print([] == [])
# ปรินท์ค่า True ออกมา

print([] is [])
# ปรินท์ค่า False ออกมา

print({} == {})
# ปรินท์ค่า True ออกมา

print({} is {})
# ปรินท์ค่า False ออกมา

สำหรับ string และ tuple ซึ่งเป็นตัวแปรที่แก้ไขค่าไม่ได้หากได้มีการกำหนดค่าแล้ว(immutable) ดังนั้น string หรือ tuple ที่มีค่าเท่ากัน จะอ้างอิงถึงหน่วยความจำที่ตำแหน่งเดียวกัน

print ('' == '')
# ปรินท์ค่า True ออกมา

print ('' is '')
# ปรินท์ค่า True ออกมา

print (() == ())
# ปรินท์ค่า True ออกมา

print (() is ())
# ปรินท์ค่า True ออกมา


คีย์เวิร์ด lambda

ใช้สำหรับสร้างฟังก์ชันใดๆ โดยไม่ระบุชื่อของฟังก์ชัน โดยจะเป็น  ฟังก์ชันภายในบรรทัดเดียว(inline) และไม่ต้องระบุส่วนของการ return สำหรับฟังก์ชันไว้โดยฟังก์ชันนี้ จะประกอบด้วย expression คือส่วนของการคำนวณค่า และทำการคืนค่าที่คำนวณ ที่ตำแหน่งนั้นเลย โดยไม่ต้องทำการคืนค่าให้ฟังก์ชันด้วยคำสั่ง return และสามารถเขียนฟังก์ชันได้ภายในบรรทัดเดียว

calculate_score = lambda score: score*2
for i in [15, 20, 10, 30]:
    print( calculate_score(i) )
# โปรแกรมจะทำการเพิ่มคะแนนสอบที่ป้อนเข้ามาขึ้นเป็นสองเท่า โดยผลลัพท์ที่ได้จะปรินท์ค่า
# 30
# 40
# 20
# 60


คีย์เวิร์ด nonlocal

คล้ายกับคีย์เวิร์ด global โดยใช้สำหรับประกาศตัวแปรของฟังก์ชันภายในฟังก์ชัน(nested function) ที่ไม่ต้องการจำกัดค่าการเปลี่ยนแปลงให้อยู่ภายในขอบเขตนั้นเท่านั้น หมายความว่า ค่านี้การเปลี่ยนแปลงภายในนี้จะเข้าถึงได้จากภายนอกด้วย ถ้าเราต้องการที่จะทำการเปลี่ยนแปลงค่าของ ตัวแปรที่เป็น non-local  ภายใน nested function เราจะต้องประกาศด้วยคีย์เวิร์ด nonlocal กำกับ ไม่เช่นนั้น โปรแกรมจะทำการสร้าง local variable ขึ้นมาด้วยชื่อเดียวกันภายใน nested function ขึ้นมาแทน

def outer_function():
	a = 5
	def inner_function():
		nonlocal a
		a = 10
		print("Inner function: ",a)

	inner_function()
	print("Outer function: ",a)

outer_function()
#โปรแกรมจะทำการปรินท์ค่า 
# Inner function: 10
# Outer function: 10

จากตัวอย่างข้างต้น ตัวแปร a ซึ่งเป็น ตัวแปรที่เป็น global  ถูกประกาศอยู่ภายในฟังก์ชัน outer_function ดังนั้นหากเราต้องการที่จะ เปลี่ยนแปลงค่า a  ภายใน inner_function จึงจำเป็นต้องใช้คีย์เวิร์ด nonlocal กำกับตัวแปร a จากนั้นจึงทำการเปลี่ยนแปลงค่า a ซึ่งเมื่อค่า a ถูกเรียกใช้ภายนอกฟังก์ชัน inner_function ค่าดังกล่าวก็จะมีการเปลี่ยนแปลงด้วย

def outer_function():
    a = 5
    def inner_function():
        a = 10
        print("Inner function: ",a)
    inner_function()
    print("Outer function: ",a)

outer_function()
# โปรแกรมจะทำการปรินท์ค่า
# Inner function:  10
# Outer function:  5

ตัวอย่างนี้จะคล้ายตัวอย่างที่แล้ว แต่เราไม่ได้ทำการกำกับตัวแปร a ซึ่งอยู่ภายในฟังก์ชัน inner_function ให้เป็นตัวแปรที่เป็น nonlocal ดังนั้น ค่า a นั้นจะกลายเป็นเพียงตัวแปรที่เป็น local  โดยที่ความเปลี่ยนแปลงนั้นมีผลอยู่ภายใต้ฟังก์ชัน inner_function เท่านั้น ส่งผลให้ ค่า a สำหรับฟังก์ชัน outer_function นั้นไม่มีการเปลี่ยนแปลงใดๆ


คีย์เวิร์ด pass

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

def calculate_grade(scores):
    pass


คีย์เวิร์ด return

ใช้ภายในฟังก์ชันเพื่อจะหยุดการทำงานของฟังก์ชัน และคืนค่าออกไป ในฟังก์ชันนั้นถ้าเราไม่ได้ประกาศ return เอาไว้ โปรแกรมจะทำการคืนค่า None สำหรับฟังก์ชันนั้นให้อัตโนมัติ

def plus(a, b):
    result = a+b
    return result

def minus(a, b):
    result = a-b
    
print( plus(2, 3) )
print( minus(2, 3) )
# โปรแกรมจะปรินท์ค่า 
# 5
# None


คีย์เวิร์ด while

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

value = 100
while(value > 25):
    value = value-25
    print( value )
# โปรแกรมจะปรินท์ค่า
# 75
# 50
# 25


คีย์เวิร์ด with

ใช้สำหรับครอบกลุ่มของชุดคำสั่งซึ่งกำหนดโดย context manager
context manager คือคลาสที่ implements  __enter__ และ __exit__ เมทธอด เราจะใช้ with เพื่อความแน่ใจว่า __exit__  ถูกเรียกเมื่อสิ้นสุดการเรียกใช้ nested block นั้นแล้ว วิธีการนี้คล้ายกับการทำงานของ try…finally

with open('example.txt', 'w') as my_file:
    my_file.write('Hello world!')

คำสั่งด้านบนจะทำการเขียนค่า Hello world! ลงในไฟล์ example.txt โดยวัตถุ( object ) my_file นั้นจะมีฟังก์ชัน __enter__ และ __exit__ ประกาศอยู่แล้วด้วย object ดังกล่าวจึงทำงานด้วย context manager ในตัวเอง
โดยในตอนต้น ฟังก์ชัน __enter__ จะถูกเรียกใช้ จากนั้น คำสั่งภายใน with … จะถูกเรียกใช้ และท้ายสุด ฟังก์ชัน __exit__ จะถูกเรียกใช้ด้วยแม้กระทั่งในกรณีที่เกิดข้อผิดพลาดใดๆ ในระหว่างทำการเขียนไฟล์ก็ตาม


คีย์เวิร์ด yield

ใช้ภายในฟังก์ชันทำงานคล้ายกับคีย์เวิร์ด return แต่จะทำการคืนค่า generator แทน
โดย generator คือ การวนลูปเพื่อสร้างแต่ละค่าออกมาทีละตัวในแต่ละรอบ โดยแทนที่จะสร้าง list ใหญ่ๆ ที่ใช้หน่วยความจำมากในการเก็บข้อมูล เราจะใช้ generator นี้ในการสร้างค่าออกมาทีละค่า เพื่อเป็นการประหยัดพื้นที่ในการเก็บข้อมูล

g = (2**x for x in range(100))
print ( next(g) )
# คืนค่า 1
print ( next(g) )
# คืนค่า 2
print ( next(g) )
# คืนค่า 4
print ( next(g) )
# คืนค่า 8
print ( next(g) )
# คืนค่า 16

ตัวอย่างข้างบน เราทำการสร้าง generator g ซึ่งทำการยกกำลังสองของจำนวนที่ป้อนเข้าไป และใช้ ฟังก์ชัน next() เพื่อทำการเข้าถึงข้อมูลในรอบถัดไป

def generator():
    for i in range(6):
        yield i*i

g = generator()
for i in g:
    print(i)
# โปรแกรมทำการปรินท์ค่า
# 0
# 1
# 4
# 9
# 16
# 25

ตัวอย่างข้างต้น ฟังก์ชัน generator() คืนค่า ผลของการคูณกันของเลขที่ถูกป้อนเข้าไป เราระบุการคำนวณด้วยคีย์เวิร์ด yield เพื่อระบุให้การคำนวณนั้นทำงานในรูปแบบ generator จากนั้นเราเรียกใช้ค่าดังกล่าวด้วย for loop เพื่อทำการนำค่าออกมาในแต่ละรอบ โดยไม่มีการเก็บข้อมูลทั้งหมดไว้


Identifiers

Identifiers คือชื่อที่ถูกตั้งให้แก่ คลาส(class), ฟังก์ชัน(function), ตัวแปร(variables) ซึ่งช่วยชี้เฉพาะข้อมูลแต่ละตัว

การตั้งชื่อ identifier นั้นมีกฏดังนี้

  1. identifier เกิดจากการรวมตัวกันของ ตัวภาษาอังกฤษตัวพิมพ์เล็ก(a-z), ตัวภาษาอังกฤษตัวพิมพ์ใหญ่(A-Z), ตัวเลข(0-9) หรือ underscore(_) ตัวอย่างของการตั้งชื่อเช่น tutorial_101, myFirstPython, python_tutorial
  2. identifier ไม่สามารถขึ้นด้วยตัวเลข การประกาศที่ไม่ถูกต้องเช่น 4lecture แต่ถ้า lecture4 นั้นสามารถประกาศได้
  3. คีย์เวิร์ดทั้ง 33 ตัวในข้างต้นไม่สามารถนำมาใช้เป็น identifier ได้
  4. อักขระพิเศษเช่น !, @, #, $, % ไม่สามารถใช้กับ identifier ได้
  5. เราสามารถตั้งชื่อของ identifer ด้วยความยาวเท่าไรก็ได้

ข้อควรพิจารณา

  • เนื่องจาก python นั้นตัวพิมพ์เล็กและพิมพ์ใหญ่นั้นถือว่าแตกต่างกันดังนั้น lecture กับ Lecture นั้นแตกต่างกัน จึงควรตั้งชื่อ identifiers ให้สมเหตุสมผลเสมอ
  • หากเราต้องการเขียนว่า t = 10 เพื่อบอกค่าจำนวนรวมทั้งหมดของสิ่งใดๆ เราควรเขียนว่า total = 10 แทน เพื่อให้ดูมีความหมายและเวลากลับมาอ่านโค้ดอีกครั้งหนึ่งจะทำให้เข้าใจง่ายขึ้น
  • เพื่อจะทำให้การตั้งชื่อมีความหมายในการตั้งชื่อตัวหนึ่งอาจจะประกอบด้วยหลายคำ ดังนั้นเราสามารถแยกคำแต่ละคำด้วย _ เช่น total_students หรือแทนที่จะคั่นด้วย เราอาจจะใช้การตั้งชื่อที่ประกอบด้วยหลายคำในรูปแบบ camel-case ซึ่งก็คือให้ตัวอักษรที่ขึ้นต้นคำแต่ละคำนั้นเป็นตัวพิมพ์ใหญ่ทั้งหมดยกเว้นตัวอักษรตัวแรก เช่น totalStudents