IT技术篇

python函数高级

2019-07-23  本文已影响3人  枫頔

函数是Python内建支持的一种封装,通过把大段代码拆成函数,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程程序设计的基本单元。

# 函数名赋值给变量
def func():
    print("hello world!")
    
new_func = func
new_func()

1. 高阶函数

一个函数接受另一个函数作为参数或者返回一个函数,即为高阶函数。

# 高阶函数
def test(func):
    x = 5
    print("hello world!")
    return func(x)

def num(x):
    return x ** 2

result = test(num)  # 接受一个函数作为参数
print(result)

2. 内置高阶函数

2.1 map函数
# map()h=函数
def square(num):
    return num ** 2

number = [1, 2, 3, 4]
result = map(square, number) 

print(type(result), result)
print(list(result))

# 执行结果
<class 'map'> <map object at 0x1053e5e48>
[1, 4, 9, 16]
2.2 reduce函数
# reduce()函数
from functools import reduce

def multi(x, y ):
    return x * y

number = [1, 2, 3, 4, 5]
result = reduce(multi, number)
print(result)

# 执行结果
120
2.3 filter函数
# filter()函数:用于过滤元素

def odd(num):
    return num % 2

num = list(range(20))
result = filter(odd, num)
print(list(result))

# 执行结果
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
2.4 sorted函数
# sorted()函数:排序
number = [-5, 9, 3, 27, -10]
m = sorted(number, key=abs)

print(m)

# 执行结果
[3, -5, 9, -10, 27]

3. 闭包

# 闭包
def make_func(name):
    
    def func():
        print("my name is %s." % name)
    
    return func

new_func = make_func("fengdi")
new_func()
# 闭包不要引用循环变量或后续会发生变化的变量
def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs

f1, f2, f3 = count()
print(f1())
print(f2())
print(f3())

def count():
    fs = []
    for i in range(1, 4):
        def f(i=i):
             return i*i
        fs.append(f)
    return fs

f1, f2, f3 = count()
print(f1())
print(f2())
print(f3())

# 执行结果 
9 
9 
9 
1 
4 
9

4. 装饰器

python实现装饰器有两种方式:① func = decorator(func)方式 ② @语法糖形式

# 装饰器:func = decorator(func)方式
def wrapper(func):
    def inner():
        print("------新功能添加------")
        func()
    
    return inner

def info():
    print("hello world!")
    
info = wrapper(info)   # 对Info函数进行装饰,添加功能,此时Info函数指向一个新的函数inner
info()

# 装饰器:@语法糖形式
def wrapper(func):
    def inner():
        print("------新功能添加------")
        func()
    
    return inner

@wrapper
def info():
    print("hello world!")
    
info()

# 执行结果
------新功能添加------
hello world!
------新功能添加------
hello world!
# 装饰器装饰时间
def wrapper(func):
    print("------装饰器开始装饰------")
    def inner():
        print("------新功能添加------")
        func()
    
    return inner

@wrapper
def info():
    print("hello world!")
    
# 执行结果
------装饰器开始装饰------
# 装饰有返回值函数
def wrapper(func):
    def inner():
        print("------新功能添加------")
        return func()  # 被装饰函数具有返回值,则内部函数也应有返回值
    
    return inner

@wrapper
def info():
    return "hello world!!!"

result = info()
print(result)

# 执行结果 
------新功能添加------ 
hello world!!! 
# 装饰有参数函数
def wrapper(func):
    def inner(name):
        print("------新功能添加------")
        return func(name)  # 被装饰函数具有参数,内部函数也应有参数
    
    return inner

@wrapper
def info(name):
    return "my name is %s." % name

result = info("fengdi")
print(result)

# 执行结果 
------新功能添加------ 
my name is fengdi. 
# 通用装饰器:有无参数,有无返回值,任意个参数均可
def wrapper(func):
    def inner(*args, **kwargs):
        print("------新功能添加------")
        return func(*args, **kwargs)  # 被装饰函数具有参数,内部函数也应有参数
    
    return inner
# 多个装饰器装饰一个函数
def wrapper1(func):
    print("------装饰器wrapper1开始装饰------")
    def inner():
        print("------新功能1添加------")
        return func()  # 被装饰函数具有参数,内部函数也应有参数
    
    return inner

def wrapper2(func):
    print("------装饰器wrapper2开始装饰------")
    def inner():
        print("------新功能2添加------")
        return func()  # 被装饰函数具有参数,内部函数也应有参数
    
    return inner

@wrapper1
@wrapper2
def info():
    print("hello world!")
    
print("-" * 40)
info()

# 执行结果
------装饰器wrapper2开始装饰------
------装饰器wrapper1开始装饰------
----------------------------------------
------新功能1添加------
------新功能2添加------
hello world!
# 有参数的装饰器
def outer(num):
    def wrapper(func):
        def inner():
            print("---------权限验证%d---------" % num)
            func()
        return inner
    return wrapper

@outer(1)
def test1():
    print("--------test1---------")

@outer(2)
def test2():
    print("--------test2---------")
    
test1()
test2()

# 执行结果
---------权限验证1---------
--------test1---------
---------权限验证2---------
--------test2---------

5. 偏函数

from functools import partial  

def multi(x, y): 
    return x * y  

double = partial(multi, y=2) 
print(double(2)) 
上一篇下一篇

猜你喜欢

热点阅读