Python函数的传值-列表

传递列表

向函数传递列表很有用,这种列表包含的可能是名字、数字或更复杂的对象(字典)。将列表传递给函数后,函数就能直接访问其内容。下面使用函数来提高处理列表的效率。
比如,有一个用户列表,想要和每位用户打招呼,下面举例把一个名字列表传递给函数:

def greet_users(names):
	for name in names:
		msg = "Hello, " + name.title() + "!"
		print(msg)
		
usernames = ['hannah' , 'try' , 'margot']
greet_users(usernames)

看看执行结果:

Hello, Hannah!
Hello, Try!
Hello, Margot!

1.在函数中修改列表

将列表传递给函数后,函数就可对其进行修改。在函数中这个列表所作的任何修改都是永久性的,这样能够高效的处理大量的数据。
比如:一家为用户提交的设计制作3D打印模型的公司。需要打印的设计存储在一个列表中,打印后移到另一个列表中,先举个不使用函数的情况下模拟这个过程的代码:

#首先创建一个列表,其中包含一些要打印的设计
unprinted_desgins = ['iphone case' , 'roboot pendant' , 'dodecahedron']
completed_models = []
#模拟打印每个设计,直到没有未打印的设计为止
#打印每个设计后,都将其移到列表completed_models中
while unprinted_desgins:
	current_desgin = unprinted_desgins.pop()
	#模拟根据设计制作3D打印模型的过程
	print("Printing model: " + current_desgin)
	completed_models.append(current_desgin)
#显示打印好的所有模型
print("\nThe following models have been printed:")
for completed_model in completed_models:
	print(completed_model)

看看结果:

Printing model: dodecahedron
Printing model: roboot pendant
Printing model: iphone case

The following models have been printed:
dodecahedron
roboot pendant
iphone case

该代码首先创建一个需要打印的设计列表,还创建一个名为completed_models的空列表,每个设计打印都将移到这个列表中。只要列表unprinted_designs中还有设计,while循环就模拟打印设计的过程:从该列表末尾删除一个设计,将其存储到变量current_design中,并显示一条消息,指出正在打印当前的设计,再将该设计加入到列表completed_models中,循环结束后,显示已打印的所有设计。
下面我们使用函数重新编写该code,编写两个函数,每个函数都执行具体的工作。第一个函数负责处理打印设计的工作,第二个函数负责概述打印了那些设计:

def print_models(unprinted_designs,completed_models):
"""
模拟打印每个设计,直到没有未打印的设计为止
打印每个设计后,都将其移到列表completed_models中
"""
	while unprinted_designs:
		current_design = unprinted_designs.pop()
		#模拟根据设计制作3D打印模型的过程
		print("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 = ['iphone case' , 'robot pendant' , 'dodecahedron']
completed_models = []

print_models(unprinted_designs,completed_models)
show_completed_models(completed_models)
Printing model: dodecahedron
Printing model: robot pendant
Printing model: iphone case

The following models have been printed: 
dodecahedron
robot pendant
iphone case

该程序中表达了这样一个理念,即每个函数都应只负责一项具体的工作。第一个函数打印每个设计,而第二个显示打印好的模型;这优于使用一个函数来完成两项工作。

2.禁止函数修改列表

有时候,传入函数的列表是不允许修改的,就像C语言中设计函数参数时,使用const修饰。
用上面的例子做一下扩展,打印所有的设计后,也要保留原来的未打印的设计列表,以供备案。但由于之前的设计中把所有的设计都移出了unprinted_designs,该列表就变为空了,原列表就没有了,为了解决这个问题,可向函数传递列表参数的副本而不是原件;这样函数所作的修改都只影响副本,而丝毫不影响原件。
怎么传递列表副本呢?比如这样:

function_name(list_name[:])

切片表示法[:]创建列表的副本:

def print_models(unprinted_designs,completed_models):
	while unprinted_designs:
		current_design = unprinted_designs.pop()
		
		print("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 = ['iphone case' , 'robot pendant' , 'dodecahedron']
completed_models = []


print_models(unprinted_designs,completed_models)
show_completed_models(completed_models)
for unprinted in unprinted_designs:
	print(unprinted)

print_models(unprinted_designs,completed_models)
show_completed_models(completed_models)
for unprintdd in unprinted_designs:
	print(unprintdd)
发布了53 篇原创文章 · 获赞 19 · 访问量 2373

猜你喜欢

转载自blog.csdn.net/m0_37757533/article/details/105626273