python函数之各种器
一: 装饰器
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函数之各种器的更多相关文章
- Python函数06/装饰器
Python函数06/装饰器 目录 Python函数06/装饰器 内容大纲 1.装饰器 1.1 开放封闭原则 1.2 装饰器 2.今日练习 内容大纲 1.装饰器 1.装饰器 1.1 开放封闭原则 扩展 ...
- python——函数之装饰器
1 问题 实际生活中,我们很难一次性就把一个函数代码写得完美无缺.当我们需要对以前的函数添加新功能时,我们应该怎么做? 2 问题解决思路 (1)可以直接修改原来的函数,在函数内直接修改.当我们对多个函 ...
- python函数、装饰器、迭代器、生成器
目录: 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象: 函数是第一类对象,即函数可以当作数据传递 ...
- Python 函数之装饰器
1.函数 #### 第一波 #### def foo(): print 'foo' foo #表示是函数 foo() #表示执行foo函数 #### 第二波 #### def foo(): print ...
- python函数闭包-装饰器-03
可调用对象 callable() # 可调用的(这个东西加括号可以执行特定的功能,类和函数) 可调用对象即 callable(对象) 返回为 True 的对象 x = 1 print(cal ...
- Python函数的装饰器修复技术(@wraps)
@wraps 函数的装饰器修复技术,可使被装饰的函数在增加了新功能的前提下,不改变原函数名称,还继续使用原函数的注释内容: 方便了上下文环境中不去更改原来使用的函数地方的函数名: 使用方法: from ...
- Python函数的装饰器修复技术(@wraps)
@wraps 函数的装饰器修复技术,可使被装饰的函数在增加了新功能的前提下,不改变原函数名称,还继续使用原函数的注释内容: 方便了上下文环境中不去更改原来使用的函数地方的函数名: 使用方法 from ...
- Python函数加工厂-装饰器
引言: 函数和装饰器好比程序界的加工厂: 1.函数一般可用来加工一种或者多种数据类型的数据:字符串.数字.列表.字典等 举一个简单例子:已知半径求面积 def s(r): s = 3.14 * r * ...
- Python函数的装饰器
函数的装饰器. 1. 装饰器 开闭原则: 对功能的扩展开放 对代码的修改是封闭 通用装饰器语法: def wrapper(fn): def inner(*args, **kwargs): # 聚合 & ...
- python 函数之装饰器,迭代器,生成器
装饰器 了解一点:写代码要遵循开发封闭原则,虽然这个原则是面向对象开发,但也适用于函数式编程,简单的来说,就是已经实现的功能代码不允许被修改但 可以被扩展即: 封闭:已实现功能的代码块 开发:对扩张开 ...
随机推荐
- yum upgrade和yum update的区别
Linux升级命令有两个分别是yum upgrade和yum update, 这个两个命令是有区别的: yum -y update 升级所有包同时也升级软件.系统版本和系统内核 yum -y upgr ...
- RabbitMQ简单应用の简单队列
(1)首先创建一个maven项目: pom.xml,重点是配置RabbitMQ <dependencies> <dependency> <groupId>junit ...
- DataGrid 查不出数据 注意事项
总结以下几条:1.SQL文在数据控中查询成功在写入,表内字段名尽量复制,手打太容易错了.写SQL写错了,没有智能提示.2.DataGrid数据源先绑定.3.检查parameter顺序,条件的顺序也要考 ...
- Maya API Test
import maya.OpenMaya as OpenMaya import maya.OpenMayaMPx as OpenMayaMPx sl = OpenMaya.MSelectionList ...
- Linux内存管理 (10)缺页中断处理【转】
转自:https://www.cnblogs.com/arnoldlu/p/8335475.html 专题:Linux内存管理专题 关键词:数据异常.缺页中断.匿名页面.文件映射页面.写时复制页面.s ...
- JSLint报错翻译
“Missing semicolon.” : “缺少分号.”,“Use the function form of \”use strict\”.” : “使用标准化定义function.”,“Unex ...
- 《Windows核心编程》读书笔记 上
[C++]<Windows核心编程>读书笔记 这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对 ...
- 【转】辽宁北斗TV直播源
原帖地址:http://bbs.asiatvro.com/thread-1156600-1-1.html 感谢 Qarclub 辽宁卫视,http://lnhlslive.hongshiyun.com ...
- cocos2dx 3.x 修改NDK_ROOT、ANDROID_SDK_ROOT、ANT_ROOT路径
CMD到setup.py目录 Python setup.py -h 查看帮助: Options: -h,--help showthis help message and exi ...
- Unity3D RTS游戏中帧同步实现
帧同步技术是早期RTS游戏常用的一种同步技术,本篇文章要给大家介绍的是RTX游戏中帧同步实现,帧同步是一种前后端数据同步的方式,一般应用于对实时性要求很高的网络游戏,想要了解更多帧同步的知识,继续往下 ...