บทนี้เราจะใช้เวลาเรียนเยอะหน่อยนะครับ แอดแนะนำให้แบ่งเรียน 3 พาร์ท
1. เรียนตั้งแต่เริ่มจนจบ list
2. เรียนหัวข้อ control flow
3. ปิดท้ายด้วย functions จนจบทั้ง module

Key Concept

เวลาหัดเขียนโปรแกรม ทุกภาษาจะแบ่งเป็น 5 คอนเซปต์หลัก ถ้าเข้าใจพื้นฐานก็จะเขียนภาษานั้นได้ไม่ยากเลย

  1. Variable
  2. Data Type
  3. Data Structure
  4. Control Flow
  5. Function

Module ที่แล้วเราเรียนเรื่อง variable และ data type ของ python ส่วนเนื้อหาใน module นี้จะโฟกัสที่หัวข้อ 3-5 เมื่อเรียนจบนักเรียนจะสามารถเขียนและพัฒนา python program พื้นฐานได้ด้วยตัวเอง

Review

หลังจากดูวีดีโอจบแล้ว นักเรียนสามารถรีวิวโค้ดและคอนเซ็ปต์การเขียนโปรแกรม python ได้ในบทความด้านล่าง แอดทำสารบัญไว้ให้ นักเรียนสามารถคลิกเลือกหัวข้อรีวิวได้เลย

Data Structure

Data Structure คือโครงสร้างข้อมูล หรือพูดง่ายๆคือการนำตัวแปรหรือ data type มาประกอบร่างรวมกันเป็นโครงสร้างที่ใหญ่ขึ้น (structure) โดย python จะมีโครงสร้างพื้นฐานอยู่สามแบบหลักๆ ประกอบด้วย

  • List
  • Tuple
  • Dictionary

คอร์สเรียนนี้เราจะโฟกัสที่การสร้างและจัดการ list เป็นหลัก ซึ่งเป็น structure พื้นฐานที่เราใช้บ่อยที่สุด

List

เราสามารถสร้าง list ด้วยเครื่องหมาย [] และใส่ข้อมูลหรือ item ที่เราต้องการใน list โดย list สามารถเก็บข้อมูลประเภทใดก็ได้ ตั้งแต่ int, float, str, bool หรือแม้แต่ data structure แบบอื่นๆ

เราสามารถนับจำนวน item ที่อยู่ใน list ด้วยฟังก์ชัน len()

## create empty list
empty_list = []

## create shopping list
shopping_list = ['egg', 'milk', 'bread', 'drinking water']

## how many items in list
len(shopping_list)

เราสามารถเช็คได้ด้วยว่า item นั้นอยู่ใน list หรือเปล่าด้วย in keyword ถ้า milk อยู่ใน shopping_list python จะส่งค่า True (หรือถ้าไม่อยู่จะส่งค่า False) กลับมา

## check item in list
print('milk' in shopping_list)

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

## example of list with mixed types
mixed_list = [100, 200, 3.50, "python", True, False, ["hello", "world"]]

List Indices

วิธีการดึงข้อมูลที่อยู่ใน list คือการทำ slicing หรือ indexing โดย index ในภาษา python จะเริ่มที่เลขศูนย์ ถ้าเราใช้ negative index -1 จะดึงข้อมูลตัวสุดท้ายที่อยู่ใน list นั้นๆ อันนี้จะเหมือนกับที่เราเรียน string ในบทก่อน

## indices
print(shopping_list[0])    ## egg
print(shopping_list[1])    ## milk
print(shopping_list[2])    ## bread
print(shopping_list[3])    ## drinking water
print(shopping_list[-1])   ## drinking water

มาลองดูวิธีการ slice list กันบ้าง ทบทวนว่า [0:2] จะดึงข้อมูล index ที่ 0, 1 แต่ไม่รวม 2 ถ้าเราเขียน [1:] จะเป็นการดึงข้อมูลตั้งแต่ index ที่ 1 ไปจนถึงตัวสุดท้ายของ list นั้นๆ

## slicing items
print(shopping_list[0:2])   ## ['egg', 'milk']
print(shopping_list[0:3])   ## ['egg', 'milk', 'bread']
print(shopping_list[1:])    ## ['milk', 'bread', 'drinking water']

List Manipulation & Method

เราใช้เครื่องหมาย + เพื่อรวมลิสต์ list + [new items] ได้ตามตัวอย่างนี้

## merge list
new_shopping_list = shopping_list + ['snack', 'cereal']
print(new_shopping_list)

List จะมีฟังก์ชันเฉพาะของตัวมันเองหรือที่เราเรียกว่า “list methods” ตัวหลักๆที่เราใช้บ่อยๆคือ

  • .append()
  • .pop()
  • .sort()

.append() ใช้เพิ่ม item ใหม่ต่อท้าย list เก่าของเรา ตัวอย่างนี้เราเพิ่ม tomato เข้าไปที่ new_shopping_list

## add new item using append method
new_shopping_list.append('tomato')
print(new_shopping_list)

## ['egg', 'milk', 'bread', 'drinking water', 'tomato']

ถ้าเราต้องการลบ item ใน list ให้ใช้ .pop() โดย default pop จะลบ item ตัวสุดท้ายใน list เราสามารถกำหนด index ของ item ที่ต้องการลบได้ตามตัวอย่างนี้

## remove the last item
new_shopping_list.pop()
print(new_shopping_list)   ## ['egg', 'milk', 'bread', 'drinking water']

## remove index 1
new_shopping_list.pop(1)
print(new_shopping_list)   ## ['egg', 'bread', 'drinking water']

และ list method ตัวสุดท้ายคือ .sort() ใช้ในการเรียงข้อมูลใน list สามารถ sort ได้ทั้งตัวเลขและตัวอักษร default จะเป็นการเรียงจากน้อยไปมาก (หรือ a-z) ถ้าเราเซ็ต reverse = True จะเป็นการเรียงจากมากไปน้อย

new_shoping_list.sort()
new_shoping_list.sort(reverse=True)

Update Value in List

List คือ data structure แบบ mutable แปลว่าเราสามารถอัพเดทค่าที่อยู่ใน list ได้ ตัวอย่างด้านล่างเราอัพเดทค่าของ item แรกใน marvel เปลี่ยนชื่อ Iron Man เป็น Iron Woman

marvel = ['Iron Man', 'Thor', 'Spider Man', 'Black Widow']

## update first item in list
marvel[0] = 'Iron Woman'
print(marvel)   ## ['Iron Woman', 'Thor', 'Spider Man', 'Black Widow']

Control Flow – For Loop

มาดูหัวข้อ control flow กันบ้าง คอร์สนี้เราจะโฟกัสที่การเขียน for และ if else ซึ่งเป็นสองตัวหลักที่เราใช้ในการเขียนโปรแกรมที่ซับซ้อนขึ้น โดย control flow คือการควบคุมพฤติกรรมของโปรแกรม (branching, loop) อธิบาย branching เช่น if True do this, if False do that.

มาเริ่มกันที่ for loop กันก่อน อันนี้ไม่ยากเลย เราใช้ for กับ in keywords ในการเขียน loop และ data structure ที่เหมาะกับการเขียนลูปที่สุดคือ list นั่นเอง ด้านล่างแอดเขียน for loop เพื่อปริ้นท์ชื่อ hero ลงใน console hero เป็น dummy name ที่เราสามารถเปลี่ยนได้ (จะเรียกมันว่าอะไรก็ได้) โดยเราใช้ชื่อนี้อ้างอิงถึง item ที่อยู่ใน list ของเรา

## example list
marvel = ['Iron Woman', 'Thor', 'Spider Man', 'Black Widow']

## control flow - for loop
for hero in marvel:
  print(hero)

ข้อดึของการเขียน for loop คือโปรแกรมของเราจะเขียนสั้นลง ทำงานได้เหมือนเดิม efficient! สถานการณ์ที่เหมาะกับการเขียน for loop คือเวลาที่เราต้อง copy & paste โค้ดเดิมซ้ำๆมากกว่าสามรอบขึ้นไป

ลองดูตัวอย่างนี้ สมมติเราอยากจะปริ้นท์ “Hello ” + hero + “!” กับ hero ทุกตัวใน marvel list เราต้องพิมพ์ print() ทั้งหมดสี่รอบ และเปลี่ยนค่า index ด้วยมือเอง การเขียนโปรแกรมแบบนี้มีโอกาสผิดสูง (error prone!)

## these are very copy & paste codes!
print("Hello " + marvel[0] + "!")
print("Hello " + marvel[1] + "!")
print("Hello " + marvel[2] + "!")
print("Hello " + marvel[3] + "!")

เวลาเจอสถานการณ์ที่ต้องเขียนโค้ดซ้ำแบบนี้ for loop to the rescue! เปลี่ยนมาใช้ for loop ด้วยโค้ดถัดไป เขียนโค้ดแค่สองบรรทัดได้ผลเหมือนด้านบน 100% ถูกต้องแม่นยำ มีโอกาสเขียนผิดน้อย

for hero in marvel:
  print("Hello " + hero + "!")

มาลองเปลี่ยนชื่อ dummy จาก hero เป็น character บ้าง เราสามารถใช้ string method .upper() กับ character เพื่อเปลี่ยนชื่อตัวละครเป็นตัวพิมพ์ใหญ่ทั้งหมด

for character in marvel:
  print("Hello " + character.upper())

for loop คือ finite loop แปลว่าเรารู้จำนวน item ที่อยู่ใน list สามารถบอกได้ว่า loop จะวิ่งทั้งหมดกี่รอบ

[Advanced] List Comprehension

Python มีเทคนิคที่เรียกว่า list comprehension ที่ใช้อัพเดทค่าของ item ใน list แบบไม่ต้องใช้ for loop block เหมือนโค้ดที่เราเขียนในหัวข้อ docstring

วีดีโอนี้แอดสร้าง list ใหม่ด้วย list comprehension โดยเพิ่มคำว่า “Hello ” + hero + “!” จบในหนึ่งบรรทัด

ตัวอย่าง list comprehension (หนึ่งบรรทัด) แทนการเขียน for loop

## original list
marvel = ['Iron Man', 'Thor', 'Captain America', 'Captain Marvel', 'Black Widow']

## new list using list comprehension
new_marvel = ["Hello " + hero + "!" for hero in marvel]
print(new_marvel)

ถ้าเราต้องสร้าง new_marvel ด้วย for loop โค้ดของเราจะมีอย่างน้อย 3 บรรทัด

new_marvel = []
for hero in marvel:
  new_marvel.append("Hello " + hero + "!")

Control Flow – If Else

Control flow ตัวที่สองที่เราสอนในคอร์สนี้คือ if else ใช้ในการเขียนเงื่อนไขทำ branching logic ง่ายๆ เช่น โปรแกรมตัดเกรดนักเรียน ถ้าคะแนน score >= 80 สอบผ่าน คะแนนอื่นๆ else คือสอบตก

เวลาเขียน if จะตามด้วยเงื่อนไข ถ้าเงื่อนไขนี้เป็นจริง (evaluate to True) python จะรันโค้ดใน if block ถ้าเงื่อนไขไม่เป็นจริง (evaluate to False) python จะรันโค้ดใน else block แทน

## our first example
score = 87
if score >= 80:
  print("Passed")
else:
  print("Failed")

ถ้าเกรดของเรามีหลายช่วงคือ A B C D เราใช้ elif keyword เพื่อเขียนหลายๆเงื่อนไขได้ (else + if = elif)

  • if ถ้า score >= 90 ได้เกรด A
  • elif ถ้า score >= 80 แต่ไม่ถึง 90 ได้เกรด B
  • elif ถ้า score >= 70 แต่ไม่ถึง 80 ได้เกรด C
  • else อื่นๆ ได้เกรด D
## if we have many conditions
score = 87
if score >= 90:
  print("A")
elif score >= 80:
  print("B")
elif score >= 70:
  print("C")
else:
  print("D")

สังเกตวิธีการเขียน if elif และ else block หลังเครื่องหมาย : ให้เราขึ้นบรรทัดใหม่ และย่อหน้าอย่างน้อย 2 spaces ภาษา python ใช้ white space ในการกำหนด block ของโปรแกรมที่เรารัน

For + If in Program

เวลาเราเขียนโปรแกรม เรามีอิสระที่จะใช้ for + if ในโปรแกรมของเรา the limit is only your imagination. ตัวอย่างด้านล่างเราเขียน for loop สำหรับ hero แต่ละตัวเพื่อเช็คว่าเค้าเป็นผู้ชายหรือผู้หญิง

โปรแกรมจะปริ้นท์ชื่อฮีโร่ ตามด้วยประโยค “is a male/ female character.” ตามเพศ สังเกตวิธีการย่อหน้า (white space) ที่เราเขียนในโปรแกรม

  • if-else blocks ถูกเขียนใน for loop block
  • print บรรทัดแรกถูกเขียนใน if block
  • print บรรทัดที่สองถูกเขียนใน else block
marvel = ['Iron Man', 'Thor', 'Captain America', 'Captain Marvel', 'Black Widow']

for hero in marvel:
  if hero == "Captain Marvel" or hero == "Black Widow":
    print(hero + " is a female character.")
  else:
    print(hero + " is a male character.")

ผลลัพธ์ที่แสดงใน console Captain Marvel และ Black Widow คือ female character

Iron Man is a male character.
Thor is a male character.
Captain America is a male character.
Captain Marvel is a female character.
Black Widow is a female character.

White Space

Python ใช้ย่อหน้าหรือ indentation ในการกำหนด block ของโปรแกรมที่เรารัน เวลาเขียน for loop, if else และ def ในหัวข้อถัดไป หลังเครื่องหมาย : เคาะ enter หนึ่งครั้ง ต้องย่อหน้าอย่างน้อย 2 spaces เสมอ หรือกด TAB บนคีย์บอร์ดได้เลย

## use white space to define program
if condition is True:
  do something

ถ้าเราไม่ย่อหน้า (แนะนำอย่างน้อย 2 spaces) โปรแกรมเราจะรันไม่ออก error นี้เรียกว่า IndentationError

## this program will throw ERROR
if condition is True:
do something 

ข้อดีของ white space คือโค้ดเราจะสะอาดมาก นี่คือจุดเด่นของภาษา python เลย แต่ถ้าเราย่อหน้าผิดนิดเดียว โปรแกรมของเราก็อาจจะรันไม่ออกเลย ฉะนั้นตอนเขียนโปรแกรมต้องคอยเช็ค whitespace ให้ดีเสมอ ถ้าคิดว่าจะใช้ 2 spaces ก็ให้ใช้ 2 spaces ต่อเนื่องตลอดทั้งโปรแกรม (consistency)

Note – ถ้าเราใช้โปรแกรม text editor สำหรับการเขียนโค้ดเช่น VS Code (ที่เราจะใช้ใน final project) ตัว text editor จะย่อหน้าให้เราอัตโนมัติเลย รวมถึงทำพวก syntax highlight ด้วย

Functions

Functions คือ reusable piece of code ที่เราเขียนขึ้นมาเพื่อนำไปใช้ซ้ำได้ โดยเฉพาะ task ที่เราทำเป็นประจำ เช่น การแสดงผลข้อความใน console เราใช้กันบ่อยมากจนเกิดเป็นฟังก์ชัน print() ขึ้นมา

วิธีการเขียนฟังก์ชันใน python เราใช้ def keyword (มาจากคำว่า define) และย่อหน้าเพื่อกำหนด block ของ function content ฟังก์ชันที่เราเขียนจะมีหรือไม่มี input (parameter/ argument) ก็ได้

  • greeting() ไม่มี parameter ใดๆเลย
  • greeting2(name) มีหนึ่ง parameter ชื่อว่า name
  • add_two_num(a, b) มีสอง parameters ชื่อว่า a และ b
## function with no parameter
def greeting():
  print("Hello!")

## function with one parameter
def greeting2(name):
  print("Hello! " + name)

## function with two parameters
def add_two_num(a, b):
  return a + b

เราสามารถตั้งค่า default ให้กับ parameter ของเราได้ด้วย ฟังก์ชัน cube() ด้านล่างมีสองพารามิเตอร์ชื่อว่า value และ power โดยเรากำหนด power = 3 ไว้เป็นค่าเริ่มต้น

  • cube(2) จะเท่ากับการเรียกฟังก์ชัน 2**3 ใช้ค่า default power ได้คำตอบเท่ากับ 8
  • cube(2, 4) จะเท่ากับการเรียกฟังก์ชัน 2**4 ได้คำตอบเท่ากับ 16 เราเปลี่ยนค่า default power จาก 3 เป็น 4
## default argument
def cube(value, power=3):
  return value ** power

## test function
cube(2)     ## 8
cube(2, 4)  ## 16

ภายใน function ที่เราเขียนจะมีกี่บรรทัดก็ได้ รวมถึงการใช้ control flow for if else เพื่อกำหนดการทำงานของฟังก์ชันนั้นๆ โค้ดบล๊อคถัดไปเราใช้ for loop เพื่อปริ้นท์คำว่า “Hello ” + hero + “!” กับ hero แต่ละตัวใน list

## using control flow in function
def greeting_hero(heros):
  for hero in heros:
    print("Hello " + hero + "!")

Get Input From Users

เราสามารถรับ string input จาก user ด้วยฟังก์ชันชื่อว่า input() เมื่อกดรันฟังก์ชันนี้ python จะ prompt user เพื่อขอรับข้อมูล ตัวอย่างนี้เราถามชื่อของ user มาเก็บในตัวแปร your_name

your_name = input("What's your name? ")
print(your_name)

Use case ที่ต้องใช้ฟังก์ชัน input() บ่อยๆคือการขอ username และ password และเขียน if เพื่อตรวจสอบความถูกต้อง ถ้า username/ password ถูกต้อง โปรแกรมถึงจะรันต่อ ถ้าผิดให้ terminate ออกจากโปรแกรม

def get_access():
  username = input("username: ")
  password = input("password: ")
  if username == "admin" and password == "12345":
    print("Correct!")
  else:
    print("Your username/password is incorrect!")

Return vs. Print

ความแตกต่างของ return และ print() ในฟังก์ชันคือ return ใช้สร้างตัวแปรใหม่ได้ (create new object) แต่ print() จะไม่สามารถทำได้ ตัวอย่างด้านล่าง ในฟังก์ชัน cube() เราใช้คำสั่ง print() เพื่อแสดงผล value ** power พอเรา assign คำตอบไปที่ตัวแปร result ค่าของ result ที่ได้กลับมาคือ None

  • return keyword ใช้สร้างตัวแปรใหม่ได้
  • print() แค่ปริ้นท์ผลลัพธ์ของฟังก์ชันใน console
## function using print
def cube(value, power=3):
  print(value ** power)

## test function
result = cube(5, 3)
print(result)        ## None

เวลาเราเขียนฟังก์ชัน เราจะใช้ return keyword ถ้าเราต้องการให้ฟังก์ชันของเราส่งค่าไปฝากที่ตัวแปรหรือ object อื่นๆใช้งานต่อได้

## function using return keyword
def cube(value, power=3):
  return value ** power

## test function
result = cube(5, 3)
print(result)        ## 125

Docstring

เราสามารถเขียนคำอธิบายฟังก์ชันที่เรา def ขึ้นมาได้ด้วย doctring วิธีเขียน docstring เราจะใช้เครื่องหมาย triple quote """ เพื่อเขียน string ยาวได้มากกว่าหนึ่งบรรทัด โดย docstring จะอยู่ที่บรรทัดต่อจาก def

def add_two_num(val1, val2):
  """add two numbers"""
  return val1 + val2

ข้อมูลที่เราใส่ใน docstring มีสามอย่างคือ 1. ฟังก์ชันนี้ใช้ทำอะไร 2. input ของฟังก์ชันคืออะไร และ 3. output ออกมาหน้าตาเป็นอย่างไร ฟังก์ชัน grading_auto() ใช้ตัดเกรดนักเรียนหลายๆคนพร้อมกัน input คือ list ของคะแนนสอบ และ output คือเกรดมีสองค่าคือ “Passed” หรือ “Failed”

ขั้นตอนการทำงานของฟังก์ชัน grading_auto() มีดังนี้

  • เราสร้าง empty list ชื่อว่า result ขึ้นมาก่อน เพื่อใช้เก็บ final grade ของนักเรียนแต่ละคน
  • เขียน for loop คู่กับ if else เพื่อตัดเกรดนักเรียนทีละคน
  • นำเกรดของนักเรียนแต่ละคน .append() ใส่เข้าไปที่ตัวแปร result
  • return ตัวแปร result ในบรรทัดสุดท้ายของฟังก์ชัน
def grading_auto(scores):
  """
  grading auto will grade student scores
  input: a list of numeric scores
  output: list of grade (Passed or Failed)
  """
  result = []
  for score in scores:
    if score >= 80:
      result.append("Passed")
    else:
      result.append("Failed")
  return result

## test function
scores = [89, 45, 70, 95, 99]
grades = grading_auto(scores)  
print(grades)    ## ['Passed', 'Failed', 'Failed', 'Passed', 'Passed']

เราสามารถเรียกดู docstring ของฟังก์ชันได้สองวิธี 1. ปริ้นท์ .__doc__ attribute ของ function หรือ 2. อ่าน help document ของฟังก์ชันนั้นๆ

print(grading_auto.__doc__)
help(grading_auto)

Module

Module คือไฟล์นามสกุล .py ที่เราเขียนขึ้นมาและ save อยู่ใน working directory ของเรา ใน module อาจจะมีตัวแปร ฟังก์ชัน หรือ object อื่นๆที่เราสร้างไว้ และสามารถ import ไปใช้ในโปรแกรมอื่นๆของเราได้

วิธีการสร้าง module ให้เราเปิดโปรแกรม notepad ขึ้นมา สร้างไฟล์ใหม่ชื่อว่า fun.py ชื่อไฟล์นี้คือชื่อ module ที่ต้อง import ใน python หลังจากเขียนเสร็จแล้ว

notepad fun.py

ลองเขียนฟังก์ชันง่ายๆซักสองตัว save file และกลับสู่ command prompt

def greeting():
  return "good morning!"

def add_two_num(a, b):
  return a + b

พิมพ์ python เพื่อเข้าสู่โหมด interactive และใช้ import keyword เพื่อโหลด module เข้าสู่ python environment เราสามารถเขียน import module ได้สามวิธี

  1. import [module]
  2. from [module] import *
  3. from [module] import [function]

ถ้าเราเขียน import แบบที่หนึ่ง เวลาเราเรียกใช้งานฟังก์ชันของ module นั้นต้องพิมพ์ชื่อ module.function()

## import python module (fun.py)
import fun
fun.greeting()
fun.add_two_num(34, 55)

ถ้าเราเขียน import แบบที่สอง คือการ import ทุกอย่าง * ในไฟล์ module เลย วิธีนี้ไม่ค่อยนิยมใช้กันเท่าไหร่ เพราะว่าส่วนใหญ่เราต้องการใช้งานแค่ไม่กี่ฟังก์ชันของ module นั้นๆ การ import * ทำให้ environment ของเราเต็มไปด้วยฟังก์ชันหรือตัวแปรที่ไม่ได้ใช้

## import everything from this file
from fun import *
greeting()
add_two_num(34, 55)

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

## import specific function from this file
from fun import greeting
greeting()

Note – ก่อนจะเขียนฟังก์ชันหรือ module ไว้ใช้งานเอง ลองศึกษาดูก่อน (หมายถึงค้น Google นั่นเอง 555+) ว่ามีคนอื่นเขียนสิ่งที่เราต้องการใช้ไว้แล้วหรือยัง ฝรั่งเรียกว่า “do not reinvent the wheel” ถ้ามีอยู่แล้ว ก็ดาวน์โหลดมาใช้งานได้เลย ไม่ต้องเขียนเองให้เสียเวลา

Package Management

มาลองดูวิธีการดาวน์โหลดและติดตั้ง module/ package จากอินเตอร์เน็ตกันบ้าง (ความแตกต่างระหว่าง package vs. module คือ package เป็น collection ของหลายๆ modules)

วิธีการดาวน์โหลดและติดตั้ง python module หรือ package (library) ต่างๆมาติดตั้งในคอมพิวเตอร์ของเราคือการใช้ package management หรือเรียกสั้นๆว่า pip

pip คือโปรแกรมที่ถูกติดตั้งพร้อมกัน Python เวอร์ชัน 3.8 เราสามารถอ่าน pip document แค่พิมพ์คอมมานด์ pip ใน command prompt

pip

พิมพ์ pip list เพื่อดูรายชื่อ packages ที่ติดตั้งไว้แล้วในคอมพิวเตอร์ของเรา

pip list

วิธีการดาวน์โหลดหรือลบ package ให้พิมพ์ว่า pip install หรือ pip uninstall ตามด้วยชื่อ package

pip install [package]
pip install numpy
pip uninstall numpy

เราใช้คอมมานด์ pip freeze เพื่อสร้างไฟล์ requirements.txt สำหรับส่งให้เพื่อนของเรา (หรือ python developers คนอื่นๆ) เพื่อบอกว่าโปรแกรมที่เราเขียนต้องใช้ packages อะไรบ้าง

pip freeze
pip freeze > requirements.txt

Note – สำหรับนักเรียนที่ใช้ macOS สามารถติดตั้ง pip ได้ด้วยคอมมานด์นี้ sudo คือ super user ปกติเวลารันคอมมานด์นี้ terminal จะถาม password ของเราด้วย (ยืนยันสิทธิ์ admin ที่สามารถดาวน์โหลดและติดตั้งโปรแกรมเองได้)

sudo easy_install pip

How to Run Python Script

เวลาทำงานจริงเราจะเขียน python ด้วยโปรแกรม text editor เซฟเป็นไฟล์นามสกุล .py แล้วค่อยนำไปรันใน command prompt ทีเดียวเลย (ปกติโปรแกรมของเราอาจจะมีโค้ดยาวหลายร้อยบรรทัดก็ได้)

  • interactive python เหมาะสำหรับทดสอบโค้ดเร็วๆ
  • python script (text editor) เหมาะสำหรับทำงาน และสร้างโปรเจ็คจริง

มาลองสร้าง python script ด้วยกัน เปิด command prompt และ cd ไปยังโฟลเดอร์ที่เราต้องการ เปิดโปรแกรม notepad ตั้งชื่อไฟล์ว่า hello.py (เราเรียกไฟล์ .py ว่า script)

notepad hello.py

เขียนฟังก์ชัน print() สองบรรทัดนี้ในไฟล์ แล้วคลิก save file

print("hello world")
print("python is cool")

กลับไปที่ command prompt พิมพ์ python ตามด้วยชื่อไฟล์ hello.py เพื่อรันโปรแกรม เท่านี้ก็เสร็จเรียบร้อย

python hello.py

Another Package Management

ในสาย python โดยเฉพาะด้าน data science จะมี package management อีกหนึ่งตัวที่เป็นที่นิยมชื่อว่า conda/ anaconda ใช้ในการติดตั้ง จัดการและอัพเดท python packages นักเรียนสามารถดูรายละเอียดได้ที่เว็บไซต์ Anaconda

ที่มา Anaconda

ข้อดีของ conda คือมันมาพร้อมกับ data science packages หลายๆตัว เช่น numpy, pandas, scikit-learn เราสามารถสร้าง environment แยกได้ด้วย ความหมายคือเราสามารถติดตั้ง python หลายๆเวอร์ชันในคอมพิวเตอร์ของเราได้ เช่น python 2 และ python 3 (different environments)

Optional Reading

สรุปในส่วนนี้เป็น optional นักเรียนสามารถข้ามได้ แอดจะรีวิวคร่าวๆคอนเซ็ปต์ของ data structure อีกสองตัวที่เราควรรู้จักใน python คือ tuple และ dictionary

Tuple

tuple อ่านว่า ทุปเปิ้ล หรือ ทัปเปิ้ล จะทำงานคล้ายกับ list เราสร้าง tuple ได้ด้วยเครื่องหมาย () สามารถเก็บข้อมูลได้หลายรูปแบบ และทำงานร่วมกับ for loop ได้เช่นกัน

## create tuple
fruits = ('apple', 'banana', 'orange', 'grape')
print(fruits)

## for loop with tuple
for fruit in fruits:
  print(fruit)

tuple จะแตกต่างจาก list เรื่องการอัพเดทค่าของ item สำหรับ tuple เราจะไม่สามารถอัพเดทค่าใดๆได้เลย python เรียกคุณลักษณะนี้ว่า “immutable” ถ้าเรารันโค้ดด้านล่างจะเจอ error message

## try change value in tuple
fruits[0] = 'green apple'   ## this will return ERROR message

Dictionary

Dictionary ใช้คอนเซ็ปต์เรื่อง key:value pairs ในการเก็บข้อมูล ยกตัวอย่างง่ายๆ เช่น ชื่อนักเรียน: คะแนนสอบ เราสร้าง dict ด้วยเครื่องหมาย {} ด้านล่างเราลองสร้าง dict ชื่อว่า student_gpa เก็บข้อมูลชื่อและคะแนน gpa ของนักเรียนสามคน นักเรียนแต่ละคนจะถูก split ด้วยเครื่องหมาย comma

## key value pair
student_gpa = {
  "David": 3.56,
  "Anna" : 3.98,
  "John" : 2.67
}

วิธีการดึงค่าออกจาก dict เราจะใช้ key หรือชื่อของนักเรียน dict จะไม่มี index เหมือนกับ list หรือ tuple แปลว่าเราไม่สามารถเขียน student_gpa[0] หรือ student_gpa[1] ได้ ภาษา python เรียก dict ว่า “unordered” structure

## use key to get value from dictionary
student_gpa["David"]  ## 3.56
student_gpa["Anna"]   ## 3.98
student_gpa["John"]   ## 2.67

## this will not work
student_gpa[0]        ## KeyError   
student_gpa[1]        ## KeyError

เราสามารถอัพเดทค่าที่อยู่ใน dictionary ได้ ตัวอย่างด้านล่างเราอัพเดท gpa ของ David จาก 3.56 เป็น 3.65 python เรียก object/ data structure ที่สามารถอัพเดทค่าได้ว่า “mutable”

## update David's gpa
student_gpa["David"] = 3.65

Compare Data Structures

สรุปเปรียบเทียบความแตกต่างของ 3 data structures ที่เราเรียนในคอร์สนี้

  • List เป็น mutable, ordered structure เราสร้าง list ด้วย []
  • Tuple เป็น immutable, ordered structure เราสร้าง tuple ด้วย ()
  • Dictionary เป็น mutable, unordered structure เราสร้าง dict ด้วย {}

โดยที่ mutable แปลว่าเราสามารถอัพเดทค่าใน structure นั้นได้ และ ordered แปลว่าเราสามารถทำ index/ slice เพื่อดึงข้อมูลได้ เช่น list[0], tuple[1] ส่วน dictionary เราใช้ key ในการดึงข้อมูลเลยเป็น unordered


Formative Quiz

🏆 ก่อนจะเริ่มทำ final prioject นักเรียนทุกคนต้องผ่านแบบสอบถาม 50 ข้อนี้ก่อนนะครับ สามารถทำซ้ำได้เรื่อยๆจนกว่าจะได้คะแนนมากกว่า 80% (ตอบถูกอย่างน้อย 40 ข้อ)

ทำควิซเสร็จแล้ว แอดรบกวนช่วยตอบแบบสอบถามความพอใจ module นี้ด้วยนะครับ ขอบคุณทุกคนมากๆครับ แล้วพบกันในบทต่อไปนะ

Awesome Work!

พรีวิวตัวอย่าง final project โปรแกรมที่เราจะเขียนด้วยกันใน module ต่อไป