杂说.

函数与控制流这部分的内容相当庞大,它们本来是可以分开介绍的。但因为流程控制语句也涉及到程序执行代码的跳转,所以权衡之下,将函数与控制流放在一起。Python的流程控制语句和C以及Java大同小异,事实上几乎所有的高级语言都是这样设置自己的流程控制语句。而对于函数部分,Python则显得“花里胡哨”,至少我从一个惯用C++的人角度来看是这样的。Python允许函数的嵌套定义,和Pascal一样,这就让人很头疼,因为函数的定义无法一眼找到。C语言不允许函数的嵌套定义,也就是说你不可以在函数A的函数体中定义另一个函数B。如果我们用一棵树来表示函数之间相互的定义关系,那么C语言就是“普天之下皆兄弟”,大家自己定义自己,谁也别想当谁的爸爸 。而C++由于既支持C语言的语法,又引入了面向对象,所以它一方面秉持着“普天之下皆兄弟”的祖传准则,一方面又有着class定义块中public、private的函数访问权限设置。但有一点可以确定,在class定义块中的函数定义也是不可以嵌套的。Java是纯面向对象的语言,所有的东西都得放在class中,而在class块中,Java和C++统一阵线拒绝嵌套定义,所以我们完全可以说Java不允许函数的嵌套定义。当然了,对于lambda函数而言,我们不认为它属于传统意义上的函数定义,否则C++代码在main()里面写一个lambda函数也能叫嵌套定义了不成?最后是我们的主角Python,Python的代码组织格式很像C++,它既可以面向对象编程,也可以面向过程一句一句写,不过Python没有C/C++中所谓的main()函数作为程序入口,当然最重要的,Python支持函数的嵌套定义!

流程控制语句.

流程控制语句这部分,掌握了一门高级语言的人就可以说是掌握了所有高级语言的流程控制语句。我们主要介绍三种流程控制语句:

  1. if-elif-else的条件判断语句
  2. while条件循环语句
  3. for遍历循环语句

以及在这三种语句中起到辅助作用的break、continue语句。

1.if语句.

if语句用于条件判断,它可以有多种组合形式,关于if语句的逻辑形式就不再多说了,我们直接给出一段代码:

a=eval(input("Enter an integer:\n"))

if a>=5:
    print("a>=5")
else:
    print("a<5")

因为使用的是Python在线编程,没有控制台来进行输入,我给的输入数据是8,程序运行时会自动读入,所以这段代码的运行结果如下

coppeliasim 用python控制 python control c_Python


除了if-else这种语句结构之外,还有着if-elif-else以及if-elif,其实都大同小异,只要搞清楚了流程控制的本质是根据判断表达式的真值执行不同的代码语句,这部分并不难理解,我们再给出一段代码:

a=eval(input("Enter an integer:\n"))

if a>=5:
    print("a>=5")
elif a>=10:
    print("a>=10")
elif a>=20:
    print("a>=20")
else:
    print(a)

coppeliasim 用python控制 python control c_流程控制语句_02


这次运行我给定的输入是99,但我们看到输出结果是a>=5,并不是我们希望看到的最精确的结果a>=20,问题出在if语句块的判断逻辑设置,第一次判断的表达式是下面所有表达式的超集,所以它一旦符合,就不会再看下面的判断式,从而直接输出a>=5并且跳出if语句块了,这也能看出if语句是一种多选一的流程控制语句。修改之后的代码如下,其实只是调换了判断逻辑的顺序。

a=eval(input("Enter an integer:\n"))

if a>=20:
    print("a>=20")
elif a>=10:
    print("a>=10")
elif a>=5:
    print("a>=5")
else:
    print(a)

coppeliasim 用python控制 python control c_Python_03


如果我们的判断分支只有两个,我们还可以使用一种简洁的二分支语句:

Expr_A if <Condition Expr> else Expr_B

a=eval(input("Enter an integer:\n"))
str = "large" if a>10 else "small"
print(str)

coppeliasim 用python控制 python control c_Python_04


示例代码中给定的输入是5,输出small正确。

有一个很有趣的问题,你面前有两扇门,一扇通往天堂,一扇通往地狱,每扇门前站着一个守卫。两个守卫一人说假话一人说真话,你可以选择其中一个人问一个问题,你该怎么提问才能确保自己进天堂呢?Have a try.

2.while语句.

while语句用于循环执行一段代码块,当判断表达式不满足时,跳出while循环。

a=eval(input("Enter an integer:\n"))

while a<=10:
    a=a+1
    print(a)

coppeliasim 用python控制 python control c_流程控制语句_05


上述代码实例中我们给定的输入为5.其实while语句还可以和else语句结合使用,只有当while循环正常结束时才会执行else中的语句,那么什么叫不正常结束呢?不是因为while的判断表达式为假而导致的循环结束是不正常的,例如break语句的提前跳出。

a=eval(input("Enter an integer:\n"))

while a<=10:
    a=a+1
    print(a)
    if a==8:
        break
else:
    print("Everything is OK.")

coppeliasim 用python控制 python control c_python_06


我们看到,这里的else语句块并没有被执行,说明break语句导致了while的不正常结束。我们删去break语句,再看看结果:

a=eval(input("Enter an integer:\n"))

while a<=10:
    a=a+1
    print(a)
else:
    print("Everything is OK.")

coppeliasim 用python控制 python control c_编程语言_07


确实是Everything is OK.

3.for语句.

前面说while循环语句是条件循环,当满足条件的时候才进行循环(当然就算条件满足,也可能会被break语句强行中断)。而for语句就是遍历循环,它遍历一个可迭代类型中的每一个元素,来完成一些操作。很经典的高斯求和故事,就和下面这段代码的结果一致

sum=0
for i in range(101):
    sum=sum+i
print(sum)

coppeliasim 用python控制 python control c_编程语言_08


range(beg,end,step)返回一个range类型的可迭代数据,区间为[beg,end)的左闭右开区间,step参数为步长,默认时为1,这是一个Python的内置函数,先简单介绍一下。for循环在可迭代类型中的元素迭代完毕之后,就结束循环。

tuple=(1,2,3)
list=[1,2,3]
str="123"
dict={1:2,2:3,3:4}
for i in tuple:
    print("Tuple:%d"%i)
for i in list:
    print("List:%d"%i)
for i in str:
    print("String:%c"%i)
for (i,j) in dict.items():
    print("<%d,%d>"%(i,j))

coppeliasim 用python控制 python control c_Python_09


其中dict.items()我们在Dict字典类型中介绍过,用于返回所有的键值对信息。

4.break与continue语句.

break语句我们在while中已经遇到过,它可以跳出自己所在的最内层循环,并且只能跳出一层.

for i in range(3):
    for j in range(4):
        break
    print("You still in the loop.")

coppeliasim 用python控制 python control c_python_10


通过代码的运行结果我们不难看出,break语句只跳出了自己所在的以j为迭代变量的内层循环,而外层的i循环依旧在执行。continue语句和break不一样,前者只会跳出本轮循环的剩余代码,而不是跳出整个循环,我们用一段代码来对比:

for i in range(1,10):
    if i%2==0:
        continue
    print("%d is odd."%i)
print("—————————")
for i in range(1,10):
    if i%2==0:
        break
    print("%d is odd."%i)

coppeliasim 用python控制 python control c_编程语言_11


对比之下不难看出,continue不会跳出整个循环,只是跳过剩余代码,而break在第一次遇到i%2==0的值时,就选择跳出for循环.