φυβλαςのβλογ
บล็อกของ 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
ภาษา mongol
ภาษาศาสตร์
maya
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



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

  ค้นหาบทความ

  บทความแนะนำ

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

บทความแต่ละเดือน

2024年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2023年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2022年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2021年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2020年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

ค้นบทความเก่ากว่านั้น

ไทย

日本語

中文