当前位置:博客首页 > Python > 正文

第9课 python while循环、for循环、迭代器和iter()函数

作者: Jarvan 分类: Python 发布时间: 2019-04-16 17:29 百度已收录

一、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)

发表评论