объект типа «фильтр» не имеет len ()

я пытаюсь использовать симуляцию Монте-Карло, чтобы вычислить площадь под кривой (python 3.8) введите здесь описание изображения

чтобы в конечном итоге получить этот сюжет введите здесь описание изображения

я пробовал этот код

import random, math

NUM_POINTS = 10000

# Function for which we want to find area from (x=0 to 10).
f = lambda x: 5 * math.sin(6 * x) + 3 * math.sin(2 * x) + 7

# Sample rectangle will be (x,y) such that 0 <= x <= 10 and 0 <= y <= 14.
rect_width = 10
rect_height = 14

# Funcitions to generate samples for x and y respectively.
rand_x = lambda: random.uniform(0, rect_width)
rand_y = lambda: random.uniform(0, rect_height)

# Generate random sample points.
points = [(rand_x(), rand_y()) for i in range(NUM_POINTS)]

# Find points under our function
points_under = filter(lambda point: point[1] <= f(point[0]), points)

# Area = area of domain rectangle * num_points_under/num_points_total
area = rect_width * rect_height * len(points_under)*1.0/len(points)
print ("Estimate of area under the curve:", area)

у меня эта ошибка:

объект типа 'фильтр' не имеет len()

Кто-нибудь может мне помочь ?


person Hello_world    schedule 15.11.2020    source источник
comment
Кстати, графики и большая часть вашего кода совершенно не имеют отношения к проблеме. В будущем предоставьте минимально воспроизводимый пример. Кроме того, я только что погуглил сообщение об ошибке, и этот вопрос был лучшим результатом. В будущем, пожалуйста, попробуйте провести исследование самостоятельно. См. раздел Как спросить, если вам нужны дополнительные советы.   -  person wjandrea    schedule 15.11.2020
comment
Кроме того, именованные лямбда-выражения являются плохой практикой. Просто используйте def вместо этого.   -  person wjandrea    schedule 15.11.2020
comment
Это одна из основных проблем при переходе с Python2 на Python3. filter возвращает итератор, а не список. Я не знаю, почему боги Python решили, что sum(iterator) делает очевидную правильную вещь, а len(iterator) выдает ошибку.   -  person Frank Yellin    schedule 15.11.2020


Ответы (1)


Спасибо, ребята, так как это код Python 2.X, а я использую версию Python 3.X, поэтому этот инструмент был полезен для преобразования моего кода: https://www.pythonconverter.com/

person Hello_world    schedule 15.11.2020