1

Код 1:Каков ключевой аргумент для сортировки работы?

>>> sorted("This is a test string from Andrew".split(), key=str.lower) 
    ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This'] 

Код 2:

>>> student_tuples = [ 
...  ('john', 'A', 15), 
...  ('jane', 'B', 12), 
...  ('dave', 'B', 10), 
... ] 
>>> from operator import itemgetter, attrgetter 
>>> 
>>> sorted(student_tuples, key=itemgetter(2)) 
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] 

Почему в коде 1, () опущен в key=str.lower, и он сообщает об ошибке, если круглые скобки включены, но в коде 2 в key=itemgetter(2), в скобки хранятся?

ответ

1

Аргумент key для sorted ожидает функцию, которая sorted затем применяется к каждому предмету вещи, подлежащей сортировке. Результаты key(item) сравниваются друг с другом, а не с каждым оригиналом item во время процесса сортировки.

Вы можете себе представить, это работает немного, как это:

def sorted(thing_to_sort, key): 
    # 
    # ... lots of complicated stuff ... 
    # 
      if key(x) < key(y): 
       # do something 
      else: 
       # do something else 
    # 
    # ... lots more complicated stuff ... 
    # 
    return result 

Как вы можете видеть, круглые скобки () добавлены функции keyвнутриsorted, применяя его к x и y, которые являются пункты от thing_to_sort.

В вашем первом примере str.lower - это функция, которая применяется к каждому x и y.

itemgetter немного отличается. Это функция, которую возвращает другую функцию, и в вашем примере это , что другая функция, которая применяется к x и y.

Вы можете увидеть, как itemgetter работает в консоли:

>>> from operator import itemgetter 
>>> item = ('john', 'A', 15) 
>>> func = itemgetter(2) 
>>> func(item) 
15 

Это может быть немного трудно получить вокруг головы функций «высшего порядка» (те, которые принимают или возвращают другие функции) на первом, но они очень полезны для множества различных задач, поэтому стоит поэкспериментировать с ними, пока вы не почувствуете себя комфортно.

+1

Благодарим вас за кристально чистое объяснение, Пирей! –

-1

ковыряться с консолью чуток str.lower рефрижераторов методы «ниже» из «ул» объектов и str.lower() является функцией, как всегда str.lower() требует аргумента, так правильно написано было бы str.lower("OH BOY") и вернуться бы oh boy ошибка заключается в том, что вы не передали никаких аргументов функции, но ожидали ее.

Смежные вопросы