φυβλαςのβλογ
บล็อกของ phyblas



maya python เบื้องต้น บทที่ ๙: ค่าคืนกลับของฟังก์ชันในมายา
เขียนเมื่อ 2016/03/10 18:02
แก้ไขล่าสุด 2021/09/28 16:42
โดยทั่วไปในการเขียนโปรแกรม ฟังก์ชันจะมีหน้าที่อยู่สองอย่างในเวลาเดียวกัน คือการดำเนินการทำให้เกิดอะไรบางอย่างขึ้นตามคำสั่ง เช่น move() คือสั่งให้ย้ายวัตถุ ส่วน polyCube() คือสร้างทรงสี่เหลี่ยม

ส่วนอีก หน้าที่หนึ่งของฟังก์ชันก็คือการคืนค่าตัวแปรบางอย่างกลับออกมา ซึ่งหน้าที่ตรงนี้จะคล้ายกับคำว่าฟังก์ชันในทางคณิตศาสตร์ เช่น f(x) = x+1 ในที่นี้ฟังก์ชัน f(x) มีค่าคืนกลับเป็น x+1

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

อย่างไรก็ตาม ก็มีบางครั้งที่อาจจำเป็นต้องใช้ค่าที่คืนกลับมานั้น จึงไม่อาจละเลยได้



ในบทที่ผ่านมาได้รู้จักฟังก์ชันที่สร้างรูปทรงต่างๆไปมากมายแล้ว เช่น polyCube(), polyPrism(), ฯลฯ

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

เช่นพอพิมพ์
mc.polyCube(n='lukbat')

ลงไปแล้วรันขึ้นมา ก็มีข้อความขึ้นมาดังนี้
# 結果: [u'lukbat', u'polyCube1'] #

สิ่งที่อยู่หลังคำว่า 結果: ก็คือค่าที่คืนกลับมาหลังจากการรันฟังก์ชันนั่นเอง โดยจะเห็นว่าได้ค่าคืนกลับมาเป็นลิสต์ของสายอักขระ ๒ ตัว ซึ่งอันแรกเป็นชื่อของวัตถุที่เราตั้งไว้ และอีกอันเป็นชื่อของโหนดที่เก็บข้อมูลรูปทรงของวัตถุ

ส่วนที่เป็นชื่อคือด้านในเครื่องหมายคำพูด ' ' ส่วน u ที่อยู่ด้านหน้าเครื่องหมายคำพูดมีไว้แสดงถึงว่าเป็นสายอักขระแบบยูนิโค้ด UTF-8 (ในไพธอน 2 สายอักขระทั่วไปจะเป็น ASCII ถ้าไม่เติม u นำหน้า)

ค่าที่คืนกลับมาสามารถใช้ตัวแปรเพื่อรับค่าได้ เช่น
chue = mc.polySphere(n='songklom')
print(chue)
print(chue[0])
print(chue[1])

ในนี้เราเก็บค่าที่คืนกลับมาลงในตัวแปร chue เสร็จแล้วก็สั่งให้พิมพ์ค่าของ chue ออกมาก็จะได้ค่าลิสต์ของสายอักขระ ๒ ตัว ซึ่งสามารถอ้างอิงถึงแต่ละตัวได้โดยใส่ [] ตามด้วยเลข 0 และ 1 ซึ่งจะได้ผลเป็น songklom และ polySphere1 ตามลำดับ

ตัวแปรที่เก็บค่าชื่อของวัตถุอยู่นี้สามารถนำไปใช้ในฟังก์ชันต่างๆได้ เช่น
mc.move(10,10,10,chue[0])

แบบนี้ก็จะเป็นการย้ายวัตถุ เทียบเท่ากับการพิมพ์ mc.move(10,10,10,'songklom')



การใช้แบบนี้มีข้อดี เพราะป้องกันปัญหาที่อาจเกิดขึ้นเวลาที่ชื่อซ้ำ

เช่น ลองพิมพ์
mc.polySphere(n='songklom')

ลงไปใหม่อีกรอบโดยที่ยังไม่ได้ลบทรงกลมลูกเดิมทิ้ง คราวนี้จะได้ผลเป็น
[u'songklom1', u'polySphere2']

จะเห็นว่าค่าของ chue[0] เป็น songklom1 แทนที่จะเป็น songklom ตาที่เราตั้งไว้

กรณีที่เป็นแบบนี้ถ้าเราไปสั่ง mc.move(10,10,10,'songklom') มันก็จะทำการย้ายวัตถุก้อนแรก แทนที่จะเป็นวัตถุก้อนหลังที่เพิ่งสร้าง

ดังนั้นการเก็บชื่อลงไปในตัวแปรจะทำให้เราไม่ต้องสนใจว่าชื่อมันเป็นอะไร แก้ปัญหากรณีที่ได้ชื่อไม่ตรงกับที่ตั้ง

อีกทั้งเราอาจไม่มีความจำเป็นต้องตั้งชื่อวัตถุเลยก็ได้ แต่ใช้ตัวแปรนั้นแทนชื่อไปเลย

อนึ่งต้องระวังด้วยว่าตัวแปรที่เก็บค่าชื่อนั้นจะไม่มี ' ' ล้อม ในขณะที่ชื่อวัตถุเป็นสายอักขระไม่ใช่ตัวแปรต้องมี ' ' ล้อม

หากไม่ต้องการจะต้องมาพิมพ์ [0] หลังตัวแปรทุกครั้งเพื่อชี้ถึงชื่อวัตถุให้เพิ่ม [0] ต่อท้ายฟังก์ชัน เช่น
chue = mc.polySphere(n='songklom')[0]

แบบนี้ค่าของตัวแปร chue ก็จะเป็นชื่อของตัววัตถุ ส่วนชื่อโหนดที่เก็บข้อมูลรูปทรงของวัตถุก็จะไม่ถูกเก็บเอาไว้ในตัวแปร

หากตอนที่สร้างฟังก์ชันเราใส่แฟล็ก ch=0 ลงไป เท่ากับเป็นการไม่เก็บข้อมูลรูปทรงของวัตถุ กรณีนี้เราจะได้ตัวแปรคืนกลับมาแค่ตัวเดียว เช่น
mc.polyCone(ch=0,n='kruai')



จะได้ผลเป็น [u'kruai']

อย่างไรก็ตาม แม้จะออกมาแค่ค่าเดียวแต่ชนิดของข้อมูลก็ยังเป็นลิสต์อยู่ เวลาจะอ้างอิงถึงตัวสายอักขระที่เป็นชื่อก็ยังต้องใส่ [0] ต่อท้าย
chue = mc.polyCone(ch=0,n='kruai')[0]



ฟังก์ชัน rename() ก็อาจใช้ตัวแปรที่เก็บชื่อนี้ได้เช่นกัน เช่น
chue = mc.polyCube(w=1,h=1,d=1)[0]
mc.rename(chue,'lukbatleklekluknueng')

แบบนี้แล้วก็จะได้ลูกบาศก์ที่ชื่อ lukbatleklekluknueng มา

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

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

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

ส่วนบางฟังก์ชันเช่นฟังก์ชัน move() นั้นจะไม่มีการคืนค่าใดๆกลับมาทั้งสิ้น เป็นฟังก์ชันที่มีหน้าที่สั่งการอย่างเดียว ดังนั้นถ้าเอาตัวแปรมารับค่าก็จะได้ตัวแปรที่ว่างเปล่า

นอกจากนี้แล้วในที่นี้จะขอพูดถึงหน้าที่อีกอย่างของฟังก์ชันคำสั่งสร้างรูปทรงต่างๆ ซึ่งนอกจากจะใช้สร้างแล้วยังสามารถใช้เพื่อดูค่าได้ด้วย ทำได้โดยการเติมแฟล็กไปอีกตัวคือ q (query)

แฟล็ก q ใช้เมื่อต้องการเอาข้อมูลของวัตถุที่สร้างไปแล้ว เมื่อใส่ q=1 หน้าที่ของฟังก์ชันจะเปลี่ยนไปจากปกติ รวมทั้งหน้าที่ของแฟล็กอื่นๆที่ใส่ลงไปพร้อมกันด้วย

ตัวอย่าง
return1 = mc.polyCone(r=10,h=15,n='kruaiyai')
return2 = mc.polyCone('kruaiyai',q=1,r=1)
return3 = mc.polyCone('kruaiyai',q=1,h=1)
print(return1)
print(return2)
print(return3)



จะได้ผลลัพธ์เป็น
[u'kruaiyai', u'polyCone1']
10.0
15.0

นั่นคือฟังก์ชัน polyCone ในบรรทัดแรกคืนค่ากลับเป็นชื่อของวัตถุและชื่อของโหนดตามที่อธิบายไปข้างต้น แต่ว่า polyCone ๒ บรรทัดล่างกลับให้ค่าคืนกลับมาเป็นตัวเลข

นั่นเพราะใน ๒ บรรทัดหลังมีการใส่แฟล็ก q=1 ลงไป ซึ่งเป็นการประกาศว่าเราใช้ฟังก์ชันนี้เพื่อถามหาข้อมูลของรูปทรง แทนที่จะใช้เพื่อสร้างรูปทรงเหมือนอย่างทุกที

ในกรณีนี้จะต้องทำการเพิ่มอาร์กิวเมนต์เข้ามาตัวหนึ่ง ซึ่งก็คือชื่อของวัตถุที่เราต้องการหาข้อมูล ในที่นี้คือ 'kruaiyai' ซึ่งเพิ่งถูกสร้างมาจากบรรทัดแรก

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

จากนั้นสิ่งที่ต้องใส่อีกอย่างก็คือแฟล็กที่เราอยากได้ข้อมูล ในที่นี้คือ r รัศมี และส่วนสูง h ตามลำดับ ซึ่งในกรณีนี้แฟล็กที่ใส่จะต้องการชนิดข้อมูลเป็นค่าจริงเท็จ แทนที่จะเป็นจำนวนจริงเหมือนกรณีทั่วไป

สามารถหาค่าได้เพียงทีละตัวเท่านั้น ดังนั้นหลังจากใส่ q=1 แล้วก็ให้ใส่แฟล็กที่ต้องการหาค่าเพิ่มเข้าไปอีกแค่ตัวเดียว



นอกจากที่กล่าวมาแล้วฟังก์ชันแต่ละตัวที่ยังไม่ได้พูดถึงก็มีค่าคืนกลับที่ต่างกัน ออกไปอีก ต่อจากนี้ไปจะกล่าวถึงเมื่อพูดถึงฟังก์ชันอื่นๆเพิ่มเติมต่อไปอีก



อ้างอิง

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


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

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

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

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> 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月

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

ไทย

日本語

中文