ก่อนที่จะไปเรียนรู้ถึงฟังก์ชันคำสั่งต่อๆไปของมายา มีพื้นฐานบางอย่างของภาษาไพธอนที่อาจจำเป็นต้องทำความเข้าใจให้ดีสักหน่อย นั่นคือเรื่องของลิสต์
ในนี้จะอธิบายแค่คร่าวๆอาจไม่ละเอียดสักเท่าไหร่ แต่จะเน้นการนำมาใช้ในมายามากกว่า
ลิสต์ (list) คือชนิดหนึ่งของข้อมูลในภาษาไพธอน ทำหน้าที่เก็บข้อมูลหลายๆตัวไว้พร้อมๆกัน โดยข้อมูลแต่ละตัวภายในลิสต์มีการจัดเรียงเป็นลำดับ
หากพูดง่ายๆแล้วก็คือ แทนที่จะสร้างตัวแปรขึ้นทีละตัว ก็สร้างตัวแปรขึ้นหลายตัวพร้อมกันเป็นชุด โดยแต่ละตัวจัดเก็บอยู่รวมกันเป็นลำดับ
การสร้างลิสต์สามารถทำได้โดยพิมพ์สมาชิกของลิสต์เรียงไปทีละตัวแล้วคั่นด้วย , แล้วล้อมสมาชิกทั้งหมดด้วยเครื่องหมายวงเล็บเหลี่ยม [ ]
ตัวอย่างการสร้างลิสต
chamnuanchapho = [2,3,5,7,11,13,17,19]
phonkanrian = [4.00,3.82,3.61,1.99,2.33,2.42,2.66,2.60]
satliang = ['maeo','ma','kratai','tao','mangkon']
จากตัวอย่างนี้ อันแรกเป็นลิสต์ที่เก็บข้อมูลชนิด
จำนวนเต็ม (int) อันที่สองเป็น
จำนวนจริง (float) อันสุดท้ายเป็น
สายอักขระ (string) การอ้างอิงถึงข้อมูลภายในลิสต์ทำได้โดยพิมพ์ชื่อลิสต์ตามด้วยวงเล็บเหลี่ยม [] โดยที่ภายในระบุเลขลำดับของข้อมูล โดยลำดับของข้อมูลนั้นตัวแรกจะเรียกว่าเป็นลำดับ 0 ตัวที่สองเป็น 1 และถัดมาก็เป็น 2 ไปเรื่อยๆ
เช่น satliang[0] จะได้ค่าเป็น maeo
satliang[4] จะได้ค่าเป็น mangkon
ตัวแปรที่อยู่ภายในลิสต์อาจไม่จำเป็นต้องเป็นชนิดเดียวกันหมดก็ได้
สมาชิกของลิสต์สามารถเพิ่มได้ด้วยคำสั่ง .append() ตามหลังลิสต์ โดยใส่ค่าสมาชิกใหม่ลงในวงเล็บ เช่น
satliang = ['maeo','ma','kratai','tao','mangkon']
satliang.append('pikachu')
ลิสต์ satliang ก็จะมีสมาชิกเพิ่มเป็น ๖ ตัว โดยเพิ่ม pikachu เข้ามา
หรืออาจใช้การบวก โดยพิมพ์ +=
satliang = ['maeo','ma','kratai','tao','mangkon']
satliang += ['pikachu']
ก็จะได้ผลเช่นเดียวกัน เป็นการเพิ่มสมาชิกลงในลิสต์
ถ้าอยากเพิ่มทีละหลายตัวก็ใส่เป็นลิสต์ของสิ่งที่ต้องการเพิ่มได้
satliang = ['maeo','ma','kratai','tao','mangkon']
satliang += ['pikachu','fushigidane','hitokage','zenigame']
หากต้องการลบสมาชิกในลิสต์ออกก็ทำได้ด้วยคำสั่ง .remove() โดยระบุสมาชิกที่ต้องการลบลงในวงเล็บ เช่น
satliang.remove('mangkon')
แล้ว mangkon ก็จะถูกลบออกจากลิสต์
หรืออาจใช้คำสั่ง .pop() โดยระบุลำดับของสมาชิกที่ต้องการลบทิ้ง เช่น
satliang.pop(1)
แล้ว ma ก็จะถูกลบออกจากลิสต์
การหาความยาวของลิสต์สามารถทำได้โดยฟังก์ชัน len() เช่น
len([2,3,5,7,11,13,17,19])
จะได้ค่าเป็น 8
pokemon_khongchan = ['fushigibana','pikachu','nyorobon','gyarados','ptera','kabigon']
len(pokemon_khongchan)
จะได้ค่าเป็น 6
เราสามารถใช้ลิสต์เพื่อเก็บชื่อของวัตถุที่ต้องการเลือก แล้วใช้ฟังก์ชันต่างๆที่ต้องระบุชื่อวัตถุ เช่น move() หรือ select()
ลิสต์มักถูกใช้ร่วมกับการทำซ้ำ เพื่อที่จะเข้าถึงค่าต่างๆภายในลิสต์เรียงลำดับไปทีละตัว เช่น
c = [2,3,5,7,11,13,17,19]
n=0
while(n<len(c)):
print(c[n])
n+=1
จะเป็นการสั่งให้พิมพ์ค่าจำนวนเฉพาะออกมาทีละตัว
สำหรับการประยุกต์ใช้กับมายานั้น เช่น ถ้าต้องการสร้างพีรามิดที่ประกอบด้วยทรงสี่เหลียมที่มีฐานกว้างเท่ากับจำนวนเฉพาะ
c = [2,3,5,7,11,13,17,19]
i=0
while(i<len(c)):
mc.polyCube(w=c[i],h=1,d=c[i])
mc.move(0,10-i,0)
i+=1
แบบนี้เป็นต้น
หรือใช้ลิสต์เพื่อตั้งชื่อให้กับวัตถุไม่ซ้ำกัน เช่น เราต้องการสร้างดรากอนบอล ๗ ลูก แต่ละลูกก็มีชื่อต่างกันออกไป
dragonball = ['yixingqiu','erxingqiu','sanxingqiu','sixingqiu','wuxingqiu','liuxingqiu','qixingqiu']
i = 0
while(i<len(dragonball)):
mc.polySphere(r=1,n=dragonball[i])
mc.move(i*2,0,0)
i+=1
เราก็จะได้ดรากอนบอล ๗ ลูก ซึ่งมีชื่อตามที่ระบุไว้ในลิสต์
ทั้งนี้โดยทั่วไปแล้วการใช้ลิสต์ในลักษณะนี้แทนที่จะใช้การวนซ้ำด้วยคำสั่ง while การใช้คำสั่ง for จะเหมาะสมกว่า เพราะจะเขียนง่ายขึ้นมาก
อย่างไรก็ตามตอนนี้ยังไม่ได้อธิบายถึงวิธีการใช้คำสั่ง for ในการวนซ้ำ แต่จะพูดถึงในบทที่ ๑๑
ในมายาสามารถใช้ลิสต์กับอาร์กิวเมนต์ของฟังก์ชันบางตัว เช่น select() เวลาที่เลือกวัตถุนอกจากจะใส่ชือของวัตถุไปทีละอันก็สามารถใส่ลิสต์ของวัตถุ ลงไปได้ เช่น
mc.select(dragonball)
แบบนี้แล้วดรากอนบอลทุกลูกก็จะถูกเลือก
ซึ่งการเขียนแบบนี้จะมีค่าเท่ากับการเขียน
mc.select(['yixingqiu','erxingqiu','sanxingqiu','sixingqiu','wuxingqiu','liuxingqiu','qixingqiu'])
และเท่ากับ
mc.select('yixingqiu','erxingqiu','sanxingqiu','sixingqiu','wuxingqiu','liuxingqiu','qixingqiu')
สองอันหลังนี้จะเห็นว่าต่างกันตรงที่มีวงเล็บเหลี่ยม [] ล้อมหรือไม่เท่านั้นเอง ซึ่งผลที่ได้ก็เหมือนกัน แต่ว่าต่างกันตรงที่อันแรกเป็นการใส่ตัวแปรชนิดลิสต์ของสายอักขระลงไปแค่อัน เดียว ส่วนอันหลังเป็นการใส่ตัวแปรสายอักขระหลายตัว
การใส่ตัวแปรชนิดลิสต์นั้นสะดวกในกรณีที่มีตัวแปรลิสต์ที่เก็บชื่อของวัตถุอยู่แล้ว ส่วนการพิมพ์แบบหลังนั้นจะมีค่าเท่ากับการพิมพ์
mc.select(dragonball[0],dragonball[1],dragonball[2],dragonball[3],dragonball[4],dragonball[5],dragonball[6])
ซึ่งอาจดูแล้วไม่สะดวกเท่า ดังนั้นการที่สามารถใช้ลิสต์เพื่อเป็นอาร์กิวเมนต์ในนี้ได้จึงเป็นอะไรที่สะดวก
ฟังก์ชัน move() ก็สามารถใช้ลิสต์แทนชื่อของวัตถุได้ เช่น
mc.move(10,0,0,dragonball,r=1)
แบบนี้แล้วดรากอนบอลทั้ง ๗ ลูกก็จะถูกย้ายไปพร้อมกัน
อย่างไรก็ตามบางอาร์กิวเมนต์ก็ไม่สามารถใช้ลิสต์เพื่อแทนตัวแปรหลายตัวได้ เช่นอาร์กิวเมนต์พิกัดทั้งสามของฟังก์ชัน move() ไม่สามารถเขียนเป็น
xyz=[10,0,0]
mc.move(xyz,dragonball,r=1)
เพราะแบบนั้นจะมีค่าเท่ากับเขียน
mc.move([10,0,0],dragonball,r=1)
ซึ่งเป็นการใส่ตัวแปรชนิดลิสต์ลงไปตัวเดียวแทนที่จะเป็นตัวแปรชนิดจำนวนจริง ๓ ตัว ในกรณีนี้ไม่สามารถใช้แทนกันได้ ดังนั้นยังไงก็ต้องเขียน
mc.move(xyz[0],xyz[1],xyz[2],dragonball,r=1)
จึงจะมีค่าเท่ากับ
mc.move(10,0,0,dragonball,r=1)
ซึ่งแบบนี้โปรแกรมจึงจะทำงานอย่างถูกต้อง
อย่างไรก็ตาม ในทางตรงข้าม บางแฟล็กในบางฟังก์ชันก็จำเป็นต้องการใช้ตัวแปรที่เป็นลิสต์เท่านั้น เช่นแฟล็ก ax(axis) ของฟังก์ชัน polyCube() และฟังก์ชันรูปทรงอื่นๆ ซึ่งจะพูดถึงในบทถัดไป
การสร้างลิสต์ในภาษาไพธอนนั้นนอกจากจะสร้าง ด้วยการประกาศค่าโดยตรงแล้ว ก็ยังสามารถสร้างขึ้นจากฟังก์ชันบางชนิดได้ เช่นฟังก์ชัน range() ซึ่งจะสร้างลิสต์ที่มีสมาชิกเป็นตัวเลขจำนวนเต็มเรียงกัน
ถ้าใส่ตัวเลขลงไปในวงเล็บตัวเดียวก็จะได้ลิสต์ที่มีค่าตั้งแต่ 0 เรียงไปถึงก่อนตัวเลขนั้น เช่น
a = range(7) มีค่าเท่ากับการเขียน a = [0,1,2,3,4,5,6]
ถ้าใส่ตัวเลขลงไป ๒ ตัวก็จะได้ลิสต์ที่มีค่าตั้งแต่ตัวเลขทางซ้าย เรียงไปถึงก่อนตัวเลขทางขวา เช่น
a = range(1,7) มีค่าเท่ากับการเขียน a = [1,2,3,4,5,6]
ถ้า ใส่ตัวเลขลงไป ๓ ตัวก็จะได้ลิสต์ที่มีค่าเริ่มจากตัวเลขทางซ้ายสุด จากนั้นเพิ่มค่าไปเรื่อยๆตามเลขขวาสุด ไล่ไปจนถึงค่าก่อนเลขตัวกลาง เช่น
a = range(1,7,2) มีค่าเท่ากับการเขียน a = [1,3,5]
ตัวแปรแต่ละตัวที่อยู่ภายในลิสต์อาจไม่ใช่ตัวแปรชนิดเดียวกันทังหมด แต่อาจมีหลายชนิดปนกันอยู่
เช่น เราอาจใช้ตัวแปรลิสต์ตัวเดียวเพื่อเก็บแฟล็กทั้งหมดที่จะใช้ในฟังก์ชัน polyCube() เช่น
f = [3,1.5,5,1,1,3,'khaotommat']
mc.polyCube(w=f[0],h=f[1],d=f[2],sx=f[3],sy=f[4],sz=f[5],n=f[6])
จะเห็นว่าในตัวแปร f นี้เก็บค่าตัวแปรทั้งจำนวนเต็ม จำนวนจริง และสายอักขระเอาไว้ด้วยกันในเวลาเดียวกัน พอจะนำมาใช้ก็ใช้ได้เลย
นอกจากนี้แล้วลิสต์ยังสามารถเก็บตัวแปรชนิดลิสต์ได้ด้วย ในกรณีแบบนี้ก็จะเกิดเป็นลิสต์ซ้อนลิสต์ขึ้น เช่น
f = [[2,1,3],[6,0.5,14],[8,1.5,13],[9,2,18]]
จะเห็นว่ามีวงเล็บเหลี่ยมสองชั้นแบบนี้ [[ ]]
แบบนี้ f[0] จะมีค่าเป็นลิสต์ [2,1,3] และ f[1] จะมีค่าเป็นลิสต์ [6,0.5,14] เป็นต้น
จาก นั้นหากต้องการอ้างอิงถึงลิสต์ที่อยู่ภายในลิสต์ก็เขียนเป็นวงเล็บเหลี่ยม ตัวที่สองต่อท้ายตัวแรก วงเล็บแรกแสดงลำดับของลิสต์ย่อยภายในลิสต์หลัก วงเล็บหลังแสดงอันดับของตัวแปรในลิสต์ย่อย
เช่น f[0][0] จะมีค่าเป็น 2 และ f[1][2] จะมีค่าเป็น 14 เป็นต้น
การ ประยุกต์ใช้ในมายา เช่น ลองสร้างลิสต์สำหรับเก็บค่าของตัวแปรที่จะใช้กับฟังก์ชัน polyCube() ไว้หลายๆตัวแล้วใช้การวนซ้ำเพื่อให้แสดงทั้งหมด
f = [[2,1,3,'yanglop'],[6,0.5,14,'muethue'],[8,1.5,13,'eternal_harddisk'],[9,2,18,'klongdinso']]
i=0
while(i<4):
mc.polyCube(w=f[i][0],h=f[i][1],d=f[i][2],n=f[i][3])
mc.move(i*10,0,0)
i+=1
จะได้วัตถุ ๔ ชิ้น ที่มีขนาดและชื่อต่างกันออกไปทั้งหมด
นอกจากลิสต์แล้ว ยังมียังมีอีกอย่างที่คล้ายๆกันซึ่งน่ากล่าวถึงไปด้วย นั่นคือ
ทูเพิล (tuple) ทูเพิลใช้เก็บรายการของตัวแปรหลายๆตัวไว้ในตัวแปรเดียวเช่นเดียวกับลิสต์ แต่ว่าต่างกันตรงที่ไม่สามารถแก้ไขค่าภายในทูเพิลได้ ส่วนการสร้างทูเพิลนั้นคล้ายกับลิสต์ แต่ต่างกันตรงที่ใช้วงเล็บโค้ง () แทนวงเล็บเหลี่ยม []
t = (2,3,5,7,11,13,17)
การเข้าถึงค่าในทูเพิล รวมถึงคำสั่งที่ใช้กับทูเพิลนั้นโดยส่วนใหญ่แล้วจะคล้ายกับของลิสต์มาก ดังนั้นจะไม่กล่าวถึงซ้ำ
รายละเอียดเกี่ยวกับการใช้ลิสต์นั้นมีเยอะ ยังมีอีกหลายคำสั่งที่ไม่ได้อธิบายในนี้แต่ก็อาจต้องใช้ในบทถัดไปอีก
หากใครต้องการเข้าใจเกี่ยวกับลิสต์ในไพธอนมากขึ้นสามารถอ่านได้ใน
https://phyblas.hinaboshi.com/tsuchinoko08 และ
https://phyblas.hinaboshi.com/tsuchinoko12