今日内容

1. 带参装饰器  |  wrapper

2. 迭代器

3. 可迭代对象

4.迭代器对象

5.for 迭代器

6.枚举对象

带参装饰器

是指装饰器为被装饰的函数添加新功能,需要外界的参数

    ----outer参数固定一个。就是func

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

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

def wrap(info):       #  只能在原函数基础的外部,再次定义一个函数,通过形参把函数带入内部
def outer(func): # 此处为原函数。
info = 0 # 然后此处接收外部函数
def inner(*args,**kwargs):
print('新:拓展的新功能,可能也需要外界的参数%s'% info)
res = func(*args,**kwargs)
return res
return inner
return outer
@wrap('外部参数') # 此处传入外部信息
def fn():pass
fn()
# 系统自带的wraps带参装饰器:改变inner的指向(假象), 本质上外界使用的依然是inner,但是打印显示的是wraps中的函数
from functools import wraps
def outer(func):
@wraps(func)
def inner(*args,**kwargs):
res = func(*args,**kwargs)
return res
return inner @outer
def fn():pass
fn()

迭代器

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

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

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

迭代器缺点:只能从前往后一次取值

可迭代对象

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

ls = [9,8,7,6,5,4,3]
res = ls.__iter__() # --> 可以使用__iter__方法,可迭代对象。
print(res) # <list_iterator object at 0x0000026A432481D0> 此处的iterator的意思是迭代器对象,
# 因为使用__iter__后会转为__next__(迭代器对象)

迭代器对象

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

with open('1.txt','rb')as f:
res = f.__next__()  # 可调用__next__方法。迭代器对象
print(res) # 会把文件中的第一行内容读出来
res = f.__next__()
print(res) # 再次执行会把第二行内容读出来。 迭代器缺点,只能从前往后依次取值。
# 以此类推,直至取空,如果取空后未停止依旧报错

for循环迭代器

如果直接用while True 循环在迭代器对象中通过__next__()的方法取值,如果值取空后没有停止取值,继续取值会抛出异常:StopIteration

ls = [3,2,5,4,1]
iterator = ls.__iter__()
while True:
print(iterator.__next__()) # 如果直接通过迭代器循环。数值取完后会报错 StopIteration

不过我们可以通过try 来捕获异常,并处理异常。for的工作原理就是如此,

ls = [3,2,5,4,1]
iterator = ls.__iter__()
while True:
try: # 可以查看异常的语句
print(iterator.__next__())
except StopIteration: # 捕获异常信息,并把遗产是个信息处理掉
break

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

ls = [3,2,5,4,1]
for v in ls:
print(v)

for循环迭代器的工作原理:

for v in obj: pass

1.获取被循环对象(obj)的__iter__()的结果,得到要操作的迭代器对象

2.迭代器对象通过__next__() 方法进行取值,依次将当前循环的取值结果赋值给被赋值的对象(v)

3.当值取空后,自动处理StopIteration异常,然后结束循环

枚举对象

给可迭代器对象及迭代器对象添加迭代索引,关键字为 enumerate

for v in enumerate(s):
print(v ) # (0, 'a')(1, 'b')(2, 'c') #给迭代器对象添加了索引

生成器

生成器:自定义的迭代器对象

    ----就是用函数语法来声明生成器,用yield 关键字取代return 关键字来返回值,参数与函数没有多少差别

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

# 执行流程:
def fn():

  yield 1
  yield 3
  yield 5

obj = fn()
obj.__next__() # 从开始往下执行,遇到第一个yield停止,拿到yield的返回值
obj.__next__() # 从上一次停止的yield往下执行,在再遇到的yield时停止,拿到当前停止的yield的返回值
# ... # 以此类推,直到无法获得下一个yield,抛StopIteration异常

# 可以直接被for循环遍历
for v in fn():
print v

# 案例一:创建生成器,从其取值,依次得到1! 2! 3! ...
def jiecheng():
  ji = 1
  count = 1
  while True:
    ji *= count
    yield ji
    count += 1

obj = jiecheng()
print(obj.__next__())
print(obj.__next__())
print(obj.__next__()) # 可以无限取

# 案例二:
def jiecheng_num(num):
  ji = 1
  for i in range(1, num + 1):
    ji *= i
    yield ji
# ...

obj = jiecheng_num(3)
print(obj.__next__())
print(obj.__next__())
print(obj.__next__())
print(obj.__next__()) # 有异常了

for v in jiecheng_num(5):
  print(v) # 会自动处理异常停止

# 案例三:
def my_range(num): # => [0, 1, 2, ..., num - 1]
  count = 0
  while count < num:
    yield count
    count += 1

for v in my_range(10):
  print(v, end=' ')

print(list(my_range(10)))

python第十四天的更多相关文章

  1. 初学 Python(十四)——生成器

    初学 Python(十四)--生成器 初学 Python,主要整理一些学习到的知识点,这次是生成器. # -*- coding:utf-8 -*- ''''' 生成式的作用: 减少内存占有,不用一次性 ...

  2. Python第二十四天 binascii模块

    Python第二十四天 binascii模块 binascii用来进行进制和字符串之间的转换 import binascii s = 'abcde' h = binascii.b2a_hex(s) # ...

  3. Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式

    Python第十四天 序列化  pickle模块  cPickle模块  JSON模块  API的两种格式 目录 Pycharm使用技巧(转载) Python第一天  安装  shell  文件 Py ...

  4. 孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘

    孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天发现了python的类中隐藏着一些特殊的私有方法. 这些私有方法不管我 ...

  5. 孤荷凌寒自学python第十四天python代码的书写规范与条件语句及判断条件式

    孤荷凌寒自学python第十四天python代码的书写规范与条件语句及判断条件式 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 在我学习过的所有语言中,对VB系的语言比较喜欢,而对C系和J系 ...

  6. Python进阶(十四)----空间角度研究类,类与类之间的关系

    Python进阶(十四)----空间角度研究类,类与类之间的关系 一丶从空间角度研究类 对象操作对象属性 class A(): address = '沙河' def __init__(self, na ...

  7. selenium python (十四)上传文件的处理

    #!/usr/bin/python# -*- coding: utf-8 -*-__author__ = 'zuoanvip' #上传过程一般要打开一个系统的windows窗口,从窗口选择本地文件添加 ...

  8. Python爬虫(十四)_BeautifulSoup4 解析器

    CSS选择器:BeautifulSoup4 和lxml一样,Beautiful Soup也是一个HTML/XML的解析器,主要的功能也是如何解析和提取HTML/XML数据. lxml只会局部遍历,而B ...

  9. python六十四课——高阶函数练习题(二)

    总结:高阶函数以及匿名函数之间的配合使用 from functools import reduce #模块一:lambda和filter的结合使用 #lt = [1,2,3,4,5,6,7,8,9] ...

  10. python第二十四天-----作业终于完成啦

    作业 1, ATM:模拟实现一个ATM + 购物商城程序 额度 15000或自定义实现购物商城,买东西加入 购物车,调用信用卡接口结账可以提现,手续费5%支持多账户登录支持账户间转账记录每月日常消费流 ...

随机推荐

  1. pycharm中Django的安装和简单使用

    一.安装: 1.点击File,找到setting选项 2.点击+号,进入下面界面 结束后,安装完成 二.创建Django项目 创建成功后,新项目左侧: templates:用于存储HTML文件 set ...

  2. 《JavaScript高级程序设计》笔记:使用Canvas绘图(15)

    基本用法 要使用<canvas>元素,必须先设置其width和height属性,指定可以绘图的区域大小.出现在开始和结束标签中的内容是后备信息,如果浏览器不支持<canvas> ...

  3. java工作流引擎Jflow父子流程demo

    关键字 驰骋工作流引擎 流程快速开发平台 workflow ccflow jflow  .net开源工作流 定义 一个流程A的一个节点,因工作的需要调起另外的流程B,A就叫父流程,B就叫子流程.如果流 ...

  4. App隐私条款

    欢迎光临本app,请您仔细阅读以下条款,如果您对本协议的任何条款表示异议,您可以选择不使用本app:进入本app则意味着您将同意遵守本协议下全部规定,并完全服从于app开发者的统一管理. 第一章 总则 ...

  5. java 线程方法 ---- wait()

    class MyThread5 implements Runnable{ private int flag = 10; @Override public void run() { while (fla ...

  6. Jmeter Beanshell 用法

    Beanshell 的用法 什么是beanshell Beanshell是一种完全符合java语法的脚本语言,并且拥有自己的内置对象和语法 Beanshell是用java写的,一个小型嵌入式java源 ...

  7. dbgrideh 哪些行被选中了

    在dbgrideh中允许选择多行,如何知道哪些行被选中是个BOOKMARK类型的属性.SelectedRows: TBookmarkListprocedure TForm1.Button1Click( ...

  8. pipe size设置

    我所用的软件架构,使用pipe来实现线程之间的大量数据的传输.在实际操作中,pipe中传输的是数据的指针,而不是数据本身.  但是在调试过程中,我发现,如果我尝试往pipe里面write10000个指 ...

  9. pyspider 初次使用

    一 安装 pip install pyspider 请安装PhantomJS:http://phantomjs.org/build.html 二 检验是否启动成功 cmd中输入: pyspider 安 ...

  10. ARTS打卡第三周

    Algorithm 题目描述 Given an array of integers, find if the array contains any duplicates. Your function ...