#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
'''