Если вам нужно знать только ключ с максимальным значением, вы можете сделать это без iterkeys
или iteritems
, потому что итерация через словарь в Python - это итерация через его ключи.
max_key = max(stats, key=lambda k: stats[k])
EDIT :
Из комментариев, @ user1274878:
Я новичок в python.
blockquote>Yep ...
max
max (iterable [, key])
max (arg1, arg2, * args [, key])
Возвращает наибольший элемент в итерабельном или самом большом из двух или более аргументов.
blockquote >Дополнительный аргумент
key
описывает, как сравнивать элементы, чтобы получить максимум среди них:lambda <item>: return <a result of operation with item>
Возвращенные значения будут сравниваться.
Dict
Python dict - хеш-таблица. Ключ dict - это хэш объекта, объявленного как ключ. Из-за соображений производительности итерация, хотя dict реализован как итерация через ее ключи.
Поэтому мы можем использовать ее, чтобы избавиться от операции с получением списка ключей.
Закрытие
Функция, определенная внутри другой функции, называется вложенной функцией. Вложенные функции могут обращаться к переменным охватывающей области.
blockquote>Переменная
stats
, доступная через атрибут__closure__
функцииlambda
, как указатель на значение переменной, определенной в родительская область.
blockquote>mov msg, %rsi
Эта команда интерпретирует данные в msg как 64-битное значение и загружает это значение в регистр
rsi
. Инструкция НЕ загружает адрес «msg» в регистрrsi
. Это можно сделать (обратите внимание на$
):mov $msg, %rsi
В соответствии с тем, что я прочитал, программа должна вызвать sys_exit, или это будет segfault, но этого не произойдет .
blockquote>Вы должны знать, почему происходит segfault:
ЦП не знает, где находится «конец» вашей программы. ЦПУ также не может различать команды и данные.
Например, байты
0x8A, 0x07
могут означатьmov (%rdi),%al
или они могут представлять номер1930
- ЦП не знает.Достигнув конца вашей программы, CPU попытается прочитать байты после вашей программы и интерпретировать их как инструкцию.
Теперь возможны три сценария:
- По мере управления ОЗУ в 4096 байтовых блоках на системах x86. Поэтому в зависимости от длины вашей программы до 4095 байт «неиспользуемой» ОЗУ следуют вашей программе. ЦП будет интерпретировать (случайные) байты в ОЗУ как (ассемблерные) инструкции и выполнять эти инструкции. При достижении конца 4096 байтового блока происходит segfault.
- 4095 байтов содержат инструкцию, которая вызывает segfault (до достижения конца блока).
- 4095 байт представляют собой команды, которые вызывают выход программы без каких-либо исключений или бесконечного цикла.
Так что, возможно, в вашем случае это третья ситуация.
lea message(%rip), %rsi
для 64-битных статических адресов.mov $msg, %rsi
никогда не является лучшим выбором для всего, будь то PIE или не-PIE-исполняемый файл, независимо от того, выбрал ли он 64-битный немедленный или 32-битный расширенный знак. (В исполняемом файле, отличном от PIE, наиболее эффективным выбором являетсяmov $msg, %esi
, 5-байтная инструкция.) В моей системеmov $msg, %rsi
выбираетmovq
, а неmovabs
, поэтому он не будет ссылаться на PIE исполняемый файл. – Peter Cordes 14 July 2018 в 16:36lea msg(%rip), %rsi
(PIC) илиmov $msg, %esi
(не-PIC, статические адреса соответствуют 32 битам) – Peter Cordes 14 July 2018 в 16:43