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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值