一、什么是函数?
首先我们此时说的函数是Python里的函数,与数学函数不是一码事
Python函数组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
二、为什么使用函数?
函数能提高应用的模块性,和代码的重复利用率。
Python提供了许多内建函数,比如print()。 此时print()就是实现打印功能代码段的函数名称
但我们也可以自己创建函数,这被叫做用户自定义函数。
三、Python如何定义函数?
1、函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
2、任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
3、函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
4、函数内容以冒号起始,并且缩进。
5、return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
四、Python调用函数
函数名称([实参列表])
五、函数的类型
1、基于有无参数分为:有参函数、无参函数
有参函数在定义函数时括号里的变量为形式参数
使用这个函数时 括号里变量为 实际参数
2、基于有无返回值分为:有返回值函数、无返回值函数
此时这个就没有返回值
还有一个问题是:返回值,需要在调用函数的时候进行接收,否则返回值没有意义的。
有返回值的
六、函数的全局变量和局部变量
解释性的语言代码是从上而下执行的!!!
1、全局变量
是指声明在函数外面的变量,可以在文档的任意地方使用。如下:
name = "石海鹏"
#直接使用全局变量
print(name)
def printInfos():
#在函数中使用全局变量
print(name)
printInfos()
从上面代码我们可以看出,全局变量一旦声明赋值,在任何地方都可以使用,
但是如果我们要在函数中修改全局变量的值,是改不了的全局变量的值的。
因为函数的调用过程,叫做压栈,等函数执行完成后,函数就立刻出栈(弹栈)。
所以本着谨慎的态度,如果想要在函数内部修改全局变量,则需要再函数中声明使用这个全局变量。
global + 变量名称
name = "石海鹏"
def printInfos():
#在函数中使用全局变量
global name
name = "海鹏"
print(name)
printInfos()
print(name)
此时全局变量就在函数内部被修改了
2、局部变量
局部变量就是声明在函数内部的变量,只能在函数内部使用,函数执行结束这个变量就
会被回收,我们称之为局部变量。局部变量只是在函数中可以使用,出了函数这个变量就不
认识了.
七、值传递和引用传递问题
1、值传递问题
值传递是不会改变值的,因为内存的结构栈(FILO),运行完函数就会弹栈。所以函数局部的操作并不影响到全局的。
# 值传递
def test(a, b):
a += 10
b += 20
print("计算完成了")
a = 100
b = 200
test(a, b)
print(a, b)
运行结果
2、引用传递问题
引用传递不会开辟内存,只是复制了栈指向堆的十六进制地址。所以说他们只是在栈(用于存储指向堆内存的地址)的内存不同,而主要存储在堆(真正存储的地方),所以他们本质上是同一个函数。
def test(msg):
print("收到了一个消息-->{}".format(msg))
return "haha"
# 引用传递
# test本身是一个函数,那么test
# 那么a此时也就执行test对应的函数
# 也就是说a和test都对应这同一个函数
a = test
res = a("不要报错了,我讲课了")
print(res)
# print(a)
# 函数调用
b = test("不要报错了,我讲课了")
print(b)
运行结果
八、函数参数
1、默认值参数
某些时候,我们可以给函数的参数定义默认值,这样函数在调用过程中,如果某些参数
没有传递,就直接使用默认值来执行函数代码了,函数默认参数确定比较简单,直接在形式
参数上赋值就可以。
如下:指定了PI参数默认值为3.14,如果不想用默认值,在调用函数的时候第二个参数可以自己指定。
默认值参数必须放在普通参数之后
def get_clrcle_area(r,PI=3.14):
return PI*r*r
r = float(input("请输入圆的半径: "))
area = get_clrcle_area(r)
print("半径为{}的圆,面积为{}".format(r,area))
2、可变参数
在python中,当一个函数参数特别多或者不确定的时候,可以使用可变参数来接受这些参数
格式为:*变量名称 *args # arguments
# 可变参数
def test(x, y, z, k, n, *args):
# 可变参数,会将普通参数无法接受的参数
# 统一接受,注意,元组!!
print(args)
print(x + y + z + k + n)
test(1,2,3,4,5, 6,7,8,89,00,0)
运行结果:
![!里插入图片描述](https://img-blog.csdnimg.cn/20200225161506241.png)
第一行显示可变参数里的值
第二行显示普通参数相加的值
3、命名参数
关键字参数,使用两个**符号来声明关键字参数
# 命名参数
def test(a, b, **kwargs):
print(kwargs)
print(kwargs["cc"])
print(a + b)
test(3, 5, name="刘建宏", age=16, cc="哈哈")
运行结果
4、万能参数(可变参数加命名参数)
当我们在定义函数的时候,有时候需要保留扩展函数功能时
使用可变和命名参数来完成
# 万能参数
def add(x, y=10, *args, **kwargs):
return x + y
res = add(5, 10, 3,4,5,67, name="liujianhong", age=10)
print(res)
九、函数递归
1、函数自身调用自身,叫做递归
2、递归必须有终止条件,否则是一个死循环
def sum(n):
# 100 + 99 + 98 + ... 无群小
# 在递归中,如果没有结束条件,递归是一个死循环
if n == 1:
return 1
return n + sum(n -1)
res = sum(100)
print("1~100的和是{}".format(res))
十、lambda表达式(匿名函数)
def msg(fn):
# fn是一个函数
# 此时fn其实就是ps函数
fn()
# def ps():
# print("hello")
# msg(ps)
# 这就是匿名函数的使用
# lambda表达式
# lambda:print("hello")
msg(lambda:print("hello"))
十一、函数的返回值
Python中允许函数返回多个值
在函数执行完成后,通过 return 关键字可以同时返回多个数据,调用函数的时候根据返回值的顺序来接收对应的返回值。
def test():
a = 10
b = 20
c = 30
# 要将多个函数内的值返回给调用者
return a, b, c
res = test()
print(res[0])
print(res[1])
print(res[2])
def test():
a = 10
b = 20
c = 30
# 要将多个函数内的值返回给调用者
return a, b, c
x, y, z = test()
print(x, y, z)