Python的一些我没见过的用法,写一篇博客记录一下。
字典
kwargs
在 Python 中,kwargs
是一个通常用于表示关键字参数的字典。它通常在函数定义中用于接收传递给函数的任意数量的关键字参数。
当在函数调用时,使用关键字参数传递参数给函数时,这些关键字参数会被收集到一个字典中,并传递给函数内部。这个字典的名称通常被称为 kwargs
(keyword arguments 的缩写)。
在函数定义中,**kwargs
的语法用于接收这些关键字参数,并将它们收集到一个字典中。这个字典中的键是参数的名称,值是传递给函数的对应参数的值。
例如,以下是一个使用了 kwargs
的函数定义的示例:
def example_function(**kwargs):for key, value in kwargs.items():print(f"{key}: {value}")# 调用函数并传递关键字参数
example_function(a=1, b=2, c=3)
在这个示例中,**kwargs
表示接收任意数量的关键字参数,并将它们收集到一个字典中。当调用 example_function()
函数并传递关键字参数时,这些参数会被收集到 kwargs
字典中,并在函数内部使用。
get方法
以该代码为例:
ema = kwargs.get('ema', None)
在给定的代码中,kwargs.get('ema', None)
是 Python 中的字典方法 get() 的使用示例。
get() 方法用于从字典中获取指定键的值,并在指定键不存在时返回默认值。
具体来说,kwargs.get('ema', None)
的作用是从 kwargs 字典中获取键为 ‘ema’ 的值,如果该键存在,则返回对应的值;如果该键不存在,则返回 None。
这种用法常用于处理函数参数中的可选项,如果调用者没有提供特定的参数,则使用默认值。在给定的代码中,ema 变量将被赋值为 ‘ema’ 参数的值,如果 ‘ema’ 参数不存在,则 ema 变量将被赋值为 None。
遍历
遍历字典
在 Python 中,遍历字典有多种方法,常用的包括使用 for 循环、字典的 items() 方法和字典的 keys() 方法。下面分别介绍这些方法:
使用 for 循环:
my_dict = {'a': 1, 'b': 2, 'c': 3}
for key in my_dict:print(key, my_dict[key])
在这个示例中,for 循环遍历字典 my_dict 中的每个键,然后可以通过键获取对应的值。
使用字典的 items() 方法:
my_dict = {'a': 1, 'b': 2, 'c': 3}for key, value in my_dict.items():print(key, value)
在这个示例中,items() 方法返回字典中的键值对,for 循环可以同时遍历键和值。
使用字典的 keys() 方法:
my_dict = {'a': 1, 'b': 2, 'c': 3}for key in my_dict.keys():print(key, my_dict[key])
在这个示例中,keys() 方法返回字典中的键,for 循环遍历键,并通过键获取对应的值。
通常推荐使用 items() 方法,因为它能够同时获取键和值,具有更高的效率。
两种方式是等价的
即:my_dict.items() 和 dict.items(my_dict)
列表生成式
列表生成式是一种简洁而强大的语法,用于根据一定规则快速生成列表。它的基本语法如下:
[expression for item in iterable]
其中:
expression 是对每个迭代元素进行操作的表达式,可以是任何合法的 Python 表达式。
item 是迭代过程中的每个元素,可以在表达式中使用。
iterable 是可迭代对象,可以是列表、元组、集合、字典等。
列表生成式还可以包含条件语句,使其具有更强的灵活性,其一般形式如下:
[expression for item in iterable if condition]
其中:
condition 是一个布尔表达式,用于过滤迭代元素。只有满足条件的元素才会被包含在生成的列表中。
举个例子,以下列表生成式生成一个包含 1 到 10 中每个整数的平方的列表:
squares = [x**2 for x in range(1, 11)]
这个列表生成式的含义是,在 1 到 10 的范围内遍历每个整数 x,对每个整数求平方,并将结果组成一个新的列表。其效果与以下的 for 循环等价:
squares = []
for x in range(1, 11):squares.append(x**2)
列表生成式的语法简洁明了,通常用于替代普通的 for 循环。
字典生成式
Python 中也有字典生成式,它与列表生成式类似,用于快速创建字典。字典生成式的基本语法如下:
{key_expression: value_expression for item in iterable}
其中:
key_expression 是对每个迭代元素生成字典键的表达式。
value_expression 是对每个迭代元素生成字典值的表达式。
item 是迭代过程中的每个元素,可以在表达式中使用。
iterable 是可迭代对象,可以是列表、元组、集合等。
字典生成式还可以包含条件语句,其一般形式如下:
{key_expression: value_expression for item in iterable if condition}
其中:
condition 是一个布尔表达式,用于过滤迭代元素。只有满足条件的元素才会被包含在生成的字典中。
举个例子,以下字典生成式生成一个包含 1 到 5 中每个整数及其平方的键值对字典:
squares_dict = {x: x**2 for x in range(1, 6)}
这个字典生成式的含义是,在 1 到 5 的范围内遍历每个整数 x,对每个整数分别求平方,并将结果作为值,整数本身作为键,组成一个新的字典。其效果与以下的 for 循环等价:
squares_dict = {}
for x in range(1, 6):squares_dict[x] = x**2
字典生成式与列表生成式一样,也是一种简洁而强大的语法,可以大大简化代码,提高代码的可读性和简洁性。
在一些情况下,字典生成式和列表生成式可以套用:
targets = [{k: v.to(device) for k, v in t.items()} for t in targets]
一些操作
解包操作符
有如下代码
log_stats = {**{f'train_{k}': v for k, v in train_stats.items()},**{f'test_{k}': v for k, v in test_stats.items()},'epoch': epoch,'n_parameters': n_parameters}
这里两个*代表的是解包操作符,在给定的代码中,log_stats 是一个字典,通过两个解包操作符,将多个字典的键值对解包并合并到 log_stats 字典中。
具体来说,{f'train_{k}': v for k, v in train_stats.items()}
和 {f'test_{k}': v for k, v in test_stats.items()}
是字典推导式,用于生成新的字典,其中每个键是原始字典中的键加上前缀 “train_” 或 “test_”,对应的值保持不变。
通过使用 ** 解包操作符,将这两个字典的键值对解包,并合并到 log_stats 字典中。这样做可以更方便地将多个字典合并成一个字典,并且能够避免创建额外的中间字典。
综上所述,这里的两个 ** 解包操作符用于将两个字典的键值对解包并合并到 log_stats 字典中,以便记录训练和测试的统计信息,以及其他一些信息,如 epoch 数和模型参数数量。