函数进阶
变量的作用域
b = [12,3]
def f1():
a = [34,3]
return a
res=f1()
由上图可以看到变量a和变量b,但两者有区别,变量a是自定义函数f1()中的变量,只局限于在函数内部使用,所以称为局部变量;而变量b没有定义在函数内部,则在之后的代码书写中都能够使用,所以被称之为全局变量。
global函数
global:提升作用域,把局部变量声明为全局变量。(作用对象是:局部变量)
def f1():
global a
a = 13
print(a)
f1()
def f2():
print(a)
f2()
输出结果:
由以上结果看出,变量a其实是f1()函数内部的局部变量,但有了global将变量a提升成了全局变量,在调用函数的前提下,变量a也可以任意使用,所以在自定义函数f2()中使用了变量a,输出一样是有结果的。
高阶函数
嵌套函数:定义函数里面还含有一个函数
例如:
def f1():
def f2():
pass
高阶函数:一个函数可以作为一个参数传递,或者在一个函数中返回另一个函数。
def f2():
print('这是普通函数')
f2()
print('----'*10)
#高阶函数
def high():
print('f2',f2)
return f2
high()
print('----'*10)
print(high()())
输出结果:
由上图可以看出print(high()())比high()还多了一个None,原因是,f2没有return,所有就没有返回值,就会返回一个None。
作为参数
def f2():
print('这是普通函数')
f2()
print('----'*10)
#高阶函数
def high():
print('f2',f2)
return f2
f=high()
print('----'*10)
print('这是high函数',high()())
#作为参数
def high1(f):
print('这里high1里的输出:',f)
high1(f2)
输出:这里high1里的输出: <function f2 at 0x000001AF7459C378>
map()
map()高阶函数,接收2个参数:1、函数地址;2、序列。
def test(a):
print(a)
return a
print(list(map(test,'2546')))
输出结果:
map()函数同时也是个映射函数,会把字符串'2546'每一个元素映射到test中,所以就有了以上的结果。
print(list(map(set,'2546')))
输出结果:
所以同时map()函数还能进行数值类型之间的转换。
def pf(a):
return a**2 #或a*a
print(tuple(map(pf,[2,4,5,6])))
输出:(4, 16, 25, 36)
该结果是将序列[2,4,5,6]转化成了元组类型的同时,实现了每个元素的平方。
filter()函数
filter()函数:最终保存结果是True的元素,用法与map()函数一致
def panduan(a):
return True if a >6 else 0
print(list(filter(panduan,(4,5,7,9,6,8))))
输出结果:[7, 9, 8]
这里遵循的规则依然是“非空即真,非0即真”
sorted()
sorted():接受一个可迭代对象作为参数,并返回一个排序后的列表,他也可以接受一个key参数,用于指定排序时使用的键函数。
number = [3,1,4,1,5,9]
res = sorted(number)
print(res)
输出结果:[1, 1, 3, 4, 5, 9]
dict1={'java':99,'python':100,'masql':94,'c++':89}
def paixu(a):
return a[1]
print(sorted(dict1.items(),key=paixu))
输出结果:[('c++', 89), ('masql', 94), ('java', 99), ('python', 100)]
递归
递归本质就是高阶函数,函数内部调用自身。一般常用于阶乘运算。
类似于:
def digui():
print('开始递归')
digui()
递归函数必须拥有三个结构:
- 调用自身
- 出口
- 递归体
def digui(n):
if n==10:
return 0
print(f'开始递归,这是第{n}次递归')
digui(n+1)
digui(1)
输出:
例如:计算1-10之间的和,请用递归完成
def qiu_He(n):
if n == 1:
return 1
else:
return n+qiu_He(n-1)
print(qiu_He(10))
输出:55
这里n==1就是出口,qiu_He(n-1)就调用了函数本身。
例如:计算斐波那契数列之和。[1,1,2,3,5,8,13,21,34]
def fib(n):
if n <=2:
return 1
else:
return fib(n-1)+ fib(n-2)
print(fib(9))
输出:34
匿名函数
匿名函数:没有定义函数的名字,用lambda表示
例如:
print((lambda a,b:a+b)(2,4))
print((lambda a,b,c=5:a+b+c)(2,4))
输出:
res = lambda x:x**2
print(list(map(res,[2,4,6,8])))
输出:[4, 16, 36, 64]