一、传递列表
我们来学一下向函数传递列表,这个也挺有用的,顺便复习一下列表的知识。
向函数传递列表时,其中包含的可能是名字、数或者更复杂的对象(如字典)。将列表传递给函数后,函数就能直接访问其内容。
例:如果我们有一个用户列表,我们要问候其中的每位用户。下面的代码将包含名字的列表传递给一个名为greet_users()的函数,这个函数问候列表中的每个人。
def greet_user(names):
"""向列表中的每位用户发出简单的问候"""
for name in names:
msg = f"Hello,{name.title()}!"
print(msg)
usernames = ['hannah','try','margot']
greet_user(usernames)
输出结果:
1.在函数中修改列表
将列表传递给函数后,函数就可对其进行修改。在函数中对这个列表所做的任何修改都是永久性的,这让我们能够高效的处理大量数据。
例:来看一家为用户提交的设计3D打印模型的公司。需要打印的设计存储在一个列表中,打印后将移到另一个列表中。
不使用函数的情况下模拟这个过程
#首先创建一个列表,其中包含一些要打印的设计
unprinted_designs = ['phone case','robot pendant','dodecahedron']
completed_models = []
#模拟打印每个设计,直到没有未打印的设计为止
#打印每个设计后,都将其移到列表completed_models中
while unprinted_designs:
current_design = unprinted_designs.pop()
print(f"Printing model:{current_design}")
completed_models.append(current_design)
#显示打印好的所有模型
print("\nThe following models have been printed:")
for completed_model in completed_models:
print(completed_model)
输出结果:
使用函数模拟这个过程
为重新组织这些代码,可编写两个函数,每个都做一件具体的工作。
第一个函数负责处理打印设计的工作,第二个函数概述打印了哪些设计
def print_models(unprinted_designs,completed_models):
"""
模拟打印每个设计,直到没有未打印的设计为止
打印每个设计后,都将其移到列表completed_models中
"""
while unprinted_designs:
current_design = unprinted_designs.pop()
print(f"Printing model:{current_design}")
completed_models.append(current_design)
def show_completed_models(completed_models):
"""显示打印好的所有模型"""
print("\nThe following models have been printed:")
for completed_model in completed_models:
print(completed_model)
unprinted_designs = ['phone case','robot pendant','dodecahedron']
completed_models = []
print_models(unprinted_designs,completed_models)
show_completed_models(completed_models)
输出结果:
2.禁止函数修改列表
有时候,需要禁止函数修改列表。例如上个例子中,我们即使完成了所有打印,但是想要保留原来未打印的设计列表,以供备案。但是由于我们将所有的设计都移出了原列表,这个列表变成空的了,原来的列表没有了。
为解决这个问题,可向函数传递列表的副本而非原件。这样函数所做的任何修改都只影响副本,而原件不受影响。
将列表的副本传递给函数
function_name(list_name[:])
切片表示法 [:] 创建列表的副本,在上一例中,如果不想清空未打印的设计列表,可以这样调用print_models():
print_models(unprinted_designs[:],completed_models)