学习Python(9)Pyhton函数 下

学习Python(9)Pyhton函数 下

简单装饰器

装饰器作用:

在不修改原函数的情况下,在函数调用之前和之后添加装饰(功能)
def eat():
    print("吃饭")

def run():
    print("跑步")

# def eat2():
#     print("吃饭前先跳个舞")
#     eat()
#     # run()
#     print("吃饭后唱个歌")

#
def outer(fn):
    print("先跳个舞")
    fn()
    print("再唱个歌")


outer(eat)
outer(run)


print('-' * 100)

简单装饰器

def outer2(fn):  # fn = eat2

    def inner():
        print("先跳个舞")
        fn()  # eat2()
        print("再唱个歌")

    return inner

@outer2
def eat2():
    print("吃饭2")

# 使用装饰器: 原理
eat2 = outer2(eat2)
# print(eat2.__name__)  # inner

# 调用函数
# eat2()  # inner()

案例:
写一个装饰器来统计函数运行的时间

import time

# 装饰器
def outer3(fn):
    print("fn:", fn.__name__)

    def inner():

        s = time.time()
        fn()
        e = time.time()
        print(e - s)

    return inner

@outer3
# @outer3 <=> show = outer3(show)
def show():
    s = 0
    for i in range(10000000):
        s += i
    # print(s)


# s = time.time()  # 当前时间,时间戳(秒),  1596164368.250789

print("show:", show.__name__)  # inner
show()

# e = time.time()
# print(e - s)

通用装饰器

通用装饰器

def outer(fn):

    def inner(*args, **kwargs):
        print('before')

        res = fn(*args, **kwargs)

        print('after')

        return res

    return inner


@outer
def eat():
    print("吃饭")

@outer
def sing(song):
    print("吴亦凡唱:", song)
    return "唱的好!"
    # 调用
eat()

res = sing("大碗宽面")
print("res:", res)

装饰器的使用

装饰器

def outer(fn):

    def inner(a):
        if a<0:
            a = 0

        fn(a)

    return inner


@outer
def set_age(n):
    print('n:', n)

set_age(-5)

在一个函数上使用多个装饰器

def outer1(f):
    def inner():
        print('before1')
        f()
        print('after1')
    return inner

def outer2(f):
    def inner():
        print('before2')
        f()
        print('after2')
    return inner



@outer1
@outer2
def sing():
    print("唱歌")


sing()
'''
    before1
    before2
    唱歌
    after2
    after1
'''

函数递归

函数递归: 函数内部调用自身
案例一:

'''
5!  = 5 * 4!
    = 5 * 4 * 3!
    = 5 * 4 * 3 * 2!
    = 5 * 4 * 3 * 2 * 1
'''
# 使用递归:
#   1. 找公式, 如: f(n) = n * f(n-1)
#   2. 找临界值, 如: n=1, f(1)=1
#   3. 一定要相信函数能实现

# 求n的阶乘
def fn(n):
    if n == 1:
        return 1
    return n * fn(n-1)
        #  5 * fn(4)
        #  5 * 4 * fn(3)
        #  5 * 4 * 3 * fn(2)
        #  5 * 4 * 3 * 2 * fn(1)
        #  5 * 4 * 3 * 2 * 1

print(fn(5))

案例二:

# 封装函数,传入n,得到 第n个 斐波那契数
#  	    1 1 2 3 5 8 13 21 34 55, ...
#
# 找公式: f(n) = f(n-1) + f(n-2)
# 临界值: n=1,2; f(1)=f(2)=1

def f(n):
    if n<=2:
        return 1
    return f(n-1) + f(n-2)

print(f(8))

案例三:

# 封装函数,传入n,得到 前n个 斐波那契数
#  	    1 1 2 3 5 8 13 21

def f2(n):
    for i in range(1, n+1):
        print(f(i), end=" ")

print()

f2(20)

print()
print()

案例四:

# 兔子繁殖问题。
#     设有一对新生的兔子,从第4个月开始他们每个月月初都生一对新兔子,
#     新生的兔子从第4个月开始又每个月月初生一对兔子。
#     按此规律,并假定兔子没有死亡,20个月末共有多少对兔子?

'''
        1月大兔   2月大兔   3月大兔   4月大兔(包含大于4月兔)    兔子总对数
       
第1个月    1        0        0        0                      1
第2个月    0        1        0        0                      1
第3个月    0        0        1        0                      1
第4个月    1        0        0        1                      2 = 1 + 1
第5个月    1        1        0        1                      3 = 2 + 1
第6个月    1        1        1        1                      4 = 3 + 1
第7个月    2        1        1        2                      6 = 4 + 2
第8个月    3        2        1        3                      9 = 6 + 3
第9个月    4        3        2        4                      13 = 9 + 4
第10个月   6        4        3        6                      19 = 13 + 6

f(n) = f(n-1) + f(n-3)
n=1,2,3; f(n)=1

'''

def fx(n):
    if n<=3:
        return 1
    return fx(n-1) + fx(n-3)

print(fx(10))

栈和队列

栈:

先进后出, 后进先出

列表来实现栈

stack = []

入栈

stack.append('A')
print(stack)

stack.append('B')
print(stack)

stack.append('C')
print(stack)

stack.append('D')
print(stack)

出栈

stack.pop()
print(stack)

stack.pop()
print(stack)

stack.pop()
print(stack)

stack.pop()
print(stack)

print()

队列

创建队列

from collections import deque
queue = deque()
print(queue)  # deque([])

入队列

queue.append('A')
print(queue)

queue.append('B')
print(queue)

queue.append('C')
print(queue)

queue.append('D')
print(queue)

出队列

queue.popleft()
print(queue)

queue.popleft()
print(queue)

queue.popleft()
print(queue)

queue.popleft()
print(queue)

猜你喜欢

转载自blog.csdn.net/qq_43284558/article/details/107722806