Python — уменьшить функцию и | оператор

#python #web2py #reduce

#python #web2py #уменьшить

Вопрос:

Я смотрю на некоторый код Web2py.

Переменная tokens представляет собой своего рода список строк. Чтобы быть более точным, это определяется как, tokens = form.vars.name.split() где form.vars.name — строка.

Мой вопрос касается следующей инструкции :

 query = reduce(lambda a,b:aamp;b,[User.first_name.contains(k)|User.last_name.contains(k) for k in tokens])
  

Вот мои вопросы :

  1. Я знаю, что lambda a,b:aamp;b определяет функцию a и b . Что такое aamp;b ?

  2. Является ли contains метод User.first_name специфичным для Web2py? Или это существует в стандартном Python?

  3. Что это за | оператор в User.first_name.contains(k)|User.last_name.contains(k) ?

  4. Что делает reduce функция?

Комментарии:

1. У вас уже была возможность ознакомиться с документацией?

2. Если contains(k) возвращает логическое значение, его можно переписать как query = all(User.first_name.contains(k) or User.last_name.contains(k) for k in tokens) .

3. Не обращайте внимания на мой предыдущий комментарий, поскольку contains() не возвращает логическое значение, а побитовые операторы были перезагружены для других целей. Подробнее смотрите ответ Йохена Ритцеля.

Ответ №1:

  1. В Web2Py amp; и | не являются побитовыми и / или здесь, а используются для создания специального объекта, который представляет запрос к базе данных! Они соответствуют AND и OR в операторах SQL
  2. содержит является частью Web2Pys DAL
  3. Смотрите 1.
  4. reduce — это fold, очень фундаментальная функция высшего порядка, которая по существу сводит список к результату, используя указанную функцию.

Комментарии:

1. Я не уверен, является ли это хорошим использованием перегрузки оператора. С одной стороны, это позволяет пользователям кратко указывать, что они хотят сделать. С другой стороны, неопытный читатель будет полностью сбит с толку, потому что перегрузка оператора в значение, настолько отличное от значения оператора, необычна (по крайней мере, я считаю, что это необычно).

Ответ №2:

  1. Побитово и.
  2. Я полагаю, что содержит, в этом контексте это более или менее сопоставление с __contains__ , но оно появляется в документах Py3k.
  3. Побитовое или.
  4. reduce выполняет итерацию по итерируемому объекту (параметр 2) и вызывает переданную функцию (параметр 1) для всех элементов. Он возвращает совокупное значение.

Ответ №3:

  1. amp; является побитовым оператором and. Человек, пишущий код, почти наверняка имел в виду and , хотя для логических значений результат тот же.

  2. .contains() это метод, предоставляемый web2py. a.contains(b) более по-питоновски записывается как b in a .

  3. | является побитовым оператором OR. Опять же, они, вероятно, имели в виду or .

  4. reduce применяет функцию, указанную в качестве первого аргумента, к итерации во втором аргументе, слева направо, сначала с первыми двумя элементами, затем с результатом этого вычисления и третьим элементом и т.д.