Danh sách Keyword trong Python
Bài viết này sẽ cung cấp thông tin ngắn gọn và các ví dụ cụ thể về tất cả các từ khóa (Keyword) được sử dụng trong Python.
Từ khóa là những từ dành riêng trong Python. Bạn không thể sử dụng từ khóa làm tên biến, tên hàm hoặc bất kỳ định danh nào khác.
Danh sách từ khóa trong Lập trình Python
Danh sách các từ khóa trên có thể thay đổi trong các phiên bản Python khác nhau. Bạn luôn có thể xem danh sách các từ khóa trong phiên bản Python hiện tại của mình, bằng cách nhập nội dung sau vào lời nhắc:
>>> import keyword
>>> print(keyword.kwlist)
Mô tả các keyword trong Python kèm ví dụ
True, False
True
và False
là giá trị xác thực trong Python. Chúng là kết quả của các phép toán so sánh hoặc phép toán logic (Boolean) trong Python. Ví dụ:
>>> 1 == 1
True
>>> 5 > 3
True
>>> True or False
True
>>> 10 <= 1
False
>>> 3 > 7
False
>>> True and False
False
Trong Python thì giá trị của True và False bạn có thể hiểu như sau:
>>> True == 1
True
>>> False == 0
True
>>> True + True
2
None
None là một hằng số đặc biệt trong Python, nó đại diện cho việc biến đó không có giá trị hoặc giá trị Null.
None là một đối tượng với kiểu dữ liệu của riêng nó (NoneType). Nó không phải 0, False hay một chuỗi trống, chỉ đơn giản None là None và nó chứa giá trị như nhau nếu gán cho các đối tượng khác nhau. Ví dụ:
>>> None == 0
False
>>> None == []
False
>>> None == False
False
>>> x = None
>>> y = None
>>> x == y
True
None
cũng được trả về bởi các hàm mà trong đó dòng chương trình không gặp phải câu lệnh trả về.
Ví dụ : Chương trình dưới đây là một hàm không trả về giá trị, mặc dù nó có thực hiện một số thao tác bên trong. Vì thế, khi ta dùng lệnh print(x) thì sẽ nhận được kết quả trả về tự động (ngầm định) là None
:
def a_void_function():
a = 1
b = 2
c = a + b
x = a_void_function()
print(x)
Ví dụ khác : Hàm dưới đây có một câu lệnh nhưng nó không đạt được mọi trường hợp. Hàm sẽ chỉ trả về True
khi đầu vào là chẵn. Trong trường hợp giá trị đầu vào là lẻ, hàm sẽ trả về None
:
def improper_return_function(a):
if (a % 2) == 0:
return True
x = improper_return_function(3)
print(x)
and, or, not
and
, or
, not
là các toán tử Logic trong Python.
Toán tử and
sẽ chỉ trả về giá trị True nếu cả 2 toán từ đều True. Bảng dưới đây sẽ mô tả sự kết hợp của các toán tử and
:
A | B | A and B |
TRUE | TRUE | TRUE |
TRUE | FALSE | FALSE |
FALSE | TRUE | FALSE |
FALSE | FALSE | FALSE |
Toán tử or
sẽ trả về kết quả True nếu bất kỳ toán tử nào là True. Bảng dưới đây sẽ mô tả sự kết hợp của các toán tử or
:
A | B | A or B |
TRUE | TRUE | TRUE |
TRUE | FALSE | TRUE |
FALSE | TRUE | TRUE |
FALSE | FALSE | FALSE |
Toán tử not
được sử dụng để đảo ngược giá trị ban đầu. Bảng dưới đây mô tả sự kết hợp của toán tử not
:
A | not A |
TRUE | FALSE |
FALSE | TRUE |
Một vài ví dụ dưới đây mô tả cách hoạt động của các toán tử trên:
>>> True and False
False
>>> True or False
True
>>> not False
True
as
as
được sử dụng để tạo bí danh trong khi đang nhập một module. Nó có nghĩa là người dùng có thể đặt 1 tên khác cho một module sẵn có, trong khi đang nhập nó.
Ví dụ: Python có một module tiêu chuẩn được gọi là math
. Giả sử chúng ta muốn tính Cos pi thông qua một bí danh khác là myAlias. Ta có thể làm điều đó như sau:
>>> import math as myAlias
>>>myAlias.cos(myAlias.pi)
-1.0
Ở đây, chúng ta nhập module math
bằng cách gán tên myAlias
cho nó. Sau đó, ta có thể sử dụng module math
này với tên mới để tính toán cos(pi) và nhận được câu trả lời -1.0
.
assert
assert
được sử dụng cho mục đích gỡ lỗi.
Trong khi lập trình, đôi khi bạn muốn biết trạng thái bên trong hoặc kiểm tra xem các giả định của mình có đúng không. assert
sẽ giúp bạn thực hiện việc này và dễ dàng tìm ra lỗi hơn.
Phía sau assert
thường được đính kèm bởi một điều kiện. Nếu điều kiện là đúng, sẽ không có gì xảy ra; nếu điều kiện là sai thì thông báo AssertionError.
>>> a = 4
>>> assert a < 5
>>> assert a > 5
Traceback (most recent call last):
File "<string>", line 301, in runcode
File "<interactive input>", line 1, in <module>
AssertionError
Để hiểu rõ hơn, bạn có thể cung cấp thông báo được hiển thị sau AssertionError
.
>>> a = 4
>>> assert a > 5, "Gia tri cua a qua nho"
Traceback (most recent call last):
File "<string>", line 301, in runcode
File "<interactive input>", line 1, in <module>
AssertionError: Gia tri cua a qua nho
Dựa vào ví dụ trên, bạn có thể thấy rằng:
assert dieu_kien, thong_bao
sẽ tương ứng với:
if not dieu_kien:
raise AssertionError(thong_bao)
async, await
Từ khóa async
và await
được cung cấp bởi thư viện asyncio
trong Python. Chúng được sử dụng để viết mã thực thi không đồng thời trong Python. Ví dụ:
import asyncio
async def main():
print('QuanTriMang')
await asyncio.sleep(1)
print('xin chao')
Để chạy chương trình, chúng ta sử dụng:
asyncio.run(main())
Trong chương trình chạy trên, từ khóa async
chỉ định rằng hàm sẽ được thực thi không đồng bộ. Đầu tiên, từ 'QuanTriMang' sẽ được viết ra, từ khóa await
sẽ làm cho chương trình chờ trong 1 giây, sau đó mới viết nốt 'xin chao'.
break, continue
break
và continue
được sử dụng bên trong các vòng lặp for
và while
để thay đổi hoạt động bình thường của vòng lặp.
break
sẽ kết thúc vòng lặp nhỏ nhất mà nó nằm trong đó, và điều khiển chuyển đến câu lệnh ngay bên dưới vòng lặp. continue
là để kết thúc việc lặp lại hiện tại của vòng lặp, nhưng không phải toàn bộ vòng lặp.
Xem ví dụ sau để hiểu hơn về từ khóa này break
:
for i in range(1,11):
if i == 5:
break
print(i)
Output:
1
2
3
4
Trong ví dụ trên, vòng lặp for
dự định in các số từ 1 đến 10. Nhưng điều kiện if
được đáp ứng khi i = 5 và phá vỡ vòng lặp in đó. Do đó, chỉ có số từ phạm vi từ 1 đến 4 được in ra.
Còn dưới đây là ví dụ về continue
:
for i in range(1,11):
if i == 5:
continue
print(i)
Output
1
2
3
4
6
7
8
9
10
Vẫn với ví dụ trên, chúng ta chỉ thay đổi break
bằng continue
và kết quả hoàn toàn khác. Khi gặp điều kiện i = 5, thay vì dừng hoàn toàn vòng lặp, lệnh continue
chỉ bỏ qua lần lặp đó và thực hiện tiếp việc lặp cho các số > 5. Do vậy, ngoại trừ 5, các số trong chuỗi từ 1 đến 10 đều được in ra.
👉 Tìm hiểu thêm về Lệnh break và continue.
class
class
được sử dụng để định nghĩa một lớp mới (do người dùng tự định nghĩa) trong Python.
Lớp (class) là một tập hợp các thuộc tính và phương thức có liên quan, nhằm cố gắng thể hiện một tình huống trong thế giới thực. Ý tưởng đặt dữ liệu và chức năng cùng nhau trong một lớp là trọng tâm của khái niệm lập trình hướng đối tượng (OOP).
Các lớp có thể được định nghĩa ở bất cứ đâu trong 1 chương trình, nhưng nơi tốt nhất để xác định một lớp duy nhất là trong module. Sau đây là ví dụ:
class ExampleClass:
def function1(parameters):
…
def function2(parameters):
…
👉 Xem thêm bài sau để Tìm hiểu về Object và Class
def
def
được sử dụng để xác định một hàm (function) do người dùng định nghĩa.
Hàm là một khối các câu lệnh liên quan, cùng thực hiện một số nhiệm vụ cụ thể. Nó giúp chúng ta tổ chức mã thành các phần có thể quản lý và cũng để thực hiện một số tác vụ lặp đi lặp lại.
Cách sử dụng def
như sau:
def function_name(parameters):
…
👉 Tìm hiểu thêm về Hàm trong Python.
del
del
được dùng để xóa tham chiếu đến một đối tượng (object). Mọi thứ trong Python đều là đối tượng và bạn có thể xóa nó bằng cách sử dụng del
.
>>> a = b = 5
>>> del a
>>> a
Traceback (most recent call last):
File "<string>", line 301, in runcode
File "<interactive input>", line 1, in <module>
NameError: name 'a' is not defined
>>> b
5
Trong ví dụ trên, bạn thấy rằng tham chiếu tới biến a đã bị xóa, vì vậy nó không còn được định nghĩa nữa và sẽ báo lỗi khi bạn gọi nó ra. Biến b thì vẫn tồn tại giá trị như bạn đã gán ban đầu.
del
cũng được dùng để xóa các mục khỏi danh sách hoặc từ điển:
>>> a = ['x','y','z']
>>> del a[1]
>>> a
['x', 'z']
if, else, elif
if
, else
, elif
được sử dụng để phân nhánh có điều kiện và đưa ra tình huống xử lý.
Khi bạn muốn kiểm tra một số điều kiện và chỉ thực thi khối lệnh nếu điều kiện đúng, thì chúng ta sử dụng if
và elif
. elif là viết tắt của else if. else
là phần khối lệnh thực thi khi điều kiện sai. Xem ví dụ sau để hiểu rõ hơn:
def if_example(a):
if a == 1:
print('Mot')
elif a == 2:
print('Hai')
else:
print('Quan Tri Mang')
if_example(2)
if_example(4)
if_example(1)
Output:
Hai
Quan Tri Mang
Mot
Trong ví dụ trên bạn thấy, hàm sẽ kiểm tra số đầu vào và in kết quả đọc của số đó nếu nó là 1 hoặc 2. Bất cứ giá trị đầu vào nào khác nó sẽ hiển thị phần khối lệnh đi sau else
.
👉 Tìm hiểu thêm về Lệnh if, if...else, if...elif...else trong Python.
except, raise, try
except
, raise
, try
được sử dụng với các ngoại lệ trong Python.
Về cơ bản, các ngoại lệ là các lỗi cho thấy đã xảy ra sự cố khi thực hiện chương trình. IOError, ValueError, ZeroDivisionError, ImportError, NameError, TypeError... là một vài ví dụ về ngoại lệ trong Python. Các khối try...except
được sử dụng để 'bắt' các ngoại lệ trong Python.
Chúng ta có thể nêu ra ngoại lệ một cách rõ ràng hơn với từ khóa raise
. Mời bạn xem ví dụ sau:
def reciprocal(num):
try:
r = 1/num
except:
print('Da thay ngoai le')
return
return r
print(reciprocal(10))
print(reciprocal(0))
Output:
0.1
Da thay ngoai le
None
Trong ví dụ trên, hàm reciprocal()
trả về giá trị phân số đảo ngược của số đầu vào.
Khi nhập 10, bạn sẽ nhận được đầu ra bình thường là 0.1. Nhưng khi nhập 0, lỗi ZeroDivisionError
sẽ tự động được đưa lên.
Điều này được ghi lại bằng cách sử dụng khối try…except
và kết quả trả về là None. Chúng ta có thể đưa lỗi ZeroDivisionError
một cách rõ ràng hơn bằng cách kiểm tra đầu vào và xử lý nó như sau:
if num == 0:
raise ZeroDivisionError('Khong the chia cho 0')
finally
finally
được sử dụng cùng với try…except
để đóng các tài nguyên hoặc các luồng tệp.
Việc sử dụng finally
nhằm đảm bảo rằng khối mã bên trong nó được thực thi, ngay cả khi có một ngoại lệ chưa được xử lý. Ví dụ:
try:
Try-block
except exception1:
Exception1-block
except exception2:
Exception2-block
else:
Else-block
finally:
Finally-block
Ở đây, nếu có 1 ngoại lệ trong khối Try-block
, nó sẽ được xử lý trong khối except
hoặc else
. Nhưng cho dù quy trình thực thi diễn ra theo thứ tự nào, thì chúng ta có thể yên tâm rằng khối Finally-block
vẫn sẽ được thực thi ngay cả khi có lỗi. Điều này giúp ích khác nhiều trong việc dọn dẹp tài nguyên xử lý.
👉 Xem thêm bài: Xử lý ngoại lệ - Exception Handling trong Python
for
for
được sử dụng để tạo vòng lặp với số lần lặp biết trước trong Python.
Trong Python, bạn có thể sử dụng for
với bất kì loại chuỗi nào như dạng list hay string. Ví dụ dưới đây là sử dụng for
để duyệt qua danh sách tên:
names = ['Han','Nam','Ngoc','Trung']
for i in names:
print('Xin chao '+i)
Kết quả đầu ra:
Xin chao Han
Xin chao Nam
Xin chao Ngoc
Xin chao Trung
👉 Xem thêm về Vòng lặp for trong Python
from, import
Từ khóa import
được sử dụng để nhập các module vào không namespace hiện tại. from…import
được sử dụng để nhập các thuộc tính hoặc chức năng cụ thể vào namespace. Ví dụ sau sẽ nhập module math
:
import math
Sau khi nhập xong, chúng ta có thể sử dụng hàm cos()
bên trong nó như là math.cos()
. Tuy nhiên nếu chúng ta chỉ muốn nhập hàm cos()
, thì có thể thực hiện lệnh sau:
from math import cos
và bây giờ bạn có thể sử dụng hàm đơn giản như cos()
chứ ko cần viết đầy đủ math.cos()
.
👉 Tìm hiểu thêm về Module trong Python.
global
global
được sử dụng để khai báo rằng 1 biến bên trong hàm là biến toàn cục (bên ngoài hàm).
Nếu chúng ta cần đọc giá trị của 1 biến toàn cục, thì không cần nhất thiết phải xác định nó là global
. Điều này sẽ mặc định được hiểu.
Còn nếu bạn cần sửa đổi giá trị của 1 biến toàn cục bên trong 1 hàm, thì phải khai báo nó là global
. Nếu không, sẽ có 1 biến cục bộ trùng tên được tạo ra. Ví dụ sau giúp bạn hiểu rõ hơn nà:
globvar = 10
def read1():
print(globvar)
def write1():
global globvar
globvar = 5
def write2():
globvar = 15
read1()
write1()
read1()
write2()
read1()
Bạn sẽ thấy kết quả như sau:
10
5
5
Trong ví dụ trên, hàm read1()
chỉ là đọc giá trị của globvar và in ra, vì vậy chúng ta không cần khai báo nó là global
. Nhưng hàm write1()
sẽ sửa đổi giá trị của nó, vì vậy ta cần khai báo nó là biến toàn cục global
.
Chúng ta có thể thấy trong kết quả đầu ra là việc sửa đổi đã diễn ra: globvar được đổi từ 10 thành 5. write2()
cũng cố gắng sửa đổi giá trị này nhưng vì nó không được khai báo global
nên việc sửa đổi này không thành công.
Do đó, 1 biến cục bộ mới được tạo ra và không thể hoạt động bên ngoài hàm write2()
này. Và khi chạy thử lại read1()
bạn sẽ vẫn chỉ thấy giá trị sau khi đã bị đổi (5) ở hàm write1()
.
in
in
được sử dụng để kiểm tra xem 1 giá trị bất kì có trong chuỗi (list, tuple, string...) hay không. Nó sẽ trả về True
nếu chuỗi đó có chứa giá trị, nếu không sẽ trả về False
. Ví dụ như sau:
>>> a = [2, 4, 6, 8, 10]
>>> 10 in a
True
>>> 5 in a
False
Công dụng tiếp theo của in
là duyệt qua 1 chuỗi trong vòng lặp for
:
for i in 'hello':
print(i)
Kết quả sẽ là:
h
e
l
l
o
is
is
được sử dụng trong Python để kiểm tra nhận dạng của đối tượng. Trong khi toán tử ==
được sử dụng để kiểm tra xem 2 biến có bằng nhau không, thì is
được sử dụng để kiểm tra xem 2 biến có tham chiếu đến cùng 1 đối tượng hay không.
Nó trả về True
nếu các đối tượng giống hệt nhau và False
nếu không.
>>> True is True
True
>>> False is False
True
>>> None is None
True
Ở ví dụ trên, chúng ta thấy rằng chỉ có 1 trường hợp True
, False
và Nope
trong Python, vì vậy chúng giống hệt nhau.
>>> [] == []
True
>>> [] is []
False
>>> {} == {}
True
>>> {} is {}
False
Giải thích ví dụ trên: Một list hoặc dictionary trống thì sẽ bằng với một list/dictionary trống khác. Tuy vậy, chúng không phải là những đối tượng giống hệt nhau, vì chúng nằm ở các vị trí riêng biệt trong bộ nhớ. Điều này là do list và dictionary có thể thay đổi (giá trị có thể được thay đổi).
>>> '' == ''
True
>>> '' is ''
True
>>> () == ()
True
>>> () is ()
True
Với ví dụ trên, không giống như list hay dictionary, string và tuple là bất biến (không thể thay đổi giá trị khi đã xác định). Do đó, 2 string và tuple bằng nhau cũng giống hệt nhau. Chúng cùng ở một ví trí bộ nhớ.
lambda
lambda
được sử dụng để tạo 1 hàm vô danh (hàm không có tên). Nó là một hàm nội tuyến không chứa câu lệnh return
. Ví dụ:
a = lambda x: x*2
for i in range(1,6):
print(a(i))
Kết quả trả về:
2
4
6
8
10
Ở ví dụ trên, chúng ta đã sử dụng lambda
tạo ra một hàm x2 lần các giá trị trong danh sách từ 1 đến 5.
👉 Tìm hiểu thêm về Hàm vô danh lamda trong Python.
nonlocal
Việc sử dụng từ khóa nonlocal
rất giống với global
. nonlocal
được sử dụng để khai báo rằng 1 biến bên trong 1 hàm lồng nhau (hàm bên trong hàm) không phải là cục bộ của nó, có nghĩa là nó nằm trong hàm bao bên ngoài.
Nếu chúng ta cần sửa đổi giá trị của 1 biến không cục bộ bên trong hàm lồng nhau, thì phải khao báo nó là nonlocal
. Nếu không, 1 biến cục bộ cùng tên đó sẽ được tạo ra bên trong hàm lồng nhau. Thật là rắc rối, cần phải xem kỹ ví dụ sau để hiểu thêm:
def outer_function():
a = 5
def inner_function():
nonlocal a
a = 10
print("Hàm bên trong: ",a)
inner_function()
print("Hàm bên ngoài: ",a)
outer_function()
Kết quả:
Hàm bên trong: 10 Hàm bên ngoài: 10
Ở đây, hàm inner_function()
được lồng vào bên trong hàm outer_function()
. Biến a nằm ở hàm outer_function()
vì vậy, nếu chúng ta muốn sửa đổi nó trong hàm inner_function()
, chúng ta phải khao báo nó là nonlocal
. Lưu ý rằng a không phải là biến global
.
Do vậy, chúng ta thấy trong kết quả là biến đã được sửa đổi thành công bên trong hàm inner_function()
lồng nhau. Kết quả của việc không sử dụng từ khóa nonlocal
sẽ như sau:
def outer_function():
a = 5
def inner_function():
a = 10
print("Hàm bên trong: ",a)
inner_function()
print("Hàm bên ngoài: ",a)
outer_function()
Hàm bên trong: 10
Hàm bên ngoài: 5
Ở đây, chúng ta không khai báo biến a là nonlocal
bên trong hàm lồng nhau. Do đó, một biến cục bộ mới cùng tên đã được tạo ra, nhưng biến này không sửa đổi được vào biến a ban đầu trong phần in ra sau cùng.
pass
pass
là một câu lệnh null
trong Python. Không có gì xảy ra khi nó được thực thi. Nó được sử dụng như một trình giữ chỗ.
Giả sử chúng ta có một chức năng chưa được triển khai, nhưng sẽ phải triển khai nó trong tương lai. Đơn giản chỉ cần viết:
def ham(args):
pass
Ở chương trình trên nếu không có dữ liệu gì, hàm sẽ trả về lỗi IndentationError
, thay vì điều đó, chúng ta chỉ cần tạo 1 phần thân chờ sẵn với câu lệnh pass
.
Chúng ta cũng có thể làm điều tương tự trong 1 class trống:
class vi_du:
pass
return
Câu lệnh return
được sử dụng bên trong 1 hàm để thoát khỏi nó và trả về 1 giá trị. Nếu chúng ta không trả về 1 giá trị cụ thể, thì giá trị None sẽ được tự động trả về. Xem cụ thể hơn ở ví dụ sau:
def func_return():
a = 10
return a
def no_return():
a = 10
print(func_return())
print(no_return())
Kết quả đầu ra:
10
None
while
while
được sử dụng khi bạn muốn tạo vòng lặp liên tục thực thi các lệnh bên trong cho tới khi điều kiện của while được đánh giá là False hoặc gặp phải câu lệnh break
. Lưu ý rằng 0 có nghĩa là False. Chương trình sau sẽ minh họa cụ thể hơn:
i = 5
while(i):
print(i)
i = i-1
Kết quả đầu ra:
5
4
3
2
1
👉 Tìm hiểu thêm về Vòng lặp while trong Python.
with
Câu lệnh with
được dùng để bao bọc việc thực thi 1 khối mã lệnh trong các phương thức được xác định bởi trình quản lý ngữ cảnh.
Trình quản lý ngữ cảnh là một class triển khai các phương thức __enter__
và __exit__
. Việc sử dụng with
nhằm đảm bảo rằng phương thức __exit__
được gọi ở cuối khối lồng nhau. Khái niệm này tương tự như việc sử dụng khối try...last
. Ví dụ:
with open('quantrimang.txt', 'w') as my_file:
my_file.write('Xin chào!')
Ví dụ trên sẽ viết dòng chữ Xin chào! vào tệp quantrimang.txt. Các đối tượng file có phương thức __enter__
và __exit__
được xác định bên trong chúng, vì vậy chúng hoạt động như trình quản lý ngữ cảnh riêng.
yield
yield
được sử dụng để trả về giá trị của hàm mà không hủy đi trạng thái của các biến trong hàm đó. Nó sẽ tạm giữ trạng thái của các biến tại vị trí yield
đầu tiên, sau đó sẽ tiếp tục xử lý trong những lần gọi hàm tiếp theo.
Bất cứ 1 hàm nào có chứa yield đều đc coi là 1 đối tượng generator. Mỗi lệnh yield sẽ trả về một phần tử Generator object. Bạn có thể sử dụng nhiều từ khóa yield trong 1 hàm.
Ví dụ 1:
def generator():
yield 10
yield 2*5
yield 9/3
for item in generator():
print(item)
Kết quả trả về:
10
10
3.0
Trong ví dụ 1, sau mỗi vòng lặp for
thì hàm generator()
sẽ được gọi, lúc này nó sẽ lần lượt trả về các số 10, kết quả của 2*5 và 9/3 cho mỗi lần lặp.
Ví dụ 2:
def generator():
for i in range(7):
yield i*i
g = generator()
for i in g:
print(i)
Kết quả trả về:
0
1
4
9
16
25
36
Ở ví dụ 2, hàm generator()
trả về 1 bình phương của từng số từ 0 đến 6, kết quả sẽ được lần lượt in trong vòng lặp for
.
Vậy là qua bài viết này, bạn đã nắm sơ bộ cách hoạt động của tất cả các keyword trong Python rồi đó. Để tìm hiểu kỹ hơn các từ khóa thường dùng thì bạn có thể tham khảo dần trong các bài viết sau nhé!
Bạn nên đọc
Cũ vẫn chất
-
Đấu Trường Chân Lý Mobile (TFT Mobile)
-
Code LaLa Land Lục Địa Bí Ẩn mới nhất và cách nhập code
Hôm qua 2 -
30 lời chúc sinh nhật chồng yêu ý nghĩa và ngọt ngào
Hôm qua 1 -
Bạn đã sử dụng keo tản nhiệt đúng cách?
Hôm qua -
Hướng dẫn toàn tập Word 2016 (Phần 26): Tạo đồ họa SmartArt
Hôm qua -
70 câu ca dao, tục ngữ về học tập hay nhất
Hôm qua -
‘Ghét’ Apple, Mark Zuckerberg vẫn phải dùng Macbook nhưng nó lạ lắm
Hôm qua 1 -
Hướng dẫn chuyển sang ngôn ngữ tiếng Việt cho Gmail
Hôm qua -
Cách sao chép định dạng trong Google Docs, Sheets và Slides
Hôm qua -
Những câu nói hay về mùa thu, lời chào mùa thu hay và ý nghĩa
Hôm qua