一、函数
使用函数可以
- 减少代码重用。
- 保持一致性,容易维护。
- 可扩展性。
1.函数的定义方法:
def function(x): x+=1 return x
-
- def:定义函数的关键字。
- function:函数名。
- 函数名后括号内的变量表示函数的参数(可以是0个或多个参数)
- 冒号代表一个代码块的开始。
- x+=1处是函数的代码块
- return:函数的返回值,如果不写return默认返回None
- 可以返回多个值(用逗号分割)python会吧这些值组成一个元祖返回。
- 当函数遇到 return 时直接跳出函数。
2.函数的参数
-
- 函数在定义时的参数叫函数的形参。
- 函数在调用时候的参数叫函数的实参。
- 函数在定义时候不会分配内存空间,只有在调用时才会分配内存空间。
3.位置参数和关键字
关键字参数必须在所有位置参数之后。
def function(a, b): print("a={0},b={1}".format(a, b)) return a,b function(1,2) #位置参数必须和函数的参数必须一一对应。缺一不可 function(b=3, a=0) #关键字参数 指定关键字赋值 顺序不需要一一对应。同样也缺一不可。
输出:
a=1,b=2
a=0,b=3
4.默认参数
def function(a, b,c=100): print("a={0}, b={1}, c={2}".format(a, b, c)) return a,b function(1,2) #不指定默认参数 取默认值 function(b=3, a=0) #不指定默认参数 取默认值 function(1, 2, 3) #指定默认参数
输出:
a=1, b=2, c=100 a=0, b=3, c=100 a=1, b=2, c=3
5.参数组(非固定长度参数)
不定长参数:
若传入一个列表,则吧列表也当做一个元素。
def function(a,*args): print(a) print(args) return None function(1,2,3,4,5,76) function(1,[1,2,3,4,5])
输出:
1 (2, 3, 4, 5, 76) 1 ([1, 2, 3, 4, 5],)
若传入一个列表需要在列表前加一个*(星)
例如:
def function(a,*args): print(a) print(args) return None function(1,2,3,4,5,76) function(1,*[1,2,3,4,5])
输出:
1 (2, 3, 4, 5, 76) 1 (1, 2, 3, 4, 5)
不定长关键字:
def function(a, **kwargs): print(a) print(kwargs) return None function(1, x=2, y=3)
输出:
1 {'y': 3, 'x': 2}
若传入一个字典需要在字典前加 **(两个星)
例如:
def function(a, **kwargs): print(a) print(kwargs) return None function(1, x=2, y=3) function(1,**{'one': 1, '2':2, 'name':'zjs'})
输出:
1 {'x': 2, 'y': 3} 1 {'one': 1, 'name': 'zjs', '2': 2}
6.函数的递归
def function(n): if n == 1: return n else: s = n + function(n-1) return s res = function(4) print(res)
该程序完成的功能是获得 n + (n-1) + (n-2) + ... + 1 相加的和
程序执行流程如下:
- 函数执行到 第 8 行(res = function(4))时候执行 function 函数并传入参数 4
- 判断 4 是否等于 1 返回值为假 执行第 5 行
- s = 4 + function(3) 调用函数 function 并传入参数 3
- 判断 3 是否等于 1 返回值为假执行第 5 行
- s = 3+function(2)调用函数 function 并传入参数 2
- 判断 2 是否等于 1 返回值为假执行第 5 行
- s = 2+function(1)调用函数 function 并传入参数 1
- 判断 1 是否等于 1 返回值为真执行 return 1 给调用者
- s = 2 + 1 然后执行 return s (s=3)给调用者
- s = 3 + 3 然后执行return s (s=6)给调用者
- s = 4 + 6 然后执行return s (s=10)给调用者
- res = 10
- print(10)
- 函数结束。
输出:
10
同理:当把n传入100时会得到结果5050
7.lambda表达式(匿名函数):
除了 def 语句用来定义函数之外,还可以使用匿名函数 lambda ,它是Python一种生成函数对象的表达式形式。匿名函数通常是创建了可以被调用的函数,它返回了函数,而并没有将这个函数命名。lambda有时被叫做匿名函数也就是这个原因,需要一个函数,又不想动脑筋去想名字,这就是匿名函数。
lambda函数的语法只包含一个语句,如下:
lambda arg1,arg2,.....argn : expression
lambda表达式没有 返回值 表达式本身就是一个返回值
def func(a, b, c): return a + b + c print(func(1, 2, 3)) # 返回值为6 # lambda匿名函数 f = lambda a, b, c: a + b + c print(f(1, 2, 3)) # 返回结果为6
注:
冒号:之前的a,b,c表示它们是这个函数的参数。
匿名函数不需要 return 来返回值,表达式本身结果就是返回值。
8.高阶函数:
以下两个条件满足其一就叫做高阶函数:
-
- 函数的返回值返回值是一个函数名。
- 函数的传入参数是一个函数名。
二、全局变量与局部变量
全局变量:作用域在全局的变量叫做全局变量,该变量在一个程序内的任何地方都可以被访问。(不在任何代码块内)
局部变量:仅仅在代码块(函数)内可用,其他地方不能读取和使用。
如果局部变量与全局变量重名:
-
- 若无 global 关键字默认访问局部变量。
v = "123" def function(): v = "456" #此处创建了新的变量(局部变量) print(v) function() print(v)
输出:
456 123
-
- 若有 global 关键字则访问全局变量。
v = "123" def function(): global v v = "456" #此处修改了全局变量 print(v) function() print(v)
输出:
456 456
如果全局变量是个列表或字典等可变类型变量:可以对内部元素进行操作。
v = [1, 2, 3, "test"] def function(): v[1] = "aaa" v.append(555) print(v) function() print(v)
输出:
[1, 'aaa', 3, 'test', 555] [1, 'aaa', 3, 'test', 555]
但是:
v = [1, 2, 3, "test"] def function(): v = "aaa" #相当于创建了一个新的变量v print(v) function() print(v)
输出:
aaa [1, 2, 3, 'test']
如果是嵌套的函数:
v = "aaa" def function(): v = "bbb" # 相当于创建了一个新的变量v print(v) def inner_function(): v = "ccc" print(v) inner_function() print(v) function() print(v)
输出:
bbb
ccc
bbb
aaa
如果 inner_function 想调用 function 的局部变量 v 需要使用 nonlocal 关键字
v = "aaa" def function(): v = "bbb" # 相当于创建了一个新的变量v print(v) def inner_function(): nonlocal v # 不创建新的变量 使用上一级函数的局部变量v v = "ccc" print(v) inner_function() print(v) function() print(v)
输出:
bbb
ccc
ccc
aaa
总结:
当全局变量与局部变量重名时优先读取局部变量,能读取全局变量,无法对全局变量重新赋值
但是对于可变类型,可以对内部元素进行操作
如果函数中有 global 关键字,变量本质上就是全局的那个变量,可读取可赋值
不成文规定:全局变量全部使用大写字母表示。