迭代器

迭代器

孤者浪人 提交于 2019-12-04 09:37:57
迭代器 是用来迭代取值的工具。迭代指的是重复迭代,每一次迭代哦都是基于上次结果来的,单纯的重复不是迭代。 可迭代对象 :凡是内部有__iter__()方法的都是可迭代对象,所有的序列类型:list,str,tuple,dict,set,文件f都是可迭代对象。 如何获取迭代器对象 : 通过可迭代对象.__iter__()得到的返回值就是迭代器对象 例: str1 = 'hello' iter_str1 = str1.__iter__() print(iter_str1) # 得到迭代器对象 print(iter_str1.__next__()) # 通过.__next__()进行迭代取值 ===》 h print(iter_str1.__next__()) # 每执行一次从迭代器对象中取一个值 ===》e 如果迭代器对象中的值被取完,程序会报错,则需要进行捕获异常 例: list1 = [1,2,3,4,5] iter_list1 = list.__iter__() while True:   try:     print(iter_list1.__next__())   except StopIteration # 通过 try 和 except 捕获异常 迭代器对象的优缺点 : 优点:1.不依赖于索引 迭代取值; 2.节省内存空间 缺点:1.每次取值都只能取当前第一个值

装饰器进阶和迭代器

ε祈祈猫儿з 提交于 2019-12-04 09:36:33
装饰器进阶和迭代器 昨日补充 可变类型,直接在函数内部调用 不可变类型,需要在函数内部调用,要使用global 叠加装饰器: 每一个新的功能都应该写一个新的装饰器 需求: 为被装饰对象,添加统计时间与登录认证的功能 # 登录认证 import time def re_login(): with open('a.txt', 'r', encoding='utf-8') as rf: data = rf.read() data1 = data.strip('\n').split('|') data2 = ''.join(data1) data3 = data2.split('\n') return data3 # print(data3) # 登录认证装饰器 def login(func): def inner1(*args, **kwargs): username = input('请输入用户名:').strip() password = input("请输入密码:").strip() res = re_login() if username + password in res: print('恭喜您,登录成功!') re = func(*args, **kwargs) return re else: print('对不起,登录失败!') re = func(*args, *

STL之traits编程技法

守給你的承諾、 提交于 2019-12-04 09:32:45
摘要 主要讨论如何获取迭代器相应型别。使用迭代器时,很可能用到其型别,若需要声明某个迭代器所指对象的型别的变量,该如何解决。方法如下: function template的参数推导机制 例如: template<typename I, typename T> void func_impl(I iter, T t) { //T为迭代器所指对象的型别 T tmp; //..... } template<typename I> inline void func(I iter) { //func工作交给func_impl完成 func_impl(iter, *iter); } int main() { int i; func(&i); return 0; } func_impl()是一个 function template,一旦被调用,编译器会自动进行template参数推导,从而导出型别T,无需自己指出型别,解决问题。迭代器相应型别不只是迭代器所指对象的型别一种而已,最常用的相应型别有五种,但并非任何情况都可利用上述template参数推导机制来取得。这就需要其他方法。 Traits编程技法 迭代器所指对象的型别,成为该迭代器的value type,上述模板参数推导并非全面可用,在需要value type作为函数返回值时,就不能解决了。template参数推导的只是参数而已。因此

迭代器

允我心安 提交于 2019-12-04 09:23:21
迭代器就是迭代的工具 迭代:指的是重复迭代,每一次迭代的结果都是基于上一次结果而来的 迭代器: 指的是迭代取值的工具 PS:如果我们想知道python中迭代器是什么,首先我们要知道什么是可迭代对象 可迭代对象 凡是内部有.__iter__() 方法的都是可迭代对象,比如str,list,tuple,dict,set,f(文件) 获取迭代器 通过序列类型.__iter__()方法得到的返回值,就是迭代器对象 list = [1,2,3] print(list.__iter__()) 打印结果: <list_iterator object at 0x0000022F3EEDC848> 如何迭代取值? 通过迭代器对象.__next__(),每执行一次,都会从迭代器对象中取一个值,取完再取的话就会报错:StopIteration # 迭代取值 list = [1, 2, 3,4] list.__iter__().__next__() print(list.__iter__().__next__()) 打印结果: 1 这里举个例子,有4个元素取5个会怎样? 那么现在我们就可以用try和except把异常抛出 try:捕获异常(StopIteration) except:抛出异常 list1 = [1, 2, 3, 4] list_iter = list1.__iter__() try:

装饰器+迭代器作业

…衆ロ難τιáo~ 提交于 2019-12-04 09:18:37
1.叠加装饰器的装饰顺序与执行顺序 ​ 装饰顺序,由下而上 ​ 执行顺序,由下而上 2.什么是无参装饰器与有参装饰器 ​ 无参装饰器是没有传入参数的装饰器 ​ 有参装饰器是传入了参数的装饰器,实现用户权限区分 3.简述可迭代对象,迭代器对象及迭代取值方式,及for循环内部原理 ​ 内置含--iter--的方法都是可迭代对象 ​ 迭代器对象内置含有--iter--和--next--的就是迭代器对象,可以不依赖索引取值而取出容器内的元素,取出的值是通过不断的迭代取出(迭代取出字典时,字典本是无序的,迭代取出那一瞬间python解释器做了优化,变成有序); ​ for循环又称迭代循环,in后面可以跟任意可迭代对象,在循环时,会调用可迭代对象goods内置的--iter--方法拿到一个迭代对象,然后再调用该迭代器对象的next方法将取到的值赋给item,执行循环体完成一次循环,周而复始,知道捕捉到stoplteration异常,结束迭代。 4.迭代器对象的优缺点是什么? ​ 迭代器对象优点:迭代器对象表示的是一种数据流,调用next取值,内存一次只存放一个值。而其他循环内存的值会不断变多,导致内存不够用问题。 ​ 迭代器对象缺点:一次只取一个值并且停留,只能往后取值,直到取尽,要想调用前面的值,只能从新调用iter或从新创建一个迭代对象,当两个循环同时使用一个迭代器时,只有一个能调用成功。

迭代器

二次信任 提交于 2019-12-04 09:17:36
迭代器    迭代器即迭代的工具     迭代:迭代指的是重复迭代,每一次迭代都是基于上一次的结果而来的。     迭代器:迭代器指的是迭代取值的工具,他可以迭代取值。   如果想要知道python中迭代器是什么?必须先知道什么是可迭代对象?      可迭代对象:所有的序列类型:str , list ,tuple , dict , set ,f    凡是内部有str.__ iter __ ()方法的都是可迭代对象。      获取迭代器:      通过可迭代对象.__ iter __(),得到的返回值都是“迭代器对象”。      迭代器是迭代取值的工具,作用是迭代取值   如何迭代取值:      迭代器对象.__ next __() #"每一次执行",都会从迭代器对象中取出一个值 # 测试迭代文件 f = open('user.txt', 'r', encoding='utf-8') iter_f = f.__iter__() while True: try: print(iter_f.__next__()) except StopIteration: break str1 = 'hello tank' # 先获取迭代器对象 iter_str1 = str1.__iter__() while True: try: print(iter_str1.__next__())

python语法之迭代器

与世无争的帅哥 提交于 2019-12-04 09:05:53
可迭代对象 :可以重复取值,并且每一次的取值都是在上一次的结果之上而来的。凡是内部有_iter_()方法的都是可迭代对象。 迭代器对象 :通过序列类型._iter_(),得到返回值就是迭代器对象。 迭代取值方式: print(迭代器对象._next_()) for循环内部原理: for item in 可迭代对象: print item #重复迭代,每一次迭代的结果都是基于上一次的结果而来的 #可迭代对象:str, list, tuple, set, dict, f文件 # str = 'hello world' # list = [1,2,3] # tuple = (4,5,6) # dict = {'name':'nick','age':18} # set = {7,8,9} # f = open('a.txt','r',encoding='utf-8') #str 示范 # str_iter = str.__iter__() #通过str._iter_()获取迭代器对象str_iter # print(str_iter.__next__()) #通过迭代器对象str_iter._next_()获取值 # print(str_iter.__next__()) # print(str_iter.__next__()) #因为上述做法都是重复,可写成循环 #循环版本 #str

叠加装饰器与迭代器

﹥>﹥吖頭↗ 提交于 2019-12-04 09:02:06
一、叠加装饰器 在同一个被装饰对象中,添加多个装饰器,并执行,模板: 1 模板: 2 @装饰器1 3 @装饰器2 4 ... 5 def 被装饰对象(): 6 pass 注意:装饰器在调用被装饰对象时才会执行添加的功能 - 叠加装饰器:   - 装饰的顺序: 由下到上装饰   - 执行的顺序: 由上往下 注意: 无论inner中出现任何判断,最后都要返回“调用后的被装饰对象” func(*args, **kwargs) # 需求: 为被装饰对象,添加统计时间 与 登录认证功能 import time # 定义一个全局变量,表示用户是否验证通过 login_info = { 'login': False } # 登录功能 def login(): # 判断用户没有登录时,执行登录功能 name = input("username:").strip() pwd = input('password:').strip() if name == 'abc' and pwd == '123': print('登录成功!') login_info['login'] = True else: print('登录失败!') # 登录认证装饰器 def login_auth(func): def inner1(*args, **kwargs): """ 注意: 无论inner中出现任何判断,

实现迭代器(__next__和__iter__)

拜拜、爱过 提交于 2019-12-04 09:01:03
实现迭代器(__next__和 iter ) 一、简单示例 死循环 class Foo: def __init__(self, x): self.x = x def __iter__(self): return self def __next__(self): self.x += 1 return self.x f = Foo(3) for i in f: print(i) 二、StopIteration异常版 加上StopIteration异常 class Foo: def __init__(self, start, stop): self.num = start self.stop = stop def __iter__(self): return self def __next__(self): if self.num >= self.stop: raise StopIteration n = self.num self.num += 1 return n f = Foo(1, 5) from collections import Iterable, Iterator print(isinstance(f, Iterator)) True for i in Foo(1, 5): print(i) 1 2 3 4 三、模拟range class Range: def _

JDK1.7中HashMap底层实现原理

核能气质少年 提交于 2019-12-04 08:11:51
原文链接: https://www.cnblogs.com/dijia478/p/8006713.html 一、数据结构 HashMap中的数据结构是数组+单链表的组合,以键值对(key-value)的形式存储元素的,通过put()和get()方法储存和获取对象。 (方块表示Entry对象,横排表示数组table[],纵排表示哈希桶bucket【实际上是一个由Entry组成的链表,新加入的Entry放在链头,最先加入的放在链尾】,) 二、实现原理 成员变量 源码分析: /** 初始容量,默认16 */ static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 /** 最大初始容量,2^30 */ static final int MAXIMUM_CAPACITY = 1 << 30; /** 负载因子,默认0.75,负载因子越小,hash冲突机率越低 */ static final float DEFAULT_LOAD_FACTOR = 0.75f; /** 初始化一个Entry的空数组 */ static final Entry<?,?>[] EMPTY_TABLE = {}; /** 将初始化好的空数组赋值给table,table数组是HashMap实际存储数据的地方,并不在EMPTY_TABLE数组中 */