带你自学Python系列(十二):Python函数的用法(二)

↑ 点击上方【计算机视觉联盟】关注我们

今天是小编持续更新关于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个大厂心得体会,纯干货分享(大疆、百度...)

速收藏!最强数据集50个最佳机器学习公共数据!

深度学习开源数据集大全

2018年29篇必读机器学习论文总结,BERT, SeqGAN等上榜

斯坦福李飞飞高徒Johnson博士论文: 组成式计算机视觉智能(附195页PDF)

带你详细了解机器视觉竞赛—ILSVRC竞赛

2018年度最强的30个机器学习项目!

Yann Lecun大牛的自监督学习指南(附114页PPT全文下载)

【项目实践】:KNN实现手写数字识别(附Python详细代码及注释)

《动手学深度学习》中文版PDF和视频免费领!!!

【伯克利博士论文】凸优化、组合优化与经济学结合解决最优化问题(附256页全文下载)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值