python中的指令(getitem,__iter__,yield)

菜鸟平时不常用,但是看代码总结的一些常用函数

一,类中__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__。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值