循环语句在绝大多数的语言中,都是必不可少的一种控制语句,循环语句允许我们执行一个语句或语句组多次。在python中有for循环和while循环两种,讲到这里,就不得不提到我们的迭代器对象

迭代器

迭代其实就是遍历,有一个接一个的意思(one by one)

迭代器对象(iterator)是python中的一个名词,有的迭代器可以重复迭代,有的迭代器只能迭代一次;迭代器可以用于for循环取出其中的子元素;迭代器对象包含有next和iter方法的实现,在正确范围内返回期待的数据以及超出范围后能够抛出StopIteration的错误停止迭代;可迭代对象(迭代工具)是包含于迭代器对象的一个概念,它包含有iter方法的实现;

我们可以使用isinstance()来判断一个对象是否为可迭代对象

 from collections import Iterable
def testFunc():
return 0;
print(isinstance('Python', Iterable))
print(isinstance([], Iterable))
print(isinstance({}, Iterable))
print(isinstance((1,), Iterable)) # tuple也可以作为迭代器
print(isinstance(10, Iterable))
print(isinstance(True, Iterable))
print(isinstance(testFunc, Iterable)) # 函数不可以作为迭代器

输出:

>>> True

>>> True

>>> True

>>> True

>>> False

>>> False

>>> False

Python的for循环本质上就是通过不断调用next函数实现的,要注意的是,python中迭代器的规则发生了一些变化,迭代器对象应该要实现的函数是__next__()而不是next();在next中可以定义对每个元素操作并有返回值作为相应位置的值,当没有数据了,StopIteration可以用于保持当前的状态。

而对于迭代器对象,__iter__()也是必须实现的方法,它用于返回迭代器对象本身,目的是为了允许容器和迭代器被用于for和in语句中。

我们接下来对一个数组[1,2,3,4,5]进行迭代,使其各元素乘2并输出

# 迭代器

 class get_double_iter:
def __init__(self):
self.list = [1,2,3,4,5]
self.n = 0
def __next__(self):
if self.n == len(self.list):
raise StopIteration()
else:
item = self.list[self.n] * 2
self.n += 1
return item
# 迭代工具
class Fib:
def __init__(self):
pass
def __iter__(self):
return get_double_iter()
for f in Fib(): # 下面会介绍for循环
print(f)

输出:

>>> 2

>>> 4

>>> 6

>>> 8

>>> 10

不是只有for循环能用到迭代器,list()与tuple()方法也能用到,分别用于将迭代器转化为数组与元素。

 arr = [1,2,3,4,5]
def change(x) :
return x + 2
print(list((map(change, arr))))
print(tuple((map(change, arr))))

输出:

>>> [3, 4, 5, 6, 7]

>>> (3, 4, 5, 6, 7)

for循环

for循环的基本语句是

for item in sequence:

statements(s)

sequence是一个有序列的项目,如迭代器(如map、zip迭代器)、迭代工具(如range迭代工具)或数组,或者干脆是一个字符串(这些数据类型以后会有详细讲解)

item是从sequence中遍历出的其中一个元素,它在for循环的语句块中能够被使用

statements(s)是for循环的循环主题,每一次的循环都要执行这个语句块,这个语句块可以使用item

注意:

1、如果sequence不可迭代,程序将会报错 –> 'int' object is not iterable

2、item、sequence不要求一定要这个命名。

rangefor循环:

range是一个迭代器,接受三个参数(起始点、结束点、步长),只有一个参数时默认由0开始,步长为1,迭代到该数的上一位;只有两个参数时默认由第一个参数开始迭代,步长为1,迭代到第二个参数的上一位。这里的记法是”左闭右开”,python中很多的规则都是左闭右开,大家深入后应该会对这句话有更深刻的理解。range的具体的使用会在后面的章节有具体介绍。

 for index in range(5):
print('数字:', index)

输出:

>>> 数字: 0

>>> 数字: 1

>>> 数字: 2

>>> 数字: 3

>>> 数字: 4

 for index in range(2, 10, 3):
print('数字:', index)

输出:

>>> 数字: 2

>>> 数字: 5

>>> 数字: 8

字符串for循环:

 for char in 'python':
print('当前字母:',char)

输出:

>>> 当前字母: p

>>> 当前字母: y

>>> 当前字母: t

>>> 当前字母: h

>>> 当前字母: o

>>> 当前字母: n

数组for循环:

 strArr = ['python', 'hello',  'world']
for item in strArr:
print('当前字母 :', item)

输出:

>>> 当前字母 : python

>>> 当前字母 : hello

>>> 当前字母 : world

map的for循环:

 thingList = ["pyTHon", "HeLLo", "WoRLd"]
def change(x) :
return x.lower().title() # 全部换为小写后首字母转大写
for item in (map(change, thingList)): # map方法返回的是一个迭代器
print(item)

输出:

>>> Python

>>> Hello

>>> World

zip的for循环

 a = [1, 2, 3, 4]
b = [10, 20, 30, 40, 50]
c = [100, 200, 300, 400, 500]
print(list(zip(a, b)))
print(list(zip(a)))
for item in zip(a, b, c): # 集体同时迭代,这是一个很好用的方法,迭代长度取决于最短的数组。zip方法返回的是一个迭代器
print(item[0], "-", item[1], "-", item[2])

输出:

>>> [(1, 10), (2, 20), (3, 30), (4, 40)]

>>> [(1,), (2,), (3,), (4,)]

>>> 1 - 10 – 100

>>> 2 - 20 – 200

>>> 3 - 30 – 300

>>> 4 - 40 – 400

while循环

while循环的基本语句是

while condition:

statements(s)

condition是一个判断条件,statements(s)是语句块,最先进入while循环语句时,先进行判断,若为True,则执行下面的语句块,执行语句块完毕之后,再次进行判断,如此循环,当判断语句判断为False时,不执行语句块,并退出循环。

while还有一种情况,即 while...else:

while condition:

statements(s)

else:

statements(s2)

这种情况下,当while条件判断为False时,先不退出循环,执行else中的代码块吗,执行完毕之后,再退出循环。else中代码块不会在while是通过break跳出而中断的情况下生效。

while循环:

 arr = [1, 2, 3, 4, 5, 10]
n = 0
while arr[n] < 10:
outStr = '执行了一次代码块: arr[' + str(n) + '] = ' + str(arr[n])
print(outStr)
n = n + 1
else:
print(arr[n])

输出:

>>> 执行了一次代码块: arr[0] = 1

>>> 执行了一次代码块: arr[1] = 2

>>> 执行了一次代码块: arr[2] = 3

>>> 执行了一次代码块: arr[3] = 4

>>> 执行了一次代码块: arr[4] = 5

>>> 10

当执行到n = 5时,进行了判断arr[5] < 10,为False,判断失败,执行else中的代码块,退出循环。

带break语句的while循环:

 arr = [1, 2, 3, 4, 5, 10]
n = 0
while arr[n] < 10:
outStr = '执行了一次代码块: arr[' + str(n) + '] = ' + str(arr[n])
print(outStr)
n = n + 1
if(arr[n] > 4):
break
else:
print(arr[n])

输出:

>>> 执行了一次代码块: arr[0] = 1

>>> 执行了一次代码块: arr[1] = 2

>>> 执行了一次代码块: arr[2] = 3

>>> 执行了一次代码块: arr[3] = 4

当执行到n = 4时,进行了语句块中的判断arr[4] > 4,为True,判断成功,执行break,由于是非正常退出,不执行else中的代码块。

Continue语句是用来结束本次循环体的语句,当执行continue时,将重新回到循环体中开始下一次的循环,当然,进入代码块前依旧需要进行判断。

带continue语句的while循环:

 while True:
your_name = input('your name is :')
if your_name == 'jobs':
break;
else:
continue;

输出:

>>> your name is :a

>>> your name is :a

>>> your name is :jobs

这个while循环是一个死循环,因为他的判断条件时True,但是我们在语句块中定义了一些判定条件,使得它不会一直执行下去,请保证你的代码不会一直执行(除非你需要的话),必要时可以使用CTRL + C停止运行。当输入为a时,判断错误,执行continue语句,跳出本次循环进入下一次循环,所以这段代码会一直让你输入名字,知道输入的为jobs时,执行break退出循环。

到这里我们已经讲了python的两种循环方式了,希望大家看过之后,能对大家的python有一点帮助,谢谢!

for和while——python中的循环控制语句详解的更多相关文章

  1. Python中的高级数据结构详解

    这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...

  2. Python中格式化format()方法详解

    Python中格式化format()方法详解 Python中格式化输出字符串使用format()函数, 字符串即类, 可以使用方法; Python是完全面向对象的语言, 任何东西都是对象; 字符串的参 ...

  3. python中的tcp示例详解

    python中的tcp示例详解  目录 TCP简介 TCP介绍 TCP特点 TCP与UDP的不同点 udp通信模型 tcp客户端 tcp服务器 tcp注意点   TCP简介   TCP介绍 TCP协议 ...

  4. Python Deque 模块使用详解,python中yield的用法详解

    Deque模块是Python标准库collections中的一项. 它提供了两端都可以操作的序列, 这意味着, 你可以在序列前后都执行添加或删除. https://blog.csdn.net/qq_3 ...

  5. python中的 zip函数详解

    python中zip()函数用法举例 定义:zip([iterable, ...]) zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple ...

  6. Python中的魔术方法详解

    介绍 在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”,中文称『魔术方法』,例如类的初始化方法 __init__ ,Python中所有的魔术方法均在官方文档中 ...

  7. Python中的魔术方法详解(双下方法)

    介绍 在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”,中文称『魔术方法』,例如类的初始化方法 __init__ ,Python中所有的魔术方法均在官方文档中 ...

  8. python中的buildin函数详解(第一篇)

    这会是很长的一个帖子,因为我打算从python最基础的东西开始,尝试去完全的掌握它,buildin中有一些常用的函数比如 abs, open, setattr, getattr, 大家都很了解他们的用 ...

  9. python中的builtin函数详解-第二篇

    classmethod(function) 这里不过多说明这个builtin方法的具体用法,python的文档和help函数已经给了这个方法充足的使用说明,所以我这里要说的时关于 classmetho ...

随机推荐

  1. linux下配置vnc-server 和gnome-session

    机器比较老,安装时间也十分久远,所以也不知道实验室系统当时是不是完全安装,最近需要使用vnc登录显示界面,结果问题就来了...没有安装vnc-server. (1)机器系统是rhel6.2的,所以就从 ...

  2. echart两组柱状图对比时,不同类型根据各类型的最大值为基准进行展示

    项目中遇到的问题:因为数据太小,箭头的地方展示不出来,这时的两组对比数据是根据一个最大值为基准进行渲染的.但我们想实现不同类型的对比根据不同的基准值渲染. 理想效果如下图: 实现代码: option ...

  3. Linux普通用户如何获取root权限 sudo -i

    从下图中可以知道,xiaolai这个用户连接到服务器后它没有权限,更新代码都更新不了 那么我们作为一个普通用户要获取管理员权限,怎么办呢? 输入 sudo -i 然后再输入普通用户的这个密码 获取成功 ...

  4. 悄摸直播(二)—— 播流器实现(拉取rtmp服务器中的数据流,播放直播画面)

    悄摸直播 -- JavaCV实现本机摄像头画面远程直播 播流器 一.功能说明 从rtmp服务器中获取视频流数据 + 展示直播画面 二.代码实现 /** * 播流器 * @param inputPath ...

  5. python+opencv中最近出现的一些变化( OpenCV 官方的 Python tutorial目前好像还没有改过来?) 记一次全景图像的拼接

    最近在学习过程中发现opencv有了很多变动, OpenCV 官方的 Python tutorial目前好像还没有改过来,导致大家在学习上面都出现了一些问题,现在做一个小小的罗列,希望对大家有用 做的 ...

  6. redis 5种类型

    redis可以不严谨的看成: redis: { name: value, name: value, } value的数据类型: 1.字典 2.列表 3.字符串 4.集合 5.有序集合 注意: redi ...

  7. limit_choices_to

    # 多对多 老师 teachers = models.ManyToManyField(verbose_name='任课老师', to='UserInfo', related_name="ab ...

  8. 使用FileZilla Pro S3协议访问七牛云对象存储

    偶然发现FileZilla还有Pro版本,主要是比免费版多了一些协议支持,也偶然发现七牛云支持了S3协议接口,这样刚好弥补了其没有FTP的不足,于是找官方文档,折腾一下,使用FileZilla Pro ...

  9. The system is running in low-graphics mode

    No internet 1.Ctrl + Alt + F1 2.login 3.input the code below: sudo chown lightdm:lightdm -R /var/lib ...

  10. Ubuntu固定多个静态ip

    步骤: 1.sudo vim /etc/network/interfaces 加入下列内容 auto eth0#此处查看自己的ip信息是eth0还是eth1等等 iface eth0 inet sta ...