今日内容

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. XSS攻击之窃取Cookie

    10 年前的博客似乎有点老了,但是XSS 攻击的威胁依然还在,我们不得不防. 窃取Cookie是非常简单的,因此不要轻易相信客户端所声明的身份.即便这个Cookie是在数秒之前验证过,那也未必是真的, ...

  2. 升级WIN10 (9879)后IE无响应的解决办法

    身为程序猿,当然有了新系统就要尝尝鲜,有WIN8时,哥是朋友圈第一个用的,有WIN8.1时哥也是第一个升级的. 现在WIN10来了,当然也得赶紧尝尝鲜.直接下载了 9879版的预览版本安装. 要说WI ...

  3. css——行内元素和块级元素的具体区别与行内块元素

    (学习笔记) 行内元素(inline)和块级元素(block)都是display属性的值.要知道行内元素和块级元素的区别,首先要了解他们的特性. 行内元素的特性:“行内”,顾名思义,在一行之内,所以相 ...

  4. 超大文本文件浏览器Snaptext,支持不限制大小的文本文件浏览

    文本文件超过1G就很少有软件可以打开了,超过10G就只有有限的几个可以打开了,那20G.30G.100G呢? Snaptext超大文本浏览器,应该是世界上最快速的文本文件浏览器,它支持基本不限制大小的 ...

  5. CAD 在ARCGIS中的坐标系问题

    近期在使用服务(文本写入dxf方式)导出CAD的时候发现导出的CAD文件和原始数据在ArcMap中叠加后不能重合,出现了错位的现象. 查看CAD文件后发现CAD的坐标系及投影和数据不一致导致的.遇到这 ...

  6. C学习笔记(自增)

    自增 (1)后缀:与Turbo C相同,在语句结束之前或者说分号之前才会执行自增. (2)前缀: 前两个自增统一取值,后面的自增即为取值. int i=2,j; j=++i+(++i)+(++i); ...

  7. 设置MYSQL数据库编码为UTF-8

    设置MYSQL数据库编码为UTF-8   1.  编辑MySql的配置文件 MySql的配置文件Windows下一般在系统目录下或者在MySql的安装目录下名字叫my.ini,可以搜索,Linux下一 ...

  8. windows PHP 安装 redis 外加扩展

    前置条件:为php7.2搭建redis扩展的前提是在本机上已经成功搭建好php的运行环境,我的电脑的运行环境时 apache2.4+mysql5.5+php7.2. 操作系统为64位,编译环境为Mic ...

  9. cent os 7 与cent os 6 修改主机名称

    centos6 需要修改两处:一处是/etc/sysconfig/network,另一处是/etc/hosts,只修改任一处会导致系统启动异常.零时修改用hostname your-name cnet ...

  10. 网络浅析(<<网络是怎么连接的>> 总结)

    概要 基本概念 网线 集线器 交换机 路由器 路由器和交换机 路由器和集线器 接入网 IP DNS 以太网 协议栈 网络连接过程 通信过程(浏览器 -> 服务器) 客户端和服务端 服务端的套接字 ...