学习:循环

转自:http://www.byhy.net/tut/py/basic/11/
循环 是编程语言常见的一种流程控制。

所谓循环 就是反复的执行一段代码。

我们人类语言要让别人反复的做一些事,可以这样说: 请你一直怎样怎样,或者请你反复怎样怎样。

Python语言要让计算机反复的做一些事 就要使用循环语句。

Python中有两种类型的循环: while 循环 和 for 循环

while 循环

while循环 是: 检查一个条件表达式,只要条件表达式计算结果为True 时, 就执行下面缩进的代码。

如此反复,直到条件表达式计算结果为False时,结束 循环。

比如:

command = input("请输入命令:")
while command != 'exit':
    print(f'输入的命令是{command}')
    command = input("请输入命令")

其中 while command != 'exit' 会判断用户输入的命令 (command 变量) 是否等于字符串 'exit'

如果不等于, 就执行下面缩进的代码。下面缩进的代码就是循环体内的代码,还会再次让用户输入命令到变量command中。

如果等于字符串 'exit', 就结束循环。

如果用户输入的命令一直都不是字符串 'exit', 就会一直执行循环。

大家可以运行一下看看。


用 while 循环要注意 循环条件的设置,处理不当,有可能导致 循环的条件始终为True,循环永远不会结束,变成了死循环。

比如,我们要打印出 从 1 到 100 的数字,应该写成下面这样

i = 1
while i <= 100:
    print(i)
    i += 1

如果不小心,漏掉最后一句,变成

i = 1
while i <= 100:
    print(i)

这样 i 的值始终不变, 循环的条件 i <= 100 一直都是满足的,就变成死循环了。程序一直打印 i 值为 1 ,永不结束。

for 循环

点击这里,边看视频讲解,边学习以下内容

for循环的用法

for 循环 通常是从一个sequence类型,比如 字符串、列表 或者 元组中 依次取出每个元素进行操作。

比如,我要打印出 一个学生年龄 列表中所有的学生信息, 可以这样写

studentAges = ['小王:17', '小赵:16', '小李:17', '小孙:16', '小徐:18']

for student in studentAges:
    print(student)

注意,for student in studentAges 这里的 student 变量就依次代表了 studentAges里面的每一个元素,执行下面 缩进的代码 print(student)

这里有5个学生的信息, 那么这个循环就执行了5次。

从循环的第1次到第5次,student 变量的值分别为:

'小王:17'
'小赵:16'
'小李:17'
'小孙:16'
'小徐:18'

所以上面的循环可以依次打印出上面的元素。


当然上面的例子用while循环也一样可以达到目的,就是稍微复杂一些

studentAges = ['小王:17', '小赵:16', '小李:17', '小孙:16', '小徐:18']

idx = 0
while idx < len(studentAges):
    currentEle = studentAges[idx]
    print(currentEle)
    idx += 1

上面的代码里,我们用一个变量idx代表 列表当前元素的索引。 在循环体里面 每执行一次就 让idx 的值加1。 这样的循环,变量 currentEle就依次等于 列表里面的每个元素。

如果循环操作一个空列表,如下

for one in []:
    print(one)

循环体内的代码不会执行。

循环n次

开发程序时,我们经常需要 循环执行某段代码 n次

比如,我们要打印出 ‘python,我爱你’ 100次。

这时,我们可以使用for 循环 和 一个内置类型 range ,如下所示

# range里面的参数100 指定循环100次
# 其中 n 依次为 0,1,2,3,4... 直到 99
for n in range(100):  
    print(n)      
    print('python,我爱你')

注意:

和Python 2 不同, Python 3 中的range 并不是一个函数,不会返回一个数字列表。 Python 3 中的range 是一个 类

如果你想返回一个 从 0到99的数字列表, 可以这样写 : list(range(100))


如果我们想打印出从50 到 100 所有的数字,怎么办?

可以这样

for n in range(50,101):  
    print(n) 

range里面可以放入两个参数。两个参数表示 起止范围。

比如 range(50,101) 表示从 50 开始, 到 100 结束。

注意,不是到 101 结束!

每次取出一个数字都是依次+1, 就是50,51,52… 100

所以 到100, 最后必须写101, 否则就只会 到 99了。


如果我们想打印出从50, 55, 60, 65… 这样每次增加5, 直到 100,怎么办?

可以这样

for n in range(50,101,5):  
    print(n) 

range里面可以放入3个参数。

如果有3个参数,前面2个参数的含义和上面一样,第3个参数表示 步长

这里参数值为 5,就是每次增加5, 而不是增加1。

enumerate 函数

有的时候,在使用for循环从列表或者元组中遍历元素的时候,除了要获取每个元素,还需要得到每个元素在列表元组里面的索引。

比如,找出下面列表中年龄大于17岁的学员,打印出他们在列表中的索引

studentAges = ['小王:17', '小赵:16', '小李:18', '小孙:16', '小徐:18']

这时候可以使用 enumerate 函数,像下面这样

studentAges = ['小王:17', '小赵:16', '小李:17', '小孙:16', '小徐:18']

# enumerate (studentAges) 每次迭代返回 一个元组
# 里面有两个元素,依次是 元素的索引和元素本身 
for idx, student in enumerate(studentAges):
    if int(student.split(':')[-1]) > 17:
        print(idx)

break 终止循环

点击这里,边看视频讲解,边学习以下内容

有时,我们循环体内的代码在发现某种条件满足的时候,需要终止循环。

比如,本文开头的例子

用户输入的命令如果等于字符串 'exit' 就结束循环

当然像面那上样的代码也是可以的

command = input("请输入命令:")
while command != 'exit':
    print(f'输入的命令是{command}')
    command = input("请输入命令")

print('程序结束')

只是,这样 代码有写啰嗦, command = input("请输入命令")写了两次。

我们可以使用关键字 break ,就可以这样

while True:
    command = input("请输入命令:")
    if command == 'exit':
        break
    print(f'输入的命令是{command}')

print('程序结束')

注意,解释器执行到 循环内的 break 语句,就会从循环while 退出,

接着执行while 循环下面的代码 print('程序结束')


break 对 for 循环也一样有效,如下:

for i in range(100):
    command = input("请输入命令:")
    if command == 'exit':
        break
    print(f'输入的命令是{command}')

print('程序结束')

函数中的 break 和 return

很多初学者,经常会搞不清 break 和 return的区别。

首先, return 只能用在函数里面, 表示 从函数中返回。

代码主体部分是不能用return的。

比如,下面的代码执行起来就会报错

while True:
    command = input("请输入命令:")
    if command == 'exit':
        return
    print(f'输入的命令是{command}')

print('程序结束')

提示

SyntaxError: 'return' outside function

因为 return 是表示从函数中返回,它 是不能用在 函数外面的。


函数中的循环体内的代码, 使用 return 和 break 都可以从循环中跳出。

但是,break 只是 跳出循环, 如果循环后面还有代码, 会进行执行,如下

def inputCommand():
    while True:
        command = input("请输入命令:")
        if command == 'exit':
            break
        print(f'输入的命令是{command}')

    print('末尾语句')

inputCommand()

执行该函数,输入 exit 发现,还会打印出 末尾语句 这句话

return 则会从函数里面立即返回, 函数体内的后续任何代码都不执行了,我们把上面的代码中的break 换成return, 如下

def inputCommand():
    while True:
        command = input("请输入命令:")
        if command == 'exit':
            return
        print(f'输入的命令是{command}')

    print('末尾语句')

inputCommand()

执行该函数,输入 exit 发现,就不会打印出 末尾语句 这句话

continue

点击这里,边看视频讲解,边学习以下内容

有时,我们循环体内的代码在发现某种条件满足的时候,不是要终止整个循环,而是只结束当前这一轮循环,后面还要继续循环的执行

还是上面的例子,我们增加一个功能:

用户输入的命令如果等于字符串 'exit' 就结束程序;

而用户输入的命令如果等于字符串 'cont' 就不打印这个命令,但是还让用户继续输入下一个命令

我们可以使用关键字 continue ,就可以这样

while True:
    command = input("请输入命令:")
    if command == 'exit':
        break
    if command == 'cont':
        continue
    print(f'输入的命令是{command}')

print('程序结束')

运行一下看看。

再强调一遍:

continue 只是当前这次循环结束,就是这次循环 continue 后面的代码不执行了, 后续的循环还要继续进行。

break 是结束整个循环

列表推导式

我们经常需要这样处理一个列表:把一个列表里面的每个元素, 经过相同的处理 ,生成另一个列表。

比如:一个列表1,里面都是数字,我们需要生成一个新的列表B,依次存放列表A中每个元素的平方

怎么办?

当然可以用for循环处理,像这样

list1 = [1,2,3,4,5,6]
list2 = []
for num in list1:
    list2.append(num*num)

Python还有更方便的语法,可以这样写

list1 = [1,2,3,4,5,6]
list2 = [num**2 for num in list1]

这种写法,通常叫做 列表推导式

就是把一个列表里面的每个元素经过简单的处理生成另一个列表的操作。

其中 for 前面的部分,就是要对取出的元素进行的处理操作, 上面的例子是计算平方。

如果我们 得到的 list1 里面每个元素的 立方呢?

对了,就可以这样

list1 = [1,2,3,4,5,6]
list2 = [num**3 for num in list1]

循环嵌套

点击这里,边看视频讲解,边学习以下内容

我们来看一个编程题:

下面有两个列表 分别代表 刘备 和 曹操 麾下的猛将。

list1 = ['关羽','张飞','赵云','马超','黄忠']
list2 = ['典韦','许褚','张辽','夏侯惇','夏侯渊']

要求大家编写一段代码,让 list1中每员大将和list2中的每员大将 都互相厮杀一次,打印出 A 大战 B。

这是典型的 2个列表元素两两组合的问题, 需要用到循环的嵌套。

所谓循环的嵌套,就是循环里面还有循环。

对应的代码如下

list1 = ['关羽','张飞','赵云','马超','黄忠']
list2 = ['典韦','许褚','张辽','夏侯惇','夏侯渊']

for member1 in list1:
    for member2 in list2:
        print(f'{member1} 大战 {member2}')

输出结果如下:

关羽 大战 典韦
关羽 大战 许褚
关羽 大战 张辽
关羽 大战 夏侯惇
关羽 大战 夏侯渊
张飞 大战 典韦
张飞 大战 许褚
张飞 大战 张辽
张飞 大战 夏侯惇
张飞 大战 夏侯渊
赵云 大战 典韦
赵云 大战 许褚
赵云 大战 张辽
赵云 大战 夏侯惇
赵云 大战 夏侯渊
马超 大战 典韦
马超 大战 许褚
马超 大战 张辽
马超 大战 夏侯惇
马超 大战 夏侯渊
黄忠 大战 典韦
黄忠 大战 许褚
黄忠 大战 张辽
黄忠 大战 夏侯惇
黄忠 大战 夏侯渊
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容

  • 转自:http://www.byhy.net/tut/py/basic/19/[http://www.byhy.n...
    小小杨树阅读 62评论 0 1
  • #for循环 #i是代表接收到字符串遍历出来的每一个元素 #'python'是可迭代对象 #循环次数由可迭代对象的...
    6_c阅读 321评论 0 3
  • 1 遍历结构——for语句1.1 for语句的基本结构 1.2 常用使用方法 1.3 拓展模式 1.3.例子 由此...
    我爱Python阅读 330评论 0 0
  • 转自:http://www.byhy.net/tut/py/basic/17/[http://www.byhy.n...
    小小杨树阅读 588评论 0 3
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,049评论 0 4