学习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)