一 局部变量与全局变量
在子程序中定义的变量为局部变量,在程序一开始定义的变量为全局变量。
全局变量作用域为整个程序,局部变量作用域为定义该变量的子程序。
当局部变量与全局变量同名时,在定义局部变量的子程序内是局部变量起作用,在其他地方全局变量起作用。
函数内无声明变量时,用的是全局变量:
1 name = "abc" 2 def change_name1(): 3 print(name) 4 5 def change_name2(): 6 name = "123" 7 print(name) 8 9 change_name1() 10 change_name2()
输出:
abc
123
如果函数内容无global关键字,优先读取局部变量,无法对全局变量赋值。
当要子程序调用全局变量,并修改全局变量时在子程序变量前加 global :
1 name = "abc" 2 3 def change_name(): 4 global name 5 name = "123" 6 print(name) 7 8 print(name) 9 change_name() 10 print(name)
输出:
abc
123
123
nonlocal的用法:
在嵌套函数中使用,想调用上一级函数的变量并修改时,要在本函数开头用nonlocal声明想要调用的变量
1 def change_name1(): 2 name = "abc" 3 print(name) 4 def chang_name2(): 5 nonlocal name 6 name = "123" 7 print(name) 8 chang_name2() 9 print(name) 10 11 12 change_name1()
输出:
abc
123
123
前向引用----->>>>"函数即变量":在调用这个函数前如果没有定义该函数则会报错。
函数内部的嵌套函数只能该函数直接调用,其他函数无法直接调用该函数。
二 函数的递归
在函数内部,可以调用其它函数。如果一个函数在其内部调用它自己,这个函数就是递归函数。
1 def count(n): 2 print(n) 3 if n > 0: 4 count(n-1) 5 return 0 6 7 count(5)
输出:
5
4
3
2
1
0
递归特性:
- 必须要有一个明确的结束条件,否则就成了死循环
- 每次进入更深一层递归时,问题规模都应该相比于上一次要少
- 递归的执行效率不高,递归层次过多会导致栈溢出。
引用网上找的图片
三 匿名函数
匿名函数就是不需要显示的指定函数。
1 #一般函数 2 def count(n): 3 return n+1 4 print(count(10)) 5 6 #换成的匿名函数 7 count = lambda x:x+1 8 print(count(10))
匿名函数主要和其他函数一起用。
四 函数式编程
高阶函数,满足下面条件至一:
- 函数的传入参数是一个函数名
- 函数的返回值是一个函数
map:
#map函数 map(fun,num) fun:函数;num:可迭代对象
1 num = [1,2,3,5,6,9,8] 2 def map_test(fun,num_l): 3 res = [] 4 for i in num_l: 5 re = fun(i) 6 res.append(re) 7 return res 8 9 print(map_test(lambda x:x-1,num)) 10 #map生成的是一个可迭代对象 11 print("内置map函数",list(map(lambda x:x-1,num)))
输出:
[0, 1, 2, 4, 5, 8, 7]
[0, 1, 2, 4, 5, 8, 7]
filter:
1 n_people = ["1sb","2","3sb","4"] 2 3 def filter_test(fun,str_l): 4 res = [] 5 for i in str_l: 6 if fun(i): 7 res.append(i) 8 return res 9 10 print(filter_test(lambda n:n.endswith("sb"),n_people)) 11 #filter 函数,生成的是一个可迭代对象 12 print("filter生成的是:",filter(lambda n:n.endswith("sb"),n_people)) 13 print(list(filter(lambda n:n.endswith("sb"),n_people)))
输出:
['1sb', '3sb']
filter生成的是: <filter object at 0x0000020FFB28C2E8>
['1sb', '3sb']
reduce:
1 num_l = [1, 2, 3, 4, 5, 6] 2 3 def reduce_test(func, num , init=None): 4 if init == None: 5 str_l = num.copy() 6 res = str_l.pop(0) 7 else: 8 res = init 9 for i in str_l: 10 res = func(res, i) 11 return res 12 13 print(reduce_test(lambda x,y:x+y,num_l)) 14 print(reduce_test(lambda x,y:x*y,num_l)) 15 16 from functools import reduce 17 print("reduce生成的是:",reduce(lambda x,y:x+y,num_l)) 18 print("reduce生成的是:",reduce(lambda x,y:x*y,num_l))
输出:
21
720
reduce生成的是: 21
reduce生成的是: 720