python__iter__(),python iteritems函数

  python__iter__(),python iteritems函数

  Python中有许多函数,它们经常被使用。今天边肖为大家带来Python中iter函数的用法,后续文章也会涉及到该函数的使用。

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

  iter (object) 是一种常见的形式,但iter (object, sentinel)很少使用。

  

  1.iter (object)

  

  官方Python文档很容易解释这种形式。

  此时,对象必须是集合对象,并且支持迭代协议或序列协议。

  说白了,__iter__() 方法 __getitem__() 方法已经实现了。

  l=[1,2,3]

  对于iter(l):中的I

  打印(一)

  

  2.iter (object, sentinel)

  oft YaHei";">

  

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: [{}] \nsize: [{}] \nmd5: [{}]'.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: [{}] \nsize: [{}] \nmd5: [{}]'.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学习网教学中心

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: