for源码实现

for源码实现

我们知道,java的while和for基本上是实现一样的功能,这样会不会有一点缺点,同时java的迭代器显得尤为的麻烦。

python的for和while就不同了,在实现迭代的功能的情况下,还能对每一个迭代出来的数据进行处理。

for可以迭代三种对象

1.默认有__iter__()的对象,也就是可迭代对象

class zx:
    def __init__(self):
        self.ls = [1,2,3,4]
    def __iter__(self):
        for i in self.ls:
            yield i
z=zx()
for i in z:
    print(i)

2.默认有__iter__()和__next__(),也就是迭代器对象

class zx:
    def __init__(self):
        self.ls = [1,2,3,4]
        self.i = -1
    def __iter__(self):
        return self
    def __next__(self):
        if self.i < self.ls.__len__()-1:
            self.i+=1
            return self.ls[self.i]
        else:
            raise StopIteration
z=zx()
for i in z:
    print(i)

3.默认有__getitems__()

class zx:
    def __init__(self):
        self.ls = [1,2,3,4]
    def __getitem__(self, item):
        return self.ls[item]
z=zx()
for i in z:
    print(i)
疑问

1.不知道你是否有这样的一个疑问,为啥迭代器对象和可迭代对象都有一个__iter__()的方法,其实这就和for的实现有关

2.我们知道我们手动__next__(),当没有迭代的数据的时候,会报一个StopIteration,为啥用了for就不会出现了,其实for已经帮我们捕获和处理了这个异常

总结

1)for....in iterable,首先调用iter(iterable)函数,返回一个迭代器iterator

2)每次循环,调用一次对象的__next__(self),直到最后一个值,再次调用会触发StopIteration

3)for循环捕捉到StopIteration,从而结束循环

1要注意一点,可迭代对象调用__iter__()相当于创建了一个新的迭代器对象,从最开始迭代,而迭代器对象调用__iter__()返回的则是本身,之前迭代到哪个位置,接下来还是从哪里继续迭代

转载于:https://www.cnblogs.com/zx125/p/11614062.html

以下是splice函数的源码实现: ```javascript Array.prototype.splice = function(start, deleteCount, ...items) { // 记录数组长度 const len = this.length; // 处理start参数 let startIndex = start; if (startIndex < 0) { startIndex = Math.max(len + startIndex, 0); } else { startIndex = Math.min(startIndex, len); } // 处理deleteCount参数 let numToDelete = deleteCount; if (numToDelete === undefined) { numToDelete = len - startIndex; } else { numToDelete = Math.max(numToDelete, 0); numToDelete = Math.min(numToDelete, len - startIndex); } // 备份删除的元素 const deletedElements = []; for (let i = 0; i < numToDelete; i++) { const index = startIndex + i; const element = this[index]; deletedElements.push(element); } // 删除元素 const numToInsert = items.length; const diff = numToInsert - numToDelete; if (diff > 0) { // 插入元素后数组变长 for (let i = len - 1; i >= startIndex + numToDelete; i--) { this[i + diff] = this[i]; } } else if (diff < 0) { // 插入元素后数组变短 for (let i = startIndex + numToDelete; i < len; i++) { this[i + diff] = this[i]; } for (let i = len - 1; i >= len + diff; i--) { delete this[i]; } } // 插入元素 for (let i = 0; i < numToInsert; i++) { this[startIndex + i] = items[i]; } // 返回删除的元素 return deletedElements; }; ``` 该函数的作用是从数组中删除元素并向数组添加新元素,然后返回被删除的元素。splice函数的参数包括起始位置、要删除的元素数量和要添加到数组中的元素。在实现中,首先处理了起始位置和要删除的元素数量的参数,然后备份了要删除的元素,接着删除元素并插入新元素,最后返回被删除的元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值