Python – คีย์เวิร์ด global
เราใช้คีย์เวิร์ด global เพื่ออนุญาติให้สามารถทำการเปลี่ยนแปลงค่าตัวแปรที่อยู่ด้านนอกข้อมูลใน scope ปัจจุบัน จะถูกใช้สำหรับสร้าง global variables และเปลี่ยนค่าตัวแปรใน local context
กฏการใช้คีย์เวิร์ด global
- เมื่อสร้างตัวแปรขึ้นภายในฟังก์ชัน ตัวแปรนั้นจะเป็น local variable โดยอัตโนมัติ
- เมื่อสร้างตัวแปรขี้นนอกฟังก์ชัน ตัวแปรนั้นจะเป็น global variable โดยอัตโนมัติ โดยไม่ต้องใช้คีย์เวิร์ด global
- จำเป็นต้องใช้คีย์เวิร์ด global เมื่อต้องการทั้งอ่าน/เขียน ตัวแปร global ภายในฟังก์ชัน
- หากใช้คีย์เวิร์ด global ภายนอกฟังก์ชัน จะไม่มีผลใดๆ เพิ่มเติม
การใช้คีย์เวิร์ด global
ตัวอย่างการใช้งาน การเรียกดูของมูล global variable จากภายในฟังก์ชัน
# สร้างฟังก์ชันสำหรับคำนวณหาระยะทางที่วัตถุเคลื่อนที่ไป โดยทราบความเร็วคงที่ของวัตถุ และระยะเวลาที่ใช้ในการเดินทาง(ในกรณีที่วัตถุดังกล่าวไม่เคลื่อนที่โดยมีความเร่ง) อ้างอิงจากสมการ s = v * t
def calculate_distance(velocity):
distance = velocity * time
return distance
time = 8 # เวลา ซึ่งมีหน่วยเป็น s
v = 12 # ความเร็ว ซึ่งมีหน่วยเป็น m/s
s = calculate_distance(v, t)
print("วัตถุเคลื่อนที่ด้วยความเร็ว {} เมตร/วินาที เป็นเวลา {} วินาที จะสามารถเคลื่อนที่ได้เป็นระยะทาง: {} เมตร".format(v, time, s))
# โปรแกรมทำการปรินต์ค่า
# วัตถุเคลื่อนที่ด้วยความเร็ว 12 เมตร/วินาที เป็นเวลา 8 วินาที จะสามารถเคลื่อนที่ได้เป็นระยะทาง: 96 เมตร
v = 15 # ความเร็ว ซึ่งมีหน่วยเป็น m/s
s = calculate_distance(v, t)
print("วัตถุเคลื่อนที่ด้วยความเร็ว 15 เมตร/วินาที เป็นเวลา 8 วินาที จะสามารถเคลื่อนที่ได้เป็นระยะทาง: 120 เมตร".format(v, time, s))
# โปรแกรมทำการปรินต์ค่า
# วัตถุเคลื่อนที่ด้วยความเร็ว 15 เมตร/วินาที เป็นเวลา 8 วินาที จะสามารถเคลื่อนที่ได้เป็นระยะทาง: 120 เมตร
จากตัวอย่าง จะสร้างฟังก์ชันสำหรับการคำนวณระยะทางที่วัตถุเคลื่อนที่ได้ เมื่อเราทราบข้อมูลความเร็วของการเคลื่อนที่ของวัตถุ และเวลาที่ใช้ในการเคลื่อนที่(โดยการเคลื่อนที่ของวัตถุนั้นไม่มีความเร่ง) จากสมการ
s = v x t
s:ระยะทาง(เมตร)
v:ความเร็ว(เมตร/วินาที)
t:เวลา(วินาที)
โดยในตัวอย่างเราจะสร้างตัวแปร(time) ไว้ด้านนอกฟังก์ชันซึ่งเป็น global variable โดยจะกำหนดเวลาที่ใช้ในการเดินทางเอาไว้ ในส่วนของฟังก์ชันสำหรับคำนวณระยะทางจะรับเพียงข้อมูลของความเร็วของการเคลื่อนที่ของวัตถุ(v)เข้าไป ซึ่งภายในฟังก์ชันนั้นจะใช้ทั้งข้อมูลของความเร็วและเวลา เพื่อจะทำการคำนวณระยะทางของการเดินทาง โดยจากตัวอย่างจะเห็นว่า เราสามารถเรียกดูข้อมูลจากตัวแปร time ที่เป็น global variable ได้จากภายในฟังก์ชัน
ตัวอย่างการใช้งาน การแก้ไขข้อมูลของ global variable จากภายในฟังก์ชัน
# กำหนดตัวแปร สำหรับเก็บข้อมูลเวลาทั้งหมดที่จำเป็นต้องใช้ในการผลิตสินค้า
total_time = 0
# ฟังก์ชันสำหรับระบุเวลาที่ใช้ในการผลิตสินค้าตามรายละเอียดที่กำหนด โดยทราบความเร็วที่ใช้ในการผลิตสินค้าประเภทนั้นและจำนวนชิ้นที่ต้องผลิต
def calculate_production_time(speed, amount):
production_time = (1/speed) * amount
total_time += production_time
return production_time
# กำหนดตัวแปรสำหรับระบุความเร็วของการผลิตสินค้าแต่ละชนิด
product1_speed = 0.5
product2_speed = 4
# กำหนดจำนวนสินค้าที่ต้องการสำหรับการผลิตสินค้าแต่ละชนิด
product1_amount = 10
product2_amount = 20
# ทำการคำนวณเวลาที่ใช้ในการผลิตสินค้าชนิดที่ 1
product1_production_time = calculate_production_time(product1_speed, product1_amount)
# ทำการคำนวณเวลาที่ใช้ในการผลิตสินค้าชนิดที่ 2
product2_production_time = calculate_production_time(product2_speed, product2_amount)
# เวลารวมทั้งหมดที่ใช้ในการผลิตสินค้าทั้ง 2 ชนิด
print("เวลาทั้งหมดที่ใช้ในการผลิตสินค้าทั้ง 2 ชนิด: {} วินาที".format(total_time) )
# โปรแกรมจะเกิดข้อผิดพลาด UnboundLocalError: local variable 'total_time' referenced before assignment
จากตัวอย่างข้างต้น เราทำการสร้างฟังก์ชันสำหรับทำการคำนวณเวลาที่จะใช้ในการผลิตสินค้าแต่ละชนิด โดยทราบความเร็วของการผลิตสินค้าชนิดนั้นต่อชิ้นและจำนวนสินค้าที่ต้องผลิต
จำนวนสินค้า = ความเร็วในการผลิตสินค้า x เวลาที่ใช้ในการผลิตสินค้า
เวลาที่ใช้ในการผลิตสินค้า = จำนวนสินค้า * (1/ความเร็วในการผลิตสินค้า)
ในตัวอย่างโปรแกรมจะเกิดข้อผิดพลาดขึ้น เนื่องจากในฟังก์ชันมีการเรียกใช้และทำการแก้ไขตัวแปร total_time ซึ่งเป็น global variable จากภายในฟังก์ชัน เมื่อมีการแก้ไขข้อมูลจึงทำให้ต้องใช้ตัวแปรที่เป็น local variable เท่านั้นจึงจะทำการแก้ไขข้อมูลได้ จึงเกิดข้อผิดพลาดดังกล่าว
ตัวอย่างการใช้งาน การแก้ไขข้อมูลของตัวแปร global จากภายในฟังก์ชันด้วยการกำกับด้วยคีย์เวิร์ด “global”
# กำหนดตัวแปร สำหรับเก็บข้อมูลเวลาทั้งหมดที่จำเป็นต้องใช้ในการผลิตสินค้า
total_time = 0
# ฟังก์ชันสำหรับระบุเวลาที่ใช้ในการผลิตสินค้าตามรายละเอียดที่กำหนด โดยทราบความเร็วที่ใช้ในการผลิตสินค้าประเภทนั้นและจำนวนชิ้นที่ต้องผลิต
def calculate_production_time(speed, amount):
# ใช้คีย์เวิร์ด global เพื่อกำกับตัวแปร total_time เพื่อระบุว่าตัวแปรดังกล่าวนั้นเป็นตัวแปรเดียวกันกับที่ใช้งานใน global scope เมื่อมีการเปลี่ยนแปลงข้อมูลในฟังก์ชัน ก็จะมีผลให้ตัวแปรใน global scope เปลี่ยนแปลงตามด้วย
global total_time
# ทำการคำนวณเวลาที่ใช้ในการผลิดสินค้าตามจำนวนที่ระบุ
production_time = (1/speed) * amount
# ทำการแก้ไขข้อมูลเวลารวม โดยเพิ่มเวลาทั้งหมดที่ใช้ในการสินค้าชนิดดังกล่าว
total_time += production_time
return production_time
# กำหนดตัวแปรสำหรับระบุความเร็วของการผลิตสินค้าแต่ละชนิด
product1_speed = 0.5
product2_speed = 4
# กำหนดจำนวนสินค้าที่ต้องการสำหรับการผลิตสินค้าแต่ละชนิด
product1_amount = 10
product2_amount = 20
# ทำการคำนวณเวลาที่ใช้ในการผลิตสินค้าชนิดที่ 1
product1_production_time = calculate_production_time(product1_speed, product1_amount)
# ทำการคำนวณเวลาที่ใช้ในการผลิตสินค้าชนิดที่ 2
product2_production_time = calculate_production_time(product2_speed, product2_amount)
# เวลารวมทั้งหมดที่ใช้ในการผลิตสินค้าทั้ง 2 ชนิด
print("เวลาทั้งหมดที่ใช้ในการผลิตสินค้าทั้ง 2 ชนิด: {} วินาที".format(total_time) )
print("เวลาที่ใช้ในการผลิตสินค้าชนิดที่ 1: {} วินาที".format(product1_production_time) )
print("เวลาที่ใช้ในการผลิตสินค้าชนิดที่ 2: {} วินาที".format(product2_production_time) )
# โปรแกรมทำการปรินต์ค่า
# เวลาทั้งหมดที่ใช้ในการผลิตสินค้าทั้ง 2 ชนิด: 25.0 วินาที
# เวลาที่ใช้ในการผลิตสินค้าชนิดที่ 1: 20.0 วินาที
# เวลาที่ใช้ในการผลิตสินค้าชนิดที่ 2: 5.0 วินาที
จากตัวอย่างข้างต้น เราทำการสร้างฟังก์ชันสำหรับทำการคำนวณเวลาที่จะใช้ในการผลิตสินค้าแต่ละชนิด โดยทราบความเร็วของการผลิตสินค้าชนิดนั้นต่อชิ้นและจำนวนสินค้าที่ต้องผลิต แบบเดียวกับในตัวอย่างที่แล้ว เนื่องจากในตัวอย่างที่แล้ว เรามีการแก้ไขตัวแปรที่เป็น global variable จากภายในฟังก์ชัน(local scope) จึงทำให้เกิดข้อผิดพลาด ในตัวอย่างนี้จึงมีการนำใช้คีย์เวิร์ด global เข้าร่วมด้วยเพื่อทำการกำกับให้ตัวแปร total_time ที่ใช้ในฟังก์ชัน โดยระบุว่าต้ให้ตัวแปรดังกล่าวคือตัวแปรที่เป็น global variable แต่สามารถทำงานในฟังก์ชันได้ เมื่อทำการแก้ไขข้อมูลในตัวแปรดังกล่าวแล้ว เมื่ออกจากฟังก์ชันค่าข้อมูลของตัวแปรนั้นใน global scope ก็จะเป็นค่าเดียวกับข้อมูลดังกล่าวด้วย
การใช้ตัวแปรแบบ global ระหว่าง module
วิธีการใช้ตัวแปรแบบ global ร่วมกันระหว่างแต่ละ module นั้นสามารถใช้ได้ด้วยการสร้างโมดูลหนึ่งขึ้นมาเพื่อใช้เก็บตัวแปรที่ต้องการ เมื่อโมดูลนี้ถูกนำไปใช้ในโมดูลอื่นๆ ก็จะสามารถเรียกดูข้อมูลและทำการแก้ไขข้อมูลได้
ตัวอย่างการใช้งาน
1. สร้างไฟล์ config.py
# กำหนดตัวแปรเพื่อเก็บข้อมูลความเร็วในการผลิตสินค้าชนิดที่ 1 โดยให้ค่าเริ่มต้นเป็น 1 ชิ้น/วินาที product1_speed = 1 # กำหนดตัวแปรเพื่อเก็บข้อมูลความเร็วในการผลิตสินค้าชนิดที่ 2 โดยให้ค่าเริ่มต้นเป็น 1 ชิ้น/วินาที product2_speed = 1
2. สร้างไฟล์ edit_product.py สำหรับเปลี่ยนแปลงข้อมูลความเร็วในการผลิตสินค้าแต่ละชนิด
import config
def calculate_speed(amount, time):
speed = float(amount)/ float(time)
return speed
def edit_product1(amount, time):
config.product1_speed = calculate_speed(amount, time)
def edit_product2(amount, time):
config.product2_speed = calculate_speed(amount, time)
# เรียกใช้ฟังก์ชันทำการตั้งค่าข้อมูลความเร็วในการผลิตสินค้าชนิดที่ 1
edit_product1(1, 2)
# เรียกใช้ฟังก์ชันทำการตั้งค่าข้อมูลความเร็วในการผลิตสินค้าชนิดที่ 2
edit_product2(16, 4)
print("ความเร็วในการผลิตสินค้าชนิดที่ 1: {} ชิ้น/วินาที".format(config.product1_speed))
print("ความเร็วในการผลิตสินค้าชนิดที่ 2: {} ชิ้น/วินาที".format(config.product2_speed))
# โปรแกรมทำการปรินต์ค่า
# ความเร็วในการผลิตสินค้าชนิดที่ 1: 0.5 ชิ้น/วินาที
# ความเร็วในการผลิตสินค้าชนิดที่ 2: 4 ชิ้น/วินาที
3. สร้างไฟล์ summary_product.py เพื่อจะสรุปข้อมูลเวลาที่ใช้ในการผลิตสินค้าตามชนิดและปริมาณที่ระบุ
import config
import edit_product
# กำหนดตัวแปร สำหรับเก็บข้อมูลเวลาทั้งหมดที่จำเป็นต้องใช้ในการผลิตสินค้า
total_time = 0
# ฟังก์ชันสำหรับระบุเวลาที่ใช้ในการผลิตสินค้าตามรายละเอียดที่กำหนด โดยทราบความเร็วที่ใช้ในการผลิตสินค้าประเภทนั้นและจำนวนชิ้นที่ต้องผลิต
def calculate_production_time(speed, amount):
global total_time
production_time = (1/ float(speed)) * float(amount)
total_time += production_time
return production_time
# กำหนดจำนวนสินค้าที่ต้องการสำหรับการผลิตจริงของสินค้าแต่ละชนิด
product1_amount = 10
# ทำการคำนวณเวลาที่ใช้ในการผลิตสินค้าชนิดที่ 1
product1_production_time = calculate_production_time(config.product1_speed, product1_amount)
print("เวลาที่ใช้ในการผลิตสินค้าชนิดที่ 1: {} วินาที".format(product1_production_time) )
# โปรแกรมทำการปรินต์ค่า
# ความเร็วในการผลิตสินค้าชนิดที่ 1: 0.5 ชิ้น/วินาที
# ความเร็วในการผลิตสินค้าชนิดที่ 2: 4 ชิ้น/วินาที
# เวลาที่ใช้ในการผลิตสินค้าชนิดที่ 1: 20 วินาที
จากตัวอย่างในไฟล์ config.py เราทำการสร้างตัวแปรที่เป็น global variable เอาไว้เก็บข้อมูลที่ใช้ร่วมกันระหว่างโมดูลซึ่งทำการเก็บข้อมูลความเร็วที่ใช้ในการผลิตสินค้าแต่ละชนิด(product_speed1, product_speed2) โดยเริ่มแรกจะกำหนดให้มีค่าเป็น 1 (1 ชิ้น/วินาที)
จากนั้นในไฟล์ edit_product.py เราทำการ import โมดูล config.py แล้วมีฟังก์ชันสำหรับทำการเปลี่ยนแปลงค่าตัวแปร product1_speed, production2_speed ซึ่งเป็น global variable ได้มีการทำการแก้เรียกใช้ฟังก์ชันเพื่อทำการแก้ไขข้อมูลความเร็วในการผลิตสินค้าแต่ละชนิด โดยตั้งค่าให้มีความเร็วในการผลิตสินค้าแต่ละชนิดเป็น 0.5 และ 4 ตามลำดับ โดยความเร็วในการผลิตสินค้าแต่ละชนิดนั้นทำการคำนวณมาจากจำนวนชิ้นที่ผลิตได้กับเวลาที่ใช้ในการผลิตจากข้อมูลเดิมที่มีอยู่
ในไฟล์ summary_product.py เราทำการ import โมดูล config.py, edit_product.py แล้วมีการสร้างฟังก์ชันเพื่อทำการเรียกดูค่าตัวแปร product_speed1, product_speed2 มาใช้เพื่อทำการคิดคำนวณเวลาที่ใช้ในการผลิตสินค้าแต่ละชนิดตามจำนวนสินค้าที่ระบุ จากนั้นจึงเรียกใช้ฟังก์ชันเพื่อทำการคำนวณเวลาที่ใช้ในการผลิตจริงของสินค้าแต่ละชนิด จากข้อมูลความเร็วในการผลิตสินค้าและจำนวนสินค้าที่ต้องการผลิต
จะเห็นว่าเราสามารถใช้งานตัวแปรร่วมกันในระหว่างโมดูลได้ โดยสามารถจะเรียกดูข้อมูลหรือทำการแก้ไขข้อมูลได้ทันที
ตัวอย่างการใช้งาน คีย์เวิร์ด global ใน nested ฟังก์ชัน
# กำหนดตัวแปรสำหรับเก็บข้อมูลอุณภูมิสูงสุดจากข้อมูลที่ถูกป้อนเข้ามาทั้งหมด
max_temperature = 0
# กำหนดตัวแปรสำหรับเก็บข้อมูลอุณภูมิต่ำสุดจากข้อมูลที่ถูกป้อนเข้ามาทั้งหมด
min_temperature = 1000
# กำหนดตัวแปรสำหรับเก็บข้อมูลอุณภูมิที่เก็บข้อมูลได้ทั้งหมดในช่วงเวลาที่กำหนด
temperatures_in_day = []
# ฟังก์ชันสำหรับทำการเพิ่มข้อมูลอุณหภูมิเมื่อได้รับข้อมูลใหม่ในแต่ละชั่วโมง
def add_temperature_info(temperature):
temperatures_in_day.append(temperature)
# ฟังก์ชันสำหรับทำการเปรียบเทียบอุณภูมิปัจจุบันกับอุณหภูมิที่ป้อนเข้ามาใหม่ เพื่อทำการเปลี่ยนแปลงข้อมูลอุณภูมิสูงสุด/ต่ำสุด ในการอัพเดทของมูลในแต่ละครั้ง
def compare_temperature(current, min_temp, max_temp):
# ใช้คีย์เวิร์ด global เพื่อสามารถที่จะทำให้ตัวแปรดังกล่าวใช้ตัวแปรเดียวกันกับตัวแปรที่ถูกประกาศใน global scope เมื่อมีการแก้ไขข้อมูลใน nested function ตัวแปรใน global scope จะถูกทำการเปลี่ยนแปลงด้วยทันที
global max_temperature
global min_temperature
# เปรียบเทียบอุณหภูมิปัจจุบันกับสถิติของอุณภูมิสูงสุดที่มีอยู่แล้ว เพื่อทำการเปลี่ยนแปลงค่าใหม่ให้เหมาะสมกับข้อมูลทั้งหมด
if(current > max_temperature):
max_temperature = current
# เปรียบเทียบอุณหภูมิปัจจุบันกับสถิติของอุณภูมิต่ำสุดที่มีอยู่แล้ว เพื่อทำการเปลี่ยนแปลงค่าใหม่ให้เหมาะสมกับข้อมูลทั้งหมด
if(current < min_temperature):
min_temperature = current
# เรียกใช้ฟังก์ชันสำหรับการทำการเปรียบเทียบอุณหภูมิในฟังก์ชัน(local scope)
compare_temperature(temperature, min_temperature, max_temperature)
# add temperature info at 7:00 am
add_temperature_info(27)
# add temperature info at 8:00 am
add_temperature_info(27.5)
# add temperature info at 9:00 am
add_temperature_info(29)
# add temperature info at 10:00 am
add_temperature_info(31)
# add temperature info at 11:00 am
add_temperature_info(30)
# add temperature info at 12:00 am
add_temperature_info(32)
# add temperature info at 1:00 pm
add_temperature_info(34)
print("ข้อมูลของอุณหภูมิระหว่าง 7:00-13:00 ของวันนี้ {}".format(temperatures_in_day))
print("อุณหภูมิสูงสุด: {}".format(max_temperature))
print("อุณหภูมิต่ำสุด: {}".format(min_temperature))
# โปรแกรมทำการปรินต์ค่า
# ข้อมูลของอุณหภูมิระหว่าง 7:00-13:00 ของวันนี้ [27, 27.5, 29, 31, 30, 32, 34]
# อุณหภูมิสูงสุด: 34
# อุณหภูมิต่ำสุด: 27
จากตัวอย่างจะมีการประกาศตัวแปร min_temperature, max_temperature และ temperatures_in_day สำหรับเก็บข้อมูลอุณภูมิต่ำสุด, อุณหภูมิสูงสุด และอุณภูมิที่เก็บได้ในช่วงเวลาที่กำหนด ไว้ใน global scope แ
มีการสร้างฟังก์ชัน add_temperature_info ไว้สำหรับอัพเดทข้อมูลอุณภูมิใหม่ที่ถูกเพิ่มขึ้นมาในแต่ละชั่วโมง โดยในฟังก์ชันดังกล่าวจะมีการสร้าง nested function ชื่อ compare_temperature ไว้สำหรับเปรียบเทียบข้อมูลอุณภูมิปัจจุบันกับสถิติข้อมูลอุณภูมิต่ำสุด(min_temperature)และอุณภูมิสูงสุด(max_temperature) หากต้องมีการอัพเดทข้อมูลอุณภูมิต่ำสุดหรือสูงสุดใหม่ก็จะต้องทำการเปลี่ยนแปลงข้อมูลดังกล่าว ซึ่งโดยปกติแล้วตัวแปรที่ถูกประกาศใน nested function จะไม่จัดอยู่ในกลุ่มของตัวแปรทั้ง global/local variable ดังนั้นจึงต้องมีการใช้คีย์เวิร์ด global เข้ามากำกับตัวแปรเพื่อที่จะทำให้ข้อมูลของตัวแปรที่ถูกเปลี่ยนแปลงภายใน nested function มีผลให้เปลี่ยนแปลงข้อมูลตัวแปรใน global scope ด้วย
ซึ่งการกำกับด้วยคีย์เวิร์ด global ในลักษณะนี้จะมีผลให้เปลี่ยนแปลงค่าของข้อมูลได้เฉพาะใน nested function และ global scope เท่านั้น ส่วนในฟังก์ชัน add_temperature_info จะไม่มีผลให้สามารถเปลี่ยนแปลงข้อมูลตัวแปรนี้ได้
