Python基础:iter函数的两个参数

python

Python中的函数非常多,而且使用频繁。今天小编为大家带来Python中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官方文档对于这种形式的解释是:如果传递了第二个参数,则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]


根据示例来看,iter函数还是比较容易理解的,更多Python学习推荐:云海天Python教程网

以上是 Python基础:iter函数的两个参数 的全部内容, 来源链接: utcz.com/z/528550.html

回到顶部