一: 装饰器

1:装饰器模板

def wrapper(func):def inner(*args,**kwargs):ret =func(*args,**kwargs)return retreturn inner

开放封闭原则

对扩展是开放的

对修改时封闭的

import  time

def wrapper(func):    def innner(*args,**kwargs):        start = time.time()        time.sleep(1)        func(*args,**kwargs)        end = time.time()        print(end-start)    return innner

@wrapper # func = wrapper(func)def func():    print('hello world')func()

# 给函数加上认证功能,登录一次就可以多次调用函数FLAG = False
def login(func):def innner(*args,**kwargs):global FLAGif FLAG: ret =func(*args,**kwargs) return func else: username = input('username: ') password = input('password: ') if username == 'wangys' and password == 'wangys': FLAG = True ret =func(*args,**kwargs) return func else:print("用户名密码错误") return innner @login def shoplist_add(): print('增加一个商品') @login def shoplist_delete(): print('删除一个商品') shoplist_add() shoplist_delete()

带参数的装饰器

多个装饰器装饰一个函数

二:迭代器

所谓迭代就是可以将数据集种的数据一个一个的取出来

比如说for循环,可以将list tuple dic str set range f enumerate 种的数据集一个一个的取出来

列表
l = [1,2,3,4]
for i in l:   print(i)  元祖
t = (1,2,3,4
for i  in t:print(i)字典
dic = {'name':'wangys','age':18}
for i in dic:                        print(i)                         字符串
name = 'wangys'
for i in name:     print(i)       

可迭代协议:只要含有__iter__方法的都是可迭代的,也就是可以被for循环

# dir方法可以将所有方法取到,我们可以通过下面的手段来查看是否有__iter__方法,也就是是否可以被for循环print('__iter__' in dir([]))
print('__iter__' in dir(''))
print('__iter__' in dir(()))
print('__iter__' in dir({})) 

迭代器

有__iter__和__next__方法

# 列表通过__iter__方法,得到了一个迭代器对象print([].__iter__())
<list_iterator object at 0x000001CF7C9AD0B8>

# 查看迭代器相对于可迭代对象增加了哪些方法
print(dir([]))
print(dir([].__iter__()))
print(set(dir([].__iter__()))-set(dir([]))) {'__length_hint__', '__setstate__', '__next__'}__next__方法就可以将一个一个元素取出

# list是可迭代对象
# list_iterator,是通过list的__iter__方法获得的迭代器
# 通过迭代器的__next__方法,一个一个取出值
list = [1,2,3]
list_iterator = list.__iter__() print(list_iterator.__next__())
print(list_iterator.__next__())
print(list_iterator.__next__())
print(list_iterator.__next__())   # 因为有三个元素,所以这里会报错StopIteration

# 我们可以通过while循环取出数据

# 会报错
list = [1,2,3,4]
list_iterator=list.__iter__()
while True:                        item = list_iterator.__next__()print(item)                    StopIteration# 通过异常处理机制

list = [1,2,3,4]
list_iterator=list.__iter__()
while True:                            try:                               item = list_iterator.__next__()print(item)                    except   StopIteration:            break                          

for循环就是基于迭代器协议提供了一个统一的可以遍历所有对象的方法,即在遍历之前,先调用对象的__iter__方法将其转换成一个迭代器,然后使用迭代器协议去实现循环访问

迭代器的好处:

节省内存空间 range f

三:生成器

生成器本身是一种迭代器

方法:

  1: 通过生成器函数

  2: 生成器表达式

3.1 生成器函数:函数内部含有yield的函数就是生成器函数

yield和return的区别

yield不会终止函数,return会

yield不能与return共用,yield只能在函数内部,

def generator(): # 生成器函数print(1)yield 'a'ret = generator() # ret是一个生成器
print(ret)<generator object generator at 0x0000018492149830>

# 函数执行后,会得到一个生成器函数,该生成器既有__iter__和__next__方法

def generator(): # 定义一个生成器函数print(1)yield 'a'print(2)yield 'a'g = generator() # 得到一个生成器g
ret = g.__next__()
print(ret)
ret = g.__next__()
print(ret)
ret = g.__next__()
print(ret)

def generator():print(1)yield 'a'print(2)yield 'a'g = generator()
for i in g:print(i)

从生成器取数据,__next__ ,for

# 使用send获取生成器数据

def generator(): # 定义一个生成器函数print('123')content = yield '**a'print('456')print(content)yield  '**b'g = generator() # 得到一个生成器
ret =g.__next__()  # 执行generator,到yield,并把返回值给ret
print(ret)  # 打印返回值
ret =g.send('haha') # 执行generator,并把'haha'赋值给content,并且执行到yield,返回值给ret
print(ret) # 打印ret

3.2 生成器表达式

  • 跟列表推导式相比,它很省内存,得到的是一个生成器

# 100内被3整除得数

g1 = (i for i in range(100) if i%3 ==0)
print(g1)
print(list(g1))

# 100内能被3整除得数得平方

g1 = (i**2 for i in range(100) if i%3==0)
print(list(g1))

# 名字带两个e

names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
# 常规做法
l1=[]
for line in names:for name in line:if name.count('e') ==2:l1.append(name)
print(l1)
# 列表推导式
l1=[name for line in names for name in line if name.count('e') ==2]
print(l1)
# 生成器表达式
g1 = (name for line in names for name in line if name.count('e')==2)
print(list(g1)

四: 各种推导式

  • 没有元祖推导式

4.1 列表推导式

语法: [结果 for循环 条件判断]

# 取1-100内的偶数

# 常规做法
l1=[]
for num in range(100):if num%2 ==0:l1.append(num)
print(l1)# 列表推导式
li = [num for num in range(100) if num%2 ==0]
print(li)

# 将列表中元素长度大于3的元素大写

name = ['wangys','wc','huisz','cyf']
l1=[ i.upper() for i in name if len(i) >3]
print(l1)

# [(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]

l1 = [(i,j) for i in range(5) for j in range(5) if i%2==0 and j%2==1]
print(l1)

# M = [[1,2,3],[4,5,6],[7,8,9]] 取出[3,6,9]

M = [[1,2,3],[4,5,6],[7,8,9]]
l1 = [ i[2] for i in M]
print(l1)

# [3,6,9]  ----> [[1,2,3],[4,5,6],[7,8,9]]

m = [3, 6, 9]
l1 = [[i-2,i-1,i] for i in  m]
print(l1)

# 求出50以内能被3整除的数的平方,并放入到一个列表中

l1 = [i**2 for i in range(50) if i%3 ==0]
print(l1)

#

x = {'name':'wangys','Values':[{'timestamp':1517991992.94,'values':100,},{'timestamp': 1517992000.94,'values': 200,},{'timestamp': 1517992014.94,'values': 300,},{'timestamp': 1517992744.94,'values': 350},{'timestamp': 1517992800.94,'values': 280}],}
l1 = [ (el['timestamp'],el['values']) for el in x['Values']]
print(l1)# [(1517991992.94, 100), (1517992000.94, 200), (1517992014.94, 300), (1517992744.94, 350), (1517992800.94, 280)]

4.2 字典推导式

一句话生成字典

# 根据两个列表生成一个字典

lst1 = ['jay', 'jj', 'sylar']
lst2 = ['周杰伦', '林林俊杰', '邱彦涛']
dic = {lst1[k]:lst2[v] for k in range(len(lst1)) for v in range(len(lst2))}
print(dic)

转载于:https://www.cnblogs.com/wc89/p/10285809.html

python函数之各种器相关推荐

  1. Python函数和装饰器

    Python函数和装饰器 1. 函数 1.1 函数的介绍 定义:能够实现具体的某个功能""" 定义:能够实现指定功能的代码块例如:print('天王盖地虎')print( ...

  2. 五、python函数、装饰器、内置函数、json及模块

    一.递归调用 1.一个函数自己调用自己就是递归调用,最多一个函数递归调用自己999次,超过就会出错 2.递归必须有一个明确的结束条件 3.每次进入更深一层递归时,问题规模相比上次递归都应有所减少 4. ...

  3. python函数——Keras分词器Tokenizer

    文章目录 0. 前言 1. 语法 1.1 构造参数 1.2 返回值 1.3 类方法 1.4 属性 2. 简单示例 3. 常用示例 python函数 系列目录:python函数--目录 0. 前言 To ...

  4. python函数的装饰器

    python 函数装饰器 更新2020-7 加个更舒服的教程链接 python 函数装饰器简介 一切皆对象 在函数中定义函数 从函数中返回函数 将函数作为参数传给另一个函数 你的第一个装饰器 装饰器的 ...

  5. Python函数之装饰器

    装饰器 一.装饰器的意义 比如:以下函数是供我们调用的,但是我们需要在每个函数中都添加同一个功能,该如何做到呢? 对于函数开放封闭原则,我们一般不允许修改.所以我们引入了装饰器: def outer( ...

  6. Python函数的装饰器,两层装饰器和三层装饰器

    一.装饰器 1.函数装饰圈的定义 函数装饰器:一种装饰函数的函数 2.个人理解两层函数装饰器 两层函数装饰器个人觉得他其实就是把需要装饰的函数名丢入形参,然后用一个嵌套的函数对其头尾进行添加程序,但是 ...

  7. 2.3.12 Python 函数进阶-装饰器

    代码运行期间动态增加功能的方式,称之为"装饰器"(Decorator) 本质上,decorator就是一个返回函数的高阶函数 所以,我们要定义一个能打印日志的decorator,可 ...

  8. doraemon的python 函数与装饰器(哎呀,忘记传了)

    5.10 函数中高级 5.10.1 函数可以当做返回值 def func(): print(123) def bar(): return func​v = bar()​v() 5.10.2 闭包 de ...

  9. python函数装饰函数_Python精进-装饰器与函数对象

    本文为<爬着学Python>系列第四篇文章. 从本篇开始,本专栏在顺序更新的基础上,会有不规则的更新. 在Python的学习与运用中,我们迟早会遇到装饰器,这个概念对于初识装饰器的新手来说 ...

最新文章

  1. python写程序求1-3+5-7+...-99+101的值-16-Python3-高价函数-提升效率必备
  2. 2017-2018-2 20155327 《信息安全系统设计基础》第2周学习总结
  3. @即将开学的你,请收好这份必读论文清单
  4. eclipse开发jsp默认编码设置
  5. gridview标题居中显示_Pr:制作片尾滚动字幕(旧版标题法)
  6. [转]UINavigationController的用法详解
  7. mysql去重操作哪个最快_如何将 MySQL 去重操作优化到极致?| CSDN 博文精选
  8. FastDFS——Bug篇——上传txt文档乱码
  9. 二叉平衡树AVL简介
  10. Towards Real-Time Multi-Object Tracking(JDE)
  11. jenkins使用python plugin编写代码构建时报错:Caused: java.io.IOException: Cannot run program “python“
  12. 创业工场如何为创业推波助澜?
  13. redis expire key 过期不删除
  14. 15.大数据---Mapreduce案例之---统计手机号耗费的总上行流量、下行流量、总流量
  15. OPENGL-学习计算机图形学
  16. 【实用】找实习找工作的看过来!法国大大小小招聘网站都在这儿
  17. win7纯净系统安装
  18. 福建计算机会考几分过,福建会考合格的标准是什么?
  19. aspose-words,pdf
  20. python 头条新闻机器人_新闻写作机器人的应用及前景展望——以今日头条新闻机器人张小明(xiaomingbot)为例...

热门文章

  1. 搜狗拼音输入法5.0_如何用搜狗拼音输入法输入生僻字?
  2. 计算机的应用范围归纳起来主要有,计算机应用基础知识概述.doc
  3. 未定义与 double 类型的输入参数相对应的函数 eval_点评一下鸿蒙os的时钟计算函数...
  4. 安装虚拟机Ubuntu,搭建lnmp环境碰到的坑(二)
  5. 【机器学习】通俗的k-近邻算法算法解析和应用
  6. Unet实现图像分割(二)
  7. Python Numpy介绍
  8. linux多路由表,linux 多网卡多路由表实现策略路由
  9. 修改服务器文件系统为xfs,CentOS Linux如何无损调整分区大小(XFS文件系统)
  10. r - 求平均成绩_学霸秘籍:小学数学知识点例题讲解 — 平均数问题