一: 装饰器

1:装饰器模板

def wrapper(func):
def inner(*args,**kwargs):
ret =func(*args,**kwargs)
return ret
return 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 FLAG
if 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('')
content = yield '**a'
print('')
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)

python函数之各种器的更多相关文章

  1. Python函数06/装饰器

    Python函数06/装饰器 目录 Python函数06/装饰器 内容大纲 1.装饰器 1.1 开放封闭原则 1.2 装饰器 2.今日练习 内容大纲 1.装饰器 1.装饰器 1.1 开放封闭原则 扩展 ...

  2. python——函数之装饰器

    1 问题 实际生活中,我们很难一次性就把一个函数代码写得完美无缺.当我们需要对以前的函数添加新功能时,我们应该怎么做? 2 问题解决思路 (1)可以直接修改原来的函数,在函数内直接修改.当我们对多个函 ...

  3. python函数、装饰器、迭代器、生成器

    目录: 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象:  函数是第一类对象,即函数可以当作数据传递 ...

  4. Python 函数之装饰器

    1.函数 #### 第一波 #### def foo(): print 'foo' foo #表示是函数 foo() #表示执行foo函数 #### 第二波 #### def foo(): print ...

  5. python函数闭包-装饰器-03

    可调用对象 callable()  # 可调用的(这个东西加括号可以执行特定的功能,类和函数) 可调用对象即  callable(对象)  返回为  True  的对象 x = 1 print(cal ...

  6. Python函数的装饰器修复技术(@wraps)

    @wraps 函数的装饰器修复技术,可使被装饰的函数在增加了新功能的前提下,不改变原函数名称,还继续使用原函数的注释内容: 方便了上下文环境中不去更改原来使用的函数地方的函数名: 使用方法: from ...

  7. Python函数的装饰器修复技术(@wraps)

    @wraps 函数的装饰器修复技术,可使被装饰的函数在增加了新功能的前提下,不改变原函数名称,还继续使用原函数的注释内容: 方便了上下文环境中不去更改原来使用的函数地方的函数名: 使用方法 from ...

  8. Python函数加工厂-装饰器

    引言: 函数和装饰器好比程序界的加工厂: 1.函数一般可用来加工一种或者多种数据类型的数据:字符串.数字.列表.字典等 举一个简单例子:已知半径求面积 def s(r): s = 3.14 * r * ...

  9. Python函数的装饰器

    函数的装饰器. 1. 装饰器 开闭原则: 对功能的扩展开放 对代码的修改是封闭 通用装饰器语法: def wrapper(fn): def inner(*args, **kwargs): # 聚合 & ...

  10. python 函数之装饰器,迭代器,生成器

    装饰器 了解一点:写代码要遵循开发封闭原则,虽然这个原则是面向对象开发,但也适用于函数式编程,简单的来说,就是已经实现的功能代码不允许被修改但 可以被扩展即: 封闭:已实现功能的代码块 开发:对扩张开 ...

随机推荐

  1. shell编程 之 引号、括号的用法总结

    1 单引号 a=1 b='a string' 单引号屏蔽各种特殊字符.echo ‘$a " % \n ' 只能得到 $a " % \n 单引号可以指明界限,防止由分隔符----空格 ...

  2. openstack Q版部署-----网络服务(neutron)安装部署(7)

    一.数据库配置(控制节点) 控制节点创建数据库: CREATE DATABASE neutron; GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'lo ...

  3. Spring Boot:如何配置静态资源的地址与访问路径

    spring.resources.static-locations=classpath:/static,classpath:/public,classpath:/resources,classpath ...

  4. mysql进制之间的转换

    1.十进制转换成二进制 select bin(5); 2.十进制转换成八进制 select oct(5); 3.十进制转换成十六进制 select hex(5); 4.二进制转换成十进制 select ...

  5. VS2008 debug可以编译过,Release No such file or directory

    1>正在生成代码1>e:\Source\VC\Զ\json\jsoncpp-src-0.6.0-rc2\src\lib_json\json_value.cpp : fatal error  ...

  6. CentOS yum 安装 Apache + PHP + MySQL

    # 检查并卸载rpm -qa|grep httpdrpm -e httpdrpm -qa|grep mysqlrpm -e mysqlrpm -qa|grep phprpm -e php # 删除默认 ...

  7. 范围for语句

    C++11 新标准引入了一种更简单的for语句,这种语句可以遍历容器或其他序列的所有元素.范围for语句(range for statement)的语法形式是: for (declaration : ...

  8. 028_nginx_https证书

    一. 事件经过 2017年3月份谷歌和火狐的调查人员发现赛门铁克打破了行业规则误签发127张SSL证书随着调查进一步开展发现误签发的证书数量达到惊人的3万多张. 这个数字震撼了业界专家因为赛门铁克是市 ...

  9. jqueryui组件progressbar进度条和日期组件datepickers的简单使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. php的ts和nts安装包

    2017-12-29 15:17:05 星期五 翻译一下PHP对 ts , nts 的解释 官网说明地址:  http://windows.php.net/download  (windows下载页左 ...