Warning Đây là một chút phức tạp nhưng không được công việc. Tôi sẽ sử dụng một ví dụ để giải thích nó.
Hãy nói expensive_function = math.sin
infinite generator = collections.count(0.1,0.1)
sau đó
[z for z in (y if y < 5 else next(iter([]))
for y in (math.sin(x) for x in itertools.count(0.1,0.1)))]
là
[0.09983341664682815,
0.19866933079506122,
0.2955202066613396,
0.3894183423086505,
0.479425538604203]
Vì vậy, vấn đề của bạn nắm để
[z for z in (y if y < 0.5 else next(iter([])) \
for y in (expensive_function(x) for x in generator))]
Bí quyết là để buộc một StopIteration
từ một máy phát điện và không có gì thanh lịch hơn next(iter([]))
Đây expensive_function
chỉ được gọi một lần mỗi lần lặp.
Mở rộng Máy phát vô hạn bằng Máy phát điện hữu hạn, với Điều kiện Dừng. Khi trình tạo không cho phép raise StopIteration
, chúng tôi sẽ chọn một cách phức tạp tức lànext(iter([]))
Và bây giờ bạn có một máy phát điện hữu hạn, có thể được sử dụng trong một danh sách Hiểu
Như OP đã quan tâm đến việc áp dụng các phương pháp trên cho một phi monotonic chức năng đây là một chức năng không đơn điệu hư cấu
đắt Non-Monotonic Chức năng f(x) = random.randint(1,100)*x
Dừng Điều kiện = < 7
[z for z in (y if y < 7 else next(iter([])) for y in
(random.randint(1,10)*x for x in itertools.count(0.1,0.1)))]
[0.9,
0.6000000000000001,
1.8000000000000003,
4.0,
0.5,
6.0,
4.8999999999999995,
3.1999999999999997,
3.5999999999999996,
5.999999999999999]
Btw: 01.theo nghĩa thực là không đơn điệu trên toàn bộ phạm vi (0,2pi)
Có bất kỳ câu trả lời nào đáng được chấp nhận không? Nếu không, bạn vẫn đang tìm kiếm thông tin gì? –
Xin lỗi quên đánh dấu phần này. Cảm ơn bạn vì câu trả lời! – Joe
Không sao cả. Đã hy vọng bạn chỉ cần một lời nhắc nhở. :) –