บทเรียนที่ 1

Author: Swatchai Kriengkraipet

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

การสั่งให้โปรแกรมไพทอนทำงานจาก command window หรือ terminal ปกติให้พิมพ์ข้อความว่า python แล้วกดแป้น Enter กรณีที่คอมพิวเตอร์ได้ติดตั้งไพทอนโปรแกรมทั้งเวอร์ชัน 2 และ 3 เราต้องเลือกพิมพ์ข้อความ python2 หรือ python3 อย่างใดอย่างหนึ่งให้ตรงเวอร์ชันที่ต้องการใช้งาน

สมมุติว่าเราได้สั่งให้โปรแกรมไพทอนแบบมาตรฐาน (standard Python interpreter) ทำงานแล้ว ภายในหน้าต่างของโปรแกรมจะมี prompt เป็นเครื่องหมาย >>> เราสามารถพิมพ์คำสั่งลงไปหลังเครื่องหมายนั้นแล้วกดแป้น Enter ให้ไพทอนประมวลผลไปตามลำดับทีละคำสั่ง

การเขียนโปรแกรมแรกในภาษาไพทอน

ตามธรรมเนียมปฏิบัติในการเรียนเขียนโปรแกรม เราเริ่มการเขียนไพทอนสคริปต์เป็นข้อความ print("Hello world!") ไว้หลังเครื่องหมาย prompt ซึ่งปกติเป็นเครื่องหมาย greater than สามตัว
>>> print("Hello world!")

แล้วกดปุ่ม Enter
ผลที่ได้รับคือข้อความ

Hello world!

(ข้อความภาษาไทยก็ใช้ใด้)

In [1]:
>>> print("Hello world!")
Hello world!

ถ้าเราบันทึกโปรแกรมนี้ไว้ในไฟล์ชื่อ hello.py เราสามารถ run โปรแกรมนั้นได้โดย พิมพ์ข้อความ python hello.py แล้วกด Enter ในหน้าต่าง Command prompt (Windows) หรือ Terminal (Linux, Unix, Mac)

command_prompt> python hello.py
Hello world!

ในระบบ UNIX, Linux, Mac เรามักจะเขียนรหัส directive
#!/usr/bin/env python
ไว้ที่บรรทัดแรกของไฟล์โปรแกรมไพทอนเพื่อบอกให้ระบบปฏิบัติการรู้ว่าต้องการใช้โปรแกรมชื่อ python ทำการ execute ไฟล์นั้น


เนื้อหาของไฟล์ hello.py

\#!/usr/bin/env python
print("Hello world!")


รหัสอักขระมาตรฐานที่ใช้ในไฟล์ปกติคือ ASCII ถ้าเราใช้อักขระไทย ต้องประกาศให้ python interpreter รู้ด้วยข้อความ
# -- coding: UTF-8 --
ดังตัวอย่างข้างล่าง


เนื้อหาของไฟล์ hello_th.py

\#!/usr/bin/env python
\# -*- coding: UTF-8 -*-
print("Hello ประเทศไทย!")


และเมื่อจัดให้ไฟล์มีคุณสมบัติ executable แล้วเราจะสามารถ run โปรแกรมนั้นได้โดยป้อนคำสั่งที่เป็นเพียงชื่อไฟล์
$ hello.py

โปรแกรมสวัสดีชาวโลกในภาษาอื่น

Hello world app in java

class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } }


Hello world app in C

#include<stdio.h> int main(int argc, char** argv) { printf("Hello World"); }


ในบทเรียนชุดนี้ซึ่งเขียนขึ้นในรูปแบบของ iPython notebook มี IPython interpreter ทำหน้าที่ประมวลผล เครื่องหมาย In [n]: เป็นส่วนของคำสั่งหรือ input ที่ป้อนให้ไพทอนประมวลผล และ Out [n]: เป็นข้อความตอบกลับของคำสั่งก่อนหน้า ตัวเลขในวงเล็บ(n) ทำหน้าที่เป็นดัชนีอ้างอิงและบอกลำดับการประมวลผลที่ผ่านไปแล้ว

หมายเหตุ ต่อไปนี้จะขอละเว้นไม่แสดงเครื่องหมาย >>> ของไพทอน prompt

การคำนวณโดยยังไม่ import โมดูลใดๆ

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

ในการคำนวณเราใช้ object เหล่านี้

Numeric typesExamples
intint('23')
floatfloat(12.34)
complexcomplex(2, 3)

ลองคำนวณปัญหาคณิตศาสตร์ง่ายๆ ดังนี้

In [2]:
3.1 + 4*5   # This is a comment
Out[2]:
23.1

ลองคำนวณค่า 3 หารด้วย 2 ดังนี้

In [3]:
3 / 2   # Integer division (in Python3, return value = 1.5)
Out[3]:
1

หลายคนคงแปลกใจ เพราะผลลัพธ์ควรเป็นเลขทศนิยม 1.5 (กรณีนี้ไพทอนเวอร์ชัน3จะคำนวณได้ 1.5) แต่ไพทอนเวอร์ชัน2คำนวณได้ผลเป็นเลขจำนวนเต็ม (integer) เพราะยึดหลักการว่าเลข 3 และ 2 ที่ใช้ล้วนเป็นเลขจำนวนเต็ม ถ้าเราทดลองใหม่โดยใช้ตัวเลขทศนิยมจะได้คำตอบที่ต้องการ ดังนี้

In [4]:
3.0 / 2  # Floating point division
Out[4]:
1.5

การบวก ลบ คูณ หาร เราใช้เครื่องหมาย + - * / ตามลำดับ สำหรับการยกกำลังเราใช้เครื่องหมายดอกจันคู่ ดังตัวอย่างต่อไปนี้

หมายเหตุ ไพทอนใช้เครื่องหมาย ^ ในเรื่องอื่นที่ไม่ใช่การยกกำลัง

In [5]:
2 ** 3   # Exponentiation
Out[5]:
8

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

In [6]:
11.99 // 2   # Forced integer division
Out[6]:
5.0

การคำนวณกรณฑ์ หรือราก (root) เช่น รากที่สอง รากที่สาม ฯลฯ ให้ใช้วิธีการยกกำลัง และต้องระวังเรื่องตัวเลขที่อาจถูกปัดเศษทิ้งทำให้ผลการคำนวณผิดพลาด ต่อไปเมื่อเรารู้วิธีนำเข้าโมดูล math เราจะมีวิธีคำนวณที่ดีกว่านี้

In [7]:
125 ** (1/3.0)   # Exponentiation with fraction number
Out[7]:
4.999999999999999

การนำผลลัพธ์ของการคำนวณครั้งหลังสุดมาใช้งานในขั้นตอนต่อไป ให้ใช้เครื่องหมาย underscore

In [8]:
_ + 12   # Underscore represents the last returned value
Out[8]:
17.0

การหารเพื่อเอาเศษเหลือเป็นผลลัพธ์

In [9]:
8 % 3   # 8 modulo 3
Out[9]:
2

ถ้าต้องการค่า absolute ให้ใช้ฟังก์ชัน abs() คำนวณ

In [10]:
abs(-12)
Out[10]:
12

การประมวลผลตัวเลขเชิงซ้อน (complex number)

ใช้ j แทนเลขจินตภาพ (imaginary number, กรณฑ์ที่สองของค่า -1)

In [11]:
(1 + 3j) + (3 - 5j)   # Addition, parentheses are optional
Out[11]:
(4-2j)
In [12]:
_.real, _.imag   # Show real and imaginary parts of previous result
Out[12]:
(4.0, -2.0)
In [13]:
(1 + 2j) / (3 - 4j)   # Division, parentheses are mandatory
Out[13]:
(-0.2+0.4j)

ถ้ามีรูปสามเหลี่ยมมุมฉากที่ด้านประกอบมุมฉากยาว 3 และ 4 สามารถหาความยาวด้านตรงข้ามมุมฉากได้ดังนี้

In [14]:
abs(3 + 4j)   # Absolute value of a complex number
Out[14]:
5.0
In [15]:
complex(4, 5)   # Create complex number with 'complex' function
Out[15]:
(4+5j)
In [16]:
_.conjugate()   # Conjugate of the resulting complex number
Out[16]:
(4-5j)

การคำนวณ + - * / ของ complex number สามารถทำได้โดยไม่ต้องอาศัยฟังก์ชันใดๆ จากโมดูลที่ต้องนำเข้า

เซ็ต (Set) และการประมวลผลเกี่ยวกับเซ็ต

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

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

In [17]:
set1 = set([1, 2, 3, 4, "text"])   # Create a set object 'set1'

การสร้างเซ็ตทำโดยใช้วงเล็บปีกกา

In [18]:
set2 = {2, 4, 7, 18}   # Create 'set2' by using {items}
In [19]:
len(set2)   # Number of items in 'set2'
Out[19]:
4

set1 $\cup$ set2

In [20]:
set1.union(set2)   # Union of the two sets
Out[20]:
{1, 2, 3, 4, 7, 18, 'text'}

Difference between set1 and set1.

In [21]:
set1 - set2   # Difference of set1 by set2
Out[21]:
{1, 3, 'text'}

set1 $\cap$ set2

In [22]:
set1.intersection(set2) # Intersection of the two sets
Out[22]:
{2, 4}

เซ็ตที่เราสร้างขึ้น (เช่น set1, set2 ในตัวอย่างข้างบน) สามารถปฏิบัติการได้ด้วย method ต่อไปนี้:- add, clear, copy, difference, difference_update, discard, intersection, intersection_update, isdisjoint, issubset, issuperset, pop, remove, symmetric_difference, symmetric_difference_update, union, update

The elements of a set must be hashable. To represent sets of sets, the inner sets must be frozenset objects. 'Set' object does not support indexing, use can't use set1[2].

การใช้คำสั่งประเภท Boolean

คำสั่งประเภท Boolean คือคำสั่งที่ประมวลผลแล้วได้ค่าเป็น True หรือ False มีที่ใช้ทั่วไป มีบทบาทสำคัญในการเขียนโปรแกรมเรื่องการทดสอบและตัดสินใจ เช่น if-else; while

Boolean objects
True
False
These are considered False
False
zero of any numeric type, for example, 0, 0.0, 0j
any empty sequence, for example, '', (), []
any empty mapping, for example, {}
More: see https://docs.python.org/3/library/stdtypes.html#truth-value-testing
Others than these: considered True
OperatorMeaning
<strictly less than
<=less than or equal
>strictly greater than
>=greater than or equal
==equal
!=not equal
notnegation
isobject identity
is notnegated object identity
In [23]:
3 > 4  # Greater than
Out[23]:
False
In [24]:
True or False  # Or operator
Out[24]:
True
In [25]:
True and True   # And operator
Out[25]:
True
In [26]:
not True   # Not operator
Out[26]:
False
In [27]:
0.0 or 1.0   # Sometimes return value is not True / False
Out[27]:
1.0
In [28]:
not 1   # 1 is interpreted as True, and 0 false
Out[28]:
False
In [29]:
5 is (2+2+1)
Out[29]:
True
In [30]:
(2 + 3) == (1 + 4)   # Equal operator
Out[30]:
True
In [31]:
12 != 11.9   # Inequality
Out[31]:
True
In [32]:
a1 = [5, 4, 3, 2, 1]   # A list is created and bound to symbol 'a1'
c1 = [5, 4, 3, 2, 1]   # A different list is created
b1 = a1   # Bind the same list to symbols 'b1' and 'a1'
In [33]:
a1 is b1
Out[33]:
True
In [34]:
a1 is c1
Out[34]:
False
In [35]:
a1 == c1
Out[35]:
True

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


ตัวอย่างเพิ่มเติมและแบบฝึกหัด

โจทย์ จงเขียนสคริปต์เพื่อคำนวณค่าของพจน์คณิตศาสตร์ต่อไปนี้ด้วยรหัสภาษาไพทอน

$3x^2$ + $\frac{5}{y}$;
ให้ใช้ค่า x = 7, y = 2

คำตอบ

In [36]:
3.0 * 7**2 + 5.0 / 2
Out[36]:
149.5

โจทย์ ถ้าเริ่มต้นโดยใช้ตัวแปรเก็บค่า
x = 7
y = 2
จงเขียนสคริปต์คำนวณ $3x^2$ + $\frac{5}{y}$

วิธีทำ

?? ลองทำดู

การสร้างเป็นฟังก์ชัน

ถ้าปัญหานี้ต้องแก้กันบ่อยๆ ควรทำเป็นฟังก์ชันไว้ใช้ดังนี้

In [37]:
def funxy (x, y):
    return 3.0 * x**2 + 5.0 / y

วิธีใช้ funxy(x, y) เมื่อ x=3 และ y=-2:

In [38]:
funxy(3, -2)
Out[38]:
24.5

บทเรียนต่อไป skk_python_modulemath.ipynb

EOF