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: [{}] \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]

  

  

  

  

python iter函数用法的更多相关文章

  1. python之函数用法iter()

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法iter() #iter() #说明:对一个对象调用 iter() 就可以得到它的迭代 ...

  2. Python回调函数用法实例详解

    本文实例讲述了Python回调函数用法.分享给大家供大家参考.具体分析如下: 一.百度百科上对回调函数的解释: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函 ...

  3. python之函数用法setdefault()

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法setdefault() #D.get(k,d) #说明:k在D中,则返回 D[K], ...

  4. python之函数用法fromkeys()

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法fromkeys() #fromkeys() #说明:用于创建一个新字典,以序列seq ...

  5. python之函数用法get()

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法get() #http://www.runoob.com/python/att-dic ...

  6. python之函数用法capitalize()

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法capitalize() #capitalize() #说明:将字符串的第一个字母变成 ...

  7. python之函数用法isupper()

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法isupper() #http://www.runoob.com/python/att ...

  8. python之函数用法islower()

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法islower() #http://www.runoob.com/python/att ...

  9. python之函数用法startswith()

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法startswith() #http://www.runoob.com/python/ ...

随机推荐

  1. oracle undo表空间

    查询undo表空间状态 "Bytes(M)" FROM dba_undo_extents GROUP BY tablespace_name, status; Undo表空间的状态( ...

  2. mybatis 中文做参数报错

    一个简单的查询,如果参数中有中文.如下: <select id="xxxx" resultType="hashmap"> select * from ...

  3. 使用PostSharp在.NET平台上实现AOP(转)

    出处:https://www.cnblogs.com/leoo2sk/archive/2010/11/30/aop-postsharp.html 摘要 本文首先介绍AOP(面向方面编程)的相关概念及理 ...

  4. Android自定义视图三:给自定义视图添加“流畅”的动画

    这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! Android自定义视图一:扩展现有的视图,添加新的XML属性 Android自定义视图二:如何绘制内容 Android自定义视图三: ...

  5. Java输入输出技术

    输入输出分类     输入流,相对计算机来说是输入的,例如鼠标键盘操作,设备给计算机的信息     输出流,相对计算机来说是输出的,例如屏幕显示,计算机给设备的信息.   具体分类     基本流,I ...

  6. CentOS 5 上配置 Redmine 和 Git

    现在我们用 Trac + Git 来管理所有的项目,早些时候是由 Trac + Subversion 管理的,和 Git 比较起来 Subversion 简直就是龟速.虽然我们前段时间换成了 Git ...

  7. POJ3181--Dollar Dayz(动态规划)

    Farmer John goes to Dollar Days at The Cow Store and discovers an unlimited number of tools on sale. ...

  8. Windows 8创新之路——样章分享

    在电脑里面躺了大约也有半年多的光景了. 在Windows 8.1还有不到一个月的时间里,将这些内容分享出来,也算是对得起自己那段时间的熬夜. 希望大家多提宝贵意见. 谢! 点击标题可浏览SkyDriv ...

  9. VC中C++数值范围的确定

    1. Visual C++ 32 位和 64 位编译器可识别本文后面的表中的类型. 如果其名称以两个下划线 (__) 开始,则数据类型是非标准的. 下表中指定的范围均包含起始值和结束值. 类型名称 字 ...

  10. 创建Pods私有库

    Pods私有库创建步骤 创建私有 Spec Repo 创建Pod项目工程文件 创建podspec文件 本地测试podsspec文件 向Spec Repo提交podspec Pod库使用 更新维护pos ...