装饰器


1.速查笔记

#-- 函数装饰器:是它后边的函数的运行时的声明 由@符号以及后边紧跟的"元函数"(metafunction)组成
@staticmethod
def smeth(x): print(x)
# 等同于:
def smeth(x): print(x)
smeth = staticmethod(smeth)

定义:在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)

经典示例:

# -*-  coding:utf-8 -*-
import time
def timer(func): #把被装饰的函数ceshi的内存地址传给了func
def deco(*args,**kwargs):
start_time = time.time()
func(*args,**kwargs)
stop_time = time.time()
print('测试函数运行时间',(stop_time-start_time))
return deco #返回deco的内存地址 @timer
def ceshi(a):
time.sleep(3)
print('测试%s'%a)
ceshi('装饰器')

2. 原则:①不能修改被装饰函数的源代码;②不能修改被装饰函数的调用方式

3.实现装饰器的技能储备

① 函数本身即是变量

② 高阶函数,把一个函数名当做实参穿给另一个函数

③ 嵌套函数

参考:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318435599930270c0381a3b44db991cd6d858064ac0000

生成器


1.速查笔记

#-- 生成器函数:yield VS return
def gensquare(N):
for i in range(N):
yield i** 2 # 状态挂起 可以恢复到此时的状态
for i in gensquare(5): # 使用方法
print(i, end = ' ') # [0, 1, 4, 9, 16]
x = gensquare(2) # x是一个生成对象
next(x) # 等同于x.__next__() 返回0
next(x) # 等同于x.__next__() 返回1
next(x) # 等同于x.__next__() 抛出异常StopIteration #-- 生成器表达式:小括号进行列表解析
G = (x ** 2 for x in range(3)) # 使用小括号可以创建所需结果的生成器generator object
next(G), next(G), next(G) # 和上述中的生成器函数的返回值一致
#(1)生成器(生成器函数/生成器表达式)是单个迭代对象
G = (x ** 2 for x in range(4))
I1 = iter(G) # 这里实际上iter(G) = G
next(I1) # 输出0
next(G) # 输出1
next(I1) # 输出4
#(2)生成器不保留迭代后的结果
gen = (i for i in range(4))
in gen # 返回True
in gen # 返回True
in gen # 返回False,其实检测2的时候,1已经就不在生成器中了,即1已经被迭代过了,同理2、3也不在了

2. 生成器表达式

局限性:只能适合简单的算法

示例:

test = (x**2 for x in range(1,10))
print(next(test))
print(test.__next__())

3. 生成器函数 yield

斐波那契函数的打印示例:

def fib(max):
a,b,n = 1,1,0
while n<max:
yield b
a,b = b,a+b
n+=1
return b
test = fib(10)
print(test.__next__())
print(next(test))
for i in test:
print(i)

最新文章

  1. iOS编程中遇到的问题
  2. PHP用mb_string函数库处理与windows相关中文字符
  3. 一次简单的绕过apk签名校验
  4. 【风马一族_Java】在某个范围内,找出具有水仙花特征的数字
  5. 域名服务器--DNS
  6. [Openstack]使用devstack自己主动化安装
  7. Longest Substring Without Repeating Characters - 哈希与双指针
  8. openstack私有云布署实践【13.1 网络Neutron-compute节点配置(科兴环境)】
  9. pat L1-006. 连续因子
  10. Angular i18n的技术分享、踩过的坑
  11. canvas用数组方式做出下雨效果
  12. NuGet 构建服务器与常用命令
  13. vue 动态组件、父子组件传参
  14. 广州移动宽带DNS
  15. 学习ASP.NET之旅
  16. java.net.ConnectException: Connection refused: no further information
  17. 使用openssl模拟CA和CA证书的签发
  18. SimpleDraweeView 设置圆角不生效问题
  19. Masonry 适配label多行
  20. 08: python基础练习题

热门文章

  1. linux批量添加用户和批量修改密码
  2. oracle split函数
  3. 之前写的关于chromedp的文章被别人转到CSDN,很受鼓励,再来一篇golang爬虫实例
  4. learning armbian steps(8) ----- armbian 源码分析(三)
  5. CentOS重新安装yum
  6. locate/find
  7. 人脸检测之Haar-like,Adaboost,级联(cascade)
  8. 两个字说清楚编程语言实质-Python基础前传(3)
  9. C++ 仿函数和适配器
  10. Linux网络编程五、套接字超时