Соглашение состоит в том, что функции либо изменяют заданный им аргумент (аргументы), либо возвращают результат, но затем оставляют аргументы нетронутыми.
Это сделано для того, чтобы пользователь вашей функции не делал это :
template = [1, 2, 0, 0]
shorter = drop_zeros(template)
print ("input was ", template, " and output was ", shorter)
Они ожидают этого вывода:
вход был [1, 2, 0, 0], а выход был [1, 2]
... но удивитесь, увидев:
вход был [1, 2], а выход был [1, 2]
Так что, чтобы избежать этого, либо :
не вернет измененный аргумент, но None
. Таким образом, вышеприведенный код выведет ...and output was None
, и пользователь поймет, что функция не предназначена для возврата результата.
возвращает результат, но гарантирует, что аргумент сохраняет его исходное содержимое
Итак, в вашем случае вы можете сделать:
def drop_zeros(p_list):
"""drops zeroes at end of list, in-place"""
while p_list and p_list[-1] == 0:
p_list.pop()
Обратите внимание, что else
может быть лучше интегрировано в условие while
. Больше не нужно делать явное break
. Также .pop()
не требуется -1 в качестве аргумента: это значение по умолчанию.
Если вы предпочитаете функцию, которая возвращает результат, тогда логика c должна быть несколько другой:
def drop_zeros(p_list):
"""returns a copy of the list without the ending zeroes"""
for i in range(len(p_list)-1, -1, -1):
if p_list[i] != 0:
return p_list[0:i+1]
return []
Теперь код предназначен для:
template = [1, 2, 0, 0]
shorter = drop_zeros(template)
print ("input was ", template, " and output was ", shorter)
# input was [1, 2, 0, 0] and output was [1, 2]