这里关注迭代,是因为需要做矩阵操作与运算。
1、理解__iter__与__next__函数的作用;
2、能实现可循环对象;
3、能使用python内置的可循环对象并解析;
4、掌握循环工具(或者循环方式)
代码下载地址:https://github.com/QiangAI/PythonSkill/tree/master/AdvPython/02iterator
代码直接下载:代码下载
一、查看可循环对象的属性与获取属性的帮助备注:help函数与本节主题无关,与dir函数有一定关联度,顺便放一起说一下。
1、dir函数
查看可循环对象的属性,文件:function_dir.py#coding=utf-8
#可循环对象
str="Louis Young"#字符串
lst=[1,2,3,4] #列表
tpl=(1,2,3,4) #元组
fle=open("data.txt") #文件
print(dir(str))
print(dir(lst))
print(dir(tpl))
print(dir(fle))
#可循环对象,都有一个—__iter__方法与__next__方法。
可循环对象的属性输出:
四类可循环对象的属性输出都有__iter__函数
2、help函数
通过help函数调用python内置的帮助系统。一般这个函数在交互式变成控制台下使用。用法一:help()
启动帮助的控制台模式
用法二:help("模块名\函数名\类名\方法名\关键字\文档主题")
输出相关帮助(如果输入的参数是有效的话)
下面使用第二种情况举例。
(1)help代码调用,文件:function_help.py#coding=utf-8
help("str.replace")
#help() #开启一个帮助控制台
(2)help交互控制台下使用:
使用help获取内置的帮助
二、实现可迭代类与对象
1、普通对象(不可迭代对象)
下面看一个例子,实现一个简单类,并生成对象,然后使用for测试是否可以迭代。
文件:iterator.py#coding=utf-8
class Data:
pass
data=Data()
print(dir(data)) #打印属性,确认与迭代有关的属性
print(dir(Data)) #使用类打印属性。
for d in data:
print(d)
再循环中运行报错:【object is not iterable】
非可迭代对象
2、对象可迭代
可迭代对象,只需要实override两个函数即可:def __iter__(self)
def __next__(self)
例子,文件:iterator.pyclass Data:
def __iter__(self):
return self
def __next__(self):
return "x"
data=Data()
for d in data:
print(d)
上述代码就是简单实现__iter__与__next__函数,使得Data成为可迭代类。当让其中的for循环肯定一直无法结束,是死循环。
3、__iter__函数
__iter__函数需要返回一个可迭代对象,一般都是对象本身(当然对象本身也必须是可迭代的)。所以__iter__函数的实现一般都是这样(当self指向的对象实现__next__后,就没有问题了)。def __iter__(self):
return self
4、__next__函数
__next__函数用来取值,就是返回一个数据,也就是for中每次循环的取值。__next__函数两个事项:
(1)返回数据,
(2)结束迭代,迭代结束机制使用的是异常机制,抛出StopIteration异常即可。
__next__的简单实现如下,文件:iterator.pydef __next__(self):
if self.counter>=5:#控制迭代结束
raise StopIteration
else:
return "x"
完整代码如下:class Data:
def __init__(self):
self.counter=0
def __iter__(self):
return self
def __next__(self):
if self.counter>=5:#控制迭代结束
raise StopIteration
else:
self.counter+=1
return "x"
data=Data()
for d in data:
print(d)
上面例子Data类生成的对象,最多迭代5次。
三、Python内置迭代对象使用例子来说明几类常用的内置迭代对象:(字符串,列表,元组,文件,字典),例子文件:built_in_iterator.py
1、字符串迭代#字符串迭代
str="Louis Young"
for c in str:
print(c)
2、列表迭代#列表迭代
lst=[1,2,3,4]
for l in lst:
print(l)
3、元组迭代#元组迭代
tpl=(1,2,3,4)
for t in tpl:
print(t)
4、文件迭代#文件迭代
fil=open("data.txt")
for r in fil:
print(r)
5、字典迭代:#字典迭代
dit={"name":"Louis","age":20}
for key in dit.keys():
print(key,":",dit[key])
for key in dit: #直接迭代key键值
print(key,":", dit[key])
四、迭代工具迭代工具包含:
(1)for循环(这里不重复讲解)
(2)列表解析
(3)in成员关系测试
(4)map等内置函数
1、in成员关系测试#coding=utf-8
#in的使用语法
str="This is Louis Young"
print("Young" in str)
print("You" in str)
#非迭代对象使用in
class Data:
pass
data=Data()
#print("Y" in data) #错误:TypeError: argument of type 'Data' is not iterable
#定制迭代对象使用in
class Tata:
def __init__(self):
self.counter=0
def __iter__(self):
return self
def __next__(self):
if self.counter>5:
raise StopIteration
else:
self.counter+=1
return "Y"
tata=Tata()
print("Y" in tata)
2、列表解析#coding=utf-8
#列表解析
data=(1,2,3,4,5)
x=[r+1 for r in data]
print(x)
#列表解析扩展
y=[r+1 for r in data if r%2==0]#过滤偶数
print(y)
#双解析
tata=(0.1,0.2,0.3)
z=[r+s for r in data for s in tata]
print(z)
3、内置迭代工具函数内置迭代工具主要包含两类:
第一类,列表解析工具:range,tuple,list,map,set/{},dict,zip,filter。
第二类,迭代对象的操作工具:sum,all,any,max,min
3.1、列表解析工具(列表解析工具:range,tuple,list,map,set/{},dict,zip,filter。)
文件:iterator_resovled_tool.py
range函数(immutable)#range列表解析函数
'''
range(stop)
range(start, stop[, step])
'''
rng=range(10)
print(rng)
for i in rng:
print(i)
tuple函数(immutable)'''
tuple([iterable])
'''
tup=tuple(range(5))#把range可迭代对象转换为元组
print(tup)
for i in tup:
print(i)
list函数(mutable)'''
class list([iterable])
'''
lst=list(range(5))
print(lst)
map函数(返回迭代器)'''
map(function, iterable, ...)#function的参数个数对应后面的迭代器对象个数
'''
mp=map(lambda x,y:x+y,range(4),range(6,11))
print(tuple(mp))
set/{}函数(返回内置的set类对象)'''
class set([iterable]) 返回内置的set类型对象
'''
s={3,1,4,2}
t=set(range(5))
v={i for i in [3,2,5,1]}
print(s) #{1, 2, 3, 4}
print(t) #{0, 1, 2, 3, 4}
print(v) #{1, 2, 3, 5}
注意:set采用的是key-value存储模式,不过set与字典的区别是key=value。所以set的值是有序的。
dict函数(返回字典类对象)'''
class dict(**kwarg)
class dict(mapping, **kwarg)
class dict(iterable, **kwarg)
'''
dt1=dict(name="louis",age=20)#**kwarg
dt2=dict({"name":"louis","age":20},price=24.88)#mapping, **kwarg
dt3=dict([("name","louis"),("age",20)],price=24.88)#iterable, **kwarg
print(dt1)
print(dt2)
print(dt3)
filter函数'''
filter(function, iterable)
使用function过滤迭代器
'''
flt=filter(lambda x:True if x>0 else False,(1,-2,5,-7,-3,9))
print(list(flt))#[1, 5, 9]
zip函数'''
zip(*iterables)
'''
zp=zip(("name","age","price",4),("louis",20,27.88))
#print(list(zp)) #[('name', 'louis'), ('age', 20), ('price', 27.88)]
print(dict(zp))#{'name': 'louis', 'age': 20, 'price': 27.88} #如果上面运行后,该语句返回{}
3.2、迭代对象操作工具(迭代对象的操作工具:sum,all,any,max,min)
文件:iterator_operate_tool.py#coding=utf-8
rng=range(10)
print(sum(rng)) #45
print(any(rng)) #True
print(all(rng)) #False
print(max(rng)) #9
print(min(rng)) #0
代码直接下载:迭代例子
代码下载地址:https://github.com/QiangAI/PythonSkill/tree/master/AdvPython/02iterator