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%支持多账户登录支持账户间转账记录每月日常消费流 ...
随机推荐
- vue中使用百度地图,悬浮窗搜索功能
https://www.cnblogs.com/shuaifing/p/8185311.html 侵删 <template> <div id="all"> ...
- 【设计模式】单例模式 Singleton Pattern
通常我们在写程序的时候会碰到一个类只允许在整个系统中只存在一个实例(Instance) 的情况, 比如说我们想做一计数器,统计某些接口调用的次数,通常我们的数据库连接也是只期望有一个实例.Windo ...
- 【English】九、kids/children/toddlers 三个单词的区别
一.child.kid.toddler 参考:https://www.zybang.com/question/a9150bb1239cf1d667135e9bd8518f75.html child:美 ...
- 好代码是管出来的——.Net中的代码规范工具及使用
上一篇文章介绍了编码标准中一些常用的工具,本篇就具体来介绍如何使用它们来完成代码管理. 本文主要内容有: Roslyn简介 开发基于Roslyn的代码分析器 常用的基于Roslyn的代码分析器 在.N ...
- UEditor1.2.6.0在.net环境下使用
UEditor1.2.6.0 1.百度百科词条 2.UEditor官方网站 [CKEditor+CKFinder的配置实用,可查看博主另一篇文章] 第一次接触UEditor还是在2011年的下半年里, ...
- @EnableFeignClients 注解
feignClents在spring容器里找不到的原因 当使用的feignClents 来自引用别的工程时,需要指定包名,如果不指定就算使用ComponentScan 扫描也不行 import org ...
- Troubleshooting 'library cache: mutex X' Waits. (Doc ID 1357946.1)
In this Document Purpose Troubleshooting Steps What is a 'library cache: mutex X' wait? What ...
- Linux新增和删除环境变量
vi ~/.bashrc 添加 export 变量名=值 使环境变量生效 source ~/.bashrc
- 在 .NET Core 中运行 JavaScript
一.前言 在 .NET Framework 时,我们可以通过V8.NET等组件来运行 JavaScript,不过目前我看了好几个开源组件包括V8.NET都还不支持 .NET Core ,我们如何在 . ...
- Jquery mobile中用Jquery的append()追加的内容没有Jquery mobile的样式
Jquery Mobile 动态添加块之后, 样式不是JM内定的样式,解决方案如下: $('#content').append(html).enhanceWithin();//Jquery Mobil ...