我想创建一个函数,当我运行它时,它会生成一个列表并在该列表中添加一个项目,所以基本上我会向这个函数传递两个参数,第一个是我想要列表的名称,第二个是我想添加到列表中的项目。我想把它作为一种学习练习来做,我已经构建了一个几乎可以完成我想要它做的功能的函数。
def addlst(l, item):
"""add an item to a list"""
l = list()#this line essentially does nothing.
if type(item) == str:
l.append(item.capitalize())
return l
print(l)
else:
l.append(item)
return l
print(l)
如果我通过这样的事情:
addlst(people, 'kev')
我收到错误:
NameError: name 'people' is not defined
但显然,如果我将人员定义为空列表,它工作正常。
我正在做的事情真的可能吗?我知道,当它站在这条线上
l = list()
只会先清空列表,因此 append 函数将无用(我必须添加另一个子句来检查列表是否已经存在)但我的问题实际上是关于在函数中初始化一个空白列表,然后将其返回给全球范围。
首先:函数永远不应该将新名称注入调用范围。
如果该函数与全局变量一起使用,则需要对其进行记录,并且调用者必须在调用它之前确保该全局变量存在。
如果函数接受一个参数,则有两种选择。一,你可以改变它并让你的函数 return 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 = []
# ...
但是,如果首先使用全局名称不好,那么像这样自动激活它会更糟。尽可能避免这种编程风格。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句