# _*_ coding:utf-8 _*_
"""
name:zhangxingzai
date:2022/11/7
from:《Python编程从入门到实践》
"""
8.4 传递列表
你经常会发现,向函数传递列表很有⽤,其中包含的可能是名字、数或更复杂的对 象(如字典)。将列表传递给函数后,函数就能直接访问其内容。下⾯使⽤函数来 提⾼处理列表的效率。 假设有⼀个⽤户列表,我们要问候其中的每位⽤户。下⾯的⽰例将包含名字的列表 传递给⼀个名为greet_users() 的函数,这个函数问候列表中的每个⼈:
def greet_users(names):
for name in names:
msg = f'你好,{name.title()}'
print(msg)
tester = ['hannah', 'ty', 'margot']
greet_users(tester)
8.4.1 在函数中修改列表
将列表传递给函数后,函数就可对其进⾏修改。在函数中对这个列表所做的任何修改都是永久性的,这让你能够⾼效地处理⼤量数据。 来看⼀家为⽤户提交的设计制作3D打印模型的公司。需要打印的设计存储在⼀个列表中,打印后将移到另⼀个列表中。下⾯是在不使⽤函数的情况下模拟这个过程的代码:
# ⾸先创建⼀个列表,其中包含⼀些要打印的设计。
unprinted_designs = ['phone case', 'robot pendant', 'dodecahedron']
completed_models = []
# 模拟打印每个设计,直到没有未打印的设计为⽌。
# 打印每个设计后,都将其移到列表completed_models中。
while unprinted_designs:
current_design = unprinted_designs.pop() # 使用pop()方法弹出列表末位元素,并赋值给current_design
print(f"正在打印: {current_design}")
completed_models.append(current_design) # 使用append()将弹出的元素添加到completed_models列表中
# 显⽰打印好的所有模型
print("\n以下的设计已经被打印:")
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"正在打印: {current_design}")
completed_models.append(current_design)
def show_completed_models(completed_models):
"""显⽰打印好的所有模型。"""
print("\n以下的设计已被打印:")
for completed_model in completed_models:
print(completed_model)
unprinted_designs = ['phone case', 'robot pendant', 'dodecahedron']
completed_models = []
print_models(unprinted_designs, completed_models) # 注意:这里unprinted_designs, completed_models都是实参
show_completed_models(completed_models)
相⽐于没有使⽤函数的版本,这个程序更容易扩展和维护。如果以后需要打印其他设计,只需再次调⽤print_models() 即可。如果发现需要对打印代码进⾏修改, 只需修改这些代码⼀次,就能影响所有调⽤该函数的地⽅。与必须分别修改程序的多个地⽅相⽐,这种修改的效率更⾼。 该程序还演⽰了这样⼀种理念:每个函数都应只负责⼀项具体的⼯作。第⼀个函数打印每个设计,第⼆个显⽰打印好的模型。这优于使⽤⼀个函数来完成这两项⼯作。 8.4.2 禁⽌函数修改列表 有时候,需要禁⽌函数修改列表;比如上面的个未打印的设计列表,我们需要保留 为解决这个问题,可向函数传递列表的副本⽽⾮原件
print_models(unprinted_designs[:], completed_models) # 使用切⽚表⽰法[:] 创建列表的副本