while和for循环⽤法
本⽂介绍python中的while循环、for循环。在python中for可以⽤于循环,也可⽤于另⼀种近亲的列表解析,列表解析是python中⾮常重要的特性,详细内容见后⾯的⽂章。
⼀般来说,python写for循环⽐写while更容易、⽅便,⽽且python中的for⽐while效率要更⾼,如果可以,⽤for⽽不是while。while循环
python中的while/for循环和其它语⾔的while循环有些不⼀样,它⽀持else分⽀。结构如下:
while <CONDITION>:
CODE
else:
CODE_ELSE
注意,condition部分只能是表达式,不能是语句,所以condition中不能包含赋值语句,如while a = x:是错误的。
while和for的else分⽀表⽰当正常退出while/for循环的时候所执⾏的代码分⽀。所谓正常退出,是指不是通过break跳出的情况,也就是正常把所有循环条件轮完的情况。这对于那些需要通过设置标志位来判断的情况来说⾮常⽅便,⽽标志位通常是⽤于离开循环的时候,提供⼀个额外的标记、通知功能,⽐如退出循环时想的数据是否到。
例如搜索⼀个列表,并在退出时告知是否到。如果使⽤标志位来实现,如下:
found = False
while x and not found:
if match(x[0]):
print("found it")
found = True
else:
x = x[1:]
if not found:
print("not found")
如果通过else,则逻辑更清晰:
while x:
if match(x[0]):
print("found it")
break
x = x[1:]
else:
print("not found")
再例如,判断⼀个数(如下⾯的y)是否是质数。
y = 21
x = y // 2
while x > 1:
if y % x == 0:
print( y, "has a factor: ", x)
break
x -= 1
else:
print("y is a prime")
想象⼀下如果不使⽤while的else,上⾯的功能该如何实现。
pass、break、continue、else
这⼏个关键字都能⽤在while/for中。
break:退出整个循环(while/for),如果嵌套了循环,则退出break所在的那个层次
continue:直接跳到下⼀次循环
else:在循环正常退出(不是break中断的循环)时执⾏的所执⾏的默认代码块
pass:在python中作为空的占位符,表⽰什么也不做。⽐如:
if x:pass
while x:pass
def x():pass
class x:pass
在python 3.x中,pass的另⼀种⽅式是...,它也表⽰什么也不做的占位符。
for循环
python中的for是⼀个通⽤的序列迭代器,和bash的for语法类似。python中没有for(i=0;i<N;i++)的语法,但for结合range可以实现⼀样的功能,后⽂介绍。while语句简单例子
for语法:
for i in <Sequence>:
CODE
else:
CODE_ELSE
每次迭代时,for从序列中取⼀个元素赋值给控制变量i,下⼀轮迭代取下⼀个元素再赋值给i。和其它语⾔不太⼀样,for中的控制变量不会在for循环完后消失,它会保持最后⼀个被迭代的元素值。之所以会这样,是因为其它语⾔中for是⼀个代码块,⽽python中for不算是代码块,也就是说没有⾃⼰的名称空间。
实际上不⽌序列,只要是可迭代的对象,都能⽤for进⾏遍历。关于什么是可迭代的,将专门在迭代器相关的⽂章中解释。
例如,遍历⼀个字符串,因为它是序列
for i in 'xiaofang':
print(i)
print("var i after: ",i) # 输出g
遍历⼀个列表:
L = ["aa","bb","cc"]
for i in L:
print(i)
嵌套:
L = ["aa","bb","cc"]
for i in L:
for j in i:
print(j)
计算序列中所有数值的和:
L = [1,2,3,4,5]
sum = 0
for i in L:
sum += i
print(sum)
for迭代字典
for迭代字典时,迭代的是key。
D = {'a': 1,
'b': 2,
'c': 3}
for key in D:
print(key, "=>", D[key])
其它迭代字典的⼏种⽅式:
1.通过keys()迭代字典
1
2
for k in D.keys():
print(key, "=>", D[key])
2.直接迭代字典的value
for v in D.values():
print(v)
3.同时迭代key和value
for k, v in D.items():
print(k, v)
for中的赋值和序列解包
for迭代时,实际上是从可迭代对象中取元素并进⾏赋值的过程,python中各种变量赋值的⽅式在for中都⽀持。⽽且,python中变量赋值是按引⽤赋值的,所以每次迭代过程中赋值给控制变量的是那个元素的引⽤,⽽不是拷贝这个元素并赋值给控制变量。所以,如果赋值给控制变量的是可变对象时,修改控制变量会直接修改原始数据。
例如:
T = [(1, 2), (3, 4), (5, 6)]
for i in T:
print(i)
for (a, b) in T:
print(a, b)
输出:
(1, 2)
(3, 4)
(5, 6)
1 2
3 4
5 6
for还⽀持的赋值形式。
例如:
for (a, *b, c) in [(1, 2, 3, 4), (5, 6, 7, 8)]:
print(a, b, c)
结果:
1 [2, 3] 4
5 [6, 7] 8
因为python是按引⽤赋值的,所以控制变量都是直接指向迭代元素的,⽽不是拷贝副本后进⾏赋值。看下⾯的结果:
L = [1111, 2222]
print(id(L[0]))
print(id(L[1]))
print("-" * 15)
for i in L:
print(id(i))
输出结果:
46990096
46990128
---------------
46990096
46990128
可见,变量i和列表中元素的内存地址是⼀致的。
正因为是按引⽤赋值,所以迭代过程中修改赋值给控制变量i的不可变对象时会创建新对象,从⽽不会影响原始数据,但如果赋值给i的是可变对象,则修改i会影响原始数据。
例如:
L = [1111, 2222]
for i in L:
i += 1
print(L)
列表L不会改变:
[1111, 2222]
⽽下⾯修改控制变量i会改变原始对象:
L = [[1],[1,2],[1,2,3],[1,2,3,4]]
for i in L:
i.append(0)
print(L)
结果:
[[1, 0], [1, 2, 0], [1, 2, 3, 0], [1, 2, 3, 4, 0]]
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论