一、函数概论
1. 什么是函数
函数就是对实现特定功能代码的封装
2. 函数的分类
系统函数(内置函数):系统已经声明好的函数(类似已经造好的机器),程序员只要求会使用
例如print、input、sum、max、min、hex、len、id、type等
自定义函数:程序员自己声明的函数(自己造机器)
3. 声明函数
1)语法:
def 函数名(形参列表):
函数说明文档
函数体
2)说明:
def
:python中声明函数的关键字(固定写法)
函数名
:与对变量名的要求相同
()
: - 固定写法
形参列表
:以'变量名1, 变量名2, 变量名3,...'的形式存在,每个变量都是形参形参的个数根据情况可以没有,也可以有多个
形参的作用是将函数外面的数据传递到函数里面
函数说明文档
:用三个双引号引起来的字符串;作用是对函数的功能进行说明
函数体
:与def保持一个缩进的一行或多行语句;作用是实现函数的功能
3)初学者声明函数的步骤:
a. 确定函数的功能
b. 根据函数功能确定函数名
c. 确定函数的参数:根据实现函数的功能决定是否需要从外界传值
d. 实现函数的功能
e. 确定函数的返回值
注意(重要!!!)
:声明函数时不会执行函数体
# 写一个函数,求两个数的和并打印
def my_sum(num1, num2):
"""
求两个数的和
:param num1: 数字1
:param num2: 数字2
:return: num1 + num2
"""
while num2:
num1, num2 = num1 ^ num2, (num1 & num2) << 1
return num1
4. 函数调用的介绍
1)语法:
函数名(实参列表)
2)说明:
函数名
:已经声明过的函数名
()
:固定写法
实参列表
:以'值1, 值2, 值3,...'的形式存在每个值都是实参,实参是用来给形参赋值的
二、函数的调用
1. 函数调用过程
1)语法
函数名(实参列表)
2)调用函数的作用:执行函数体;获取返回值
3)函数调用过程:
第一步:跳转到函数声明的位置
第二步:传参用实参给形参赋值,保证每个形参都有值)
第三步:执行函数体
第四步:执行完函数体,确定返回值a. 执行完函数体:函数体对应的语句执行完;执行函数体的时候遇到return
b. 确定函数体:看函数执行结束的时候有没有遇到return,如果遇到return后面的值就是返回值,没有遇到返回值为None第五步:回到函数调用位置继续执行(这个时候函数调用表达式的值才是函数的返回值)
# 声明一个函数,求实现1 + 2 +3 +...+ N的和
def sum_n(n):
"""
实现1 + 2 +3 +...+ n的和
:param n: 累加最大值
:return: 1 + 2 +3 +...+ n的和
"""
return sum(i for i in range(1, n + 1))
# 声明一个函数,打印字符串中所有的字母字符
def get_alpha(strs):
"""
打印字符串中所有的字母字符
:param strs: 原字符串
:return: 字符串中的字母字符串
"""
return ''.join(char for char in strs if 'A' <= char <= 'Z' or 'a' <= char <= 'z')
# 声明一个函数,在指定的字符串的数字字符后都添加一个指定字符
# 'abc123', '*' --> 'abc1*2*3*'
# 'h2wo4end', '=' --> 'h2=wo4=end'
def append_to_digit(strs, sign):
"""
在指定的字符串的数字字符后都添加一个指定字符
:param strs: 原字符串
:param sign: 指定字符
:return: 处理后的字符串
"""
# new_str = ''
# for char in strs:
# if char.isdigit():
# new_str += char + sign
# else:
# new_str += char
# return new_str
return ''.join(char + sign if char.isdigit() else char for char in strs)
三、函数的实参和形参
1. 位置参数和关键字参数(针对实参)
1)位置参数:让实参和形参在位置上一一对应
第一个实参给第一个形参赋值,第二个实参给第二个形参赋值...
2)关键字参数:以'形参名=值'的形式传参
注意:
位置参数和关键字参数可以同时使用,但要求位置参数必须在关键字参数之前
3)什么时候使用关键字参数
需要跳过前面某几个参数,直接给后面某个参数赋值必须使用关键字参数
def func1(a, b, c):
print('a:{}, b:{}, c:{}'.format(a, b, c))
# 位置参数传参
func1(10, 20, 30) # a:10, b:20, c:30
# 关键字参数传参
func1(a=100, b=200, c=300) # a:100, b:200, c:300
func1(a=100, c=300, b=200) # a:100, b:200, c:300
# 位置参数和关键字参数同时使用
func1(10, c=30, b=20) # a:10, b:20, c:30
2. 参数默认值(形参)
声明函数时,形参可以设置默认值,有默认值的参数在函数调用时可以不用传参
一个函数可以给所有的参数都设置默认值,也可以给部分参数设置默认值
注意:
必须保证没有默认值的参数放在有默认值参数的前面
def func2(x=11, y=22, z=33):
print('x:{}, y:{}, z:{}'.format(x, y, z))
func2(100, 200, 300) # x:100, y:200, z:300
func2(100) # x:100, y:22, z:33
func2(100, 200) # x:100, y:200, z:33
func2() # x:11, y:22, z:33
func2(100, z=300) # x:100, y:22, z:300
3. 参数类型说明
1)给参数赋默认值,默认值的类型就是参数的类型
2)以'参数名: 类型名'的形式声明函数
4. 不定长参数
1)在形参前加*,那么这个参数就可以接收多个实参
带*的参数会作为一个元组,对应的多个实参是元组中的元素
2)在形参前加**,那么这个参数就可以接收多个实参
关键字参数,关键字随便命名
带**的参数会作为一个字典,对应的关键字参数的关键字作为key,实参作为value
def func6(x, y, *nums):
print(x, y, nums)
func6(1, 2, 3, 4, 5, 6, 7) # 1 2 (3, 4, 5, 6, 7)
def func7(**nums):
print(nums)
func7(a=1, b=2, x=4) # {'a': 1, 'b': 2, 'x': 4}
*args
和**kwargs
同时使用,是为了保证不定长参数传参的时候,既可以使用位置参数,也可以使用关键字参数
def func8(*args, **kwargs):
print(args, kwargs)
func8(1, 23) # (1, 23) {}
func8(a=2, c=90, k=34) # () {'a': 2, 'c': 90, 'k': 34}
func8(2, 4, x=2, y=89) # (2, 4) {'x': 2, 'y': 89}
补充:
*的用法:序列解包(取出列表/元组中的元素,字典取key值)
list1 = [98, 90, 89]
print(*list1) # 98 90 89
def func9(x, y):
print(x, y)
func9(1, 2)
list1 = [10, 20]
func9(*list1)
**的用法:字典解包(取出字典中的元素)
def func8(*args, **kwargs):
print(args, kwargs)
func8(**{'a': 1, 'b': 2}) # () {'a': 1, 'b': 2}
练习
# 声明一个函数,求多个数的差
# subtract(1, 2) --> -1 subtract(10, 2, 3) --> 5
def subtract(*nums):
if not nums:
return 0
return nums[0] - sum(nums[1:])
a = subtract(10, 20, 30)
print(a) # -40
四、函数的返回值
1. 什么是返回值
返回值就是return关键字后表达式的值(怎么确定函数的返回值)
返回值就是函数调用表达式的值(怎么获取函数的返回值)
python中所有函数都有返回值,默认是None
1)什么是return
return是函数体中的关键字(只能在函数中使用)
作用有两个:结束函数/确定函数返回值
a. 结束函数
def func1():
for x in range(10):
if x == 2:
return
print(x)
print('里面:函数结束')
# 0
# 1
func1()
b. 确定函数返回值:return 返回值(可以是具体的数据、声明过的变量、运算表达式等)
2)什么是函数调用表达式
函数调用语句就是函数调用表达式,例如:func1(10), max([1, 2])
每个函数调用的语句都有一个结果,这个结果就是这个函数执行后的结果
def func4():
return 100
print('func4:', func4()) # func4: 100
2. 怎么使用返回值
想要用函数的返回值,就使用函数调用表达式的值
普通数据能做的事情,函数调用表达式都可以做
list1 = [100, 200]
list2 = [func4(), 200]
print(list1, list2) # [100, 200] [100, 200]
print(100 > 200) # False
print(func4() > 200) # False
print(func4() * 2) # 200
3. 什么时候需要返回值
初学者:看实现函数的功能会不会产生新的数据
return 返回值1, 返回值2,...