1. while循环
为避免多次重复的代码,我们会用到循环
while (condition):
执行语句
while循环的结构非常简单只要条件满足就一直循环直到,条件不满足为止。
例子如下:
x=1
while x<=100:print(x)x+=1
结果就是最简单的输出1-100的数字
while循环适合那种没有确定次数,变化规律不是很明显,只是知道何时应该停止的循环。如果知道具体次数那就更适合下面这种循环for
2. for循环
while语句非常灵活,可在条件为真时反复执行代码块。,但有时你可能想根据需要进行定制。一种这样的需求是序列(或其他可迭代对象)中每个元素执行的代码块
注意:基本上可迭代对象是可使用for循环进行遍历的对象。
为此,可使用for语句:
>>> words=['this','is','an','ex','parrot']
>>> for word in words:
... print(word)
...
this
is
an
ex
parrot
1. range
鉴于迭代(也就是遍历)特定范围的内的数是一种常见的任务,python提供了一个创建范围的内置函数range
>>> range(0,10)
range(0, 10)
>>> list(range(0,10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
范围类似于切片。它们包含起始位置(这里为0)但不包含结束位置(这里为10)。在很多情况下,你都希望起始为0.实际上,如果只提供一个位置,将把这个位置视为结束为止,并假定起始位置为0
>>> range(0,10)
range(0, 10)
下面的程序打印数1~100:
for i in range(1,101):print(i)
注意,相比前面的while循环,这些代码紧凑的多。
练习用for循环画正五角星
#王八默认朝右边from turtle import *
lt(72)
for i in range(1,6):fd(100)rt(144)input("图已经画完请按回车关闭")
2. 迭代字典
要遍历字典的所有关键字,可像遍历序列那样使用普通的for语句
d={'x':1,'y':2,'z':3}
for key in d:print("{}'s value={}".format(key,d[key]))====================== RESTART: E:\python\python练习\字典遍历.py =====================
x's value=1
y's value=2
z's value=3
也可以使用keys等字典方法来获取所有的键。如果只对值感兴趣,可以使用d.values.
你可能记得,d.items以元组的方式返回键值对。这是for循环的有点之一,可在其中使用序列解包
a={1:2,3:4}
for i,j in a.items():print(i,j)输出为
1 2
3 4
字典元素的排序顺序是不确定的。如果顺序很重要,可将键或值存储在一个列表中并对列表排序,再进行迭代。
3. 一些迭代工具
1. 并行迭代
有时候,你想同时迭代俩个序列。假设有下面俩个列表:
names=[‘zhangsan’,‘lisi’,‘damon’,‘beth’]
ages=[12,12,23,11]
如果打印名字和对应的年龄,可以像下面这样做:
for i in range(len(name)):print(name[i],age[i])
i是作为循环索引的标准名称。一个很有用的并行迭代工具是内置函数zip它将俩个序列缝合起来,并返回一个由元组组成的序列。返回值是一个适合的迭代对象,可使用list将其转换为列表
names=['zhangsan','lisi','damon','beth']
ages=[12,12,23,11]
print(list(zip(names,ages)))输出为:
[('zhangsan', 12), ('lisi', 12), ('damon', 23), ('beth', 11)]
缝合后,可在循环元组解包。
names=['zhangsan','lisi','damon','beth']
ages=[12,12,23,11]
for name,age in zip(names,ages):print(name,age)输出为:zhangsan 12
lisi 12
damon 23
beth 11
函数zip可以用于缝合任意的序列。需要指出的是,当序列的长度不同时,函数zip在最短的序列用完后停止缝合。
2. 迭代时获取索引
在有些情况下,你需要知道迭代序列的同时获取当前对象的索引。例如,你可能想替换一个字符串列表所有包含子串‘xxx’ 的字符串,当然,完成这种任务的方法有很多,但这里假设要这样做:
for string in strings:if 'xxx' in string:index=strings.index(string)string[index]='[censored]'
这可行,替换前的搜索好像没有必要。另外返回的索引可能不对(即返回的是该字符串首次出现处的索引)。另一种方案是使用内置函数enumerate
s=['123','2312','23213','xxxew']
for index,string in enumerate(s):if 'xxx' in string:s[index]='hahah'
print(s)
input()
3. 反向迭代和排序后再迭代
来看另外俩个很有用的函数,reversed和sorted。曾经在列表那里浅显的说过他们,但可用于任何序列和可迭代的对象,且不就地修改对象,而是排列反转后和排序后的版本。
>>> sorted([4,3,6,8,3])
[3, 3, 4, 6, 8]
>>> sorted('hello,world')
[',', 'd', 'e', 'h', 'l', 'l', 'l', 'o', 'o', 'r', 'w']
>>>
>>> list(reversed('hello,world'))
['d', 'l', 'r', 'o', 'w', ',', 'o', 'l', 'l', 'e', 'h']
>>> ''.join(reversed('hello world'))
'dlrow olleh'
>>>
请注意,sorted返回一个列表,而reversed像zip那样返回一个更神秘的迭代对象,你无需关心到底是什么,只管在for循环或join方法等中使用它,不会有任何问题。只是你不能对它执行索引或切片操作,也不能直接对它调用列表方法。要执行这些操作,可先使用list对返回对象进行转换