Hơn 100 bài tập Python kèm code mẫu được anh chàng zhiwehu chia sẻ trên Github, tuy nhiên, code mẫu của loạt bài tập này được viết trên phiên bản Python đã cũ. Sau đây, chúng ta sẽ Việt hóa và chỉnh sửa để phù hợp với bản Python 3.x giúp các bạn tiện học và luyện tập Python.
Lưu ý: Các code mẫu trong bài được viết trên Python 3.6.2, nếu bạn đang sử dụng phiên bản Python từ 2.5 trở xuống có thể không chạy được code vì trong bản Python mới nhiều lệnh, hàm đã được thay đổi.
Mô tả cấp độ Python
Level 1
Người vừa trải qua khóa học tổng quan về Python, có thể giải quyết một số vấn đề với 1, 2 class hoặc hàm Python. Những bài tập thuộc cấp độ này có thể tìm thấy trong các sách giáo khoa, tài liệu hướng dẫn thông thường.
Level 2
Người mới học Python nhưng đã có nền tảng lập trình tương đối mạnh mẽ từ trước, có thể giải quyết các vấn đề liên quan tới 3 lớp hoặc hàm Python. Những bài tập này thường không tìm thấy trong sách giáo khoa.
Level 3
Nâng cao, sử dụng Python để giải quyết những vấn đề phức tạp hơn bằng cách sử dụng nhiều hàm, cấu trúc dữ liệu và thuật toán phong phú. Ở cấp độ này bạn có thể giải quyết các vấn đề sử dụng vài package Python tiêu chuẩn và những kỹ thuật lập trình nâng cao.
Cấu trúc bài tập Python
Mỗi bài tập Python trong trang này sẽ gồm có 3 phần như sau:
- Câu hỏi.
- Gợi ý.
- Code mẫu.
Mình sẽ để các Bài tập Python nguyên xi dạng gốc như thế này, bạn có thể xem câu hỏi, gợi ý sau đó tự thực hành trước khi kéo xuống xem code mẫu nhé.
Bài tập Python level 1
Bài 1:
Câu hỏi:
Viết chương trình tìm tất cả các số chia hết cho 7 nhưng không phải bội số của 5, nằm trong đoạn 2000 và 3200 (tính cả 2000 và 3200). Các số thu được sẽ được in thành chuỗi trên một dòng, cách nhau bằng dấu phẩy.
Gợi ý:
Để giải quyết bài toán này, bạn có thể sử dụng vòng lặp for để duyệt qua tất cả các số trong đoạn từ 2000 đến 3200. Sau đó, bạn sử dụng câu lệnh if để kiểm tra xem mỗi số có chia hết cho 7 không và không phải là bội số của 5 không. Nếu đúng, thì in số đó ra màn hình.
Code mẫu:
j = [] for i in range(2000, 3201): if (i % 7 == 0) and (i % 5 != 0): j.append(str(i)) print(','.join(j))
Bài 2:
Câu hỏi:
Viết một chương trình có thể tính giai thừa của một số cho trước. Kết quả được in thành chuỗi trên một dòng, phân tách bởi dấu phẩy. Ví dụ, số cho trước là 8 thì kết quả đầu ra phải là 40320.
Gợi ý:
Trong trường hợp dữ liệu đầu vào được cung cấp, bạn hãy chọn cách để người dùng nhập số vào.
Code mẫu:
x = int(input("Nhập số cần tính giai thừa: ")) def giaiThua(x): if x == 0: return 1 return x * giaiThua(x-1) print(giaiThua(x))
Bài 3:
Câu hỏi:
Với số nguyên n nhất định, hãy viết chương trình để tạo ra một dictionary chứa (i, i*i) như là số nguyên từ 1 đến n (bao gồm cả 1 và n) sau đó in ra dictionary này.
Ví dụ: Giả sử số n là 8 thì đầu ra sẽ là: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64}.
Gợi ý:
- Viết lệnh yêu cầu nhập số nguyên n.
Code mẫu:
n = int(input("Nhập vào một số: ")) d = {} for i in range(1, n+1): d[i] = i*i print(d)
Bài 4:
Câu hỏi:
Viết chương trình chấp nhận một chuỗi số, phân tách bằng dấu phẩy từ giao diện điều khiển, tạo ra một danh sách và một tuple chứa mọi số.
Ví dụ: Đầu vào được cung cấp là 34,67,55,33,12,98 thì đầu ra là:
['34', '67', '55', '33', '12', '98'] ('34', '67', '55', '33', '12', '98')
Gợi ý:
- Viết lệnh yêu cầu nhập vào các giá trị sau đó dùng quy tắc chuyển đổi kiểu dữ liệu để hoàn tất.
Code mẫu:
values = input("Nhập vào các giá trị: ") l = values.split(",") t = tuple(l) print(l) print(t)
Bài 5:
Câu hỏi:
Định nghĩa một class có ít nhất 2 method:
getString
: để nhận một chuỗi do người dùng nhập vào từ giao diện điều khiển.printString
: in chuỗi vừa nhập sang chữ hoa.
Thêm vào các hàm kiểm tra đơn giản để kiểm tra method của class.
Ví dụ: Chuỗi nhập vào là "quantrimang.com" thì đầu ra phải là "QUANTRIMANG.COM".
Gợi ý:
- Sử dụng
__init__
để xây dựng các tham số.
Code mẫu:
class InputOutString(object): def __init__(self): self.s = "" def getString(self): self.s = input("Nhập chuỗi: ") def printString(self): print(self.s.upper()) strObj = InputOutString() strObj.getString() strObj.printString()
Bài 6:
Câu hỏi:
Viết một method tính giá trị bình phương của một số.
Gợi ý:
Sử dụng toán tử **
.
Code mẫu:
x = int(input("Nhập một số: ")) def square(num): return num**2 print(square(2)) print(square(3)) print(square(x))
Bài 7:
Câu hỏi:
Python có nhiều hàm được tích hợp sẵn, nếu không biết cách sử dụng nó, bạn có thể đọc tài liệu trực tuyến hoặc tìm vài cuốn sách. Nhưng Python cũng có sẵn tài liệu về hàm cho mọi hàm tích hợp trong Python. Yêu cầu của bài tập này là viết một chương trình để in tài liệu về một số hàm Python được tích hợp sẵn như abs()
, int()
, input()
và thêm tài liệu cho hàm bạn tự định nghĩa.
Gợi ý:
Sử dụng __doc__
Code mẫu:
print(abs.__doc__) print(int.__doc__) print(input.__doc__) def square(num): '''Trả lại giá trị bình phương của số được nhập vào. Số nhập vào phải là số nguyên.''' return num**2 print(square.__doc__)
Bài 8:
Câu hỏi:
Định nghĩa một lớp gồm có tham số lớp và có cùng tham số instance.
Gợi ý:
- Khi định nghĩa tham số instance, cần thêm nó vào
__init__
. - Bạn có thể khởi tạo một đối tượng với tham số bắt đầu hoặc thiết lập giá trị sau đó.
Code mẫu:
class Person: name = "Person" def __init__(self, name=None): self.name = name jeffrey = Person("Jeffrey") print("%s name is %s" % (Person.name, jeffrey.name)) nico = Person() nico.name = "Nico" print("%s name is %s" % (Person.name, nico.name))
Bài 9:
Câu hỏi:
Tính tuổi dựa trên ngày tháng năm sinh nhập vào.
Ví dụ: Nhập vào ngày tháng năm sinh dạng y/m/d, hãy tính tuổi của người này.
Gợi ý: Sử dụng module datetime. Sử dụng datetime, chúng ta có thể tìm tuổi bằng cách trừ năm sinh cho năm hiện tại.
Code mẫu:
import datetime print("Mời bạn vui lòng nhập ngày tháng năm sinh để tính tuổi") birth_day = int(input("Ngày sinh: ")) birth_month = int(input("Tháng sinh: ")) birth_year = int(input("Năm sinh: ")) current_year = datetime.date.today().year current_month = datetime.date.today().month current_day = datetime.date.today().day age_year = current_year - birth_year age_month = abs(current_month - birth_month) age_day = abs(current_day - birth_day) print(f"Tuổi của bạn chính xác là: {age_year} tuổi, {age_month} tháng và {age_day} ngày")
Bài 10:
Câu hỏi:
Viết chương trình nhập: số giờ làm mỗi tuần, thù lao trên mỗi giờ làm tiêu chuẩn, từ đó tính ra số tiền thực lĩnh của nhân viên. Biết rằng: số giờ tiêu chuẩn mỗi tuần là 44 giờ, và mỗi giờ vượt chuẩn được trả gấp rưỡi so với giờ làm chuẩn.
Code mẫu:
so_gio_lam = float(input("Nhập số giờ làm mỗi tuần: ")) luong_gio = float(input("Nhập thù lao trên mỗi giờ làm tiêu chuẩn: ")) gio_tieu_chuan = 44 # Số giờ làm chuẩn mỗi tuần gio_vuot_chuan = max(0, so_gio_lam - gio_tieu_chuan) # Số giờ làm vượt chuẩn mỗi tuần thuc_linh = gio_tieu_chuan * luong_gio + gio_vuot_chuan * luong_gio * 1.5 # Tính tổng thu nhập print(f"Số tiền thực lĩnh của nhân viên: {thuc_linh}")
Bài tập Python level 2
Bài 1:
Câu hỏi:
Viết chương trình và in giá trị theo công thức cho trước: Q = √([(2 C D)/H]) (bằng chữ: Q bằng căn bậc hai của [(2 nhân C nhân D) chia H]. Với giá trị cố định của C là 50, H là 30. D là dãy giá trị tùy biến, được nhập vào từ giao diện người dùng, các giá trị của D được phân cách bằng dấu phẩy.
Ví dụ: Giả sử chuỗi giá trị của D nhập vào là 100,150,180 thì đầu ra sẽ là 18,22,24.
Gợi ý:
- Nếu đầu ra nhận được là một số dạng thập phân, bạn cần làm tròn thành giá trị gần nhất, ví dụ 26.0 sẽ được in là 26.
Code mẫu:
import math C = 50 H = 30 value = [] items = [x for x in input("Nhập giá trị của D: ").split(',')] for d in items: value.append(str(int(round(math.sqrt(2*C*float(d)/H))))) print(','.join(value))
Bài 2:
Câu hỏi:
Viết một chương trình có 2 chữ số, X, Y nhận giá trị từ đầu vào và tạo ra một mảng 2 chiều. Giá trị phần tử trong hàng thứ i và cột thứ j của mảng phải là i*j.
Lưu ý: i=0,1,...,X-1; j=0,1,...,Y-1.
Ví dụ: Giá trị X, Y nhập vào là 3,5 thì đầu ra là: [[0, 0, 0, 0, 0], [0, 1, 2, 3, 4], [0, 2, 4, 6, 8]]
Gợi ý:
- Viết lệnh để nhận giá trị X, Y từ giao diện điều khiển do người dùng nhập vào.
Code mẫu:
input_str = input("Nhập X, Y: ") dimensions = [int(x) for x in input_str.split(',')] rowNum = dimensions[0] colNum = dimensions[1] multilist = [[0 for col in range(colNum)] for row in range(rowNum)] for row in range(rowNum): for col in range(colNum): multilist[row][col] = row * col print(multilist)
Bài 3:
Câu hỏi:
Viết một chương trình chấp nhận chuỗi từ do người dùng nhập vào, phân tách nhau bởi dấu phẩy và in những từ đó thành chuỗi theo thứ tự bảng chữ cái, phân tách nhau bằng dấu phẩy.
Giả sử đầu vào được nhập là: without,hello,bag,world, thì đầu ra sẽ là: bag,hello,without,world.
Gợi ý:
Trong trường hợp dữ liệu đầu vào được nhập vào chương trình nó nên được giả định là dữ liệu được người dùng nhập vào từ giao diện điều khiển.
Code mẫu:
items = [x for x in input("Nhập một chuỗi: ").split(',')] items.sort() print(','.join(items))
Bài 4:
Câu hỏi:
Viết một chương trình chấp nhận chuỗi là các dòng được nhập vào, chuyển các dòng này thành chữ in hoa và in ra màn hình.
Giả sử đầu vào là:
Hello world Practice makes perfect
Thì đầu ra sẽ là:
HELLO WORLD PRACTICE MAKES PERFECT
Gợi ý:
Trong trường hợp dữ liệu đầu vào được nhập vào chương trình nó nên được giả định là dữ liệu được người dùng nhập vào từ giao diện điều khiển.
Code mẫu:
lines = [] while True: s = input() if s: lines.append(s.upper()) else: break for sentence in lines: print(sentence)
Bài 5:
Câu hỏi:
Viết một chương trình chấp nhận đầu vào là một chuỗi các từ tách biệt bởi khoảng trắng, loại bỏ các từ trùng lặp và in ra màn hình theo thứ tự bảng chữ cái.
Ví dụ: Chuỗi nhập vào là "hello world and practice makes perfect and hello world again" thì đầu ra sẽ là "again and hello makes perfect practice world".
Gợi ý:
Sử dụng split()
để tách chuỗi thành các từ và set()
để loại bỏ các từ trùng lặp. Sau đó, sử dụng sorted()
để sắp xếp các từ theo thứ tự bảng chữ cái.
Code mẫu:
s = input("Nhập một chuỗi: ") words = sorted(set(s.split())) print(' '.join(words))
Bài 6:
Câu hỏi:
Viết chương trình chấp nhận chuỗi các số nhị phân 4 chữ số tách biệt bằng dấu phẩy, sau đó in các số chẵn nhị phân đó là các số chia hết cho 5 trong một dãy được phân tách bằng dấu phẩy.
Ví dụ: Chuỗi nhập vào là: 0100,0011,1010,1001 thì đầu ra sẽ là: 1010.
Gợi ý:
- Sử dụng
split()
để tách chuỗi thành các số nhị phân. - Sử dụng
join()
để kết hợp các số nhị phân đã lọc thành một chuỗi. - Sử dụng
int(x, 2)
để chuyển mỗi số nhị phân thành một số thập phân và kiểm tra xem có chia hết cho 5 hay không.
Code mẫu:
s = input("Nhập chuỗi các số nhị phân: ") numbers = [x for x in s.split(',') if int(x, 2) % 5 == 0] print(','.join(numbers))
Bài 7:
Câu hỏi:
Viết chương trình chấp nhận một dãy số, tách nhau bởi dấu phẩy, kiểm tra xem chúng có phải là các số Fibonacci hay không. Các số Fibonacci là số được tạo thành bằng cách thêm hai số trước đó lại với nhau, bắt đầu bằng 0 và 1. Ví dụ của dãy Fibonacci: 0, 1, 1, 2, 3, 5, 8, 13, ...
Gợi ý:
Viết một hàm kiểm tra xem một số có phải là số Fibonacci hay không. Sử dụng hàm này để kiểm tra từng số trong dãy.
Code mẫu:
def isFibonacci(n): a, b = 0, 1 while b < n: a, b = b, a + b return b == n s = input("Nhập một dãy số: ") numbers = [int(x) for x in s.split(',') if isFibonacci(int(x))] print(','.join(numbers))
Bài 8:
Câu hỏi:
Viết chương trình chấp nhận một chuỗi các từ, phân tách bởi khoảng trắng và in các từ nhưng trong thứ tự ngược từ sau lên trước.
Ví dụ: Chuỗi nhập vào là "hello world and practice makes perfect" thì đầu ra sẽ là "perfect makes practice and world hello".
Gợi ý:
Sử dụng split()
để tách chuỗi thành các từ, sau đó sử dụng reverse()
để đảo ngược thứ tự các từ.
Code mẫu:
s = input("Nhập một chuỗi: ") words = s.split() words.reverse() print(' '.join(words))
Bài 9:
Câu hỏi:
Viết chương trình chấp nhận chuỗi từ được nhập vào, phân tách nhau bằng khoảng trắng và in các từ theo thứ tự ngược lại.
Ví dụ: Chuỗi nhập vào là "hello world and practice makes perfect" thì đầu ra sẽ là "perfect makes practice and world hello".
Gợi ý:
Sử dụng split()
để tách chuỗi thành các từ và reverse()
để đảo ngược thứ tự các từ.
Code mẫu:
s = input("Nhập một chuỗi: ") words = s.split() words.reverse() print(' '.join(words))
Bài 10:
Câu hỏi:
Viết chương trình chấp nhận chuỗi các số được phân tách bằng dấu phẩy từ giao diện điều khiển và tạo thành một danh sách và một tuple chứa mọi số.
Ví dụ: Chuỗi nhập vào là: 34,67,55,33,12,98 thì đầu ra sẽ là:
[34, 67, 55, 33, 12, 98] (34, 67, 55, 33, 12, 98)
Gợi ý:
Viết lệnh yêu cầu nhập vào các giá trị sau đó dùng quy tắc chuyển đổi kiểu dữ liệu để hoàn tất.
Code mẫu:
values = input("Nhập vào các giá trị: ") l = values.split(",") t = tuple(l) print(l) print(t)