python-statement-example
python-statement-example

Basic พื้นฐานของเวลาเรียนภาษาใหม่นอกจาก syntax, data structure ก็คือเรื่องของ statements ต่างๆพวก for-loop, while-loop, if-elif, iterators และ การ access ต่างๆที่แปลกออกไปในแต่ล่ะภาษา ซึ่งบทความนี้ก็จะรวบรวม statement ที่ควรรู้ใน python เพราะว่าการจะเปลี่ยนหัวจาก Java มาเป็น Python มันอาจจะมีการ งง ได้เล็กน้อย เพราะว่า Python มันมีลักษณะการเรียกและสร้าง statement แตกต่างออกไปจากภาษาอื่นบ้าง

อีกอย่างถ้าเราไม่รู้จัก statement แบบกว้างๆก่อนเวลานําไปใช้มันก็จะพยายามทู้ซี้ใช้เท่าที่เรารู้และมีผลในการเลือกใช้เครื่องมือที่ไม่เหมาะสม และสุดท้ายโปรแกรมก็มีบั๊กนั้นเอง (เวลาเขียนโปรแกรมใน Python จริงๆเราควร follow ตาม code style ของ Pythonic way ด้วยน่ะ 🙂 )

Compound Statements ที่ควรรู้

compound statements คือ statement ที่ควบคุมการ execution ของ statement อื่นๆ ฟังแล้วอาจจะงงๆ ว่าพูดถึงอะไร มันก็คือพวก if,while,for,try,with ที่เรารู้จักกันนั้นแหละ ซึ่งพวกนี้เวลาเขียนโปรแกรมมันจะควบคุมและกําหนดให้เกิด execution นั้นเอง

จริงๆเจ้าพวกนี้ไม่ต้องพูดมากหรอก เพียงแต่ว่าถ้ารู้จักวิธีการอ่าน docs ของ Python มันก็จะเข้าใจง่ายขึ้น เช่น

if

if-elif-else-python
if-elif-else-python (https://docs.python.org/3/reference/compound_stmts.html#if)

อ่านตอนแรกก็ งงๆ รูปแบบ format มันน่ะ แต่พอมองดีๆ ก็อ่อ มันให้แบ่งเป็น statement ต่อบรรทัด จะเห็นว่าช่องที่เป็นคําสั่งมันจะใส่ “…” ไว้ ถ้าอย่างนี้ก็หมายถึง “if” แล้วก็มี expression เช่น x>1 หลังจากนั้นก็ “:” ทําอะไรอย่างตรงคําว่า suite แล้วก็ใส่ “elif” ไปได้เรื่อยๆ เพราะมี * อยู่ แล้วสุดท้ายถ้าไม่อยากให้ตก case ไหนเลยก็ “else” ธรรมดา เป็นตัวจบ! 🙂

จริงๆมันอยากตรงอ่าน docs เนี่ยแหละ LOL


age = 100
if age == 200:
 print "age not equal to 200"
 print age
elif age == 150:
 print "age not equal to 150"
 print age 
elif age == 100:
 print "age not equal to 100"
 print age
else:
 print "age not equal to anything"
 print age 

ถ้าอยากใช้ Ternary Opeator ใน python ก็

ternary-operator
ternary-operator (https://www.webucator.com/how-to/how-do-ternary-operator-assignment-python.cfm)

candy = 'sweet' if type == 'chocolate' else 'sour'

While

while-python
while-python (https://docs.python.org/3/reference/compound_stmts.html#while)

index = 0 
while index < 10: 
 index = index + 1 
 print('Index now equal to {x}'.format(x=index))

For

เจ้าตัวนี้น่าจะใช้มากสุดล่ะ

for-in-python
for-in-python (https://docs.python.org/3/reference/compound_stmts.html#for)

เจ้า for นี้จะโยน target list ไปให้มัน iterate ออกมา ลองนึกถึงใน Java น่ะ เราก็จะใช้อะไรประมาณข้างล่างนี้


String[] list = {"x","y","z"};

for(int i = 0; i < list.length() ; i++){

   System.out.println(list[i]);
}

เพื่อให้มัน Iterate กับ list แต่ถ้าใน python ตามจาก doc ข้างบนจะใช้อะไรง่ายๆแบบ


#1

list = ['x','y','z']

for alphabet in list:

   print(alphabet)

#2 - ใช้ array slicing แบบในบทความที่แล้วก็ได้

for alphabet in a[:]:

   print(alphabet)

#3 - วิธีการใช้ sequence ของ Number แบบ Java 

#เจ้าตัว len() จะบอก size ของ target list

#เจ้าตัว range() จะสร้าง sequence ของตัวเลขจาก 0,จนถึง size ของ target list ด้วยคําสั่ง len() นั้นเอง

for index in range(len(list)):

   print(list[index])

สั้นง่ายและก็กระชับกว่ากันเยอะเลยปะล่ะ? 🙂 โดยส่วนตัวแอบชอบ python มากกว่าน่ะ ที่มัน readablity มากขนาดนี้

เกร็ดความรู้: บางคนอาจจะเคยเห็นคนใช้ range() กับ xrange() แล้วสงสัยว่ามันแตกต่างกันยังไง?

range = return list object

xrange = return xrange object

แล้วยังไง? คือ xrange มันไม่ได้สร้าง list ตอน runtime เหมือน range แต่มันใช้ yield แทน! แปลว่ามันไม่ได้ return static list ก่อนใหญ่ๆๆๆๆๆออกมา คือตอนนีเอาจจะนึกภาพไม่ออก แต่ลองคิดถึง list ที่มีขนาด 1M สิ แล้วสร้างออกมา ลองคิดถึง memory ที่ใช้ มันคงต้องมีการค้างแน่ๆ ดังนั้นพวกใหญ่ขนาดนั้นควรจะใช้ xrange แทนนั้นเอง 🙂 ลองอ่านเองหลายๆที่ก็ได้น้า range vs xrange

Try

try-python
try-python (https://docs.python.org/3/reference/compound_stmts.html#try)

ใน Java จะเป็น try-catch เพื่อจับ exception ใช่มั้ย แต่ใน python เป็น try กับ except แต่หลักการทํางานเหมือนกันนั้นแหละ  (แต่เราสามารถมีหลาย except clause ได้ ก็ใส่ comma ต่อกันไปได้เรื่อยๆเลย)

try-except-handling-exception
try-except-handling-exception (https://docs.python.org/3/tutorial/errors.html#handling-exceptions)

With

with-statement-python
with-statement-python (https://docs.python.org/3/reference/compound_stmts.html#the-with-statement)

เจ้า With ได้เข้าใจยากเพราะมันลักษณะเดี่ยวกันกับ using ใน .Net นั้นเอง โดยส่วนมากเราจะใช้กับ file stream เป็นส่วนใหญ่

เพราะมันจะ wrap execution เอาไว้ โดยใช้ context manager ให้เรา แปลว่าไร? แปลว่า การใช้ context manager มันจะมีการเข้าใช้ __enter__() และ __exit__() เมื่อออก ด้วยวิธีการนี้เมื่อเราใช้พวก file stream จะทําให้เรามั่นใจว่ามันปิดจริงๆ


with open('output.txt','w') as f:

   f.write('Hi there!)

Functions

Basic Function

นี้คือรูปแบบการสร้าง function ใน python


# statement for declare function 
def do_something():
   print('Hello World')

do_something()
#output: Hello World

# statement declare nested function
def outter_function():
   print('do something')

   def nested_function():
       print('nested_function')

outter_function()
#output - do something
#       - nested_function

แต่รู้มั้ยว่า function ใน python มีความสามารถ return multiple values ได้?​
คือโดยปกติแล้ว function ของเราจะมีความสามารถ return value กลับไปได้แค่ตัวเดียวเท่านั้น เช่น method A() return list object ที่จะ contains อะไรก็ได้ แต่ก็ยังเป็น list object เพียงอย่างเดียว

แต่ใน python เราสามารถ return multiple values ได้ด้วย tuple นั้นเอง ตัวอย่างแบบนี้


def do_something(A,B):
   return_1 = A + ' Hello'
   return_2 = B + ' World'
   #construct tuple and collection data
   return_obj = (return_1,return_2)
   return return_obj

data_1, data_2 = do_something('Test1','Test2')
print(data_1)
#output: Test1 Hello
print(data_2)
#output: Test2 World

ด้วยการประยุกต์เอาคุณสมบัติของ pack & unpack tuple มาใช้ในการ return value เลยทําให้เราสามารถรับส่งค่าแบบนี้ได้นั้นเอง 🙂

  • เรื่องน่ารู้ nonlocal keyword ใน python เวลาใช้กับ Nested function จะทําให้เรา define scope เฉพาะใน function นั้นๆ

Functions with default argument


def eating_pizza(price,size=m):
  print(price,size)

# default size = m นั้นเอง

Functions with flexible argument


# flexible with *arguments

def eating_pizza(*args):

   for data in args:
      print(data)

   print('finish')

eating_pizza("pizza1", "pizza2", "pizza3", "pizza4", "pizza5")

# flexbile with **keyword arguments

def print_all(**kwargs):

   for key,value in kwargs.items():
      print(key + ": " + value)

   print('finish')

print_all(name="Mart", website="Howtoautomate.in.th", status="active")

Iterators & Iterables

จริงๆ 2 คํานี้มีความหมายคนล่ะอย่างกันครับ 🙂

Iterator ตือ object ที่เก็บ state และทําหน้าที่เลื่อน index ไปค่าตัวต่อไป

ส่วน Iterable คือ object ที่ return iterator ออกมา เพื่อนํา object ใช้วนไปค่าถัดไปนั้นเอง
โดยดูจากตัวอย่างนี้ได้


# list of string 
data = ['A', 'B', 'C', 'D']

# Print each list item in data using a for loop
for alphabet in data:
    print(alphabet)

print('---')

# สร้าง iterator จาก data ด้วยคําสั่ง iter()
iterator_alphabet = iter(data)

# Print each item from the iterator ด้วยคําสั่ง next()
print(next(iterator_alphabet))
print(next(iterator_alphabet))
print(next(iterator_alphabet))
print(next(iterator_alphabet))

เราสามารถเช็คได้ว่า Object นั้นเป็น Iterator หรือไม่จาก


import collections
a = [1,2,3]
isinstance('a',collections.Iterable) 
#output: True


Zip

โดยปกติแล้วเวลาที่เราต้องการจะรวม Iterables 2 ตัวเข้าด้วยกัน เราจะใช้ zip function ที่เป็นความหมายว่าเอาหลายๆอย่างมารวมเข้าด้วยกันคล้ายๆ winzip นั้นเอง

โดยเมื่อใช้คําสั่ง zip แล้วมันจะออกมาเป็น iterator tuple ทําให้เราต้องแปลงเป็น list,set,dict อย่างที่เราต้องการอีกที


# zip syntax
zip(*iterables)

numberList = [1, 2, 3]
strList = ['one', 'two', 'three']

# No iterables are passed 
result = zip()

# Converting itertor to list
resultList = list(result)
print(resultList)

# Converting itertor to dict
resultSet = dict(result)
print(resultSet)

ส่วนใหญ่เรานํามาใช้เมื่อต้องการจะรวม 2 iterables เข้าด้วยกันในรูปแบบ key,value หรืออีกความหมายคือแปลงจาก list to dictionary เพื่อจะนําไปใช้งานต่อนั้นเอง 🙂

สรุป

จําครัช 🙂 บอกได้อย่างเดียวไปลองเขียนเล่นๆดูจะเข้าใจว่ามันคืออะไร แต่หลักการณ์แล้วพวกนี้คือ statement ที่เราควรจะรู้ไว้ เพื่อเข้าใจว่า python หลักๆมีแค่นี้แหละ

0 0 vote
Article Rating
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments