python流程控制2

循环控制

一、while循环

       Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。
 
语法:
while 条件表达式:
    循环体
    ...
[else:
    语句块
    ...
]

  

流程图:

说明:

  • 条件表达式可以是任何表达式,任何非零、或非空(null)的值均为true。
  • 执行流程:先判断 while 后的条件,如果是 True 则开始执行循环体,执行完毕后,再去判断 条件,如果True 继续执行循环体...,如果条件不为真,则跳出循环,执行循环体后的语句。
  • while 中的 else 是可选的。这和其他语言的很大的区别,其他的语言中 while 中没有 else。 当 while 中的条件为 False 时,开始执行 else 中语句。
  • 如果提供了 else 语句,则 else 语句一定执行。除非你是通过 break 语句退出的循环。
  • 在循环体内一定要有改变判断条件的语句,否则会出现“死循环”。

示例:

#打印1-10
i=1
while i<=10:
    print(i)
    i+=1   #改变判断条件的语句
else:
    print("1-10打印结束!")      #循环结束执行

  

二、for...in...遍历

       除了while循环以外,for可以完成循环的功能。在python中for循环可以遍历任何序列的项目,如一个列表或者一个字符串。
 
语法:
for 临时变量 in 可迭代对象:
    循环体
    ...
[else:
   语句块
 ...
]

  

说明:
  • 可迭代对象包括字符串、列表、元组、字典、集合、range等。
  • 循环正常结束(执行完毕),而没有异常break跳出,就执行else后的语句,只要在循环体中执行了break语句,就不会执行else语句了。

遍历字符串
for _ in 'hello':
    print(_)
输出结果:
h
e
l
l
o

  

三、break语句和continue语句
 
       在Python里break语句和continue语句只能用在循环语句里。
 
       break语句用法:常用在满足某个条件,需要立刻退出当前循环时(跳出循环)。
       break语句可以用在for循环和while循环语句中。简单的说,break语句是会立即退出循环,在其后边的循环代码不会被执行。
 
       continue语句用法:满足某个条件,使循环跳过其循环体的剩余部分,并立即进入下一次循环。
 
break配合for循环
for letter in 'hello':
    if letter == 'l':
        break
    print(letter)   #输出'h','e'

  

break配合while循环

i=1
while i<10:
    print(i)
    i+=1
    if i==5:
        break
print('循环结束')    #输出1,2,3,4,循环结束

  

continue配合for循环

for letter in 'hello':
    if letter == 'l':
        continue
    print(letter)    #输出'h','e','o'

  

continue配合while循环

i=0
while i<10:
    i += 1
    if i%2:
        continue
    print(i)

print('循环结束')   #输出2,4,6,8,10 循环结束

  

四、多重循环

       循环语句里可以嵌套循环语句,我们称之为多重循环。简单点说就是循环体是循环语句。一般来说我们把嵌套的循环称为外循环,把被嵌套的循环称为内循环。

       while循环和for循环可以混合使用。

#九九乘法表
i = 1
while i <= 9:
    for j in range(1, i + 1):
        print('{}*{}={}'.format(i, j, i * j), end='    ')
    print()
    i += 1

运行结果:

1*1=1    
2*1=2    2*2=4    
3*1=3    3*2=6    3*3=9    
4*1=4    4*2=8    4*3=12    4*4=16    
5*1=5    5*2=10    5*3=15    5*4=20    5*5=25    
6*1=6    6*2=12    6*3=18    6*4=24    6*5=30    6*6=36    
7*1=7    7*2=14    7*3=21    7*4=28    7*5=35    7*6=42    7*7=49    
8*1=8    8*2=16    8*3=24    8*4=32    8*5=40    8*6=48    8*7=56    8*8=64    
9*1=9    9*2=18    9*3=27    9*4=36    9*5=45    9*6=54    9*7=63    9*8=72    9*9=81 

  

五、循环代码的优化

       循环语句在代码里必不可少,虽然现代计算机速度越来越快,空间也越来越大,对于大量数据处理仍然需要优化代码,优化代码可以从这几方面考虑:

       1、减少循环内部不必要的计算

       什么算是不必要的计算,就是指那些无论放在循环里面还是放在循环外面都不会改变程序运行结果,对于这样的能放到循环外面的一定要放到循环外面。

       2、嵌套循环中,尽量减少内层循环的计算
       对于循环来说,越往里面计算的频率越高,我们都知道在循环中时间复杂度的计算是乘法的关系,所以也是能往外放的尽量往外放。

       3、尽量使用局部变量

       尽量使用局部变量来代替全局变量,因为局部变量查询比较快,有助于效率的提升。

       4、使用 join() 连接字符串

       这个技巧呢不仅适用在循环里,可以说在程序的任意地方都适用。

       用 join() 来代替 ‘+’ 去连接字符串,因为 ‘+’ 拼接会产生新的字符串对象,如果你循环 10000次,那就会产生 10000 个对象,而 join 就不会,它只会产生 1 个对象,用这 1 个对象去重复计算。

示例:
# 循环代码优化测试
import time

start = time.time()
for i in range(1000):
    result = []
    for m in range(10000):
        result.append(i * 1000 + m * 100)
end = time.time()
print("耗时:{0}".format((end - start)))
start2 = time.time()
for i in range(1000):
    result = []
    c = i * 1000
    for m in range(10000):
        result.append(c + m * 100)
end2 = time.time()
print("耗时1:{0}".format((end2 - start2)))

运行结果:

耗时:3.019031047821045
耗时1:2.49700665473938

  

六、推导式

       推导式是从一个或者多个迭代器快速创建序列的一种方法。它可以将循环和条件判断结合, 从而避免冗长的代码。

       1、列表推导式

        列表推导式生成列表对象

[表达式 for item in 可迭代对象 ] 
或者:
[表达式 for item in 可迭代对象 if 条件判断]

  示例:

l1=[x for x in range(5)]
print(l1)
# [0, 1, 2, 3, 4]
l2=[x**2 for x in range(5)]
print(l2)
# [0, 1, 4, 9, 16]
l3=[x**2 for x in range(5) if x%2==1]
print(l3)
# [1, 9]
l4=[x for x in 'abcdefg']
print(l4)
# ['a', 'b', 'c', 'd', 'e', 'f', 'g']
cells=[(row,col) for row in range(2) for col in range(3)]
print(cells)
# [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]

  2、字典推导式

       字典推导式生成字典对象

{key : value for 表达式 in 可迭代对象}

  示例:

info = (('name', 'jack'), ('age', 14))
d = {k: v for k, v in info.__iter__()}
print(d)
# {'name': 'jack', 'age': 14}
text = 'hello,world'
char_count = {c: text.count(c) for c in text}  # 统计字符个数
print(char_count)
# {'h': 1, 'e': 1, 'l': 3, 'o': 2, ',': 1, 'w': 1, 'r': 1, 'd': 1}

  3、集合推导式

       集合推导式生成集合对象

{表达式 for item in 可迭代对象 } 
或者:
{表达式 for item in 可迭代对象 if 条件判断} 

  示例:

s = {x for x in range(100) if x % 7 == 0}
print(s)
# {0, 98, 35, 70, 7, 42, 77, 14, 49, 84, 21, 56, 91, 28, 63}

  4、生成器推导式(生成元祖)

       元祖有没有推导式?用圆括号试试看:

t = (x for x in range(8))
print(t)
# <generator object <genexpr> at 0x0000000001DABA50>

  结果是一个生成器,显然,元组是没有推导式的。

       一个生成器只能运行一次。第一次迭代可以得到数据,第二次迭代发现数据已经没有了。

for elem in t:
    print(elem)
# 0
# 1
# 2
# 3
# 4
# 5
# 6
# 7

for elem in t:
    print(elem)
#

  

原文地址:https://www.cnblogs.com/shixiaoxun/p/14409815.html