Fork me on GitHub

函数

函数

函数的本质:对功能性代码的封装

函数的优点:

  • 1、简化了代码结构
  • 2、增加了代码的复用度(重复使用程度)
  • 3、如果想要修改某些功能或调试某些功能,只需要修改相应的函数即可,不用修改整个项目

格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def 函数名(参数列表):
    函数体语句
    return 表达式
    
1、def:定义函数的关键字,函数的代码块以def关键字开始
2、函数名:该函数在调用时的名称,命名的规则遵循标识符的命名规则
3、():参数列表的开始与结束,如果没有参数,小括号不能省略
4、参数列表:格式:(参数1,参数2...., 参数n) 传入函数的参数用逗号隔开,
改参数在函数定义中叫做形参(形式参数),类似变量名
5、: :函数体中的内容以冒号开始,四位缩进
6、函数体语句:该函数封装的功能模块
7、return:一般用于函数的结束,将信息返回给函数的调用者
8、表达式:即将返回给函数调用者的信息
注:函数组后 return 表达式可以省略,默认为 return None
注:函数仅定义,未调用时,该函数不会被执行

函数的参数

实参与形参

  • 实参:函数在调用时,传递给函数的形参的数据
  • 形参:函数定义时小括号中的变量

关键字参数

参数的关键字:在函数调用的传参过程中将形参的名称写在赋值符号之前,将值写在赋值符号之后

优点:

  • 1、明确实参对应的形参
  • 2、允许函数调用时实参的顺序与函数定义时形参的顺序不一致,但赋值对象不会错乱

注:若给函数传参时未使用关键字参数,需按照函数定义时形参的顺序传参

举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 定义函数
def test0(name, age, sex):
	print(name, age, sex)
    
# 调用函数
# 普通方式传参
# 按顺序换传参
test0('小明', '18', '男')    # 输出结果: 小明, 18, 男
# 不按顺序传参
test0('男', '小明', '18')    # 输出结果:男, 小明, 18

# 关键字参数方式传参
test0(sex='男', nane='小明', age='18')   # 输出结果: 小明, 18, 男

参数的默认值

默认参数: 在函数定义时,直接给形参赋予初始值。

如果函数在定义时,形参有初始值,函数如果在调用传入了实参,使用传入的数据,如果未传入实参,使用默认的初始值

注:如果函数的参数存在默认值,那么将带有默认值的参数放到参数列表的最后面

例子:

1
2
3
4
5
6
def getName(name='小明'):
	print(name)
	
# 调用函数
getName()     # 输出结果: 小明
getname('小红')  # 输出结果: 小红

不定长参数

不定长参数: 能够在函数内部处理比形参个数多的实参

*args
1
加了*的变量,可以存放多个实参,数据类型为元组类型,如果调用时未传入参数,默认为一个空元组,如果传入了实参,将按传入顺序,依次放到元组中

举例:

1
2
3
4
5
def func1(*args):
	print(args)

# 调用函数:
func1(1, 2, 3, 4)    # 输出结果: (1, 2, 3, 4)

参数包括不定长参数及普通参数:

1
2
3
4
5
def func2(a, b, *args):
	print(a, b, args)
	
# 调用函数
func2(1, 2, 3, 4, 5)   # 输出结果: 1, 2, (3, 4, 5)

注:定义函数时,当不定长参数在前面,函数调用需要使用关键字格式

1
2
3
4
5
def fun3(*args, num1):
    print(num1, args)
    
# 调用函数
fun4(1, 2, 3, 4, num1=2)   # 输出结果: 2, (1, 2, 3, 4)
**kwargs
1
加了**的变量,可以存放多个实参,数据类型为字典类型,如果调用时未传入参数,默认为一个空字典,如果传入了实参,将按传入顺序,依次放到字典中

举例:

1
2
3
4
5
def func1(**kwargs):
    print(kwargs)
    
# 调用函数
func1(name='王小明', age='18')   # 输出结果: {'name': '王小明', 'age': '18'}

注:

  • 函数调用传入参数 key = value
  • 当调用时如果全部使用关键字参数形式,会将普通形参按关键字赋值,其他找不到普通形参的关键字,默认放到**kwargs中

函数的返回值

1
2
3
4
5
6
7
8
return:将表达式返回给函数的调用者,表达式为什么数据类型,目前函数就可以认为是什么类型,函数的调用者就是什么类型

当函数执行到return时,代表函数执行结束,return后面的代码不再执行
return的作用:1、可以用作函数的返回值
             2、可以用来终止函数
             
             
return可以省略,若省略,则默认为return None

匿名函数

1
2
3
4
5
6
7
8
9
10
匿名函数
不使用def关键字定义用lambda关键字来创建
语法格式 lambda 参数1参数2...参数n表达式
表达式只能是一条简单的语句不能包含循环returnyield等允许包含最简
单if语句如果表达式为原子类型使用小括号括起来


lambda特点
1lambda只是一个一条语句的表达式整个函数体语句比def简单很多
2lambda本质为表达式只能封装最简单的逻辑

举例:

1
2
3
4
5
# 定义函数
func1 = lambda num1 : num += 1

# 调用函数
print(func1(4))    # 输出结果: 5

偏函数

偏函数: 偏函数用法是指创建一个调用另一个部分——参数或变量已经预置的的函数——的函数的用法。

举例:

1
2
3
4
5
6
7
8
9
10
# 导入模块functools
# 使用functools.partial  创建偏函数
# 语法格式:
# functiontools.partial(即将使用或更改的原函数名称,原函数各个参数的值)

import functiontools
myint = functiontools.partial(int, base=2)

print(int('2'))        # 输出结果: 2
print(myint('2'))      # 输出结果: 10