Python16~生成器迭代器

#coding:utf-8

#生成器和迭代器
#理解可迭代对象,迭代器,生成器
#列表推导式,生成器表达式
#切片高级算法

#range()函数
print(range(9))
#输出 [0, 1, 2, 3, 4, 5, 6, 7, 8]
print(list(range(9)))
#输出 [0, 1, 2, 3, 4, 5, 6, 7, 8]
print(type(range(9)))
#输出  <type 'list'>
print(range(1,9,3)) #第三个参数是步长
#输出 [1, 4, 7]
print(range(-9))
#输出 []
print(range(1,9,-1))
#输出 []


#可迭代对象
for i in  range(9): #range(9) 可迭代对象
    print(i)


from collections import Iterable
a_str='ben'
b_list=[1,2,3]
c_tuple=(1,2,3)
d_dict={'name':'ben','age':'12'}

if isinstance(a_str,Iterable):
    print('a_str是可迭代对象')
if isinstance(b_list,Iterable):
    print('b_list是可迭代对象')
if isinstance(c_tuple,Iterable):
    print('c_tuple是可迭代对象')
if isinstance(d_dict,Iterable):
    print('d_dict是可迭代对象')



#内置函数

d_dict={'name':'lsy','age':'22','sex':''}
for key,value in d_dict.items():
    print(key+' '+value)

#输出
# age 22
#name lsy
# sex 女

#第二个参数---->起始角标
for index,item in enumerate([1,2,3],1): #提那家了索引属性---每一个元素(取角标)
    print(index,item)

#输出
'''
(1, 1)
(2, 2)
(3, 3)
'''

#列表推倒式---->返回结果肯定是[]
a_list=list(range(1,10)) #内置类型转换函数
print(a_list)
#输出 [1, 2, 3, 4, 5, 6, 7, 8, 9]

print([x*2 for x in  range(1,9)])
#输出 [2, 4, 6, 8, 10, 12, 14, 16]

print([x-1 for x in  range(2,10) if x>2]) #获得的x是否大于2,如果大于进行
#输出  [2, 3, 4, 5, 6, 7, 8]

print([x+y for  x in range(1,9) if x%2==0  for y in  range(1,9) if y%2!=0])
#输出 [3, 5, 7, 9, 5, 7, 9, 11, 7, 9, 11, 13, 9, 11, 13, 15]


#迭代器
#Python2.2 版本开始
#可迭对象
# from  collections import Iterable,Iterator   #迭代器对象
# a_iter=iter((1,2,3))
# print(type(a_iter))
# #输出 <type 'tupleiterator'>
# print(isinstance(a_iter,Iterator))
#输出True

#迭代器---->容器对象(元素的个数不关心) 内置函数next(迭代器对象)
# print(next(a_iter))      #每次输出一个
# #输出     1
# print(next(a_iter))
# #输出     2
# print(next(a_iter))
#输出     3
#print(next(a_iter)) #没有元素的时候报错

# a_iter=iter((1,2,3))
# for item in a_iter:
#     print(item)
# #输出
# '''
# 1
# 2
# 3
# '''

#可迭代对象,迭代器对象(判断标准)
# range() list--->iter(对内存的优化)
from  collections import Iterable,Iterator
#自定义迭代器对象
class MakeIter():
    def __init__(self,id):
        self.id=id
    def next(self):        #python3 使用 __next__
        if self.id==0:
            raise StopIteration('已经没有元素了')
        self.id-=1
        return self.id
    
    def __iter__(self):
        return self

a_iter=MakeIter(9)
print(next(a_iter))


#切片
#第一个参数起始  第二个参数结束  第三个参数步长(正数向右,负数向左)
num_list=[1,2,3,4,5,6,7,8]
print(num_list[::])
#输出 [1, 2, 3, 4, 5, 6, 7, 8]
print(num_list[1::2])   #1表示索引 2为步长
#输出 [2, 4, 6, 8]


#生成器---->列表推导式
b_gen=(x for x in range(5))
print(type(b_gen))
#输出 <type 'generator'>
#生成器对象--->一种属于迭代器,对内存的优化
print(next(b_gen))
print('*****************')
#
def mk_gen(num):
    while num>3:
        num-=1
        print(num)
        
m_gen=mk_gen(9)
print(type(m_gen))
#输出 <type 'NoneType'>
mk_gen(9)
#输出
'''
8
7
6
5 
4 
3 
'''
print('*****************') 

def mk_gen(num):
    while num>3:
        yield num    #
        num-=1
m_gen=mk_gen(8)
for num in m_gen:
    print(num)
    print('代码暂停')
#输出
'''
8
代码暂停
7
代码暂停
6
代码暂停     
5        
'''

def get_count():
    x=6
    yield x+1
    y=5
    yield y*2
    z=9
    yield z**2
g=get_count()
print(type(g))

for num in g:
    print(num)

#输出
'''
7
10
81
'''

 

posted @ 2018-03-16 10:51  零度咖啡  阅读(93)  评论(0)    收藏  举报