如果我使用import
,然后出现for
,则会出现invalid syntax
错误。我不知道为什么会发生这种事。
> python3 -c 'import os; for a in range(1,5): print(a)'
File "<string>", line 1
import os; for a in range(1,5): print(a)
^
移除import
效果良好:
> python3 -c 'for a in range(1,5): print(a)'
1
2
3
4
或者完全去除for
环路:
> python3 -c 'import os; print(10)'
10
那到底发生了什么??
这是一个错误,因为它不在Python语法中。
如果你查看一下复合语句的语法规范,你会发现一个语句列表(即你用分号做的)被定义为:
stmt_list ::= simple_stmt (";" simple_stmt)* [";"]
并且for
构造不是simple_stmt
而是compound_stmt
。
然而,print(10)
是一个simple_stmt
,因此,它很好。
正如您所看到的,Python不允许将块打开语句(如for
)与其他语句放在一行中。通常,在某些情况下,您不应该在脚本中使用;
——它是唯一的解决方案(如使用-c
执行python代码的命令),但在脚本中只需使用换行符。
有关Python中编码风格标准的详细信息,您可以阅读PEP 8:http://legacy.python.org/dev/peps/pep-0008/
2022年有了python3,你可以做到这一点:
python3 -c 'import os; [print(a) for a in range(1,5)]'
将单行代码转换为多行形式,并将换行符替换为"\n〃;。然后将其作为字符串传递给exec函数:
python3 -c "exec('import osnfor a in range(1,5):n print(a)')"
虽然不优雅,但它可以在不需要脚本文件的情况下完成任务。
只是作为另一种解决方法在bash:
python3-c";导入日期时间;导入系统"$"\n’";对于范围(10)中的i:打印(i)";
Python语法确实不支持您所写的for循环,但至少您仍然可以使用理解来实现您在文章中所展示的内容:
import os; print([a for a in range(1,5)])
或者更准确地说:
import os; print("n".join([str(a) for a in range(1,5)]))