首页 > 代码库 > 24-函数

24-函数

函数是Python为了代码最大程度的重用和最小化代码冗余而提供的最基本的程序结构。
 
  1. 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
  2. 面向对象:对函数进行分类和封装,让开发“更快更好更强...”
 
函数式编程最重要的是增强代码的重用性和可读性。
 
定义函数:
 
1 def 函数名(参数):      
2     ...
3     函数体
4     ...
5     返回值

 

  • def:表示函数的关键字
  • 函数名:函数的名称,日后根据函数名调用函数
  • 参数:为函数体提供数据
  • 函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等...
  • 返回值:当函数执行完毕后,可以给调用者返回数据。

返回值:

 

函数的返回值需要使用到return这个关键字,返回值主要是用来接受函数的执行结果。

 

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 def email():
 4     a = 360
 5     b = 11
 6     c = a + b
 7     return c
 8 
 9 #执行 email() 这个函数 并把 返回值 赋值给 ret
10 ret = email()
11 print(ret)

 

运行结果:

 

技术分享

 

return后面没有返回值时,那么将会返回默认参数None。None是Python中的一个特别的数据类型,用来表示什么都没有。
 
return可以返回多个值,以逗号分隔。相当于返回一个tuple(元组)。
 
在函数中,当return执行完成之后,return后面的代码将不会被执行。
 
1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 def email():
4     print(123)
5     return 789
6     print(456)
7 ret = email()
8 print(ret)

 

运行结果:

 

技术分享

 

参数:

 

1、普通参数:

 

技术分享
1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 
4 # mail 叫做函数 ret 的形式参数,简称形参
5 def ret(mail):
6     print(mail)
7 
8 # "baidu" 叫做函数 ret 的实际参数,简称实参
9 ret("baidu")
普通参数

 

运行结果:

 

技术分享

 

2、默认参数:
 
如果在创建函数的时候给函数定义了参数,那么在调用函数的时候如果不填写参数就会报错。
 
1 #!/usr/bin/env python
2 # -*- coding:utf-8
3 
4 def ret(a,b):
5     print(a)
6     print(b)
7 
8 ret(11)

 

运行结果:

 

技术分享

 

在定义函数可以给参数指定一个默认值,如果该参数没有值传递,将使用默认值。

 

1 #!/usr/bin/env python
2 # -*- coding:utf-8
3 
4 def ret(a,b=22):
5     print(a)
6     print(b)
7 ret(11)

 

运行结果:

 

技术分享

 

如果该参数有值传递,将覆盖掉默认值。

 

1 #!/usr/bin/env python
2 # -*- coding:utf-8
3 
4 def ret(a,b=22):
5     print(a)
6     print(b)
7 ret(11,33)

 

运行结果:

 

技术分享

 

有默认值的参数必须在最后面定义,不能在没有默认值参数的前面。

 

3、指定参数 :
 

默认情况传递参数时,是按照顺序来的,如果指定参数,就不需要按照顺序来了。

 

1 #!/usr/bin/env python
2 # -*- coding:utf-8
3 
4 def ret(a,b,c):
5     print(a)
6     print(b)
7     print(c)
8 ret(b=2,c=3,a=1)

 

运行结果:

 

技术分享

 

4、动态参数:

 

第一种动态参数:

 

定义第一种动态参数需要在参数前面加上一个 * 号,把接收过来的实际参数当作一个元组,每一个参数都是元组中的一个元素。

 

1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 def ret(*args):
4     print(args)
5     print(type(args))
6 ret(11,22,33,44)

 

运行结果:

 

技术分享

 

第二种动态参数 :
 
定义第二种动态参数需要在参数前面加上两个*号,,把接收过来的实际参数当作一个字典,实际参数相当于是字典的键值对。
 
1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 def ret(**kwargs):
4     print(kwargs)
5     print(type(kwargs))
6 
7 ret(k1=123,k2=456)

 

运行结果:

 

技术分享

 

第三种动态参数 :
 
第一种动态参数和第二种动态参数结合使用,定义参数时,需要按照前后顺序,一个 * 的在前,两个 * 的在后。
 
1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 def ret(*args,**kwargs):
4     print(args,type(args))
5     print(kwargs,type(kwargs))
6 
7 ret(11,22,33,k1=123,k2=456)

 

运行结果:

 

技术分享

 

问题:

 

如果实际参数本身就是元组和字典,那么将会发生什么?

 

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 def ret(*args,**kwargs):
 4     print(args)
 5     print(kwargs)
 6 
 7 tu = (11,22,33)
 8 dic = {"k1":123,"k2":456}
 9 
10 # tu 和 dic 都存到了 agrs 里
11 ret(tu,dic)
12 
13 print("--------" * 8)
14 
15 # tu 存到 args 里, dic 存到 kwargs 里。
16 ret(*tu,**dic)

 

运行结果:

 

技术分享

 

5、参数解包:
 
* 和**,也可以执行函数时使用,即为参数解包。参数解包就是实际参数为元组时,让元组中的每一个元素对应一个形式参数。
 
 1 #!/usr/bin/env python 
 2 # -*- coding:utf-8 -*-
 3 def ret(a,b,c):
 4     print(a)
 5     print(b)
 6     print(c)
 7 
 8 t1 = (11,22,33)
 9 
10 #将 t1 拆分成三个元素,分别传递给a,b,c
11 ret(*t1)

 

运行结果:
 
技术分享

 

也存在对字典的参数解包,如下:

 

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 def ret(a,b,c):
 4     print(a)
 5     print(b)
 6     print(c)
 7 
 8 dic = {"a":11,"b":22,"c":33}
 9 
10 ret(**dic)

 

运行结果:

 

技术分享

 

使用动态参数实现字符串格式化:
 
在字符串格式化的时候用到了动态参数,format(self, *args, **kwargs)方法。
 
一个 * 的:
 
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 s1 = "{0} is {1}"
 4 ret = s1.format(11,22)
 5 print(ret)
 6 
 7 print("------" * 8)
 8 
 9 s2 = "{0} is {1}"
10 li = [33,44]
11 ret1 = s2.format(*li)
12 print(ret1)

 

运行结果:

 

技术分享

 

两个 * 的:

 

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 s1 = "{name} is {age}"
 4 ret = s1.format(name="baidu",age=18)
 5 print(ret)
 6 
 7 print("------" * 8)
 8 
 9 s2 = "{name} is {age}"
10 dic = {"name":"baidu","age":18}
11 ret1 = s2.format(**dic)
12 print(ret1)

 

运行结果:

 

技术分享

 

lambda表达式 :

 

lambda表达式就是简单函数简便的表示方式。

在语法上,只能有一个单独的表达式,不用写return,返回值就是该表达式的结果。

 

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 #普通函数
 4 
 5 def ret(a,b):
 6     return a+b
 7 ret1 = ret(9,1)
 8 print(ret1)
 9 
10 print("-------" * 8)
11 
12 #lambda表达式
13 
14 ret = lambda a,b:a+b
15 ret2 = ret(9,1)
16 print(ret2)

 

运行结果:

 

技术分享

 

24-函数