专业人士笔记”系列目录:
创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!
循环函数是编程中最基本的函数之一,是几乎所有编程语言的重要组成部分。循环使开发人员能够设置他们的代码的某些部分来重复许多循环,这些循环被称为迭代;本文涵盖了在Python中使用多种类型的循环和循环的应用
循环中的 Break 和 Continue
break语句:
当一个break语句在一个循环中执行时,控制流将立即从循环中“断开”
i = 0
while i < 7:
print(i)
if i == 4:
print("从循环中止")
break
i += 1
执行break语句后,循环语句将立即无条件终止
注意,从语法上讲,break语句只允许在循环内部使用,在某一个函数中的break语句不能用于终止它上级去调用这个函数的循环。
break语句也可以在for循环中使用,这是Python提供的另一个循环结构 :
for i in (0, 1, 2, 3, 4):
print(i)
if i == 2:
break
执行这个循环将打印:
0
1
2
注意,由于循环已经结束,所以3和4没有被打印出来
如果循环有一个else子句,那么当循环通过break语句终止时,这个else也不会执行
continue 语句
continue语句将跳过当前块的其余部分而继续循环,跳到循环的下一个迭代;与break一样,continue只能出现在循环中
for i in (0, 1, 2, 3, 4, 5):
if i == 2 or i == 4:
continue
print(i)
#输出
0
1
3
5
请注意,2和4没有打印,这是因为continue将进入下一个迭代,而不是在i == 2或i == 4时继续打印变量i。
嵌套循环
break and continue 只在单级循环中操作。下面的示例只会跳出内部的for循环,而不是外部的while循环 :
while True:
for i in range(1,5):
if i == 2:
break # 只会跳出内部循环 !
Python不具备同时跳出多个循环级别的能力——如果需要这样做,那么将一个或多个循环重构为一个函数,并使用return替换break即可
使用函数中的return代替break
return语句退出一个函数,而不执行函数之后的代码
如果在一个函数中有一个循环,那么在循环中使用return就相当于在循环中使用了break(当然,循环外的函数剩余的的代码也都没有执行) :
def break_loop():
for i in range(1, 5):
if (i == 2):
return(i)
print(i)
return(5)
如果代码里有嵌套循环,return语句将中止所有循环:
def break_all():
for j in range(1, 5):
for i in range(1,4):
if i*j == 6:
return(i)
print(i*j)
将会输出:
1# 1*1
2# 1*2
3# 1*3
4# 1*4
2# 2*1
4# 2*2
# 因为2*3 = 6,两个循环的剩余迭代都没有执行
For 循环
for循环遍历集合类型变量,如list或dict,并使用集合中的每个元素运行代码块
for i in [0, 1, 2, 3, 4]:
print(i)
上面的for循环遍历一组数字
每次迭代都将i的值设置为列表的下一个元素。首先是0,然后是1,然后是2,等等。输出将如下所示 :
0
1
2
3
4
range是一个在可迭代形式下返回一系列数字的函数,因此它可以在for循环中使用
for i in range(5):
print(i)
给出与第一个for循环完全相同的结果,注意,这里没有打印5,因为这里的范围是从0开始计数的前5个数字(不包括5本身)
这里分享论坛上有关迭代的一个热度问题:迭代器,可迭代和迭代到底是什么?
for循环可以在任何定义了__getitem__或__iter__函数的可迭代对象上进行迭代。__iter__函数返回一个迭代器,它是一个带有下一个函数的对象,该函数用于访问iterable的下一个元素。
迭代list列表
遍历可用于列表 :
for x in ['one', 'two', 'three', 'four']:
print(x)
#输出
one
two
three
four
如果希望循环遍历列表中的元素及其索引,可以使用Python的enumerate函数:
for index, item in enumerate(['one', 'two', 'three', 'four']):
print(index, '::', item)
#这里,index将打印出索引 item将打印出元素项
#枚举将生成元组,这些元组将解压缩为index(一个整数)和item(列表中的实际值)。上面的循环将打印出来
0 :: one
1 :: two
2 :: three
3 :: four
可以使用map和lambda对列表进行值操作的迭代,即对列表中的每个元素应用lambda函数 :
x = map(lambda e : e.upper(), ['one', 'two', 'three', 'four'])
print(list(x)) #python3 返回的是迭代器,需要转list
print(x) #python2 直接返回的list列表
#输出:
['ONE', 'TWO', 'THREE', 'FOUR']
补充:map函数
map() 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表(python2)或者迭代器(python3)
所以,x = map(lambda e : e.upper(), [‘one’, ‘two’, ‘three’, ‘four’]),这行代码相当于,先对每一个元素进行大写转换,返回值重新指定为list进行输出,此操作使用循环能达到同样的效果
带“else”条件的循环
for和while循环可以有一个else子句(实际上,这种用法相当少见)。else子句仅在for循环通过迭代直至完成而终止后执行,或在while循环通过其条件表达式变为false而终止后执行:
for i in range(3):
print(i)
else:
print('done')
i = 0
while i < 3:
print(i)
i += 1
else:
print('done')
#输出:
0
1
2
done
如果循环以其他方式(通过break语句或引发异常)终止,则else子句不执行
for i in range(2):
print(i)
if i == 1:
break
else:
print('done')
#输出:
0
1
大多数其他编程语言都没有这个可选的else循环子句。特别是else关键字的使用常常被认为是令人困惑的。
这种子句的最初概念可以追溯到Donald Knuth,如果我们根据结构化编程之前的if语句和goto语句或从低级汇编语言重写一个循环,else关键字的含义就会变得很清楚。
例如 :
while loop_condition():
...
if break_condition():
break
...
等价于:
#伪代码
<start>:
if loop_condition():
…
if break_condition():
goto <end>
…
goto <start>
<end>:
如果我们给它们每个附加一个else子句,它们仍然是等价的:
例如 :
while loop_condition():
…
if break_condition():
break
…
else:
print('done')
等价于 :
#伪代码
<start>:
if loop_condition():
…
if break_condition():
goto <end>
…
goto <start>
else:
print('done')
<end>:
带有else子句的for循环也可以用同样的方式理解。从概念上讲,只要可迭代对象或序列仍然有一些剩余元素,循环条件就仍然为真。
为什么存在这种奇怪的结构呢
for else构造的主要用途是一个简洁的元素判断实现:
a = [1, 2, 3, 4]
for i in a:
if type(i) is not int:
print(i)
break
else:
print("没有异常")
#当然,增加一个变量去计数来实现同样的功能是可以的,只是会更繁琐
为了使else在这个结构中更容易理解,我们可以把它想象成“如果没有中断”或“如果没有找到”。
Pass语句
当Python语法需要语句(例如for或while循环的主体内),但程序员不需要或不需要操作时,pass是一个空语句。这可以作为尚未编写的代码的占位符 :
for x in range(10):
pass
# 我们不想做任何事,或者还没有准备好做任何事,所以我们会先放个pass在这里,避免程序调试出错
在这个例子中,什么也不会发生。for循环将不会出现错误,但是不会执行任何命令或代码;pass允许我们成功地运行代码,而不需要完全实现所有的命令和操作。类似地,pass可以用于while循环,也可以用于选择和函数定义等。
遍历dictionary 字典
考虑下面的字典:
d = {"a": 1, "b": 2, "c": 3}
要遍历其键,可以使用:
for key in d:
print(key)
#输出:
"a"
"b"
"c"
上面是这种写法的简化版本:
for key in d.keys():
print(key)
遍历它的值用:
for value in d.values():
print(value)
#输出:
1
2
3
若要同时遍历其键和值,使用:
for key, value in d.items():
print(key, "::", value)
请注意,在Python 2中,.keys()、. values()和.items()返回一个列表对象。 如果您只需要遍历结果,您可以使用等效的.iterkeys()、. itervalues()和.iteritems()。
.keys()和.iterkeys()、. values()和.itervalues()、. items()和.iteritems()之间的区别是: iter *方法是生成器。 因此,字典中的元素按原样一一生成 ,在 返回列表对象时,所有元素都打包到列表中,然后返回以供进一步使用
do-while 循环
与其他语言不同,Python没有do-until或do-while结构(这将允许在测试条件之前执行一次代码)。然而,你可以结合while True和break关键字来达到同样的目的。
a = 10
while True:
a = a-1
print(a)
if a<7:
break
print('Done.')
#输出:
9
8
7
6
Done.
循环和元素解析
例如,如果你希望循环遍历一个对称元组(即每个元组长度一致)列表中的每一个固定位置的元素 :
collection = [('a', 'b', 'c'), ('x', 'y', 'z'), ('1', '2', '3')]
假如,我希望快速把每一个元素的第1位找出来(即’a’,’x’,’1′),剩余的也如此:
直观反应是这样做:
for item in collection:
i1 = item[0]
i2 = item[1]
i3 = item[2]
#业务逻辑
或这样:
for item in collection:
i1, i2, i3 = item
#业务逻辑
其实你可以简单地这样:
for i1, i2, i3 in collection:
print(i1)
print(i2)
print(i3)
#其它业务逻辑
#输出:
a
b
c
x
y
z
1
2
3
上面的语句,很容易把每个元组中对称位置的元素输出出来,在需要这样处理业务逻辑的时候尤其有用
迭代的步长
假设您有一个很长的元素列表,并且您只对列表中的其他元素感兴趣。也许您只想检查列表中的第一个或最后一个元素,或特定范围的条目。Python具有强大的索引内置功能。下面是一些如何实现这些场景的示例
下面是一个简单的列表,将在整个示例中使用 :
lst = ['alpha', 'bravo', 'charlie', 'delta', 'echo']
整个列表的迭代
要遍历列表中的每个元素并处理,可以使用如下所示的for循环 :
for s in lst:
print s[:1] # 打印出第一个字母
#输出:
a
b
c
d
e
下面的循环从索引为1的元素开始,以步长为2的间隔进行循环遍历
两个for循环的结果一样,只是不同的写法:
lst = ['alpha', 'bravo', 'charlie', 'delta', 'echo']
for s in lst[1::2]:
print(s)
for i in range(1, len(lst), 2):
print(lst[i])
#它们都会输出:
bravo
delta
While 循环
while循环将语句执行直到循环条件为false为止。下面的代码将总共执行循环语句4次。
i = 0
while i < 4:
#循环语句
i = i + 1
虽然上面的循环可以很容易地转换成更优雅的for循环,但是While循环对于检查是否满足某些条件非常有用。下面的循环将继续执行,直到myObject准备好为止 :
myObject = anObject()
while myObject.isNotReady():
myObject.tryToGetReady()
while循环也可以在没有任何条件表达式的情况下通过使用数字(复数或实数)或True来运行
import cmath
complex_num = cmath.sqrt(-1)
while complex_num: # 可以使用任意数字、True或任意值来替换这个复数
print(complex_num)
#这里永远输出 1j
如果条件始终为真,并且没有break或return这样的语句进行中断或异常终止。 那么while循环将一直运行(无限循环)
while True:
print "无限循环"
#注意:当因为网络、内存溢出等原因导致中断时,循环依然会中止
如果要避免这样的原因,可以使用try/catch语句结合continue:
while True:
try:
print "无限循环"
except Exception as e:
continue
今天的分享就到这里,禁止转载,违者必究!