函数
函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法。 在BASIC中叫做subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java里面叫做method。
定义
函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可。
特性
1.减少重复代码
2.使程序变的可扩展
3.使程序变得易维护
语法
def sayhi()#使用def来定义一个函数,后面跟函数名()。 print("Hello")#函数中的操作内容,打印一个Hello sayhi()#函数名+括号的方式来实现函数的调用 #打印结果:Hello
函数的参数
a = 2 #定义变量a b = 10 #定义变量b def calc(x,y)#x,y形参 res x**y return res print(calc(a,b))#a,b实参 #打印结果:1024
#注:return可返回结果给函数;也是代表函数的结束
形参:只有在被调用时才分配内存单元,在调用结束后,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。
注:1、形参即局部变量,作用域只在函数内部,外部变量默认不能被函数内部修改,只能被引用。
2、如果在函数内部需要修改全局变量的话需要使用“global”;但强烈不建议这么使用。
3、函数内部可以修改列表、字典、集合、实例。
实参:可以是常量、变量、表达式、函数等,无论实参是何种类型,在进行函数调用时他们必须得有确定的值,以便把这些值传给形参。因此,应预先赋值、输入等办法使参数获得确定值。
注:有确定值的参数,所有的数据类型都可以被当做参数传给函数。
函数的参数种类
1、位置参数
按照函数中的参数位置一一对应传值。
def stu_register(name,age,country,course): print("学生注册信息".center(20,'-')) print("姓名:",name) print("年龄:",age) print("国籍",country) print("课程:",course) stu_register("xiaoling",22,"CN","Python")#按照参数位置一一传值 stu_register("Angie",23,"CN","linux")#按照参数位置一一传值
以上代码按照参数的位置进行传值,传入的内容必须一一对应,否则内容与有意义的参数名则不会对应。
2、默认参数
提前给函数的参数赋值。
在进行学生信息注册时,发现学生的国籍都是“CN”,此时就可以将“CN”设置成默认参数。
def stu_register(name,age,course,country="CN"):#给参数一个默认值 print("学生注册信息".center(20,'-')) print("姓名:",name) print("年龄:",age) print("国籍",country) print("课程:",course) stu_register("xiaoling",22,"Python") stu_register("Angie",23,"linux")
注:默认参数要放到所有的参数最后面,否则会报错;默认参数可被重新传入的实参修改。
3、关键参数
正常情况下给函数传参是要按顺序的,如果不想按位置传参,那么可以使用关键参数。
def stu_register(name,age,course,country="CN"): print("学生注册信息".center(20,'-')) print("姓名:",name) print("年龄:",age) print("国籍",country) print("课程:",course) stu_register("xiaoling",course="Python",age=22)#关键参数可以不用按位置传值 #打印结果 -------学生注册信息------- 姓名: xiaoling 年龄: 22 国籍 CN 课程: Python
注:关键参数同默认函数一样,必须放在位置参数后面。
4、非固定参数
在定义函数时,如果想要传入多少个参数,就可以使用非固定函数,*args。
def stu_register(name,age,*args): print(name,age,args) stu_register("xiaoling",22) #打印结果:xiaoling 22 () 因为没有给args传值所以是个空元祖 stu_register("xiaoling",22,"CN","Python") #打印结果:xiaoling 22 ("CN","Python")
注:*args以位置参数的形式传入,多余的值保存为一个元祖。
非固定参数还可以使用**kwargs。
def stu_register(name,age,*args,**kwargs): print(name,age,args,kwargs) stu_register("xiaoling",22) #打印结果 xiaoling 22 () {} 因为未传值,打印一个空元祖和空字典 stu_register("xiaoling",22,"CN","Python",hobby="阅读",province="山东") #打印结果xiaoling 22 ('CN', 'Python') {'province': '山东', 'hobby': '阅读'}
注:*args 以位置参数的方式传值;**kwargs以关键参数的方式传值。
注:参数的顺序,位置参数-->默认参数-->*args-->**kwargs
嵌套函数:
简单的说就是函数内套函数
name = "Angie" def change_name(): name = "Angie2" def change_name2():#函数中在定义一个函数 name = "Angie3" print("第3层打印", name) change_name2() # 调用内层函数 print("第2层打印", name) change_name() print("最外层打印", name)
匿名函数:
匿名函数就是不需要显示的指定函数
def calc(n): return n*2 print(calc(2)) #打印结果:4 calc2 = lambda n:n*2 #使用lambda创建函数,并赋值个一个变量 print(calc(2)) #打印结果:4
匿名函数的使用,因为函数也可以作为参数进行传入,此时就可以使用匿名函数
res = map(lambda n:n*2,[1,2,3]) for i in res: print(i)
注:for i in map(lambda x:x*2 if x > 5 else x+1,[1,2,3,4,5,6,7,8,9])
高阶函数
一个函数的参数可以是任意值,也可以是一个函数,把一个函数当做参数传给另一个函数,就称为高阶函数
特点:
1、把一个函数的内存地址传给另一个函数
2、一个函数把另外一个函数当做返回值返回
def add(x,y,f): return f(x)+f(y) res = add(3,-5,abs) print(res) #将abs()函数当做参数传入另一个函数 #打印结果:8
内置函数