文章目录
函数介绍
函数是一个可以重复使用的,可以实现某种功能的代码段。它可以重复调用就很方便,就像一个充电器一样,创造出了工具我们就可以用这个充电器对多个同样型号的手机进行充电。提高了代码的利用率。
我们平常使用的例如 print() 其实也是函数,只不过这是内置函数,人家定义好的,而我们需要创建的可以称之为自定义函数。
函数定义方法
要想使用函数,我们必须先定义一个函数。
定义一个函数格式如下代码所示:
def 函数名(参数列表):
函数体
return 返回值
def 是函数定义的关键字。
函数名是自己自定义的函数名。
括号里放的是参数,参数写在后面
冒号后的下一行需要缩进,缩进的就是函数体,也就是实现函数功能的代码。
return 定义函数返回的值。
先函数定义函数在调用函数,也就是函数定义放在前面。
定义函数的时候,不会判断代码的错误,只会判断语法的错误,代码错误会在函数
调用的时候显示。因为函数的代码在定义的时候不会执行。
函数名其实相当于是变量名指向的是内存中函数体代码所在的位置
函数的参数
函数根据需不需要参数分为有参函数
和无参函数
以及空函数
函数的参数分为形式参数和实际参数,简称形参和实参。
形参
形参即在定义函数时,括号内声明的参数。形参本质就是一个变量名,用来接收外
部传来的值。形参在命名的时候,也尽量要见名知意。
def index(a, b):
print(a, b)
index(1, 2)
函数中,a和b就是形参
位置形参
位置形参,也就是括号里从左往右排列的形参。
代码示例
def index(a, b):
print(a, b)
index(1, 2)
其中 a,b 为位置形参。
默认形参
默认形参就是在没有实参传入的情况下使用的值,也不会报错,若是有实参传入的情况下,实参会把默认形参代替。
代码示例
def index(name, country='中国'):
print(name, country)
index('XWenXiang')
按理来说,位置实参和位置形参数量必须一样啊?为什么传入了一个参数也能调用
呢?因为形参设置了默认值,如上代码,没有实参传入时,会使用默认值'中国',
如果有实参传入就会代替默认值。
这样的好处就是可以在大多数用户是同种情况时,可以减少实参的传入。以及一些
网站软件会帮我们默认一些选项。
'''
注意点,默认形参必须在位置形参后面,和位置实参在关键字实参后面一样会报
错。如下错误代码示例
'''
def index(country='中国', name):
print(name, country)
index('XWenXiang')
实参
实参就是传入函数的值,可以为变量、常量、表达式等等。
使用函数时候,实参会绑定函数中的形参,使用结束会解开绑定。
def index(a, b):
print(a, b)
index(1, 2)
调用函数时传入的 1和2 是实参。
调用有参函数不传入实参会报错。
位置实参
位置实参,也就是括号里从左往右排列的实参。
代码示例
def index(a, b):
print(a, b)
index(1, 2)
其中 1,2 为位置实参。
'''
位置实参在传给位置形参的时候,是以从左往右依次传入,多一个少一个参数都
不行。
'''
关键字实参
我们也可以指定某个形参接受实参,不受位置影响例如
代码示例
def index(a, b):
print(a, b)
index(b=3, a=2)
此时形参a为2,形参b为3
错误代码1:
def index(a, b):
print(a, b)
index(2, b=3, a=2)
若是调用函数如错误代码1一样,首先位置实参2会传给形参a,然后关键字实参会
传给形参b,而后面又有一个关键字实参想传给形参a,那么会报错,因为形参只能
接受一个实参。
错误代码2:
def index(a, b):
print(a, b)
index(b=3, 2)
如错误代码2一般会报错,因为位置实参不能在关键字实参的后面
错误代码3:
def index(a, b):
print(a, b)
index(3, a=2)
错误代码3报错的原因是先将位置实参3给了a,又通过关键字实参想给a赋值。
可变长参数
可变长参数主要用到了 *
与 **
号
形参中使用 * (元组)
从位置参数得知,位置实参和位置形参数量必须一致,否则会爆粗,如下会爆错
def index(a, b, c, d):
print(a, b, c, d)
index(1, 2, 3, 4, 5, 6, 7, 8, 9)
如果一定传入这么多实参的时候,我们就可以用 *变量名 来储存多余的'''位置
实参''',如下实例
def index(a, b, c, d, *e):
print(a, b, c, d)
print(e)
index(1, 2, 3, 4, 5, 6, 7, 8, 9)
输出结果:
1 2 3 4
(5, 6, 7, 8, 9)
在变量名的前面加一个 * 号后,这个变量就可以储存多余的位置实参,由输出结
果可以看到,加了 * 的变量储存实参的类型是'元组'
也可以理解为多余的实参组成'元组'赋值给*后的变量名
我们也可以直接用一个 *变量名 作为参数,这样就可以储存任意数量的位置参数
代码示例
def index(*args):
print(args)
index(1, 2, 3, 4, 5, 6, 7, 8, 9, 0)
形参中使用 ** (字典)
用*
来储存位置实参,同样的**
用来储存关键字实参
代码示例1
def index(**kwargs):
print(kwargs)
index(a=1, b=2, c=3)
输出结果
{'a': 1, 'b': 2, 'c': 3}
** 变量名 可以储存任意数量的关键字实参。我们可以看到输出的类型是'字典'
也就可以理解为,将任意数量的关键字实参用'字典'的形式传给 **后的变量名。
代码示例2
def index(**kwargs):
print(kwargs)
index(1, 2, a=1, b=2, c=3)
此时会报错,在关键字实参前面加位置实参,而函数形参只能接收关键字实参,位
置实参没法接收会报错。关键字实参后放位置实参就更不行了,因为关键字实参必
须在位置实参后面。
代码示例3
def index(a, b, **kwargs):
print(a, b, kwargs)
index(1, 2, c=1, d=2, e=3)
和代码示例2不同的是,多了俩个位置形参,位置实参1,2会传给位置形参a,b
多余的关键字实参会被储存到 kwargs 变量中
形参同时使用 * ,**
代码示例
def index(*args, **kwargs):
print(args, kwargs)
index(1, 2, 3, a=1, b=2, c=3)
在形参中同时使用 *,** 可以存放任意数量任意类型的实参。
不过位置参数还是要在关键字参数前面。
实参中使用 *
我们不仅在形参中可以使用 * 号,也可以在实参中使用。
'*号 可以将列表、元组甚至字符串打散,将里面的元素作为实参传入。'
代码示例1
def index(a, b):
print(a, b)
list_a = [0, 1]
index(*list_a)
输出结果
0 1
index(*list_a)等价于index(0, 1)
我们可以看成,列表被*拆开,里面的元素依次作为实参传入给形参,若是形参的
数量不够接收实参就会报错。
代码示例2
def index(a):
print(a)
list_a = [0, 1]
index(list_a)
输出结果
[0, 1]
比起代码示例1,没有了 * 号,列表会被当作一个元素传入给形参,为了不报错,
我把形参b给删了。
代码示例3
如果列表的元素很多,形参不够用时,我们可以在形参上也加上 * 号
def index(a, *b):
print(a, b)
list_a = [0, 1, 2, 3, 4, 5]
index(*list_a)
输出结果
0 (1, 2, 3, 4, 5)
* 号将列表里的元素依次作为位置实参传入,但示例3中只有一个位置形参a接收
了位置实参,剩下的位置实参被以元组的形式储存在变量b中。
如果示例3中去掉 * 号,结果是 [0, 1, 2, 3, 4, 5] () 。被当成一个位置
实参传入。
实参中使用 **
在实参中使用 ** 有些不同。**会把'字典'打散成'关键字实参'依次传入。
代码示例
def index(name, age, hobby):
print(name, age, 'like', hobby)
dict_a = {'name': 'XWenXiang', 'age': 18, 'hobby': 'girl'}
index(**dict_a)
输出结果
XWenXiang 18 like girl
index(**dict_a)其实也就等价于下面的样子
index(name='XWenXiang', age=18, hobby='girl')
当然关键字传入时,形参和实参数量要一样,因为上面代码没有设置默认值。
函数的返回值
函数的返回值就是函数在调用完返回的结果。
1.返回的语句是 return 后面跟要返回的值,跟了什么值返回什么值。
2.函数没有 return 语句或者 return语句后没有值,那么返回的是 none 。
3.函数体语句遇到 return 就会结束函数运行,相当于循环代码的 break 。
代码示例
def index(x):
return len(x)
index('abcdef')
此时是没有打印结果的,上面函数返回的值是实参的长度,而现在没有打印所以没
结果。
我们将函数的返回值赋值给变量或者直接打印就能看到返回的值了。
def index(x):
return len(x)
y = index('abcdef')
print(y)
函数的返回值给了变量y,然后进行打印。
return 后面也可以跟多个值
代码示例
def index(x):
return len(x), 666
y = index('abcdef')
print(y)
输出结果
(6, 666)
'此时返回的是多个值,不过要注意的是,返回的值会以元组的形式储存。'