第9课 python while循环、for循环、迭代器和iter()函数
一、while循环语句
1. while 循环语句结构
while循环中,当条件表达式为真时,就会重复的执行循环体内的语句块,直到条件为假。
count = 1
while count <= 10:
print("这是第%d次循环" % count)
count += 1
# 计数循环
while True:
print("dead loop")
# 死循环
一般情况下,很少使用死循环,除非要求程序一直是执行的,比如持续的网络请求的时候。一般死循环里面都会结合条件判断语句,用以在某些适当的情况下推出循环体。
2. 使用break语句跳出循环体
while True:
name = input("请输入你的名字(按q键退出):")
if name == "q" or name == "Q":
break
else:
print("你的名字是%s," % name +"欢迎你的到来!")
break
break语句是跳出当前语句所在的循环体,如果有循环嵌套的且break是在内层循环的,那么只会跳出内层循环, 不会跳出外层循环。
3. 使用continue语句跳出当次循环
continue 只是跳过当前次循环执行下次循环,并不是跳出整个循环体,示例如下:
count = 10
while count > 0:
if count == 5:
continue
print("loop", count)
count -= 1
# 结果:计数从10到6就停止了
对于嵌套的循环,continue跳过的也是它所在的那层循环的当次循环,与break是相似的。
4. else
count = 0
while count < 10:
print("hello", count)
count += 1
else:
print("while loop done well")
二、for循环语句
python中for循环语句的主要作用就是访问可迭代对象(序列,迭代器,生成器,字典,集合等)中的所有元素,并在所有元素都处理之后自动的结束循环。
1. for语句的语法结构
for 变量名 in 可迭代对象:
语句块
2. 用法示例
dict = {'Google': 'www.google.com', 'Runoob': 'www.runoob.com', 'taobao': 'www.taobao.com'}
print "字典值 : %s" % dict.items()
for key,values in dict.items():
print key,values
# 字典值 : [('Google', 'www.google.com'), ('taobao', 'www.taobao.com'), ('Runoob', 'www.runoob.com')]
#Google www.google.com
#taobao www.taobao.com
#Runoob www.runoob.com
# 利用了字典的items() 函数以列表返回可遍历的(键, 值) 元组数组。
3. range函数
range函数是用来生成一个由数字组成的列表的迭代器,它有三个参数,start、stop、step
>>> range(5)
# 生成从0-4的range列表迭代器
>>> range(1, 6)
# 生成从1开始到5的列表迭代器
>>> range(1, 10, 2)
# 生成从1开始到9结束的列表迭代器,每隔两步生成一个(可以理解为两个数之间相差2)
4. 结合range遍历序列类型
chars = "hello world"
for i in range(len(chars)):
print("chars[%d] = %s" % (i, chars[i]))
5. 使用enumerate方法同时返回序列下标和值
list1 = ['学习','测试','很好','可以','别说']
for i, value in enumerate(list1):
print("{}:{}".format(i,value))
6. for循环也有else语句
for i in range(10):
print i
else:
print "done"
三、迭代器和iter()函数
迭代器其实就是一个实现了迭代器协议的容器对象。它基于两个方法:
__next__返回容器的下一个项目
__iter__返回迭代器本身
迭代器可以通过使用一个iter内建函数和一个序列来创建,比如:
>>> i = iter('abc')
>>> i.__next__()
# 得到字符a
'a'
>>> i.__next__()
'b'
>>> i.__next__()
'c'
>>> i.__next__()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
当序列遍历完成时,将抛出一个StopIteration异常。这个跟for循环是兼容的,for循环会自动的捕获这个异常,如果捕获到了那么就会停止循环并退出。
迭代器只能不断的往后迭代,而不能往前,也不能复制。如果你需要重复的迭代同一个对象的时候,你只能再重新创建一个新的迭代器了。不过一般情况下,我们很少自己去创建迭代器,因为很多的函数已经内置了。我们只需会用就好了。
比如我们前面学到过的: range()、enumerate()函数都是直接返回一个迭代器。
如何查看一个对象是否是可迭代的?
使用dir函数,查看对象的魔术方法,只要方法里面有__iter__方法的就是可以迭代的(可以通过循环来遍历出来)
四、使用for循环生成各种推导式
解析器(推导式):就是利用for循环在列表、元组、集合、字典等容器类型中迭代一个可迭代对象的元素,将其中的元素放到对应的数据类型中,在迭代创建的过程中可以对数据进行二次加工后再存放。
1. 列表推导式
语法:[ 变量名 for 变量名 in 可迭代对象]
list1 = [x ** 2 for x in range(1, 11)]
# 输出为[1, 4, 9, 16, 25, 36, 49, 64, 81]
list2 = [x for x in range(100) if x % 2 == 0]
# 结合if语句,类似三元操作符的方式,计算 ~100中所有的偶数,也可以下面方式实现,但是会出现很多""空元素
list2 = ["" if x % 2 == 0 else x for x in range(100)]
list3 = [ "stu-{}".format(i) for i in range(1,6)]
#输出结果为['stu-1', 'stu-2', 'stu-3', 'stu-4', 'stu-5']
list4 = [x for x in range(3) for i in range(4)]
list5 = [[x for x in range(4)] for y in range(3)]
list6 = [('a%d' % i, i) for i in range(4)]
# 输出结果为[('a0', 0), ('a1', 1), ('a2', 2), ('a3', 3)]
list7 = [{'stu%d' % i: i+10} for i in range(3)]
#输出结果为[{'stu0': 10}, {'stu1': 11}, {'stu2': 12}]
key = "".join(x for x in ['我','是','李'])
# 输出结果为我是李,字符串拼接
2. 集合推导式(用法与列表相同)
s1 = {x for x in range(10)}
s2 = {x**2 for x in range(10) if x % 2 == 10}
list8 = {x for x in [1, 2, 4, 6, 7, 4, 6, 7, 2, 9]}
# 因为集合是由不重复的无序排列的元素组成,则可以利用此特性去除重复项
3. 字典推导式
d1 = {x: 'a' for x in range(5)}
d2 = {'x%d' % i: i * 2 for i in range(5) }
4. 生成器表达式
生成器表达式返回的是一个生成器(generator),生成器的好处就是当你需要的时候才会去生成,不需要的时候是懒惰的。因此占用很少的内存空间。
生成器表达式是用圆括号括起来的,里面的用法跟其它的推导式是一样的。
g1 = (x for x in range(10))
# 打印g1输出为<generator object <genexpr> at 0x0000025AA6970D58>
# 可以使用 for i in g1 的方式迭代
作业
问题1 :熟练使用python的while循环以及for循环,明白他们之间的区别以及用途。
for主要应用在遍历中,而while循环很少进行遍历使用(语句过多,没有for方便),while主要用于判断符合条件下循环
问题2:熟悉break和continue的用法及含义,特别是循环嵌套的时候,他们的作用范围。
break是跳出循环体,而continue只是跳出当前循环
问题3:熟悉各种方式的推导式的用法,特别是列表推导式的用法,自己多尝试不同的写法,看看结果会是什么样子的。
已练习
问题4:写一个猜字游戏:程序随机生成一个1到100之间的随机数,然后让用户从终端输入数字,如果用户输入的数字大了,那么就提示用户说数字大了,如果小了则提示小了,如果猜对了,则提示猜对了。猜不对的一直循环下去,直到用户猜对为止。(提示需要导入random模块,使用random.randint(start, end)方法可以生成从start到end(包括end)范围的随机数)
import random
i = random.randint(1,10)
print(i)
num = 0
while i != num:
num = input("请你猜一个1~10之间的数字:")
if num.isdigit():
if int(num) > i:
print("大了")
elif int(num) < i:
print("小了")
else:
break
else:
num = input("你输入了非数字内容,按任意键继续")
print("恭喜你,猜对了,数字是:",i)