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!

Minh Hoàng viết 00:30 ngày 01/10/2018

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.

Nguyễn Đức Hoàng viết 00:30 ngày 01/10/2018

Do bạn gà thôi!Post must be at least 20 charactersHave you tried the button?

Đâ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.

Nguyễn Đức Hoàng viết 00:35 ngày 01/10/2018

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.

Lương Quang Mạnh viết 00:33 ngày 01/10/2018

chẳng phải mỗi khi gọi a.Lap() bạn đã trừ dần giá trị của a.i rồi còn đâu. Bạn viết thế khác gì:

def lap():
    global i
    print(i)
    i -= 1

i = 10
lap()  # 10
lap()  # 9
lap()  # 8

thuộc tính i có thể gọi là global đối với instance a (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ến i 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.

Nguyễn Đức Hoàng viết 00:45 ngày 01/10/2018

thuộc tính i có thể gọi là global đối với instance a (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ến i 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ủa global

Lương Quang Mạnh viết 00:33 ngày 01/10/2018

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.

a = 1  # global variable

def foo():
    b = 2  # local variable
    print(a, b)

foo()  # >>> 1 2
print(a, b)  >>> lỗi name 'b' is not defined

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ệnh global b

a = 1

def bar():
    global b
    b = 2
    print(a, b)

bar()  # >>> 1 2
print(a, b)  # >>> 1 2
Nguyễn Đức Hoàng viết 00:40 ngày 01/10/2018

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ệnh global 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?

Lương Quang Mạnh viết 00:42 ngày 01/10/2018

giá trị của nó vẫn giữ nguyên

Đúng.

ko reset lại khi khai báo lại hàm

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ọi a.Lap() thì a.i sẽ thực sự bị giảm dần chứ không bị reset về 10 ban đầu đâu.

Tao Không Ngu. viết 00:32 ngày 01/10/2018

This post was flagged by the community and is temporarily hidden.

Nguyễn Đức Hoàng viết 00:30 ngày 01/10/2018

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ọi a.Lap() thì a.i sẽ thực sự bị giảm dần chứ không bị reset về 10 ban đầu đâu.

Vâng ý của mình là gọi lại hàm. Cám ơn bạn!

Nguyễn Đức Hoàng viết 00:45 ngày 01/10/2018

Bạn nên học về lập trình hướng đối tượng trước đa. Mình thấy bạn viết class thì cũng phải học qua ÔP rồi chứ nhỉ.

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.

Lương Quang Mạnh viết 00:35 ngày 01/10/2018

Nếu bạn thiếu thốn tài liệu thì mình có vài gợi ý:

  • A Byte of Python: rất dễ, rất cơ bản.
  • Think Python 2nd Edition: nâng cao hơn một tí (nhưng vẫn dễ), bài tập rất thú vị và nhiều khi đòi hỏi tư duy (mình rất thích các bài tập vẽ hình với turtle).
  • Learning Python 5th Edition: rất dài, rất nhiều chữ, rất chuyên sâu nhưng cho bạn nền tảng cực kì vũng chắc nếu bạn nắm rõ.
  • Automate the Boring Stuff with PythonPython Crash Course: dễ nhưng ứng dụng thực tiễn cao vì nó giúp mình xây dựng những chương trình có thể dùng được. Còn nữa, quyển trước thì code không được tối ưu lắm vì nó được viết cho những người không có kinh nghiệm lập trình muốn “như tiêu đề”; quyển sau thì chuyên nghiệp hơn.
  • Dive into Python 3: Nhiều cái dễ, nhiều cái ít dễ hơn (chứ vẫn chưa thể gọi là khó) nhưng là một quyển sách tốt để kéo bạn lại gần hơn với lập trình thực sự.

Đấ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.

Đỗ Trung Quân viết 00:35 ngày 01/10/2018

Đây ko phải là chỗ chứng tỏ bản thân đâu bạ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 :)))

Bé tập Code viết 00:38 ngày 01/10/2018

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.

Lương Quang Mạnh viết 00:33 ngày 01/10/2018

Hằng ngày tắm rửa sạch sẽ, để tâm thanh tịnh và đọc bài kinh này

có hơi quá không?

Kollein Vĩnh viết 00:32 ngày 01/10/2018

a = Lap_Giong_While()
Khi gọi Class thì
__init__()nó chỉ thực hiện 1 lần
Sau đó 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.

Bé tập Code viết 00:44 ngày 01/10/2018

haha dành cho mấy ông theo đạo Python

Vô Thin viết 00:31 ngày 01/10/2018

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ó

Nguyễn Đức Hoàng viết 00:42 ngày 01/10/2018

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.

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.

Lương Quang Mạnh viết 00:40 ngày 01/10/2018

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ì.

Bài liên quan
0