Giới thiệu về khóa học lập trình python
khóa học lập trình python này được viết dành cho các bạn sử dụng python cho các bài toán machine learning. Do đó, ngoài hướng dẫn về học lập trình python ra bạn sẽ học được các kỹ thuật, cách sử dụng một số thư viện phục vụ cho khoa học máy tính.
Nếu bạn chỉ đơn giản muốn học lập trình python, bạn vẫn có thể tham khảo phần hướng dẫn về ngôn ngữ python của khóa học lập trình python này.
Python là một ngôn ngữ lập trình tuyệt vời có thể sử dụng trong nhiều lĩnh vực và nhiều bài toán khác nhau. Với sự trợ giúp đắc lực của nhiều thư viện như numpy, scipy, matplotlib,… Nó trở thành một môi trường lý tưởng và mạnh mẽ của khoa học máy tính.
Chúng tôi vẫn hi vọng rằng các bạn đã có một số kinh nghiệm làm việc với python và numpy. Tuy nhiên, nếu bạn chưa có nhiều kinh nghiệm thì cũng không cần quá lo lắng. Khóa học lập trình python này sẽ cung cấp cho bạn một khóa học nhanh về ngôn ngữ lập trình python và sử dụng python trong trong khoa học máy tính.
Toàn bộ source code của khóa học lập trình python này cũng sẽ có ở bản jupyter notebook tại đây.
Trong quá trình học, tôi mong muốn các bạn tự gõ các ví dụ và tự mình kiểm chứng kết quả. Điều này sẽ giúp bạn học tốt hơn rất nhiều.
Python
Python là một ngôn ngữ lập trình bậc cao, python hoàn toàn tạo kiểu động và dùng cơ chế cấp phát bộ nhớ tự động. Đây là ngôn ngữ có hình thức rất sáng sủa, cấu trúc rõ ràng, thuận tiện cho người mới học lập trình. Cấu trúc của Python còn cho phép người sử dụng viết mã lệnh với số lần gõ phím tối thiểu. Đây là một ví dụ triển khai thuật toán tìm kiếm nhanh – quick sort sử dụng python:
def quicksort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quicksort(left) + middle + quicksort(right)
print(quicksort([3,6,8,10,1,2,1]))
# Prints "[1, 1, 2, 3, 6, 8, 10]" |
Các phiên bản Python
Hiện nay, có 2 phiên bản python khác nhau đó là python 2 và python 3. Hai phiên bản này có một chút khác nhau về cú pháp. Bạn không thể dùng python 2 để chạy code của phiên bản python 3 và ngược lại. Một lưu ý nữa là hiện nay python 2 đã bị khai tử nên chúng tôi khuyến khích bạn sử dụng python 3. Để thuận lợi cho việc học khóa học lập trình python này, chúng tôi đề nghị bạn sử dụng python phiên bản 3.5 trở lên.
Bạn có thể kiểm tra phiên bản python hiện tại của bạn bằng cách chạy lệnh python -V hoặc python –version trên cửa sổ command line.
Các kiểu dữ liệu cơ bản trong Python
Cũng giống như hầu hết các ngôn ngữ lập trình khác, python cũng có các kiểu dữ liệu cơ bản bao gồm: integers, floats, booleans, và strings. Nhưng những kiểu dữ liệu này có cách sử dụng đơn giản và giảm bớt các ràng buộc so với các ngôn ngữ khác.
Kiểu dữ liệu số: Kiểu dữ liệu số nguyên và số thực trong python đơn giản hơn so với các ngôn ngữ khác. Một biến có kiểu là int hay float sẽ tự được xác định thông qua giá trị mà bạn gán cho biến.
x = 3
print(type(x)) # In ra "<class 'int'>"
print(x) # In ra "3"
print(x + 1) # Phép cộng; in ra "4"
print(x - 1) # Phép trừ; in ra "2"
print(x * 2) # Phép nhân; in ra "6"
print(x ** 2) # Phép lũy thừa; in ra "9"
x += 1
print(x) # In ra "4"
x *= 2
print(x) # In ra "8"
y = 2.5
print(type(y)) # In ra "<class 'float'>"
print(y, y + 1, y * 2, y ** 2) # In ra "2.5 3.5 5.0 6.25" |
Chú ý rằng python không có toán tử tăng 1 đơn vị(
x++
) hay giảm đi 1 đơn vị(x--
) giống như hầu hết các ngôn ngữ khác.
Python cũng có sẵn kiểu dữ liệu cho số phức, bạn có thể xem mọi thông tin chi tiết về nó trong trong tài liệu này.
Booleans: Python cũng hỗ trợ tất cả các toán tử logic như các ngôn ngữ khác. Nhưng sẽ dùng chữ cái tiếng anh thay vì sử dụng các ký tự(
&&, ||, ...
)
t = True
f = False
print(type(t)) # In ra"<class 'bool'>"
print(t and f) # Phép toán logic AND; in ra "False"
print(t or f) # Phép toán logic OR; in ra "True"
print(not t) # Phép toán logic NOT; in ra "False"
print(t != f) # Phép toán logic XOR; in ra "True" |
Strings: Python hỗ trợ rất mạnh cho kiểu dữ liệu string:
hello = 'hello' # Khai báo chuỗi string có thể sử dụng dấu nháy đơn
world = "world" # hoặc dấu nháy kép; Nó không ảnh hưởng gì cả.
print(hello) # In ra "hello"
print(len(hello)) # Lấy chiều dài của string; in ra "5"
hw = hello + ' ' + world # Nối chuỗi
print(hw) # in ra "hello world"
hw12 = '%s %s %d' % (hello, world, 12) # Sử dụng format style của string
print(hw12) # in ra "hello world 12" |
Đối tượng kiểu string cũng có rất nhiều hàm hữu ích, ví dụ như:
s = "hello"
print(s.capitalize()) # Chuyển thành chuỗi viết hoa chữ cái đầu; in ra "Hello"
print(s.upper()) # Chuyển toàn bộ chuỗi thành viết hoa; in ra "HELLO"
print(s.rjust(7)) # Căn phải một chuỗi string, bổ sung bằng khoảng trắng; in ra " hello"
print(s.center(7)) # Căn giữa một chuỗi string, bổ sung bằng khoảng trắng; in ra " hello "
print(s.replace('l', '(ell)')) # Thay thế mọi chuỗi con xuất hiện trong string bằng chuỗi khác;
# in ra "he(ell)(ell)o"
print(' world '.strip()) # Loại bỏ dấu cách thừa ở đầu/ cuối string; in ra "world"
|
Bạn có thể tìm danh sách tất cả các hàm của string tại tài liệu này.
Containers
Python đã được xây dựng sẵn một số loại containers: lists, dictionaries, sets, và tuples.
Lists
Lists trong python đóng vai trò tương tự như mảng(arrays). Nhưng lists có khả năng tự động thay đổi kích thước và các phần tử trong 1 list có thể có kiểu dữ liệu khác nhau.
xs = [3, 1, 2] # Khởi tạo 1 list
print(xs, xs[2]) # In ra "[3, 1, 2] 2"
print(xs[-1]) # Chỉ số âm có thể được dùng là bắt đầu từ cuối list; in ra "2"
xs[2] = 'foo' # Lists có thể chứa các phần tử có kiểu dữ liệu khác nhau
print(xs) # In ra "[3, 1, 'foo']"
xs.append('bar') # Thêm một phần tử vào cuối list
print(xs) # In ra "[3, 1, 'foo', 'bar']"
x = xs.pop() # Xóa và trả về phần tử ở cuối list
print(x, xs) # In ra "bar [3, 1, 'foo']"
Trượt trên list: Để có thể truy cập tới nhiều phần tử liên tiếp trên list. Python cung cấp cơ chế trượt(slice) cho phép truy cập vào sublist của một list dễ dàng và nó được gọi là
slicing
:
nums = list(range(5)) # range là một built-in function giúp bạn tạo một list các số nguyên
print(nums) # In ra "[0, 1, 2, 3, 4]"
print(nums[2:4]) # Trượt từ chỉ số 2 đến 4(không bao gồm 4); in ra "[2, 3]"
print(nums[2:]) # Trượt từ chỉ số 2 tới cuối cùng; in ra "[2, 3, 4]"
print(nums[:2]) # Trượt từ đầu tới chỉ số 2 (không bao gồm 2); in ra "[0, 1]"
print(nums[:]) # Trượt qua toàn bộ list ; in ra "[0, 1, 2, 3, 4]"
print(nums[:-1]) # Chỉ số của slice(trượt) cũng có thể là số âm; in ra "[0, 1, 2, 3]"
nums[2:4] = [8, 9] # Gán các giá trị của sublist sử dụng slice
print(nums) # In ra "[0, 1, 8, 9, 4]"
|
Lưu ý thêm: Chỉ số âm giống như chỉ số dương nhưng là từ cuối list. Giả sử list
a
có n
phần tử. Thì a[-1] = a[n-1]
, a[-2] = a[n-2]
, a[:n-1] = a[:-1]
.
Chúng ta sẽ tiếp tục nhắc tới slice trong phần học về numpy.
Lặp: Bạn có thể lặp qua tất cả các phần tử của 1 list như sau:
animals = ['cat', 'dog', 'monkey']
for animal in animals:
print(animal)
# Output:
# Chương trình sẽ in ra: "cat", "dog", "monkey". Mỗi phần tử trên 1 dòng.
|
Nếu bạn muốn lấy cả chỉ số để dùng ở bên trong vòng lặp, hãy sử dụng build-in function
enumerate
và làm như sau:
animals = ['cat', 'dog', 'monkey']
for idx, animal in enumerate(animals):
print('#%d: %s' % (idx + 1, animal))
# Chương trình sẽ in ra "#1: cat", "#2: dog", "#3: monkey", mỗi phần tử trên một dòng
|
List comprehensions: Trong nhiều tình huống, bạn có thể sẽ cần sử dụng một list để chuyển đổi sang một list tương đương sử dụng một công thức nào đó. Để dễ hiểu hơn, chúng ta hãy xem xét ví dụ tính toán bình phương của từng phần tử trong list các số nguyên sau:
nums = [0, 1, 2, 3, 4]
squares = []
for x in nums:
squares.append(x ** 2)
print(squares) # In ra [0, 1, 4, 9, 16]
|
Bạn có thể làm công việc trên đơn giản hơn rất nhiều với list comprehensions:
nums = [0, 1, 2, 3, 4]
squares = [x ** 2 for x in nums]
print(squares) # In ra [0, 1, 4, 9, 16]
List comprehensions cũng có thể kết hợp thêm với điều kiện:
nums = [0, 1, 2, 3, 4]
even_squares = [x ** 2 for x in nums if x % 2 == 0]
print(even_squares) # In ra "[0, 4, 16]"
|
Dictionaries
Một dictionaries chứa các cặp (key,value), nó tương tự với map trong Java và C++. Bạn có thể sử dụng như sau:
d = {'cat': 'cute', 'dog': 'furry'} # Khởi tạo 1 dict
print(d['cat']) # Lấy giá trị của dict có key là 'cat'; In ra "cute"
print('cat' in d) # Kiểm tra key có trong dict hay không; In ra "True"
d['fish'] = 'wet' # Set giá trị cho 1 key. Nếu key chưa có thì thêm,
# nếu có rồi thì ghi đè giá trị
print(d['fish']) # In ra "wet"
# print(d['monkey']) # KeyError: 'monkey' not a key of d
print(d.get('monkey', 'N/A')) # Lấy giá trị theo key kèm theo default value; In ra "N/A"
print(d.get('fish', 'N/A')) # Lấy giá trị theo key kèm theo default value; In ra "wet"
del d['fish'] # Xóa 1 phần tử khỏi dict
print(d.get('fish', 'N/A')) # "fish" không còn ở trong dict; In ra "N/A"
|
Bạn có thể tìm tất cả những gì bạn cần biết về dictionaries tại tài liệu này.
Lặp: Bạn có thể lặp qua từng key của dictionary như sau:
d = {'person': 2, 'cat': 4, 'spider': 8}
for animal in d:
legs = d[animal]
print('A %s has %d legs' % (animal, legs))
# Prints "A person has 2 legs", "A cat has 4 legs", "A spider has 8 legs"
Nếu bạn muốn cả key và value trong khi lặp, sử dụng hàm
items
:
d = {'person': 2, 'cat': 4, 'spider': 8}
for animal, legs in d.items():
print('A %s has %d legs' % (animal, legs))
# Prints "A person has 2 legs", "A cat has 4 legs", "A spider has 8 legs"
Dictionary comprehensions: Cái này tương tự như list comprehensions, nhưng thêm nữa là bạn có thể dễ dàng xây dựng từ điển mới. Ví dụ:
nums = [0, 1, 2, 3, 4]
even_num_to_square = {x: x ** 2 for x in nums if x % 2 == 0}
print(even_num_to_square) # Prints "{0: 0, 2: 4, 4: 16}"
Sets
Set là một tập hợp các phần tử không có thứ tự và các phần tử không trùng lặp(distinct). Hãy xem một ví dụ đơn giản sau đây:
animals = {'cat', 'dog'}
print('cat' in animals) # Kiểm tra 1 phần tử có trong set hay không; prints "True"
print('fish' in animals) # prints "False"
animals.add('fish') # Thêm phần tử vào set
print('fish' in animals) # Prints "True"
print(len(animals)) # Số phần tử có trong set; prints "3"
animals.add('cat') # Thêm phần tử đã có trong set => không làm gì hết
print(len(animals)) # Prints "3"
animals.remove('cat') # Xóa phần tử khỏi set
print(len(animals)) # Prints "2"
|
Như thường lệ, mọi thứ bạn cần về set có thể xem tại đây.
Lặp: Việc lặp qua từng phần tử trong một set có cú pháp giống như với list. Tuy nhiên, vì set chứa các phần tử không có thứ tự. Nên bạn không thể biết trước thứ tự in ra của các phần tử:
animals = {'cat', 'dog', 'fish'}
for idx, animal in enumerate(animals):
print('#%d: %s' % (idx + 1, animal))
# Prints "#1: fish", "#2: dog", "#3: cat"
|
Set comprehensions: Giống như list và dictionaries, chúng ta có thể dễ dàng xây dựng sets sử dụng set comprehensions:
from math import sqrt
nums = {int(sqrt(x)) for x in range(30)}
print(nums) # Prints "{0, 1, 2, 3, 4, 5}"
|
Tuples
Tuple là một kiểu dữ liệu bất biến chứa một danh sách các phần tử có thứ tự. Một tuple trong nhiều trường hợp sẽ tương tự với 1 list. Có một sự khác biệt quan trọng nhất đó là tuple có thể sử dụng giống như key trong dictionaries và có thể như các phần tử trong sets, còn list thì không thể. Đây là ví dụ:
d = {(x, x + 1): x for x in range(10)} # Tạo một dict với keys là tuple
t = (5, 6) # Tạo 1 tuple
print(type(t)) # Prints "<class 'tuple'>"
print(d[t]) # Prints "5"
print(d[(1, 2)]) # Prints "1" |
Tài liệu này sẽ cho bạn thêm thông tin về tuples.
Functions
Hàm trong python được định nghĩa sử dụng keyword
def
. Ví dụ:
def sign(x):
if x > 0:
return 'positive'
elif x < 0:
return 'negative'
else:
return 'zero'
for x in [-1, 0, 1]:
print(sign(x))
# Prints "negative", "zero", "positive" |
Chúng ta cũng thường định nghĩa một hàm có các optional tham số(có thể truyền giá trị cho tham số đó hoặc không truyền). Nếu không truyền thì hàm dùng giá trị mặc định. Ví dụ:
def hello(name, loud=False):
if loud:
print('HELLO, %s!' % name.upper())
else:
print('Hello, %s' % name)
hello('Bob') # Prints "Hello, Bob"
hello('Fred', loud=True) # Prints "HELLO, FRED!" |
Có rất nhiều thông tin hữu ích về hàm trong python ở đây
Classes
Cú pháp để định nghĩa một class trong python vô cùng đơn giản:
class Greeter(object):
# Constructor
def __init__(self, name):
self.name = name # Create an instance variable
# Instance method
def greet(self, loud=False):
if loud:
print('HELLO, %s!' % self.name.upper())
else:
print('Hello, %s' % self.name)
g = Greeter('Fred') # Construct an instance of the Greeter class
g.greet() # Call an instance method; prints "Hello, Fred"
g.greet(loud=True) # Call an instance method; prints "HELLO, FRED!"
Có rất nhiều điều thú vị về class trong python ở đây.