一、函数定义
1、作用:
- 提高代码的复用率。
- 提高代码维护的效率。
2、函数定义格式
def 函数名(参数列表):
函数体
3、特殊函数
'''
pass语句通常可以用来作为占位符,表示什么操作都不执行。
在项目起始阶段,如果还没想好函数具体实现时,可以先放置一个pass语句,让代码先成功运行起来。
待项目框架搭建完毕后,再进行相应的具体实现。
'''
def nop():
pass
4、形参&实参
- 函数定义时用的是形参。
- 调用函数时用的是实参。
5、函数的返回值
- 函数都有返回值,甚至可以有多个返回值,默认返回None。
- 返回值和接收变量的对应关系,是按照顺序一一对应的。
二、函数分类
1、内置函数
- Python语言中自带的函数。
- 可以把函数名赋给一个变量,使用该变量名调用此函数。
2、第三方函数
- 除内置函数外的其他类型函数。
3、自定义函数
- 开发者根据实际需要自定义的函数。
三、函数参数
1、参数种类
- 可变类型
- 函数内部对传入参数的修改会影响到外部变量。
- 列表、字典、集合等。
- 不可变类型
- 函数内部对传入参数的修改不会影响到外部变量。
- 数字、字符串、元组等。
2、位置参数
- 每个实参都关联到函数的相应形参。
3、默认参数
- 编写函数时,可给每个形参指定默认值。
- 调用函数时,如果给形参提供了实参,就使用指定的实参值;否则将使用形参的默认值。
- 给形参指定默认值后,可在函数调用中省略相应的实参。
- 设置默认参数时,必选参数在前,默认参数在后。
- 默认参数必须指向不可变对象,否则会出现错误
def test_add(a=[]):
a.append('END')
return a
print(test_add([1, 2, 3]))
print(test_add(['a', 'b', 'c']))
print(test_add())
print(test_add())
print(test_add())
结果:
'''
函数在定义的时候,默认参数H的值就被计算出来了,即[]。
因为默认参数H也是一个变量,它指向对象[]。
每次调用该函数,如果改变了H的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。
'''
[1, 2, 3, 'END']
['a', 'b', 'c', 'END']
['END']
['END', 'END']
['END', 'END', 'END']
4、不定长参数(可变参数)
- 调用时,需要先组装出一个list或tuple
- 在函数参数前面添加“*”号把该参数定义为不定长参数
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n
return sum
print(calc(1, 2, 3, 4))
print(calc())
num = [1, 2, 3]
print(calc(*num))
5、关键字参数
- 传递参数时使用“名称–值”对的方式,在实参中将名称和值关联起来。
- 关键字参数有扩展函数的功能。
- *表示不定长参数 **表示不定长的关键字参数。
6、命名关键字参数
- 要限制关键字参数的名字,可以用命名关键字参数。
- 如果没有可变参数,命名关键字参数必须加一个“”作为特殊分隔符。
- 缺少“”,Python语言解释器将无法识别位置参数和命名关键字参数。
def enroll(name, gender, *, age, city):
print(name, gender, age, city)
enroll('Jack', 'M', age='18', city='Beijing')
#结果
Jack M 18 Beijing
------------------------
#报错
def enroll(name, gender, *grade, age, city):
print(name, gender, age, city)
enroll('Jack', 'M', '18', 'Beijing')
7、参数组合
- 定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
四、函数式编程
1、高阶函数
- 接受函数为参数,或者把函数作为结果返回的函数。
2、匿名函数
不再使用def语句这样标准形式定义的函数。
lambda [arg1[,arg2],....argn]]:expression
例子:
sum = lambda arg1, arg2: arg1 + arg2
print(sum(1, 2)) # 结果是:3