
2.7 Python中的条件语句和循环语句
编程与生活息息相关,如红灯停、绿灯行就是条件语句。条件语句和循环语句在量化交易中很常用,如图2.1所示。策略是否可以根据行情实时变化发现潜在的交易机会,取决于它在循环语句中重复的判断交易信号是否成立。之所以会自动下单交易,是因为它可以根据条件语句执行下单动作。

图2.1 条件语句和循环语句
2.7.1 条件语句
计算机在执行代码时,会按照从上到下的顺序逐行执行。但很多时候按顺序执行代码有很大的局限性。假如有一个策略逻辑是只有在均线金叉时才能买入,这时就需要用到if条件语句了。if条件语句的逻辑示意图如图2.2所示。

图2.2 if条件语句的逻辑示意图
if条件语句属于选择结构,它就像一个开关,首先对条件进行判断,然后根据判断结果执行不同的代码。这个条件可以是单一的值,也可以是由运算符组成的表达式,只要这个条件能得到一个值,if条件语句都能判断它是否成立。如果条件成立,则会执行if语句中的代码块,否则会跳过if语句。示例代码如下:

输出结果如下:

在通常情况下,if语句和else语句可以组合成if...else条件语句。如果条件成立,那么执行if语句中的代码块,跳过else语句中的代码块;如果条件不成立,那么跳过if语句中的代码块,执行else语句中的代码块。if…else条件语句的逻辑示意图如图2.3所示。

图2.3 if…else条件语句的逻辑示意图
示例代码如下:


输出结果如下:

还有一种if…elif…else形式的条件语句,这种条件语句会依次判断表达式的值,如果某个表达式的值为真,则执行对应的代码块;如果所有的表达式均为假,则执行else语句中的代码块。if…elif…else条件语句的逻辑示意图如图2.4所示。

图2.4 if…elif…else条件语句的逻辑示意图
示例代码如下:

输出结果如下:

条件语句可以嵌套使用。在嵌套条件语句中,可以将if...elif...else条件语句嵌套在另一个if...elif...else条件语句中。示例代码如下:


输出结果如下:

在上述代码中,首先定义了一个字典变量,然后使用if语句判断字典变量中age元素的值,由于字典变量中age元素的值是18,因此if语句和elif语句中的代码块都不会被执行,转而执行else语句中的代码块。
2.7.2 循环语句
循环是让计算机重复做某件事情。Python提供了两种循环语句,分别是for循环语句和while循环语句。for循环语句通常用于表示有限次数的循环。while循环语句通常用于表示不定次数的循环,在某些条件触发后退出循环。循环语句的逻辑示意图如图2.5所示。

图2.5 循环语句的逻辑示意图
for通常用于遍历数量有限的数据(如字符串、列表、字典等)或处理有限的任务。例如,使用for循环语句将一个字符串中的所有字符逐个打印出来,示例代码如下:

输出结果如下:

如果数据是无限的,或者需要处理无限重复的任务,则可以使用while循环语句。while循环语句在每次开始循环前,都会先判断条件语句是否为真,如果条件语句为真,那么执行循环体内的代码块。示例代码如下:

输出结果如下:

在上述代码中,首先定义了一个变量a并将其赋值为0,然后使用while循环语句,其条件是a>100,也就是说,如果a>100,就重复执行循环体内的代码块,每一次循环都将a的值加1,直到a=100,循环结束。
2.7.3 break语句
break语句是循环语句的搭档,当循环语句中出现break语句时,循环会立刻终止。如果是双层循环语句,那么break语句只会终止当前循环。示例代码如下:

输出结果如下:

在上述代码中,使用了两个for循环语句,分别用于遍历列表变量arr1和arr2,在遍历列表变量arr2时遇到了break语句,就跳出了当前的for循环,所以列表变量arr2中的第2~4个元素("b"、"c"和"d")都不会被打印出来,但是列表变量arr1中的元素都被打印了出来,说明break语句只是跳出了循环for j in arr2。
2.7.4 continue语句
continue语句与break语句类似,和break语句不同的是,continue语句不是终止整个循环,而是跳过本次循环,并且强制执行下一次循环。示例代码如下:

输出结果如下:

在上面的输出结果中,字符串"c"没有被打印出来。因为在循环体内使用if语句判断i=="c"时执行了continue语句,所以跳过了当前循环,并未执行后面的Log(i)代码,直接执行了下一次循环。continue语句和break语句类似,只能作用于当前循环,不影响外层循环(如果有的话)。