while循环格式:
# 语法格式 while 条件: 满足条件执行的循环体 # 打印1到9 x = 1 while x <10: print(x) x += 1 # 接收用户输入姓名,不能为空 name = "" while not name or name.isspace(): name = input("name:") print("hello, {}".format(name))
for循环:
while语句可用于在条件为真的情况下反复执行代码块,但是有需要特定的情况,比如遍历可迭代对象(序列就是可迭代对象),需要使用for循环语句
ages = [12, 32, 43, 35, 46] for age in ages: print(age) words = ["is", "is", "name"] for word in words: print(word)
range(start, stop[, step]):
函数range返回的是一个可迭代对象
start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)
# 打印0-5 for i in range(6): print(i) # 打印10以内奇数:指定步长,每两步取一次值 for i in range(1, 10, 2): print(i) # 打印99乘法表: for i in range(1, 10): for j in range(1, i+1): print("%s*%s=%s" %(j, i, j*i), end="\t") print()
注:只要能使用for循环,就不要使用while循环
迭代字典:
遍历字典,可以像遍历序列那样使用for语句
d = {"x" : 1, "y" : 3, "z": 6} for key in d: print(key, d[key]) # x 1 # y 3 # z 6
也可以使用d.keys获取所有键
d.values获取所有值
d.items以元组方式返回键值对
d = {"x" : 1, "y" : 3, "z": 6} print(d.keys()) print(d.values()) print(d.items()) # dict_keys(['x', 'y', 'z']) # dict_values([1, 3, 6]) # dict_items([('x', 1), ('y', 3), ('z', 6)])
for循环的一个优点是可以在其中使用序列解包
d = {"x" : 1, "y" : 3, "z": 6} for key, value in d.items(): print(key, value) # x 1 # y 3 # z 6
并行迭代:
可能有时候会想要同时迭代两个序列
# 打印名字和对应的年龄, i用作循环索引的变量 names = ["an", "yuan", "li"] ages = [12, 34, 25] for i in range(len(names)): print(names[i], ages[i])
zip函数:内置函数,将两个序列缝合,返回一个元组组成的序列,返回的是一个可迭代对象,可以使用list转换为列表
names = ["an", "yuan", "li"] ages = [12, 34, 25] print(list(zip(names, ages))) # [('an', 12), ('yuan', 34), ('li', 25)] # 缝合后就可以循环中解包 for name, age in zip(names, ages): print(name, age) # an 12 # yuan 34 # li 25 # zip可以缝合任意数量的序列,当序列长度不同时,将终在最短的序列用完时停止 names = ["an", "yuan", "li"] a = [333, 444, 555] ages = [12, 34, 25, 34, 56, 66] print(list(zip(names, ages, a))) # [('an', 12, 333), ('yuan', 34, 444), ('li', 25, 555)]
迭代时获取索引:
在迭代序列对象的同时要获取索引
函数:enumerate
s = "banana" for string in s: if "a" in string: index = s.index("a") print(index) # 如果自读没有重复,那么可行,但是有重复的,返回的是该字符串中首次出现的字符索引,除非将字符替换,才会查找到后面字符的索引 for index, string in enumerate(s): if "a" in s: print(index, string) # 0 b # 1 a # 2 n # 3 a # 4 n # 5 a #使用内置函数enumerate,该函数能够迭代索引和值,索引是自动提供的
反向迭代和排序后迭代:
函数:reversed和sorted,类似列表方法reverse和sort,用于任何序列和可迭代对象,不就地修改对象,返回反转后排序后的版本
s = [1, 5, 3, 8, 2,6] print(sorted(s)) # [1, 2, 3, 5, 6, 8] s1 = "hi, world" print(sorted(s1)) # [' ', ',', 'd', 'h', 'i', 'l', 'o', 'r', 'w'] print(list(reversed(s1))) # ['d', 'l', 'r', 'o', 'w', ' ', ',', 'i', 'h'] print("".join(reversed(s1))) # dlrow ,ih
注:sorted返回一个列表,而reversed有点像zip
要按字母表排序,可先转换为小写。为此,可将sort或sorted的key参数设置为str.lower。例如,sorted("aBc",key=str.lower)返回['a','B','c']。
跳出循环:
break
用于跳出循环,当执行到break时,会跳出整个循环,继续往下执行
for i in range(6): if i == 3: break print(i) # 0 # 1 # 2
continue
用于跳出当前循环,执行下一次循环
for i in range(6): if i == 3: continue print(i) # 0 # 1 # 2 # 4 # 5
死循环和循环中使用else:
使用标志位tag来控制循环:
登录成功,接收用户命令,直到输入“q”退出
tag = True while tag: name = input("name:") passwd = input("password:") if name == "yuan" and passwd == "123456": print("login ok!") while tag: cmd = input(">>>:") if cmd == "q": tag = False print("your enter is %s" %cmd) else: print("login error!")