BNF是巴科斯范式, 是一种用递归的思想来表述计算机语言符号集的定义规范,在我的基础教程中,对if语句的语法进行了详细的讲解,虽然说了人话,但终究是缺少了技术研究所需要的严谨与规范。如果你认为自己理解能力很强,那么可以尝试阅读本文,将有更大的收获。
在python官方文档 中,if语句的BNF描述如下:
if_stmt ::= "if" expression ":" suite
("elif" expression ":" suite)*
["else" ":" suite]
不了解BNF语法没有关系,这东西其实很简单,我来解读这段内容:
上面这段,采用文字描述,普通人大概率可以看得懂,但是不免繁琐冗长,BNF语法并不复杂,看过我的解释,你用这种元语言来理解python的if语句的语法,是不是更加清晰一些呢?
那么学习这个东西有什么用呢?
我的观点是,学习编程技术,如果你的目的性太强,总想着一步到位知晓答案,那么一定无法做到精纯。精纯的前提是博而广,打下这个基础,才能向精而专方向发展。
关于这个suite,我考虑再三,还是在这篇教程里加以说明
compound_stmt ::= if_stmt
| while_stmt
| for_stmt
| try_stmt
| with_stmt
| funcdef
| classdef
| async_with_stmt
| async_for_stmt
| async_funcdef
suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement ::= stmt_list NEWLINE | compound_stmt
stmt_list ::= simple_stmt (";" simple_stmt)* [";"]
分析到这里,simple_stmt是最后的关键
simple_stmt ::= expression_stmt
| assert_stmt
| assignment_stmt
| augmented_assignment_stmt
| annotated_assignment_stmt
| pass_stmt
| del_stmt
| return_stmt
| yield_stmt
| raise_stmt
| break_stmt
| continue_stmt
| import_stmt
| future_stmt
| global_stmt
| nonlocal_stmt
simple_stmt 都是最简单的语句,比如赋值语句,pass, break, import , continue
if 语句的冒号后面,是一个suite, 看suite的定义,stmt_list 可以和if在同一行,而不需要重新起一行的,验证一下
if 32 > 2: print('ok')
上面的代码虽然丑陋且不符合python的提倡,但它的确合法。
根据stmt_list 的定义,多条语句可以写在同一行,只需要用分号分隔开就好了,那么下面的代码也是合法的
a = 3; b=4 ; print(a, b)
QQ交流群: 211426309