Loading

python-条件循环及迭代器生成器

  • 条件控制

条件为假:0,False,' ',None,空容器(比如[],(),{},set())

如果if后面的语句太长,可以使用换行并且添加\

  • 循环

pass是空语句,是为了保持程序结构的完整性。

pass 不做任何事情,一般用做占位语句,为了避免不必要的报错

可以使用enumerate()函数进行遍历

对于序列,其会输出索引及对应的值

for index, item in enumerate(sequence):
#  process(index, item)
sequence = [12, 34, 34, 23, 45, 76, 89]
for i, j in enumerate(sequence):
     print(i, j) 
0 12
1 34
2 34
3 23
4 45
5 76
6 89
  •  迭代器

迭代器是一个可以记住遍历的位置的对象

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束

迭代器只能往前不会后退

使用iter()方法对一个可迭代对象创建迭代器

使用next()方法来移动一个迭代器,也可以使用for循环来移动迭代器 

list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
print (next(it))   # 输出迭代器的下一个元素
# 1
print (next(it))
# 2
list=[1,2,3,4]
it = iter(list) # 创建迭代器对象
for x in it:
  print (x, end=" ")
#
1 2 3 4
import sys         # 引入 sys 模块
list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
while True:
    try:
        print (next(it))
    except StopIteration:
        sys.exit()
# 1
# 2
# 3
# 4
  • 生成器

使用了 yield 的函数被称为生成器

生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行

import sys
def fibonacci(n): # 生成器函数 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n): 
            return
        yield a
        a, b = b, a + b
        counter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
while True:
    try:
        print (next(f), end=" ")
    except StopIteration:
        sys.exit()
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10
# 11
# 12
# 13
# 14
# 15
# 16
# 17
# 18
# 19
# 20

迭代器函数返回一个迭代器(而不是通常的使用iter()方法来直接生成一个迭代器,因为函数返回值的序列是未知的,如果直接全部算出会占用很大内存,有时候也不需要全部算出)

调用的时候使用next()方法(亦或是for循环的方式),即可移动这个返回的迭代器,一次移动就代表获得一次这个函数的返回值(调用一次计算一次)

一个函数 f,f 返回一个 list,这个 list 是动态计算出来的(不管是数学上的计算还是逻辑上的读取格式化),并且这个 list 会很大(无论是固定很大还是随着输入参数的增大而增大)

这个时候,我们希望每次调用这个函数并使用迭代器进行循环的时候一个一个的得到每个 list 元素而不是直接得到一个完整的 list 来节省内存,这个时候 yield 就很有用

使用小括号包裹推导式会生成生成器对象,而不是元组

 

 a = (2*x for x in range(2))
 type(a)
# <class 'generator'>

 

  • 遍历

在字典中遍历时,关键字和对应的值可以使用 items() 方法同时解读出来

knights = {'gallahad': 'the pure', 'robin': 'the brave'}
for k, v in knights.items():
     print(k, v)
# gallahad the pure
# robin the brave

在序列(除字典之外的序列)中遍历时,索引位置和对应值可以使用 enumerate() 函数同时得到

for i, v in enumerate(['tic', 'tac', 'toe']):
     print(i, v)
# 0 tic
# 1 tac
# 2 toe

同时遍历两个或更多的序列,可以使用 zip() 组合(序列之间有对应关系)

 questions = ['name', 'quest', 'favorite color']
 answers = ['lancelot', 'the holy grail', 'blue']
 for q, a in zip(questions, answers):
     print('What is your {0}?  It is {1}.'.format(q, a))
# What is your name?  It is lancelot.
# What is your quest?  It is the holy grail.
# What is your favorite color?  It is blue.

要反向遍历一个序列,首先指定这个序列,然后调用 reversed() 函数

要按顺序遍历一个序列,使用 sorted() 函数返回一个已排序的序列,并不修改原值

posted @ 2020-10-23 12:48  lixin2020  阅读(330)  评论(0)    收藏  举报