Tôi có nên thích trình tạo Python vào danh sách không?


8

Python lặp có thể rất hiệu quả bộ nhớ. Tôi có nên luôn luôn thích sử dụng máy phát điện thay vì chỉ liệt kê? Trong những tình huống tôi nên thích một mảng đơn giản?

Ví dụ thay vì điều này:

emails = [user.email for user in users]

tôi có nên thích cái này không?

emails = (user.email for user in users)

Lưu ý : Tôi có nghĩa là 'máy phát điện' không phải 'trình lặp'.


Không rõ những gì bạn cần giúp đỡ . Vui lòng làm rõ vấn đề cụ thể của bạn hoặc cung cấp thêm chi tiết để làm nổi bật chính xác những gì bạn cần. Như hiện tại đã được viết, thật khó để nói bạn đang cố gắng giải quyết vấn đề gì hoặc khía cạnh nào trong cách tiếp cận của bạn cần được sửa chữa hoặc giải thích. Xem trang Cách hỏi để được trợ giúp làm rõ câu hỏi này.
gnat

@gnat câu hỏi sẽ được nhắc lại là "khi nào tôi nên sử dụng các trình lặp hoặc danh sách trong python?" tốt?
Florian Margaine

@FlorianMargaine sẽ có nguy cơ bị đóng cửa vì quá rộng Tôi sợ
gnat

2
@FlorianMargaine Đó sẽ là một khởi đầu tốt, nhưng nó vẫn là một câu hỏi yếu. Nghiên cứu của tác giả ở đâu? Chắc chắn anh ta có thể nghĩ ra một vài sự khác biệt. Yêu cầu liệt kê tất cả các tình huống mà bạn có thể muốn sử dụng cái này hoặc cái kia không phải là tuyệt vời.
Doval

2
+1 Nó có thể là một câu hỏi hơi không rõ ràng, nhưng khi bạn chỉ học cách sử dụng các cấu trúc này, các câu hỏi của bạn sẽ được hình thành một cách mơ hồ và diễn đạt. Tôi đã học được rất nhiều từ các câu trả lời.
Racheet 18/2/2015

Câu trả lời:


7

Hạn chế chính của máy phát điện là chúng chỉ có thể đi qua một hướng. Không có trở lại giá trị trước đó. Bạn cũng không thể chia sẻ chúng. Có nhiều trường hợp có thể dễ dàng được tính đến, hoặc thậm chí là nơi thích hợp hơn, nhưng cũng có nhiều trường hợp không. Sắp xếp, ví dụ.

Đó là lý do tại sao nhiều lần bạn sẽ thấy các trình tạo được sử dụng cho các giai đoạn xử lý ban đầu của một lượng lớn dữ liệu, sau đó khi nó được lọc thành một tập hợp con và được ánh xạ thành một định dạng đẹp, nó được đưa vào cấu trúc dữ liệu cụ thể lâu dài cho sử dụng thêm. Bằng cách đó, bạn không sử dụng phân bổ bộ nhớ, bỏ lỡ bộ nhớ cache và chi phí thu gom rác cho các mảng trung gian lớn, bạn sẽ ngay lập tức vứt bỏ.


3

Bạn đã có các trình vòng lặp nhầm lẫn với máy phát điện.

Ví dụ đầu tiên của bạn là một biểu thức lặp danh sách trong khi thứ hai là biểu thức trình tạo. Sự khác biệt chính là trình tạo tạo ra từng thành viên của bộ sưu tập đã cho một cách lười biếng (khi cần) chứ không phải háo hức (cùng một lúc, dù cần hay không). Bạn có thể xác định máy phát điện của riêng bạn bằng cách sử dụng năng suất hơn là trả lại.

Theo như cách sử dụng, bạn muốn có một trình vòng lặp khi bạn cần danh sách (hoặc từ điển hoặc bất cứ thứ gì) cho một cái gì đó trong chính nó. Bạn sẽ sử dụng một trình tạo khi bộ sưu tập là ngẫu nhiên cho sản phẩm cuối cùng. Ví dụ: bạn có thể sử dụng trình tạo để lấy danh sách các số thỏa mãn một số tiêu chí từ một số tiêu chí khác. Bạn không quan tâm đến danh sách ban đầu, chỉ những thành viên phù hợp với tiêu chí. Vì vậy, bạn sử dụng một trình tạo để chỉ nhận được những con số đó.

Một ví dụ cụ thể hơn sẽ là tìm các góc của các hình tam giác có các cạnh có độ dài cho trước. Chúng tôi không muốn tất cả các tam giác thất bại, bị biến dạng, chỉ có các tam giác thành công mạnh mẽ, khỏe mạnh. Vì vậy, chúng tôi sẽ sử dụng một máy phát điện.

Bài viết Stack Overflow này đi vào chi tiết hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.