【学习笔记】Python 语法糖
https://blog.csdn.net/oYeZhou/article/details/138145504
Python语法糖是指一种编程语言的语法特性,它使得代码更加易读、简洁、优雅,但并不影响语言的功能和性能。语法糖不是必须的,但可以使代码更具可读性和易用性。
Python中有很多语法糖,比如列表推导式、字典推导式、装饰器、with语句、lambda函数等。这些语法糖使得代码更加简洁,同时也提高了开发效率。
-
Decorator 装饰器
装饰器是 Python 中一种非常强大的语法特性,它允许你在不改变函数代码的情况下,动态地增加功能。装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数。下面是 Python 装饰器的基本语法:
def decorator_function(original_function): def wrapper_function(*args, **kwargs): # 在调用原始函数之前的任何操作 print("Do something before the original function") result = original_function(*args, **kwargs) # 调用原始函数 # 在调用原始函数之后的任何操作 print("Do something after the original function") return result return wrapper_function @decorator_function def some_function(): print("Original function") some_function()
这段代码中,
decorator_function
是一个装饰器函数,它接受一个原始函数original_function
作为参数,并返回一个内部函数wrapper_function
。在wrapper_function
内部,我们可以添加一些额外的功能,然后调用原始函数。@decorator_function
这行代码就是应用装饰器的语法糖。它等同于some_function = decorator_function(some_function)
,它告诉 Python 使用decorator_function
来装饰some_function
。当你调用
some_function()
时,实际上是调用了wrapper_function()
,而wrapper_function()
又会调用原始的some_function()
,并且在调用前后做一些额外的事情。装饰器也可以带参数,这样就可以根据不同的参数定制装饰器的行为。
上面的内容是关于函数装饰的,我们还有类装饰的语法。
类装饰器与函数装饰器类似,但它是通过类来实现的。类装饰器是一个实现了
__call__
方法的类,该方法接受一个函数作为参数,并返回一个新的函数或者修改原始函数。下面是一个简单的示例:class DecoratorClass: def __init__(self, original_function): self.original_function = original_function def __call__(self, *args, **kwargs): # 在调用原始函数之前的任何操作 print("Do something before the original function") result = self.original_function(*args, **kwargs) # 调用原始函数 # 在调用原始函数之后的任何操作 print("Do something after the original function") return result @DecoratorClass def some_function(): print("Original function") some_function()
在这个例子中,
DecoratorClass
是一个类装饰器,它接受一个原始函数original_function
并保存它。当实例化DecoratorClass
类时,Python 会调用其__call__
方法,因此我们可以在__call__
方法中定义装饰器的行为。当调用
some_function()
时,实际上会调用DecoratorClass
的__call__
方法,该方法会在调用原始函数之前和之后打印一些内容。类装饰器也可以带参数。在这种情况下,类装饰器应该返回一个可调用的对象,通常是一个函数或者实现了
__call__
方法的类。
除了单个装饰器的情况,还有多个装饰器的顺序问题。
在 Python 中,装饰器的顺序是从上到下的。当你使用多个装饰器来装饰一个函数时,装饰器的执行顺序与它们在函数定义上的顺序相反。
例如,考虑以下装饰器的顺序:
@decorator1 @decorator2 def some_function(): pass
实际上相当于:
some_function = decorator1(decorator2(some_function))
这意味着
decorator2
先应用于some_function
,然后是decorator1
。因此,如果你有多个装饰器,你需要考虑它们的执行顺序是否影响最终的行为。
-
enumerate
方法:在遍历某个可遍历结构时,我们可以通过
enumerate
来获得当前元素的位次。for i,data in datas: pass
-
解构赋值
x,y = 1,2
-
推导式
[f(x) for x in list] {f(x) for x in list} {f(x):g(x) for x in list}
分别表示通过
list
里面的x
创建新的列表,集合,映射表推导式也可以继续加条件,例如:
[f(x) for x in list if condition]
-
条件表达式压行,或者类似 c++ 三目运算符
x = y if condition1 else z
-
zip
可以将两个列表同时遍历,暂时不清楚如果两个列表不一样长会有什么问题。
for x,y in zip(a,b): pass
-
链式比较
在线段树中,我们需要判断
ql<=l && r<=qr
,python 中我们直接写ql<=l<=r<=qr
即可。我们默认区间都合法。 -
原始字符串
忽略转义字符 如
\n
,一个例子是str = r"Hello,World!\n"
-
可变(关键字)参数
当你在 Python 中定义函数时,有时候你可能不确定函数会接收多少个参数,或者你希望函数能够处理不同名字的参数。这时,就可以使用
*args
和**kwargs
。*args
:是用来传递一个非键值对的可变数量的参数列表给函数。它允许你传递任意数量的参数给函数。在函数内部,这些参数会被视为一个元组(tuple)。
def my_function(*args): for arg in args: print(arg) my_function('apple', 'banana', 'orange')
**kwargs
:用于传递一个字典(dictionary)作为函数的参数。它允许你传递任意数量的关键字参数给函数。
def my_function(**kwargs): for key, value in kwargs.items(): print(f"{key}: {value}") my_function(fruit='apple', vegetable='carrot', meat='chicken')
你也可以同时使用
*args
和**kwargs
:def my_function(*args, **kwargs): for arg in args: print(arg) for key, value in kwargs.items(): print(f"{key}: {value}") my_function('apple', 'banana', fruit='orange', vegetable='carrot')
这种灵活性使得函数能够接收不定数量和不同类型的参数,增加了函数的通用性和可扩展性。
-
内建函数:如 len(), range(), min(), max(), sum() 等。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律