函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可
特性:
- 减少重复代码
- 使程序变的可扩展
- 使程序变得易维护
定义一个函数
语法定义:
1 def sayhi():#函数名 2 print("Hello, I'm nobody!") 3 4 sayhi() #调用函数
实例:
>>> def hello() : print("Hello World!") >>> hello() Hello World! >>>
带参数:
#下面这段代码 a,b = 5,8 c = a**b print(c) #改成用函数写 def calc(x,y): res = x**y return res #返回函数执行结果 c = calc(a,b) #结果赋值给c变量 print(c)
函数参数和环境变量
参数
默认参数:
位置参数:
形参:变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量
实参:可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值
实例图:
默认参数
定义:调用函数时,如果没有传递参数,则会使用默认参数。
默认参数必须放到非默认参数(位置参数)的右面;
1 def sayHi(name,age,nationality='CN'): 2 print("Hello,I'm %s !"%name,age,nationality) 3 4 sayHi('lain','24') #默认显示国籍为'CN' 5 sayHi('liha','22','USA') #修改默认国籍为'USA' 6 7 8 结果: 9 Hello,I'm lain ! 24 CN 10 Hello,I'm liha ! 22 USA
指定参数
指定参数必须放在位置参数的右面;
1 def sayHi(name,age,nationality='CN'): 2 print("Hello,I'm %s !"%name,age,nationality) 3 4 sayHi('lain',nationality='JP',age=24) 5 sayHi('liha',age=22,nationality='USA') 6 7 运行结果: 8 Hello,I'm lain ! 24 JP 9 Hello,I'm liha ! 22 USA
非固定参数(不定长参数)
一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名;
命名规范:*args,**kwargs
元组形式:加一个星号(*)的变量名会存放所有未命名的变量参数。如果在函数调用时没有指定参数,它就是一个空元组。
1 def stu_register(name, age, country, course,*heh): 2 print("----注册学生信息------") 3 print("姓名:", name) 4 print("age:", age) 5 print("国籍:", country) 6 print("课程:", course) 7 print("爱好:",*heh) 8 9 10 stu_register("张三", 22, "CN", "Python_devops",'妹纸','聊天') 11 stu_register("李四", 24, "CN", "Linux","玩蛋") 12 stu_register("王三炮", 25, "CN", "Oracle",'LOL') 13 14 执行结果: 15 ----注册学生信息------ 16 姓名: 张三 17 age: 22 18 国籍: CN 19 课程: Python_devops 20 爱好: 妹纸 聊天 21 ----注册学生信息------ 22 姓名: 李四 23 age: 24 24 国籍: CN 25 课程: Linux 26 爱好: 玩蛋 27 ----注册学生信息------ 28 姓名: 王三炮 29 age: 25 30 国籍: CN 31 课程: Oracle 32 爱好: LOL
字典形式:加两个星号(**)的变量名会存放所有未命名的变量参数。如果在函数调用时没有指定参数,它就是一个空字典。
1 def stu_register(name, age, country, course,*heh,**hah): 2 print("----注册学生信息------") 3 print("姓名:", name) 4 print("age:", age) 5 print("国籍:", country) 6 print("课程:", course) 7 print("爱好:",heh,hah) 8 9 10 stu_register("张三", 22, "CN", "Python_devops",'妹纸','聊天',stuid='134123',fee=4000) 11 stu_register("李四", 24, "CN", "Linux","玩蛋") 12 stu_register("王三炮", 25, "CN", "Oracle",'LOL') 13 14 执行结果: 15 ----注册学生信息------ 16 姓名: 张三 17 age: 22 18 国籍: CN 19 课程: Python_devops 20 爱好: ('妹纸', '聊天') {'stuid': '134123', 'fee': 4000} 21 ----注册学生信息------ 22 姓名: 李四 23 age: 24 24 国籍: CN 25 课程: Linux 26 爱好: ('玩蛋',) {} 27 ----注册学生信息------ 28 姓名: 王三炮 29 age: 25 30 国籍: CN 31 课程: Oracle 32 爱好: ('LOL',) {}
递归函数
定义:在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
递归特性:
1. 必须有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是 无限的,所以,递归调用的次数过多,会导致栈溢出)
1 data = range(0,1000000) 2 3 def digui(data,find): 4 if len(data) > 0: 5 middle_pos = int(len(data)/2) 6 if data[middle_pos] == find: 7 print('find_name:',find) 8 elif data[middle_pos] < find: 9 print('