1.函数基本语法以及特性
定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需要调用其函数名即可。
特性:1.减少重复代码
2.使程序变得可扩展
3.使程序变得易维护
# 函数的定义 # 无参数,无返回值类型 def test1(): print('test1') # 无参数,有返回值类型 def test2(): return 0 # 有参数,无返回值类型 def test3(x): print(x) # 有参数,有返回值类型 def test4(x): return 2*x # 函数的调用 test1() test2() test3(3) test4(4)
def test(x, y): print(x, y) # 与参数一一对应 test(3,4)
2.参数与局部变量
a.形参变量只有在 被调用时才分配内存单元,在调用结束时,即可释放所分配的内存单元,因此,形参只在函数内部有效,函数调用结束返回朱调用函数后则不能再使用该形参变量。
b.实参可以是常量、变量、表达式、函数等,无论实参是克重类型的量,在进行函数调用时,他们都必须有确定的值,以便把这些值传递给形参,因此应预先用赋值,输入等方法使参数获得确定值。
# x,y是形参 def test(x, y): print(x, y) # 3,4是实参 test(3,4)
c.参数不固定的时候,形参该如何设置呢?
这时,我们使用*args
*args:接收N个位置参数,转换成元组的形式
# 参数不固定 # 参数组:接收的是位置参数 # *args:接收N个位置参数,转换成元组的形式 def test(x, *args): print(x) print(args) test(1,2,3,4) test(*(3,4,5))
d.**kwargs:把N个关键字参数,转换成字典的方式
# **kwargs:把N个关键字参数,转换成字典的方式 # 关键字参数字典处理,字典传值 def test(**kwargs): print(kwargs) print(kwargs['name']) # 方式一 test(name='x', age=2) # 方式二 test(**{'name':'x', 'age':2})
e.默认参数
# 默认参数:给定默认值,如果给形参传值,则会打印传值,否则会打印默认值 def test(x, y=5): print(x) print(y) x = 4 test(x) y = 7 test(x,y)
3.返回值
定义:要想获得函数的执行结果,可以使用return语句把结果返回
注意:1.函数在执行过程中只要遇到return语句,就会停止执行并返回结果,所以,return语句代表着函数的结束
2.如果未在函数中指定return,那么这个函数的返回值为None
# x,y是形参, def test(x, y): print(x, y) # return是返回值标识,该函数返回x+y的值 return x + y # 3,4是实参 test(3,4) print(test(3,4))
4.递归
定义:在函数的内部,可以调用其他函数,如果一个函数在内部调用自身本身,这个函数就是递归函数
特性:1.必须有一个明确的结束条件,否则发生循环导致内存泄漏,程序崩溃
2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3.递归效率不高,递归层次过多会导致栈溢出,在计算机中,函数调用时通过栈stack这种数据结构实现的,
每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会建一层栈帧,由于栈的大小不是无限的,
所以递归调用次数过多,导致栈溢出。
def calcute(n): print(n) if int(n / 2) > 0: return calcute(int(n/2)) print('-->',n) calcute(10)
5.局部变量和全局变量
school = 'Oldboy edu.' #快捷键 command+/ def change_name(name): # 绝对不允许这样使用全局变量,函数会被多次调用,这个全局变量的值不确定因素影响项目 # global string # string = 'adsfasdf' # 修改全局变量:global school global school school = 'ANHUI' print('before change:', name) # 局部变量:生命在函数内部,在函数内部生效,这个函数就是这个变量的作用域 name = 'ALEX' print('after change:', name) print('--学校:%s---' %school) name = 'alex' change_name(name) print(name) print(school) # print(string) # 复杂的类型都可以修改,字符串和数值不可以修改 names = ['alex','hack','rain'] def change_names(): print(names) names[0] = '金角大王' print('在里面',names) change_names() print(names)