Python 不带for块的单线函数调用?
在Python中,是否可以通过iterable对函数进行单行调用 背景: 假设我想在目录列表中创建一个子目录。传统上,我会使用列表理解来构建所需子目录路径的列表:Python 不带for块的单线函数调用?,python,python-3.x,Python,Python 3.x,在Python中,是否可以通过iterable对函数进行单行调用 背景: 假设我想在目录列表中创建一个子目录。传统上,我会使用列表理解来构建所需子目录路径的列表: subs=[os.path.join(root,“sub”)表示根中的根] 其中root是目录列表。然后,我必须为块创建一个,以调用os.mkdir(): 问题: 是否可以使用发电机来实现这一点 我试过: os.mkdir(os.path.join(root,“sub”)表示根中的根) 但是它抛出一个类型错误,表示不接受生成器。是的,
subs=[os.path.join(root,“sub”)表示根中的根]
其中root
是目录列表。然后,我必须为块创建一个,以调用os.mkdir()
:
问题:
是否可以使用发电机来实现这一点
我试过:
os.mkdir(os.path.join(root,“sub”)表示根中的根)
但是它抛出一个类型错误
,表示不接受生成器。是的,您可以执行以下操作:
[os.mkdir(os.path.join(root, "sub")) for root in roots]
这是因为即使不将列表的结果分配到任何地方,也会执行列表理解。os.mkdir
调用将返回None
,因此结果将是一个None
s的列表(您不需要关心这些),但函数会产生效果
现在,这一点还是有争议的:
for root in roots:
os.mkdir(os.path.join(root, "sub"))
甚至:
for root in roots: os.mkdir(os.path.join(root, "sub"))
更具可读性,因为人们通常期望列表理解生成列表和循环以执行操作,因此,例如,如果在理解中查看代码,则很容易忽略实际上正在创建文件夹。但是如果您愿意,您可以。您可以将循环重写为列表。但你真的不应该。因为你不想创建一个新的列表。您正在尝试在循环中执行命令。这就是正常的for
语句的作用。单行:for subs中的sub:os.mkdir(sub)
@AshwiniChaudhary不能解决问题。在执行之前,仍然需要创建subs
,我正在尝试不创建另一个列表对象。然后执行:对于sub-in(os.path.join(root),“sub”)对于root-in-root:os.mkdir(sub)
。我不知道我可以使用列表理解来实现这一点。很高兴知道。虽然for
块是传统的,但它只是从程序中删除额外的行来构建列表,然后为每个列表创建后续的for
循环。宁愿使用带有视图#
注释的单行程序来解释。@datta如果您要为这些简单的东西添加注释,那么您就做错了。for循环更明显,不需要任何解释。我真的不喜欢专门为产生副作用而编写的列表理解。我的两分钱。
for root in roots: os.mkdir(os.path.join(root, "sub"))