Trang chủ Lập trình Python Chia sẻ 98 bài tập & code mẫu học Python cơ bản...

Chia sẻ 98 bài tập & code mẫu học Python cơ bản đến nâng cao năm 2022

196
1

Dưới đây là hơn 90 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ũ. Các bài tập và lời giải dưới đây đã được Quản Trị Mạng 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 và lời giải trong bài dưới đây được viết với Python 3.6.2 trở lên, nếu bạn đang sử dụng phiên bản Python từ 2.5 trở xuống thì có thể code sẽ không còn phù hợp, không chạy được. Lưu ý nhé các tình yêu!

Số bài tập Python này sẽ được chia thành 3 cấp độ dành cho các bạn mới bắt đầu học lập trình, hay người đã học lập trình nhưng mới học Python và những người muốn nâng cao trình độ Python. Mỗi bài tập đều có đầy đủ các phần bao gồm: yêu cầu của bài, gợi ý làm bài và lời giải (code mẫu).

Bây giờ mời bạn đi vào các nội dung cụ thể nhé:

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 ý.
  • Code mẫu.

Mình sẽ để 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é.

3. Level1: Bài tập và code mẫu Python

Bài 01:

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)

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 02:

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 fact(x):
    if x == 0:
        return 1
    return x * fact(x - 1)
print (fact(x))

Bài 03:

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=dict()
for i in range(1,n+1):
    d[i]=i*i
    #Code by Quantrimang.com

print (d)

Bài 04:

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 05:

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à 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:")
# Code by Quantrimang.com
   def printString(self):
       print (self.s.upper())

strObj = InputOutString()
strObj.getString()
strObj.printString()

Bài 06:

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ố:")) #nhập số cần tính bình phương từ giao diện
def square(num):  #định nghĩa bình phương của một số
  return num ** 2
# Code by Quantrimang.com
print (square(2)) #in bình phương của 2
print (square(3)) #in bình phương của 3
print (square(x)) #in bình phương của x

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.

Bài 07:

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__)
# Code by Quantrimang.com
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 08:

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:
 # Định nghĩa lớp "name"
 name = "Person"
 # Code by Quantrimang.com
 def __init__(self, name = None):
 # self.name là biến instance
 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))

4. Level 2: Bài tập và code mẫu Python

Bài 09:

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.

Code mẫu:

#!/usr/bin/env python
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)))))
# Code by Quantrimang.com
print (','.join(value))

Bài 10:

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)]
# Viết bởi Quantrimang.com
for row in range(rowNum):
    for col in range(colNum):
        multilist[row][col]= row*col

print (multilist)

Bài 11:

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 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:

lines = []
while True:
   s = input()
   if s:
      lines.append(s.upper())
   else:
      break;
# Bài Python 12, Code by Quantrimang.com
for sentence in lines:
    print (sentence)

Bài 13:

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:

s = input("Nhập chuỗi của bạn: ")
words = [word for word in s.split(" ")]
print (" ".join(sorted(list(set(words)))))

Bài 14:

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:

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)
# Bài tập Python 14, viết bởi Quantrimang.com
print (','.join(value))

Bài 15:

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:

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)
# Bài tập Python 15, Code by Quantrimang.com
print (",".join(values))

Bài 16:

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:

s = input("Nhập câu của bạn: ")
# Bài tập Python 16, Code by Quantrimang.com
d={"DIGITS":0, "LETTERS":0}
for c in s:
    if c.isdigit():
        d["DIGITS"]+=1
    elif c.isalpha():
        d["LETTERS"]+=1
    else:
        pass
print ("Số chữ cái là:", d["LETTERS"])
print ("Số chữ số là:", d["DIGITS"])

Bài 17:

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:

s = input("Nhập câu của bạn: ")
d={"UPPER CASE":0, "LOWER CASE":0}
# Code by Quantrimang.com
for c in s:
    if c.isupper():
        d["UPPER CASE"]+=1
    elif c.islower():
        d["LOWER CASE"]+=1
    else:
        pass
print ("Chữ hoa:", d["UPPER CASE"])
print ("Chữ thường:", d["LOWER CASE"])

Bài 18:

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:

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) )
# Bài tập Python 18, Code by Quantrimang.com
print ("Tổng cần tính là: ",n1+n2+n3+n4)

Bài 19:

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:

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))

Bài 20:

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 sys
netAmount = 0
# Bài tập Python 20, Code by Quantrimang.com
while True:
    s = input("Nhập nhật ký giao dịch: ")
    if not s:
        break
    values = s.split(" ")
    operation = values[0]
    amount = int(values[1])
    if operation=="D":
        netAmount+=amount
    elif operation=="W":
        netAmount-=amount
    else:
        pass
print (netAmount)

5. Level 3: Bài tập và code mẫu Python

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 [$