python中可迭代对象_02.Python中可迭代对象

这里关注迭代,是因为需要做矩阵操作与运算。

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

你可能感兴趣的:(python中可迭代对象)