Python 全栈开发:python函数基础
python函数
一、函数是什么?
定义:函数是将一组语句的集合通过一个名字(函数名)封装起来,要执行这个函数,只需要调用函数名即可。
特性:
1.减少重复代码
2.使程序变的易扩展
3.是程序变得易维护
二、函数的定义(语法)
def:定义函数的关键字
函数名:用来调用函数的(函数名的定义需具有一定描述性的含义,让人家大概能知道函数的作用是什么)
文档描述:函数的使用说明
代码块:实现功能的代码
return:函数的返回值
eg:
def 函数名(参数1,参数2......): ‘’‘ 文档描述 ’‘’
代码块1 代码块2 ...... return 值
计算两个数(a,b)的和
eg:
def my_sum(a,b): sum = a+b return sum
三、函数的调用
1.调用方式
res = 函数名(实参,实参)
根据函数名找到函数的内存地址,然后执行函数体代码
eg:调用上面定义的没有my_sum(a,b) 函数
# 计算x,y 的和 x = 10 y = 20 res = my_sum(x, y) print(res)
2.遵循的规则
先定义,后调用的原则
没事先定义函数直接调用,相当于在引用一个不存在的变量(报错:xxx is not define)
def foo(): print('调用了函数 foo()') bar() def bar(): print('调用了函数 bar()') # 调用函数 foo()
结果:
调用了函数 foo()
调用了函数 bar()
下面的这种调用方式:违反了先定义,后调用的原则,出现错误
def foo(): print('调用了函数 foo()') bar() # 调用函数 foo() def bar(): print('调用了函数 bar()')
错误:
NameError: name 'bar' is not defined
四、函数的返回值(return)
作用:退出函数,选择性的向调用方返回结果(即:返回值,默认返回值为 None)
返回值基本三种形式:
1.没有return,返回值 None
def func1(): print('这个函数的返回值为None')
2.return 一个值,返回该值本身
def func2(): print('这个函数的返回值为:你好啊') return '你好啊'
3.return 多个值,逗号分割,返回一个元组
def func3(): print('这个函数的返回值为(1,2,3,5,6)') return 1, 2, 3, 5, 6
五、函数的参数
1.形参和实参
形参(形式参数):在函数定义时,括号内定义的参数
实参(实际参数):在调用函数时,括号内传入的参数
注意:实参与形参只有在函数调用的时候才会绑定(即讲值传入函数内),在函数调用结束后就会立刻解除绑定
2.参数类型
位置参数,关键字参数,默认参数,可变参数
位置参数
什么是位置参数:就是根据顺序依次定义的函数
哪些是位置函数
1.位置形参:函数定义时,括号内按照位置依次定义的参数
2.位置实参:函数调用时,括号内按照位置依次传入的参数
def foo(x,y,z): print(x,y,z)
需要注意的是:调用函数时,位置实参要与位置形参一一对应
关键字参数
什么是关键字参数:在函数调用时,按照 key-value 形式定义的实参,称为关键字参数
eg:
def foo(x, y, z): print(x, y, z) foo(1, 2, 3) # 位置参数的调用方式 foo(x=1, y=2, z=3) # 关键字参数 foo(y=2, x=1, z=3) # 关键字参数
注意点:
通俗一点的说,就是指名道姓的给形式参数传值,即使不按照顺序定义实参,也能给形参传值
关键字参数与位置参数一起使用:
遵循的规则:
1.必须遵循形参的规则
2.不能为同一形参重复传值
3.位置参数必须放在关键字参数的前面
默认参数
什么是默认函数:在函数定义时,已经被赋值的形参,叫做默认参数
注意点:
1.在函数调用的时候,有默认值的形参,可以不给其传值
def register(name, age, sex='male'): # sex是默认参数 print(name, age, sex) register('fixd', 18, ) # 默认参数 没有传值 register('mike', 20, 'female') # 默认参数 传入一个新值
# 结果
# fixd 18 male # 没有传值,会使用默认值
# mike 20 female # 传入新值,会覆盖掉默认值
2.位置形参必须在默认参数的前面
eg: 下面这种是错误的
def register(sex='male',name, age, sex='male'): #错误,在pycharmdgdsfgasdf print(name, age, sex),
3.默认参数的值只在定义阶段赋值一次,也就是说默认参数的值再定义阶段就固定死了
m = 10 def foo(x, y=m): #函数定义时,默认赋值 print(x, y) m = '20' #测试 是否会影响函数的默认值 foo(1) foo(1, 11)
# 结果
# 1 10
# 1 11
4.默认参数的值应该设置为不可变类型
可变长参数
在实际函数调用时,我们经常会遇到,传入实参个数不确定的情况
应对这种情况,定义形参需要时用 *args,**kwargs 以用来接溢出的函数
(args 与 kwargs 是起的名字,本身没有什么特殊含义,也可以定义为其他 的名字)形参里包含*与**
* 会将溢出的位置实参全部接收,然后保存成元组的形式赋值给args
def foo(x,y,z,*args): #args=(4,5,6,7,8) print(x,y,z) print(args) foo(1,2,3,4,5,6,7,8,)
#结果:
1 2 3
(4, 5, 6, 7, 8)
** 会将溢出的关键字实参全部接收,然后保存成字典的形式赋值给kwargs
def foo(x,y,z,**kwargs): # kwargs={'c':3,'a':1,'b':2} print(x,y,z) print(kwargs) foo(x=1,y=2,z=3,a=1,b=2,c=3)
#结果:
1 2 3
{'a': 1, 'b': 2, 'c': 3}