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)
View Code
def test(x, y):
print(x, y)
# 与参数一一对应
test(3,4)
View Code
2.参数与局部变量
a.形参变量只有在 被调用时才分配内存单元,在调用结束时,即可释放所分配的内存单元,因此,形参只在函数内部有效,函数调用结束返回朱调用函数后则不能再使用该形参变量。
b.实参可以是常量、变量、表达式、函数等,无论实参是克重类型的量,在进行函数调用时,他们都必须有确定的值,以便把这些值传递给形参,因此应预先用赋值,输入等方法使参数获得确定值。
# x,y是形参
def test(x, y):
print(x, y)
# 3,4是实参
test(3,4)
View Code
c.参数不固定的时候,形参该如何设置呢?
这时,我们使用*args
*args:接收N个位置参数,转换成元组的形式
# 参数不固定
# 参数组:接收的是位置参数
# *args:接收N个位置参数,转换成元组的形式
def test(x, *args):
print(x)
print(args)
test(1,2,3,4)
test(*(3,4,5))
View Code
d.**kwargs:把N个关键字参数,转换成字典的方式
# **kwargs:把N个关键字参数,转换成字典的方式
# 关键字参数字典处理,字典传值
def test(**kwargs):
print(kwargs)
print(kwargs['name'])
# 方式一
test(name='x', age=2)
# 方式二
test(**{'name':'x', 'age':2})
View Code
e.默认参数
# 默认参数:给定默认值,如果给形参传值,则会打印传值,否则会打印默认值
def test(x, y=5):
print(x)
print(y)
x = 4
test(x)
y = 7
test(x,y)
View Code
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))
View Code
4.递归
定义:在函数的内部,可以调用其他函数,如果一个函数在内部调用自身本身,这个函数就是递归函数
特性:1.必须有一个明确的结束条件,否则发生循环导致内存泄漏,程序崩溃
2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3.递归效率不高,递归层次过多会导致栈溢出,在计算机中,函数调用时通过栈stack这种数据结构实现的,
每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会建一层栈帧,由于栈的大小不是无限的,
所以递归调用次数过多,导致栈溢出。
def calcute(n):
print(n)
if int(n / 2) > 0:
return calcute(int(n/2))
print('-->',n)
calcute(10)
View Code
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)
View Code