Python for Kids
  • 0 前言
  • 1 编程环境准备
  • 2 运算符和表达式
  • 3 掌握变量
  • 4 字符串
  • 5 获取用户的输入
  • 6 条件判断
  • 7 条件判断实操
  • 8 FOR循环
  • 9 循环和列表
  • 10 WHILE循环
  • 11 WHILE循环实操
  • 12 WHILE循环再实操
  • 13 多重循环
  • 14 再谈列表
  • 15 初见函数
  • 16 函数实操
  • 17 选择排序
  • 18 冒泡排序
  • 19 递归算法之一
  • 20 递归算法实操
  • 21 快速排序
  • 22 汉诺塔游戏
  • 23 递推算法
  • 24 分治算法
  • 25 集合与组合
  • 26 贪心算法
  • 27 字典和键值对
  • 28 广度优先搜索算法
  • 29 数组和向量化计算
  • 30 随机和模拟
  • 31 数据可视化
  • 32 文件读取和分析
Powered by GitBook
On this page
  • 大纲
  • 使用列表
  • 列表的操作
  • 练习:求最大值
  • 练习:寻找质数
  • 练习:房间的灯光问题
  • 练习:用循环进行推理

Was this helpful?

9 循环和列表

列表不是课表哦

大纲

  • 使用列表

  • 列表的常见操作

  • 练习:求量大值

  • 练习:找到质数

  • 练习:房间的灯光判断

  • 练习:用循环进行推理

使用列表

在上节课中,我们使用range来生成了一个递增序列,并基于这个序列来完成了循环操作,来遍历整体序列。其实这种序列可以认为是一种列表或者数组,它是很多个元素放在一起,方便操作。我们来学习一种新的数据类型,就是列表(list)。

numbers = [1,2,3]
for x in numbers:
    print(x)
1
2
3
type(numbers)
list
list(range(3))
[0, 1, 2]

定义一个列表很简单,就是用一对中括号,把需要装进来的东西包住,里面的东西用逗号隔开。可以理解列表就是一排保险柜,柜子里头保存的是一堆分开保存的东西。

我们来使用列表来保存10以内的数字,然后找出哪些数字是偶数

numbers = [0,1,2,3,4,5,6,7,8,9]
for x in numbers:
    if x%2==0:
        print(x)
0
2
4
6
8

用range也是一样的,不过用list会更加灵活一些。

numbers = range(10)
for x in numbers:
    if x%2==0:
        print(x)
0
2
4
6
8

列表的操作

可以对列表做很多的操作,这里先简单介绍三种最常用操作,也就是对列表做查询、修改和新增

numbers = [0,1,2,3,4,5,6,7,8,9]
numbers[9]
9
numbers[9]=19
numbers
[0, 1, 2, 3, 4, 5, 6, 7, 8, 19]
numbers.append(99)
numbers
[0, 1, 2, 3, 4, 5, 6, 7, 8, 19, 99]

查询是按序号位置查的,将序号放入方括号中,将对应位置的数字取出来,修改也可以按序号来,直接用等号进行重新赋值,新增介绍的是从尾部补充进去,使用点号加append,括号中是要新增的数字,要注意的是,列表的序号是从0开始的。

让我们把之前的代码改一下,把20以内的偶数都找出来,并存到列表中。

numbers_even = []
for x in range(20):
    if x%2==0:
        numbers_even.append(x)
print(numbers_even)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

上例中,先定义了一个空的列表numbers_even,这个是为了后面保存偶数列表用的,之后准备循环遍历,从0到19,对每个元素进行判断,如果是偶数,就将它添加到numbers_even尾部,最后打印出numbers_even观察,没问题。

numbers_even = []
for x in range(20):
    if x%2!=0:
        continue
    numbers_even.append(x)
print(numbers_even)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

这是另一种作法,如果不符合条件,则使用continue来跳过循环体中剩余的代码,直接进入下一次循环。

练习:求最大值

编写一个程序,输入N个数字,输出最大值出来。我们之前的时候学习过如何找到最小值,这次,我们用列表来存放输入的数字,用循环来来找到这个最大值。

x = [31, 2,101, 23, 28, 65, 7]
x_max = x[0]
for i in x:
    if x_max<i:
        x_max = i
print(x_max)
101

练习:寻找质数

输入一个数字,判断它是不是质数

x = int(input("输入一个数字:"))
result = True
for i in range(2,x):
    if x%i==0:
        result = False
if result:
    print(x,"是一个质数")
else:
    print(x,"不是一个质数")
输入一个数字:13
13 是一个质数

只要有第一个数字i发现可以整除数字x,x就可以认为不是质数,所以后面的循环部分可以不用运行,节约时间。

x = int(input("输入一个数字:"))
result = True
for i in range(2,x):
    if x%i==0:
        result = False
        break
if result:
    print(x,"是一个质数")
else:
    print(x,"不是一个质数")
输入一个数字:24
24 不是一个质数

练习:房间的灯光问题

一个房间里有20盏灯,编号从1到20,第1个人进来把所有灯打开,第2个人再进来把所有编号为2的倍数的灯关掉,第3个人再进来,把所有编号为3的倍数的灯打开,依此类推,如果有5个人进来过,最后有哪几盏灯还开着?

lights = list(range(20))
for light in lights:
    lights[light]=1
print(lights)
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

我们分两步来解决这个问题,第一步先用一个列表把20个灯定义好,然后第一个人进来,把每个灯都打开,就用1表示打开,0表示关闭,那么就是把这个列表中的20个元素都修改成1就可以了。

第二步是从第二个人开始循环,这里先从不同的人开始循环,再循环不同的灯,所以是有一个双重循环,如果这个灯的序号能够被人的序号整除,我们就把灯的状态进行修改。这里要注意两个要点,一个是用第三行是用了number+1,因为range从0开始编号的,而题目中灯的编号从1开始的,所以需要+1,第二个是在第四行我们修改灯的状态时,lights[number]=1-lights[number],兼容了开灯和关灯两个动作,如果原来是1,用1-1可以变成0,如果原来是0,用1-0可以变成1.

for people in [2,3,4,5]:
    for number in range(20):
        if (number+1)%(people)==0:
            lights[number]=1-lights[number]
print(lights)
[1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0]

练习:用循环进行推理

A, B, C, D这四个人中有一个人是小偷,已经知道其中有一个人说了假话,请根据他们的供词来判断谁是小偷。

A:我不是小偷

B:C是小偷

C:D是小偷

D:我不是小偷

用0到3的数字来代表四个人的编号,用变量i代表小偷的编号,那么上面这四句话的含义就可以翻译成四行代码。

A: i!=0

B: i==2

C: i==3

D: i!=3

for i in range(4):
    if (i!=0)+(i==2)+(i==3)+(i!=3)==3:
        print(i)
2

可以看到输出的编号是2,也就是说小偷的编号是2,也就是C是小偷。

Previous8 FOR循环Next10 WHILE循环

Last updated 4 years ago

Was this helpful?