一、Python中最简单的函数介绍
1、定义格式
def 函数名():
代码
关键词:def关键字、冒号、代码缩进行表示属于该函数界内
2、调用方法
函数名()
关键词:不缩进,直接函数名即可调用
3、文档说明
def 函数名():
"该区域是对该函数的说明"
代码
函数的说明文档调用方式:help(函数名)就会打印出上一段文字来简单介绍该函数。
二、函数的三大要素之函数参数
1、形参逐个列出,实参逐个按序传入实数
函数定义:
def sum(a, b):
c = a+b
print c
函数调用:
print(sum(1,2))
2、形参逐个列出,实参用形参名传入实数
#! /usr/bin/python3
def sum(a,b):
c = a+b
return c
print(sum(a=2,b=3))
print(sum(b=2,a=1))
#print(sum(a=2,3)) #error
#print(sum(b=3,1)) #error
关键词:这种情况下可以乱序,但是即使按顺序时候也要带上全部形参名
3、形参逐个后面含有默认值,实参个数可能少于形参,传入实数
print(sum(1,3))
print(sum(2))
print(sum(a=2))
print(sum(a=2,b=3))
print(sum(b=3,a=1))
#print(sum(3,a=1)) #error
关键词:定义阶段有默认值的参数务必放在后面,调用阶段有默认值的实参可以不传
4、形参不定长,实参个数可以调用时候决定,传入实数
#! /usr/bin/python3
def fun(a, b, *args, **kwargs):
print(a)
print(b)
print(args)
print("kwargs: ")
for key, value in kwargs.items():
print(key, value)
c=(3,4,5)
d={'m':6,'n':7}
#fun() #error
#fun(1)#error
fun(1,2)
print('============')
fun(1,2,3)
print('============')
fun(1,2,m=3,n=4)
print('============')
fun(1,2,3,m=4,n=5)
print('============')
#fun(1,2,a=3,b=4,m=5,n=6)#error
#fun(a=1,b=2,3,4,m=5,n=6)#error
fun(1,2,*c,**d)
fun(1,1,c,d)
运行结果:
1
2
()
kwargs:
============
1
2
(3,)
kwargs:
============
1
2
()
kwargs:
n 4
m 3
============
1
2
(3,)
kwargs:
n 5
m 4
============
1
2
(3, 4, 5)
kwargs:
n 7
m 6
1
1
((3, 4, 5), {'n': 7, 'm': 6})
kwargs:
关键词:至少要包含普通的实参,而且不可乱序(带形参,带默认值)。可以没有元组或者字典参数。元组和字典有两种形式实参。注意倒数两次调用的区别,实参要使用* 和** 不然出现逻辑错误
5、引用传参,实参为变量(类比C/C++中的地址传递和值传递)
直接上结论:
- 对于可变类型:使用函数内使用+=的情况下,实参的之会被改变。
- 对于不可变类型:实参的值无论如何也不会改变。
关键词1:a = a+a与 a+=a的区别,尤其是该语句放在函数内部时候。
关键词2:a = 可变类型b与a=不可变类型b的区别:后期b改变时候a变不变,前者变,后者不变
关键词3:可变类型:列表,字典;
不可变类型:数值类型,字符串,元组
参考:https://www.cnblogs.com/wxcx/p/12547997.html
三、函数三大要素之返回值
1、返回一个值
def sum(a, b):
return a+b
2、可返回多个值
def divid(a, b):
shang = a//b
yushu = a%b
return shang, yushu
sh, yu = divid(5, 2)
关键词:本质是用了元组
四、函数三大要素之局部变量及其与全局变量的关系
1、局部变量
- 局部变量,就是在函数内部定义的变量
- 不同的函数,可以定义相同的名字的局部变量,但是各用个的不会产生影响
- 局部变量的作用,为了临时保存数据需要在函数中定义变量来进行存储,这就是它的作用
2、全局变量与局部变量
变量定义在函数外,既能在一个函数中使用,也能在其他的函数中使用,这样的变量是全局变量
- 函数内局部变量和全局变量重名,是局部变量起效
- 想在函数内修改不可变类型的全局变量,使用关键字local,不然函数报错无法将全局变量指向新的数据(可变类型的全局变量在函数内修改不用使用local)
- 可变类型的局部变量和全局变量同名时候需特别注意!!
可参考:https://blog.csdn.net/bigxuyang/article/details/77877935?utm_source=blogxgwz4,可在它基础上继续实验test2 = [1,2] def F(a): a = a+a print(a) F(test2) print(test2),进一步理解!!
五、特殊类型的函数之递归函数
- 如果一个函数在内部不调用其它的函数,而是自己本身的话,这个函数就是递归函数。
- 要防止锁死,无法结束
六、特殊类型的函数之匿名函数
用lambda关键词能创建小型匿名函数。这种函数得名于省略了用def声明函数的标准步骤。
1、匿名函数的定义语法:
lambda函数的语法只包含一个语句,如下:
lambda [arg1 [,arg2,.....argn]]:expression
2.匿名函数的使用场合
- 作为参数传递
- 作为简单的计算
参考:https://blog.csdn.net/u012308586/article/details/105063731,一般不建议太多使用匿名函数
七、总结可变类型和不可变类型的区别
- 全局与局部变量时候的不同:关键词local需不需要的区别
- 平常相互等号赋值之后,其中一个改变,两者行为的区别。
- 可变参数 a+=a 与 a = a +a的区别,放在函数内尤其明显。