python第十四天
今日内容
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第十四天的更多相关文章
- 初学 Python(十四)——生成器
初学 Python(十四)--生成器 初学 Python,主要整理一些学习到的知识点,这次是生成器. # -*- coding:utf-8 -*- ''''' 生成式的作用: 减少内存占有,不用一次性 ...
- Python第二十四天 binascii模块
Python第二十四天 binascii模块 binascii用来进行进制和字符串之间的转换 import binascii s = 'abcde' h = binascii.b2a_hex(s) # ...
- Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式
Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式 目录 Pycharm使用技巧(转载) Python第一天 安装 shell 文件 Py ...
- 孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘
孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天发现了python的类中隐藏着一些特殊的私有方法. 这些私有方法不管我 ...
- 孤荷凌寒自学python第十四天python代码的书写规范与条件语句及判断条件式
孤荷凌寒自学python第十四天python代码的书写规范与条件语句及判断条件式 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 在我学习过的所有语言中,对VB系的语言比较喜欢,而对C系和J系 ...
- Python进阶(十四)----空间角度研究类,类与类之间的关系
Python进阶(十四)----空间角度研究类,类与类之间的关系 一丶从空间角度研究类 对象操作对象属性 class A(): address = '沙河' def __init__(self, na ...
- selenium python (十四)上传文件的处理
#!/usr/bin/python# -*- coding: utf-8 -*-__author__ = 'zuoanvip' #上传过程一般要打开一个系统的windows窗口,从窗口选择本地文件添加 ...
- Python爬虫(十四)_BeautifulSoup4 解析器
CSS选择器:BeautifulSoup4 和lxml一样,Beautiful Soup也是一个HTML/XML的解析器,主要的功能也是如何解析和提取HTML/XML数据. lxml只会局部遍历,而B ...
- python六十四课——高阶函数练习题(二)
总结:高阶函数以及匿名函数之间的配合使用 from functools import reduce #模块一:lambda和filter的结合使用 #lt = [1,2,3,4,5,6,7,8,9] ...
- python第二十四天-----作业终于完成啦
作业 1, ATM:模拟实现一个ATM + 购物商城程序 额度 15000或自定义实现购物商城,买东西加入 购物车,调用信用卡接口结账可以提现,手续费5%支持多账户登录支持账户间转账记录每月日常消费流 ...
随机推荐
- pycharm中Django的安装和简单使用
一.安装: 1.点击File,找到setting选项 2.点击+号,进入下面界面 结束后,安装完成 二.创建Django项目 创建成功后,新项目左侧: templates:用于存储HTML文件 set ...
- 《JavaScript高级程序设计》笔记:使用Canvas绘图(15)
基本用法 要使用<canvas>元素,必须先设置其width和height属性,指定可以绘图的区域大小.出现在开始和结束标签中的内容是后备信息,如果浏览器不支持<canvas> ...
- java工作流引擎Jflow父子流程demo
关键字 驰骋工作流引擎 流程快速开发平台 workflow ccflow jflow .net开源工作流 定义 一个流程A的一个节点,因工作的需要调起另外的流程B,A就叫父流程,B就叫子流程.如果流 ...
- App隐私条款
欢迎光临本app,请您仔细阅读以下条款,如果您对本协议的任何条款表示异议,您可以选择不使用本app:进入本app则意味着您将同意遵守本协议下全部规定,并完全服从于app开发者的统一管理. 第一章 总则 ...
- java 线程方法 ---- wait()
class MyThread5 implements Runnable{ private int flag = 10; @Override public void run() { while (fla ...
- Jmeter Beanshell 用法
Beanshell 的用法 什么是beanshell Beanshell是一种完全符合java语法的脚本语言,并且拥有自己的内置对象和语法 Beanshell是用java写的,一个小型嵌入式java源 ...
- dbgrideh 哪些行被选中了
在dbgrideh中允许选择多行,如何知道哪些行被选中是个BOOKMARK类型的属性.SelectedRows: TBookmarkListprocedure TForm1.Button1Click( ...
- pipe size设置
我所用的软件架构,使用pipe来实现线程之间的大量数据的传输.在实际操作中,pipe中传输的是数据的指针,而不是数据本身. 但是在调试过程中,我发现,如果我尝试往pipe里面write10000个指 ...
- pyspider 初次使用
一 安装 pip install pyspider 请安装PhantomJS:http://phantomjs.org/build.html 二 检验是否启动成功 cmd中输入: pyspider 安 ...
- ARTS打卡第三周
Algorithm 题目描述 Given an array of integers, find if the array contains any duplicates. Your function ...