Python对象类型之循环

发布时间:2021-12-03 公开文章

 

 

 

 

 

着手开始写的时候就一直有一个画面在脑子中出现:小猪佩奇第N级,猪爸爸拿出来一本《混凝土的故事》,打开书的时候说道:混凝土是由砂子、水、水泥组成的,结果其他人都睡着了。于是,我在想,要是给土木人讲:python万法皆对象,对象类型有:



 

  • 数字:int,long,float,complex,bool
  • 字符:str,unicod
  • 列表:list
  • 字典:dict
  • 元组:tuple
  • 文件:file
  • 其他类型:集合(set),冻结集合(frozenset),类类型等。

是不是也有人睡着?相反,如果我直接说砂子、水泥、钢筋、混凝土,是不是觉得亲切?所以接下来将会从一砖一瓦的建筑材料说Python。
万法皆对象:在基建领域,你所看到的构筑物就是有以上提到的基础建材组成;在Python领域对象类型就可以看做基础建筑材料,然后由不同的施工工艺产生不同的单体模块或构造物。例如:一个函数(施工工艺)所包含的参数(基础建材),形成一个伪代码。

伪代码
#围墙条形基础开挖
变量类型:铲子、䦆头、羊角碾、块石、砖头、水泥、混凝土
#工艺流程:
#开挖条形基坑
#夯实基础
#抛填块片石
#混凝土填充找平
#砌砖
#如果基坑挖至设计标高,停止开挖;
#如果没有到设计标高,接着开挖。

情况一:

直到设计标高为止(while):

开挖不要停;

情况二:

持续开挖不要停(for):

直到设计标高(if)为止(break):


#没错本节讲述的就是循环

真代码
 

 

循环

循环的作用在于将一段代码重复执行多次。

while 循环

while <condition>:
    <statesments>

Python会循环执行<statesments>,直到<condition>不满足为止。

例如,计算数字01000000的和:

i = 0
total = 0
while i < 1000000:
    total += i
    i += 1
print(total)
499999500000

之前提到,空容器会被当成 False ,因此可以用 while 循环来读取容器中的所有元素:

plays = set(['Hamlet', 'Macbeth', 'King Lear'])
while plays:
    play = plays.pop()
    print('Perform', play)
Perform King Lear
Perform Macbeth
Perform Hamlet

循环每次从 plays 中弹出一个元素,一直到 plays 为空为止。

for 循环

for <variable> in <sequence>:
    <indented block of code>

for 循环会遍历完<sequence>中所有元素为止

上一个例子可以改写成如下形式:

plays = set(['Hamlet', 'Macbeth', 'King Lear'])
for play in plays:
    print('Perform', play)
Perform King Lear
Perform Macbeth
Perform Hamlet

使用 for 循环时,注意尽量不要改变 plays 的值,否则可能会产生意想不到的结果。

之前的求和也可以通过 for 循环来实现:

total = 0
for i in range(100000):
    total += i
print(total)
4999950000

然而这种写法有一个缺点:在循环前,它会生成一个长度为 100000 的临时列表。

生成列表的问题在于,会有一定的时间和内存消耗,当数字从 100000 变得更大时,时间和内存的消耗会更加明显。

为了解决这个问题,我们可以使用 xrange 来代替 range 函数,其效果与range函数相同,但是 xrange 并不会一次性的产生所有的数据:

total = 0
for i in range(100000):
    total += i
print(total)
4999950000

比较一下两者的运行时间:

%timeit for i in xrange(1000000): i = i
10 loops, best of 3: 40.7 ms per loop
%timeit for i in range(1000000): i = i
10 loops, best of 3: 96.6 ms per loop

可以看出,xrange 用时要比 range 少。

continue 语句

遇到 continue 的时候,程序会返回到循环的最开始重新执行。

例如在循环中忽略一些特定的值:

values = [7, 6, 4, 7, 19, 2, 1]
for i in values:
    if i % 2 != 0:
        # 忽略奇数
        continue
    print(i/2)
3
2
1

break 语句

遇到 break 的时候,程序会跳出循环,不管循环条件是不是满足:

command_list = ['start', 
                'process', 
                'process',
                'process', 
                'stop', 
                'start', 
                'process', 
                'stop']
while command_list:
    command = command_list.pop(0)
    if command == 'stop':
        break
    print(command)
start
process
process
process

在遇到第一个 'stop' 之后,程序跳出循环。

else语句

与 if 一样, while 和 for 循环后面也可以跟着 else 语句,不过要和break一起连用。

  • 当循环正常结束时,循环条件不满足, else 被执行;
  • 当循环被 break 结束时,循环条件仍然满足, else 不执行。

不执行:

values = [7, 6, 4, 7, 19, 2, 1]
for x in values:
    if x <= 10:
        print('Found:', x)
        break
else:
    print('All values greater than 10')
Found: 7

执行:

values = [11, 12, 13, 100]
for x in values:
    if x <= 10:
        print('Found:', x)
        break
else:
    print('All values greater than 10')
All values greater than 10

土木狗的视角:前面讲述了Python对象的基本类型。终于到了语法章节,在工地上很简单,如果达到某标准或进度,就进行下一个工序,这个看起来更像是现场监理干的活。就如上面的伪代码显示的一样,在python里面没有C++的诸多语法,你只要会if判断和for循环就可以做很多事情了for循环使用的频率是非常搞的,其与if嵌套使用,可以实现绝大部分的逻辑。再下一节,你将会看到一些语法糖,这样的用法如果理解了,if和for的组合就没有问题,甚至至此你就可以开启面向过程的撸码历程,没错,不用函数,到此就算是入门了,哈哈!


课后作业(可选)
按上一节运行自己的项目,新建一个*.ipynb文件,将上面代码敲入运行。