【面筋】关于Python

本文详细介绍了Python中的*args和**kwargs,它们用于处理可变数量的函数参数。*args接收非键值对的参数列表,而**kwargs允许传递键值对。此外,文章还讲解了装饰器的概念和使用方法,以及Python的垃圾回收机制,包括引用计数、标记-清除和分代回收。最后,文章提到了Python的sorted函数在对字典按key和value排序中的应用,以及Python中直接赋值、浅拷贝和深拷贝的区别,以及进程、线程和协程的基本概念和应用场景。

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

【面筋】关于Python

一、什么是*args**kwargs

1.1 为什么会有 *args 和 **kwargs?

对于一些编写的函数,可能预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。

1.2 *args 和 **kwargs 的用途是什么?

*args 和 **kwargs 主要用于函数定义。 你可以将不定数量的参数传递给一个函数;

1.3 *args 是什么?

  • 介绍:用来发送一个非键值对的可变数量的参数列表给一个函数;
  • 举例
def test_var_args(f_arg, *argv):
    print("first normal arg:", f_arg)
    for arg in argv:
        print("another arg through *argv:", arg)

test_var_args('yasoob', 'python', 'eggs', 'test')

# output
first normal arg: yasoob
another arg through *argv: python
another arg through *argv: eggs
another arg through *argv: test

1.4 **kwargs是什么?

  • 介绍:允许你将不定长度的键值对, 作为参数传递给一个函数。 如果你想要在一个函数里处理带名字的参数, 你应该使用kwargs;
  • **dict 可以用提取字典的键和值;
  • 举例:
def greet_me(**kwargs):
    for key, value in kwargs.items():
        print("{0} == {1}".format(key, value))

# output
>>> greet_me(name="yasoob")
name == yasoob

1.5 *args 与 **kwargs 的区别是什么?

def test_args_kwargs(arg1, arg2, arg3):
    print("arg1:", arg1)
    print("arg2:", arg2)
    print("arg3:", arg3)

使用 *args

>>> args = ("two", 3, 5)
>>> test_args_kwargs(*args)
arg1: two
arg2: 3
arg3: 5

使用 **kwargs

>>> kwargs = {"arg3": 3, "arg2": "two", "arg1": 5}
>>> test_args_kwargs(**kwargs)
arg1: 5
arg2: two
arg3: 3

二、什么是装饰器?

2.1 装饰器是什么?

  • 装饰器本质:一个 Python 函数或类;
  • 作用:可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,装饰器的返回值也是一个函数/类对象。
  • 使用场景:经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景,装饰器是解决这类问题的绝佳设计。
  • 优点:有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码到装饰器中并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能

2.2 装饰器怎么用?

简单装饰器

def use_logging(func):

    def wrapper():
        logging.warn("%s is running" % func.__name__)
        return func()   # 把 foo 当做参数传递进来时,执行func()就相当于执行foo()
    return wrapper

def foo():
    print('i am foo')

foo = use_logging(foo)  # 因为装饰器 use_logging(foo) 返回的时函数对象 wrapper,这条语句相当于  foo = wrapper
foo()                   # 执行foo()就相当于执行 wrapper()

@ 语法糖

def use_logging(func):

    def wrapper():
        logging.warn("%s is running" % func.__name__)
        return func()
    return wrapper

@use_logging
def foo():
    print("i am foo")

foo()

带参数的装饰器

# 功能:加载数据
def loadData(filename):
    '''
        功能:加载数据
        input:
            filename   String 文件名称 
        return:
            data       List    数据列表
    '''
    data = []
    with open(filename,"r",encoding="utf-8") as f:
        line = f.readline().replace("\n","")
        while line:
            data.append(line)
            line = f.readline().replace("\n","")
    return data

# 功能:装饰器 之 数据采样
def simpleData(func):
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值