SoloLearn là một trong những nền tảng học tập trình khá là nổi tiếng hiện nay. Tại đấy có rất nhiều khóa học được chia thành nhiều chủ để khác nhau như phát triển Web, Data Science(Khoa học dữ liệu), hay thậm chí là các Code Challenge,…để bạn có thể học tập và luyện tập các khả năng về việc viết code. Hôm nay, mình sẽ chia sẻ về những điều thú vị mà mình đã học được về Python 3 qua khóa học về nó trên SoloLearn nhé.

list, dictionary, tuple và set
Điều mà mình bất ngờ nhất đó là Python có một kiểu dữ liệu là Set. Set là một kiểu dữ liệu giống như list hoặc là dictionary, một tập hợp các dữ liệu mà mỗi một phần tử của chúng phải là duy nhất và bạn cũng không thể dùng chỉ truy cập tới một vị trí nào đó trong Set. Set được tạo ra bằng cách liệt kê các phần tử ở trong dấu { } hay dùng hàm set.
Set có một vài đặt điểm giống với tập hợp trong toán học và ta có thể thực hiện một số phép toán của tập hợp như
- Phép hợp:
A | B(A hợp B) - Phép giao:
A & B(A giao B) - Phép hiệu:
A - B(Hiệu của A với B) - Phép bù:
A ^ B(Phần bù của A và B)
| A = set([i * 2 for i in range(1,10)]) | |
| print("A = %r" % (A)) | |
| B = set([i * i for i in range(1, 10)]) | |
| print("B = %r" % (B)) | |
| print("A | B = %r" %(A | B)) | |
| print("A & B = %r" %(A & B)) | |
| print("A - B = %r" %(A - B)) | |
| print("A ^ B = %r" %(A ^ B)) | |
| #OUTPUT: | |
| #A = {2 , 4, 6, 8, 10, 12, 14, 16, 18} | |
| #B = {64, 1, 4, 36, 9, 16, 49, 81, 25} | |
| #A | B = {64, 1, 2, 4, 36, 6, 8, 9, 10, 12, 14, 16, 49, 18, 81, 25} | |
| #A & B = {16, 4} | |
| #A - B = {2, 6, 8, 10, 12, 14, 18} | |
| #A ^ B = {64, 1, 2, 36, 6, 8, 9, 10, 12, 14, 49, 81, 18, 25} |
Vậy chúng ta đã biết được 4 kiểu dữ liệu mà chúng là một tập dữ liệu rôi. Vậy khi nào chúng ta nên sử dụng chúng?
- Ta sử dụng list khi ta cần một tập dữ liệu đơn giản và cần được truy cập một cách tuần tự
- Ta sử dụng dictionary khi ta muốn truy cập dữ liệu dưới dang
key:valuevà tìm kiếm những dữ liệu bằngkey - Ta sử dụng tuple khi ta muốn tạo ra một tập dữ liệu mà không cho phép thay đổi dữ liệu
- Cuối cùng, set sẽ được dùng khi ta muốn tạo ra một tập dữ liệu mà mỗi một phần tử của nó là khác biệt so với các phần tử khác trong set đó
Từ khóa yield
Ở đây, ta sẽ tìm hiểu thêm về một khái niệm mới là Generators. Nó cho phép ta khai báo một hàm hoạt động có khả năng truy cập tuần tự như list và mỗi một phần tử của nó được gọi là iterator. Tuy nhiên, bạn sẽ không thể truy cập tới một vị trí nào của nó và thường sẽ dùng vòng lặp for để truy cập tới các phần tử của nó và để tạo ra nó người ta có thể viết một hàm cùng với một từ khóa yield
Mình nghĩ sẽ có bạn sẽ hỏi: “Thế vậy tại sao ta phải sử dụng đến thứ Generators này? Chẳng phải ta có thể viết một hàm trả về giá trị mà không cần dùng yield hay sao? Mình thấy chúng khá là phức tạp.” Câu trả lời là nó sẽ giúp tối ưu thời gian thực hiện. Lý do ở đây là do chúng ta sẽ không phải mất thời gian để hàm kia tìm hết các giá trị mà ta muốn rồi sau đó mới xử lý. Generators sau khi đã tìm được giá trị mà ta muốn chúng sẽ cho phép chúng ta sử dụng dữ liệu mới nhất mà nó “trả về”. Từ đó bạn sẽ không phải mất thời gian đợi hàm tìm hết các giá trị mà ta muốn. Có thể bạn đang có chút gì đó hơi khó hiểu đúng không? Hãy xem đoạn code phía dưới và đừng ngại chạy thử trên máy mình nha
| def evenNumbers(): | |
| n = 0 | |
| evens = [] | |
| while True: | |
| evens.append(n) | |
| n += 2 | |
| return evens | |
| for i in evenNumbers(): | |
| print(i) | |
| #OUTPUT: | |
| #It's freezing |
| def evenNumbers(): | |
| n = 0 | |
| while True: | |
| yield n | |
| print("Increase 2") | |
| n += 2 | |
| for i in evenNumbers(): | |
| print(i) | |
| #OUTPUT: | |
| #0 | |
| #Increase 2 | |
| #2 | |
| #Increase 2 | |
| #4 | |
| #Increase 2 | |
| #6 | |
| #Increase 2 | |
| #8 | |
| #... | |
| #that mean after "return" a value the function to continue execute |
else không chỉ được dùng với if
Với rất nhiều ngôn ngữ lập trình khác, mọi người đều đã cảm thấy quen thuộc với một cặp từ khóa if-else. Tuy nhiên, ở Python có một điều thú vị là không chỉ có mỗi if mới có thể đi với else. Trong bài viết này, mình sẽ giới thiệu với mọi người về else trong for, while và else đi với try-except
Trước tiên chúng ta sẽ cùng tìm hiểu về else trong for và while. else khi nằm sau 2 vòng lặp kia những câu lệnh của else sẽ được thực hiện khi vòng lặp được kết thúc một cách bình thường hay vòng lặp không bị kết thúc bởi break.
| for i in range(1, 10): | |
| print(i, end='\t') | |
| else: | |
| print("\nElse has been executed") | |
| for i in range(1, 10): | |
| print(i, end='\t') | |
| if(i == 5): | |
| break | |
| else: | |
| print("\nElse has been executed") | |
| #OUTPUT: | |
| #1 2 3 4 5 6 7 8 9 | |
| #Else has been executed | |
| #1 2 3 4 5 |
Tiếp theo, các câu lệnh của else sẽ được thực hiện khi theo sau try-except nếu việc thực hiện các lệnh trong try không xảy ra lỗi hoặc các ngoại lệ
| try: | |
| i = 3 / 4 | |
| print(i) | |
| except ZeroDivisionError: | |
| print("You can\'t devide something to 0") | |
| else: | |
| print("There is no exception") | |
| try: | |
| i = 3 / 0 | |
| print(i) | |
| except ZeroDivisionError: | |
| print("You can\'t devide something to 0") | |
| else: | |
| print("There is no except") | |
| #OUTPUT: | |
| #0.75 | |
| #There is no exception | |
| #You can't devide something to 0 |
Tại sao ta lại phải có đoạn code if __name__ == "__main__"?
Bạn đang nghĩ rằng, khi thực hiện một chương trình python, ta chẳng cần phải dùng tới bất cứ một hàm nào giông như hàm main ở nhiều ngôn ngữ lập trình khác vì Python là một ngôn ngữ dạng script. Vậy tại sao ta phải phức tạp hóa nó lên bằng cách dùng if __name__ == "__main__"? Câu trả lời đơn giản là việc viết như vậy sẽ giúp cho file python của bạn có thể sử dụng lại ở file khác mà không làm ảnh hưởng tới chương trình mà bạn muốn.
Để mình ví dụ nha. giả sử bạn có một file như bên dưới.
| import math | |
| def isPrime(n): | |
| if(n < 2): | |
| return False | |
| if(n == 2): | |
| return True | |
| if(n % 2 == 0): | |
| return False | |
| for i in range(3, int(math.sqrt(n) + 1), 2): | |
| if(n % i == 0): | |
| return False | |
| return True | |
| n = 100 | |
| if(isPrime(n)): | |
| print("This is a prime number") | |
| else: | |
| print("This isn't a prime number") | |
| #OUTPUT: | |
| #This isn't a prime number |
| import check_prime_number | |
| for i in range(100): | |
| if(check_prime_number.isPrime(i)): | |
| print(i, end='\t') | |
| #OUTPUT | |
| #This isn't a prime number | |
| #2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 | |
| #check_prime_number.py has been executed. |
Bạn thấy rằng bạn rât muốn được dùng lại hàm isPrime vào chương trình mà bạn đang định viết. Vì vậy, bạn sẽ import check_prime_number nó vào file của bạn và bạn thấy rằng chương trình của bạn cũng thực hiện chương trình của file mà bạn vừa import vào
Tuy nhiên, nếu bạn để những đoạn mã mà khi chạy file python đó vào bên trong if __name__ == "__main__", khi bạn import file này vào đoạn mã của chương trình của bạn, nó sẽ không thực hiện chương trình của file mà bạn đã import và chính điều này giúp việc tái sử dụng code trở nên dễ dàng hơn.
| import math | |
| def isPrime(n): | |
| if(n < 2): | |
| return False | |
| if(n == 2): | |
| return True | |
| if(n % 2 == 0): | |
| return False | |
| for i in range(3, int(math.sqrt(n) + 1), 2): | |
| if(n % i == 0): | |
| return False | |
| return True | |
| if __name__ == "__main__": | |
| n = 100 | |
| if(isPrime(n)): | |
| print("This is a prime number") | |
| else: | |
| print("This isn't a prime number") | |
| #OUTPUT: | |
| #This isn't a prime number |
| import check_prime_number | |
| for i in range(100): | |
| if(check_prime_number.isPrime(i)): | |
| print(i, end='\t') | |
| #OUTPUT | |
| #2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 |
Tại sao ta nên viết with ... as ...
Bạn sẽ thường thấy cái này trong một cụm with open("filename.txt") as f: #thực hiện đọc, ghi vào file đó. Bạn đang thấy việc này đang làm cho nó trở nên phức tạp đi bởi vì thay vì như vậy bạn có thể f = open("filename.txt"). Câu trả lời đơn giản là để tránh việc một số bạn do một chút bất cẩn đã quên không f.close() sau khi đã làm việc với file đó xong. Việc này khiến file mà bạn vừa mới mở không được đóng từ đó có thể gây ảnh hưởng tới dữ liệu trong file. Vì vậy, việc dùng with open("filename.txt") as f nó sẽ tạm thời tạo ra một biến f để bạn thực hiện với file kia. Sau khi kết thúc đoạn mã đó, chương trình sẽ tự động đóng file kia và giải phóng biến f đồng thời lúc đó file cũng đã được đóng.
Trên đây là một vài điều mà mình đã học được về Python qua SoloLearn, mình sẽ còn một bài viết tiếp theo để kể thêm về những điều mà mình đã học được về Python. Bài viết đó mình sẽ giúp bạn hiểu thêm về hàm và một chút về đối tượng trong Python. Vì vậy, hãy chờ đợi bài viết tiếp theo của mình nha.
[…] Xem lại phần 1 tại đây […]
LikeLike