这一节,跟大家继续分享条件循环。在这之前,给大家讲一个断言。断言就是通过assert关键字实现的。当被断言的条件为假的时候,程序自动崩溃并抛出 AssertionError 的异常,终止执行。
一般来说我们可以在程序中置入检查点,当需要确保程序的某 个条件一定为真才能让程序正常工作的话,assert关键字就非常有用了 。
如上,当num1 = 10,断言assert 1 < num1 < 100中,10大于1,且小于100,条件为真,因此继续执行代码;当num2 = -1的时候,条件1 < num2 < 100条件明显不成立,因此断言失败,控制台打印AssertionError。
断言,类似一个集成的if语句,如果为真,继续执行后面的语句,如果为假就直接抛出异常,停止运行。所以,在程序中,插入检查点来判断程序是否可以正确运行,这个过程就可以直接通过assert进行操作。
while循环
while语法:
while 判断条件(condition):
执行语句(statements)
如果判断条件为真,就执行一次while里面的语句,如果为假,则跳出while循环。代码示例:
name = ""
while not name:
name = input("please enter your name:"" )
print( "hello's %s!" %name )
如上代码,while中的条件是not name,意思是name为空的时候执行input语句,直到name不为空,继续下面的print语句。看上面代码,name为空字符串,不为None,因此,执行input语句,等待用户输入。
这个程序,要求运行这个程序的时候,看要输入什么,输入用户名什么也不输,回车,再次要求你输入用户名,因为name还是空字符串。那么,当我们输入leo之后,结果如何呢,执行了下面的语句,打印了提示语以及输入的名称。
for循环
for循环是另一种常见的循环语句。
大家如果在其他的语言里面,也经常会见到for循环,如果能够使用for,大家尽量就不要再使用while了。一起来看看for循环。
如上实例,for循环,定义一个looper变量,这个looper变量在1 2 3 4中。然后,在遍历的过程中打印这个looper。那这1 2 3 4打印出来了。这里使用了一个in关键字,遍历了[1, 2, 3, 4]的列表,looper指向列表的每个元素。如果是字典,如何遍历:
d = {"num1" :1,"num2" :2,"num3" :3}
for key in d:
print (key ," = ", d[key])
运行代码:
d是一个字典,如上,有三个项,key分别为num1、num2、num3,值分别为1、2、3。用for语句,
for key in d
。key就是键,d[key]就是这个键对应的值,依次打印出来。这就是字典的遍历了。
range()方法
定义:range() 内建函数,类似与分片 range (下限,上限,步长)( 不包含上限 )。
在使用for循环的时候,经常与一个内建函数range进行结合。range函数有三个参数,一个叫做下限,一个叫做上限,一个叫做步长,我们通过三个例子来看。
#Demo range函数
for number in range (1,5):
print(number)
看上面的range函数,1是下限,5上限,这儿写了1到5,为什么打印是1 2 3 4呢?这种range方法,它不包含上限,所以打印出来是1 2 3 4。能不能简写呢,可以这样做,把1给去掉,只留了上限,结果就是,0 1 2 3 4。这个下限不是从1开始了,但是仍然没有到就上限。但是下限,它变为0了,这就是我们程序员在使用的时候呢,默认从零开始计数的。列表里面的索引是从0开始的,所以,下线是从零开始的。
#Demo range函数
for number in range (5):
print(number)
IDE中运行:
range是由3个参数的,表示步长,效果如何呢?一段代码:
for number in range(1,10,2):
print(number)
如上代码,下限1,上限10,步长2,那么range结果:1,3, 5, 7, 9共计5个数值。
并行迭代
同时迭代两个序列,例如表等,称之为并行迭代。对于等长的两个列表,简单的并行迭代可以使用如下的方法:
# Demo:并行迭代 len(),range()
names = ["anne" ,"beth" ,"george","damon"]
ages = [12 ,45 ,32 ,102 ]
for i in range (len(names)):
print(names[i] ,"is" ,ages[i] ,"years old!""years old!")
以上代码其实利用了len方法和range方法,遍历names数组的时候,通过相同索引访问ages列表。
但是,若果两个数组的长度不一致,以上访问就会出错了。在Python中,有没有更好的方法遍历多个数组呢?Python中,一般如下实现:
# Demo:并行迭代zip函数
names = ["anne" ,"beth" ,"george","damon", "bob"]
ages = [12 ,45 ,32 ,102, 101, 103 ]
for name ,age in zip(names ,ages):
print(name,"is" ,age ,"years old!")
以上代码,通过zip函数将names、ages两个列表进行了合并,然后通过name,age元组进行遍历。这就是zip的用法了。
看上面示例,列表通过zip构建出来了新的列表,然后通过in进行遍历,元素是name, age组成的元组。可以看到names中有5个元素,ages中有4个元素,合并之后,明显结果只有4个元素了,这就是zip的特点,返回的列表长度将是二者列表中的较短者。
跳出循环
有时可能希望中间离开循环(也就是 for 循环计数之前,或者while循环找到结束条件之前)。有两种方法来做: continue直接跳到循环的下一次迭代,或者 break 完全终止循环。来看一段代码:
for i in range (5):
print ("=============")
print ("i = ", i)
if i == 3:
continue
print ("hello everyone!")
看上面for循环,从0开始,print打一个分隔线,然后打印i,i从0开始,直到4。当等于3的时候,执行continue,跳过后面的语句,执行继续下一个迭代。大家来看看结果:
0没有问题,打印了hello,everyone。1也没问题,2也没问题,当等于3的时候,continue它下面这条不执行了,跳出了这个循环,继续i = 4的执行。如果改成break会怎么样呢?
我们看上面代码,当i = 3的时候,不仅不打印了,后面的4也没有了,这就是break的与continue的区别了,直接终止并跳出了这个循环。