30/09/2018, 22:29
PYTHON: Phát hiện mới hay tại mình gà? Các bạn cao thủ vào cho ý kiến
class Lap_Giong_While:
def __init__(self):
self.i = 10
def Lap(self):
print self.i
self.i = self.i - 1
a = Lap_Giong_While()
a.Lap()
a.Lap()
a.Lap()
a.Lap()
a.Lap()
a.Lap()
Kết quả: 10 9 8 7 6 5
Đoạn code trên có chức năng lặp tương tự vòng lặp while. Mình hơi bối rối bởi cách làm việc này của chương trình trên. Hay mặc định của Python Class với phương thức init như trên có chức năng lặp với điều kiện. Các cao thủ vào giải đáp giúp!
Bài liên quan
Mình đọc bài này cũng bối rối vì không biết cái này chỉ là hướng đối tượng hay là phát hiện mới nữa.
Đây ko phải là chỗ chứng tỏ bản thân đâu bạn. Topic này mình lập ra để mọi người vào đây giải đáp.
Nhưng ý của mình hỏi là tại sao lại vậy. Đối tượng class tại sao nó lại lặp được giống như câu lệnh while. Hay là do mặc định của Python.
chẳng phải mỗi khi gọi
a.Lap()
bạn đã trừ dần giá trị củaa.i
rồi còn đâu. Bạn viết thế khác gì:thuộc tính
i
có thể gọi là global đối với instancea
(tức là cần là có, ở bất kì đâu, bất kì lúc nào, không bị reset lại giá trị mỗi khi gọi một method) tương tự như biếni
trong script trên global đối với cả module. Mai kia làm việc nhiều với classes/objects thì việc thay đổi giá trị của attribute thế này là rất bình thường.Cám ơn bạn vậy bạn có thể cho mình thêm một chút thông tin nữa về lệnh
global
ko hay cách làm việc củaglobal
Trước hết, bạn cần phải nắm rõ local variable (biến cục bộ) và global variable (biến toàn cục) trong Python. Chi tiết thì bạn có thể tra Google, nhưng đại khái global variable là biến có thể dùng được ở bất cứ đâu, còn local variable là biến được khai báo trong function, chỉ có thể dùng trong function và bị xóa khi function kết thúc.
Mặc định, tất cả biến khai báo trong function sẽ là local, nhưng nếu muốn chỉ rõ biến
b
là global thì chỉ cần dùng câu lệnhglobal b
Ok cái này thì mình hiểu, cục bộ và toàn cục. Nhưng bạn ơi ý mình hỏi là khi khái báo global i (i là biến toàn cục). THì giá trị của nó vẫn giữ nguyên và ko reset lại khi khai báo lại hàm?
Đúng.
Sai. Bạn gọi lại hàm chứ không khai báo lại hàm. Bạn khai báo/định nghĩa hàm 1 và chỉ 1 lần duy nhất.
Tuy nhiên mình vẫn hiểu ý của bạn. Đúng vậy, biến toàn cục không bị reset khi gọi lại hàm lần nữa và bạn hoàn toàn có thể dùng nó ở bất cứ đâu. Attribute
i
của bạn cũng từa tựa thế, mỗi lần gọia.Lap()
thìa.i
sẽ thực sự bị giảm dần chứ không bị reset về 10 ban đầu đâu.This post was flagged by the community and is temporarily hidden.
Vâng ý của mình là gọi lại hàm. Cám ơn bạn!
Mình đang học python bạn ah. Cũng có class, object, kế thừa class nhưng tài liệu ko chuyên sâu bạn ah, Ví dụ như học python mà ko đọc các tài liệu chuyên về OOP thì ko biết OOP là gì và có bản chất như thế nào, hay nó khác với các kiểu lập trình khác như thế nào.
Nếu bạn thiếu thốn tài liệu thì mình có vài gợi ý:
Đấy chính xác là lộ trình mình học Python cho đến hiện tại (sau khi đã chọn lọc một vài quyển khác nữa nhưng thấy không hay). Mình khuyên bạn đọc những quyển này theo đúng thứ tự từ trên xuống dưới (trong khi đọc Learning Python thì đọc những quyển dưới vì nó rất dài và rất nhàm chán - vẫn phải đọc, đừng bỏ). Song song việc đọc sách, bạn cũng cần đọc Python documentation và tìm hiểu về những vấn đề nâng cao hơn như recursion, generators, decorators, magic methods,… Thêm Git + Github nếu chưa học.
Sau đấy thì bạn có thể tìm sách nâng cao nhưng mình không biết phải khuyên thế nào vì mình cũng đã đạt đến cảnh giới đó đâu.
p/s: mọi người khuyên beginner nên dùng Python 2, mình khuyên ngược lại. Viết thêm 2 cái ngoặc vào
print
cũng chả khó gì, lại được tiếp cận ngay những thứ hiện đại hơn, tốt hơn.Hỏi người khác mình có gà không. Họ trả lời xong lại bảo đừng chứng tỏ bản thân :)))
Hằng ngày tắm rửa sạch sẽ, để tâm thanh tịnh và đọc bài kinh này:
import this
Và cũng đừng quên coding style.
có hơi quá không?
a = Lap_Giong_While()
Khi gọi Class thì
__init__()
nó chỉ thực hiện 1 lầnSau đó bạn gọi phương thức
a.Lap(): nó trừ dần vì
__init__()
đâu có chạy nữa đâu mà i được reset.haha dành cho mấy ông theo đạo Python
Thấy có vẻ như cái function mà bạn chủ topic định nghĩa là một dạng đệ quy, trong hầu hết ngôn ngữ lập trình đều có cài đặt đệ quy, Python cũng có
Bạn ơi sao mình tưởng python 2 và python 3, 2 dòng này đôi khi ko tương thích với nhau.
Tất nhiên là có những chương trình dùng Python 2 và developers họ quá lười để port sang Python 3 (thường là những phần mềm cũ và không được cập nhật mấy nữa). Nhưng đấy là việc của họ, còn mình học thì phải học cái mới chứ sao lại chạy sau thời đại làm gì.