python 列表与函数参数

在我们实际使用中,向函数传递列表往往是十分有用的。这篇我们就来学习一下列表作为函数参数的使用。

首先我们看一个简单的场景:假如某一只球队在进行一场比赛,在比赛前很有必要介绍一下各个队员的信息,这里我们就简单的模拟一下。

首先 我们定义三个运动员的信息,包含名字和年龄:

player1 = {'name':'wangsan','age':23};
player2 = {'name':'lisi','age':24};
player3 = {'name':'zhaoliu','age':25};

然后,将这些运动员都放在一个列表中以便使用:

player_list = [player1,player2,player3];

接着就是定义我们的函数了,这里我们简单打印运动员的名字和年龄:

def print_players(player_list):
    for player in player_list:
        print("Player:"+player['name'] +" "+ "Age:" + str(player['age']));

最后就是使用我们的函数了,将列表player_list 作为参数传入函数print_players中:

print_players(player_list);

让我们看下最后的输出结果:

Player:wangsan Age:23
Player:lisi Age:24
Player:zhaoliu Age:25

可以看到这和我们预期的输出是一致的。那么如果我们在处理函数print_players中修改传入的列表,比如给每个运动员增加一个所属球队的属性。

player['group:'] = "国足";

其他的我们不做修改,可以预期输出还是和上面是一致的。那么对于列表player_list本身,增加了一个属性到底有没有影响呢?列表是否保存了我们的修改呢?

那么我们打印一下原始列表player_list;

print(player_list);

这里可能就和很多朋友想象的有点出入了,列表被改变了:

[{'name': 'wangsan', 'age': 23, 'group:': '国足'}, {'name': 'lisi', 'age': 24, 'group:': '国足'}, {'name': 'zhaoliu', 'age': 25, 'group:': '国足'}]

到了这里,我们就要记住一件事情了,将列表作为参数传入函数中去,那么在函数中任何对于列表的修改是永久性的。很显然,有时这种特性是不符合我们预期的,我们可能想使用列表,但是不会修改原始数据,哪怕和上面一样,我们同样增加了一个属性,但是对于原始列表不会产生任何影响。

看到这里估计有人就想起我们前面提到过的概念:列表切片。对了,就是列表切片,在我们不希望修改数据的时候,我们可以选择列表切片将列表的副本传入。

还是上面的例子,我们需要做的修改只是在传参的时候使用副本即可。

print_players(player_list[:])

可能有细心的朋友会发现,即使是这样,原来的列表也会发生改变,关于这一点,大家在这里记住一点:当列表为一维列表的时候,使用切片创建副本是没有任何问题的。

后面,我会写一篇文章来讨论一下在python中的拷贝机制。

下面我们要学习的是在函数中使用不确定个数的参数列表。
在我们使用列表的情况下,其语法格式如下:

def print_players(*list):

那么我们就定义一个函数来打印运动员信息,我们也不知道有几个运动员,随意写几个:

def print_players_list(*list):
    for player in list:
        print(player)

首先,函数定义了一个list变量,将我们传入的参数全部存储在这个变量中去,我们可以像使用列表一样去操作它。这里我们是打印出入的信息。

print_players_list(player1,player2,player3)

输出:

{'name': 'ddd', 'age': 23}
{'name': 'ddd', 'age': 24}
{'name': 'ddd', 'age': 25}

假如我们要传递的是键值对,那么它的语法如下:

def print_players(**list):

和上面一样,不同是将我们传入的键值对保存在字典中。

同样我们修改一下上面的函数定义:

def print_players(**list):
    for key,value in list.items():
        print(value)

由于是键值对的操作,所以我们采用上面的方式。

然后在调用的时候,我们出入几个键值对:

print_players(name='wangsan',age='lisi')

如果我们在函数的最开头打印一下这个字典,大家会发现:

print(list);

输出:

{'name': 'wangsan', 'age': 'lisi'}

这就是将我们传入的键值对加入了一个空的字典中去。

看到这里,想必大家应该想到,既然是在同一个字典中,那么我们传入的键名肯定是不能相同的。如果你不信,下面的输出回和你得到的错误代码是一致的:

  File "D:/Programs/python/HelloWorld/hello_world.py", line 20
    print_players(name='wangsan',name='lisi')
                                ^
SyntaxError: keyword argument repeated

当然了,这种方式在函数前面还是可以加入你想要的参数的,但是这种方式最好还是写在末尾。。。

对于键值对类型的:

def print_players(groups, **list):

换个顺序:

  File "D:/Programs/python/HelloWorld/hello_world.py", line 4
    def print_players(**list,groups):
                                  ^
SyntaxError: invalid syntax

而对于列表只要我们使用关键字实参就没问题的。

print_players_list(player1,player2,player3,groups=100)

猜你喜欢

转载自blog.csdn.net/qingyulove/article/details/80921931