Chuyển đến nội dung chính

Tqdm Python: Hướng dẫn kèm ví dụ thực tiễn

tqdm là một thư viện Python cung cấp thanh tiến trình nhanh, có thể mở rộng cho vòng lặp và iterable, giúp bạn dễ dàng hình dung tiến độ chạy mã.
Đã cập nhật 5 thg 6, 2026  · 11 phút đọc

Bạn đã từng rơi vào tình huống một script Python chạy lâu khiến bạn băn khoăn không biết đằng sau màn hình có đang xảy ra gì không?

Sự bất định về tiến độ có thể khiến bạn hủy một phiên chạy gần hoàn tất, hoặc chờ đợi vô tận cho một script đã bị gián đoạn.

Thư viện tqdm của Python giải quyết vấn đề này bằng cách cung cấp các chỉ báo tiến độ cho script của bạn.

ví dụ thanh tiến trình của tqdm

tqdm là gì?

Tqdm là một thư viện Python cung cấp các thanh tiến trình nhanh, có thể mở rộng cho vòng lặp và iterable. Đây là một cách đơn giản để theo dõi tiến độ của các tác vụ tốn thời gian.

Tên của thư viện có nghĩa là "tiến bộ" trong tiếng Ả Rập (taqadum, تقدّم), và là viết tắt của cụm "tôi yêu bạn rất nhiều" trong tiếng Tây Ban Nha (te quiero demasiado).

Tqdm theo dõi tiến độ và cập nhật hiển thị thanh tiến trình bằng cách đếm số vòng lặp, tính thời gian đã trôi qua cũng như thời gian còn lại, và trực quan hóa tiến độ tổng thể qua phần thanh được lấp đầy.

Nó dùng các thuật toán thông minh để dự đoán thời gian còn lại, và bỏ qua những lần cập nhật không cần thiết để giảm chi phí. Việc dùng tqdm mang lại nhiều lợi ích, bao gồm:

  • Phản hồi trực quan: Thanh tiến trình giúp người dùng thấy được mức độ hoàn thành và ước lượng thời gian cho phần còn lại.
  • Hoạt động ở mọi nơi: Thư viện tqdm hoạt động trên mọi nền tảng (Linux, Windows, Mac, FreeBSD, NetBSD, SunOS), trong mọi console hoặc giao diện GUI.
  • Dễ tích hợp: Tqdm tích hợp mượt với Jupyter Notebook, các thư viện phổ biến như Pandas, và các cấu trúc Python thông dụng như vòng lặp.
  • Tùy biến: Nó cung cấp nhiều tùy chọn để điều chỉnh giao diện và hành vi của thanh tiến trình, chúng ta sẽ đề cập sau.
  • Hiệu năng: Trong khi các gói tương tự như ProgressBar có chi phí 800ns/vòng lặp, chi phí 60ns/vòng lặp của tqdm giúp chạy nhanh hơn nhiều.

Cách cài đặt Tqdm 

Như hầu hết các thư viện Python khác, cách dễ nhất để cài tqdm là dùng trình quản lý gói pip.

pip install tqdm

Tqdm: Ví dụ đơn giản

Để tạo một thanh tiến trình, ta bọc iterable bằng hàm tqdm() (được import từ mô-đun tqdm). Hãy xem một ví dụ đơn giản. Hàm time.sleep(0.01) đóng vai trò giữ chỗ cho đoạn mã sẽ chạy ở mỗi vòng lặp.

from tqdm import tqdm
    for i in tqdm(range(1000)):
    time.sleep(0.01)
    # …

gif hiển thị thanh tiến trình hoàn tất từ mã ví dụ trong vòng 10 giây.

Lối tắt cho tdqm(range(n))trange(n). Đoạn mã sau sẽ cho kết quả y hệt ví dụ trên:

from tqdm import tqdm
    for i in trange(1000):
	time.sleep(0.01)
	# …

Cả hai ví dụ đều cho một thanh tiến trình giống như trên.

Hãy quan sát kỹ thanh tiến trình để xem nó cung cấp những thông tin gì. Cùng phân rã các chi tiết do tqdm hiển thị:

  • Chỉ báo tiến độ:
    • Phần trăm số vòng lặp
    • Mức lấp đầy thanh
    • Tỷ lệ số vòng lặp so với tổng
  • Các chỉ số:
    • Thời gian đã trôi qua
    • Thời gian ước tính còn lại
    • Hiệu suất (vòng lặp mỗi giây)

Tùy biến Tqdm: Biến thanh tiến trình theo ý bạn

Tqdm cung cấp nhiều tùy chọn để điều chỉnh giao diện và hành vi của thanh tiến trình. Chúng ta sẽ xem các tham số tùy biến quan trọng nhất trước khi đi vào các trường hợp sử dụng nâng cao của tqdm.

Thêm mô tả cho thanh tiến trình

Một tùy biến phổ biến là thêm nhãn mô tả với tham số desc, giúp thanh tiến trình giàu thông tin hơn và hỗ trợ theo dõi nhiều iterable khác nhau.

Ví dụ, thêm tham số desc=”Processing large range” sẽ hiển thị tiêu đề “Processing large range” bên trái thanh tiến trình.

for _ in tqdm(range(20000000), desc="Processing large range"):
	continue

Bạn hãy thử chạy đoạn mã trên trong môi trường của mình với và không có tham số desc để thấy sự khác biệt.

Chỉ định tổng số vòng lặp

Tham số total chỉ định tổng số vòng lặp trong vòng lặp, cho phép tqdm ước tính chính xác hơn thời gian còn lại và phần trăm hoàn thành.

Trong ví dụ cơ bản dùng tqdm(range()) hoặc trange() thì điều này không cần thiết, vì số vòng lặp đã nằm trong ngoặc. Tuy nhiên, có hai kịch bản chính mà việc thêm tham số total=n (với n là tổng số) sẽ hữu ích: 

1. Iterable không có phương thức len(): Với những iterable không có len(), như generator có số phần tử không biết trước, bạn cần cung cấp giá trị total thủ công. Nếu không có tham số này, tqdm() chỉ hiển thị số vòng lặp đã hoàn thành. Lưu ý rằng thanh tiến trình sẽ bắt đầu lại nếu số phần tử thực tế vượt quá số total đã chỉ định.

from tqdm import tqdm
import time
import random
 
# Function generating random number between 1 and 100
def generate_random_numbers():
	while True:
	        yield random.randint(1, 100)
 
# Without total: tqdm() only shows number of iterations, does not know total
for num in tqdm(generate_random_numbers(), desc=’Random Iteration’):
	time.sleep(0.01)
	# …

GIF này chỉ hiển thị số vòng lặp mà không có thanh tiến trình.

Đây là cách hiển thị khi số phần tử không biết trước và ta không chỉ định tổng.

# With total (assuming you know the desired number of iterations): tqdm() shows progress
num_iterations = 1000
for num in tqdm(generate_random_numbers(), total=num_iterations, desc="Random Iteration"):
	time.sleep(0.01)
	# …

Trong GIF này, thanh tiến trình xuất hiện trở lại sau khi tham số total được chỉ định.

Tốt hơn nhiều, giờ thì thanh tiến trình đã hiện!

2. Cập nhật thủ công: Nếu chúng ta cập nhật thanh tiến trình thủ công trong một hàm bằng phương thức update(), cần chỉ định giá trị total để đảm bảo theo dõi tiến độ chính xác. Phương thức update() cho phép phản hồi các quy trình thay đổi động hoặc triển khai cơ chế theo dõi tiến độ tùy chỉnh. Ta sẽ bàn đến sau.

Tinh chỉnh giao diện hiển thị

Nếu muốn thay đổi thứ tự sắp xếp các thành phần của thanh tiến trình, ta có thể đặt tham số bar_format thành chuỗi định dạng mong muốn. Bằng cách này, ta kiểm soát vị trí của các thành phần như phần trăm, thời gian đã trôi qua, và ký tự lấp thanh. Để biết thêm chi tiết, hãy tham khảo tài liệu

Một điều chỉnh khác về giao diện có thể thực hiện bằng tham số colour. Có thể dùng tên màu như ‘green’ hoặc chuỗi mã hex như ‘#00ff00’.

Tham số leave liên quan đến việc ẩn/hiện sau khi hoàn tất: nó quyết định thanh tiến trình có giữ lại sau khi hoàn thành hay không. Nếu đặt True, thanh sẽ được giữ lại sau khi vòng lặp kết thúc; nếu đặt False, nó sẽ biến mất.

Hãy xem khác biệt về hiển thị qua ví dụ sau. Đoạn mã sau tạo ba thanh tiến trình: một với thiết lập mặc định, một thay đổi thứ tự phần tử và màu sắc, và một được đặt để biến mất sau khi hoàn tất. Kết quả hiển thị trong GIF bên dưới.

from tqdm import tqdm
import time
 
# Progress bar 1: Default settings
for i in tqdm(range(300)):
	time.sleep(0.01)
 
# Progress bar 2: Customized bar format and color
for i in tqdm(range(300), bar_format='[{elapsed}<{remaining}] {n_fmt}/{total_fmt} | {l_bar}{bar} {rate_fmt}{postfix}', colour='yellow'):
	time.sleep(0.01)
 
# Progress bar 3: Customized bar format and color, leave=False
for i in tqdm(range(300), bar_format='[{elapsed}<{remaining}] {n_fmt}/{total_fmt} | {l_bar}{bar} {rate_fmt}{postfix}', colour='red', leave=False):
	time.sleep(0.01)

Một gif hiển thị ba thanh tiến trình khác nhau: 1) thanh cơ bản với thiết lập mặc định, 2) thanh màu vàng có thời gian đã trôi qua và ước tính thời gian ở bên trái phần trăm hoàn thành và thanh tiến trình, 3) phiên bản màu đỏ của thanh thứ hai biến mất sau khi hoàn tất.

Sử dụng nâng cao: Xử lý các kịch bản phức tạp hơn

Giờ khi đã biết cách tạo một thanh tiến trình đơn giản và tùy biến nó, chúng ta có thể tiến tới vài trường hợp nâng cao hơn.

Thanh tiến trình lồng nhau

Vòng lặp lồng nhau là vòng lặp nằm trong vòng lặp khác. Tương ứng, thanh tiến trình lồng nhau là một chuỗi thanh tiến trình cho mỗi vòng lặp nằm trong vòng lặp khác. Để tạo chúng, hãy bọc mỗi vòng bằng hàm tqdm() và thêm nhãn mô tả cho từng iterable. 

Đoạn mã sau có ba vòng lặp lồng nhau và minh họa cách các thanh tiến trình lồng nhau xuất hiện:

from tqdm import trange
import time
 
for i in trange(3, desc='outer loop'):
	for j in trange(2, desc='middle loop'):
   		for k in trange(6, desc='inner loop'):
	time.sleep(0.01)

Ảnh chụp màn hình hiển thị ba thanh tiến trình lồng nhau trong Jupyter Notebook. Thanh ngoài cùng theo dõi outer loop, thanh giữa theo dõi middle loop, và thanh trong cùng theo dõi inner loop. Mỗi thanh hiển thị vòng lặp hiện tại, tổng số vòng, thời gian ước tính còn lại, và phần trăm hoàn thành. Thứ tự các thanh như mô tả trong bài.

Trong kết quả cuối cùng ở trên, ta có thể nhận ra một quy luật cập nhật giữa các thanh tiến trình. Tqdm sẽ luôn bắt đầu với vòng lặp ngoài cùng cho đến khi vào vòng trong cùng, nơi các vòng lặp được xử lý và thanh tương ứng được cập nhật.

Giả sử ta có ba vòng lặp lồng nhau như ví dụ. Sau vòng lặp trong đầu tiên, nó sẽ quay lên vòng giữa, cập nhật rằng đã hoàn thành một vòng, rồi quay lại vòng trong. Quá trình này lặp lại cho đến khi vòng giữa được đánh dấu hoàn tất, khi đó thanh ngoài sẽ hiển thị đã hoàn thành một vòng.

Điều tương tự cũng xảy ra giữa vòng ngoài và vòng giữa. Cuối cùng, lần chạy trong cùng hoàn tất vòng giữa, và vòng giữa hoàn tất vòng ngoài còn lại.

Cập nhật thủ công

Cập nhật thanh tiến trình thủ công với tqdm hữu ích trong một số kịch bản:

  • Iterable có độ dài không biết: Khi làm việc với iterable không có độ dài xác định (ví dụ: generator, luồng mạng), ta có thể cập nhật thủ công dựa trên lượng dữ liệu đã xử lý hoặc số thao tác đã hoàn thành.
  • Quy trình thay đổi động: Nếu số vòng lặp hoặc thời gian xử lý mỗi vòng có thể thay đổi trong quá trình chạy, cập nhật thủ công cho phép điều chỉnh thanh tiến trình tương ứng.
  • Theo dõi tiến độ tùy chỉnh: Để kiểm soát chi tiết hơn, ta có thể cập nhật dựa trên tiêu chí hoặc sự kiện cụ thể. Ví dụ, cập nhật khi hoàn thành các mốc quan trọng hoặc tiến độ của các tác vụ con trong một quy trình lớn hơn.
  • Tích hợp với hệ thống bên ngoài: Khi tích hợp tqdm với hệ thống hoặc thư viện bên ngoài không có cơ chế theo dõi tiến độ tự nhiên, ta có thể dùng cập nhật thủ công để đồng bộ thanh tiến trình với quy trình bên ngoài.

Để cập nhật thủ công một thanh tiến trình tqdm, điều quan trọng là phải chỉ định tham số total như ước lượng số vòng lặp tối đa dự kiến. Sau đó, khi mã xử lý mỗi phần tử mới, cần cập nhật thanh bằng phương thức update(). Giá trị cập nhật nên phản ánh số vòng lặp đã xử lý kể từ lần cập nhật trước.

Giả sử ta kỳ vọng iterable có tối đa 750 phần tử. Trong ví dụ này, độ dài thực tế là một số ngẫu nhiên từ 100 đến 1000, và ta không biết trước. Ta khởi tạo progress_bar, đặt estimated_total là 750. Sau đó lặp qua dữ liệu, cập nhật thanh sau mỗi phần tử được xử lý.

from tqdm import tqdm
def process_data(data):
	time.sleep(0.01)        	# simulate processing data
	processed_data = data
	return processed_data
# Generate an iterable with random length between 100 and 1,000
random_length = random.randint(100, 1000)
data_list = [i for i in range(random_length)]
# Define estimated maximum number of iterations
estimated_total = 750 
# Define the progress bar using the estimated_total
progress_bar = tqdm(total=estimated_total)
# Iterating through data list of unknown length
for data in data_list:
	processed_data = process_data(data)
	progress_bar.update(1)

Trong GIF này, thanh tiến trình đạt 100% (750/750), rồi tiếp tục đếm các vòng còn lại (cuối cùng là 950).

Chúng ta đã ước lượng thiếu độ dài của iterable, khiến đầu ra tiếp tục đếm vòng sau khi đạt 100%.

Multiprocessing

Multiprocessing và threading là các kỹ thuật thực thi song song, cải thiện hiệu năng và độ phản hồi. Trong các kịch bản này, việc theo dõi tiến độ của từng tác vụ hoặc tiến độ tổng thể của thực thi song song có thể là thách thức. Tqdm là công cụ hữu ích để cung cấp phản hồi trực quan và giám sát tiến độ của các thao tác đồng thời.

Mô-đun tqdm.contrib.concurrent cung cấp các hàm chuyên biệt để tạo thanh tiến trình trong bối cảnh multiprocessing hoặc threading. Các hàm này xử lý việc đồng bộ và giao tiếp giữa tiến trình chính và các tiến trình/luồng làm việc, đảm bảo thanh được cập nhật chính xác. Chúng được thiết kế để hoạt động mượt với API concurrent.futures, dùng ProcessPoolExecutor() hoặc ThreadPoolExecutor().

Đây là ví dụ dùng mô-đun tqdm.contrib.concurrent.futures:

import concurrent.futures
from tqdm.contrib.concurrent import process_map
 
def process_data(data):
	for i in tqdm(range(100), desc=f"Processing {data['name']}"):
	    	# Process data
	    	time.sleep(0.01)
 
if __name__ == '__main__':
	with concurrent.futures.ProcessPoolExecutor() as executor:
	    	results = process_map(process_data, [
	        	{'name': 'dataset1'},
	        	{'name': 'dataset2'},
	# …
	])

Trong ví dụ này, hàm process_data() bao gồm một thanh tiến trình tqdm để theo dõi tiến độ của nó. Hàm process_data() sẽ được thực thi song song cho từng phần tử dữ liệu trong danh sách. Điều này có nghĩa là nhiều thanh tiến trình sẽ hiển thị đồng thời, mỗi thanh đại diện cho tiến độ của một tiến trình riêng. Tham số desc được đặt để tạo mô tả động cho từng thanh dựa trên tên của bộ dữ liệu tương ứng, giúp chúng ta phân biệt các thanh khác nhau.

Tích hợp với pandas

Mô-đun tqdm.pandas cung cấp cách tiện lợi để thêm thanh tiến trình vào các thao tác pandas. Điều này đặc biệt hữu ích cho các thao tác tốn thời gian trên DataFrame lớn, vì nó cung cấp phản hồi trực quan về tiến độ tác vụ. Ta có thể áp dụng decorator tqdm.pandas() cho bất kỳ hàm pandas nào thao tác trên hàng hoặc cột.

Để bắt đầu, ta tạo một DataFrame ngẫu nhiên với 100.000 hàng và gọi decorator tqdm.pandas(). Nếu muốn tùy biến thanh tiến trình, đây là thời điểm để làm, vì các hàm progress_apply()progress_map() không nhận tham số của tqdm(). Ở đây ta muốn đặt tên cho các thanh, nên cũng chỉ định tham số desc.

import pandas as pd
import numpy as np
from tqdm import tqdm
 
df = pd.DataFrame(np.random.randint(0, 10, (100000, 6)))
 
tqdm.pandas(desc='DataFrame Operation')

Giờ ta có thể áp dụng hàm cho hàng, cột hoặc toàn bộ DataFrame. Thay vì dùng một trong các hàm apply() hoặc map(), hãy gọi progress_apply() hoặc progress_map(), và thanh tiến trình sẽ xuất hiện. Nhớ rằng apply()progress_apply() có thể áp dụng cho DataFrame, hàng hoặc cột, trong khi map()progress_map() chỉ áp dụng cho Series hoặc cột. Ví dụ:

# Halving each value in the DataFrame using progress_apply()
Result_apply = df.progress_apply(lambda x: x / 2)
 
# Doubling each element of the first column using progress_map()
result_map = df[0].progress_map(lambda x: x * 2)

Tqdm: Lỗi thường gặp và cách khắc phục

Hãy thảo luận một số vấn đề và lỗi Tqdm thường gặp và cách khắc phục.

Thanh tiến trình không cập nhật

Một trong những vấn đề phổ biến khi dùng tqdm là thanh tiến trình không cập nhật. Điều này thường do đệm (buffering), đặc biệt trong môi trường như Jupyter Notebook. Khi đầu ra bị đệm, thanh tiến trình có thể không hiển thị hoặc cập nhật ngay, tạo cảm giác tiến trình bị treo hoặc không phản hồi.

Dùng mô-đun tqdm.notebook có thể khắc phục vấn đề đệm và đảm bảo thanh cập nhật chính xác trong Jupyter Notebook. Mô-đun này cung cấp thanh tiến trình dạng GUI được thiết kế riêng cho môi trường Jupyter.

Ngoài ra, nó còn có gợi ý màu dễ hiểu (xanh lam: bình thường, xanh lục: hoàn tất, đỏ: lỗi/gián đoạn).

Nếu ta ngắt đoạn mã từ ví dụ thanh tiến trình lồng nhau, nó sẽ trông như sau:

Ảnh chụp màn hình hiển thị một lần chạy bị ngắt của ba thanh tiến trình lồng nhau trong Jupyter Notebook. Tất cả thanh đã hoàn thành có màu xanh lục, còn các thanh bị gián đoạn có màu đỏ.

Thanh tiến trình lồng nhau trong Python dùng tqdm.notebook, minh họa cách phối màu giữa thanh hoàn tất và thanh bị gián đoạn.

Một cách khác để khắc phục việc không cập nhật là xả (flush) luồng xuất một cách tường minh. Khi dữ liệu được ghi ra luồng xuất chuẩn (ví dụ dùng print()), dữ liệu thường được đệm trước khi gửi đến thiết bị xuất thực. Gọi xả luồng buộc trình thông dịch Python gửi ngay dữ liệu đang đệm, đảm bảo hiển thị/ghi mà không trễ. 

Để xả đầu ra, dùng phương thức flush() của luồng xuất chuẩn. Để đầu ra phản hồi tốt hơn, hãy cân nhắc xả thường xuyên hơn, có thể sau vài vòng lặp hoặc sau một khoảng thời gian nhất định. Lưu ý đánh đổi vì xả luồng có thể làm tăng chi phí. Đây là ví dụ tích hợp phương thức này vào một quy trình tqdm đơn giản:

import sys
import time
from tqdm import tqdm
 
for i in tqdm(range(100)):
	time.sleep(0.1)
	sys.stdout.flush()  # Flush the output stream after each iteration

Vấn đề tương thích

Mặc dù tqdm nói chung tương thích với hầu hết môi trường và thư viện Python, đôi khi vẫn có vấn đề hoặc hành vi bất ngờ. Một số tình huống thường gặp gồm:

  • Luồng xuất tùy chỉnh: Khi dùng luồng xuất tùy chỉnh hoặc chuyển hướng đầu ra vào tệp, tqdm có thể không hoạt động như kỳ vọng. Cần đảm bảo luồng xuất đang dùng hỗ trợ các thao tác cần thiết để hiển thị thanh tiến trình.
  • Thư viện bên thứ ba: Đôi khi tqdm có thể tương tác không như mong muốn với thư viện bên thứ ba, đặc biệt các thư viện tự xử lý đầu ra hoặc theo dõi tiến độ. Hãy thử tắt hoặc điều chỉnh tính năng liên quan của thư viện đó để xem có khắc phục được không.
  • Tương thích phiên bản: Luôn là thực hành tốt khi dùng các phiên bản tqdm và thư viện khác tương thích. Kiểm tra tài liệu thư viện để biết các vấn đề tương thích đã biết với phiên bản Python hoặc phụ thuộc cụ thể.

Khi gặp vấn đề tương thích, hãy cân nhắc các cách sau:

  • Hạ/cập nhật phiên bản: Thử một phiên bản tqdm khác.
  • Chỉnh sửa mã: Nếu cần, điều chỉnh mã để vượt qua xung đột tương thích.
  • Nhờ cộng đồng hỗ trợ: Nếu vẫn không được, hãy liên hệ cộng đồng tqdm hoặc các diễn đàn trực tuyến để được hỗ trợ và gợi ý giải pháp.

Ghi nhớ các vấn đề tương thích tiềm ẩn và cách khắc phục, chúng ta có thể hiệu quả xử lý và giải quyết mọi trục trặc gặp phải khi dùng tqdm trong các dự án Python.

Kết luận

Tóm lại, Tqdm là thư viện Python cung cấp cho chúng ta các thanh tiến trình và thống kê hữu ích khác, giúp việc giám sát và quản lý quá trình chạy mã trở nên dễ dàng hơn.

Dù bạn đang lặp qua các tập dữ liệu lớn, huấn luyện mô hình học máy, hay thực hiện bất kỳ thao tác tốn thời gian nào khác, tqdm cung cấp một cách đơn giản nhưng mạnh mẽ để theo dõi tiến độ và nắm bắt trạng thái mã của bạn.

Để khám phá thêm, bạn có thể xem các hướng dẫn Python khác của DataCamp, tài liệu Tqdm, hoặc mã nguồn và Readme trên GitHub.

Câu hỏi thường gặp

Làm thế nào để tạo một thanh tiến trình đơn giản với tqdm?

Cài đặt và import thư viện tqdm, sau đó bọc iterable của bạn bằng hàm tqdm().

Tôi có thể dùng tqdm với pandas DataFrame hoặc các thư viện khác không?

Có, bạn có thể dùng tqdm với pandas DataFrame và các thư viện khác. Mô-đun tqdm.pandas cung cấp các hàm riêng để tích hợp tqdm với pandas.

Tôi có thể tùy biến giao diện thanh tiến trình của Tqdm không?

Có, bạn có thể tùy biến định dạng thanh, màu sắc, tổng số vòng lặp và nhiều thứ khác thông qua các tham số của Tqdm.

Thanh tiến trình Tqdm không cập nhật đúng, tôi nên làm gì?

Kiểm tra vấn đề đệm, đặc biệt trong Jupyter Notebook. Hãy thử dùng tqdm.notebook hoặc xả (flush) đầu ra tường minh. Đồng thời, đảm bảo dùng tham số total chính xác.


Tom Farnschläder's photo
Author
Tom Farnschläder
LinkedIn

Tom là một nhà khoa học dữ liệu và giảng viên kỹ thuật. Anh viết và quản lý các bài hướng dẫn và bài blog về khoa học dữ liệu của DataCamp. Trước đây, Tom làm việc trong lĩnh vực khoa học dữ liệu tại Deutsche Telekom.

Chủ đề

Các khóa học Python hàng đầu!

Courses

Hộp Công Cụ Python

4 giờ
318K
Tiếp tục phát triển kỹ năng Khoa học Dữ liệu hiện đại của bạn bằng cách tìm hiểu về các cấu trúc lặp (iterators) và biểu thức danh sách (list comprehensions).
Xem chi tiếtRight Arrow
Bắt đầu khóa học
Xem thêmRight Arrow