函数
概念
函数是一个功能,是代码复用的通用机制
分类
1.内置函数
2.标准库中的函数
3.第三方库的函数
4.自定义函数
语法
def 函数名(参数列表):
代码块
注意:
return返回值:如果有return语句,则结束函数并返回值,如若没有则返回None
lambda 表达式和匿名函数
lambda 表达式可以用来声明匿名函数。lambda 函数是一种简单的、在同一行中定义函数 的方法。lambda 函数实际生成了一个函数对象。
lambda 表达式只允许包含一个表达式,不能包含复杂语句,该表达式的计算结果就是函数
的返回值。
f = lambda a,b:a+b print(f(2,3)) #5
递归函数
递归函数指的是:自己调用自己的函数,在函数体内部直接或间接的自己调用自己
每个递归必须包含两个部分:
1. 终止条件
表示递归什么时候结束。一般用于返回值,不再调用自己。 2. 递归步骤
把第 n 步的值和第 n-1 步相关联。
def digui(n): if n == 1:return 1 return n*digui(n-1) for i in range(1,6): print(i,'!=',digui(i)) #运行结果: 1 != 1 2 != 2 3 != 6 4 != 24 5 != 120
嵌套函数
def printTest(isNan,name,age): def inner(a,b): print("{0} is {1}".format(a,b)) if isNan ==True: inner(name,age) else: inner(age,name) printTest(True,'张三',18) printTest(False,'静静',18) #运行结果: 张三 is 18 18 is 静静
变量
1.变量的作用域(全局变量,局部变量)
全局变量:
a. 在函数和类定义之外声明的变量。作用域为定义的模块,从定义位置开始直到模块 结束。
b.全局变量降低了函数的通用性和可读性。应尽量避免全局变量的使用。
c.全局变量一般做常量使用。
d.函数内要改变全局变量的值,使用 global 声明一下
局部变量:
a. 在函数体中(包含形式参数)声明的变量。
b. 局部变量的引用比全局变量快,优先考虑使用。
c. 如果局部变量和全局变量同名,则在函数内隐藏全局变量,只使用同名的局部变量
a = 123 def change(): global a #在方法中要修改全局变量,必须要加global,要不然就报错了 print(a) a = 300 change() print(a) #运行结果: 123 300
参数
本质
函数的参数传递本质上就是:从实参到形参的赋值操作。 Python 中“一切皆对象”, 所有的赋值操作都是“引用的赋值”。所以,Python 中参数的传递都是“引用传递”,不 是“值传递”。具体操作时分为两类:
1. 对“可变对象”进行“写操作”,直接作用于原对象本身。
2. 对“不可变对象”进行“写操作”,会产生一个新的“对象空间”,并用新的值填 充这块空间。(起到其他语言的“值传递”效果,但不是“值传递”)
可变对象有: 字典、列表、集合、自定义的对象等
不可变对象有: 数字、字符串、元组、function 等
分类
1.位置参数
函数调用时,实参默认按位置顺序传递,需要个数和形参匹配。按位置传递的参数,称为: “位置参数”
def add(a,b,c): print(a+b+c) add(1,2,4) add(1,2)
运行结果:
7
Traceback (most recent call last):
File "/Users/gray/PycharmProjects/test/test004.py", line 7, in <module>
add(1,2)
TypeError: add() missing 1 required positional argument: 'c'
2.默认参数
我们可以为某些参数设置默认值,这样这些参数在传递时就是可选的。称为“默认值参数”。 默认值参数放到位置参数后面。
def add(a,b=10,c=20): print(a+b+c) add(1) #1+10+20=31 add(1,2) #1+2+20=23
3.命名参数
我们也可以按照形参的名称传递参数,称为“命名参数”,也称“关键字参数
def add(a,b,c): print(a+b+c) add(c=10,a=2,b=20) #10+2+20=23
4.可变参数
可变参数就是可变数量的参数
a. *param(一个星号),将多个参数收集到一个“元组”对象中。
b. **param(两个星号),将多个参数收集到一个“字典”对象中。
def add1(a,b,*c): print(a,b,c) def add(a,b,**c): print(a,b,c) add1(1,2,4,5,6,7,8) add(1,2,name='kang',age=18) # 运行结果: 1 2 (4, 5, 6, 7, 8) 1 2 {'name': 'kang', 'age': 18}
def print_info(*a,**c): print("name : %s" %(a)) print('a',a) print('c',c) for i in c: print("%s : %s" %(i,c[i])) print_info("kang",job='IT',age=12,height=176) #运行结果: name : kang a ('kang',) c {'job': 'IT', 'age': 12, 'height': 176} job : IT age : 12 height : 176 def add(*args): print(args) sum = 0 for i in args: sum += i print(sum) add(1,2,3,4,5) #15
5.强制命名参数
在带星号的“可变参数”后面增加新的参数,必须在调用的时候“强制命名参数”
def add(*a,b,c): print(a,b,c) add(1,2,4,5,6,b=7,c=8) #(1, 2, 4, 5, 6) 7 8 add(1,2,4,5,6,7,8) #TypeError: add() missing 2 required keyword-only arguments: 'b' and 'c 由于 a 是可变参数,将值全部收集。造成 b 和 c 没有赋值