Học Python từ con số 0 (Phần 1) – The Basics


Trước tiên, Python là gì ? Theo người tạo ra ngôn ngữ này, Guido van Rossum, Python là một:

“high-level programming language, and its core design philosophy is all about code readability and a syntax which allows programmers to express concepts in a few lines of code.”

Đối với tôi, lý do đầu tiên để học lập trình Python là nó thực sự là một ngôn ngữ tuyệt vời. Nó thực sự gần gũi khi code và thể hiện suy nghĩ của mình.
Một lý do khác là chúng ta có thể sử dụng mã hóa bằng Python theo nhiều cách như data science, web development and machine learning

The Basics

1. Variables
Trong các ngôn ngữ lập trình khác, biến để lưu trữ giá trị. Trong Python, rất dễ để khai báo biến và thiết lập giá trị cho nó. Ví dụ, bạn muốn lưu giữ số 1 trong một biến được gọi là once.

one 

=

1

Đơn giản như thế nào. Bạn có thể gán giá trị 1 cho biến one. Tương tự với các giá trị khác tương tự
Bên cạnh integers, chúng ta có thể sử dụng booleans (True/False), string, float và nhiều kiểu dữ liệu khác

 
true_boolean 

=

True

false_boolean

=

False

my_name

=

"DiepTX"

book_price

=

53.400

2. Control Flow: conditional statements
if sử dụng một biểu thức để đánh giá điều kiện đúng hay sai, nếu nó là True, nó thực hiện những gì bên trong câu lênh if. Ví dụ:

if

True

:

print

(

"Hello Python If"

)

if

2

>

1

:

print

(

"2 is greater than 1"

)

Khối else sẽ được thực thi nếu điều kiện trong if là sai

if

1

>

2

:

print

(

"1 is greater than 2"

)

else

:

print

(

"1 is not greater than 2"

)

Bạn cũng có thể sử dụng khối elif

if

1

>

2

:

print

(

"1 is greater than 2"

)

elif

2

>

1

:

print

(

"1 is not greater than 2"

)

else

:

print

(

"1 is equal to 2"

)

3. Loop
Trong Python, bạn có thể lặp lại trong nhiều hình thức khác nhau. Tôi sẽ nói về whilefor
Vòng lặp while: Trong khi điều kiện là True, code bên trong khối sẽ được thực hiện

num 

=

1

while

num

<=

10

:

print

(

num

)

num

+=

1

Vòng lặp while cần một điều kiện lặp. Nếu nó vẫn đúng, vẫn tiếp tục lặp. Trong ví dụ trên, khi num11 điều kiện lặp sẽ là False
Vòng lặp for: bạn có thể đưa biến num vào trong khối và khối for sẽ thực hiện lặp

for

i

in

range

(

1

,

11

)

:

print

(

i

)

List: Collection | Array | Data Structure

Bạn muốn lưu trữ số nguyên 1 trong một biến, nhưng giờ muốn lưu 2, 3, 4 hoặc nhiều hơn?
List là một collection mà bạn có thể sử dụng để lưu trữ một danh sách các giá trị

my_integers 

=

[

1

,

2

,

3

,

4

,

5

]

Và việc lấy ra các phần tử trong list cũng giống như các ngôn ngữ lập trình khác đó là thông qua các index của danh sách

my_integers 

=

[

1

,

2

,

3

,

4

,

5

]

print

(

my_integers

[

0

]

)

print

(

my_integers

[

3

]

)

Dictionary: Key-Value Data Structure

Với Lists được đánh index là các integer. Nhưng nếu không muốn sử dụng integer là index? Một cấu trúc dữ liệu mà ta có thể sử dụng là số, chuỗi hoặc các loại chỉ số khác
Cấu trúc dữ liệu với tên gọi Dictionary khá giống trong Swift đó nhé 😁. Dictionary là một collection của cặp key-value

dictionary_example 

=

{

"key1"

:

"value1"

,

"key2"

:

"value2"

}

key là chỉ số trỏ tới value. Làm thế nào để truy cập tới value của Dictionary. Thông qua sử dụng key nhé.

dictionary_acc 

=

{

"name"

=

"Diep"

,

"age"

=

23

}

print

(

"My name is %s "

%

(

dictionary_acc

[

"name"

]

)

)

print

(

"I'm %i "

%

(

dictionary_acc

[

"age"

]

)

)

Lặp qua cấu trúc dữ liệu

Lặp trong List rất đơn giản.

bookshelf 

=

[

"The Effective Engineer"

,

"The 4 hours work week"

,

"Zero to One"

,

"Lean Startup"

,

"Hooked"

]

for

book

in

bookshelf

:

print

(

book

)

Với cấu trúc dữ liệu Dictionary. Cũng có thể sử dụng for nhưng với key:

dictionary 

=

{

"some_key"

:

"some_value"

}

for

key

in

dictionary

:

print

(

"%s ---> %s"

%

(

key

,

dictionary

[

key

]

)

)

Có một cách khác đó là sử dụng items

dictionary 

=

{

"some_key"

:

"some_value"

}

for

key

,

value

in

dictionary

.

items

(

)

:

print

(

"%s ---> %s"

%

(

key

,

value

)

)

Class và Object

Object là một đại diện của đối tượng thực tế như xe, nhà, chó, méo. Đối tượng chia sẻ hai đặc điểm chính: DataBehavior
Xe có data như số bánh xe, số ghế… và có behavior có thể chạy, dừng lại, hiển thị xăng và nhiều thứ khác
Chúng ta nhận định rằng data giống như attributesbehavior giống như methods trong lập trình hướng đối tượng
Data -> Attibutes and Behavior -> Methods
Class là một bản thiết kế chi tiết từ các đối tượng được tạo ra. Trong thế giới thực chúng ta có nhiều kiểu đối tượng giống nhau, tất cả chúng có chung 1 sản phẩm mẫu (đều có động cơ, bánh xe, cửa ra vào)…

Lập trình hướng đối tượng trong Python

Khai báo class

class

Vehicle

:

pass

Object là một thể hiện của class.

car 

=

Vehicle

(

)

print

(

car

)

car là một object (hoặc instance) của class Vehicle
Ở ví dụ trên, lớp Vehicle có 4 thuộc tính: number of wheels, type of tank, seating capacity, và maximum velocity. Chúng ta đặt cho tất cả các thuộc tính này khi tạo một object vehicle. Ở đây chúng ta khai báo class để nhận data khi nó được khởi tạo:

class

Vehicle

:

def

_init_

(

self

,

number_of_wheels

,

type_of_tank

,

seating_capacity

,

maximum_velocity

)

:

self

.

number_of_wheels

=

number_of_wheels self

.

type_of_tank

=

type_of_tank self

.

seating_capacity

=

seating_capacity self

.

maximum_velocity

=

maximum_velocity

Sử dụng phương thức init, gọi tới một phương thức khởi tạo. Khi tạo ra object vehicle, các attributes được khởi tạo.
Tất cả thuộc tính được set. Nhưng truy cập vào giá trị của chúng bằng cách nào ?

class

Vehicle

:

def

__init__

(

self

,

number_of_wheels

,

type_of_tank

,

seating_capacity

,

maximum_velocity

)

:

self

.

number_of_wheels

=

number_of_wheels self

.

type_of_tank

=

type_of_tank self

.

seating_capacity

=

seating_capacity self

.

maximum_velocity

=

maximum_velocity

def

number_of_wheels

(

self

)

:

return

self

.

number_of_wheels

def

set_number_of_wheels

(

self

,

number

)

:

self

.

number_of_wheels

=

number

Implement 2 phương thức number_of_wheelsset_number_of_weels. Chúng ta gọi tới gettersetter.
Trong Python, sử dụng @property (decorators) để khai báo getters and setters

class

Vehicle

:

def

__init__

(

self

,

number_of_wheels

,

type_of_tank

,

seating_capacity

,

maximum_velocity

)

:

self

.

number_of_wheels

=

number_of_wheels self

.

type_of_tank

=

type_of_tank self

.

seating_capacity

=

seating_capacity self

.

maximum_velocity

=

maximum_velocity

@property

def

number_of_wheels

(

self

)

:

return

self

.

number_of_wheels

@number_of_wheels

.

setter

def

number_of_wheels

(

self

,

number

)

:

self

.

number_of_wheels

=

number

Và có thể sử dụng các method này như một attributes


tesla_model_s 

=

Vehicle

(

4

,

'electric'

,

5

,

250

)

print

(

tesla_model_s

.

number_of_wheels

)

tesla_model_s

.

number_of_wheels

=

2

print

(

tesla_model_s

.

number_of_wheels

)

Tính đóng gói: Hiding Information

Public Instance Varibales

Class của Python có thể khởi tạo public instance variable

class

Person

:

def

__init__

(

self

,

first_name

)

:

self

.

first_name

=

first_name

Sử dụng giá trị first_name là một đối số public instance variable

tk 

=

Person

(

'TK'

)

print

(

tk

.

first_name

)

Non-public Instance Variable

We don’t use the term “private” here, since no attribute is really private in Python (without a generally unnecessary amount of work). — PEP 8

Giống như public instance variable, chúng ta có thể khai báo none-public instance variable vả trong phương thức khởi tạo hoặc trong class. Sự khác biệt cú pháp là: đối với none-public instance variables sử dụng gạch dưới trước variable.

‘Private’ instance variables that cannot be accessed except from inside an object don’t exist in Python. However, there is a convention that is followed by most Python code: a name prefixed with an underscore (e.g. _spam) should be treated as a non-public part of the API (whether it is a function, a method or a data member)” — Python Software Foundation

Ví dụ:


class

Person

:

def

__init__

(

self

,

first_name

,

email

)

:

self

.

first_name

=

first_name self

.

_email

=

email

Bạn có thấy biến email? Đây là cách ta xác định một biến none-public

tk 

=

Person

(

'TK'

,

'[email protected]'

)

print

(

tk

.

_email

)

We can access and update it. Non-public variables are just a convention and should be treated as a non-public part of the API.

Do đó chúng ta sử dụng một phương pháp cho phép làm điều đó trong khai báo lớp. Implement 2 method (emailupdate_email)

class

Person

:

def

__init__

(

self

,

first_name

,

email

)

:

self

.

first_name

=

first_name self

.

_email

=

email

def

update_email

(

self

,

new_email

)

:

self

.

_email

=

new_email

def

email

(

self

)

:

return

self

.

_email

Như trên chúng ta có thể cập nhật và truy cập non-public variables sử dụng các method đó

tk 

=

Person

(

'TK'

,

'[email protected]'

)

print

(

tk

.

email

(

)

)

tk

.

_email

=

'[email protected]'

print

(

tk

.

email

(

)

)

tk

.

update_email

(

'[email protected]'

)

print

(

tk

.

email

(

)

)

  1. Khởi tạo 1 object mới với first_name TK and email [email protected]
  2. In ra email bằng cách truy cập non-public variable với một method
  3. Cố gắng để set một email mới trong lớp
  4. Cần đối xử với non-public varible như một phần non-public của API
  5. Cập nhật non-public varible với phương thức khởi tạo
  6. Ta có thể update nó trong class với helper method

Public method

Với public method

class

Person

:

def

__init__

(

self

,

first_name

,

age

)

:

self

.

first_name

=

first_name self

.

_age

=

age

def

show_age

(

self

)

:

return

self

.

_age

Và cũng không ngoại lệ đối với Python hay các ngôn ngữ lập trình khác

tk 

=

Person

(

'TK'

,

25

)

print

(

tk

.

show_age

(

)

)

Non public method

Nhưng với non-public method ta không thể gọi như public method . Cùng sử dụng class Person nhưng với non-public method với dấu gạch dưới _

class

Person

:

def

__init__

(

self

,

first_name

,

age

)

:

self

.

first_name

=

first_name self

.

_age

=

age

def

_show_age

(

self

)

:

return

self

.

_age

Ta sẽ gọi method đó như sau

tk 

=

Person

(

'TK'

,

25

)

print

(

tk

.

_show_age

(

)

)

We can access and update it. Non-publicmethods are just a convention and should be treated as a non-public part of the API.

Dưới đây là ví dụ để ta hiểu rõ hơn về nó

class

Person

:

def

__init__

(

self

,

first_name

,

age

)

:

self

.

first_name

=

first_name self

.

_age

=

age

def

show_age

(

self

)

:

return

self

.

_get_age

(

)

def

_get_age

(

self

)

:

return

self

.

_age tk

=

Person

(

'TK'

,

25

)

print

(

tk

.

show_age

(

)

)

Chúng ta có show_agepublic method_get_agenon-public method. show_age có thể sử dụng bởi class Person_get_age chỉ được sử dụng bên trong class đã khai báo (bên trong show_age)
Với tính kế thừa cũng giống như các ngôn ngữ lập trình hướng đối tượng khác nên tôi sẽ không đề cập ở bài viết này nữa. Ở bài viết sau tôi sẽ đi sâu hơn về ngôn ngữ Python. Cảm ơn bạn đã đọc bài viết này !
To be continue…