day11 - 15(装饰器、生成器、迭代器、内置函数、推导式)
day11:装饰器(装饰器形成、装饰器作用、@语法糖、原则、固定模式)
装饰器形成:最简单的、有返回值的、有一个参数的、万能参数
- 函数起的作用:装饰器用于在已经完成的函数前后增加功能
- 语法糖:使代码变得简单
- 原则:开放封闭原则,因为已经发布的源码不可以轻易修改,所以使用装饰器在原来的基础上增加功能呢个
- 固定模式、万能参数、有返回值
import time
def timmer(func):
def inner(*args,**kwargs):
start = time.time()
time.sleep(1)
ret = func(*args,**kwargs)
end = time.time() - start
return ret,end
return inner @timmer
def func(i):
print(i)
return '***:%s' %i res = func('w')
n,t = res
print(n,t)固定模式
- 练习题
- 编写装饰器、为多个函加上认证功能()
FLAG = False
def timmer(func):
global FALG
def inner (*args,**kwargs):
start = time.time()
if FLAG:
res = func()
else:
res = '登录失败'
return res
return inner def Login():
login_user = input('请输入账号:')
login_pass = input('请输入密码:')
with open('user.txt','r',encoding='utf-8') as f:
for i in f:
if 'login_user' in i:
user_name,user_pass = '|'.join(i)
break
if login_user == user_name and login_pass == user_pass:
global FLAG
FLAG = True
else:
print('登录失败')
continue @timmer
def func(a,b):
print(a,b)
return '***:%s;***%s' %(a,b) while 1:
command = input('请输入操作序号:]\n1:登录\n2:执行')
if command == '':
Logon()
elif command == '':
func()
else:
print('您的输入有误,请重新输入')
continue第一题
- 编写装饰器,为多个函数加上记录调用功能,要求每次调用函数都将被调用的函数名称写入文件
- 编写下载网页内容的函数,要求功能是:用户传入一个url,函数返回下载页面的结果
- 为题目3编写装饰器,实现缓存网页内容的功能:
- 编写装饰器、为多个函加上认证功能()
day12:装饰器的进阶(wraps模块、进阶)
- wraps模块
- 作用:当一个函数被装饰后,使用__name__ 和 __doc__查看函数相关信息时,会查看装饰器的相关信息,wraps的作用就是查看信息时查看的是被点用函数的相关信息
- 例子:
from functools import wraps def timmer(func):
@wraps(func)
def inner(*args,**kwargs):
"""这个是inner"""
res = func(*args,**kwargs)
return res
return inner @timmer
def func1(a,b):
"""这个是func1"""
print(a,b)
return '%s *** %s' % (a,b) print(func1.__name__)
print(func1.__doc__)wraps例子
- 装饰器进阶
- 多个函数怎么同时决定是否使用装饰器
from functools import wraps
FLAGE = True def timmer(flage):
def wrapper(func):
@wraps(func)
def inner(*args,**kwargs):
if flage:
print('装饰前被执行前做的事')
res = func(*args,**kwargs)
print('装饰器被执行后做的事')
return res
else:
res = func(*args,**kwargs)
return res
return inner
return wrapper @timmer(FLAGE)
def func1(a,b):
print('执行了,收到了%s 和 %s' %(a,b))
print(func1.__name__)
return 'Ok' @timmer(FLAGE)
def func2(a,b):
print('执行了,收到了%s 和 %s' %(a,b))
print(func2.__name__)
return 'Ok' print(func1('董','轩'))
print(func2('Python','蟒蛇'))多个函数同时装饰
- 一个函数被多个装饰器调用
def wrapper1(func):
def inner(*args,**kwargs):
print('wrapper1 start')
res = func(*args,**kwargs)
print(res)
print('wrapper1 end')
return res
return inner def wrapper2(func):
def inner(*args,**kwargs):
print('wrapper2 start')
res = func(*args,**kwargs)
print(res)
print('wrapper2 end')
return res
return inner def wrapper3(func):
def inner(*args,**kwargs):
print('wrapper3 start')
res = func(*args,**kwargs)
print(res)
print('wrapper3 end')
return res
return inner @wrapper3
@wrapper2
@wrapper1 def func():
print(func.__name__)
return 'Func执行完了' print(func())一个函数被多个装饰器调用
- 多个函数怎么同时决定是否使用装饰器
day13:(迭代器、生成器)
- 迭代器
- 从容其中一个一个取值,会把所有数据拿到
- 节省内存
- 迭代器协议和可迭代协议
- 可以被for循环的都是可迭代的
- 可迭代的内部都有__iter__方法
- 只要是迭代器,一定可以迭代
- 可迭代的.__iter__()就可以获取一个迭代器
- 迭代器中的__next__()方法可以一个一个的获取值
- 检验迭代器和可迭代的方法
from collections import Iterable
from collections import Iterator
print(isinstance([],Iterable))
print(isinstance([],Iterator))检验方法
- 生成器
- 只要含有yield关键字的函数都是生成器函数
- yield不能和return共用且需要写在函数内
- 简单的一个生成器
def generator():
print(1)
yield 'a' # 取值
ret = generator()
print(ret.__next__())简单生成器
day14:(生成器函数进阶、表达式、各种推导式)
- 生成器进阶
- send:获取下一个值的效果和next基本一致,第一次不能用send
- 例子
- 获取平均值
def average():
sum = 0
count = 0
avg = 0
while True:
num = yield avg
sum += num #
count += 1 #
avg = sum/count avg_g = average()
print(avg_g.__next__())
avg1 = avg_g.send(10)
avg1 = avg_g.send(20)
avg1 = avg_g.send(30)
print(avg1)获取平均值
- 预激活生成器,就是使用装饰器,让send可以第一次使用
def init(func): #装饰器
def inner(*args, **kwargs):
g = func(*args, **kwargs) #g = average()
g.__next__()
return g
return inner @init
def average():
sum = 0
count = 0
avg = 0
while True:
num = yield avg
sum += num #
count += 1 #
avg = sum/count avg_g = average() #===> inner
ret = avg_g.send(10)
print(ret)
ret = avg_g.send(20)
print(ret)预激生成器的装饰器
- 小技巧
def generator():
a = 'abcde'
b = ''
for i in a:
yield i
for i in b:
yield i
def generator():
a = 'abcde'
b = ''
yield from a
yield from b g = generator()
for i in g:
print(i)小技巧
- 获取平均值
- 生成器表达式
g = (i for i in range(10))
print(g)
for i in g:
print(i) - 各种推导式
# 列表:
ret = [i*i for i in (1,2,3,4) if i%3 == 0]
print(ret)
例子:
找到嵌套列表中名字含有两个‘e’的所有名字
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
ret = [name for lst in names for name in lst if name.count('e') ==2] # 列表
ret = (name for lst in names for name in lst if name.count('e') ==2) # 字典
for i in ret:
print(i)
# 字典:
mcase = {'a': 10, 'b': 34}
mcase_frequency = {mcase[k]: k for k in mcase}
print(mcase_frequency) #集合推导式,自带结果去重功能
squared = {x**2 for x in [1, -1, 2]}
print(squared)各种推导式
day15:(面试题、内置函数)
- 面试题
一、
def demo():
for i in range(4):
yield i g=demo() g1=(i for i in g)
g2=(i for i in g1) print(list(g))
print(list(g1))
print(list(g2)) 二、
def add(n,i):
return n+i def test():
for i in range(5):
yield i g=test()
for n in [1,10,5]:
g=(add(n,i) for i in g) print(list(g)) - 内置函数:https://www.processon.com/view/link/5c35f503e4b0641c83d55651
day11 - 15(装饰器、生成器、迭代器、内置函数、推导式)的更多相关文章
- Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle
目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...
- Python装饰器、生成器、内置函数、json
这周学习了装饰器和生成器,写下博客,记录一下装饰器和生成器相关的内容. 一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如 ...
- python之装饰器、生成器、内置函数、JSON
一.装饰器: 装饰器,器在这里的意思是函数,也就是装饰函数.作用是给其他函数添加新功能,它可以不改变原有的函数,原来的函数和原来一模一样,什么都不需要改变,只需要在函数外部加上调用哪个装饰器就可以了, ...
- Python--函数对象@命名空间与作用域@包函数@装饰器@迭代器@内置函数
一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...
- python学习笔记(五):装饰器、生成器、内置函数、json
一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里 ...
- 【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】
一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...
- python学习笔记之装饰器、生成器、内置函数、json(五)
一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里面 ...
- python-迭代器、生成器、内置函数及面向过程编程
一.迭代器 迭代器是迭代取值的工具,迭代是一个重复的过程,每一次重复都是基于上一次的结果而来的. 为什么要用迭代器呢? 1.可以不依赖索引取值 2.同一时刻在内存中只有一个值,不会过多的占用内存 如何 ...
- 跟着ALEX 学python day4集合 装饰器 生成器 迭代器 json序列化
文档内容学习于 http://www.cnblogs.com/xiaozhiqi/ 装饰器 : 定义: 装饰器 本质是函数,功能是装饰其他函数,就是为其他函数添加附加功能. 原则: 1.不能修改被装 ...
- python基础--迭代器、生成器、内置函数、面向对象编程
迭代器:迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问完结束.迭代器只能往前不会后退 迭代:更新换代(重复)的过程,每次的迭代都必须基于上一次的结果 迭代器:迭代取值的工具 使用迭代器的 ...
随机推荐
- 三星固态sm863,pm863,sm865,sm865a颗粒
目录 左pm863,右sm863: sm865: sm865a: 主控,缓存: 颗粒: 左pm863,右sm863: sm865: sm865a: 主控,缓存: 颗粒:
- 取球游戏|2012年蓝桥杯B组题解析第十题-fishers
(25')取球游戏 今盒子里有n个小球,A.B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断. 我们约定: 每个人从盒子中取出 ...
- Difference between ID and control.ClientID OR why use control.ClientID if I can access control through ID
https://stackoverflow.com/questions/3743582/difference-between-id-and-control-clientid-or-why-use-c ...
- AGC006D Median Pyramid Hard
闲扯 今天模拟的题,应该是挺简单的二分和贪心,就是没想出来,我好弱啊 顺便ORZ聚聚BLUESKY007,踩爆我了 思路 今天发现中位数性质如此优秀 二分最后塔顶的数,大于等于它的数变为1,小于它的数 ...
- Unity3D学习笔记(三十四):Shader着色器(1)
一.GPU:图形处理器,Graphics Processing Unit 显卡的处理器就是图形处理器.与CPU类似. GPU和CPU的区别? 1.CPU主要是为了串行指令设计,GPU则是为了大规模 ...
- UVA 10870 Recurrences(矩阵乘法)
题意 求解递推式 \(f(n)=a_1*f(n-1)+a_2*f(n-2)+....+a_d*f(n-d)\) 的第 \(n\) 项模以 \(m\). \(1 \leq n \leq 2^{31}-1 ...
- ZOJ 2112 Dynamic Rankings(树状数组+主席树)
题意 \(n\) 个数,\(m\) 个操作,每次操作修改某个数,或者询问某个区间的第 \(K\) 小值. \(1 \leq n \leq 50000\) \(1 \leq m \leq 10000\) ...
- c# 后台post,包含file文件
http request 相关 private bool Upload(KeyValuePair<string, string>[] paramString,Stream paramFil ...
- PHPsession工作机制以及销毁session
- WinForm 中 comboBox控件数据绑定
一.IList 现在我们直接创建一个List集合,然后绑定 IList<string> list = new List<string>(); list.Add("11 ...