day5--装饰器函数的信息打印,迭代器,生成器,列表推导式,内置函数
本文档主要内容:
一 装饰器函数的信息打印
一个函数一旦被装饰器给装饰后,这个函数的信息使用原来的命令打印的就是装饰器函数的信息了,如何改为被装饰函数的信息呢?
from functools import wraps def logger(f):
@wraps(f)
def inner(*args, **kwargs):
"""
:param args: 函数名,密码
:param kwargs: 备用
:return: True
"""
ret = f(*args, **kwargs)
return ret
return inner @logger
def login(username,password):
"""
此函数是完成登录功能的函数,需要用户名,和密码两个参数,返回True 登陆成功
:return: True
"""
print(666)
return True
# login(1,2) #inner()
# # login('alex', 123)
print(login.__doc__)
print(login.__name__) 打印结果为:
此函数是完成登录功能的函数,需要用户名,和密码两个参数,返回True 登陆成功
:return: True login
二 迭代器
2.1 可迭代对象
定义:在对象中,含有__iter__方法的就是可迭代对象,遵循迭代协议,可迭代对象有:str,list,tuple,dict,set ,range,文件句柄
判断一个对象是否可迭代:int对象不是可迭代对象
1 ‘__iter__' in dir(对象) 例如:print('__iter__' in dir(str))
2 isinstance('abc',Iterable)
例如:
from collections import Iterable
print(isinstance('abc',Iterable))
2.2 迭代器
定义:内部含有__iter_并且含有__next__方法的对象就是迭代器,遵循迭代器协议
转化:可迭代对象转化成迭代器
例如:s='abc'
obj_s=s1.__iter__() 或者 obj_s=iter(s)
判断一个对象是不是迭代器
1 __iter__ 和 __next__
例如:
s='abc' print('__iter__' in dir(s)) print('__next__' in dir(s)) 2 isinstance('对象',Iterator)
例如:
from collections import Iterator l1=[1,2,3] l1_obj=l1.__iter__() print(isinstance(l1_obj,Iterator))
迭代器的取值:
print(obj_s.__next__())
print(obj_s.__next__())
print(obj_s.__next__())
print(obj_s.__next__()) #取完值后这里会报错
迭代器的好处:
1,节省内存 2,惰性机制(next一次读一次) 3,单向不可逆
三 生成器
生成器是自定义的迭代器(自己用python代码写的迭代器),函数中见到yield的就是生成器
例如:
def func1(): print(111) yield 666 g_obj=func1() #生成器对象 print(g_obj) # <generator object func1 at 0x0000000001E21E60> print(g_obj.__next__()) #取值
生成器两种方法的区别 send和next
1 send和next都是对生成器取值 2 send会给上一个yield发送一个值 3 send不能用在第一次取值 4 最后一个yield不能得到值
四 生成器表达式和列表推导式
一般就几种列表推导式:
1 [变量(加工后的变量) for 变量 in iterable] ---》 遍历模式
2 [变量(加工后的变量) for 变量 in iterable if 条件] --》筛选模式
列表推导式和生成器表达式区别
1.把列表解析的[]换成()得到的就是生成器表达式 2.列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存
下面是几个例子:
l = ['您好', '3.64',
'请问您是xxx同学的家长吗', '6.25',
'是的有什么事情吗', '6.15',
'您好我是学大教育的x老师', '5.06',
'这次给给您打电话主要是想了解一下孩子上学期的协议情况', '5.86',
'针对于上学期的学习状况', '5.37',
'我们学校邀请您和孩子周末过来听一下针对性的辅导课好吧好吧', '5.36',
'可以我想问一下都有什么课程呢', '5.65',
'呃主要是有英语和语文', '4.35',
'你看', '3.77',
'到时候咱们再联系好吧', '6.10',
'好的', '6.45',
'恩再见', '4.84']
# 上面这个列表帮我转成下面这种格式
# [{"onebest":"您好", "speed":"6.060606"},
# {"onebest":"我这是中国电信的客户代表请问您是幺五幺幺零幺五六六六幺号码的长期使用者吗", "speed":"5.479452"},
# {"onebest":"是的", "speed":"5.405406"},
# {"onebest":"为啥谢谢您长期以来的支持", "speed":"5.529954"},
# {"onebest":"交银退掉", "speed":"4.938272"},
# {"onebest":"考虑了解生活小贴士服务美元四月","speed":"4.672897"},
# {"onebest":"你们可以收到天气情况活动", "speed":"5.529954"},
# {"onebest":"我建议", "speed":"4.347826"},
# {"onebest":"生活中了就是周转现在开通后","speed":"4.024768"},
# {"onebest":"发到您的", "speed":"8.510638"},
# {"onebest":"都会","speed":"4.255319"},
# {"onebest":"现在","speed":"6.451613"},
# {"onebest":"可以享有就是看吗", "speed":"5.161290"},
# {"onebest":"可以","speed":"6.451613"},
# {"onebest":"改天先生那是的", "speed":"4.046243"},
# {"onebest":"另外再见", "speed":"5.479452"}
# ]
# print([{"onebest":l[i],"speed":l[i+1]} for i in range(len(l)) if i % 2 == 0]) #通过过滤掉奇数位,在剩下的偶数位来创建
另外一个例子:
有下面字典,得到购买每只股票的总价格,并放在一个迭代器中。 结果:list一下[9110.0, 27161.0,......] portfolio=[
{'name':'IBM','shares':100,'price':91.1},
{'name':'AAPL','shares':50,'price':543.22},
{'name':'FB','shares':200,'price':21.09},
{'name':'HPQ','shares':35,'price':31.75},
{'name':'YHOO','shares':45,'price':16.35},
{'name':'ACME','shares':75,'price':115.65}]
list=[]
b=map(lambda x:x['shares']*x['price'],portfolio)
for i in b:
list.append(i)
print(list) 或者: m = map(lambda y:y["shares"]*y["price"],portfolio)
print(list(m)) 还是上面的字典,用filter过滤出单价大于100的股票。 b=filter(lambda x:x['price']>100,portfolio)
print(list(b))
对例子增加一点难度
portfolio=[
{'name':'IBM','shares':100,'price':91.1},
{'name':'AAPL','shares':50,'price':543.22},
{'name':'FB','shares':200,'price':21.09},
{'name':'HPQ','shares':35,'price':31.75},
{'name':'YHOO','shares':45,'price':16.35},
{'name':'ACME','shares':75,'price':115.65}] li=[{portfolio[i]['name']:portfolio[i]['shares']*portfolio[i]['price']} for i in range(len(portfolio))]
print(li) #[{'IBM': 9110.0}, {'AAPL': 27161.0}, {'FB': 4218.0}, {'HPQ': 1111.25}, {'YHOO': 735.7500000000001}, {'ACME': 8673.75}]
res=filter(lambda x:list(x.values())[-1]>2000,li) #过滤出大于2000d的字典
print(list(res)) #[{'IBM': 9110.0}, {'AAPL': 27161.0}, {'FB': 4218.0}, {'ACME': 8673.75}] kk=sorted(li,key=lambda x:list(x.values())[-1],reverse=True) #按照总数从大到小排列
print(kk) #[{'AAPL': 27161.0}, {'IBM': 9110.0}, {'ACME': 8673.75}, {'FB': 4218.0}, {'HPQ': 1111.25}, {'YHOO': 735.7500000000001}] #需用到下面的解析
s={'a':111}
print(list(s.values())[-1]) #
五 内置函数
5.1 eval 执行含有字符串的代码,并返回最终结果
print(eval('2+2')) --.>结果为4
5.2 exec 执行字符串类型的代码
s = '''
for i in [1,2,3]:
print(i)
'''
exec(s)
一般情况eval就是一个表达式,而exec可以执行多条语句
5.3 dir 查看内置属性
5.4 slice用于构造一个切片对象,注意字典和集合不可以使用
li = ['a','b','c','d','e','f','g']
sli_obj = slice(3)
print(li[sli_obj]) #['a','b','c']
5.5 bytearry:返回一个新字节数组。这个数组里的元素是可变的,并且每个元素的值范围: 0 <= x < 256。
ret = bytearray('alex',encoding='utf-8')
print(id(ret))
print(ret)
print(ret[0])
ret[0] = 65 #改变第一个字母的值
print(ret)
print(id(ret))
结果为:
2116889904496
bytearray(b'alex')
97
bytearray(b'Alex')
2116889904496
5.6 all:可迭代对象中,全都是True才是True
any:可迭代对象中,有一个True 就是True
5.7 匿名函数 lambda
函数名 = lambda 参数 :返回值
5.8 函数里面可以有key的函数 min max sorted map filter
day5--装饰器函数的信息打印,迭代器,生成器,列表推导式,内置函数的更多相关文章
- 12.Python略有小成(生成器,推导式,内置函数,闭包)
Python(生成器,推导式,内置函数,闭包) 一.生成器初始 生成器的本质就是迭代器,python社区中认为生成器与迭代器是一种 生成器与迭代器的唯一区别,生成器是我们自己用python代码构建成的 ...
- Python函数04/生成器/推导式/内置函数
Python函数04/生成器/推导式/内置函数 目录 Python函数04/生成器/推导式/内置函数 内容大纲 1.生成器 2.推导式 3.内置函数(一) 4.今日总结 5.今日练习 内容大纲 1.生 ...
- Learn day5 迭代器\生成器\高阶函数\推导式\内置函数\模块(math.time)
1.迭代器 # ### 迭代器 """能被next调用,并不断返回下一个值的对象""" """ 特征:迭代器会 ...
- 记录我的 python 学习历程-Day12 生成器/推导式/内置函数Ⅰ
一.生成器 初识生成器 生成器的本质就是迭代器,在python社区中,大多数时候都把迭代器和生成器是做同一个概念. 唯一的不同就是: 迭代器都是Python给你提供的已经写好的工具或者通过数据转化得来 ...
- Python中生成器,迭代器,以及一些常用的内置函数.
知识点总结 生成器 生成器的本质就是迭代器. 迭代器:Python中提供的已经写好的工具或者通过数据转化得来的. 生成器:需要我们自己用Python代码构建的 创建生成器的三种方法: 通过生成器函数 ...
- map内置函数、lambda表达式、快捷生成想要的列表、filter内置函数
map函数 语法 map(function, iterable, ...) 参数 function -- 函数,有两个参数 iterable ...
- python_way,day3 集合、函数、三元运算、lambda、python的内置函数、字符转换、文件处理
python_way,day3 一.集合 二.函数 三.三元运算 四.lambda 五.python的内置函数 六.字符转换 七.文件处理 一.集合: 1.集合的特性: 特性:无序,不重复的序列 如果 ...
- Python基础-列表推导式、匿名函数、os/sys/time/datetime/pymysql/xlwt/hashlib模块
列表推导式 [表达式 for 变量 in range(n) if 条件] 等效于 for 变量 in in range(n): if 条件: 表达式 优点:书写方便,缺点:不易读 注意:用的是方括号 ...
- python学习笔记(八)函数return多个值,列表推导式和交换两个变量的值
函数return多个值: 补充知识点:写代码得到时候少用全局变量: 1.不安全 2.会一直占着内存不释放 函数多个return值,那么会把这几个return的值都放在一个元组里面,然后返回 def h ...
- Day 22 生成器yield表达式及内置函数(一丢丢)
本日知识点: ################################### #一.上节课复习:在for循环式,调用对象内部的__iter__方法, # 把他们变成了可迭代对象然后for循环调 ...
随机推荐
- golang 自定义json解析
在实际开发中,经常会遇到需要定制json编解码的情况. 比如,按照指定的格式输出json字符串, 又比如,根据条件决定是否在最后的json字符串中显示或者不显示某些字段. 如果希望自己定义对象的编码和 ...
- MySQL程序之mysqldump详解
mysqldump命令详解 mysqldump是mysql用于转存储数据库的实用程序.它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等 用法: ...
- Winfrom DataGridView中使用Tooltip
第一步:添加DataGridView.Tooltip控件,略 第二步:设置ToolTip 相关属性,略,参考下图 第三步:DataGridView 添加 CellMouseEnter.CellMous ...
- Feb 5 13:07:52 plugh rsyslogd-2177: imuxsock begins to drop messages from pid 12105 due to rate-limiting
FROM:https://www.nri-secure.co.jp/ncsirt/2013/0218.html SANSインターネットストームセンターのハンドラであるJohannes Ullrichが ...
- 数据仓库专题18-数据建模语言IDEF(转载)
1引言 IDEF的含义是集成计算机辅助制造(Integrated Computer-AidedManufacturing,ICAM)DEFinition.最初的IDEF方法是在美国空军ICAM项目建立 ...
- 【jdk】使用wget下载jdk8
因为在oracle官网下载jdk需要 如果直接在linux中使用 wget命令下载,实际下载是一个html文件,所以需要通过一下命令 wget --no-check-certificate --no- ...
- 【Guava 】Collections – Join and Split
Convert Collections to String Using Joiner Convert List into String Using Joiner @Test public void w ...
- P2064进制转换
题目:https://www.luogu.org/problemnew/show/P2084 既然这道题放在字符串类型里,那么这里的N肯定得用字符数组来储存(这样也方便输出). 那么我们不妨定义一个字 ...
- 峰Redis学习(5)Redis 数据结构(Set的操作)
第五节:Redis 数据结构之Set 类型 存储Set,这里的Set是无序的: 和List类型不同的是,Set集合中不允许出现重复的元素 Set可包含的最大元素数量是4294967295 存储 ...
- PAT 乙级 1012 数字分类 (20) C++版
1012. 数字分类 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定一系列正整数,请按要求对数字进 ...