• python iter函数用法


    iter函数用法简述

    Python 3中关于iter(object[, sentinel)]方法有两个参数。

    使用iter(object)这种形式比较常见。

    iter(object, sentinel)这种形式一般较少使用

    1,iter(object)

    Python官方文档对于这种形式的解释很容易理解。

    此时,object必须是集合对象,且支持迭代协议(iteration protocol)或者支持序列协议(sequence protocol)。

    说白了,也就是实现了__iter__()方法或者__getitem__()方法。

      l = [1, 2, 3]
        for i in iter(l):
            print(i)
    

    2,iter(object, sentinel)

    Python官方文档对于这种形式的解释是:“ If the second argument, sentinel, is given, then object must be a callable object. The iterator created in this case will call object with no arguments for each call to its __next__() method; if the value returned is equal to sentinel,StopIteration will be raised, otherwise the value will be returned.”。

    这句话的意思是说:如果传递了第二个参数,则object必须是一个可调用的对象(如,函数)。此时,iter创建了一个迭代器对象,每次调用这个迭代器对象的__next__()方法时,都会调用object。

    如果__next__的返回值等于sentinel,则抛出StopIteration异常,否则返回下一个值。

        class TestIter(object):
    
            def __init__(self):
                self.l=[1,2,3,4,5]
                self.i=iter(self.l)
            def __call__(self):  #定义了__call__方法的类的实例是可调用的
                item = next(self.i)
                print ("__call__ is called,which would return",item)
                return item
            def __iter__(self): #支持迭代协议(即定义有__iter__()函数)
                print ("__iter__ is called!!")
                return iter(self.l)
    
        t = TestIter()  # t是可调用的
        t1 = iter(t, 3)  # t必须是callable的,否则无法返回callable_iterator
        print(callable(t))
        for i in t1:
            print(i)
    # 它每次在调用的时候,都会调用__call__函数,并且最后输出3就停止了。
    
    True
    __call__ is called,which would return 1
    1
    __call__ is called,which would return 2
    2
    __call__ is called,which would return 3
    

    在文件读取时使用:

    import os
    import hashlib
    
    
    def bytes2human(n):
        # 文件大小字节单位转换
        symbols = ('K', 'M', 'G', 'T', 'P', 'E')
        prefix = {}
        for i, s in enumerate(symbols):
            # << 左移” 左移一位表示乘2 即1 << 1=2,二位就表示4 即1 << 2=4,
            # 10位就表示1024 即1 << 10=1024 就是2的n次方
            prefix[s] = 1 << (i + 1) * 10
        for s in reversed(symbols):
            if n >= prefix[s]:
                value = float(n) / prefix[s]
                return '%.2f%s' % (value, s)
        return "%sB" % n
    
    
    def get_md5(file_path):
        """
        得到文件MD5
        :param file_path:
        :return:
        """
        if os.path.isfile(file_path):
            file_size = os.stat(file_path).st_size
            md5_obj = hashlib.md5()  # hashlib
            f = open(file_path, 'rb')  # 打开文件
            read_size = 0
            while read_size < file_size:
                read_byte = f.read(8192)
                md5_obj.update(read_byte)  # update md5
                read_size += len(read_byte)
            hash_code = md5_obj.hexdigest()  # get md5 hexdigest
            f.close()
            print('file: [{}] 
    size: [{}] 
    md5: [{}]'.format(
                file_path, bytes2human(read_size), hash_code))
            return str(hash_code)
    
    
    def get_filemd5(file_path):
        # 使用迭代器读取文件获得MD5
        if os.path.isfile(file_path):
            file_size = os.stat(file_path).st_size
            md5_obj = hashlib.md5()  # hashlib
            f = open(file_path, 'rb')  # 打开文件
            read_size = 1024
            for chunk in iter(lambda: f.read(read_size), b''):  # 使用迭代器读取文件获得MD5
                md5_obj.update(chunk)
            hash_code = md5_obj.hexdigest()  # get md5 hexdigest
            f.close()
            print('file: [{}] 
    size: [{}] 
    md5: [{}]'.format(
                file_path, bytes2human(file_size), hash_code))
            return str(hash_code)
    
    
    if __name__ == '__main__':
    
        md5 = get_md5(
            r'C:README.md')
        md5_1 = get_filemd5(
            r'C:README.md')
    
    
    ------------------------输出
    
    file: [C:README.md] 
    size: [941B] 
    md5: [d22b8f76dcd8cfbfd4669d9d8101077e]
    file: [C:README.md] 
    size: [941B] 
    md5: [d22b8f76dcd8cfbfd4669d9d8101077e]
    

      

      

      

      

  • 相关阅读:
    UVA 129 Krypton Factor (困难的串)(回溯法)
    UVA 524 Prime Ring Problem(素数环)(回溯法)
    【POJ 2559】Largest Rectangle in a Histogram【栈】
    【POJ 2559】Largest Rectangle in a Histogram【栈】
    向右看齐【栈】
    向右看齐【栈】
    向右看齐【栈】
    【模板】最近公共祖先【LCA】
    【模板】最近公共祖先【LCA】
    【模板】最近公共祖先【LCA】
  • 原文地址:https://www.cnblogs.com/xiao-apple36/p/9519114.html
Copyright © 2020-2023  润新知