少儿编程网 > 少儿编程知道 > 少儿编程python循环

留言申请试听免费课程【】人申请

少儿编程python循环

少儿Python第三课——循环

少儿编程python循环

郝讪羔2Z5少儿编程网-https://www.pxcodes.com

在上节课中,我们学习了变量和数据类型,这两个知识点是编程**基础的概念,相信大家应该已经都有了基本的掌握了,今天要学习的知识点是循环,顾名思义,所谓循环就是一段代码重复性执行,给大家举一个简单的例子,游戏其实就是一个大的循环,只要你没有明确的退出,就一直在游戏中不断的循环往复,好了,接下来就正式开始课程吧。 2Z5少儿编程网-https://www.pxcodes.com

名人堂

学习过计算机相关知识的人应该都听过“冯诺伊曼体系结构”,到目前为止,我们使用的计算机依然遵循着冯诺伊曼结构的设计,而冯诺伊曼就是今天要讲述的名人,他同时被称为计算机之父 和博弈论之父。1903年,冯诺伊曼出生于匈牙利的一个犹太家庭,他从小就表现出了数学和记忆方面的天才,八岁时就掌握了微积分,不到18岁,已经被大家公认为数学家了。 在1940年以前,冯诺伊曼主要是进行理论性数学研究,取得了非常骄人的成就,1940年以后,他转向应用数学,在力学,经济学,数值分析和电子计算机方面都做出了杰出的贡献,无愧是上世纪**伟大的全才之一。 1944年,冯诺伊曼参加原子弹的研制工作,在这个过程中,需要用到大量的计算,他们虽然雇用了一百多名计算员,但依然不能满足需要,一个偶然的机会,他接触到了ENIAC计算机研制工作,他敏锐的意识到了这项工作的深远意义,于是,他全力参与其中,发表了一个全新的存储程序通用电子计算机方案——EDVAC,并起草发表了一份长达101页的总结报告,这份报告是计算机历**一个划时代的文献,它宣告着电子计算机的时代开始了。2Z5少儿编程网-https://www.pxcodes.com

知识点

今天的知识点是讲循环。大家知道,计算机执行程序的时候,是一行行代码执行下去的,但有些代码可能要执行多次,每次执行的时候仅仅是部分变量的值不一样,这种时候就要用到循环了,循环是改变代码执行顺序的一种很重要的方式。下面立刻看一个例子:2Z5少儿编程网-https://www.pxcodes.com

当输入以上代码之后,就能得到左边的图形,但是右边的代码太冗余了,**后的八行代码都是重复的,如果我们不是画四个圈,而是画100 个群,那同样的代码要重复100次,这么写代码都会把手写抽筋。在这种情况下,就需要使用循环了,改善后的代码如下:2Z5少儿编程网-https://www.pxcodes.com

我们使用了For 循环,把核心的两行代码循环了四次,这样就能获得与上面程序相同的结果。如果此时我们想画6个圆圈而不是4个圆圈呢? 操作很简单,程序简单修改下就能得到想要的结果:2Z5少儿编程网-https://www.pxcodes.com

要想进一步优化这段程序,能够根据用户输入的个数来绘制圆圈,可以这样改造:2Z5少儿编程网-https://www.pxcodes.com

这代代码执行的时候,会首先询问用户需要绘制多少圆圈,当输入数字后,就开始启动一个循环,不停的重复执行绘制动作。2Z5少儿编程网-https://www.pxcodes.com

Python 中 For 循环的语法非常简单,在 For 循环中,有两个关键字,for 和 in,变量 x 在每次循环中,会赋予序列 range()中的某一个值。此处的 range(6)可以认为是生成了一个从0到5 的序列,大家可以在命令行中输入以下代码了解range 的作用:2Z5少儿编程网-https://www.pxcodes.com

for i in range(6):
    print(i)

for 循环已经介绍完毕,接下来介绍一下While 循环。 很多人可能会比较好奇,就一个循环的功能,为何需要两个关键字呢? 接下来就看一下这两个关键字的区别:2Z5少儿编程网-https://www.pxcodes.com

For 循环一般都是循环固定数量的次数,这个次数是根据 in 关键后面的序列个数决定的。 而 While 循环则是一个条件判断循环,也就是说,如果条件满足的情况下,它会一直循环下去。在上图的例子中,左边的 For 循环会循环10次,而右边的While 循环,只要变量 name 不等于空字符串,它会一直循环下去,下面我们完整的看一个 While 循环的例子:2Z5少儿编程网-https://www.pxcodes.com

在上面的例子中,程序首先会提示你输入名字,输入任意名字后,它会循环打印100次,然后再次提示你输入名字,如果想要结束,直接按 "Enter" 键,这样 name 变量就是空字符串了,程序就直接退出了。 2Z5少儿编程网-https://www.pxcodes.com

## 总结2Z5少儿编程网-https://www.pxcodes.com

今天我们学习了循环的概念,程序中因为有了循环的逻辑,使得很多需要重复执行的代码能够简单的进行编写。循环在代码编写中非常重要,没有循环,很多逻辑无法实现,在Python中,循环有两个关键字,分别是 For 和 While,一个是用于固定数量次循环操作,一个用于非固定数量的循环操作,在使用时记得进行区分。 2Z5少儿编程网-https://www.pxcodes.com

2Z5少儿编程网-https://www.pxcodes.com

给小朋友讲Python循环的一些有趣好玩的例子更有超级实用的穿搭技巧等着你哦!

少儿编程python循环

卜其萜2Z5少儿编程网-https://www.pxcodes.com

一般来说,讲Python中的循环,会从用turtle画正方形开始,或者画花儿开始,那么有没有更加有趣好玩的例子呢?本文讲解了用turtle绘制简单的视错觉图案,并介绍了视错觉在生活中的应用,可以帮你正确的搭配衣服哦。


形状错觉2Z5少儿编程网-https://www.pxcodes.com

正方形?还是圆形?2Z5少儿编程网-https://www.pxcodes.com

注意文中的命令我都使用了缩写,相信教过logo的老师都懂。

以正方形为例

很多情况下,我们会先用8条命令画一个正方形,代码如下:2Z5少儿编程网-https://www.pxcodes.com

from turtle import *

fd(100)
rt(90)

fd(100)
rt(90)

fd(100)
rt(90)

fd(100)
rt(90)

然后我们用for循环简化,代码如下:2Z5少儿编程网-https://www.pxcodes.com

from turtle import *
speed(0)
for i in range(4):
    fd(100)
    rt(90)


运行结果2Z5少儿编程网-https://www.pxcodes.com

这里存在的问题是,引入for循环,range没有讲,只好笼统的告诉学生,想要循环几次,就在range里写几,照葫芦画瓢。因为这里还没有将变量,所以讲while的话会更麻烦一些。然后就可以将定义函数了,其实函数的定义不一定放到变量、循环判断后面讲,我们把函数看做是命令的集合,就像是刷牙包含很多不同的动作一样,学生照样是可以理解的不是吗?2Z5少儿编程网-https://www.pxcodes.com

from turtle import *
speed(0)
def square():
    for i in range(4):
        fd(100)
        rt(90)

接下来就可以用循环调用这个函数了,这样可以避免循环嵌套,代码如下:2Z5少儿编程网-https://www.pxcodes.com


正方形的旋转2Z5少儿编程网-https://www.pxcodes.com

又或者,在讲for的时候为了不讲函数,绘制正方形可以不用for表示:2Z5少儿编程网-https://www.pxcodes.com

from turtle import *
speed(0)
for i in range(12):
    fd(100)
    rt(90)

    fd(100)
    rt(90)

    fd(100)
    rt(90)

    fd(100)
    rt(90)

    rt(30)

用这种方法同样可以绘制出相同的图案,理解并不难,用一正方形的纸作为实物演示都是可以的。2Z5少儿编程网-https://www.pxcodes.com

以圆为例子+++++++

告诉学生,turtle模块中有一个circle命令可以以特定的直径画圆,代码如下:2Z5少儿编程网-https://www.pxcodes.com

from turtle import *
speed(0)
circle(100)

然后就可以用for循环画圆了:2Z5少儿编程网-https://www.pxcodes.com

from turtle import *
speed(0)
for i in range(18):
    rt(20)
    circle(100)

运行程序,结果如图所示:2Z5少儿编程网-https://www.pxcodes.com


2Z5少儿编程网-https://www.pxcodes.com

比绘制正方形有趣一点。2Z5少儿编程网-https://www.pxcodes.com

螺旋正方形

from turtle import *
speed(0)
for i in range(360):
    fd(i)
    rt(91)

运行程序,结果如下图:2Z5少儿编程网-https://www.pxcodes.com


螺旋正方形2Z5少儿编程网-https://www.pxcodes.com

当然后面学生学了模运算或者列表,还可以给图形上色,在《教孩子学编程》一书中就是用列表保存不同的颜色,然后绘制不同颜色的螺旋正方形。2Z5少儿编程网-https://www.pxcodes.com

修改角度

或者可以修改每次循环右转的角度值,形成不同的图形,比如每次循环右转61°:2Z5少儿编程网-https://www.pxcodes.com


旋转61°2Z5少儿编程网-https://www.pxcodes.com

旋转21°2Z5少儿编程网-https://www.pxcodes.com


旋转21°2Z5少儿编程网-https://www.pxcodes.com

这很好玩,然后就没什么了,这里绘制的图形都是用基本图形的平移变换实现的,小学数学已经讲解了这方面的内容,其实合理利用平移变换的思路还可以绘制出弧形,在绘制饼图的时候比较有帮助。 2Z5少儿编程网-https://www.pxcodes.com

这样绘制出的图形很好看,然后也就没有什么了,螺旋正方形的图形还有点不好跟学生解释的,而且这些旋转形成的图形,很多学生都是见过的,所以,我们来想一些更有趣的例子。2Z5少儿编程网-https://www.pxcodes.com

当然除了我们设计的例子,学生完全可以把turtle当做普通的画笔,然后一点点的尝试绘制不规则的图形,比如有人绘制出了玫瑰花:
2Z5少儿编程网-https://www.pxcodes.com


玫瑰花2Z5少儿编程网-https://www.pxcodes.com

参考链接:blog.csdn.net/zaq0123/a。当然这样的图形就比较复杂了。2Z5少儿编程网-https://www.pxcodes.com

视错觉

我们知道,熟练掌握编程后,编程可以是创作和表达的工具,我们看书的时候,也可以用编程验证我们的想法,比如我们在阅读《平面构成》一书的时候就想,我能不能把这里面提到的东东用编程来表达呢,点线面的排列尤其是规则的排列,完全可以用循环表示。2Z5少儿编程网-https://www.pxcodes.com


平面构成2Z5少儿编程网-https://www.pxcodes.com

里面有很多有趣的视错觉图案是用非常简单的方法画出来的。2Z5少儿编程网-https://www.pxcodes.com

形状错觉


形状错觉2Z5少儿编程网-https://www.pxcodes.com

文章开头的图就是一个很经典的例子,你扪心自问,是不是非常不像是正方形和圆形呢,然而这时货真价实的正方形和圆形,这个时候冲突产生了,我们就可以带领学生通过编程来验证到是我们看错了,还是图画错了。2Z5少儿编程网-https://www.pxcodes.com

这里绘制的程序就很简单了,你看有规律的斜线的绘制,就是从中心点到边界上的点画直线,就不是单纯的运用循环了,当然了,要绘制这样的图形,肯定是以前面的指示单为基础了,通过绘制这个图形,学生能够更深刻的领会,哪些是需要重复的部分,turtle没有line函数,在没有讲goto函数的情况下,我们就用前进命令fd和后退命令bk好了。2Z5少儿编程网-https://www.pxcodes.com

我们可以让学生先尝试绘制放射状的直线:2Z5少儿编程网-https://www.pxcodes.com

from turtle import *
speed(0)
for i in range(36):
    fd(500)
    bk(500)
    rt(10)

当然了,无论是这里,还是前面,旋转的次数和旋转角度的乘积都刻意的是360°,开Python一般是小学高年级的学生,理解起来并没有困难2Z5少儿编程网-https://www.pxcodes.com

运行程序,结果如下图:2Z5少儿编程网-https://www.pxcodes.com


放射线2Z5少儿编程网-https://www.pxcodes.com


绘制原理2Z5少儿编程网-https://www.pxcodes.com

h2Z5少儿编程网-https://www.pxcodes.com

然后,我们就需要在不同的位置绘制正方形和圆形了,这里就可以引入抬笔penup命令和落笔pendown命令了,当然goto命令也是可以引入的,相比如forwardbackward加上旋转命令leftrightgoto的话,需要引入的新知识点比较多,而不用goto的话,学生需要靠旋转,大家觉得那个更好呢?2Z5少儿编程网-https://www.pxcodes.com

欢迎大家把自己的想法留言。

绘制正方形

在窗口左侧绘制正方形,代码如下:2Z5少儿编程网-https://www.pxcodes.com

from turtle import *
speed(0)

for i in range(36):
    fd(500)
    bk(500)
    rt(10)

pu() # penup的缩写
bk(200)
pd() # pendown的缩写

lt(90)
fd(75)
rt(90)

for i in range(4):
    fd(150)
    rt(90)
ht() # 隐藏乌龟

运行程序结果如下:2Z5少儿编程网-https://www.pxcodes.com


正方形2Z5少儿编程网-https://www.pxcodes.com

绘制圆形

然后在右侧画一个圆,要提醒学生注意circle命令绘制圆形并不以所在的位置为圆心的。2Z5少儿编程网-https://www.pxcodes.com

from turtle import *
speed(0)

for i in range(36):
    fd(500)
    bk(500)
    rt(10)

pu() # penup的缩写
bk(200)
pd() # pendown的缩写

lt(90)
fd(75)
rt(90)

for i in range(4):
    fd(150)
    rt(90)
ht() # 隐藏乌龟

pu()
fd(320)
rt(90)
fd(150)
lt(90)
pd()
circle(75)

程序的运行结果如下图:2Z5少儿编程网-https://www.pxcodes.com


绘制圆2Z5少儿编程网-https://www.pxcodes.com

学生绘制完之后,亲身验证了这种形状错觉,对于形状错觉和for循环的运用,已经pdfdrtlt都有了比较详细的掌握。2Z5少儿编程网-https://www.pxcodes.com

注意,在绘制完背景的放射线和正方形,我都用pdfdrtlt调整了乌龟的位置,路线如下图:
2Z5少儿编程网-https://www.pxcodes.com


绘制2Z5少儿编程网-https://www.pxcodes.com

小结

实际上,设计课程的时候,我们可以先确定一个大的主题或者概念,然后再考虑用程序实现,比如这里的视错觉,通过本节课学生既可以掌握for循环的使用,又加深了对于视错觉的理解,并通过动手(编程)实际验证了视错觉。2Z5少儿编程网-https://www.pxcodes.com

拓展

其余的好玩的视错觉还有很多,比如:2Z5少儿编程网-https://www.pxcodes.com


线条弯曲错觉2Z5少儿编程网-https://www.pxcodes.com

这个可以用循环绘制,不过一节课的话,估计要相对比较**的学生才可以绘制出来呢。 2Z5少儿编程网-https://www.pxcodes.com


缪勒-莱伊尔错觉2Z5少儿编程网-https://www.pxcodes.com

这个错觉的话,其实不用循环就可以的。2Z5少儿编程网-https://www.pxcodes.com


平行错觉2Z5少儿编程网-https://www.pxcodes.com

像这种平行错觉也很容易用循环绘制的。2Z5少儿编程网-https://www.pxcodes.com

网易卡搭上有个小朋友参考国外视错觉网站brainbashers.com/optica制作了一个可以动态验证的scratch作品kada.163.com/project/21感兴趣的老师可以找来看。
2Z5少儿编程网-https://www.pxcodes.com


卡搭二维码2Z5少儿编程网-https://www.pxcodes.com

知乎帖子:视错觉在生活中的应用zhihu.com/question/3756
2Z5少儿编程网-https://www.pxcodes.com


茶叶2Z5少儿编程网-https://www.pxcodes.com


牙膏2Z5少儿编程网-https://www.pxcodes.com

要知道大红也好,红配绿也好,都是很俗的好嘛!2Z5少儿编程网-https://www.pxcodes.com


衣服2Z5少儿编程网-https://www.pxcodes.com


原理2Z5少儿编程网-https://www.pxcodes.com


2Z5少儿编程网-https://www.pxcodes.com


image.png2Z5少儿编程网-https://www.pxcodes.com


image.png2Z5少儿编程网-https://www.pxcodes.com

衣服能让你看起来更高?加一个帽子的差别有多大?2Z5少儿编程网-https://www.pxcodes.com


image.png2Z5少儿编程网-https://www.pxcodes.com


image.png2Z5少儿编程网-https://www.pxcodes.com

更多原文请直接看知乎上相关问题,长按二维码就可以访问了:2Z5少儿编程网-https://www.pxcodes.com


二维码2Z5少儿编程网-https://www.pxcodes.com

如果觉得有帮助可以点可以分享给其他人

2Z5少儿编程网-https://www.pxcodes.com

Python编写循环的两个建议 | 鹅厂实战

少儿编程python循环

孙娲甚2Z5少儿编程网-https://www.pxcodes.com

本文系 “Python 工匠”系列的第 7 篇文章,已取得作者授权。

循环是一种常用的程序控制结构。我们常说,机器相比人类的**大优点之一,就是机器可以不眠不休的重复做某件事情,但人却不行。而**“循环”**,则是实现让机器不断重复工作的关键概念。2Z5少儿编程网-https://www.pxcodes.com

在循环语法方面,Python 表现的即传统又不传统。它虽然抛弃了常见的 for (init; condition; incrment) 三段式结构,但还是选择了 forwhile 这两个经典的关键字来表达循环。绝大多数情况下,我们的循环需求都可以用 for <item> in <iterable> 来满足,while <condition> 相比之下用的则更少些。2Z5少儿编程网-https://www.pxcodes.com

虽然循环的语法很简单,但是要写好它确并不容易。在这篇文章里,我们将探讨什么是“地道”的循环代码,以及如何编写它们。2Z5少儿编程网-https://www.pxcodes.com


什么是“地道”的循环?

“地道”这个词,通常被用来形容某人做某件事情时,非常符合当地传统,做的非常好。打个比方,你去参加一个朋友聚会,同桌的有一位广东人,对方一开口,句句都是标准京腔、完美儿化音。那你可以对她说:“您的北京话说的真地道”。2Z5少儿编程网-https://www.pxcodes.com

既然“地道”这个词形容的经常是口音、做菜的口味这类实实在在的东西,那“地道”的循环代码又是什么意思呢?让我拿一个经典的例子来解释一下。2Z5少儿编程网-https://www.pxcodes.com

如果你去问一位刚学习 Python 一个月的人:“如何在遍历一个列表的同时获取当前下标?”。他可能会交出这样的代码:2Z5少儿编程网-https://www.pxcodes.com

index = 0
for name in names:
    print(index, name)
    index += 1

上面的循环虽然没错,但它确一点都不“地道”。一个拥有三年 Python 开发经验的人会说,代码应该这么写:2Z5少儿编程网-https://www.pxcodes.com

for i, name in enumerate(names):
    print(i, name)

enumerate() 是 Python 的一个内置函数,它接收一个“可迭代”对象作为参数,然后返回一个不断生成 (当前下标, 当前元素) 的新可迭代对象。这个场景使用它**适合不过。2Z5少儿编程网-https://www.pxcodes.com

所以,在上面的例子里,我们会认为第二段循环代码比第一段更“地道”。因为它用更直观的代码,更聪明的完成了工作。 2Z5少儿编程网-https://www.pxcodes.com

enumerate() 所代表的编程思路

不过,判断某段循环代码是否地道,并不仅仅是以知道或不知道某个内置方法作为标准。我们可以从上面的例子挖掘出更深层的东西。2Z5少儿编程网-https://www.pxcodes.com

如你所见,Python 的 for 循环只有 for <item> in <iterable> 这一种结构,而结构里的前半部分 - 赋值给 item - 没有太多花样可玩。所以后半部分的 可迭代对象 是我们**能够大做文章的东西。而以 enumerate() 函数为代表的*“修饰函数”*,刚好提供了一种思路:通过修饰可迭代对象来优化循环本身。2Z5少儿编程网-https://www.pxcodes.com

这就引出了我的第一个建议。2Z5少儿编程网-https://www.pxcodes.com


建议1:使用函数修饰被迭代对象来优化循环

使用修饰函数处理可迭代对象,可以在各种方面影响循环代码。而要找到合适的例子来演示这个方法,并不用去太远,内置模块 itertools 就是一个绝佳的例子。2Z5少儿编程网-https://www.pxcodes.com

简单来说,itertools 是一个包含很多面向可迭代对象的工具函数集。我在之前的系列文章《容器的门道》里提到过它。2Z5少儿编程网-https://www.pxcodes.com

如果要学习 itertools,那么 Python *方文档 是你的**,里面有非常详细的模块相关资料。但在这篇文章里,侧重点将和*方文档稍有不同。我会通过一些常见的代码场景,来详细解释它是如何改善循环代码的。2Z5少儿编程网-https://www.pxcodes.com

1. 使用 product 扁平化多层嵌套循环

虽然我们都知道*“扁平的代码比嵌套的好”*。但有时针对某类需求,似乎一定得写多层嵌套循环才行。比如下面这段:2Z5少儿编程网-https://www.pxcodes.com

def find_twelve(num_list1, num_list2, num_list3):
    """从 3 个数字列表中,寻找是否存在和为 12 的 3 个数
    """
    for num1 in num_list1:
        for num2 in num_list2:
            for num3 in num_list3:
                if num1 + num2 + num3 == 12:
                    return num1, num2, num3

对于这种需要嵌套遍历多个对象的多层循环代码,我们可以使用product()函数来优化它。product()可以接收多个可迭代对象,然后根据它们的笛卡尔积不断生成结果。2Z5少儿编程网-https://www.pxcodes.com

from itertools import product


def find_twelve_v2(num_list1, num_list2, num_list3):
    for num1, num2, num3 in product(num_list1, num_list2, num_list3):
        if num1 + num2 + num3 == 12:
            return num1, num2, num3

相比之前的代码,使用 product() 的函数只用了一层 for 循环就完成了任务,代码变得更精炼了。2Z5少儿编程网-https://www.pxcodes.com

2. 使用 islice 实现循环内隔行处理

有一份包含 Reddit 帖子标题的外部数据文件,里面的内容格式是这样的:2Z5少儿编程网-https://www.pxcodes.com

python-guide: Python best practices guidebook, written for humans.
---
Python 2 Death Clock
---
Run any Python Script with an Alexa Voice Command
---
<... ...>

可能是为了美观,在这份文件里的每两个标题之间,都有一个 "---" 分隔符。现在,我们需要获取文件里所有的标题列表,所以在遍历文件内容的过程中,必须跳过这些无意义的分隔符。2Z5少儿编程网-https://www.pxcodes.com

参考之前对 enumerate() 函数的了解,我们可以通过在循环内加一段基于当前循环序号的 if 判断来做到这一点:2Z5少儿编程网-https://www.pxcodes.com

def parse_titles(filename):
    """从隔行数据文件中读取 reddit 主题名称
    """
    with open(filename, 'r') as fp:
        for i, line in enumerate(fp):
            # 跳过无意义的 '---' 分隔符
            if i % 2 == 0:
                yield line.strip()

但对于这类在循环内进行隔行处理的需求来说,如果使用 itertools 里的islice()函数修饰被循环对象,可以让循环体代码变得更简单直接。2Z5少儿编程网-https://www.pxcodes.com

islice(seq, start, end, step)函数和数组切片操作*( list[start:stop:step] )有着几乎一模一样的参数。如果需要在循环内部进行隔行处理的话,只要设置第三个递进步长参数 step 值为 2 即可(默认为 1)*。2Z5少儿编程网-https://www.pxcodes.com

from itertools import islice

def parse_titles_v2(filename):
    with open(filename, 'r') as fp:
        # 设置 step=2,跳过无意义的 '---' 分隔符
        for line in islice(fp, 0, None, 2):
            yield line.strip()

3. 使用 takewhile 替代 break 语句

有时,我们需要在每次循环开始时,判断循环是否需要提前结束。比如下面这样: 2Z5少儿编程网-https://www.pxcodes.com

for user in users:
    # 当第一个不合格的用户出现后,不再进行后面的处理
    if not is_qualified(user):
        break

    # 进行处理 ... ...

对于这类需要提前中断的循环,我们可以使用 takewhile() 函数来简化它。takewhile(predicate, iterable) 会在迭代 iterable 的过程中不断使用当前对象作为参数调用 predicate 函数并测试返回结果,如果函数返回值为真,则生成当前对象,循环继续。否则立即中断当前循环。2Z5少儿编程网-https://www.pxcodes.com

使用 takewhile 的代码样例:2Z5少儿编程网-https://www.pxcodes.com

from itertools import takewhile

for user in takewhile(is_qualified, users):
    # 进行处理 ... ...

itertools 里面还有一些其他有意思的工具函数,他们都可以用来和循环搭配使用,比如使用 chain 函数扁平化双层嵌套循环、使用 zip_longest 函数一次同时循环多个对象等等。2Z5少儿编程网-https://www.pxcodes.com

篇幅有限,我在这里不再一一介绍。如果有兴趣,可以自行去*方文档详细了解。2Z5少儿编程网-https://www.pxcodes.com

4. 使用生成器编写自己的修饰函数

除了 itertools 提供的那些函数外,我们还可以非常方便的使用生成器来定义自己的循环修饰函数。2Z5少儿编程网-https://www.pxcodes.com

让我们拿一个简单的函数举例:2Z5少儿编程网-https://www.pxcodes.com

def sum_even_only(numbers):
    """对 numbers 里面所有的偶数求和"""
    result = 0
    for num in numbers:
        if num % 2 == 0:
            result += num
    return result

在上面的函数里,循环体内为了过滤掉所有奇数,引入了一条额外的if判断语句。如果要简化循环体内容,我们可以定义一个生成器函数来专门进行偶数过滤:2Z5少儿编程网-https://www.pxcodes.com

def even_only(numbers):
    for num in numbers:
        if num % 2 == 0:
            yield num


def sum_even_only_v2(numbers):
    """对 numbers 里面所有的偶数求和"""
    result = 0
    for num in even_only(numbers):
        result += num
    return result

numbers变量使用even_only函数装饰后,sum_even_only_v2函数内部便不用继续关注“偶数过滤”逻辑了,只需要简单完成求和即可。2Z5少儿编程网-https://www.pxcodes.com

Hint:当然,上面的这个函数其实并不实用。在现实世界里,这种简单需求**适合直接用生成器/列表表达式搞定:sum(num for num in numbers if num % 2 == 0)

建议2:按职责拆解循环体内复杂代码块

我一直觉得循环是一个比较神奇的东西,每当你写下一个新的循环代码块,就好像开辟了一片黑魔法阵,阵内的所有内容都会开始无休止的重复执行。2Z5少儿编程网-https://www.pxcodes.com

但我同时发现,这片黑魔法阵除了能带来好处,它还会引诱你不断往阵内塞入越来越多的代码,包括过滤掉无效元素、预处理数据、打印日志等等。甚至一些原本不属于同一抽象的内容,也会被塞入到同一片黑魔法阵内。2Z5少儿编程网-https://www.pxcodes.com

你可能会觉得这一切理所当然,我们就是迫切需要阵内的魔法效果。如果不把这一大堆逻辑塞满到循环体内,还能把它们放哪去呢?2Z5少儿编程网-https://www.pxcodes.com

让我们来看看下面这个业务场景。在网站中,有一个每 30 天执行一次的周期脚本,它的任务是是查询过去 30 天内,在每周末特定时间段登录过的用户,然后为其发送奖励积分。2Z5少儿编程网-https://www.pxcodes.com

代码如下:2Z5少儿编程网-https://www.pxcodes.com

import time
import datetime


def award_active_users_in_last_30days():
    """获取所有在过去 30 天周末晚上 8 点到 10 点登录过的用户,为其发送奖励积分
    """
    days = 30
    for days_delta in range(days):
        dt = datetime.date.today() - datetime.timedelta(days=days_delta)
        # 5: Saturday, 6: Sunday
        if dt.weekday() not in (5, 6):
            continue

        time_start = datetime.datetime(dt.year, dt.month, dt.day, 20, 0)
        time_end = datetime.datetime(dt.year, dt.month, dt.day, 23, 0)

        # 转换为 unix 时间戳,之后的 ORM 查询需要
        ts_start = time.mktime(time_start.timetuple())
        ts_end = time.mktime(time_end.timetuple())

        # 查询用户并挨个发送 1000 奖励积分
        for record in LoginRecord.filter_by_range(ts_start, ts_end):
            # 这里可以添加复杂逻辑
            send_awarding_points(record.user_id, 1000) 

上面这个函数主要由两层循环构成。外层循环的职责,主要是获取过去 30 天内符合要求的时间,并将其转换为 UNIX 时间戳。之后由内层循环使用这两个时间戳进行积分发送。 2Z5少儿编程网-https://www.pxcodes.com

如之前所说,外层循环所开辟的黑魔法阵内被塞的满满当当。但通过观察后,我们可以发现 整个循环体其实是由两个完全无关的任务构成的:“挑选日期与准备时间戳” 以及 “发送奖励积分”2Z5少儿编程网-https://www.pxcodes.com


复杂循环体如何应对新需求

这样的代码有什么坏处呢?让我来告诉你。2Z5少儿编程网-https://www.pxcodes.com

某日,产品找过来说,有一些用户周末半夜不睡觉,还在刷我们的网站,我们得给他们发通知让他们以后早点睡觉。于是新需求出现了:“给过去 30 天内在周末凌晨 3 点到 5 点登录过的用户发送一条通知”2Z5少儿编程网-https://www.pxcodes.com

新问题也随之而来。敏锐如你,肯定一眼可以发现,这个新需求在用户筛选部分的要求,和之前的需求非常非常相似。但是,如果你再打开之前那团循环体看看,你会发现代码根本没法复用,因为在循环内部,不同的逻辑完全被 耦合 在一起了。☹️2Z5少儿编程网-https://www.pxcodes.com

在计算机的世界里,我们经常用**“耦合”**这个词来表示事物之间的关联关系。上面的例子中,*“挑选时间”“发送积分”*这两件事情身处同一个循环体内,建立了非常强的耦合关系。2Z5少儿编程网-https://www.pxcodes.com

为了更好的进行代码复用,我们需要把函数里的*“挑选时间”*部分从循环体中解耦出来。而我们的老朋友,**“生成器函数”**是进行这项工作的不二之选。2Z5少儿编程网-https://www.pxcodes.com

使用生成器函数解耦循环体

要把 “挑选时间” 部分从循环内解耦出来,我们需要定义新的生成器函数 gen_weekend_ts_ranges(),专门用来生成需要的 UNIX 时间戳:2Z5少儿编程网-https://www.pxcodes.com

def gen_weekend_ts_ranges(days_ago, hour_start, hour_end):
    """生成过去一段时间内周六日特定时间段范围,并以 UNIX 时间戳返回
    """
    for days_delta in range(days_ago):
        dt = datetime.date.today() - datetime.timedelta(days=days_delta)
        # 5: Saturday, 6: Sunday
        if dt.weekday() not in (5, 6):
            continue

        time_start = datetime.datetime(dt.year, dt.month, dt.day, hour_start, 0)
        time_end = datetime.datetime(dt.year, dt.month, dt.day, hour_end, 0)

        # 转换为 unix 时间戳,之后的 ORM 查询需要
        ts_start = time.mktime(time_start.timetuple())
        ts_end = time.mktime(time_end.timetuple())
        yield ts_start, ts_end

有了这个生成器函数后,旧需求“发送奖励积分”和新需求“发送通知”,就都可以在循环体内复用它来完成任务了:2Z5少儿编程网-https://www.pxcodes.com

def award_active_users_in_last_30days_v2():
    """发送奖励积分"""
    for ts_start, ts_end in gen_weekend_ts_ranges(30, hour_start=20, hour_end=23):
        for record in LoginRecord.filter_by_range(ts_start, ts_end):
            send_awarding_points(record.user_id, 1000)


def notify_nonsleep_users_in_last_30days():
    """发送通知"""
    for ts_start, ts_end in gen_weekend_ts_range(30, hour_start=3, hour_end=6):
        for record in LoginRecord.filter_by_range(ts_start, ts_end):
            notify_user(record.user_id, 'You should sleep more')

总结

在这篇文章里,我们首先简单解释了“地道”循环代码的定义。然后提出了第一个建议:使用修饰函数来改善循环。之后我虚拟了一个业务场景,描述了按职责拆解循环内代码的重要性。2Z5少儿编程网-https://www.pxcodes.com

一些要点总结:2Z5少儿编程网-https://www.pxcodes.com

  • 使用函数修饰被循环对象本身,可以改善循环体内的代码
  • itertools 里面有很多工具函数都可以用来改善循环
  • 使用生成器函数可以轻松定义自己的修饰函数
  • 循环内部,是一个极易发生“代码膨胀”的场地
  • 请使用生成器函数将循环内不同职责的代码块解耦出来,获得更好的灵活性

腾讯技术工程来到知乎啦。本号立足于计算机以及互联网领域技术相关话题,特别是前沿领域的探索,目的是为技术爱好者提供专业、有见解的技术话题,将鹅厂**新的技术文章传递给知友,同时为研究人员提供讨论和参与的开放平台,共建技术生态圈。2Z5少儿编程网-https://www.pxcodes.com

腾讯技术工程未来也会邀请广大的鹅厂技术人员,作为我们的智囊团,为知友解答工作中的技术困惑,同时也请大家多多为我们仔细准备的回答点个『赞』,让我们在分享和鼓励中共同进步。有任何建议,欢迎私信我们!2Z5少儿编程网-https://www.pxcodes.com

更多技术干货请持续关注『腾讯技术工程』知乎号以及订阅我们的专栏『腾讯技术』。2Z5少儿编程网-https://www.pxcodes.com

2Z5少儿编程网-https://www.pxcodes.com

到底存在不存在不适合学编程的人?

少儿编程python循环

云摁2Z5少儿编程网-https://www.pxcodes.com

老男孩的Python 学了三周 目前还在day3纠结 循环 列表 字典 还懵懵懂懂 拿到练习题一脸懵逼 学着后面忘着前面 感觉自家不是这块料 想放弃了​2Z5少儿编程网-https://www.pxcodes.com

2Z5少儿编程网-https://www.pxcodes.com

Python学习教程:第四天-循环结构讲解

少儿编程python循环

窦敝悚2Z5少儿编程网-https://www.pxcodes.com

Python学习教程:循环结构

循环结构的应用场景

如果在程序中我们需要重复的执行某条或某些指令,例如用程序控制机器人踢足球,如果机器人持球而且还没有进入射门范围,那么我们就要一直发出让机器人向球门方向奔跑的指令。当然你可能已经注意到了,刚才的描述中其实不仅仅有需要重复的动作,还有我们上一个章节讲到的分支结构。再举一个简单的例子,比如在我们的程序中要实现每隔1秒中在屏幕上打印一个"hello, world"这样的字符串并持续一个小时,我们肯定不能够将print('hello, world')这句代码写上3600遍,如果真的需要这样做那么编程的工作就太无聊了。因此,我们需要了解一下循环结构,有了循环结构我们就可以轻松的控制某件事或者某些事重复、重复、再重复的发生。在Python中构造循环结构有两种做法,一种是for-in循环,一种是while循环。2Z5少儿编程网-https://www.pxcodes.com

for-in循环

如果明确的知道循环执行的次数或者是要对一个容器进行迭代(后面会讲到),那么我们推荐使用for-in循环,例如下面代码中计算:2Z5少儿编程网-https://www.pxcodes.com

"""
用for循环实现1~100求和

Version: 0.1
Author: 骆昊
"""

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

这里南瓜需要跟大家说明的是上面代码中的range类型,range可以用来产生一个不变的数值序列,而且这个序列通常都是用在循环中的,例如:2Z5少儿编程网-https://www.pxcodes.com

  • range(101)可以产生一个0到100的整数序列。
  • range(1, 100)可以产生一个1到99的整数序列。
  • range(1, 100, 2)可以产生一个1到99的奇数序列,其中的2是步长,即数值序列的增量。

知道了这一点,我们可以用下面的代码来实现1~100之间的偶数求和。2Z5少儿编程网-https://www.pxcodes.com

"""
用for循环实现1~100之间的偶数求和

Version: 0.1
Author: 骆昊
"""

sum = 0
for x in range(2, 101, 2):
    sum += x
print(sum)

也可以通过在循环中使用分支结构的方式来实现相同的功能,代码如下:2Z5少儿编程网-https://www.pxcodes.com

"""
用for循环实现1~100之间的偶数求和

Version: 0.1
Author: 骆昊
"""

sum = 0
for x in range(1, 101):
    if x % 2 == 0:
        sum += x
print(sum)

接下来南瓜跟大家讲一下while循环

while循环

如果要构造不知道具体循环次数的循环结构,我们推荐使用 while循环,while循环通过一个能够产生或转换出bool值的表达式来控制循环,表达式的值为True循环继续,表达式的值为False循环结束。下面我们通过一个“猜数字”的小游戏(计算机出一个1~100之间的随机数,人输入自己猜的数字,计算机给出对应的提示信息,直到人猜出计算机出的数字)来看看如何使用while循环。2Z5少儿编程网-https://www.pxcodes.com

"""
猜数字游戏
计算机出一个1~100之间的随机数由人来猜
计算机根据人猜的数字分别给出提示大一点/小一点/猜对了

Version: 0.1
Author: 南瓜
"""

import random

answer = random.randint(1, 100)
counter = 0
while True:
    counter += 1
    number = int(input('请输入: '))
    if number < answer:
        print('大一点')
    elif number > answer:
        print('小一点')
    else:
        print('恭喜猜对了!')
        break
print('你总共猜了%d次' % counter)
if counter > 7:
    print('你的智商余额明显不足')
说明: 上面的代码中使用了break关键字来提前终止循环,需要注意的是break只能终止它所在的那个循环,这一点在使用嵌套的循环结构(下面会讲到)需要引起注意。除了break之外,还有另一个关键字是continue,它可以用来放弃本次循环后续的代码直接让循环进入下一轮。

和分支结构一样,循环结构也是可以嵌套的,也就是说在循环中还可以构造循环结构。下面的例子演示了如何通过嵌套的循环来输出一个九九乘法表。2Z5少儿编程网-https://www.pxcodes.com

"""
输出乘法口诀表(九九表)

Version: 0.1
Author: 小南瓜
"""

for i in range(1, 10):
    for j in range(1, i + 1):
        print('%d*%d=%d' % (i, j, i * j), end='	')
    print()

练习

练习1:输入一个数判断是不是素数。

"""
输入一个正整数判断它是不是素数

Version: 0.1
Author: 小南瓜
Date: 2018-03-01
"""
from math import sqrt

num = int(input('请输入一个正整数: '))
end = int(sqrt(num))
is_prime = True
for x in range(2, end + 1):
    if num % x == 0:
        is_prime = False
        break
if is_prime and num != 1:
    print('%d是素数' % num)
else:
    print('%d不是素数' % num)

练习2:输入两个正整数,计算**大公约数和**小公倍数。

"""
输入两个正整数计算**大公约数和**小公倍数

Version: 0.1
Author: 小南瓜
Date: 2018-03-01
"""

x = int(input('x = '))
y = int(input('y = '))
if x > y:
    x, y = y, x
for factor in range(x, 0, -1):
    if x % factor == 0 and y % factor == 0:
        print('%d和%d的**大公约数是%d' % (x, y, factor))
        print('%d和%d的**小公倍数是%d' % (x, y, x * y // factor))
        break

练习3:打印三角形图案。

"""
打印各种三角形图案

*
**
***
****
*****

    *
   **
  ***
 ****
*****

    *
   ***
  *****
 *******
*********

Version: 0.1
Author: 南瓜
"""

row = int(input('请输入行数: '))
for i in range(row):
    for _ in range(i + 1):
        print('*', end='')
    print()


for i in range(row):
    for j in range(row):
        if j < row - i - 1:
            print(' ', end='')
        else:
            print('*', end='')
    print()

for i in range(row):
    for _ in range(row - i - 1):
        print(' ', end='')
    for _ in range(2 * i + 1):
        print('*', end='')
    print()

关于循环结构南瓜这里先跟大家讲这么多,伙伴们有哪里不清晰的地方,可以私信南瓜哈!后续会继续跟大家分享Python学习教程和Python学习路线!2Z5少儿编程网-https://www.pxcodes.com

2Z5少儿编程网-https://www.pxcodes.com

一文搞懂Python循环小技巧

少儿编程python循环

方箪醛2Z5少儿编程网-https://www.pxcodes.com

Python的for循环是coder**常用的语句之一,如果只是简单地对容器循环遍历,那便会少了很多美好的体验。像下面这样:2Z5少儿编程网-https://www.pxcodes.com

for i in range(10):    
    print(i)

python提供了很多用于循环的技巧,这些方法能让代码更加简洁美观,这次就来扒一扒。2Z5少儿编程网-https://www.pxcodes.com

enumerate()函数

当遍历一个非数值序列时,有时候会需要将元素和索引一起取出,这时候便可以用到enumerate()函数。enumerate()函数接受一个序列或者迭代器,返回一个元组,里面包含元素及其索引数值。2Z5少儿编程网-https://www.pxcodes.com

seasons = ['Spring', 'Summer', 'Fall', 'Winter']
print(list(enumerate(seasons)))
# 输出:[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]

你还可以通过调整start参数,规定序列数值的起始值:2Z5少儿编程网-https://www.pxcodes.com

list(enumerate(seasons, start=1))
# 输出:[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

这时候用for循环遍历enumerate()函数包装后的序列,就能得到元素及其索引值:2Z5少儿编程网-https://www.pxcodes.com

for i, v in enumerate(['tic', 'tac', 'toe']):
    print(i, v)
'''
0 tic
1 tac
2 toe

字典item()方法

遍历字典时,如果直接遍历字典对象,只能得到字典中的键:2Z5少儿编程网-https://www.pxcodes.com

>>> sample = {'a':1,'b':2,'c':3}
>>> for i in sample:
...     print(i)
...
a
b
c

如果使用字典的items()方法,便可以同时输出键和对应值:2Z5少儿编程网-https://www.pxcodes.com

>>> sample = {'a':1,'b':2,'c':3}
>>> for i in sample.items():
...     print(i)
...
('a', 1)
('b', 2)
('c', 3)

zip()函数

zip()函数接收一个或多个可迭代对象,并将各个迭代对象对应的元素聚合,返回一个元组的迭代器。2Z5少儿编程网-https://www.pxcodes.com

>>> x = [1, 2, 3]
>>> y = [4, 5, 6]
>>> zipped = zip(x, y)
>>> list(zipped)
[(1, 4), (2, 5), (3, 6)]

当同时在两个或更多序列中循环时,可以用 zip() 函数将其内元素一一匹配。2Z5少儿编程网-https://www.pxcodes.com

>>> color = ['white','blue','black']
>>> animal = ['cat','dog','pig']
>>> for i in zip(animal,color):
...     print(i)
...
('cat', 'white')
('dog', 'blue')
('pig', 'black') 

sorted()函数

当你需要对列表先进行排序再循环遍历时,就需要用到sorted()函数。2Z5少儿编程网-https://www.pxcodes.com

sorted()函数接收一个可迭代对象,返回一个排序好的列表。2Z5少儿编程网-https://www.pxcodes.com

除此之外,sorted()函数还有两个参数:key和reverse2Z5少儿编程网-https://www.pxcodes.com

key 指定带有单个参数的函数,用于从 iterable 的每个元素中提取用于比较的键 (例如 key=str.lower)。默认值为 None (直接比较元素)
reverse 为一个布尔值。如果设为 True,则每个列表元素将按反向顺序比较进行排序。
>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
>>> for f in sorted(set(basket)):
...     print(f)
...
apple
banana
orange
pear

reversed()函数

reversed()函数用于对可迭代对象中的元素进行反向排列,返回一个逆向的迭代器。2Z5少儿编程网-https://www.pxcodes.com

>>> list(reversed([2,5,3,9,6]))
[6, 9, 3, 5, 2]

for循环遍历reversed()函数包装的可迭代对象,便可以反向取数。2Z5少儿编程网-https://www.pxcodes.com

>>> for i in reversed([2,5,3,9,6]):
...     print(i)
...
6
9
3
5
2

总结

本文讲解了五个用于for循环的小技巧,它们分别是enumerate()、item()、zip()、sorted()、reversed(),这些方法函数不仅让循环更加简洁,更能用在其它诸多的代码中。2Z5少儿编程网-https://www.pxcodes.com

本文参考Python*方文档2Z5少儿编程网-https://www.pxcodes.com

简单的python循环基础知识

少儿编程python循环

陈挚劫2Z5少儿编程网-https://www.pxcodes.com

我们在写代码时经常会用到循环,python中有for循环和while循环,我们来详细的了解一下这两种循环。2Z5少儿编程网-https://www.pxcodes.com

for循环

Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串。
2Z5少儿编程网-https://www.pxcodes.com

我们通过一个例子来看一下for循环的具体使用,我们通过range()函数创建一个整数列表,然后将列表中的元素通过for循环打印出来。2Z5少儿编程网-https://www.pxcodes.com

# for i in range(5)开始迭代的时候,生成一个数值0,第二次迭代再生成数值1,第三次迭代再生成数值2,

for i in range(5):
    print(i)

# 输出:
0
1
2
3
4

上面是使用了range()函数,我们试试自己定义一个列表来通过for循环打印:2Z5少儿编程网-https://www.pxcodes.com

list1 = ['a', 'b', 'c']
for i in list1:
    print(l)

# 输出:
a
b
c

仔细看上面两个例子,我们发现,循环每次迭代时,for会从序列中取一个元素赋值给控制变量i(可自己定义),下一轮迭代又取下一个元素赋值给i。2Z5少儿编程网-https://www.pxcodes.com

for循环使用 else 语句
除了使用单独的for语句,还可以使用for ... else语句,else中的语句会在循环正常执行完的情况下执行。2Z5少儿编程网-https://www.pxcodes.com

list1 = ['a', 'b', 'c']
for i in list1:
    print(i)
else:
    print("循环正常执行完毕")
# 输出:
a
b
c
循环正常执行完毕

上面我们说到循环正常执行完毕的情况,那肯定是还有循环不正常执行完毕的情况。什么情况就算不正常执行完毕的退出呢?像通过break、continue语句退出循环的就不算正常执行完毕。2Z5少儿编程网-https://www.pxcodes.com

  • break语句:退出整个循环,如果嵌套了循环,则退出break所在的那层循环。
  • continue语句:跳过当前循环的剩余语句,然后继续进行下一轮循环。
  • pass语句:不做任何事情,一般用做占位语句。

for迭代字典
for迭代字典时,可以分为不同的几种方式:2Z5少儿编程网-https://www.pxcodes.com

  • 通过keys()迭代字典的key
dict1 = {'name': 'Tom', 'age': 11, 'sex': 'man'}

for i in dict1.keys():
    print(i)

# 输出:
name
age
sex
  • 通过values()迭代字典的value
for i in dict1.values():
    print(i)

# 输出:
Tom
11
man
  • 通过items()同时迭代key和value
for k, v in dict1.items():
    print(k, v)

# 输出:
name Tom
age 11
sex man

range() 函数的介绍

python range() 函数可创建一个整数列表,一般用在 for 循环中2Z5少儿编程网-https://www.pxcodes.com

语法range(start, stop[, step])
  • start:计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
  • stop:计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
  • step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)

while循环

while循环和for循环都能循环做一件重复的事情。不同的地方在于for循环是在序列穷尽时停止,而while循环是在条件不成立时停止。
while循环的执行语句可以是单个语句或语句块,判断条件可以是任何表达式,任何非零、或非空(null)的值均为true。当判断条件假false时,循环结束。2Z5少儿编程网-https://www.pxcodes.com

  • 真值表


我们通过一个实例来看一下while循环的使用:2Z5少儿编程网-https://www.pxcodes.com

a = 3
while a >=  1:
    print(a)
    a -= 1

# 输出:
3
2
1

循环条件为a>=1,所以当这个条件成立时就会继续循环,打印a。当a<1时就会停止循环。
当然,如果我们想要中途终止循环也可以使用breakcontinue语句。2Z5少儿编程网-https://www.pxcodes.com

while循环使用else
while循环和for循环一样,也可以使用else语句,我们一起来看一下:2Z5少儿编程网-https://www.pxcodes.com

a = 3
while a >= 1:
    print(a)
    a -= 1
else:
    print('循环结束 !')

# 输出:
3
2
1
循环结束 !

无限循环
如果你想要循环永远执行,可以让条件让真一直成立,比如说:2Z5少儿编程网-https://www.pxcodes.com

a = 1
while a == 1:
    print(a)
else:
    print('循环结束 !')

# 会一直循环打印1

break跳出循环2Z5少儿编程网-https://www.pxcodes.com

a = 0
while a < 10:
    print(a)
    a = a + 1
    if a == 3:
        print("break跳出循环")
        break
else:
    print('循环结束 !')

# 输出:
0
1
2
break跳出循环

continue进去下一轮循环2Z5少儿编程网-https://www.pxcodes.com

for i in range(1, 11):
    if i % 2:
       continue   
    print(i)

# 输出
2
4
6
8
10

上面代码中使用了continue语句,if 条件语句的意思是如果i%2为真(不等于0)就进入下一轮循环。如果i%2为假(等于0)时会执行print(i)语句,打印i 。2Z5少儿编程网-https://www.pxcodes.com

2Z5少儿编程网-https://www.pxcodes.com

中学生小朋友要学编程,该教他 Python 还是 VB?

少儿编程python循环

韦韪2Z5少儿编程网-https://www.pxcodes.com

语言不是问题,相比起关心什么语言,我认为对少年儿童而言,以下两点尤其重要:2Z5少儿编程网-https://www.pxcodes.com

1、是否有趣味性,能吸引他们的兴趣,让他们觉得这是一种玩乐而不是一种学习。2Z5少儿编程网-https://www.pxcodes.com

2、是否能学习并养成programming thinking。2Z5少儿编程网-https://www.pxcodes.com


以我以前的经历而言,初中毕业买了一台小霸王学习机,上面有两个编程环境:Logo和BASIC。于是一发不可收拾,小小年纪就开始通宵调代码了。(手动吃惊)2Z5少儿编程网-https://www.pxcodes.com


而我儿子更令人吃惊,今年六岁,自从买了一套乐高ev3机器人给他之后,他已经完全掌握了图形化编程的技巧,顺序、分支、循环结构基本上已经掌握了,各种传感器、触发条件等已经完全理解并灵活运用。当然现在他还不能根据题目解出算法,但在给定的算法基础上,修修改改增加功能和分支是完全没问题的。2Z5少儿编程网-https://www.pxcodes.com


因此我会推荐ev3以及Logo语言。前者适合低年龄的儿童作为初步学习编程,后者等他们掌握了使用键盘后,就可以以文字代码的形式进行编程。特别是Logo语言,对掌握什么是递归思想有直接的感受。2Z5少儿编程网-https://www.pxcodes.com

2Z5少儿编程网-https://www.pxcodes.com

[14] Python循环语句(一)

少儿编程python循环

陶阻2Z5少儿编程网-https://www.pxcodes.com

1. 概述

今天我们介绍循环语句,和条件判断一样,我们从流程图开始看起。首先看一下学习计划列表,粗体为已学,斜体为新增或修改内容。2Z5少儿编程网-https://www.pxcodes.com

  • 计算机编程的原理简要介绍
  • 集成开发环境PyCharm
  • 变量名、数字、字符串、列表
  • 句式、注释
  • 输入和输出
  • 条件判断语句
  • 循环语句
  • 各类数据结构
  • 函数
  • 模块和引入

2. 流程图

在正式介绍循环语句前,我们需要看一下背后的逻辑,**直观的还是流程图,用draw.io可以画。我们在条件判断中举例了一道题,是要求老师输入某一学生的各科成绩,**后按照各科比重算总成绩然后判断等第。不过在该程序中,我们只能一次计算一个学生的等第,如果我们有一个班级的学生,我们估计只能不停地手动一遍一遍执行程序。那么如果我们要一次输入并计算一堆学生的成绩呢?2Z5少儿编程网-https://www.pxcodes.com

假设我们已有一个班级的学生列表,2Z5少儿编程网-https://www.pxcodes.com

student_list = ['Alice', 'Bob', 'Cat', 'David', 'Evan', 'Frank', 'Gary', ]

我们想要该程序能在屏幕上按列表顺序显示学生名字,每次显示一个,等老师输入成绩后,判断该学生是否满90分合格(感觉在考驾照),并在屏幕上显示结果。2Z5少儿编程网-https://www.pxcodes.com

我们首先弄清楚背后的逻辑,首先我们给的列表可能是个空列表,意思是这个班是个空班,教务主任可以不用花心思了:2Z5少儿编程网-https://www.pxcodes.com

  1. 开始程序;
  2. 我们看的列表是否已到头,到头的话,结束程序,否则执行第3步;
  3. 显示列表中下一个学生的名字;
  4. 要求老师输入成绩;
  5. 判断是否合格,并输出成绩;
  6. 回到第2步;

流程图如下:2Z5少儿编程网-https://www.pxcodes.com

本程序关键是在于判断列表是否到头,也就是循环语句。循环语句本质就是不停地进行条件判断,Python提供了两种循环语句:while和for,各有各的优势,两者可以相互转换。注意Python没有do...while语句,不过我们可以用其他方式实现do...while,这我们以后会讲到。2Z5少儿编程网-https://www.pxcodes.com

3. while循环语句

我们从while循环语句开始,可以比较好地和if条件判断的知识衔接。while后面直接加上一个条件,如果满足条件,则运行while循环中的代码,进行完后,再回到while这一行继续判断,如果满足条件,再运行,返回判断,直到条件不满足的那一刻。2Z5少儿编程网-https://www.pxcodes.com

基本的循环要有以下组成部分:2Z5少儿编程网-https://www.pxcodes.com

  1. 控制变量的初始化,
  2. 循环的条件判断,
  3. 控制变量的更新。

初始化循环控制的变量,目的是能够有个开始的点,接下来就是循环,循环的本质就是不停地进行同一条件判断,**后我们要在循环中更新变量,以便于循环能更新并结束。2Z5少儿编程网-https://www.pxcodes.com

比如我们想要显示2的0次方到20次方,开始点是2的0次方:2Z5少儿编程网-https://www.pxcodes.com

# Initialize the control variable, which is exponent
exponent = 0

# Loop, while the power number is not 20 yet, print out 2 to the exponent
while exponent <= 20:
    print(2 ** exponent)
    # update the control variable
    exponent = exponent + 1

次方用的是**,**后结果是:2Z5少儿编程网-https://www.pxcodes.com

1
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768
65536
131072
262144
524288
1048576

从2的0次到2的20次,21个结果一行一行显示,如果不用循环,我们则要写一堆重复代码:2Z5少儿编程网-https://www.pxcodes.com

print(2 ** 0)
print(2 ** 1)
...
print(2 ** 20)

可以看到循环其实也简化了我们的程序,无需重复性写代码。2Z5少儿编程网-https://www.pxcodes.com

4. 用while循环解决上面的流程图

我们可以使用列表的下标和长度来实现列表的循环。下标代表我们本次循环查看的数据,是控制用的变量,长度代表一共有几个数据。2Z5少儿编程网-https://www.pxcodes.com

# Given a list of students' name
student_list = ['Alice', 'Bob', 'Cat', 'David', 'Evan', 'Frank', 'Gary', ]

# Initialize the counter which indicates index
ind = 0

# Length of the list indicates the number of students
total = len(student_list)

# Loop through the list
while ind < total:
    # Get the current student's name
    # We will look at this specific student at this loop
    student = student_list[ind]
    
    # Determine if the student passes the course
    if int( input("Please type the score for {}: ".format(student))) >= 90:
        print("PASSED: {}.".format(student))
    else:
        print("FAILED: {}.".format(student))
    
    # Increase the counter by 1 and prepare for the next student
    ind = ind + 1

该程序会从下标为0的学生Alice开始问分数、决定成绩,直到问到这个列表结束,也就是**后一个询问的对象是Gary。2Z5少儿编程网-https://www.pxcodes.com

这里我们是怎么确保循环会照顾到每一个学生而且不多不少正好从第一个问到**后一个呢?我们来一句一句分析这个代码,已经看懂以上例子的同学可以跳过下面的部分。2Z5少儿编程网-https://www.pxcodes.com

# Given a list of students' name
student_list = ['Alice', 'Bob', 'Cat', 'David', 'Evan', 'Frank', 'Gary', ]

这个是我们手上有的学生清单,也就是学校给的(**怕校董会编程),复制粘贴进代码就行了。2Z5少儿编程网-https://www.pxcodes.com

ind = 0
total = len(student_list)

这两行是关键,ind=0作为起点,证明我们首先会看列表中下标为0的元素,通过len函数我们可以数处一共几个元素,在这个例子中7个,2Z5少儿编程网-https://www.pxcodes.com

while ind < total:
    student = student_list[ind]
    if int(input("Please type the score for {}: ".format(student))) >= 90:
        print("PASSED: {}.".format(student))
    else:
        print("FAILED: {}.".format(student))
    ind = ind + 1

循环语句,先看这段的第一行和**后一行,也就是“while ind < total:”和”ind = ind + 1“。当ind比total数值小的时候,也就是我们下标比总数小的时候,判断成绩,判断完后ind增加1,跳回while这一行再进行判断。2Z5少儿编程网-https://www.pxcodes.com

当ind为0的时候,我们给Alice等第,给分完Alice,我们的ind增加1,变为1,跳回while语句,此时ind为1小于total的7,判断为True,执行循环内代码,也就是给Bob判成绩。然后ind再加1,while条件判断,2小于7,从列表取名字,Cat,输分给等第……以此类推。 2Z5少儿编程网-https://www.pxcodes.com

**后,我们看完Frank,此时ind为5,更新ind,ind的新值为6;跳回while,判断6小于7,正确,此时学生为Gary,输分给等第,ind更新,新值为7;跳回while,判断7小于7,错误,循环结束。2Z5少儿编程网-https://www.pxcodes.com

我们可以看到在循环结束后,我们正好停在Gary之后,因为下标从0开始,7个元素的列表中**后一个元素的下标为6,也就是说,列表**大下标是肯定小于列表元素总数量的,这里用小于号可以确保执行完Gary(下标6)之后,下标7不再满足小于7的条件,**后判断while ind < total为False,终止循环。2Z5少儿编程网-https://www.pxcodes.com

在本段程序中,我们可以看到,while下面的循环内代码被执行了7次,而while被判断了8次,主要是因为while的条件判断为正确7次,所以下面代码执行7次,**后再加上1次判断为误,用于终止循环,while那一行总共被判断8次。2Z5少儿编程网-https://www.pxcodes.com

这个代码有一句:2Z5少儿编程网-https://www.pxcodes.com

if int(input("Please type the score for {}: ".format(student))) >= 90:

其实它就是我们输入的值转换为整数后是否90+,其实和以前我们的写法没差别:2Z5少儿编程网-https://www.pxcodes.com

score = int(input("Please type the score for {}: ".format(student)))
if score >= 90:

我只是把两句合成一句用了。2Z5少儿编程网-https://www.pxcodes.com

当while运行结束后,也就是**后一次为False的判断后,我们则直接跳过while所管理的语句,执行之后的代码,如果我们像如下在**后添加一句和while缩进程度相等的print语句,**后当显示完所有学生等第、循环结束后,才会开始执行**后的print。2Z5少儿编程网-https://www.pxcodes.com

while ind < total:
    ...
    ind = ind + 1
print('Goodbye!')

接下来继续讲循环语句,循环语句主要涵盖while、for、break、continue以及赋值运算符,循环语句使用方法各种各样,循环的特色在于条件判断的设置需要结合天时地利,我在这里先只介绍**基本的,毕竟有句古话说得好,只有拼命努力才能看起来毫不费力,打好基础才能游刃有余。2Z5少儿编程网-https://www.pxcodes.com

感觉我的教程有点鸡汤化了。2Z5少儿编程网-https://www.pxcodes.com

2Z5少儿编程网-https://www.pxcodes.com

版权声明:标题:少儿编程python循环,地址:https://www.pxcodes.com/baike/1618292497149252.html 为少儿编程网编辑整理发布,转载请注明出处!如部分段落侵犯您的权益,请联系我们处理,谢谢!【2021-04-13 13:41:37】

少儿编程 循环