快捷搜索: 王者荣耀 脱发

【Python学习】函数_传递列表

# _*_ 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("
以下的设计已经被打印:")
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("
以下的设计已被打印:")
    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)    # 使用切⽚表⽰法[:] 创建列表的副本
经验分享 程序员 微信小程序 职场和发展