承接条件控制语句。条件控制语句像大树一样有很多的之差,那条路径通(也就是表达式判断为True)就会往哪一个树杈去运行,万涓溪水汇成大河。对于常用的程序结构形式,还有一种这篇文章就会讲解,那就是循环控制语句。正如前面所说,程序的执行是由上而下,从左至右的运行方式,但是如果我们遇到一件事情:需要做的事情都相似,只是需要重复做很多遍,如果只有条件控制语句,一个小细节就要执行一遍,那就太蛋疼了,因此除了在实际工作中遇到像大树一样逻辑的思路,我们需要让程序这种由上而下,从左只有的运行过程中,执行到我们想要重复做很多遍的事情,让这种法则局部“失效”。来回去运行计算,然后运行计算完毕后,继续按照这种运行法则向下去执行,答案是肯定的:那就是循环语句。

  循环控制语句简介

  我们把循环控制语句比作一个圆圈,符合一个条件就循环一次,符合一个条件就循环一次。和条件控制语句一样,其循环控制语句也有一个原则,这个原则叫避免死循环

  死循环:

  也就是说,在一个循环体内,由于设置的表达语句一致符合某个条件,这样就跳不出这个圆圈而在里面一致执行(如果电脑不死机,一直执行到海枯石烂!)。所以切记在循环控制语句内一定要避免死循环的发生。

  循环控制语句在python中有两种形式一种叫while循环控制语句,另外一种叫for循环控制语句。while看起来逻辑上比较繁琐,但是不能这样说,各自在解决某些问题上,都有相对好的选择。

第一部分: while 循环控制语句

  存在形式如下:

  (1)  num = 0   # 计数器初始化

    while num <=/< 表达式

      循环内容

      num += 1  # 计数器运行部分# while循环语句要加一个计数器

  (1)  num = 0   # 计数器初始化

    while num <=/< 表达式:

      循环内容

      num += 1  # 计数器运行部分

    else:  # 循环结束时执行这个位置

      语句

  解释如下

  其实这两种形式的区别就是后面增加了一个else:也就说形式(2) 整个循环体结束完毕后,再执行一个else:语句的内容。直白点儿说就是:“循环计算完毕,你还有什么话要说”?

  因此,单独解释一下形式(1)即可:

  计数器起到的作用就给定计数器一个初始值(这个变量名随便)随着表达式的内容一直为真,循环一直执行,每执行一次计数器累计一次,一直到累加表示部分为False了,整个循环体也就结束了。

  详细逻辑:当程序执行到while语句时,首先要计算表达式的值,如果表达式的值为假,那么结束整个while语句。如果表达式的值为真,则执行语句,执行完成语句再去结算表达式的值;如果表达式的值为假,结束整个while语句,如此循环往复,直到表达式的值为假才停止。对于此,举几个例子。

 

  举例1:循环计算列出1到5这几个数

 # 举例1
num = 1
while num <= 5:
print(num, end="")
num += 1
# 输出结果:12345

  

  举例2:循环计算1到100累计值

 # 举例2
# 计算1-100的累加求和
sum = 0 # 初始化存放容器
num1 = 1 # 初始化计数器
while num1 <= 100:
sum += num1
num1 += 1
# print(sum)
print(sum)
# 输出结果:5050

  举例3:循环把字符串中的每一个字符打印出来。

 # 举例3
# 按顺序打印字符串中的每一个位置
str = "Thomas is a good man"
index = 0 # 计数器初始化
while index < len(str):
print("str[%d] = %s" % (index, str[index]))
index += 1
# 输出结果:
# str[0] = T
# str[1] = h
# str[2] = o
# str[3] = m
# str[4] = a
# str[5] = s
# str[6] = # 这里的空格也是字符串的一个字符
# str[7] = i
# str[8] = s
# str[9] = # 这里的空格也是字符串的一个字符
# str[10] = a
# str[11] = # 这里的空格也是字符串的一个字符
# str[12] = g
# str[13] = o
# str[14] = o
# str[15] = d
# str[16] = # 这里的空格也是字符串的一个字符
# str[17] = m
# str[18] = a
# str[19] = n

  举例4:把一句话循环打印3遍,最终用else:输出一句话来。

 # 举例4
# while语句的第二种形式
a = 1
while a <= 3:
print("Thomas is a good man")
a += 1
else:
print("very very good")

  小结:在while循环控制语句中,一定要注意计数器的叠加情况。这个是控制while循环语句的重中之重。

第二部分:for 循环控制语句

  存在形式如下:

  (1) for 变量名 in 集合:   # 集合可以是range,也可以是一个列表

      语句

  (2) for 变量名 in 集合:

      语句

    else:

      语句    # 只有上面的for循环正常执行完毕,执行下面的else:语句。

  解释如下:

  首先,for循环也是存在两种形式,和while循环一样,最后的else:也是for循环正常执行完毕,执行下面的else:语句。不同点是:for 循环是通过一个变量名在一个集合里面去按照顺序的遍历一遍,遍历结束后这个for 循环体也就结束了。可以理解为:按照顺序取集合中的每一个元素,赋值给变量(这里看明白了,赋值给变量的意思是这个变量的值如果集合没有遍历完毕,一致按照顺序去赋值给变量进行判断,然后复制给变量进行判断,这个赋值的过程,其实我们前面接触到的print遍历一组数,字符,元组等,其实变量的值是处于不断赋值的过程,所以才能让print去打印。)如此循环往复。直到取完这个集合中的元素截止调出循环。

  其次,这里我们看到用到前面所说的range(开始,结束,步长(默认为1)函数,另外后面和这个集合也可以用一个列表[1,2,3,4...]来表示。这就好像我去篮子里面拿鸡蛋,知道拿出最后一个鸡蛋for循环语句也就结束了。

  最后,这里用到了前面说到的成员运算符in ,not in,其实还可用not,is ,is not身份运算符等。其实这里就是个亿逻辑判断。

  这里我们把range函数在说一下:

  函:range

    语:range(self, [,start] [,end] [,step])

      用:start--计数起始位置,end--计数结束位置,step--为计数的步长;如果range内为一个数值,默认表示时从0开始到这个数值,步长为1。这里的range也可以理解为列表生成器,生成数列,注意:所有的集合都是从0开始的序列(如果没有要求的话)

  举例1:把前面while循环语句的1-5个数打印出来,用for循环来表示

 # 举例1
# 遍历打印
for i in [1, 2, 3, 4, 5]:
print(i, end="")
print("\n")
# 输出结果:12345

  举例2:遍历2-20,步长为2的结果。

 # 举例2
# 遍历从2-20,步长为2的结果
for k in range(2, 20, 2):
print(k, end="")
print(" ", end="")
print("k的值是: %d" % k)
print("\n")
# 输出结果:2 4 6 8 10 12 14 16 18 k的值是: 18

  举例3:遍历整个字符串。

 # 遍历字符串
fruits = ['banana', 'apple', 'mango']
for fruit in fruits: # 第二个实例
print ('当前水果 :', fruit)
# 输出结果:
# 当前水果 : banana
# 当前水果 : apple
# 当前水果 : mango

  从这些例子里面可以看出,“遍历”的思路是循环结构中最长使用的方式方法,对于遍历我们前面也讲过一个函数叫enumerate函数,整个函数叫枚举函数,也就是在遍历的时候去记录现在遍历到第几个了。我们把这个函数再复习一下:

  函:enumrate

    语:enumrate(x, [,startNum])

      用:这里的x为枚举哪一个集合,其中startNum可以不写,默认是从0开始的。如果写的话像这样:

        默认:0 就从0 1 2 3 4 5 6 7...这样记录遍历到第几个了。

        设置:1 就是1 2 3 4 5 6 7 8...这样记录遍历到第几个。

        就是一个开始编号的意思。

  举例4:枚举1-5个数。

 # 举例4
# enumerate(x,[,start]) 枚举函数,start枚举开始数字
# 作用:
for index, m in enumerate([1, 2, 3, 4, 5], 1):
# index,m = 下标,元素,for 循环也可以用交换使赋值方式
print(index, m)
# 输出结果:
# 1 1
# 2 2
# 3 3
# 4 4
# 5 5

第三部分: 迭代器(Iterator)

  迭代器这部分内容分可迭代对象和迭代器。其实迭代器从从思想上理解就是循环的一种简写方式。

  可迭代对象:

    可迭代对象:可直接作用于for循环的对象统称为可迭代对象(Iterable,表示可迭代的)

  迭代器

    迭代器:不带可以作用于for循环,还可以被next函数不断调用并返回一个值,直到最后跑出一个stopIteration错误表示无法继续返回下一个值。

        可以被next()函数调用并不断返回下一个值的对象成为迭代器。

  函:isinstance()

    语:range(对象,识别类型)

      用:这个函数可以识别iterable那些可以迭代,iterator那些可以作为迭代器。

from collections.abc import Iterable,Iterator

# 那些可以作为迭代对象
print(isinstance([],Iterable))
print(isinstance((),Iterable))
print(isinstance({},Iterable))
print(isinstance("",Iterable))
print(isinstance((x for x in range(10)),Iterable))
print(isinstance(1,Iterable)) # 迭代器有哪些?
print(isinstance([],Iterator))
print(isinstance((),Iterator))
print(isinstance({},Iterator))
print(isinstance("",Iterator))
print(isinstance((x for x in range(10)),Iterator)) # 这是一个迭代器
print(isinstance(1,Iterator))

  我们从返回值可以看出,除了1不能作为迭代对象,其他都可以作为迭代对象;但是iterator能作为迭代器的只有迭代表达式。

  补充说明:

  我们需要导入一个collections库才能用isinstatnce函数,但是在Python3更高级的版本中调用这个库会产生错误。因为这个库的名字已经更改了。

  旧版:from collections import iterable,iterator

  新版:  from collections.abc import iterable,iterator   # 增加了一个abc后缀,这里要特别说明。

  函:iter()

    语:iter(把什么内容变成可迭代内容,)

      用:如果当前的内容不是要给迭代器,那么我们可以把什么内容转换为迭代器,后面内容不是唯一的用逗号进行分割。

  函:next()

    语:next(迭代器句柄)

      用:这个函数不是可以一次一次的进行迭代。

  举例说明:

# 迭代形式的使用
l = (x for x in range(5))
print(next(l))
print(next(l))
print(next(l))
print(next(l))
print(next(l))
# print(next(l)) # 报错了
# 返回0 1 2 3 4 迭代了4次
# 这里的迭代格式为x for x in range() # 使用迭代器,转换想要迭代的内容
a = iter([1,2,3,4,5])
print(next(a))
print(next(a))
print(next(a))
print(next(a))
print(next(a))
# 返回 1 2 3 4 5 迭代了5次 # 案例:
endstr = "end"
line = "\t"
str1 = ""
for str in iter(input,endstr):
str1 = str1 + str
if str == endstr:
break
str1 = str1 + line
print("您输入的内容是:%s" %str1) # 解释:iter生成一个迭代内容(input,endstr),在这就好比一个循环内容,到最后一个循环
# endstr的时候结束,也就是说一直循环input1,input2,input3...,endstr最后一个输入
# end字符串结束 # 输出内容:
# Thomas
# is
# a
# good
# man
# end
# 您输入的内容是:Thomas is a good man

  因此我们可以看到迭代器不光可以迭代数据类型,还可以迭代一个函数,最后一个例子当中迭代了input这个函数

第三部分:生成器(generator)

  生成器我们要记住一个函数叫做yeild,这个函数是相对于return这个来讲的。return这个表示函数结束并返回,yield这个表示暂停的意思。我们通过段函数来说明这个问题:

  第一段:正常的return

def r(n):
print("Hello,return")
while n>:
print("before return")
return n
n -=
print("after return")
r()
# 返回值:
# Hello,return
# before return

  我们可以看到碰到return整个值就反回了,不在执行。

  第二段:改为yield的代码

def y(n):
print("Hello,yield")
while n>:
print("before yield")
yield n
n -=
print("after yield")
yy = y()
yy.__next__() # 注意:在python2,next前后是没有双划线的
yy.__next__()
yy.__next__()
yy.__next__() # 报错,执行到第三遍
# 返回值:
# Hello,yield
# before yield
# before yield
# after yield
# before yield
# after yield
# StopIteration # 报错,执行到第三遍

总结:

  这样这两个循环体就解释完了,总结有一下两点注意:

  1. for语句中的"for 表达式 in 集合:"这句话是两句话的缩写
  第一句:表达式1 = 集合中的第一个元素,表达式2 = 集合中的第一个元素 ... ...实际是一个赋值语句
  第二句:当全部赋值完毕结束整个for循环语句
  因此:遍历过程其实是把整个赋值后的表达式打印出来,但是这个值的位置只有一个,赋值——覆盖——赋值——覆盖——最后一个运算值。

  2. 既然是表达式赋值方式,所以for循环也可用交互式赋值方式。

  3. 同样for的表达式后也要加上“:”

Python笔记_第一篇_面向过程第一部分_6.循环控制语句(while 和 for)_的更多相关文章

  1. 面向过程—面向对象(C++的封装,this)_内存四区_变量生命周期

    1.面向对象主要涉及  构造函数.析构函数.虚函数.继承.多态等. 2.对各种支持 的底层实现机制 c语言中,数据 和 处理数据的操作(函数) 是分开来声明,即语言本身并没有支持 “数据和函数”的关联 ...

  2. python自动化开发-[第五天]-面向过程、模块、包

    今日概要: 1.内置模块 2.协程函数 3.递归 4.面向过程编程与函数编程 5.模块 6.包 7.re正则 一.内置模块 1.匿名函数lambda 定义:匿名函数通常是创建了可以被调用的函数,它返回 ...

  3. python第四周迭代器生成器序列化面向过程递归

      第一节装饰器复习和知识储备------------ 第一节装饰器复习和知识储备------------ def wrapper(*args,**kwargs): index(*args,**kwa ...

  4. [Python笔记]第八篇:模块

    本篇主要内容:python常用模块用法介绍 什么是模块 模块,用一大段代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性 ...

  5. [Python笔记]第三篇:深浅拷贝、函数

    本篇主要内容:深浅拷贝,自定义函数,三目运算,lambda表达式, 深浅拷贝 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import ...

  6. python之迭代器、生成器、面向过程编程

    一 迭代器 一 迭代的概念 #迭代器即迭代的工具,那什么是迭代呢?#迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复,因而不 ...

  7. python函数之协程与面向过程编程

    第一:协程 初步了解协程 def eater(): print('start to eat') while True: food=yield print('is eating food:%s'%foo ...

  8. [Python笔记]第十一篇:面向对象

    以上就是本节对于面向对象初级知识的介绍,总结如下: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用 对象,根据模板创建的实例(即 ...

  9. python之迭代器、生成器与面向过程编程

    目录 一 迭代器 二 生成器 三 面向过程编程 一.迭代器 1.迭代器的概念理解 ''' 迭代器从字面上理解就是迭代的工具.而迭代是每次的开始都是基于上一次的结果,不是周而复始的,而是不断发展的. ' ...

随机推荐

  1. caffe 官方demo python api

    Jupyter https://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/net_surgery.ipynb 涉及: - ...

  2. sed -i添加到第一行

    用sed的i\命令在第一行前面插入即可,加上 -i 选项直接操作文件. sed -i '1i\要添加的内容' yourfile 查看插入第一行是否成功 sed -n '1,1p' yourfile

  3. [BJDCTF2020]The mystery of ip

    0x00 知识点 SSTI模板注入: 之前也写过: https://www.cnblogs.com/wangtanzhi/p/12238779.html SSTI模板注入: 模板注入涉及的是服务端We ...

  4. 使用Kali中的Metasploit生成木马控制Windows系统 (第九天 9.20)

    本文转自:https://www.cnblogs.com/yankaohaitaiwei/p/11556921.html 一.kali及Metasploit kali基于debin的数字取证系统,上面 ...

  5. 使用Oracle VM VirtualBox创建虚拟机教程

    使用Oracle VM VirtualBox创建虚拟机教程                                                                       ...

  6. css设置兄弟节点的样式(相邻的前一个节点)

    产品需求:想在鼠标移动到“移除”的时候,“1.产品匹配测试”添加下划线和更改字体颜色 需求分析:从需求可以看出使用 :hover 就可以解决的问题,但是在实践中发现兄弟选择器(+)不好使,(+)只能是 ...

  7. C++ STD Gems06

    generate.generate_n.sample.iota #include <iostream> #include <vector> #include <strin ...

  8. Python Learning Day6

    selenium操作 点击.清除操作 from selenium import webdriver from selenium.webdriver.common.keys import Keys im ...

  9. 自己整理的常用SQL Server 2005 语句、

    --创建数据库 create database 数据库 go --打开数据库 use 数据库 --删除数据库 drop database 数据库 Go --创建数据表 create table 数据表 ...

  10. [SUCTF 2019]EasyWeb

    0x00 知识点 本题知识量巨大,把我给看傻了..盯着网上师傅们的博客看了好久.. 知识点1 构造不包含数字和字母的webshell 思路来自p牛 参考链接: https://www.leaveson ...