s21day09 python笔记
一、装饰器
1.1 目的
- 在不改变原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能
1.2 应用场景
- 想要为函数扩展功能时,可以选择用装饰器
1.3 基本装饰器
基本格式:
def func(arg):
def inner():
v = arg()
return v
return inner # 重点:
# 第一步:执行func函数并将下面的函数参数传递,相当于:func(index)
# 第二步:将func的返回值重新赋值给下面的函数名。 index = func(index)
@func
def index():
print(123)
return 666 print(index)
总结
- 编写格式:
def 外层函数(参数):
def 内层函数(*args,**kwargs)
return 参数(*args,**kwargs)
return 内层函数
- 应用格式:
@外层函数
def index(): #要装饰的函数
pass index()
# 装饰器的编写
def x(func):
def y():
# 前
ret = func()
# 后
return ret
return y # 装饰器的应用
@x
def index():
return 10 # 执行函数,自动触发装饰器了
v = index()
print(v)
示例:
def func(arg):
def inner():
print('before')
v = arg()
print('after')
return v
return inner def index():
print('123')
return '666' # 示例一
v1 = index() # 执行index函数,打印123并返回666赋值给v1. # 示例二
v2 = func(index) # v2是inner函数,arg=index函数
index = 666
v3 = v2() # 示例三
v4 = func(index)
index = v4 # index ==> inner
index() # 示例四
index = func(index)
index()
1.4 带参数的装饰器
应用场景:flask框架 / django缓存 / 写装饰器实现被装饰的函数要执行N次
# 第一步:执行 ret = xxx(index)
# 第二步:将返回值赋值给 index = ret
@xxx
def index():
pass # 第一步:执行 v1 = uuu(9)
# 第二步:ret = v1(index)
# 第三步:index = ret
@uuu(9)
def index():
pass
区别:
# 普通装饰器
def wrapper(func):
def inner(*args,**kwargs):
data = func(*args,**kwargs) # 执行原函数并获取返回值
return data
return inner @wrapper
def index():
pass # 带参数装饰器
def x(counter):
def wrapper(func):
def inner(*args,**kwargs):
data = func(*args,**kwargs) # 执行原函数并获取返回值
return data
return inner
return wrapper @x(9)
def index():
pass
练习题
# 写一个带参数的装饰器,实现:参数是多少,被装饰的函数就要执行多少次,把每次结果添加到列表中,最终返回列表。
def xxx(counter):
def wrapper(func):
def inner(*args,**kwargs):
v = []
for i in range(counter):
data = func(*args,**kwargs) # 执行原函数并获取返回值
v.append(data)
return v
return inner
return wrapper @xxx(5)
def index():
return 8
v = index()
print(v)
二、 迭代器
2.1 基本知识
用途:对 某种对象(str/list/tuple/dict/set类创建的对象-可迭代对象)中的元素进行逐一获取
表象:具有
__next__方法且每次调用都获取可迭代对象中的元素(从前到后一个一个获取)示例:
- 列表转换成迭代器:
- v1 = iter([11,22,33,44])
v1 = [11,22,33,44].__iter__()
- 迭代器想要获取每个值:反复调用
val = v1.__next__()
v1 = [11,22,33,44] # 列表转换成迭代器
v2 = iter(v1) # 迭代器获取每个值
result1 = v2.__next__()
print(result1)
result2 = v2.__next__()
print(result2)
result3 = v2.__next__()
print(result3)
result4 = v2.__next__()
print(result4) result5 = v2.__next__()
print(result5) # 报错:Stoplteration 表示已经迭代结束
- 列表转换成迭代器:
for循环:运用了迭代器
v1 = [11,22,33,44] # 1.内部会将v1转换成迭代器
# 2.内部反复执行 迭代器.__next__()
# 3.取完不报错
for item in v1:
print(item)
2.2 可迭代对象
表象:可以被for循环的对象就可以称为是可迭代对象
如何让一个对象变成可迭代对象?
- 在类中实现
__iter__方法且返回一个迭代器(生成器)
# 示例一:
class Foo:
def __iter__(self):
return iter([1,2,3,4]) obj = Foo() # 示例二:
class Foo:
def __iter__(self):
yield 1
yield 2
yield 3 obj = Foo()
- 在类中实现
注意:只要能被for循环,就是去看他内部的
__iter__方法
三、 生成器
3.1 基本知识
可以理解为:函数的变异、特殊的迭代器、特殊的可迭代对象
生成器的作用:
- 生成数据
- 迭代
示例:
# 生成器函数(内部是否包含yield)
def func():
print('F1')
yield 1
print('F2')
yield 2
print('F3')
yield 100
print('F4')
# 函数内部代码不会执行,返回一个 生成器对象 。
v1 = func()
# 生成器是可以被for循环,一旦开始循环那么函数内部代码就会开始执行。
for item in v1:
print(item)
3.2 关键字
yield
- 用途:判断函数是否是生成器函数
yield from
- 用途:从当前生成器函数跳到其他生成器函数中,执行结束后再回原函数继续执行下面代码
def base():
yield 88
yield 99 def func():
yield 1
yield 2
yield from base() # 跳到base函数
yield 3 result = func()
for item in result:
print(item) # 1 2 88 99 3
3.3 总结
重点:
- 函数中如果存在yield,那么该函数就是一个生成器函数
- 调用生成器函数会返回一个生成器
- 生成器只有被for循环时,生成器函数内部的代码才会执行,每次循环都会获取yield返回的值
建议:
生成器函数中一般不要有return
如果需要终止生成器函数中的循环,可以用return
def func():
count = 1
while True:
yield count
count += 1
if count == 100:
return
val = func()
for item in val:
print(item)
生成器示例:读取大文件内容
def func():
# 分批去读取文件中的内容,将文件的内容返回给调用者。
cursor = 0
while True:
f = open('db', 'r', encoding='utf-8') # 通过网络连接上redis
# 代指 redis[0:10]
f.seek(cursor)
data_list =[]
for i in range(10):
line = f.readline()
if not line:
return
data_list.append(line)
cursor = f.tell()
f.close() # 关闭与redis的连接 for row in data_list:
yield row for item in func():
print(item)
s21day09 python笔记的更多相关文章
- Python笔记之不可不练
如果您已经有了一定的Python编程基础,那么本文就是为您的编程能力锦上添花,如果您刚刚开始对Python有一点点兴趣,不怕,Python的重点基础知识已经总结在博文<Python笔记之不可不知 ...
- boost.python笔记
boost.python笔记 标签: boost.python,python, C++ 简介 Boost.python是什么? 它是boost库的一部分,随boost一起安装,用来实现C++和Pyth ...
- 20.Python笔记之SqlAlchemy使用
Date:2016-03-27 Title:20.Python笔记之SqlAlchemy使用 Tags:python Category:Python 作者:刘耀 博客:www.liuyao.me 一. ...
- Python笔记——类定义
Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...
- 13.python笔记之pyyaml模块
Date:2016-03-25 Title:13.Python笔记之Pyymal模块使用 Tags:Python Category:Python 博客地址:www.liuyao.me 作者:刘耀 YA ...
- 8.python笔记之面向对象基础
title: 8.Python笔记之面向对象基础 date: 2016-02-21 15:10:35 tags: Python categories: Python --- 面向对象思维导图 (来自1 ...
- python笔记 - day8
python笔记 - day8 参考: http://www.cnblogs.com/wupeiqi/p/4766801.html http://www.cnblogs.com/wupeiqi/art ...
- python笔记 - day7-1 之面向对象编程
python笔记 - day7-1 之面向对象编程 什么时候用面向对象: 多个函数的参数相同: 当某一些函数具有相同参数时,可以使用面向对象的方式,将参数值一次性的封装到对象,以后去对象中取值即可: ...
- python笔记 - day7
python笔记 - day7 参考: http://www.cnblogs.com/wupeiqi/articles/5501365.html 面向对象,初级篇: http://www.cnblog ...
随机推荐
- 剑指offer(32)把数组排成最小的数
题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 题目分析 主 ...
- react开发初始配置和一些问题
1.npm run build之后,打开网页显示为空白的解决方案 初始使用的开发者应该都会使用create-react-app,初次尝试,启动没有问题,然后就测试一下build,结果发现本地文件ind ...
- python基础知识点四
网络编程(socket) 软件开发的架构: 两个程序之间通讯的应用大致通过从用户层面可以分为两种: 1是C/S,即客户端与服务端,为应用类的,比如微信,网盘等需要安装桌面应用的 2是B/S,即浏览器与 ...
- Learning-Python【19】:Python常用模块(2)—— os、sys、shutil
os模块:与操作系统相关的模块 import os # 获取当前的工作目录 print(os.getcwd()) # 切换工作目录 os.chdir(r'E:\Python\test') print( ...
- 没有显示器、网线、路由器,编辑TF卡连接树莓派
只有电脑,连接树莓派的方法 电脑新建热点 打开TF卡,在根目录新建文件wpa_supplicant.conf,内容如下 country=GB ctrl_interface=DIR=/var/run/w ...
- windows上使用foremost
做CTF题需要这工具来提取文件里的隐藏文件, 网上大部分是linux版本,之前好不容易找了一个exe文件结果还不能用.找了很长时间终于找到了: https://github.com/raddyfiy/ ...
- js实现千位分隔
最近一个项目中使用到了千位分隔这个功能,在网上也看见一些例子,但是实现起来总觉有些复杂.因此,自己实现了一个千位分隔,留给后来的我们. 先上源码吧. 该方法支持传入的是一个数字字符串,数字.第二个参数 ...
- R apply() 函数和 tapply() 函数
apply(a,b,c) a是矩阵 b是行或列的代表,1是行,2是列 c是执行函数,如求和-sum,求平均-mean,求-range tapply(a,b,c) a是一个一维数据, ...
- trueStudio中使用printf函数
1.通过printf输出浮点数需要如下设置: 在工程属性下找到C/C++ build->Settings->Tool Settings->C Linker->Miscellan ...
- linux如何让一个程序崩溃后自动重启
思路: 写一个脚本 监控程序的运行状态 没有运行启动运行 已运行不做操作. 如果在控制台启动脚本 注意必须 nohup sh xxx.sh & while true do ps -ef ...