1 推到
推导式是可以从一个数据序列构建另一个新的数据序列的结构体, 共有三种推导:
列表(list)推导式
字典(dict)推导式
集合(set)推导式
列表(list)推导式
使用[]生成list
#实现数字0-9的平方组成的列表
squares = [x**2 for x in range(10)]
print(squares)
结果:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
def squared(x):
return x*x
multiples = [squared(i) for i in range(30) if i % 3 is 0]
print multiples
结果:
[0, 9, 36, 81, 144, 225, 324, 441, 576, 729]
字典(dict)推导式
字典推导和列表推导的使用方法是类似的,只不过中括号改成大括号。
#交换字典键与值
mcase = {'a': 10, 'b': 34}
mcase_frequency = {v: k for k, v in mcase.items()}
print(mcase_frequency)
结果:
{10: ‘a’, 34: ‘b’}
集合(set)推导式
集合推导与推到类似,也是使用大括号。
strings = ['a','is','with','if','file','exception']
print({len(s) for s in strings}) #有长度相同的会只留一个
结果:
{1, 2, 4, 9}
2 迭代器
它是一个带状态的对象,他能在你调用next()方法的时候返回容器中的下一个值,任何实现了iter和next()方法的对象都是迭代器,iter返回迭代器自身,next返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常,至于它们到底是如何实现的这并不重要。
iter()函数会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内的元素。next()也是python内置函数。在没有后续元素时,next()会抛出一个StopIteration异常,
迭代器是访问集合内元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问一遍后结束。
(1)迭代器的四大特性
1.跌代集合,字符串,有序依次———即有可迭代对象
2.线程不安全的,多线程访问同一个集合修改报错。
3.对于无法随机访问的数据结构,迭代器是唯一选择
4.只迭代当前元素,迭代前后均可不存
3 生成器
生成器其实是一种特殊的迭代器,不过这种迭代器更加优雅。有两种方式可以返回一个生成器:
1.推导 (x+1 for x in lst) 生成器表达式,返回迭代器
2.或者yield :生成 且 只生成一次,且停止到此
yield的功能:
1 把函数的结果做生迭代器(以一种优雅的方式封装好iter,next)
2 函数暂停与再继续运行的状态是由yield
yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行。
list=[1,2,3,4]
it = iter(list) # 创建迭代器对象
print (next(it)) # 输出迭代器的下一个元素
print (next(it))
结果:
1
2
def func():
print('first')
yield 11111111
print('second')
yield 2222222
print('third')
yield 33333333
print('fourth')
g=func()
print(g) # 返回对象
from collections import Iterator
print(isinstance(g,Iterator)) #判断是否为迭代器对象
print(next(g))
print('======>')
print(next(g))
print('======>')
print(next(g))
print('======>')
print(next(g))
结果:
True
first
11111111 #第一次next(g)
======>
second
2222222 #第二次next(g)
======>
third
33333333 #第三次next(g)
======>
fourth
Traceback (most recent call last):
File “E:/python/python/python/迭代器.py”, line 105, in
print(next(g))
StopIteration #第四次next(g)
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
#斐波那契数列
def fb():
a=0
b=1
for i in range(5)
yield b
a,b=b,a+b
f=fb() #f为对象生成器
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__()) #f中没有更多元素了,则抛出StopIteration异常
结果:
1
1
2
3
5
Traceback (most recent call last):
File “E:/python/python/python/迭代器.py”, line 86, in
print(f.next())
StopIteration
yield与return的比较:
相同:都有返回值的功能
不同:return只能返回一次值,而yield可以返回多次值