Python:函数进阶

117 阅读4分钟

函数进阶

变量的作用域

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()

输出结果:

image.png

由以上结果看出,变量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()())

输出结果:

image.png

由上图可以看出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')))

输出结果:

image.png

map()函数同时也是个映射函数,会把字符串'2546'每一个元素映射到test中,所以就有了以上的结果。

print(list(map(set,'2546')))

输出结果:

image.png

所以同时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()

递归函数必须拥有三个结构:

  1. 调用自身
  2. 出口
  3. 递归体
def digui(n):
    if n==10:
        return 0
    print(f'开始递归,这是第{n}次递归')
    digui(n+1)

digui(1)

输出:

image.png

例如:计算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))

输出:

image.png

res = lambda x:x**2
print(list(map(res,[2,4,6,8])))

输出:[4, 16, 36, 64]