一、传递列表
你经常会发现,向函数传递列表很有用,这种列表包含的可能是名字、数字或者更复杂的对象(如字典)。
将列表传递给函数后,函数就能直接访问其内容。
栗子:假设有一个用户列表,我们要和其中每一位用户打招呼。如何用代码实现,可以看下面的代码:
1 def greet_users(names): 2 """给列表中的每位用户打招呼""" 3 for name in names: 4 msg = "Hello, " + name.title() + " !" 5 print(msg) 6 7 usernames = ['joe','jasy','nacy'] 8 greet_users(usernames)
console:
解释:我们将greet_users 定义成一个接受一个名字列表,并将其存储在形参names中,这个函数遍历收到的列表,
并对其中的每位用户都打印一条问候语句。在line 7,我们定义了一个名字列表 usernames,然后调用greet_users(),
并将这个列表传递给它。输出的信息也完全符合我们的预期,每位用户都看到了一条问候语句,每当你想问候一组用
户时就可以调用这个函数。
二、在函数中修改列表
在将列表传递给函数后,函数就可以对其进行修改。在函数中 对这个列表的修改是永久性的,这让你能够高效地处理
大量的数据。
栗子:假如有一些用户已注册某网站但未验证,我们需要将他们全部验证,验证过的用户则会从未验证的列表中删除加入
已验证的列表中。如下:
1 def print_username(unverify_users,verify_users): 2 """模拟打印每个已验证的用户""" 3 while unverify_users : 4 current_user = unverify_users.pop() 5 6 # 模拟打印验证用户过程 7 print("Verifing user : " + current_user) 8 verify_users.append(current_user) 9 10 def show_verify_users(verify_users): 11 """打印类表中所有的用户""" 12 for username in verify_users: 13 print(username) 14 15 16 unv_users = ['joe','jhson','nacy'] 17 v_users = [] 18 19 print_username(unv_users,v_users) 20 show_verify_users(v_users)
console:
解释:我们创建了两个列表,一个是未验证的用户列表,里面有三个用户,一个是已验证用户列表,此时是没有用户的,
我们也定义了两个函数:一个功能是模拟打印每个已验证用户,一个是打印列表中的所有用户。可以看到已验证用户列表
从最开始的没有用户到之后的拥有三个用户,可以看出函数中确实可以改变列表。这个例子也表达了一种编程的理念:
每个函数都应只负责一项具体的工作。
三、禁止函数修改列表
有时候,需要禁止函数修改列表。假如之前的栗子中,我们在验证用户之后,未验证用户列表会变为空列表(上面的代
码中未打印,可以自己尝试),而我们还需要用到开始未验证的用户列表,以供备案。为了解决这个问题,我们可以向
函数传递一个列表的副本,如下:
1 def print_username(unverify_users,verify_users): 2 """模拟打印每个已验证的用户""" 3 while unverify_users : 4 current_user = unverify_users.pop() 5 6 # 模拟打印验证用户过程 7 print("Verifing user : " + current_user) 8 verify_users.append(current_user) 9 10 def show_users(verify_users): 11 """打印所有已验证的用户""" 12 for username in verify_users: 13 print(username) 14 15 16 unv_users = ['joe','jhson','nacy'] 17 v_users = [] 18 19 print_username(unv_users[:],v_users) 20 show_users(v_users) 21 show_users(unv_users)
console:
可以看到效果是一样的,已验证用户列表中也已经添加了那三个通过验证的用户,而且之前的未验证用户列表中也是有值的,
这样我们就可以继续使用它了。
-- The End --
黑夜给了你黑色的眼睛,你却用它来翻白眼。