今日主要内容

1.  带参装饰器 (了了解)

2.  迭代器(*****)

可迭代对象

迭代器对象

for迭代器

枚举对象

1.  带参装饰器

1.  通常,装饰器为被装饰的函数添加新功能,需要外界的参数

  outer参数固定就是一个,就是func

  inner参数固定同被装饰的函数,也不能添加新参数

  可以借助函数的嵌套定义,外层给内层传参

def wrap(info):    # 装饰器的固定模板    def outer(func):        def inner(*args,**kwargs):            # 新功能 可能需要外界的参数            res = func(*args, **kwargs)            # 新功能 可能需要外界的参数            return res        return inner

@wrap('外部参数')def fu():pass

2.  系统的wraps带参装饰器

本质上外界使用的韩式inner,但是打印显示的是wraps中的函数

from functools import wraps# 装饰器的固定模板    def outer(func):        @wraps(func)        def inner(*args,**kwargs):                        res = func(*args, **kwargs)                        return res        return inner

2.  迭代器

2.1  迭代器

迭代器对象:可以不用依赖索引取值的容器

可迭代对象:可以通过某种方式得到迭代器对象

迭代器的优点:可以不用依赖于索引取值

迭代器的缺点:只能从前往后依次取值,不能指定位置取值,所以不能计算长度

2.2  可迭代对象

可迭代对象:有__iter__()方法的对象,可迭代对象调用__iter__()得到的是迭代器对象

ls = [1,2,3,4,5,6]res = ls.__iter__()print(res,list(res))   # <list_iterator object at 0x0000023CAE7A8240> [1, 2, 3, 4, 5, 6]

可迭代对象有哪些:str,list,tuple,dict,set,文件对象、range()、enumerate()、生成器对象

2.3  迭代器对象

迭代器对象:有__next__()方法的对象是迭代器对象,迭代器对象依赖__next__()方法进行取值.

1.   既内置有__next__方法的对象,执行迭代器__next__方法可以不依赖索引取值

2.  又有__iter__()方法的对象,执行迭代器__iter__()方法得到的仍然是迭代器本身

s = [1,2,3]res = s.__iter__()ls1 = res.__next__()print(ls1)               # 1ls2 = res.__iter__()print(ls2 is res)        # True

迭代器对象:enumerate() | file | 生成器对象

2.4  for循环迭代器

直接用while True循环在迭代器对象中通过__iter__()取值,终究会有取空的时候,取空再取值,会报StopIteriation异常

ls = [1,2,3,4,5]iter_ls = ls.__iter__()while True:    try:        print(iter_ls.__next__())    except StopIteration:        print('取完了')        break

for循环就是对while循环去迭代器对象的封装

for循环的工作原理:

for k in obj:pass

1. 先调用in后面那个对象的__iter__方法,得到一个迭代器对象

2. 迭代器调用__next__方法进行取值,将得到的返回值赋值给变量名k

3. 循环往复直到__next__取值,抛出异常,for会自动捕捉异常StopIteration然后结束循环

2.5  枚举对象

给可迭代对象及迭代器对象添加迭代索引

s = 'abc'for k in enumerate(s):    print(k,end=' ')   # (0, 'a') (1, 'b') (2, 'c') 
dic = {'a': 1, 'b': 2, 'c': 3}obj = enumerate(dic)print(obj.__next__())    # (0, 'a')
dic = {'a': 1, 'b': 2, 'c': 3}for i,k_v in enumerate(dic.items()):    k,v = k_v    print(k_v,end='')        # ('a', 1)('b', 2)('c', 3)    print(i,k,v,end='     ')   # 0 a 1     1 b 2     2 c 3    

2.6  生成器

生成器:自定义的迭代器对象,就是用函数语法来声明生成器,用yield官架子取缔啊return关键字来返回值,参数没有多少变化

总结:有yield关键字的函数,函数名(),不是调用函数,而是生成得到生成器对象,生成器对象就是迭代器对象,可以通过__next__()进行取值

执行流程

def fn():    yield 1    yield 3    yield 5obj = fn()print(obj.__next__())    # 1    从开始往下执行,遇到第一个yield停止,拿到第一个yield的返回值print(obj.__next__())    # 3    从上一次停止的yield往下执行,在再遇到yield的地方停止,拿到当前yield的返回值print(obj.__next__())    # 5print(obj.__next__())    # StopIteration    以此类推,直到无法获得下一个yield,抛出StopIteration异常
# 案例一  创建生成器,从其取值,依次得到1! 2! 3! ...

def jiecheng():    ji = 1    count  = 1    while True:        ji *= count        yield  ji        count +=1obj = jiecheng()print(obj.__next__())   # 1print(obj.__next__())   # 2print(obj.__next__())   # 6print(obj.__next__())   # 24   可以无限取下去

# 案例二def jiecheng_num(num):    ji = 1    for i in range(1,num+1):        ji *= i        yield jiobj = jiecheng_num(3)print(obj.__next__())    # 1print(obj.__next__())    # 2print(obj.__next__())    # 3print(obj.__next__())    # StopIteration

# 案例三def my_range(num):    count = 0    while count < num:        yield count        count +=1

for k in my_range(3):    print(k,end=' ')       # 0 1 2print(list(my_range(3)))   # [0, 1, 2]print(tuple(my_range(3)))  # (0, 1, 2)

Python--day14(迭代器)的更多相关文章

  1. Python day14迭代器,三元表达式,列表解析以及生成器表达式

    1.迭代器 str=['sds','ccc','dw'] lit_1=str.__iter__()#获取迭代器 print(lit_1.__next__())#打印下一个值 # 用while做for的 ...

  2. python基础——迭代器

    python基础——迭代器 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器 ...

  3. python基础—迭代器、生成器

    python基础-迭代器.生成器 1 迭代器定义 迭代的意思是重复做一些事很多次,就像在循环中做的那样. 只要该对象可以实现__iter__方法,就可以进行迭代. 迭代对象调用__iter__方法会返 ...

  4. day14 迭代器 生成器 面向过程思想

    "" 迭代器 什么是迭代器(iterator) 器指的某种工具, 迭代指的是更新换代的过程,例如应用程序的版本更新从1.0 变成 1.1 再1.2 迭代的目的是要根据上一个结果,产 ...

  5. python之迭代器与生成器

    python之迭代器与生成器 可迭代 假如现在有一个列表,有一个int类型的12345.我们循环输出. list=[1,2,3,4,5] for i in list: print(i) for i i ...

  6. Python:迭代器的简单理解

    一.什么是迭代器 迭代,顾名思义就是重复做一些事很多次(就现在循环中做的那样).迭代器是实现了__next__()方法的对象(这个方法在调用时不需要任何参数),它是访问可迭代序列的一种方式,通常其从序 ...

  7. 第十六篇 Python之迭代器与生成器

    一.迭代器 一. 递归和迭代 生活实例说明什么是递归和迭代 A想去腾达大厦,问B怎么走路,B 说我不知道,我给你问问C,C也不知道,C又去问D,D知道,把路告诉了C,C又告诉B,B最后告诉A, 这就是 ...

  8. python——iterator迭代器|iterator详解——20140918|

    -----------------------------------------------------------------------------前言--------------------- ...

  9. 搞清楚 Python 的迭代器、可迭代对象、生成器

    很多伙伴对 Python 的迭代器.可迭代对象.生成器这几个概念有点搞不清楚,我来说说我的理解,希望对需要的朋友有所帮助. 1 迭代器协议 迭代器协议是核心,搞懂了这个,上面的几个概念也就很好理解了. ...

  10. python函数-迭代器&生成器

    python函数-迭代器&生成器 一.迭代器 1 可迭代协议 迭代:就是类似for循环,将某个数据集内的数据可以“一个挨着一个取出来” 可迭代协议: ① 协议内容:内部实现__iter__方法 ...

随机推荐

  1. mysql的学习笔记(四)

    ---恢复内容开始--- 1.插入操作 INSERT (1)INSERT table_name(col_name,...) VALUES(...),(....) CREATE TABLE user( ...

  2. Android中EditText显示明文与密文的两种方式

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 记录输入框显示.隐藏密码的简单布局以及实现方式. 效果图    代码分析 方式一 /**方式一:*/ private void sh ...

  3. 对称密码——DES加密算法

    前言 本篇博文将介绍对称密码算法中的DES密码的算法原理与代码实现(Java) DES算法原理 DES加密算法是对称加密算法(加密和解密使用同一个密钥)中的一种,DES也是分组密码,以64位为分组对明 ...

  4. vs2015安装编辑神器:resharper10.0

    在平时的开发工作中,作为一名程序员,难免会想办法找到适合自己的开发编辑器.这款插件来自JetBrains公司.接下来就来教大家如何对这款软件进行安装与破解. 1:首先下载与安装.如果没有找到适合的资源 ...

  5. MySQL 笔记整理(13) --为什么数据表删掉一半,表文件大小不变?

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> (本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除) 13) --为什么数据表删掉一半,表文件大小不变? 我们还是以MySQL ...

  6. Java虚拟机垃圾收集算法

    1.标记-清除算法 标记-清除算法分为 "标记" 和 "清除" 两个步骤:首先标记出所有需要回收的对象,然后在标记完成后统一回收所有被标记的对象,是垃圾收集算法 ...

  7. MySql 创建新用户

    grant all privileges on scdb.* to szl@localhost identified by '******'; 说明:1.all privileges 所有可用权限,也 ...

  8. react中PureComponent浅对比策略

    PureComponent实现了Component中没有实现的shouComponentUpdata()方法,会对state和props进行一次浅对比,本文介绍一下浅对比策略 源码中,实现浅对比的函数 ...

  9. 学习day02

    day021.结构标记 ***** 做布局 1.<header>元素 <header></header> ==> <div id="heade ...

  10. Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll

    Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll 在使用Anaconda创建一个虚拟环境出来,然后安装了scikit-learn.nump ...