Thursday, March 4, 2010

ฉบับที่ 7 (มีนาคม 2010)

Opening

เฮ้อ...​(เสียงถอนหายใจยาว) ที่ถอนหายใจนี่ ไม่ใช่กลุ้มใจนะครับ แต่เป็นเสียงของความโล่งอกต่างหากครับ เพราะในที่สุดนิตยสารออนไลน์ THAI BIOINFORMATICS ฉบับเดือนมีนาคมของเราก็สำเร็จลุล่วงเสียที ถึงแม้ว่าจะล่าช้าไปบ้างก็ตาม

เดือนที่ผ่านมา ผมและทีมงานทุกคนต่างก็มีงานประจำที่ต้องทำเยอะมาก (ไม่ได้แก้ตัวครับ อันนี้เรื่องจริง) ประกอบกับปัญหาสุขภาพเล็กน้อย ทำให้งานของพวกเราช้ากว่ากำหนดไปบ้างครับ พอพูดถึงเรื่องสุขภาพแล้วก็อยากจะบอกท่านผู้อ่านว่า สุขภาพของเราเป็นสิ่งสำคัญจริงๆ ครับ เวลาเจ็บไข้ได้ป่วยมาที แทบแย่ ตอนที่ร่างกายแข็งแรงดี พวกเราก็มักจะปล่อยปละละเลยสุขภาพ อย่างไรก็ดูแลสุขภาพกันด้วยนะครับ จะได้มีสุขภาพที่ดีไว้สำหรับทำงานกันนานๆ ครับ

เกือบลืมไปเลยครับ หลังจากที่ e-Magazine ของเราเปิดตัวมาในรูปแบบ PDF เมื่อเดือนที่แล้วเป็นฉบับแรก ปรากฏว่ามีเสียงตอบรับดีมากครับ ผมได้รับ e-mail จากท่านผู้อ่านทั้งที่ผมรู้จัก และไม่รู้จักมาก่อนครับ ผมและทีมงานของ e-Magazine THAI BIOINFORMATICS ก็ขอขอบคุณมา ณ ที่นี้ด้วยนะครับ พวกเราจะถือว่ากำลังใจเหล่านี้เป็นแรงผลักดันให้พวกเราผลิตผลงานดีๆ ออกมาให้ผู้อ่านได้อ่านกันต่อไปครับ อย่างไรก็อยากให้แฟนนิตยสารยังคงติดตามต่อไปนะครับ

สำหรัับ THAI BIOINFORMATICS ฉบับเดือนมีนาคมนี้ ก็มีเนื้อหาเข้มข้นชวนติดตามไม่แพ้ฉบับก่อนๆ ครับ ทั้งเนื้อหาการบรรยายของ ดร. เจ เครก เวนเตอร์ ในคอลัมน์ Highlight หรือว่าจะเป็นเทคนิคการเขียนโปรแกรมด้วยภาษาไพธอน (Python) ก็กำลังสนุกเลยครับ และยังมีเรื่องราวอื่นๆ ชวนให้ติดตามในเล่มอีกครับ ต้องติดตามครับ

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

Highlight

ชีวิตสังเคราะห์: จากการอ่านสู่การเขียนรหัสพันธุกรรม
ประเวช อรรจวัฒนวงศ์

สวัสดีครับ หลังจากที่ผมเขียนต้นฉบับของ Highlight ฉบับของเดือนที่แล้วเสร็จเรียบร้อย ผมก็หาเวลาว่างมานั่งนึกดูว่าฉบับหน้าเราจะเขียนเรื่องอะไรดีหนอ อันที่จริงผมก็มีคำตอบในใจไว้แล้วล่ะครับว่าจะนำเสนอหัวข้ออะไร (แต่ขอเก็บเป็นความลับไว้ก่อน) บังเอิญว่าวันนี้ผมนึกขึ้นมาได้ ว่าจะต้องไปฟังสัมมนาเรื่องหนึ่ง ที่ผมจดเอาไว้ในกระดาษโน๊ตบนโต๊ะทำงานมาร่วมสัปดาห์หนึ่งแล้ว หัวข้อเรื่องสัมมนามีชื่อว่า “From Reading to Writing Genetic Code” ผู้บรรยายก็คือ ดร. เจ เครก เวนเตอร์ (Dr. J Craig Venter) หลังจากที่ฟังจบแล้วก็ไม่ผิดหวังเลยครับ ผมเลยเกิดความคิดว่า น่าจะเอาเนื้อหาของสัมมนานี้มาเล่าให้่ฟัง เพราะว่าเนื้อหาน่าสนใจทีเดียว เลยขอยกเอาเรื่อง bioinformatics ที่เตรียมไว้แล้วไปลงคราวหน้าแทนละกันครับ

ที่มหาวิทยาลัยอุปซอล่า (Uppsala University) จะมีการจัดการบรรยายพิเศษ ที่เรียกเป็นภาษาอังกฤษว่า The Celsius and Linne Honorary Lectures ซึ่งการบรรยายนี้จะจัดเป็นประจำทุกปี และแบ่งการบรรยายออกเป็น 2 ส่วน คือส่วนของวิทยาศาสตร์กายภาพเพื่อเป็นเกียรติและรำลึกถึงศาสตรจารย์ แอนเดอร์ช เซลเซียส (Prof. Anders Celsius) ซึ่งท่านเป็นศาสตราจารย์ทางด้านดาราศาสตร์ของมหาวิทยาลัย ตั้งแต่อายุเพียง 28 ปี (ในปี ค.ศ. 1730) ผู้คิดค้นเทอร์โมมิเตอร์และหน่วยวัดอุณหภูมิที่เป็นองศาเซลเซียส ส่วนในด้านวิทยาศาสตร์ชีวภาพ ก็จะมีการบรรยายเพื่อเป็นเกียรติและรำลึกถึงศาสตราจารย์ คาร์ล วอน ลินเน่ (Prof. Carl von Linné) ซึ่งเป็นศาสตราจารย์ทางด้านการแพทย์ของมหาวิทยาลัยเช่นกัน ผลงานที่โดดเด่นของลินเน่ ก็คือ การจัดจำแนกสิ่งมีชีวิตและตั้งชื่อให้กับสิ่งมีชีวิตต่างๆ ต่อมาได้รับการขนานนามว่าเป็นบิดาแห่งวิชาอนุกรมวิธานและท่านยังเป็นผู้ก่อตั้ง the Royal Academy of Sciences ของประเทศสวีเดนซึ่งปัจจุบันกลายเป็นองค์กรสำหรับสรรหานักวิทยาศาสตร์รางวัลโนเบลในแต่ละปี และท่านก็เป็นประธานคนแรกของ the Royal Academy of Sciences อีกด้วย


ดร. เจ เครก เวนเตอร์ ได้รับเชิญให้เป็นผู้บรรยายในส่วน Linnéföreläsning ครับ การบรรยายถูกจัดขึ้นที่ห้องประชุม Siegbahnsalen ซึ่งเป็นสถานที่เดียวกันกับที่ใช้สำหรับบรรยายของนักวิทยาศาสตร์รางวัลโนเบลสาขาฟิสิกส์ พอใกล้ถึงเวลาบรรยาย ผมก็ตรงไปที่ห้องบรรยายซึ่งอยู่ที่ โองสเตริมแลปโบราโทเรียท (Ångströmlaboratoriet) ซึ่งเป็น campas หนึ่งของมหาวิทยาลัยอุปซอล่า ที่เปิดสอนฟิสิกส์ เคมี และวิศวกรรม ปรากฏว่ามีคนมายืนรอเป็นแถวยาวมากเพื่อที่จะเข้าฟังบรรยายนี้ เอาล่ะครับ ผมจะขอเล่าให้ฟังคร่าวๆ ถึงเนื้อหาที่ ดร. เวนเตอร์ ได้บรรยายไว้นะครับ

ถ้าย้อนเวลากลับไปราว 15 - 20 ปีก่อน ในยุคที่การทำ DNA sequencing ยังเป็นเรื่องลำบากนั้น คงไม่มีใครกล้าคิดนอกกรอบที่จะทำ genome sequence เป็นแน่ แต่ เวนเตอร์ ไม่เพียงแค่คิด แต่ยังทำนอกกรอบ และประสบความสำเร็จกับสิ่งที่ทำอีกด้วย

ถึงแม้ว่าเทคโนโลยีทางด้าน sequencing เกิดขึ้นและถูกพัฒนาไปอย่างรวดเร็ว จีโนม (genome) ของแบคทีเรีย ขนาด 2-4 เมกกะเบส (Mb) ถูกถอดรหัสและแปลความได้ภายในเวลาไม่ถึง 1 สัปดาห์ก็ตาม เหตุการณ์เหล่านี้เพิ่งจะเกิดขึ้นในเวลาไม่กี่ปีที่ผ่านมานี่เอง ในยุคเริ่มต้น เวนเตอร์ คิดว่าการทำ DNA sequencing กับสิ่งมีชีวิตที่มีจีโนมซับซ้อนและใหญ่มากๆ อย่างเช่น มนุษย์ เป็นเรื่องที่ไม่ใช่ความฝัน หากแต่มีความเป็นไปได้ ในที่สุด human genome project ก็เกิดขึ้น และในช่วงเวลาระหว่างที่โครงการนี้กำลังก้าวเดินไปสู่ความสำเร็จ ก็ได้ก่อให้เกิดเทคโนโลยีอื่นๆ ที่เป็นประโยชน์ต่อการศึกษาชีววิทยาและ bioinformatics อีกมากมาย

การค้นพบที่สำคัญอีกอย่างหนึ่งของเวนเตอร์ คือ การสร้าง expressed sequence tags (ESTs) ซึ่งปัจจุบันกลายมาเป็นเทคนิคที่มีประโยชน์มาก และขนาดของ ESTs ใน GenBank ก็เพิ่มปริมาณมากขึ้นจากปี ค.ศ. 1991 ที่มีเพียง 337 ESTs จนถึงปี ค.ศ. 2002 ก็มีปริมาณ ESTs ใน GenBank ถึง 10.4 ล้าน ESTs และปี ค.ศ. 2009 พบว่าจำนวน ESTs เพิ่มขึ้นจากเดินกว่า 6 เท่า เป็น 62,943,008 ESTs ซึ่งส่วนมากก็เป็น ESTs ของมนุษย์

แต่การได้ข้อมูลปริมาณมากก็นำไปสู่ปัญหาอีกอย่างหนึ่ง คือการ assembly EST sequences เข้าด้วยกัน จากเทคนิคการ assembly ชิ้น ESTs เวนเตอร์ก็มีแนวคิดที่จะนำมาใช้กับการรวมชิ้น DNA เพื่อประกอบขึ้นเป็นจีโนมที่สมบูรณ์ ในยุคแรกๆ ที่เริ่มทำ genome sequencing ของพวกยูคาร์ริโอตอย่างเช่น ยีสต์ เราไม่สามารถให้คนคนเดียวทำได้ทั้งหมด ในตอนนั้น ต้องทำการแบ่งจีโนมของยีสต์ออกเป็นท่อนๆ และส่งไปทำในห้องปฎิบัติการต่างๆ กว่า 1,000 แห่ง และต้องใช้เวลาเกือบ 10 ปี กว่าจะทำ sequencing ได้ครบทั้งจี-โนม จะเห็นว่าชิ้น DNA จากห้องปฏิบัติการต่างๆ ก็ถูกนำมา assembly กันด้วยอัลกอลิทึมดังกล่าว ต่อมา เขาลองนำแนวคิดนี้มาใช้กับการทำ genome ของแบคทีเรีย ก็พบว่าให้ผลลัพธ์ที่น่าพอใจ

วันที่ 28 กรกฎาคม ค.ศ. 1995 จีโนมแบคทีเรีย Haemophilus influenza Rd ซึ่งเป็นจีโนมแรกก็ถูกตีพิมพ์ลงในวารสาร Science ฉบับที่ 269 ต่อมาก็ได้ทำ genome sequencing แบคทีเรียที่มีจีโนมเล็กที่สุด คือ Mycoplasma genitalium หลังจากนั้นแบคทีเรียจำนวนมากมายก็ถูกนำมาทำ genome sequencing

จากการทำ DNA sequencing ของสิ่งมีชีวิตที่เป็น haploid genome คือมีจีโนมเพียงชุดเดียว เช่น เชื้อรา ยีสต์ และแบคทีเรีย เป็นต้น เขาก็เริ่มคิดถึงสิ่งมีชีวิตที่มีจีโนม 2 ชุด หรือที่เราเรียกว่า diploid genome อย่างเช่น คน สัตว์ และพืช นั่นเอง ในโครงการศึกษาจีโนมมนุษย์ พบว่าในแต่ละคน จีโนมที่ได้จากพ่อและแม่จะมีความแตกต่างกันอยู่ราวๆ 0.5% และ diploid genome แต่ละชุดของเราก็จะแตกต่างจาก diploid genome ของคนอื่นๆ ประมาณ 1-3% จึงเกิดเป็นคำถามใหม่ขึ้นมาว่า เราต้องใช้คนกี่คนในการทำ human genome sequencing จึงจะเพียงพอที่ทำให้เราเข้าใจความแตกต่างเหล่านั้นได้

อันที่จริงแล้วการอ่าน sequence ของมนุษย์เพียงอย่างเดียวก็ไม่ได้ทำให้เราเข้าใจตัวเราได้ทั้งหมด นั่นเป็นเพราะ เราไม่ได้อยู่ลำพังคนเดียว เพราะในร่างกายมนุษย์คนหนึ่งประกอบขึ้นไปด้วยเซลล์ของตัวเราเอง และจุลินทรีย์เล็กๆ ที่อาศัยอยู่ร่วมกันกับเราอีกมากมาย เวนเตอร์ มีโครงการศึกษา metagenome ของพวกจุลินทรีย์ (microbial flora) ที่อยู่ร่วมกับมนุษย์ในส่วนต่างๆ ของร่างกาย โดยเลือกบริเวณที่มีจุลินทรีย์อาศัยอยู่ค่อนข้างมากมา 4 แห่ง ได้แก่ ในช่องปาก (oral cavity) ผิวหนัง (skin) ทางเดินอาหาร (gastrointestinal tract) และในช่องคลอด (vagina) เขาเรียก metagenome จากแหล่งต่างๆ เหล่านี้ว่า microbiome

จากการศึกษา metagenome จากแหล่งต่างๆ ของร่างกาย ทำให้เราพบยีนใหม่ๆ เป็นพันๆ ยีน หน้าที่ต่อไปของเขาคืออยากรู้ว่ายีนต่างๆ เหล่านี้สัมพันธ์กันอย่างไร ลองคิดดูนะครับว่า เมื่อยีนเหล่านี้ทำงาน นั่นคือมีการสร้าง mRNA และสร้างโปรตีนออกมา จากนั้นโปรตีนเหล่านั้นก็ไปทำงาน ถ้าโปรตีนเหล่านั้นเป็นเอนไซม์ ก็อาจจะสร้างสารเมตาบอไลท์ (metabolites) มากมาย อันนี้ล่ะครับทำให้คนที่ศึกษา metabolomics ของมนุษย์ เจอกับปัญหาใหญ่ เพราะสารเมตาบอไลท์ที่ได้มานั้น ไม่ได้มาจากจีโนมมนุษย์เพียงอย่างเดียว แต่อาจจะมาจากจีโนมของสิ่งมีชีวิตที่อาศัยอยู่ร่วมกับเราด้วยก็ได้ ถ้าจะอธิบายให้เข้าใจง่ายขึ้นมาอีกหน่อย ลองนึกภาพว่า หลังจากที่เราทานอาหารเสร็จสักครึ่งชั่วโมง แล้วก็ไปเจาะเลือดตรวจดูสารเคมีในเลือดว่ามีอะไรบ้าง ผลก็จะออกมาว่า 60% ของสารเคมีในเลือดนั้นเป็นสารที่ร่างกายเราสร้างขึ้น 30% เป็นสารเคมีที่มาจากอาหารที่เราทานเข้าไป ส่วนอีก 10% ที่เหลือนี่สิครับ เป็นสารเคมีที่แบคทีเรียที่อาศัยอยู่ในร่างกายเราสร้างขึ้นทั้งสิ้นเลย

นอกจากนี้ ดร. เวนเตอร์ ยังสนใจความหลากหลายทางชีวภาพของจุลินทรีย์ที่กระจายอยู่ตามที่ต่างๆ ทั่วโลก นั่นเพราะครึ่งหนึ่งของ biomass บนโลกของเราเป็นุลินทรีย์นั่นเอง ถ้าเราตักน้ำทะเลมาวัดปริมาณจุลินทรีย์ ก็จะพบว่ามีแบคทีเรียประมาณ 1 ล้านเซลล์ ในน้ำทะเลแค่ 1 มิลลิลิตรเท่านั้น และถ้าคำนวณต่อไปก็จะพบว่า ในมหาสมุทรจะมีจุลินทรีย์อยู่ประมาณ 600,000,000,000,000,000,000 ตัวเลยทีเดียว

จากแนวคิดดังกล่าว ก็นำไปสู่โครงการยักษ์ในการศึกษาความหลากหลายทางชีวภาพของจุลินทรีย์ในทะเลรอบโลกเลยครับ ในโครงการนี้ ทีมนักวิจัยจะลงเรือเดินสมุทรเพื่อเก็บตัวอย่างน้ำทะเลมากรองด้วย filter แล้วนำส่วนที่กรองได้กลับมายังห้องปฏิบัติการเพื่อทำ metagenome library แล้วจึงทำ short gun sequencing ครับ เส้นทางการเดินเรือนี้ก็เลียนแบบเส้นทางการเดินทางรอบโลกของดาร์วินเลยครับ และเก็บตัวอย่างน้ำทะเลทุกๆ 200 ไมล์ตลอดการเดินทาง

DNA sequences ที่ได้จากน้ำทะเลแต่ละที่ ก็มีความแปลกแตกต่างกันออกไป อย่างเช่น ทะเลบอลติก (Baltic sea) ที่อยู่ท่ามกลางประเทศสวีเดน ฟินแลนด์ เอสโทเนีย และอีกหลายประเทศที่ล้อมรอบทะเลแห่งนี้ สภาพทางภูมิศาสตร์ของทะเลแห่งนี้มีทางเชื่อมต่อกับมหาสมุทรแคบมาก ประกอบกับน้ำทะเลที่นี่มีการปนเปื้อนด้วยมลพิษมากมาย พอนำน้ำทะเลจากที่นี่ไปทำ sequence ก็พบยีนใหม่ๆ ที่ไม่เคยรู้จักมาก่อนเป็นจำนวนมาก และยีนใหม่ๆ ที่พบ ก็แตกต่างกันไปตามแต่ละสถานที่ นอกจากนี้ ในแต่ละปี เราก็พบยีนชนิดใหม่ๆ เหล่านี้มากขึ้นตามลำดับด้วย

เมื่อปี ค.ศ. 1995 ช่วงนั้นเป็นช่วงที่เริ่มต้นทำ genome sequencing ของเชื้อ M. genitalium แบคทีเรียชนิดนี้มีจีโนมเล็กมาก ในจีโนมประกอบด้วยยีนเพียง 525 ยีนเท่านั้น ในจำนวนนี้เป็นยีนที่ code สำหรับสร้างโปรตีนจำนวน 482 ยีน และยีนสำหรับสร้าง RNA จำนวน 43 ยีน นี่คงจะเป็นชุดของยีนที่น้อยที่สุด ที่ทำให้สิ่งมีชีวิตสามารถดำรงชีวิตอยู่ได้เอง การค้นพบนี้ไม่เพียงแค่น่าสนใจครับ แต่ยังไปจุดประกายความคิดใหม่ขึ้นมาอีก ลองนึกภาพดูสิคับ ว่ายีนแค่ไม่กี่ร้อยยีน ก็สามารถทำให้เซลล์มีชีวิตขึ้นมาได้เอง เติบโตได้เอง สืบพันธุ์ได้เอง แล้วเราสามารถสร้างสิ่งมีชีวิตใหม่ขึ้นมาได้เองไหม

หลายคนอาจคิดในใจว่า ทำไมจะทำไม่ได้ ก็อาศัยเทคนิคด้าน system biology ที่เป็นการจำลองการทำงานของเซลล์ขึ้นมา เพียงแค่นี้เราก็ได้สิ่งมีชีวิตขึ้นมาในคอมพิวเตอร์แล้ว แต่ ดร. เวนเตอร์ ไม่ต้องการชีวิตแบบ digital life น่ะสิ เอาล่ะสิ งานนี้เริ่มสนุกแล้วครับ เขาเริ่มต้นกับสิ่งมีชีวิตเล็กๆ อย่างไวรัสก่อนครับ เขาเริ่มต้นจากไวรัสที่ชื่อ ΦX174 ครับ ไวรัสตัวนี้เป็นไวรัสที่ทำลายแบคทีเรีย จีโนมของไวรัสถูกเหนี่ยวนำให้เกิด mutation ได้ง่าย เอาล่ะครับ ทีมนักวิจัยของ ดร. เวนเตอร์ ก็เริ่มต้นจากการทำ genome sequencing ของไวรัสตัวนี้ใหม่ และสังเคราะห์ DNA ของไวรัสขึ้นมาเป็นชิ้นสั้นๆ จำนวนมากมาย แล้วก็นำชิ้น DNA สั้นๆ เหล่านั้นมารวมกัน (integration) แล้วบรรจุเข้าไปในโปรตีนที่เป็นเปลือกหุ้มของไวรัส จากนั้นก็นำไป infect แบคทีเรียครับ จากอนุภาคของไวรัสจำนวนมากมายมหาศาล ในที่สุดเขาก็พบว่ามีไวรัสสังเคราะห์บางอนุภาคที่มีชีวิตอยู่ได้จริงๆ ไวรัสเหล่านั้นสามารถบุกรุกเข้าไปในเซลล์ของแบคทีเรียได้ แบคทีเรียตอบสนองต่อการบุกรุกเหมือนไวรัสปกติ ไวรัสสังเคราะห์สามารถสร้างโปรตีนของตัวเองได้ และทำลายเซลลของแบคทีเรียเพื่อปลดปล่อยตัวเองออกมาสู่ภายนอกได้ด้วย ผลการสังเคราะห์ไวรัสเป็นไปได้อย่างน่ามหัศจรรย์ แต่ทีมนักวิจัยยังไม่พอใจกับผลงานเพียงเท่านี้ครับ

พวกเขาย้ายจากไวรัส ไปยังโจทย์ที่ท้าทายมากกว่า นั่นก็คือการสังเคราะห์แบคทีเรีย M. genitalium ขึ้น เพราะเป็นแบคทีเรียที่มีจีโนมเล็กที่สุดนั่นเอง ทีนี้ก็ถึงเวลาขบคิดปัญหาแล้วล่ะครับว่าจะสังเคราะห์จีโนมแบคทีเรียได้อย่างไร ทางออกก็ไม่ยากครับ คงใช้วิธีเดียวกับการสร้างไวรัส คือ สังเคราะห์ DNA ชิ้นเล็กๆ ขึ้นมาก่อนแล้วค่อยๆ นำมา integrate เป็นชิ้นใหญ่ขึ้น โดยขั้นแรกจะรวมให้ได้ชิ้นขนาดประมาณ 6 kb แล้วใช้ไวรัสเป็นตัวคัดเลือกชิ้น integrated DNA ที่ต้องการ เราจะเรียก DNA เหล่านี้ว่า cassette ซึ่งการสร้างแบคทีเรีย M. genitalium จะต้องสร้าง cassette ทั้งสิ้น 101 ชิ้น จากนั้นก็นำชิ้น DNA ขนาด 6 kb จำนวน 4 ชิ้มมารวมกัน เป็น DNA ขนาด 24 kb แล้วใช้ Escherichia coli เป็นตัวคัดเลือกชิ้น DNA ที่ต้องการ แล้วก็รวมชิ้น DNA ให้ใหญ่ขึ้นอีก แต่พอชิ้น DNA ที่รวมกันมีขนาดใหญ่เกินกว่า 100 kb ก็เริ่มจะใช้ E. coli มาคัดเลือกไม่ไหวแล้ว จึงต้องมองหาวิธีการอื่นมาใช้แทน

วิธีการหนึ่งที่ทีมนักวิจัยเขาสนใจ มาจากแบคทีเรียมหัศจรรย์ชนิดหนึ่ง ชื่อ Deinococcus radiodulans แบคทีเรียชนิดนี้มีลักษณะพิเศษตามชื่อของมัน คือ สามารถทนต่อกัมมันตรังสีได้สูงถึง 10,000 Gy (ตามปกตินะครับ กัมมันตรังสีที่ 5 Gy นี่ก็สามารถทำให้คนตายได้แล้วครับ) ความสามารถในการทนต่อรังสีของมันทำให้นักวิจัยอยากรู้ว่ามีกลไกใดที่ช่วยให้มันมีชีวิตอยู่ได้ หลังจากที่ได้ศึกษากลไกภายในเซลล์ก็พบว่า ที่ความเข้มของรังสีดังกล่าว โครโมโซมของแบททีเรียชนิดนี้ก็ไม่สามารถทนทานได้ แถมยังขาดเป็นท่อนสั้นๆ มากมายครับ ลักษณะนี้เป็นเรื่องปกติที่เกิดขึ้นกับสิ่งมีชีวิตทุกชนิด แตความลับในการมีชีวิตรอดของแบคทีเรียนี้อยู่ตรงที่ เมื่อกัมมันตรังสีลดความเข้มลง DNA ชิ้นเล็กๆ ที่โดนทำลายไปแล้ว กลับมารวมตัวกันเป็นโครโมโซมที่สมบูรณ์ได้อีกครั้ง ความลับที่น่าทึ่งนี้ ทำให้ทีมวิจัยเริ่มคิดว่าถ้าทำให้ cassette เล็กๆ มารวมกันได้เองเหมือนใน D. radiodurans ก็คงจะดีไม่น้อย แต่กระบวนการดังกล่าวไม่สามารถเกิดได้ในหลอดทดลองน่ะสิครับ วิธีที่ว่ามาเลยต้องพับเก็บไปก่อน แล้วมองหาสิ่งใหม่ต่อไป

ในที่สุดพวกเขาก็พบว่า ยีสต์เองก็มีกลไกการรวมชิ้น DNA แบบนี้เหมือนกัน จึงได้ออกแบบให้ DNA ชิ้นใหญ่ๆ (ซึ่งเกิดจากการรวม cassette จนโตเกินกว่า 100 kb) มีจุดที่ overlap กัน (รูปที่ 1) แล้วก็รวมชิ้น DNA เข้ากับ YAC (Yeast Artificial Chromosome) เพื่อใช้ในการโคลนชิ้น DNA ทั้งหมดเข้าสู่เซลล์ยีสต์ ผลลัพธ์ของวิธีการดังกล่าว เป็นไปตามที่นักวิจัยคาดไว้ทุกประการ คือ พวกเขาสามารถสร้างโครโมโซมของ M. genitalium ขึ้นมาได้สำเร็จ












รูปที่ 1 กระบวนการสร้างจีโนมสังเคราะห์ของแบคทีเรีย M. genitalium โดยการรวมชิ้น cassette ขนาดใหญ่ (เส้นสีดำ) เข้ากับ YAC (สีแดง) ซึ่งเป็นพาหะในการโคลนเข้าสู่เซลล์ยีสต์ [ภาพ: ดัดแปลงมาจาก Gibson DG, et al. SCIENCE 2008: 319; 1215-1220.]





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

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

การทดลองใหม่ก็เกิดขึ้น โดยการใส่โครโมโซมของแบคทีเรียในสปีชีส์ M. mycoides ลงไปในเซลล์แบคทีเรียชนิด M. capricolum โดยที่แบคทีเรียทั้งสองชนิดนี้มี DNA ต่างกันอยู่ประมาณ 10% (เหมือนคนกับหนูเลยครับ) ในขั้นตอนการทำงานนะครับ นักวิจัยเขาก็แยกโครโมโซมของ M. mycoides ใน gel block แล้วใช้เทคนิค electropolation นำโครโมโซมใหม่เข้าไปในเซลล์ของ M. capricolum พอโครโมโซมใหม่เข้าไปอยู่ในเซลล์ ก็เริ่มสังเคราะห์เอนไซม์พวก restriction enzyme ครับ แล้วเอนไซม์นี้ก็ไปทำลายโครโมโซมของ M. capricolum สิครับ เมื่อเวลาผ่านไป แบคทีเรียที่มีแต่โครโมโซมของ M. mycoides ก็โตบนอาหารเลี้ยงเชื้อ พอนักวิจัยตรวจสอบโปรตีนที่แบคทีเรียใหม่ผลิตขึ้น ปรากฏว่ามีแต่โปรตีนของ M. mycoides ทั้งนั้นเลยครับ ดร. เวนเตอร์ เรียกเทคนิคดังกล่าวนี้ว่า transplantation (เหมือนการปลูกถ่ายอวัยวะเลย เพียงแต่นี่เป็นการปลูกถ่ายโครโมโซมครับ)

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

The Royal Academy of Engineering กล่าวถึง synthetic biology ไว้ว่า synthetic biology จะเป็นเทคโนโลยีที่สำคัญต่อเศรษฐกิจ สิ่งแวดล้อม และวงการแพทย์ ของยุโรปและต่อทุกประเทศทั่วโลก ในศตวรรษนี้

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

Python Programming

More on Function
ประพัฒน์ สุริยผล

ครั้งนี้ เราจะทำให้โปรแกรมที่เราเขียนขึ้นเอง อ่านง่าย กะทัดรัด และแก้ไขได้ง่ายขึ้นไปอีก

เมื่อครั้งก่อนเราใช้ฟังก์ชัน เพื่อช่วยแบ่ง code ที่อยู่ในกลุ่มเดียวกันออกไปอยู่เป็นฟังก์ชัน ทำให้เรามองเห็น structure และ flow การทำงานของโปรแกรมได้ดีขึ้น ถ้าหากเราไม่แบ่งฟังก์ชัน เงื่อนไขต่างๆ ของ if คงจะไม่ชัดเจนและอยู่ใกล้กันอย่างที่เรามีอยู่

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

ลองดูที่ code ข้างล่างนี้

def calculateRectangleArea():
____print "Program to calculate Area of Rectangle"
____base = raw_input("Please enter base -> ")
____height = raw_input("Please enter height -> ")
____base_int = int(base)
____height_int = int(height)
____print "Rectangle area of base", base, "and height", height,\
__________"is", base_int*height_int

def calculateTriangleArea():
____print "Program to calculate Area of Triangle"
____base = raw_input("Please enter base -> ")
____height = raw_input("Please enter height -> ")
____base_int = int(base)
____height_int = int(height)
____print "Triangle area of base", base, "and height", height, "is",\
__________base_int*height_int*0.5

def calculateCircleArea():
____print "Program to calculate Area of Circle"
____radious = raw_input("Please enter radious -> ")
____radious_int = int(radious)
____print "Circle area of radious", radious, "is", 3.14159*radious_int*radious_i

เราจะเห็น pattern ที่ซ้ำๆ กันอยู่ในฟังก์ชัน ประเด็นสำคัญคือเราจะสร้างฟังก์ชันใหม่อย่างไรให้เหมาะสม จุดนี้เป็นจุดสำคัญที่สามารถเรียนรู้ได้จากประสบการณ์และดู code ที่คนอื่นเขียน

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

def calculateRectangleArea():
____print "Program to calculate Area of Rectangle"
____base = getUserInput("Please enter base -> ")
____height = getUserInput("Please enter height -> ")
____print "Rectangle area of base", base, "and height", height, "is", base*height

อันที่จริง สิ่งนี้เป็น code ที่เราต้องการเขียนตั้งแต่ต้น อ่านตรงไปตรงมา ไม่ต้องกังวลว่าค่าที่คืนมาต้องแปลงให้เป็น integer สิ่งที่เราต้องทำตอนนี้ก็คือ ฟังก์ชัน getUserInput ยังไม่มี ภาษา python ไม่มีฟังก์ชันนี้ และเป็นหน้าที่ของเราที่ต้องเขียนฟังก์ชันนี้ขึ้นมาใช้เอง

เราเริ่มต้นด้วยการ นิยามฟังก์ชัน

def getUserInput(text_to_display):

จะเห็นว่านิยามครั้งนี้ต่างจากครั้งแรกที่ในวงเล็บเราใส่ชื่อตัวแปรเอาไว้ ในที่นี้คือ text_to_display เราเรียกตัวแปรนี้ว่า พารามิเตอร์ (parameter) เพราะถ้าเราสังเกตคำสั่งที่ใช้เรียกฟังก์ชันนี้ จะมีการส่งค่าประโยคที่ต้องการถามผู้ใช้ไปให้ฟังก์ชัน เพราะฉะนั้น เราต้องเตรียมตัวแปรพารามิเตอร์เอาไว้เพื่อรองรับสิ่งที่ส่งมา

เมื่อฟังก์ชันถูกเรียกใช้ ตัวแปร text_to_display ก็จะมีค่าตามที่ถูกใช้ส่งมา สิ่งที่ต้องทำก็คือนำตัวแปรนี้ไปใช้ต่อ ดังด้านล่าง

def getUserInput(text_to_display):
____input = raw_input(text_to_display)
____return int(input)

สิ่งที่ฟังก์ชันนี้ทำ คือนำ text_to_display ไปใช้ต่อในคำสั่ง raw_input เพื่อรับค่าจากผู้ใช้ เสร็จแล้วจึงคืนค่าที่แปลงเป็น integer กลับไป ด้วยคำสั่ง return ถ้าหากฟังก์ชันไม่ต้องคืนค่าใดๆ เราก็ไม่ต้องใช้คำสั่ง return (เหมือนที่เราเรียกใช้ฟังก์ชัน calculateRectangleArea() หรือฟังก์ชันอื่นๆ ก่อนหน้านี้) ค่าที่คืนกลับไปจะเป็นตัวเลขเรียบร้อย ไม่จำเป็นต้องแปลงค่าต่อไปอีก

แบบฝึกหัด

ให้แปลงโปรแกรมที่เขียนขึ้น ให้เรียกใช้ getUserInput แล้วดูว่า โปรแกรมกะทัดรัดขึ้นหรือไม่ จำนวนบรรทัดลดลงไหม อ่านง่ายขึ้นหรือไม่

Good and Not So Good Programs

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

ลักษณะของโปรแกรมที่ดีคือ
1. ทำงานได้ถูกต้อง (สำคัญที่สุด ถูกไหม)
2. อ่านเข้าใจง่าย (ชื่อตัวแปรชัดเจน ชื่อฟังก์ชันชัดเจน การทำงานของโปรแกรมสามารถทำความเข้าใจได้ง่าย)
3. สามารถปรับเปลี่ยนเพิ่มเติมหรือแก้ไขได้ง่าย หากต้องการเพิ่มคุณสมบัติต่างๆ เข้าไป สามารถทำได้ โดยแทบจะไม่ต้องแก้ไขส่วนที่เขียนไว้อยู่แล้ว ที่เป็นเช่นนี้ เพราะถ้าหากเราต้องเข้าไปแก้ไขส่วนที่เขียนไว้อยู่แล้ว จะมีโอกาสสูงที่เราจะทำให้โปรแกรมทำงานผิดพลาดได้ โดยเฉพาะโปรแกรมที่เราต้องการแก้ไขเป็นโปรแกรมขนาดใหญ่หรือไม่ได้เขียนด้วย ตัวเราเอง
4. สั้น และกะทัดรัดที่สุด เท่าที่ไม่รบกวนกฎข้อที่ 1 และ 2

แบบฝึกหัด

ลองดูโปรแกรมแบบต่างๆ 6 แบบดังด้านล่าง แล้วให้คะแนนตั้งแต่ 1-3 (1 ต่ำสุด 3 สูงสุด) พร้อมเหตุผลประกอบ ในแต่ละหัวข้อดังต่อไปนี้

1. โปรแกรมทำงานถูกต้อง ตามที่ต้องการไหม (คะแนน 1-3)
2. โปรแกรมอ่านเข้าใจง่ายไหม (คะแนน 1-3)
3. ถ้าต้องการเพิ่มการคำนวณพื้นที่รูปร่างอื่นๆ เข้าไปอีก ทำได้ง่ายไหม (คะแนน 1-3)
4. ความสั้นและกะทัดรัด (คะแนน 1-3)

แบบที่ 1

def calculateRectangleArea():
____print "Program to calculate Area of Rectangle"
____base = getUserInput("Please enter base -> ")
____height = getUserInput("Please enter height -> ")
____print "Rectangle area of base", base, "and height", height, "is", base*height

def calculateTriangleArea():
____print "Program to calculate Area of Triangle\nTriangle area = 0.5*base*height"
____base = getUserInput("Please enter base -> ")
____height =getUserInput("Please enter height -> ")
____print "Triangle area of base", base, "and height", height, "is", 0.5*base*height

def calculateCircleArea():
____print "Program to calculate Area of Circle\nCircle area = 3.14159 * radius^2"
____radius = getUserInput("Please enter radius -> ")
____print "Circle area with radius", radius, "is", 3.14159 *radius**2

def calculateTrapezoidsArea():
____print "Program to calculate Area of Trapezoids"
____# = 0.5 * (parallelbase1+parallelbase2)* height
____parallelbase1 = getUserInput("Please enter parallel base1 -> ")
____parallelbase2 = getUserInput("Please enter parallel base2 -> ")
____height = getUserInput("Please enter height -> ")
____print "Trapozoids area of parallel base1", parallelbase1, "parallel base2",\
__________parallelbase2, "and height", height, "is",\
__________0.5*(parallelbase1 + parallelbase2)*height

def getUserInput(text_to_display):
____input = raw_input(text_to_display)
____return int(input)

choice = raw_input("Which type of area you would like to calculate (R/T/C/Z)? -> ")
if choice == "R" or choice == "r":
____calculateRectangleArea()
elif choice == "T" or choice == "t":
____calculateTriangleArea()
elif choice == "C" or choice == "c":
____calculateCircleArea()
elif choice == "Z" or choice == "z":
____calculateTrapezoidsArea()
else:
____print "Please type R,T,C or Z to choose the type of area to calculate"

แบบที่ 2

def calculateArea(Area):
____print "Program to calculate Area of", Area
____base = getUserInput("Please enter base -> ")
____height = getUserInput("Please enter height -> ")
____if Area == "Rectangle":
________print "Rectangle area of base", base, "and height", height, "is", base*height
____elif Area == "Triangle":
________print "Triangle area of base", base, "and height", height, "is", 0.5*base*height

def calculateCircleAndTrapezoids(Value):
____if Value == "Circle":
________radius = getUserInput("Please enter radius -> ")
________result = 3.14159*(radius**2)
________print "Circle area of radius", radius, "is", result
____elif Value == "Trapezoids":
________height = getUserInput("Please enter height -> ")
________parallel_base_top = getUserInput("Please enter parallel_base_top -> ")
________parallel_base_bottom = getUserInput("Please enter parallel_base_bottom -> ")
________print "Trapezoids area of parallel base top and bottom", parallel_base_top, \
______________"and", parallel_base_bottom, "and height", height, "is", \
______________1.0/2.0*(parallel_base_top + parallel_base_bottom)*height

def getUserInput(text_to_display):
____input = raw_input(text_to_display)
____return int(input)

choice = raw_input("Which type of area you would like to calculate (R/T/C/Z)? -> ")
if choice == "R" or choice == "r":
____calculateArea("Rectangle")
elif choice == "T" or choice == "t":
____calculateArea("Triangle")
elif choice == "C" or choice == "c":
____calculateCircleAndTrapezoids("Circle")
elif choice == "Z" or choice == "z":
____calculateCircleAndTrapezoids("Trapezoids")
else:
____print "Please type R,T,C or Z to choose the type of area to calculate"

แบบที่ 3

def calculateArea(area,check):
____print "Program to calculate Area of ",area
____if check == "r" or check == "t":
________base = getUserInput("Please enter base -> ")
________height = getUserInput("Please enter height -> ")
________if check == "r" :
____________print "Rectangle area of base=", base, "and height=", height, "is", \
__________________base*height
________elif check == "t" :
____________print "Triangle area of base=", base, "and height=", height, "is", \
__________________0.5*base*height
____elif check == "c":
________radius = getUserInput("Please enter radius -> ")
________print "Circle area of radius=", radius, "is", 3.14159*(radius*radius)
____elif check == "z":
________parallel_base1 = getUserInput("Please enter parallel base 1-> ")
________parallel_base2 = getUserInput("Please enter parallel base 2-> ")
________height = getUserInput("Please enter height -> ")
________print "Trapezoids area of parallel base1=", parallel_base1, '\n'\
______________"parallel base2=", parallel_base2, '\n'"and height=", height,"is",\
______________0.5*(parallel_base1+parallel_base2)*height

def getUserInput(text_to_display):
____input = raw_input(text_to_display)
____return int(input)

choice = raw_input("Which type of area you would like to calculate (R/T/C/Z)? -> ")
if choice == "R" or choice == "r":
____calculateArea("Rectangle","r")
elif choice == "T" or choice == "t":
____calculateArea("Triangle","t")
elif choice == "C" or choice == "c":
____calculateArea("Circle","c")
elif choice == "Z" or choice == "z":
____calculateArea("Trapezoids","z")
else:
____print "Please type R,T,C,Z to choose the type of area to calculate "

แบบที่ 4

def getUserInput(text_to_display):
____input = raw_input(text_to_display)
____return int(input)

def calculateAREA(Area_of):
____print "Program to calculate Area of", Area_of
____if Area_of == "Circle":
________radious = getUserInput("Please enter radious -> ")
________result = 3.14159*radious*radious
____elif Area_of == "Trapezoid":
________parallel_line1 = getUserInput("Please enter length of 1st parallel line -> ")
________parallel_line2 = getUserInput("Please enter length of 2nd parallel line -> ")
________height = getUserInput("Please enter height -> ")
________result = (parallel_line1+parallel_line2)*height*0.5
____else:
________base = getUserInput("Please enter base -> ")
________height = getUserInput("Please enter height -> ")
________if Area_of == "Rectangle":
____________result = base*height
________else:
____________result = base*height*0.5
____print Area_of, "area is", result

i = 0
while i == 0:
____choice = raw_input("Which type of area you would like to calculate\
_______________________(R,T,Z or C)? -> ")
____if choice == "R" or choice == "r":
________calculateAREA("Rectangle")
________i += 1
____elif choice == "T" or choice == "t":
________calculateAREA("Triangle")
________i += 1
____elif choice == "C" or choice == "c":
________calculateAREA("Circle")
________i += 1
____elif choice == "Z" or choice == "z":
________calculateAREA("Trapezoid")
________i += 1
____else:
________print "Please type R,T,Z or C to choose the type of area to calculate."

แบบที่ 5

def calculateCircleArea():
____print "Program to calculate Area of Circle"
____radius = getUserInput("Please enter radius -> ")
____print "Circle area of radius", radius ,"is",3.14159*(radius**2)

def calculateTrapezoidsArea():
____print "Program to calculate Area of Trapezoids"
____parallel_1 = getUserInput("Please enter parallel_base1 -> ")
____parallel_2 = getUserInput("Please enter parallel_base2 -> ")
____height = getUserInput("Please enter height -> ")
____print "Trapezoids area of parallel_base1", parallel_1,\
__________"\nTrapezoids area of parallel_base2", parallel_2,"\nand height", height,\
__________"\nis", 0.5*(parallel_1+parallel_2)*height

def getUserInput(text_to_display):
____input = raw_input(text_to_display)
____return int(input)

def baseadnheight(area):
____print "Program to calculate Area of ",area
____base = getUserInput("Please enter base -> ")
____height = getUserInput("Please enter height -> ")
____if(area=="Rectangle"):
________a = base*height
____else:
________a = base*height*0.5
____print area," area of base", base,"and height", height,"is", a

choice = raw_input("Which type of area you would like to calculate (R/T/C/Z)? -> ")
if choice == "R" or choice == "r":
____baseadnheight("Rectangle")
elif choice == "T" or choice == "t":
____baseadnheight("Triangle")
elif choice == "C" or choice == "c":
____calculateCircleArea()
elif choice == "Z" or choice == "z":
____calculateTrapezoidsArea()
else:
____print "Please type R, T, C or Z to choose the type of area to calculate"

แบบที่ 6

def getUserInput(text_to_display):
____input = raw_input(text_to_display)
____return int(input)

def calculateRectangle():
____print "Program to calculate Area of Rectangle"
____base = getUserInput("Please enter base -> ")
____height = getUserInput("Please enter height -> ")
____print "Rectangle area of base", base, "and height", height, "is", base*height

def calculateTriangle():
____print "Program to calculate Area of Triangle"
____base = getUserInput("Please enter base -> ")
____height = getUserInput("Please enter height -> ")
____print "Triangle area of base", base, "and height" , height , "is",\
__________0.5*base*height

def calculateCircle():
____print "Program to calculate Area of Circle"
____radius = getUserInput("Please enter radius -> ")
____print "Circle area of radius", radius , "is", 3.14159*(radius**2)

def calculateTrapezoids():
____print "Program to calcultae Area of Trapezoids"
____parallel_base1 = getUserInput("Please enter 1st parallel base -> ")
____parallel_base2 = getUserInput("Please enter 2nd parallel base -> ")
____height = getUserInput("Please enter height -> ")
____print "Trapezoids area of parallel base", parallel_base1, parallel_base2,\
__________"and height",height, "is", 0.5*((parallel_base1+parallel_base2)*height)

choice = raw_input("Which type of area you would like to calculate (R/T/C/Z)? -> ")
if choice == "R" or choice == 'r':
____calculateRectangle()
elif choice == "T" or choice == "t":
____calculateTriangle()
elif choice == "C" or choice == "c":
____calculateCircle()
elif choice == "Z" or choice == "z":
____calculateTrapezoids()
else:
____print "Please type R, T , C or Z to choose the type of area to calculate"