一、函数
1、函数的基本语法及特性
定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可。
特性:减少重复代码;使程序变得可扩展;使程序变得易维护。
1 def hello(): #定义用def 2 print("hello world") 3 4 hello() #直接调用
带参数如下:
1 def calc(x,y): #x,y为形参 2 res = x+y 3 return res #返回函数执行结果 4 5 c = calc(a,b) #结果赋值给c变量;a,b为实参 6 print(c)
2、参数与变量
形参:只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量
实参:可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。
2.1、位置参数
1 def people(name,age,sex,country): 2 print("name",name) 3 print("age",age) 4 print("sex",sex) 5 print("country",country) 6 people("a",16,"M","CN") 7 people("b",15,"F","CN")
位置参数必须一一对应,若有相同参数,可设默认参数,但必须在位置参数之后,如:
def people(name,age,sex,country="CN"): pass
people("c",18,"M") #country不传为默认CN,指定后为你所传的参数
2.2、关键参数
people("d",sex="M",age=17) #位置参数在前,关键参数在后,可颠倒顺序,每个形参只能传一个实参
2.3、非固定参数
当需要传递的参数较多,可使用非固定参数:*args;**kwargs
def people(name,*args,**kwargs): pass people("e",19,"F",country="CN")
#输出:"e",(19,"F"),{country:"CN"} #位置参数传给*args,以元组形式展现;关键参数传给**kwargs,以字典形式展现.
2.4、局部变量与全局变量
1 name = "A" #这儿为全局变量 2 3 def change_name(name): 4 print("before change:",name) 5 name = "a" #这儿为局部变量 6 print("after change:", name) 7 8 change_name(name) 9 10 print("最后的name:",name) 11 #输出: 12 before change:"A" 13 after change:"a" 14 最后的name:"A" 15 #namely,局部变量只在它定义的子程序中起作用,全局变量在全局起作用.
3、匿名函数
1 #这段代码 2 def calc(n): 3 return n**n 4 print(calc(10)) 5 6 #换成匿名函数 7 calc = lambda n:n**n 8 print(calc(10))
4、嵌套函数
name = "A" def change_name(): name = "B" def change_name2(): name = "C" print("第3层打印",name) change_name2() #调用内层函数 print("第2层打印",name) change_name() print("最外层打印",name)
5、高阶函数
1 def add(x,y,f): 2 return f(x) + f(y) 3 res = add(1,-1,abs) 4 print(res) 5 #即:把一个函数作为参数传给另一个函数
6、递归函数
1 def calc(n): 2 print(n) 3 if int(n/2) ==0: 4 return n 5 return calc(int(n/2)) 6 calc(10) 7 #输出: 8 10 9 5 10 2 11 1
递归特性:
1. 必须有一个明确的结束条件,保护机制无限循环最多999次;
2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少;
3. 递归效率不高,递归层次过多会导致栈溢出。
7、内置参数
更多:This