1. 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.
2. 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 ý.
- Lời giải.
3. 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 ý:
Sử dụng range(#begin, #end)
Lời giải:
Bài 2:j=[]for i in range(2000, 3201):if (i%7==0) and (i%5!=0):j.append(str(i))print (','.join(j))
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.
Lời giải:
Bài 3:x=int(input("Nhập số cần tính giai thừa:"))def fact(x):if x == 0:return 1return x * fact(x - 1)print (fact(x))
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.
Lời giải:
Bài 4:n=int(input("Nhập vào một số:"))d=dict()for i in range(1,n+1):d[i]=i*iprint (d)
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.
Lời giải:
Bài 5:values=input("Nhập vào các giá trị:")l=values.split(",")t=tuple(l)print (l)print (t)
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 hiểm tra đơn giản để kiểm tra method của class.
Ví dụ: Chuỗi nhập vào là pythonchomoinguoi thì đầu ra phải là: PYTHONCHOMOINGUOI
Gợi ý:
Sử dụng __init__ để xây dựng các tham số.
Lời giải:
Bài 6: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()
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ử **.
Lời giải:
Vì đề bài không yêu cầu cụ thể bạn phải tính bình phương số có sẵn hay số nhập vào nên mình dùng cả hai.x=int(input("Nhập một số:")) #nhập số cần tính bình phương từ giao diệndef square(num): #định nghĩa bình phương của một sốreturn num ** 2print (square(2)) #in bình phương của 2print (square(3)) #in bình phương của 3print (square(x)) #in bình phương của 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__
Lời giải:
Bài 9: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 ** 2print (square.__doc__)
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 đó.
class Person:# Định nghĩa lớp "name"name = "Person"def __init__(self, name = None):# self.name là biến instanceself.name = namejeffrey = 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))
4. Bài tập Python level 2
Bài 10: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. Trong trường hợp dữ liệu đầu vào được cung cấp cho câu hỏi, nó được giả định là đầu vào do người dùng nhập từ giao diện điều khiển.
Lời giải:
Bài 11:#!/usr/bin/env pythonimport mathc=50h=30value = []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))
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 vafp 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.
Lời giải:
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*colprint (multilist)
Bài 12:
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:
Bài 13:lines = []while True:s = input()if s:lines.append(s.upper())else:break;for sentence in lines:print (sentence)
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, sắp xếp theo thứ tự bảng chữ cái, rồi in chúng.
Giả sử đầu vào là: hello world and practice makes perfect and hello world again
Thì đầu ra là: again and hello makes perfect practice 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.
Sử dụng set để loại bỏ dữ liệu trùng lặp tự động và dùng sorted() để sắp xếp dữ liệu.
Code mẫu:
Bài 14:s = input("Nhập chuỗi của bạn: ")words = [word for word in s.split(" ")]print (" ".join(sorted(list(set(words)))))
Câu hỏi:
Viết một chương trình chấp nhận đầu vào là chuỗi các số nhị phân 4 chữ số, phân tách bởi dấu phẩy, kiểm tra xem chúng có chia hết cho 5 không. Sau đó in các số chia hết cho 5 thành dãy phân tách bởi dấu phẩy.
Ví dụ đầu vào là: 0100,0011,1010,1001
Đầu ra sẽ là: 1010
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:
Bài 15:value = []items=[x for x in input("Nhập các số nhị phân: ").split(',')]for p in items:intp = int(p, 2)if not intp%5:value.append(p)print (','.join(value))
Câu hỏi:
Viết một chương trình tìm tất cả các số trong đoạn 1000 và 3000 (tính cả 2 số này) sao cho tất cả các chữ số trong số đó là số chẵn. In các số tìm được thành chuỗi cách nhau bởi dấu phẩy, trên một dòng.
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:
Bài 16:values = []for i in range(1000, 3001):s = str(i)if (int(s[0])%2==0) and (int(s[1])%2==0) and (int(s[2])%2==0) and (int(s[3])%2==0):values.append(s)print (",".join(values))
Câu hỏi:
Viết một chương trình chấp nhận đầu vào là một câu, đếm số chữ cái và chữ số trong câu đó. Giả sử đầu vào sau được cấp cho chương trình: hello world! 123
Thì đầu ra sẽ là:
Số chữ cái là: 10
Số chữ số là: 3
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:
Bài 17:s = input("Nhập câu của bạn: ")d={"DIGITS":0, "LETTERS":0}for c in s:if c.isdigit():d["DIGITS"]+=1elif c.isalpha():d["LETTERS"]+=1else:passprint ("Số chữ cái là:", d["LETTERS"])print ("Số chữ số là:", d["DIGITS"])
Câu hỏi:
Viết một chương trình chấp nhận đầu vào là một câu, đếm chữ hoa, chữ thường.
Giả sử đầu vào là: Quản Trị Mạng
Thì đầu ra là:
Chữ hoa: 3
Chữ thường: 8
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:
Bài 18:s = input("Nhập câu của bạn: ")d={"UPPER CASE":0, "LOWER CASE":0}for c in s:if c.isupper():d["UPPER CASE"]+=1elif c.islower():d["LOWER CASE"]+=1else:passprint ("Chữ hoa:", d["UPPER CASE"])print ("Chữ thường:", d["LOWER CASE"])
Câu hỏi:
Viết một chương trình tính giá trị của a+aa+aaa+aaaa với a là số được nhập vào bởi người dùng.
Giả sử a được nhập vào là 1 thì đầu ra sẽ là: 1234
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:
Bài 19:a = input("Nhập số a: ")n1 = int( "%s" % a )n2 = int( "%s%s" % (a,a) )n3 = int( "%s%s%s" % (a,a,a) )n4 = int( "%s%s%s%s" % (a,a,a,a) )print ("Tổng cần tính là: ",n1+n2+n3+n4)
Câu hỏi:
Sử dụng một danh sách để lọc các số lẻ từ danh sách được người dùng nhập vào.
Giả sử đầu vào là: 1,2,3,4,5,6,7,8,9 thì đầu ra phải là: 1,3,5,7,9
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:
Bài 20:values = input("Nhập dãy số của bạn, cách nhau bởi dấu phẩy: ")numbers = [x for x in values.split(",") if int(x)%2!=0]print (",".join(numbers))
Câu hỏi:
Viết chương trình tính số tiền thực của một tài khoản ngân hàng dựa trên nhật ký giao dịch được nhập vào từ giao diện điều khiển.
Định dạng nhật ký được hiển thị như sau:
D 100
W 200
(D là tiền gửi, W là tiền rút ra).
Giả sử đầu vào được cung cấp là:
D 300
D 300
W 200
D 100
Thì đầu ra sẽ là:
500
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:
import sysnetAmount = 0while True:s = input("Nhập nhật ký giao dịch: ")if not s:breakvalues = s.split(" ")operation = values[0]amount = int(values[1])if operation=="D":netAmount+=amountelif operation=="W":netAmount-=amountelse:passprint (netAmount)
5. Bài tập Python level 3
Bài 21:Câu hỏi:
Một website yêu cầu người dùng nhập tên người dùng và mật khẩu để đăng ký. Viết chương trình để kiểm tra tính hợp lệ của mật khẩu mà người dùng nhập vào.
Các tiêu chí kiểm tra mật khẩu bao gồm:
1. Ít nhất 1 chữ cái nằm trong [a-z]
2. Ít nhất 1 số nằm trong [0-9]
3. Ít nhất 1 kí tự nằm trong [A-Z]
4. Ít nhất 1 ký tự nằm trong [$ # @]
5. Độ dài mật khẩu tối thiểu: 6
6. Độ dài mật khẩu tối đa: 12
Chương trình phải chấp nhận một chuỗi mật khẩu phân tách nhau bởi dấu phẩy và kiểm tra xem chúng có đáp ứng những tiêu chí trên hay không. Mật khẩu hợp lệ sẽ được in, mỗi mật khẩu cách nhau bởi dấu phẩy.
Ví dụ mật khẩu nhập vào chương trình là: ABd1234@1,a F1#,2w3E*,2We3345
Thì đầu ra sẽ là: ABd1234@1
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:
Bài 22:import revalue = []items=[x for x in input("Nhập mật khẩu: ").split(',')]for p in items:if len(p)<6 or len(p)>12:continueelse:passif not re.search("[a-z]",p):continueelif not re.search("[0-9]",p):continueelif not re.search("[A-Z]",p):continueelif not re.search("[$#@]",p):continueelif re.search("\s",p):continueelse:passvalue.append(p)print (",".join(value))
Câu hỏi:
Viết chương trình sắp xếp tuple (name, age, score) theo thứ tự tăng dần, name là string, age và height là number. Tuple được nhập vào bởi người dùng. Tiêu chí sắp xếp là:
Sắp xếp theo name sau đó sắp xếp theo age, sau đó sắp xếp theo score. Ưu tiên là tên > tuổi > điểm.
Nếu đầu vào là:
Tom,19,80
John,20,90
Jony,17,91
Jony,17,93
Json,21,85
Thì đầu ra sẽ là:
[('John', '20', '90'), ('Jony', '17', '91'), ('Jony', '17', '93'), ('Json', '21', '85'), ('Tom', '19', '80')]
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.
Sử dụng itemgetter để chấp nhận nhiều key sắp xếp.
Code mẫu:
Bài 23:from operator import itemgetter, attrgetterl = []while True:s = input()if not s:breakl.append(tuple(s.split(",")))print (sorted(l, key=itemgetter(0,1,2)))
Câu hỏi:
Xác định một class với generator có thể lặp lại các số nằm trong khoảng 0 và n, và chia hết cho 7.
Gợi ý:
Sử dụng yield.
Code mẫu:
Bài 24:def putNumbers(n):i = 0while i<n:j=ii=i+1if j%7==0:yield jfor i in putNumbers (100):print (i)
Câu hỏi:
Một Robot di chuyển trong mặt phẳng bắt đầu từ điểm đầu tiên (0,0). Robot có thể di chuyển theo hướng UP, DOWN, LEFT và RIGHT với những bước nhất định. Dấu di chuyển của robot được đánh hiển thị như sau:
UP 5
DOWN 3
LEFT 3
RIGHT 3
Các con số sau phía sau hướng di chuyển chính là số bước đi. Hãy viết chương trình để tính toán khoảng cách từ vị trí hiện tại đến vị trí đầu tiên, sau khi robot đã di chuyển một quãng đường. Nếu khoảng cách là một số thập phân chỉ cần in só nguyên gần nhất.
Ví dụ: Nếu tuple sau đây là input của chương trình:
UP 5
DOWN 3
LEFT 3
RIGHT 2
thì đầu ra sẽ là 2.
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:
Bài 25:import mathpos = [0,0]while True:s = input()if not s:breakmovement = s.split(" ")direction = movement[0]steps = int(movement[1])if direction=="UP":pos[0]+=stepselif direction=="DOWN":pos[0]-=stepselif direction=="LEFT":pos[1]-=stepselif direction=="RIGHT":pos[1]+=stepselse:passprint (int(round(math.sqrt(pos[1]**2+pos[0]**2))))
Câu hỏi:
Viết chương trình tính tần suất các từ từ input. Output được xuất ra sau khi đã sắp xếp theo bảng chữ cái.
Giả sử input là: New to Python or choosing between Python 2 and Python 3? Read Python 2 or Python 3.
Thì output phải là:
2:2
3.:1
3?:1
New:1
Python:5
Read:1
and:1
between:1
choosing:1
or:2
to:1
Gợi ý:
Trong trường hợp dữ liệu đầu vào được cung cấp cho câu hỏi, nó phải được giả định là một input được nhập từ giao diện điều khiển.
Code mẫu:
freq = {} # frequency of words in text line = input() for word in line.split(): freq[word] = freq.get(word,0)+1 words = sorted(freq.keys()) for w in words: print ("%s:%d" % (w,freq[w]))
6. Bài tập Python khác
Bài 26:Câu hỏi:
Định nghĩa 1 hàm có thể tính tổng hai số.
Gợi ý:
Định nghĩa 1 hàm với 2 số là đối số. Bạn có thể tính tổng trong hàm và trả về giá trị.
Code mẫu:
Bài 27:def SumFunction(number1, number2): #định nghĩa hàm tính tổngreturn number1+number2print (SumFunction(5,7)) #in tổng 2 số 5 và 7
Câu hỏi:
Định nghĩa một hàm có thể chuyển số nguyên thành chuỗi và in nó ra giao diện điều khiển
Gợi ý:
Sử dụng str() để chuyển đổi một số thành chuỗi.
Code mẫu:
Bài 28:def printValue(n):print (str(n))printValue(3)
Câu hỏi:
Định nghĩa hàm có thể nhận hai số nguyên trong dạng chuỗi và tính tổng của chúng, sau đó in tổng ra giao diện điều khiển.
Gợi ý:
Sử dụng int() để chuyển đổi một chuỗi thành số nguyên.
Code mẫu:
Bài 29:def printValue(s1,s2):print (int(s1)+int(s2))printValue("3","4") #Kết quả là 7
Câu hỏi:
Định nghĩa hàm có thể nhận 2 chuỗi từ input và nối chúng sau đó in ra giao diện điều khiển
Gợi ý:
Sử dụng + để nối các chuỗi.
Code mẫu:
Bài 30:def printValue(s1,s2):print (s1+s2)printValue("3","4") #Kết quả là 34
Câu hỏi:
Định nghĩa một hàm có input là 2 chuỗi và in chuỗi có độ dài lớn hơn trong giao diện điều khiển. Nếu 2 chuỗi có chiều dài như nhau thì in tất cả các chuỗi theo dòng.
Gợi ý:
Sử dụng hàm len() để lấy chiều dài của một chuỗi
Code mẫu:
Bài 31:def printValue(s1,s2):len1 = len(s1) len2 = len(s2) if len1>len2: print (s1) elif len2>len1: print (s2) else: print(s1) print (s2)printValue("one","three")
Câu hỏi:
Định nghĩa hàm có thể chấp nhận input là số nguyên và in "Đây là một số chẵn" nếu nó chẵn và in "Đây là một số lẻ" nếu là số lẻ.
Gợi ý:
Sử dụng toán tử % để kiểm tra xem số đó chẵn hay lẻ.
Code mẫu:
def checkValue(n):if n%2 == 0:print ("Đây là một số chẵn")else:print ("Đây là một số lẻ")checkValue(7)
Tạm thế đã nhé, dài lắm, lại vừa dịch vừa fix code nên hơi lâu, mình sẽ cố gắng dịch xong sớm để các bạn có bài thực hành. Bạn bookmark lại để check bài mới thường xuyên nhé.