φυβλαςのβλογ
phyblas的博客



maya python เบื้องต้น บทที่ ๗: การใช้ลิสต์
เขียนเมื่อ 2016/03/10 17:11
แก้ไขล่าสุด 2021/09/28 16:42
ก่อนที่จะไปเรียนรู้ถึงฟังก์ชันคำสั่งต่อๆไปของมายา มีพื้นฐานบางอย่างของภาษาไพธอนที่อาจจำเป็นต้องทำความเข้าใจให้ดีสักหน่อย นั่นคือเรื่องของลิสต์

ในนี้จะอธิบายแค่คร่าวๆอาจไม่ละเอียดสักเท่าไหร่ แต่จะเน้นการนำมาใช้ในมายามากกว่า

ลิสต์ (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

<< บทที่แล้ว      บทถัดไป >>
หน้าสารบัญ


-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python >> mayapython
-- คอมพิวเตอร์ >> 3D >> maya

ไม่อนุญาตให้นำเนื้อหาของบทความไปลงที่อื่นโดยไม่ได้ขออนุญาตโดยเด็ดขาด หากต้องการนำบางส่วนไปลงสามารถทำได้โดยต้องไม่ใช่การก๊อปแปะแต่ให้เปลี่ยนคำพูดเป็นของตัวเอง หรือไม่ก็เขียนในลักษณะการยกข้อความอ้างอิง และไม่ว่ากรณีไหนก็ตาม ต้องให้เครดิตพร้อมใส่ลิงก์ของทุกบทความที่มีการใช้เนื้อหาเสมอ

目录

从日本来的名言
模块
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
机器学习
-- 神经网络
javascript
蒙古语
语言学
maya
概率论
与日本相关的日记
与中国相关的日记
-- 与北京相关的日记
-- 与香港相关的日记
-- 与澳门相关的日记
与台湾相关的日记
与北欧相关的日记
与其他国家相关的日记
qiita
其他日志

按类别分日志



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  查看日志

  推荐日志

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ