【学习笔记】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() 等。

posted @   没学完四大礼包不改名  阅读(120)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示