迭代
可以通过 for 循环来遍历这个 list 或 tuple,这种遍历我们称为迭代(Iteration)
只要是可迭代对象,无论有无下标,都可以迭代,比如 dict就可以迭代:
迭代的类型
判断可迭代对象
方法是通过 collections 模块的 Iterable 类型判断
In [1]: from collections import Iterable
##字符串
In [2]: isinstance('he',Iterable)
Out[2]: True
##列表
In [3]: isinstance([1,2,3],Iterable)
Out[3]: True
##整型数
In [4]: isinstance(22,Iterable)
Out[4]: False
##集和
In [5]: isinstance({1,2,3},Iterable)
Out[5]: True
##字典
In [6]: isinstance({'na':1,'asd':'we'},Iterable)
Out[6]: True
##元组
In [7]: isinstance((1,2,3),Iterable)
Out[7]: True
字典的迭代
默认情况下,dict 迭代的是 key,如果要迭代value则:
In [1]: d = {'name':'cici','age':14}
In [2]: from collections import Iterable
In [3]: for k,v in d.iteritems():
...: print k,v
...:
age 14
name cici
列表的迭代
对 list 实现类似 Java 的下标循环
python内置的枚举方法enumerate,把一个 list 变成索引元素对
In [4]: for i,value in enumerate([1,2,3,4]):
...: print i,value
...:
0 1
1 2
2 3
3 4
元组的迭代显示
两个变量的迭代显示
In [6]: for x,y in [('a',1),('b',2),('c',3)]:
...: print x,y
...:
a 1
b 2
c 3
1000以上的迭代
由于python的运算量仅仅是999,一旦大于999则会运算出错甚至使系统卡慢,所以在1000以上的运算就可以使用迭代
In [8]: g = (i*i for i in range(100000))
In [9]: g = (i*i for i in range(1000000))
In [10]: g
Out[10]: <generator object <genexpr> at 0x151d3c0>
##确认是否可迭代
In [11]: isinstance(g,Iterable)
Out[11]: True
##迭代显示
In [12]: g.next()
Out[12]: 0
In [13]: g.next()
Out[13]: 1
In [14]: g.next()
Out[14]: 4
##显示g的可用
In [15]: dir(g)
列表生成式
列表生成式是Python 内置的非常简单却强大的可以用来创建 list的生成式
#!/usr/bin/env python
# coding:utf-8
_author_ = "lvah"
'''
@author:fairy
@file:liebiao_pinfan.py
@contact:xiaojun0118@foxmail.com
@time:7/9/1711:00 AM
@DESC;
'''
# 生成[1*1,2*2,3*3,...,7*7]列表
# for循环
li = []
for n in range(1,8):
li.append(n*n)
print li
# 引出 ——>
# 列表生成式:
# 循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的 list.
print [i * i for i in range(1, 8)]
# 1-20,所有偶数的平方
# 列表生成式可以嵌套if语句和for语句
print [i * i for i in range(0, 20, 2)]
print [i * i for i in range(0, 20) if i % 2 == 0]
# 列表生成式,返回'123' 'ABC'两个字符串的结合,如下:
# ['1A', '1B', '1C', '2A', '2B', '2C', '3A', '3B', '3C']
print [i + j for i in '123' for j in 'ABC']
# 字典的连接
print [k + '=' + v for k, v in {'name': 'hh', 'age': '5'}.items()]
# li = ['HELLO','World'] ——> 小写
print [a.lower() for a in ['HELLO', 'World'] if isinstance(i,str)]
生成器
通过列表生成式,我们可以直接创建一个列表,受到内存限
制,列表容量肯定是有限的
在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的 list,从而节省大量的空间。在 Python 中,这种一边循环一边计算的机制,称为生成器(Generator)
#!/usr/bin/env python
# coding:utf-8
import time
_author_ = "lvah"
'''
@author:fairy
@file:生成器.py
@contact:xiaojun0118@foxmail.com
@time:7/9/172:03 PM
@DESC;
'''
# 枚举方法,显示为索引-元素
shopinfo = [
('Iphon',1000),
('book',200),
('fentiao',3500)
]
for i,v in enumerate(shopinfo):
print i,v
# 在for循环里引用两个变量
shopinfo = [
('Iphon', 1000),
('book', 200),
('fentiao', 3500)
]
for k, v in shopinfo:
print k, v
# 4.手动实现生成器
# (Fibonicci):
# 数列1,1,2,3,5,8,13,...
def fib(mm):
n, a, b = 0, 0, 1
while n < mm:
print b,
a, b = b, a + b
n += 1
fib(5)
def hello():
print 'a'
yield 1
print 'b'
yield 2
print 'c'
yield 3
a = hello()
a.next()
a.next()
a.next()
# 异步I/O
def consumer(name):
print '%s 准备吃粉条'%name
while True:
fentiao = yield
print ('粉条[%s]做好了,被[%s]吃了')%(fentiao,name)
# g = consumer('cici')
# g.next()
# g.send('ziranwei')
def producer(name):
c1 = consumer('Cici')
c2 = consumer('Andy')
c1.next()
c2.next()
print '开始制作粉条晚餐....'
for i in ['凉拌','清蒸']:
time.sleep(1)
print '%s做了两份粉条'%name
c1.send(i)
c2.send(i)
producer('Lily')