Прежде всего: функция никогда не должна вводить новое имя в вызывающую область.
Если функция работает с глобальной переменной, это должно быть задокументировано, а вызывающая сторона должнаперед вызовом убедитесь, что глобал существует.
Если функция принимает аргумент, есть две опции.Во-первых, вы можете изменить его, и ваша функция вернет None
, или вы можете создать новое значение на основе аргумента и вернуть его, оставив аргумент без изменений.Очень редко, если вообще когда-либо, если ваша функция изменяет аргумент и возвращает значение.
Если ваша функция возвращает новый список, вы можете необязательно взять список для изменения или создать новый список внутри вашей функции.
Не имеет отношения к делу, но вам все равно, какой тип item
, толькочто это то, что имеет capitalize
метод, который вы можете вызвать.Просто попробуйте;если этого не произойдет, то получится AttributeError
, который вы можете поймать, и в этом случае вы можете просто использовать item
как есть.
Собирая все это вместе, я рекомендую третий подход,add_to_list
примет элемент в качестве первого аргумента и необязательный список в качестве второго аргумента.Если список не указан, функция создаст новый список.В любом случае вы добавите в список соответственно измененный элемент и вернете его.
def add_to_list(item, l=None):
# Note: this doesn't change the item you pass; it just rebinds
# the local name item to a *new* string if it succeeds.
try:
item = item.capitalize()
except AttributeError:
pass
if l is None:
l = []
return l + [item]
Затем вы можете использовать
people = add_to_list('kev') # people == ['Kev']
people = add_to_list('bob') # people == ['Bob'], Kev is gone!
people = add_to_list('kev', people) # people == ['Bob', 'Kev'], Kev is back.
Более эффективная версия, упомянутая ввторой подход изменяет l
на месте;в этом случае, однако, у вас есть , чтобы предоставить список;Вы не можете создать новый список.
def add_to_list(item, l):
try:
item = item.capitalize()
except AttributeError:
pass
l.append(item)
people = [] # Create the list in the *calling* scope, not in add_to_list
add_to_list('kev') # TypeError, missing an argument
add_to_list('kev', people) # people == ['Kev']
add_to_list('bob', people) # people == ['Kev', 'Bob']
Первый подход довольно плох;она ограничивает вашу функцию работой с определенным списком, имя которого жестко закодировано в функции, но я упомяну это здесь для полноты.Поскольку список жестко запрограммирован, мы изменим имя функции, чтобы отразить это.
def add_to_people(item):
global people
try:
item = item.capitalize()
except AttributeError:
pass
people.append(item)
Теперь add_to_list
может работать с глобальным списком people
, но без другого списка.
people = []
add_to_people('kev')
add_to_people('bob')
И, наконец, в интересах полного раскрытия, да, add_to_people
может создать список, если его еще нет:
def add_to_people(item):
global people
try:
people # Simply try to evaluate the name
except NameError:
people = []
# ...
Однако, если используетсяглобальное имя, во-первых, плохое, авививифицировать его так, как будто это хуже.По возможности избегайте такого стиля программирования.