↑ 点击上方【计算机视觉联盟】关注我们
今天是小编持续更新关于Python的知识总结以及Python实践项目应用的第12天,带你利用零碎时间自学最受欢迎的编程语言之一Python语言。你和小编一起打卡了吗?
目录
1、位置实参
2、关键字实参
3、默认值
4、列表实参(传递原始列表)
5、使用切片传递列表副本实参
函数实参传递的方式有很多:位置实参(实参的顺序与形参顺序相同)、关键字实参(实参有变量名和值组成)、列表和字典。
1、位置实参
位置实参:基于Python函数调用中的每个实参的顺序关联到函数定义中的一个形参。即实参按照顺序对应传递给相应的形参。
1#!/usr/bin/env python
2# -*- coding:utf-8 -*-
3
4# 宠物信息显示函数
5def describe_pet(animal_type, pet_name):
6 """显示宠物的信息"""
7 print("\nI have a " + animal_type + ".")
8 print("My " + animal_type + "'s name is " + pet_name.title() + ".")
9
10# 函数调用
11describe_pet('dog', 'willie')
运行结果为:
上述代码中,实参‘dog’存储在形参animal_type中,实参‘Willie’存储在形参pet_name中。在函数体内使用这两个形参来显示宠物的信息。
位置实参调用函数时,实参的顺序非常重要,如果在运行中结果出乎意料,请检查函数调用中实参的顺序与函数定义中形参的顺序是否一致。
2、关键字实参
关键字实参:传递给函数的名称-值对,直接在实参中将名称和值关联起来。
还是上述宠物信息的例子,这里将使用关键字实参调用:
1#!/usr/bin/env python
2# -*- coding:utf-8 -*-
3
4def describe_pet(animal_type, pet_name):
5 """显示宠物的信息"""
6 print("\nI have a " + animal_type + ".")
7 print("My " + animal_type + "'s name is " + pet_name.title() + ".")
8
9# 调用不用顾及顺序
10describe_pet(pet_name='willie', animal_type='dog')
运行结果与上述一样:
3、默认值
编写函数时,可给每个形参指定默认值 。在调用函数中给形参提供了实参时,Python将使用指定的实参值;否则,将使用形参的默认值。
使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的实参。
上述宠物信息例子,将形参animal_type的默认值设置为'dog' 。这样,调用describe_pet()来描述小狗时,就可不提供这种信息:
1#!/usr/bin/env python
2# -*- coding:utf-8 -*-
3
4# 注意提供默认值的形参要放在后边
5def describe_pet(pet_name, animal_type='dog'):
6 """显示宠物的信息"""
7 print("\nI have a " + animal_type + ".")
8 print("My " + animal_type + "'s name is " + pet_name.title() + ".")
9
10describe_pet('willie')
运行结果:
4、列表实参(传递原始列表)
列表实参:传递列表名字。将列表传递给函数后,函数可对其进行修改,在函数中对这个列表所做的任何修改都是永久性的。
下边例子:一家为用户提交的设计制作3D打印模型的公司。需要打印的设计存储在一个列表中, 打印后移到另一个列表中。下面是在不使用函数的情况下模拟这个过程的代码:
1# 首先创建一个列表,其中包含一些要打印的设计
2unprinted_designs = ['iphone case', 'robot pendant', 'dodecahedron']
3completed_models = [] # 空列表,存储已打印的设计
4
5# 模拟打印每个设计, 直到没有未打印的设计为止
6# 打印每个设计后, 都将其移到列表completed_models中
7while unprinted_designs:
8 current_design = unprinted_designs.pop() # 未打印的设计从列表中删除(从末尾删除)
9
10 # 模拟根据设计制作3D打印模型的过程
11 print("Printing model: " + current_design)
12 completed_models.append(current_design)
13
14# 显示打印好的所有模型
15print("\nThe following models have been printed:")
16for completed_model in completed_models:
17 print(completed_model)
使用函数模拟这个过程的代码:
1#!/usr/bin/env python
2# -*- coding:utf-8 -*-
3
4def print_models(unprinted_designs, completed_models):
5 """模拟打印每个设计, 直到没有未打印的设计为止打印每个设计后, 都将其移到列表completed_models中"""
6 while unprinted_designs:
7 current_design = unprinted_designs.pop()
8 # 模拟根据设计制作3D打印模型的过程
9 print("Printing model: " + current_design)
10 completed_models.append(current_design)
11
12def show_completed_models(completed_models):
13 """显示打印好的所有模型"""
14 print("\nThe following models have been printed:")
15 for completed_model in completed_models:
16 print(completed_model)
17
18unprinted_designs = ['iphone case', 'robot pendant', 'dodecahedron'] # 未打印的设计列表
19completed_models = [] # 用来存储打印的设计的列表
20
21print_models(unprinted_designs, completed_models) # 调用打印设计的函数
22show_completed_models(completed_models) # 调用显示打印的函数
上述未使用函数与使用函数运行结果均为:
5、使用切片传递列表副本实参
有时候,可能需要保留原始列表的内容,如上述代码,需要保留原来未打印设计的列表,但因为上述代码将所有未设计都移除了列表unprinted_designs,这个列表变成了空列表。
如果需要保留原始列表,则需要向函数传递列表的副本而不是原件。这样,函数所做的任何修改都只影响副本。
使用切片传递列表副本:function_name(list_name[:])
上述代码保留原始未打印设计的列表,可以如下调用(传递列表副本):
1print_models(unprinted_designs[:], completed_models)
!!!注意:一般不要用此操作,因为让函数使用现成的列表可避免花时间和内存创建副本,从而提高效率。
热文回顾
亲身经历2019年校招8个大厂心得体会,纯干货分享(大疆、百度...)
2018年29篇必读机器学习论文总结,BERT, SeqGAN等上榜
斯坦福李飞飞高徒Johnson博士论文: 组成式计算机视觉智能(附195页PDF)
Yann Lecun大牛的自监督学习指南(附114页PPT全文下载)
【项目实践】:KNN实现手写数字识别(附Python详细代码及注释)
【伯克利博士论文】凸优化、组合优化与经济学结合解决最优化问题(附256页全文下载)