一、什么是函数?

首先我们此时说的函数是Python里的函数,与数学函数不是一码事
Python函数组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

二、为什么使用函数?

函数能提高应用的模块性,和代码的重复利用率。
Python提供了许多内建函数,比如print()。 此时print()就是实现打印功能代码段的函数名称
但我们也可以自己创建函数,这被叫做用户自定义函数。

三、Python如何定义函数?

1、函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。

2、任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。

3、函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。

4、函数内容以冒号起始,并且缩进。

5、return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

python中函数定义规范 python的函数定义_默认值

四、Python调用函数

函数名称([实参列表])

五、函数的类型

1、基于有无参数分为:有参函数、无参函数

有参函数在定义函数时括号里的变量为形式参数

使用这个函数时 括号里变量为 实际参数

python中函数定义规范 python的函数定义_全局变量_02

python中函数定义规范 python的函数定义_全局变量_03


2、基于有无返回值分为:有返回值函数、无返回值函数

此时这个就没有返回值

还有一个问题是:返回值,需要在调用函数的时候进行接收,否则返回值没有意义的。

python中函数定义规范 python的函数定义_默认值_04


有返回值的

python中函数定义规范 python的函数定义_默认值_05

六、函数的全局变量和局部变量

解释性的语言代码是从上而下执行的!!!

1、全局变量

是指声明在函数外面的变量,可以在文档的任意地方使用。如下:

name = "石海鹏"
#直接使用全局变量
print(name)

def printInfos():
	#在函数中使用全局变量
	print(name)


printInfos()

从上面代码我们可以看出,全局变量一旦声明赋值,在任何地方都可以使用,
但是如果我们要在函数中修改全局变量的值,是改不了的全局变量的值的。
因为函数的调用过程,叫做压栈,等函数执行完成后,函数就立刻出栈(弹栈)。
所以本着谨慎的态度,如果想要在函数内部修改全局变量,则需要再函数中声明使用这个全局变量。
global + 变量名称

name = "石海鹏"

def printInfos():
	#在函数中使用全局变量
	global name
	name = "海鹏"
	print(name)


printInfos()
print(name)

此时全局变量就在函数内部被修改了

2、局部变量

局部变量就是声明在函数内部的变量,只能在函数内部使用,函数执行结束这个变量就

会被回收,我们称之为局部变量。局部变量只是在函数中可以使用,出了函数这个变量就不

认识了.

python中函数定义规范 python的函数定义_可变参数_06

七、值传递和引用传递问题

1、值传递问题

值传递是不会改变值的,因为内存的结构栈(FILO),运行完函数就会弹栈。所以函数局部的操作并不影响到全局的。

# 值传递
def test(a, b):
	a += 10
	b += 20
	print("计算完成了")

a = 100
b = 200

test(a, b)
print(a, b)

运行结果

python中函数定义规范 python的函数定义_默认值_07

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)

运行结果

python中函数定义规范 python的函数定义_全局变量_08

八、函数参数

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="哈哈")

运行结果

python中函数定义规范 python的函数定义_全局变量_09

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)