#函数function
- 什么是函数:
函数是一段可执行的代码块,可以重复使用。 - 函数的作用:
1)划分功能模块,更好管理软件工程(协同开发);
2)复用代码,减少开发工作量;
3)提高代码阅读性,降低维护成本; - 函数的定义
def functionName(list of parameters):
["注释"](可选)
代码块,语句块
return [返回值](可选) - 语法说明:
1)def开头,后接函数标识符名称和圆括号();
2)函数的命名规则与变量的命名规则一致;
3)函数本身也是一个变量,该变量类型为可调用类型,属性为只读;
4)函数有自己的命名空间,要让函数处理外部数据需要用参数给函数传入一些数据; #涉及作用域概念
5)参数列表放在圆括号内,逗号隔开,不写为空;
6)语句块部分不能省略,如果为空语句,需要填充pass关键字
7)不带表达式的return相当于返回None。 - 实例:
def add(a,b):
return a+b - 函数调用:
函数名(实参列表) - 调用说明:
1)函数调用是一个表达式;
2)如果没有return语句,函数执行完毕返回None值对象;
3)如果函数需要返回其他的值对象需要用return语句;
4)函数调用作为模块内部语句时,必须先定义函数,后调用函数; - 实例:
a = add(10,20)
print a - 函数的返回
- 函数的参数传递:
1)参数的传递方式:
a、位置传参; #sum(a,b,c);以形参的顺序,进行传参
b、关键字传参; #sum(b=1,a=2,c=3); 以形参赋值实参,可以打乱顺序,但是,在使用的时候,必须不可缺少关键 字,同时不可减少关键字。
c、序列传参; #序列类型,list,tuple,str,作为参数列表传递,要求为:序列的元素个数必须与参数的个数相同
s1 = [1,2,3], myfun(*s1) 等同于 myfun(s1[0],s1[1],s1[2]) #myfun函数的形参有三个。
d、字典关键字传参; #实参和形参通过字典进行传递和匹配,字典的值传递给键对应的形参
d1 = {"a":33,"b":23,"c":12} myfun(**d1) #ok,myfun(a,b,c):.....形参为三个
e、综合传参 #以上几种方法,混合使用。 - 函数的缺省参数: 函数的形参如果被赋予默认参数值,那么该函数在调用时,如果对应的形参没有实参进行值传递,则使用默认值计算; 实例:
def info(name,age=1,addr = "不祥"):
print("name",name,"age":,age,"addr":,addr)
info("zhangsan") #name:zhangsan,age:1,addr:不详
info("zhangsan",23,"beijing") #name:zhangsan,age:23,addr:beijing
- 缺省参数说明:
缺省参数必须自右至左依次存在,如果一个参数有缺省值,其后后面的都要为缺省值
应用广泛 - 函数的不定长参数 两种:星号元组形参,双星号字典形参 1)星号元组形参: 语法:
def functionname(*tuplename):
statement
- 实例:
def myfun(*args):
print(args)
for x in args:
print("参数":x)
s = (1,2)
myfun(*s)
- 2)双星号字典形参 语法:
def functionname (**dictname):
statement
- 实例:
def myfun(**args):
print("参数的个数:",len(args))
for k,v in args.items():
print(k,">>",v)
#diaoyong
myfun(name="midu",age=15)
- 3)介于上面二者间的,命名关键字形参: 语法:
def functionname (*,命名关键字形参名):
statement
or
def functionname (*args,命名关键字形参名):
statement
- 注意:星号后面的参数必须使用关键字的传参形式,其关键字传递参数在实参列表中的位置是可变,但必须是关键字传参。
- 函数的参数列表顺序: 位置形参,缺省参数,星号元组形参,双星号字典形参,命名关键字可以混合使用 函数参数自左至右的顺序为: 位置形参,星号元组形参,命名关键字形参,双星号字典形参,默认 实例:
• def fn(a,b,*args,c,**kwargs):
pass
fn(100,200,300,400,c="C",d= "D,e="E")
- 可变\不可变类型的实参的参数传递的区别
可变类型:list,set,dict
不可变类型:frozenset,tuple,str,numbers
注意:可变,在改变其元素时,不释放对象的内存,不可变类型,在改变参数时,原先的实参会被释放,重新开辟空间,才可以重新进行传参。