目录
python从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129328397?spm=1001.2014.3001.5502
❤ 定义函数
1. 什么是函数
函数就是在大程序中,分离不同的任务,函数是模块化程序设计的基本组成单位,函数定义好后,可以反复使用,避免编写重复的代码。
2. 函数的优点
- 实现模块化程序设计
- 实现代码的复用
- 减少程序的复杂度
3. 函数的定义
- 将一件事情的步骤封装在一起并得到最终结果
- 函数名代表了这个函数要做的事情
- 函数体是实现函数功能的流程
- 函数可以帮助我们重复使用功能,通过函数名我们可以知道函数的作用
4. 函数的分类
1. 内置函数
内置函数就是Python中自带的函数,在程序中可以直接使用
例如: input() print() type() abs()等
2. 标准库函数
标准库函数是Python中自带的标准库函数,通过import导入后使用
例如: random() math() os() datetime()等
3. 第三方函数
Python社区提供的函数,需要下载,通过import导入后使用
例如: pymysql等
4. 自定义函数
根据用户需求,编写自己的函数
5. 函数的创建方法
通过关键字def来创建函数,def的作用是实现python中函数的创建
def 函数名(形参列表):
函数体
return 返回值
格式说明:
- def 表示定义函数的关键词
- 函数名遵循标识符规范
- 形参列表可以有0个或者多个参数,多个参数之间逗号分隔
- return表示返回的意思,将计算(处理)的结果返回,可以省略return
1. 无参无返回值函数
def add():
print('add()...')
2. 有参无返回值函数(重点)
def sub(a, b):
c = a + b
print('sub()...', c)
3. 无参有返回值函数
def mul():
x = 500
return x
4. 有参有返回值函数(重点)
def div(a, b):
c = a / b
return c
6. 调用函数
函数名(实参列表)
说明:调用无返回值函数,和参数无关
变量名 = 函数名(实参列表)
说明:调用有返回值函数,和参数无关
规则:哪里调用函数,结果返回哪里
add()
# def add() 无返回值函数
m1 = mul()
print(m1)
# def mul() 有返回值函数
sub(10, 20)
# def sub(a,b) 无返回值函数
d1 = div(100, 200)
print(d1)
# def div(a,b) 有返回值函数
输出:
add()...
500
sub()... 30
0.5
案列:
定义一个函数yuan,调用yuan函数,计算圆的面积
# 定义函数
def yuan(r):
ymj = 3.14 * r * r
return ymj
# 获取键盘输入的数据(R)
r = int(input('请输入圆的半径(R):'))
# 调用函数
ymj = yuan(r)
print('圆的面积是:', ymj)
输出:
请输入圆的半径(R):20
圆的面积是: 1256.0
7. return 与 print 的区别
概念上一个是 返回值 一个是打印输出
return 和 print的区别:
在执行函数的时候return无法打印出值,return返回的结果只能用于给变量赋值。而pirnt则可以直接打印。
return还有一个重要特性:在函数中,凡是遇到return,这个函数就会结束,这里要特别注意。针对无限循环的函数,可以使用return
8. 函数的参数
1. 必传参数
什么是必传参数?
在定义函数的时候,没有默认值且必须在函数执行的时候传递进去的参数;且顺序与参数顺序相同,这就是必传参数。
- 函数中定义的参数没有默认值,在调用函数时如果不传入则会报错
- 在定义函数的时候,参数后边没有等号与默认值
- 在定义函数的时候,没有默认值且必须在函数执行的时候传递进去的参数,且顺序与参数的顺序相同,就是必传参数
# coding:utf-8 def add(a,b): c=a+b return c result=add(1,2) print(result) # 输出结果:3
2. 默认参数
- 在定义函数的时候,定义的参数含有默认值,通过赋值语句给他是一个默认值
- 如果默认参数在调用函数的时候传递了新的值,函数将会优先使用后传入的值进行工作
# coding:utf-8 def add(a,b=1): c=a+b return c print(add(1)) # 输出结果:2 print(add(1,3)) # 输出结果:4
3. 不确定参数(可变参数)
- 没有固定的参数名和数量(不知道要传的参数名具体是什么)
def add(*args,**kwargs): ... add(1,2,3,name='dewei',age=23) # ↓ ↓ # 对应*args 对应**kwargs
- *args代表:将无参数的值合并成元组
- **kwargs代表:将有参数与默认值的赋值语句合并成字典
def test_args(*args,**kwargs):
print(args,type(args))
print(kwargs,type(kwargs))
test_args(1,2,3,4,5,6,name="zhangsan",age=22,top=175)
输出:
(1, 2, 3, 4, 5, 6) <class 'tuple'>
{'name': 'zhangsan', 'age': 22, 'top': 175} <class 'dict'>
#参数是变量传递时,需要在变量前面加上*和**来区分传递的是元组还是字典,否则一律按元组*args处理
def test_args(*args,**kwargs):
print(args,type(args))
print(kwargs,type(kwargs))
a=('python','java')
b={"name":"zhangsan","age":22,"top":175}
test_args(a,b)
# 输出结果:
# (('python', 'java'), {'name': 'zhangsan', 'age': 22, 'top': 175}) <class 'tuple'>
# {} <class 'dict'>
test_args(*a,**b)
# 输出结果:
# ('python', 'java') <class 'tuple'>
# {'name': 'zhangsan', 'age': 22, 'top': 175} <class 'dict'>
9. 参数规则
def add(a, b=1, *args, **kwargs)
-
参数的定义从左到右依次是
a - 必传参数
、b - 默认参数
、可变的 *args 参数
、可变的 **kwargs 参数
-
函数的参数传递非常有灵活性
-
必传参数与默认参数的传参也非常具有多样化
传递的参数与函数定义时的参数顺序不一致时,使用赋值语句的方式传参
def test(a,b=1,*args):
print(a,b,args)
s=(1,2)
test(1,2,*s) #1 2 (1, 2)
# test(a=1,b=2,*s)
'''
Traceback (most recent call last):
File "D:/WorkSpace/Python_Study/test01.py", line 8, in <module>
test(a=1,b=2,*s)
TypeError: test() got multiple values for argument 'a'
'''
# 报错原因:当我们必选参数、默认参数与可选的元组类型参数在一起的时候,如果需要采取赋值的形式传参,则在定义函数的时候需要将可变的元组参数放在第一位,之后是必传、默认参数;这是一个特例!!!
def test2(*args,a,b=1):
print(a,b,args)
test2(a=1,b=2,*s) #1 2 (1, 2)
def test(a,b=1,**kwargs):
print(a,b,kwargs)
test(1,2,name="zhangsan") # 1 2 {'name': 'zhangsan'}
test(a=1,b=2,name="zhangsan") # 1 2 {'name': 'zhangsan'}
test(name="zhangsan",age=33,b=2,a=1) # 1 2 {'name': 'zhangsan', 'age': 33}