菜鸟平时不常用,但是看代码总结的一些常用函数
一,类中__getitem__函数
平时使用到的列表,元组,字典都能靠索引找到其中的值,例如ls = [1,2,3,4,4],使用ls[3]可得到4.
但是类不行,所以在类中添加__getitem__函数。
class Counter:
def __init__(self, ls):
self.ls= ls
def __getitem__(self, idx):
return self.ls[idx]
counter = Counter([1,2,3,4])
for num in counter:
print(num) # 输出 1, 2, 3, 4
print(Counter[2]) # 输出 3
可以使用for,也可以直接使用索引,跟列表一样的。
当然也可以改成字典差不多的形式:
class Tag:
def __init__(self):
self.change={'python':'This is python'}
def __getitem__(self, item):
print('这个方法被调用')
return self.change[item]
a=Tag()
print(a['python']) #这个方法被调用/n This is python
总结起来就是getitem函数可以使得类和列表或者字典一样可使用for,或者索引得到其中的值。
当然还可以使用其他方法:
二,__iter__函数
class SimpleIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self # 返回迭代器对象,通常是自身
def __next__(self):
if self.index < len(self.data):
result = self.data[self.index]
self.index += 1
return result
else:
raise StopIteration # 迭代结束时抛出 StopIteration 异常
# 创建一个可迭代对象
my_iterator = SimpleIterator([1, 2, 3, 4, 5])
# 使用 for 循环迭代对象
for item in my_iterator:
print(item) #1,2,3,4,5
通过__iter__和__next__的一起使用,也能达到上述目的。
python检测到for函数,调用类的__iter__函数,返回一个迭代器,相对于(for iter in 迭代器)。
每次进入for函数内,自动调用类的__next__函数,返回下一个值给item。
但是__iter__和__getitem__有什么不同呢???
毕竟getitem可以使用索引,而iter都不能使用索引,只能使用next或者for。
只需要对__iter__优化一下,就有很大不同。
三,yield生成器的作用
yield简单的介绍:功能相对于return,把值返回。不同的是再次调用__iter__的时候,从yield下面一行函数继续运行。
通过在__iter__中加入yield,可以和上面__next__达到相同目的:
class Counter:
def __init__(self, low, high):
self.low = low
self.high = high
def __iter__(self):
current = self.low
while current < self.high:
yield current
current += 1
counter = Counter(1, 4)
for num in counter:
print(num) # 输出 1, 2, 3
在看一下上面的__gititem__函数:
class Counter:
def __init__(self, ls):
self.ls= ls
def __getitem__(self, idx):
return self.ls[idx]
counter = Counter([1,2,3,4])
for num in counter:
print(num) # 输出 1, 2, 3, 4
print(Counter[2]) # 输出 3
可以看到我们上面两个类的输入参数不一样,一个是ls,一个是(low,high)。如果ls特别大,放入类中self.ls就会占用非常大的内存,但如果可以通过yield,它会在你有需要的时候才会产生结果,并且前面产生的结果它也会删除,不占用内存。
不过一般情况下,例如深度学习中使用数据集,大家一般都是将ls中存入的是文件图片地址(不大),所以使用的都是__getitem__。