每日分享
Nothing can dim the light which shines from within.
从内心发出的光,没什么能使它黯淡。
小闫语录:
心若向阳,处处阳光,加油,阳光少年。
前言
昨天的文章『每天 3 分钟,小闫带你学 Python(十八)』讲解了 Python 中的一些公共方法:
1.运算符 +/*/in/not in
2.Python 内置函数: len/max/min/del
3.多维列表/元组的访问
今天继续讲解新知识 ~
学习目标
1.了解什么是函数,为什么使用函数。
2.熟悉函数如何定义与调用。
3.了解如何添加函数的文档说明。
4.了解函数的参数以及返回值。
1.函数
1.1 函数引入介绍
今天开始进入全新的章节 -- 函数。先举一个小栗子,如果要写一段代码打印自己的名片:
==========我的名片==========
姓名:小闫同学
QQ:535652072
手机号:1314xxxx225
学校地址:北京市海淀区清华大学
===========================
那么我们需要像下面这样写很多输出语句:
print('==========我的名片==========') print('姓名: 小闫同学') print('QQ:535652072') print('手机号:1314xxxx225') print('学校地址:北京市海淀区清华大学') print('===========================')
目前未发现问题,但现在有一个需求:多次打印此名片。怎么办?你可能会说:这个好办,复制粘贴。如果需要打印 1000 次呢?累死你!函数就可以完美的解决此问题。
def print_business_card(): print('==========我的名片==========') print('姓名: 小闫同学') print('QQ:535652072') print('手机号:1314xxxx225') print('学校地址:北京市海淀区清华大学') print('===========================')
先不要考虑如何写函数,只需要了解它就是函数,下面会继续讲到。
我们打印 1000 次可以进行如下操作:
for i in range(1000): print_business_card()
两行代码解决了你复制粘贴 1000 次的问题。
函数便是相关功能的封装,可以提高代码的复用性。
1.2 函数的定义和调用
函数的基本格式如下:
def函数名():
执行的功能
注意函数内部代码(执行的功能)需要缩进,保证其在函数内部。
那么如何调用呢?
函数名()
注意函数名后要加小括号进行调用。每次调用,函数内部的代码都会从上往下依次执行,直到执行完毕或者遇到
return
(如果函数有返回值,return
可以返回单词后方的内容,return
下方的代码不再执行)。def 函数名(): ... return "我是返回的内容" # 下方的内容不再执行 ...
1.3 函数的文档说明
函数的文档说明在函数名下方,执行代码上方位置,是一个字符串。它的作用便是让人们更好的了解此函数的功能。使用 help()
函数查看函数时,会返回文档说明。先来看文档说明的形式:
def function(): """ 我是说明文档,此函数为示例内容 :return: 返回自定义变量 name """ name = 'EthanYan' return 'EthanYan'
上方便是一个简单的函数,有说明文档,也有返回值。调用函数时我们需要使用变量进行接收返回值:
name = function()
如果查看说明文档,可以使用函数 help
(此函数是内置函数,不需要导入任何模块,直接使用即可):
help(function)
输出结果如下:
Help on function function in module __main__: function() 我是说明文档,此函数为示例内容 :return: 返回自定义变量 name
:return:
代表返回值说明,可有可无,视情况而定。
Tip:在 PyCharm 中,有个快捷操作,即在函数内部第一行(缩进后)输入三引号,然后在三引号中间按回车键即可快速生成说明文档格式。如下图:
1.4 函数参数
1.4.1 定义带有参数的函数
带有参数的函数即定义函数时,在函数后面的小括号中传入参数名称,此参数(变量)可以在函数内部进行使用。
def函数名(参数名):
使用参数进行相关操作
之前定义的函数只能输出相同的结果,比较死板。现在有一个需求:封装一个函数,实现输出欢迎语句的功能。姓名需要在调用的时候才能确定,该如何设计?可以使用带有参数的函数,如下:
def function(name): print('欢迎 %s先生 莅临寒舍~' % name[0])
函数括号内的变量称为
形参
。在函数内部可以使用传入的参数(变量),进行特定的操作。
带有参数的函数具有灵活性、通用性。可以大大提高开发效率,减少重复代码。
1.4.2 调用带有参数的函数
调用函数 function
时,可以通过下面的方式:
function('闫同学')
括号内传入要填的参数即可。在调用时我们传入的参数称为
实参
。
形参和实参的区别:
形参是定义函数时传入的参数,因为此参数不确定内容,只是一个形式,所以叫做形参。
实参是调用函数时传入的参数,因为传入的参数内容确定,是实际数据,所以叫做实参。
注意:定义的函数有几个形参,我们调用函数时,就需要传入几个实参。
1.4.3 缺省参数
缺省参数就是有可能在调用函数时缺少的参数。形式如下:
def函数名(参数1,缺省参数=某个值):
使用参数1和缺省参数执行特定的功能
根据缺省参数的形式
缺省参数=某个值
可以明显猜出其实缺省参数就是设置了默认值的参数(形参)。
比如一个函数中需要传入年龄和姓名,根据实际情况,大部分人员都是 20 岁,为了减少输入,可以将其设置为缺省参数(即设置默认值)。
>>> def function(name, age=20): ... print('%s 的年龄为 %d' % (name, age)) ... >>> function('小闫同学') 小闫同学 的年龄为 20 >>> function('小闫同学', 18) 小闫同学 的年龄为 18
上述代码可以得知,设置缺省参数后,如果不传入缺省参数的值,那么使用默认值;如果传入缺省参数的值,则会使用传入的值。
1.4.4 不定长参数
顾名思义,不定长参数指不确定传入参数的个数。
有时可能需要一个函数能处理比当初声明时更多的参数, 这些参数叫做不定长参数,声明时不会命名。
基本语法规则如下:
def functionname([formal_args,] *args, **kwargs): """函数_文档字符串""" function_suite return [expression]
1.加了星号( *
)的变量 args 会存放所有未命名的变量参数,args 为元组
2.而加 **
的变量 kwargs 会存放命名参数,即形如 key=value 的参数, kwargs 为字典。
举例说明:
def function(a, *args, **kwargs): """可变参数演示示例""" print("a =%d" % a) print("args:", end=' ') print(args) print("kwargs:") for key, value in kwargs.items(): print("key=%s" % key) print("value=%s" % value) function(1,2,3,4,name='Ethan',age=19)
如上代码执行结果为:
a =1 args: (2, 3, 4) kwargs: key=name value=Ethan key=age value=19
调用函数时,传入 n
个参数,这些参数会根据形参(定义函数时括号内的参数)进行分配。第一个参数给了已经命名的形参 a
,后面的参数分配给了不定长参数。未命名的实参组成一个元组赋值给 args
,而命名的键值对形式参数则赋值给 kwargs
。
此处结合示例多思考一下。
规则:调用函数时传入的实参按顺序优先分配给命名形参,其余未命名参数组成元组分配给
args
,键值对则分配给kwargs
。
1.4.5 注意
1.缺省参数必须放在 *args
后面。
2.如果有 **kwargs
的话, **kwargs
必须放在最后。
下方示例:
def example(a,*args, b=66, c=99,**kwargs):
......
2.作业
1.自定义函数,执行打印名片的功能(要求可以根据传入的名字和公司等信息自动生成指定格式的名片)。
提示:函数传入参数
2.给自定义的函数添加文档说明。
3.发散思维,利用代码练习缺省参数和不定长参数,将疑惑的地方多进行尝试,直至理解。