python装饰器@语法介绍及作用和用途?
介绍
装饰器@语法是python的一种特殊的语法,它可以让我们更方便地修改函数、方法(以及可能的类)的行为,而不需要显式地修改它们。它支持更可读的装饰器模式(DecoratorPattern)的应用,也支持其他的用途。
用途和作用
装饰器的作用是在不改变原函数定义和调用方式的情况下,给原函数增加一些额外的功能。这些功能通常和原函数的逻辑无关,而是和一些通用的需求有关,例如日志记录、性能测试、缓存、权限验证等。
装饰器的用途是实现一种高阶函数(higher-order function),即一个接受函数作为参数并返回一个新函数的函数。这样可以让我们把一些通用的功能封装在装饰器函数中,然后通过@语法来应用到不同的原函数上,实现代码的复用和解耦。
python中有一些内置的装饰器,例如@property、@classmethod、@staticmethod等,它们可以让我们更方便地定义类属性、类方法和静态方法。
python中也可以自定义装饰器,只需要定义一个接受函数作为参数并返回一个新函数的函数,并在新函数中调用原函数并添加一些额外的功能即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
from time import time
# 这是一个装饰器函数
def timer(func):
def wrapper():
start = time()
func()
end = time()
print(f"{func.__name__}运行时间:{end - start}")
return wrapper
# 使用装饰器
@timer
def foo():
print("foo函数运行中...")
for i in range(10000):
i ** 2
foo()
|
简述join() 和 split() 方法?
介绍
1. join()方法
- 作用:用指定的字符串连接序列中的元素,并返回连接后的新字符串。
- 语法:‘分隔符’.join(sequence)
- sequence可以是列表,元组,集合,字典等
2. split()方法:
- 作用:用指定的分隔符对字符串进行切片,并返回切片后的子字符串组成的列表。
- 语法:字符串.split(分隔符)
示例
1
2
3
4
5
6
7
8
9
10
11
|
result = []
temp = ""
twitter = ["0_7_15_0_14_7_21", "-13_11_15", "-13_11_20", "-14_27"]
# x是字符串
for x in twitter:
# 不能使用twitter[x], 报错list indices must be integers or slices not str
numbers = x.split('_')
for y in numbers:
temp += chr(90 + int(y))
result.append(temp)
|
python变量前&和*符号的作用?
&符号用于传递变量的引用。
在funcA(argA, &argB)的调用中,argB必须是一个变量,&表示传入argB的引用而不是值。在funcA内部,对argB的修改将影响到外部的argB变量。
1
2
3
4
5
6
7
|
def funcA(a, &b):
print(a, b)
b = 20 # 修改b的值
b = 10
funcA(1, b)
print(b) # 输出20
|
*符号用于接收不定长的参数。
在funcB(argA, *argB)的调用中,*argB允许你传入0个或多个参数,这些参数被组装成一个tuple赋值给参数argB。
1
2
3
4
5
|
def funcB(a, *b):
print(a, b)
funcB(1) # 1 ()
funcB(1, 2, 3) # 1 (2, 3)
|
所以简单来说:
c++中类名后的*、&和~符号的作用?
* 代表指针,表示一个指向该类型的指针变量。
1
2
|
// observer是一个指向observer类类型的指针。
observer* observer
|
& 代表引用,表示一个对该类型的引用。
1
2
3
4
5
6
7
8
9
10
11
|
// enity是一个对Entity类型的常引用。
// const关键字的作用是使该引用enity成为一个常量引用,无法通过它来修改所引用的对象。
// 具体来说:
// - Entity& 表示这是一个对Entity对象的引用。
// - const修饰这个引用,使得它成为一个常引用,无法通过它来修改所引用的对象。
// 这样做的好处是:
// 1. 避免通过引用意外修改对象,增强程序健壮性。
// 2. 可以让编译器进行优化,如果函数不修改引用指向的对象,那编译器可以进行一些性能优化。
// 3. 对于类成员,可以在声明时使其成为常引用,防止修改。
// 所以,const的作用是使引用及指针无法修改所指向的对象,起到一个保护对象不被修改的作用
const Entity& enity
|
~ 代表析构函数,它会在类的对象销毁时执行。
1
2
3
4
5
6
|
// 定义一个virtual析构可以让子类正确执行析构。
// 所以在C++中,正确使用指针、引用和析构函数对类的设计非常重要。
// 指针用于传递对象地址,提高效率;引用用于避免复制,节省空间;析构用于释放资源。
virtual ~Entity() {
// 析构函数代码
}
|
python中闭包和垃圾回收机制
闭包
Python中一般通过嵌套函数实现闭包,内部函数可以访问外部函数的变量:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
def outer():
x = 1
def inner():
print(x)
return inner
closure = outer()
closure() # 输出1
# inner函数封闭保存了outer函数的x,所以inner就是一个闭包。
# 我们也可以通过lambda表达式创建闭包:
y = 2
closure = lambda: print(y)
|
垃圾回收
Python与PHP都是使用引用计数进行自动垃圾回收。当一个对象的引用计数降为0时,会被自动回收。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import sys
# Python还可以通过gc模块手动触发垃圾回收。
a = Object()
print(sys.getrefcount(a)) # 2
b = a
print(sys.getrefcount(a)) # 3
del b
print(sys.getrefcount(a)) # 2
del a
# a自动被回收
|
面向对象变成常见继承关系和关键字作用?详细讲解面向切面编程
面向对象
公有继承,子类继承父类所有公开属性和方法:
1
2
3
4
5
6
7
|
class Parent:
def public_method(self):
pass
class Child(Parent):
# 可以访问public_method
pass
|
保护继承,子类只继承保护(单下划线)和公有属性/方法:
1
2
3
4
5
6
|
class Parent:
def _protected_method(self):
pass
class Child(Parent):
# 只可以访问public_method
|
面向切面编程
Python中可以通过装饰器实现AOP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
from functools import wraps
# 这里log装饰器在不修改add函数的情况下,为其添加了日志打印功能。
def log(func):
@wraps(func)
def wrapper(*args, **kwargs):
print(f"Call {func.__name__}")
return func(*args, **kwargs)
return wrapper
@log
def add(x, y):
return x + y
add(2, 3)
# 打印:
# Call add
# 5
|
python连接存储数据DB的主流方式介绍。
使用数据库接口模块:Python内置了MySQLdb、psycopg2等模块,可以很方便的连接MySQL、PostgreSQL等数据库。
1
2
3
4
5
|
import MySQLdb
conn = MySQLdb.connect(host='localhost', user='root', passwd='123456', db='test')
cur = conn.cursor()
cur.execute('select * from tb_user')
|
使用ORM框架:如SqlAlchemy、Django ORM等,可以实现对象关系映射,通过面向对象的方式操作数据库,不需要写SQL语句。
1
2
3
4
5
6
7
8
9
10
|
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
name = Column(String)
|
使用NoSQL数据库:如MongoDB、Redis等,用Key-Value或者文档形式存储,通过官方或第三方提供的驱动连接。
1
2
3
4
5
|
import pymongo
client = pymongo.MongoClient(host='localhost', port=27017)
db = client['testdb']
col = db['user']
|
社经新闻
- 财政部公布2023年上半年财政收支情况,其中社会保障和就业支出21791亿元,同比增长7.9%,主要用于养老、医疗、失业、工伤等保险基金转移支付,以及实施就业扶贫、稳岗返还等政策。
- 国家统计局发布6月份国民经济运行情况,其中全国居民消费价格同比上涨1.1%,环比下降0.4%;工业生产者出厂价格同比上涨8.8%,环比上涨0.3%;工业生产者购进价格同比上涨12.5%,环比上涨0.8%。
- 国家统计局发布6月份国民经济运行情况,其中全国城镇调查失业率为5.0%,同比下降0.7个百分点,环比下降0.1个百分点;全国城镇登记失业率为3.5%,持平于上年同期。
- 国家统计局发布6月份国民经济运行情况,其中全国房地产开发投资71154亿元,同比增长15%,增速比1-5月份回落1.4个百分点;商品房销售面积8亿平方米,同比增长27.7%,增速比1-5月份回落2个百分点;商品房销售额88555亿元,同比增长36.3%,增速比1-5月份回落2个百分点。
- 中国在酒泉卫星发射中心用长征二号丁运载火箭,成功将高分十三号卫星送入预定轨道。高分十三号卫星是一颗高分辨率对地观测卫星,主要用于国土普查、城市规划、土地确权、路网设计、农作物估产和防灾减灾等领域。
- 中国科学家在量子计算领域取得重大突破,实现了光量子计算机的超越经典计算能力。该光量子计算机采用了光学波导芯片,能够实现66个光量子比特的可控操作,完成了一项复杂的线性代数问题,耗时约200秒,而最快的经典超级计算机需要2.5亿年才能完成。这是继去年中国科学家实现超导量子计算机的超越经典计算能力后,又一次在量子计算领域的重大突破。
- 中国人民银行发布6月份全国金融统计数据报告,其中全国人民币贷款增加22100亿元,同比多增111亿元;社会融资规模增加35700亿元,同比多增11100亿元;人民币广义货币(M2)余额231.95万亿元,同比增长8.6%,增速比上月末低0.3个百分点。
- 国家外汇管理局发布6月份全国外汇储备规模为32167亿美元,较5月份增加230亿美元,增幅为0.72%。国家外汇管理局表示,6月份外汇储备规模变动主要受到汇率和资产价格变化等因素的影响。
- 中国人民银行发布6月份全国银行间同业拆借市场运行情况,其中银行间同业拆借加权平均利率为2.14%,较上月下降0.01个百分点;银行间质押式回购加权平均利率为2.17%,较上月下降0.01个百分点;银行间协议式回购加权平均利率为2.16%,较上月下降0.02个百分点。