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!

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.

2 Likes

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

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

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

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

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

  • 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. :blush:

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.

8 Likes

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

7 Likes

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.

1 Like

có hơi quá không? :confused:

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.

1 Like

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.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?