Tôi đang cố gắng thiết lập "đường ống xử lý" cho dữ liệu tôi đang đọc từ nguồn dữ liệu và áp dụng chuỗi các toán tử (sử dụng trình tạo) cho từng mục khi nó được đọc.Máy phát điện Python "chuỗi" trong vòng lặp
Một số mã mẫu thể hiện cùng một vấn đề.
def reader():
yield 1
yield 2
yield 3
def add_1(val):
return val + 1
def add_5(val):
return val + 5
def add_10(val):
return val + 10
operators = [add_1, add_5, add_10]
def main():
vals = reader()
for op in operators:
vals = (op(val) for val in vals)
return vals
print(list(main()))
mong muốn: [17, 18, 19]
thực tế: [31, 32, 33]
Python dường như không được tiết kiệm giá trị của op
mỗi lần thông qua các vòng lặp for, vì vậy nó thay vì áp dụng các chức năng thứ ba mỗi lần. Có cách nào để "liên kết" hàm vận hành thực tế với biểu thức trình tạo mỗi lần thông qua vòng lặp for?
Tôi có thể giải quyết vấn đề này bằng cách thay đổi biểu thức máy phát trong vòng lặp thành danh sách, nhưng vì dữ liệu thực tế lớn hơn nhiều, tôi không muốn lưu trữ tất cả trong bộ nhớ tại bất kỳ điểm nào .
Cảm ơn mọi người! Giải pháp 'map' làm việc tốt nhất cho tôi, vì có những thứ khác mà tôi muốn làm trong vòng lặp (liên quan đến việc ghi nhật ký, kiểm tra bổ sung, v.v.).Trong chương trình thực của tôi, mỗi toán tử 'thực sự là một lớp với' __call__', và có một số hàm và thuộc tính khác mà tôi cần phải giải quyết. Giải pháp 'reduce' cũng sẽ hoạt động tốt, nhưng mất khả năng thực hiện điều đó mà không cần gói mỗi toán tử trong một hàm để thực hiện các hành động bổ sung đó. – gtback