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 函数之装饰器,迭代器,生成器
装饰器 了解一点:写代码要遵循开发封闭原则,虽然这个原则是面向对象开发,但也适用于函数式编程,简单的来说,就是已经实现的功能代码不允许被修改但 可以被扩展即: 封闭:已实现功能的代码块 开发:对扩张开 ...
随机推荐
- nginx 模块配置
第一个 当前活跃的连接数 nginx握手的数 连接数 总的请求数
- 钉钉消息通知机器人python版
参考官方文档https://open-doc.dingtalk.com/microapp/serverapi2/qf2nxq #coding=utf8 import requests import j ...
- with语法
上下文管理协议 要使用 with 语句,首先要明白上下文管理器这一概念.有了上下文管理器,with 语句才能工作. 下面是一组与上下文管理器和with 语句有关的概念. 上下文管理协议(Context ...
- 游记-NOIP2018
Day -3 受蛊惑跑到理工大去试机,意外发现home里的noilinux账户下有个压缩包,而且还试对了密码,怀着 激动 紧张的心情,打开来看,里面写着 (写出来我就会被禁赛了): asdfasdra ...
- 链接器link.exe 编译器cl.exe 资源编译器rc.exe
原文地址:https://blog.csdn.net/biggbang/article/details/24433065 1.cl.exe文件是Visual C\C++的编译器,它将程序源代码文件编译 ...
- git与eclipse集成之代码提交
1.1. 代码提交 编码完成后,需要提交代码,例如新增文件git.txt 1.1.1. 提交代码到个人本地特性分支(commit) 选择工程,右键Team,Synchronize Wor ...
- Android App增量升级
移动互联网主打的就是用户体验和产品的快速迭代,通过用户反馈和用户行为跟踪及时调整产品方向,这样才能持续保持生命力和创造力.说的接地气点就是,你频繁的升级更新,有时只是修复了几个bug或者微调了下界面, ...
- Light OJ 1058
题意: 简单的就组合数 C(m,n): 数据多,大, 要预处理: #include<bits/stdc++.h> using namespace std; typedef long lon ...
- Uva 11178 Morley定理
题意: 给你三角形三个点, 定理是 三个内角的三等分线相交得出 DEF三点, 三角新 DFE是等边三角形 然后要你输出 D E F 的坐标 思路 : 求出三个内角,对于D 相当于 BC向量逆时针旋转, ...
- python学习第42、43天 HTML\CSS
前端是什么? 帮助不了解后端程序的客户轻松使用程序的工具,可以提升工作效率,提供各种各样的体验. 通用的前端大致会使用三种语言,用在三个不同的方面对前端进行架构和优化,这里也只介绍这三种 web前端常 ...