《Python编程:从入门到实践(第二版)》自学笔记(十五)

一、向函数传递列表

将列表传递给函数后,带来的好处是:函数可以直接访问列表中的内容,提高函数处理列表的效率

1
2
3
4
5
6
7
8
9
10
11
def greet_users(names):
"""向列表中的每位用户发出简单的问候。"""
for name in names:
msg = f"Hello, {name.title()}!"
print(msg)
usernames = ['hannah', 'ty', 'margot']
greet_users(usernames)
输出:
Hello, Hannah!
Hello, Ty!
Hello, Margot!

在之前单独接触列表时,曾涉及到列表中的元素是可以直接进行修改的,同样的在这里函数中列表也是可以修改的,两者是通的,需要注意的是:函数对列表作出的任何修改都是永久性的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
##以下代码块是未使用函数实现的,未使用函数,未使用函数!!!

# 首先创建一个列表,其中包含一些要打印的设计。
unprinted_designs = ['phone case', 'robot pendant', 'dodecahedron']
completed_models = []
# 模拟打印每个设计,直到没有未打印的设计为止。
# 打印每个设计后,都将其移到列表completed_models中。
while unprinted_designs:
current_design = unprinted_designs.pop()
print(f"Printing model: {current_design}")
completed_models.append(current_design)
# 显示打印好的所有模型。
print("\nThe following models have been printed:")
for completed_model in completed_models:
print(completed_model)
输出:
Printing model: dodecahedron
Printing model: robot pendan
Printing model: phone case

The following models have been printed:
dodecahedron
robot pendant
phone case
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
##以下代码块是使用函数实现的,使用函数,使用函数!!!
def print_models(unprinted_designs, completed_models):
"""
模拟打印每个设计,直到没有未打印的设计为止。
打印每个设计后,都将其移到列表completed_models中。
"""
while unprinted_designs:
current_design = unprinted_designs.pop()
print(f"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 = ['phone case', 'robot pendant', 'dodecahedron']
completed_models = []
print_models(unprinted_designs, completed_models)
show_completed_models(completed_models)
输出:
Printing model: dodecahedron
Printing model: robot pendan
Printing model: phone case

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

但是由于函数对列表的修改是永久性的,无法保证原列表不受影响,所以这里引入了之前所提到的切片副本的概念,即向函数传递的非源列表,而是源列表的副本,这样函数修改的列表即为列表的副本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
##以下代码块是使用函数及列表切片副本实现的,使用函数及列表切片副本,使用函数及列表切片副本!!!
def print_models(unprinted_designs[:],, completed_models):
"""
模拟打印每个设计,直到没有未打印的设计为止。
打印每个设计后,都将其移到列表completed_models中。
"""
while unprinted_designs:
current_design = unprinted_designs.pop()
print(f"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 = ['phone case', 'robot pendant', 'dodecahedron']
completed_models = []
print_models(unprinted_designs, completed_models)
show_completed_models(completed_models)
输出:
Printing model: dodecahedron
Printing model: robot pendan
Printing model: phone case

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

二、传递任意数量的实参

其实向函数传递任意数量的实参,书中把它看做向函数传递元组,元组里包含多个元素。因为有时候,预先不知道函数需要接受多少个实参,但在Python是允许函数从调用语句中收集任意数量的实参的,而在我自己理解的是:向函数传递列表,因为列表和元组很相似,最根本的区别是:列表中的元素是可以修改的,而元组中的元素是不可以修改的。然而我们去向形参传递实参的时候,实参的元素本就是一个可变的过程

1
2
3
4
5
6
7
8
def make_pizza(*toppings):
"""打印顾客点的所有配料。"""
print(toppings)
make_pizza('pepperoni')
make_pizza('mushrooms', 'green peppers', 'extra cheese')
输出:
('pepperoni',)
('mushrooms', 'green peppers', 'extra cheese')

形参名*toppings中的星号让Python创建一个名为toppings的空元组,并将收到的所有值都封装到这个元组中,即便函数只收到一个值,当然如果想要结合位置,可以使实参和形参保持对应关系,值得注意的是:如果有需要传递不确定数量的实参时,形参位置必须要放在最后

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def make_pizza(size, *toppings):
"""概述要制作的比萨。"""
print(f"\nMaking a {size}-inch pizza with the following toppings:")
for topping in toppings:
print(f"- {topping}")
make_pizza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
输出:
Making a 16-inch pizza with the following toppings:
- pepperoni

Making a 12-inch pizza with the following toppings:
- mushrooms
- green peppers
- extra cheese

接下的的代码块示例是我在接触使用任意数量的关键字实参时,觉得有点绕的地方,这里Key一下,防止日后纠结转不过来,个人理解的其实质是:函数体括号中存在的是一个完整的字典,首先函数处理的是先让字典user_info里先有第一个键值对:’first_name’:’first’,其次处理的是让字典user_info里再有第二个键值对:’last_name’:’last’,接下来由于**user_info可以接受任意数量的实参,所以这时接收了location=’princeton’和field=’physics’这两个键值对,所以最后一共在字典user_info里会有4个键值对,而不是之前一直纠结的只有’location’:’princeton’和’field’: ‘physics’这两个键值对了

1
2
3
4
5
6
7
8
9
10
11
def build_profile(first, last, **user_info):
"""创建一个字典,其中包含我们知道的有关用户的一切。"""
user_info['first_name'] = first
user_info['last_name'] = last
return user_info
user_profile = build_profile('albert',
'einstein',
location='princeton', field='physics')
print(user_profile)
输出:
{'location': 'princeton', 'field': 'physics', 'first_name': 'albert', 'last_name': 'einstein'}

啊,终于把这里弄理解,搞懂了,一直卡在这里~~~

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2019-2024 Carrol Chen
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信