python 学习笔记四

本文深入探讨Python装饰器的概念及应用,包括如何利用装饰器增强函数功能而不修改其源代码,以及模块的使用和导入方式。同时,文章还讲解了函数文档字符串、函数定义语句、数学和时间模块的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

装饰器 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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值