Что это значит, когда вы передаете a для l oop в любую функцию в python? - PullRequest
0 голосов
/ 17 апреля 2020

В настоящее время я изучаю Введение в CS50 по искусственному интеллекту с Python. Я столкнулся с строкой кода, которая не имеет смысла для меня, и я не могу найти какие-либо ресурсы в Интернете, чтобы объяснить это мне.

def contains_state(self,state):
    return any(node.state == state for node in self.frontier)

Это метод класса Python. Что сбивает с толку, так это то, как я понимаю node.state == state for node in self.frontier?

Мое понимание any () состоит в том, что он проверяет, является ли какой-либо элемент, который повторяется, истинным, но как код выше работает?

Большое спасибо за вашу помощь.

Ответы [ 4 ]

2 голосов
/ 17 апреля 2020

Здесь происходит несколько вещей:

  • любая () функция

https://beginnersbook.com/2019/03/python-any-function/

Python любая () функция принимает итеративный (список, кортеж, словарь и т. Д. c.) В качестве аргумента и возвращает истину, если любой из элементов в итерируемом равен true, в противном случае возвращает ложь. Если итерация пуста, то любой метод () возвращает false.

  • Python iterable

https://www.pythonlikeyoumeanit.com/Module2_EssentialsOfPython/Iterables.html

Итерируемый - это любой Python объект, способный возвращать своих членов по одному, позволяя перебирать его в течение -l oop.

  • возвращаемое значение функции: any(node.state == state for node in self.frontier)

    Возвращает "true", если есть любое "note.value" в любом из "узлов" в списке " self.frontier "имеет то же значение, что и входной параметр" state ".

Надеюсь, это поможет ...

1 голос
/ 17 апреля 2020

node.state == state for node in self.frontier - генератор с методом __next__. Когда что-то вызывает __next__, генератор выбирает значение из self.frontier, сравнивает свою переменную state с state и возвращает результат. Когда self.frontier повышает StopIteration, это исключение передается вызывающей стороне.

any() - потребитель. Он вызывает __next__ до тех пор, пока что-то не станет истинным, и не вернет True. Если __next__ повышает StopIteration, возвращается False.

Пример

>>> state = 'foo'
>>> frontier = ['bar', 'bar', 'foo', 'bar']
>>> gen = (value == state for value in frontier)
>>> type(gen)
<class 'generator'>
>>> gen.__next__()
False
>>> gen.__next__()
False
>>> gen.__next__()
True
>>> gen.__next__()
False
>>> gen.__next__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> 
>>> any(value == state for value in frontier)
True
1 голос
/ 17 апреля 2020

Код внутри any является объектом-генератором с логическими значениями (True или False). При выполнении for для l oop, если он есть node.state == state, contains_state возвращает True.

Преимущество использования генератора над списком состоит в том, что вам не нужно перебирать каждый элемент, если Вы находите узел, состояние которого равно состоянию, которое вы ищете. Поэтому в некоторых / большинстве случаев он будет работать быстрее.

Если он проходит через весь l oop и ни одно из состояний узлов не равно состоянию, переданному contains_state, функция возвращает False , Вы можете узнать больше о генераторах здесь .

1 голос
/ 17 апреля 2020

self.frontier является итеративным.

node.state == state for node in self.frontier выполняет итерации через self.frontier и создает новый список значений True и False на основе соответствия состояния.

any(...) возвращает True, если любой из этого списка содержит True.

Это примерно эквивалентно:

node_states = []
for node in self.frontier:
    node_states.append(node.state == state)

return any(node_states)
...