今日内容

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. 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感

    关键字:名称,名称空间,引用,指针,指针类型的指针(即指向指针的指针) 我读完后的理解总结: 1. 我们知道,python中的变量的赋值操作,变量其实就是一个名称name,赋值就是将name引用到一个 ...

  2. Java中数组的插入,删除,扩张

    Java中数组是不可变的,但是可以通过本地的arraycop来进行数组的插入,删除,扩张.实际上数组是没变的,只是把原来的数组拷贝到了另一个数组,看起来像是改变了. 语法: System.arrayc ...

  3. Ext JS中的typeOf

    Ext JS中的typeOf:以字符串格式,返回给定变量的类型 其中对字符串对象.元素节点.文本节点.空白文本节点判断并不准确 测试代码如下: <!DOCTYPE HTML PUBLIC &qu ...

  4. Django用户继承AbstractUser后密码为明文

    Django用户继承AbstractUser后密码为明文 其实本不应该有这个问题,却花了我很久的时间,因为还是初学阶段. 造成这个原因是因为在admin注册的生活没有指定Admin 在app的admi ...

  5. 字符串转数字练习--String to Integer (atoi)

    Implement atoi which converts a string to an integer. The function first discards as many whitespace ...

  6. asp.net webapi 的Request如何获取参数

    public class BaseApiController : ApiController { private HttpRequestBase _request; /// 全局Requests对象 ...

  7. FIFO深度计算

    本文设计思想采用明德扬至简设计法.在使用FPGA设计系统时,常需要利用FIFO进行数据缓存保证数据不丢失,因此计算FIFO深度是至关重要的.FIFO的深度主要取决于“最恶劣”的情况,以下对于两种最常见 ...

  8. 我的第一个python web开发框架(40)——后台日志与异常处理

    后台权限和底层框架的改造终于完成了,小白也终于可以放下紧悬着的心,可以轻松一下了.这不他为了感谢老菜,又找老菜聊了起来. 小白:多谢老大的帮忙,系统终于改造完成了,可以好好放松一下了. 老菜:呵呵,对 ...

  9. [LeetCode] 17. 电话号码的字母组合

    题目描述:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/ 题目描述: 给定一个仅包含数字 2-9 的字符 ...

  10. In action "Setting JDBC driver jar location unix [Set a variable]" (screen "Select a Database [Configurable banner form]"), property "Script":

    java.lang.Exception: JDBC Driver Jar not found. Looking for: /u01/oracle/GG_Director/ERROR: Unresolv ...