当前页面: 首页> 资讯百科

Python培训教程:循环、列表

2020-06-02 10:24:46

在以前的例子里,有时候我们需要多次执行相同的任务,我们使用一个计数器来检查代码需要执行的次数。这个技术被称为循环。

一、while循环

while语句的语法如下:


while condition:
    statement1
    statement2

想要多次执行的代码必须正确的缩进放在while语句下面。在表达式condition为真的时候它们才会执行。同if-else一样,非0值为真。启动Python3交互页面,让我们写一个简单的代码,它按顺序打印0到10的数字:

在第一行我们使 n = 0,然后在while语句中将条件设置为n < 11,这意味着在while语句下面缩进的所有行将会被执行,直到n的值大于等于11。在循环里我们只是打印n的值然后令塔递增1。

想要如果没有循环语句,你想要打印0到10的所有数字,那你得手动打印11次!

1.1 斐波那契数列

让我们试试打印斐波那契数列。这个数列前两项为1,之后的每一项都是前两项之和。所以这个数列看起来就像这样:1,1,2,3,5,8,13......


#!/usr/bin/env python3
a, b = 0, 1
while b < 100:
    print(b)
    a, b = b, a + b

运行程序:

第一行代码中我们初始化a和b。当b的值小于100的时候,循环执行代码。循环里我们首先打印b的值,然后在下一行将a+b的值赋给b,b的值赋给a。

学习其他语言的同学在这里可能有些困惑,你可以这样理解,Python中赋值语句执行时会先对赋值运算符右边的表达式求值,然后将这个值赋给左边的变量。

默认情况下,print()除了打印你提供的字符串外,还会打印一个字符串,所以每调用一次print()就会换一次行,如同上面一样。

你可以通过print()的另一个参数end来替换这个换行符,就像下面这样,下面的程序写入fibonacci2.py


#!/usr/bin/env python3
a, b = 0, 1
while b < 100:
    print(b, end=' ')
    a, b = b, a + b
print()

运行程序:

1.2 幂级数

我们来写一个程序计算幂级数:e^x = 1 + x + x^2/2! + x^3/3! +...+x^n/n!(0 < x < 1)。

该程序写入代码文件powerseries.py


#!/usr/bin/env python3
x = float(input("Enter the value of x: "))
n = term = num = 1
result = 1.0
while n <= 100:
    term *= x / n
    result += term
    n += 1
    if term < 0.0001:
        break
print("No of Times= {} and Sum= {}".format(n, result))

运行程序:

在这个程序里我们介绍一个新的关键字break,它可以终止最里面的循环。这个例子里我们在if语句里使用break:


if term < 0.0001:
    break

这意味着如果term的值小于0.0001,那么终止循环。

1.3 乘法表

这个例子里面我们打印10以内的乘法表,写入代码文件multiplication.py


#!/usr/bin/env python3
i = 1
print("-" * 50)
while i < 11:
    n = 1
    while n <= 10:
        print("{:5d}".format(i * n), end=' ')
        n += 1
    print()
    i += 1
print("-" * 50)

运行如下:

这里我们在while循环里使用了另一个while循环,这被称为嵌套循环,你应该已经看到一条有趣的语句:

print("-" * 50)

字符串若是乘上整数n,将返回由n个此字符串拼接起来的新字符串。

下面是一些例子:

1.4 一些打印星号的例子

这里是一些你可以在大学的实验报告里面经常看到的例子。

1.4.1 设计1


#!/usr/bin/env python3
row = int(input("Enter the number of rows: "))
n = row
while n >= 0:
    x =  "*" * n
    print(x)
    n -= 1

运行这个程序:

1.4.2 设计2


#!/usr/bin/env python3
n = int(input("Enter the number of rows: "))
i = 1
while i <= n:
    print("*" * i)
    i += 1

运行这个程序:

1.4.3 设计3


#!/usr/bin/env python3
row = int(input("Enter the number of rows: "))
n = row
while n >= 0:
    x = "*" * n
    y = " " * (row - n)
    print(y + x)
    n -= 1

二、列表

在继续学习循环之前,我们先学习一个叫做列表的数据结构,它可以写作中括号之间的一列逗号分隔的值。列表的元素不必是同一类型:

你可以将上面的列表想象为一堆有序的盒子,盒子包含有上面提到的值,每个盒子都有自己的编号(红色的数字),编号从0开始,你可以通过编号访问每一个盒子里面的值。对于列表,这里的编号称为索引。

我们像下面这样通过索引来访问列表里的值:

如果我们使用负数的索引,那将会从列表的末尾开始计数,像下面这样:

你甚至可以把它切成不同的部分,这个操作称为切片,例子在下面给出(取左不取右):

切片并不会改变正在操作的列表,切片操作返回其子列表,这意味着下面的切片操作返回列表一个新的(栈)拷贝副本:

切片的索引有非常有用的默认值;省略的第一个索引默认为0,省略的第二个索引默认为切片的字符串的大小: 


有个办法很容易记住切片的工作方式:切片时索引是在两个元素之间。左边第一个元素的索引为0,而长度为n的列表其最后一个元素的右界索引为n。

Python中有关下标的集合都满足左闭右开的原则,切片也是如此,也就是说集合左边界值能渠道,右边界则不能取到。

对于上面的列表,a[0:5]用数学表达式可以写为[0,5),其索引值为0,1,2,3,4 ,所以能将a中所有值获得,你也可以用a[:5],效果是一样的。

而a[-5:-1],因为左闭右开原则,其取值为-5,-4,-3,-2是不包含-1的。

为了取到最后一个值,你可以使用a[-5:]它代表了取改列表最后5个值。

试图使用太大的索引会导致错误:

Python能够优雅地处理那些没有意义的切片索引:一个过大的索引值(即大于列表实际长度)将被列表实际长度所代替,当上边界比下边界大时(即切片左值大于右值)就会返回空列表:

切片操作还可以设置步长,就像下面这样:

它的意思是,从切片索引1到列表末尾,每隔两个元素取值。

列表也支持连接这样的操作,它返回一个新的列表:

列表允许修改元素:

也可以对切片赋值,此操作可以改变列表的尺寸,或清空它:

细心的同学们可能发问了,前面不是说切片操作不能改变列表么?严格来说,这里不算真正的切片操作,只是上面代码中赋值运算符左边的这种操作与切片操作形式有点一样而已。

要检查某个值是否存在于列表中,你可以这样做:

这意味着我们将上面的语句使用if子句中的表达式。通过内建函数len()我们获得列表的长度:

如果你想要检查列表是否为空,请这样做:

列表是允许嵌套的(创建一个包含其它列表的列表),例如:

三、for循环

通过for语句我们可以使用for循环。Python里的for循环与C语言中不同。这里的for循环遍历任何序列(比如列表和字符串)中的每一个元素。下面给出示例:

我们也可以这样做:

range()函数

如果你需要一个数值序列,内置函数range()会很方便,它生成一个等差数列(并不是列表):

四、continue语句

如同break,我们可以在循环中使用另一个语句continue。它会跳过其后的代码回到循环开始处执行。这意味着它可以帮助你跳过部分循环。在下面的例子中,我们要求用户输入一个整数,如果输入的是负数,那我们会再次要求输入,如果输入的是整数,我们计算这个数的平方。用户输入0来跳出这个无限循环。


#!/usr/bin/env python3
while True:
    n = int(input("Please enter an Integer: "))
    if n < 0:
        continue # 这会返回到循环开始处执行
    elif n == 0:
        break
    print("Square is ", n ** 2)
print("Goodbye")

运行程序:

五、循环的else语句

我们可以在循环后面使用可选的else语句。它将会在循环完毕后执行,除非有break语句终止了循环。

在本节Python培训教程的后续内容中,我们会看到更多有关break 和 continue的例子。

六、总结

本节Python培训教程我们了解两种循环:while和for循环,其中的for循环我们通常与range()函数配合使用,要特别注意的是,range()函数返回的并不是列表而是一种可迭代对象:

Python中的for循环的else子句给我们提供了检测循环是否顺利执行完毕的一种优雅方法。



seo