【面筋】关于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):