φυβλαςのβλογ
บล็อกของ 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)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

ไทย

日本語

中文