文章目录
装饰器 decorators
函数装饰器是指装饰的一个函数,传入的是一个函数,返回的也是一个函数的函数
函数装饰器的语法:def 装饰器函数名(参数):
语句块
return 函数对象
被装饰函数的语法:
@装饰器函数名
def 函数名(形参列表):
语句块
示例:
# 定义一个装饰器函数
def mydeco(fn):
def fx():
print("+++++++++")
fn()
print("---------")
return fx
# 定义函数的地方
@mydeco # 等同于myfunc = mydeco(myfunc)
def myfunc():
print("myfunc被调用")
myfunc()
myfunc()
myfunc()
装饰器的应用
假设我们一个银行业务存钱(savemoney)和取钱(withdraw),存钱和取钱的代码已经实现了,我们需要增加一个存钱和取钱发送短信的功能以及权限验证功能,这时可以在不改动源代码的情况下使用装饰器来实现。
# 银行业务:
# 存钱:savemoney
# 取钱:withdraw
# 1. 添加一个余额变动提醒的短消息功能
def messend_send(fn):
def fx(name, x):
print("发送消息:", name, "来银行办理业务")
fn(name, x)
print("发送消息:", name, "办理了", x, "元的业务")
return fx
# 2. 加一个权限验证功能的装饰器
def privileged_check(fn):
def fx(name, x):
print("正在检查权限")
if True:
fn(name, x)
return fx
def savemoney(name, x):
print(name, "存钱", x, "元")
@privileged_check
@messend_send
def withdraw(name, x):
print(name, "取钱", x, "元")
# 调用程序
savemoney("小猫猫", 200)
savemoney("小小猫", 500)
withdraw("小小猫", 300)
# 上面代码打印出以下结果:
# 小猫猫 存钱 200 元
# 小小猫 存钱 500 元
# 正在检查权限
# 发送消息: 小小猫 来银行办理业务
# 小小猫 取钱 300 元
# 发送消息: 小小猫 办理了 300 元的业务
函数文档字符串
函数内部第一个没有赋值给任何变量的字符串为文档字符串
语法:def 函数名(形参列表):
‘’‘函数的文档字符串’’’
函数语句块
示例:
def hello(a, b, c):
''' 这个函数用来测试文档字符串
用的函数:
a 代表第一个参数
b 代表第二个参数
c 代表第三个参数'''
print(a, b, c)
help(hello)
函数的 __doc__属性:__doc__属性用于绑定该函数的文档字符串
示例:
def fx(a, b):
'''这是函数的文档字符串
这是第二行'''
print("此函数fx的文档字符串是:", fx.__doc__)
fx(100, 200)
print(fx.__doc__)
f1 = fx
print(f1.__name__)
f2 = lambda x: x + 1
print(f2.__name__)
函数__name__属性:
__name__属性用于绑定函数名的字符串
示例:
def fx():
pass
f1 = fx
print(f1.__name__)
函数定义语句(def 语句的语法)
[@装饰器名1]
[@装饰器名2]
…
def 函数名([位置形参], [*[元祖形参名]], [命名关键字形参], [**字典形参]):
‘’‘文档字符串’’’
语句块
注:[]里的内容代表可省略
示例:
L = [1, 2, 3]
def f(n, lst=[]):
lst.append(n)
print(lst)
f(4, L) # [1, 2, 3, 4]
f(5, L) # [1, 2, 3, 4, 5]
f(100) # [100]
f(200) # [100, 200]
说明:
默认参数(缺省参数)绑定在函数对象内部,并随函数的生命一直存在
解决方法:
L = [1, 2, 3]
def f(n, lst=None):
if lst is None:
lst = []
lst.append(n)
print(lst)
f(4, L) # [1, 2, 3, 4]
f(5, L) # [1, 2, 3, 4, 5]
f(100) # [100]
f(200) # [200]
模块(Module)
模块是一个包含有一系列数据、函数、类等组成的程序组;
模块是一个文件,模块文件名通常以.py结尾
作用:让一些相关的数据、函数、类等有逻辑的组织在一起,是逻辑结构更加清晰。模块中的数据、函数、类等可以提供给其他模块或程序使用。
模块的分类:
(1) 内置模块(builtins):在解析器的内部可以直接使用
(2) 标准库模块:安装python时已安装且可以直接使用
(3) 第三方模块(通常为开源):需要自己安装
(4) 用户自己完成的模块(可以作为其他人的第三方模块)
模块的导入语句
import语句
语法:import 模块名1[as 模块名1][, 模块名2 as 模块名2],…
示例:
# 导入属性模块
import math
# 导入系统模块sys和os模块
import sys, os
作用:将某模块整体导入到当前模块
用法:模块.属性名
dir(obj) 函数返回模块所有属性的字符串列表
help(obj) 可以查看模块相关的文档字符串
from import 语句
语法:from 模块名 import 模块属性名1 [as 属性新名1] [, 模块属性名2 [as 属性新名2]],…
作用:将某模块内的一个或多个属性导入到当前模块的作用域
示例:
from math import pi
from math import pow, sqrt
from math import factorial as fac
from import *语句
语法:from 模块名 import *
作用:将某模块的所有属性都导入到当前模块
示例:
from math import *
math 模块
math.e # 自然对数的底e
math.pi # 圆周率pi
math.ceil(x) # 对x向上取整
math.floor(x) # 对x向下取整
math.sqrt(x) # 返回x的平方根
math.factorial(x) # 求x的阶乘
math.log(x[, base]) # 返回以base为底x的对数,如果不给出base,则以自然对数为底
math.log10(x) # 求以10为底x的对数
math.pow(x, y) # 返回x的y次方
math.degree(x) # 将弧度x转换为角度
math.radians(x) # 将角度x转换为弧度
# 三角函数
math.sin(x) # 返回x的正弦(x为弧度)
math.cos(x)
math.tan(x)
math.asin(x)
math.acos(x)
math.atan(x)
时间模块
import time
time.time() # 返回从计算机元年至当前时间的秒数的浮点数(UTC时间为准)
time.sleep(secs) # 让程序按照给定秒数睡眠
time.gmtime([secs]) # 用给定秒数转换为用UTC表达的时间元祖(缺省返回当前时间元祖)
time.asctime([tuple]) # 将时间元祖转换为日期时间字符串
time.mktime([tuple]) # 将本地日期时间元祖转换为新纪元秒数时间(UTC)
time.localtime([secs]) # 将UTC秒数时间转换为日期元祖(以本地时间为准)
dir 函数
dir([对象]) 返回一个字符串列表
作用:如果没有参数调用,则返回当前作用域内的所有变量的列表;如果给定一个对象作为参数,则返回这个对象的所有变量的列表
(1) 对于一个模块,返回这个模块的全部属性
(2) 对于一个类对象,返回类对象的所有变量,亲递归基类对象的所有变量
(3) 对于其他对象,返回所有的变量,类变量,基类变量
dir()
import math
dir()
import sys as s
dir()