python 3.5 format_python 3.5学习笔记(第四章)
本章内容:
一、、装饰器
二、生成器
三、迭代器
四、python中的内置方法
五、json & pickle 的数据序列化及反序列化
六、程序目录结构规范
七、补充内容
一、装饰器:
1、概念:装饰器的本质是函数,用于装饰其他函数,就是给其他函数添加附加的功能
2、什么情况下要使用装饰器?
(1)不能修改被装饰函数的源代码
(2)不能修改被装饰函数的调用方式
(装饰器对于被装饰函数是完全透明的,不会影响被装饰函数)
示例:
定义一个sayhi()函数,调用函数时,打印“你好,xx”,代码如下:
defsayhi(name):print('Hi,',name)
sayhi("MR")
现在想要给这个函数添加新功能,计算该程序执行的时间,要求不能对原函数进行修改,而且不能修改原函数的调用方式。
import timedeftimer(func):def wrapper(*args, **kwargs):
first_time=time.time()
time.sleep(2)
second_time=time.time()print('the function run %s' % (second_time -first_time))return func(*args, **kwargs)returnwrapper
@timer #相当于执行了 sayhi = timer(sayhi)
defsayhi(name):print('Hi,',name)
sayhi("MR")
调用sayhi函数,不仅会运行sayhi函数本身,还会在sayhi函数前运行timer函数。timer()是一个装饰器,返
回一个函数,所以原来的sayhi函数 任然存在,只是现在同名的sayhi变量指向了新的函数,于是调用sayhi将执行
新的函数,即在timer函数中返回wrapper函数。
wrapper函数的参数定义是(*args, **kwargs),所以wrapper函数可以接受任意参数的调用。在wrapper
函数内部进行sleep操作,并打印休眠时间,再紧接着调用原始sayhi函数。
二、生成器
1、列表生成式:
(1)普通方法生成一个列表
a=[]for i in range(10):
a.append(i* 2)print(a)>>>[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
(2)利用列表生成式生成一个相同的列表
list1= [ i * 2 for i in range(10)]print(list1)
>>>[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
2、字典生成式:把列表生成式中的 [ ] 换成 { } 就是字典生成式
b = {i:i%2==0 for i in range(10)}print(b)
3、通用生成器
生成器是一个包含yield关键字的函数,当它被调用的时候,在函数体中的代码不会被执行,而回返回一个迭代器。每次请求一个值就会执行生成器中的代码,直到遇到一个yield或者return语句。yield语句意味着应该生成一个值,return语句意味着生成器要停止执行(不再生成任何东西,return语句只有在一个生成器中使用的时候才会进行无参数调用)。
换句话说,生成器是由两个部分组成的:生成器的函数和生成器的迭代器。生成器的函数使用def语句定义的,包含yield部分,生成器的迭代器是这个函数的返回部分,这两个实体合在一起叫做生成器。
生成器推导式:把列表生成式中的 [ ] 换成 () 就是生成器推导式
示例:
a = ( i * 2 for i in range(10))
for x in a:
print(x)
注意:
(1)生成器不能直接打印出来,因为只有在循环到某一个数据的时候,这个数据才会在内存中实际出现
(2)生成器不是列表,不能切片,只有在调用的时候才会生成相应的数据
(3)生成器只能记住当前位置的内容,上一个内容在调用之后就被删除了
(4)生成器可以用作 for 循环,还可以被next方法( __next__() )不断调用,并返回下一个值,直到最后抛出StopIteration 错误表示无法继续返回下一个值。(对于异常可以使用 try-except语句来解决)
'''
yield 的作用:保存当前状态并返回,然后再次调用的时候,会回到yield
send 的作用:调用yield ,同时给yield 传值
next 的作用:只会调用yield ,但是不会给yield 传值
'''
函数生成器示例:
defmyGen():print('生成器被执行!')yield 1 # 打印1
yield 2 # 打印2
myG=myGen()print(next(myG))print(next(myG))
# 第一次调用生成器,会打印'生成器被执行!',然后在yield前停下 ,每使用一次next方法都会执行一次yield。
4、斐波那契数列
(1)普通方法
list_fib =[]deffib(max):
a=0
b= 1n=0while n
list_fib.append(b)
a,b= b, a + b #这里是给 a 和 b 同时赋值
n = n+1fib(10)print('list_fib =',list_fib)
(2)用函数生成器实现
deffib(max):
a=0
b= 1n=0while n
a,b= b, a + b #同时赋值
n = n+1f= fib(10)
for i in range(10):print(f.__next__())
# 如果调用next的次数超过范围,则会抛出异常
三、迭代器
1、概念:
迭代的意思是重复做一件事很多次,类似循环。只要某一个对象实现了__iter__() 方法就可以迭代。__iter__() 方法会返回一个迭代器(iterator),所谓的迭代器就是具有next方法的对象。在调用next 的方法的时候,迭代器会返回它的下一个值。如果next方法被调用了,但是并没有值可以返回,就会抛出StopIteration异常。
2、为什么要使用迭代器?
如果有一个函数,可以一个接一个的计算值,那么在使用时可能是计算一个值时获取一个值——而不是通过列表等数据类型一次获取所有值。如果有很多的值,就会占用太多的内存,迭代器可以避免这种情况。
3、为什么列表、字典、字符串不是迭代器?
因为python 的Iterator 对象表示的是一个数据流,Iterator 对象可以被next() 函数调用并不断返回下一个数据,知道没有数据时抛出 StopIteration 错误,可以把这个数据流看作是一个有序序列,但是我们并不能提前知道序列的长度,只有在需要反回下一个数据的时候它才会计算。迭代器甚至可以表示一个无限大的数据流,比如全体自然数,而列表等数据类型是不可能存储全体自然数的。
4、把可迭代对象转化为迭代器的方法:
iter() 或 __iter__()
a = [1,2,3]
c=iter(a)print(isinstance(c,Iterator)) # isinstance()用于判断是否为迭代器或者可迭代对象#.__iter__()
print(isinstance([].__iter__(),Iterator))
5、总结:
(1)可以直接用于for 循环的对象称为可迭代对象(Iterable),可以被next() 方法不断调用并返回下一个值的对象是迭代器(Iterator),迭代器表示一个惰性计算的序列。迭代器一定是可迭代对象,但是可迭代对象不一定是迭代器。
(2)isinstance() 用于判断是否可为迭代对象或者迭代器
print(isinstance([],Iterable))
>>>True
a = [1,2,3]print(isinstance(a,Iterator))
>>>False
(3)生成器一定是迭代器,但是迭代器不一定是生成器。
b = ( x*2 for x in range(5))print(isinstance(b,Iterator))>>>True
(4)list 、 dict 、str 是可迭代对象,但是不是迭代器,但是可以转换成迭代器。
(5)python 的for 循环本质上就是通过不断调用next函数实现的。
四、python中的内置方法
参考:https://docs.python.org/3/library/functions.html?highlight=built#ascii
下面针对一些常用的内置方法进行解释
1、all(iterable) : 如果可迭代对象中的所有元素都为真,则返回True
print(all([-1,2,1,'mr']))
2、any(iterable) :如果可迭代对象中的任意元素为真,则返回True
print(any([0,1,2,3]))
3、ascii(object) :以字符串的形式返回内容的ascii码格式
a = ascii([1,2,3,'MR',"你好"])print(a)print(type(a),[a])
4、bin(x) : 把十进制数字转换为二进制数字
print( bin(4) )
5、bool() :判断bool类型(非零即真)
print(bool(1))print(bool([]))
6、bytearray([source[,encoding[,errors]]]) :返回一个新字节数组。这个数组里的元素是可变的,并且每个元素的值范围: 0 <= x < 256。
#字符串不可以修改,只是生成一个新的字符串;二进制的字符格式也不可以修改
a = bytes('abcde',encoding='utf-8')print(a.capitalize())print(a)
b= bytearray('abcde',encoding='utf-8')print( b[1] )
b[1] = 50 #只能赋值ascii码的类型
print(b)
7、callable() : 是否可调用(可以加括号的就可以调用,比如函数和类)
print(callable([]))deffunc1():pass
print(callable(func1))
8、chr(i) :输入数字,返回ascii码的对应表
print(chr(97))
9、ord() : 输入ascii码字符,返回对应的数字
print(ord('a'))
10、complex([real[,imag]]) : 返回一个复数
print(complex(1,2))
11、dir : 查看对应的方法
a =[]print(dir(a))
12、divmod(a,b) : 地板除(返回整数部分和余数部分)
print(divmod(10,3))
>>>(3,1)
13、eval(source[, globals[, locals]]) : 将字符串str当成有效的表达式来求值并返回计算结果。参数:source:一个Python表达式或函数compile()返回的代码对象;globals:可选。必须是dictionary;locals:可选。任意map对象。
a = "[[1,2],[3,4]]"b=eval(a)print(b)
>>>[[1, 2], [3, 4]]
14、filter(function, iterable) : 过滤出需要的内容
res = filter(lambda n : n>5 ,range(10))for i inres:print(i)
15、map() : 根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
res = map(lambda n: n*n, range(10))for i inres:print(i)print(type(res))
>>>
0
1
4
9
16
25
36
49
64
81
16、reduce() : 函数会对参数序列中元素进行累积。
函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给reduce中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
from functools importreduce
res= reduce(lambda x, y : x+y, range(10))print(res)
>>>45
17、format() : 格式化函数
name = input("name:")
age= input ("age:")
job= input ("job:")
info="""Name :{_name}
Age: {_age}
Job :{_job}""" .format(_name=name,_age = age, _job =job)print (info)
18、frozenset([iterable]) : 冻结集合(使集合无法修改)
a = frozenset([1,2,3,2,1,42,546,6])print(a.add(7))
>>>AttributeError: 'frozenset' object has no attribute 'add'
19、globals() : 函数会以字典类型返回当前位置的全部全局变量。
a = frozenset([1,2,3,4,5,6])print(globals())
20、locals() : 函数会以字典类型返回当前位置的全部局部变量。
deftest():
local_var= 333
print(locals())
test()print(globals())print(globals().get('local_var'))
21、hash() :用于获取取一个对象(字符串或者数值等)的哈希值。
print(hash('a'))
>>>
1164304272
22、hex() : 转换为十六进制
print(hex(15))
23、oct(x) : 转换为八进制
print(oct(9))
24、id(object) : 返回内存地址
print(id('a'))
25、max() / min() : 取最大/最小值
a = [1,2,5,6,3]print(max(a))print(min(a))
26、pow(a,b): 返回 a 的 b次方
print(pow(2,4))
27、round(a,b) : 将 a 保留 b 位小数
print(round(1.3333, 2))
>>>1.33
28、slice() : 切片
myslice = slice(5)
a= [x for x in range(10)]print(a[myslice])
>>>[0, 1, 2, 3, 4]
29、sorted() : 排序
a = [1,4,2,5,23,6,7,4,2]print(a)print(sorted(a))
b= {2:'two', 1:'one', 4:'four', 7:'seven'}print(b)print(sorted(b.items())) #以key为目标排序,结果是一个列表
print(sorted(b.items(), key = lambda x : x[1])) #以value为目标排序
>>>
[1, 4, 2, 5, 23, 6, 7, 4, 2]
[1, 2, 2, 4, 4, 5, 6, 7, 23]
{1: 'one', 2: 'two', 4: 'four', 7: 'seven'}
[(1, 'one'), (2, 'two'), (4, 'four'), (7, 'seven')]
[(4, 'four'), (1, 'one'), (7, 'seven'), (2, 'two')]
30、zip : 按照最少的内容进行组合
a = [1,2,3,4,5]
b= ['a','b','c','d']
c= ['one','two','three','four']for i inzip(a,b,c):print(i)
>>>
(1, 'a', 'one')
(2, 'b', 'two')
(3, 'c', 'three')
(4, 'd', 'four')
五、json & pickle 的数据序列化及反序列化
1、json模块:用于字符串和python数据类型之间的转换
四个功能:dump, dumps, load, loads
示例1:把字典写入文件中
(1)普通方法
info ={'name' : 'MR','age': 18}
f= open("info.txt",'w')
f.write(str(info))
(2)json序列化
importjson
info={'name' : 'MR','age': 18}
f= open('info.txt','w')
f.write( json.dumps( info ))
示例2:把文件中的内容读取出来
(1)普通方法
f = open("info.txt",'r')
data=eval(f.read())print(data['age'])
f.close()
(2)json反序列化
importjson
f= open('info.txt','r')
data=json.loads(f.read())print(data['age'])
2、pickle模块: 用于python特有的类型和python的数据类型之间的转换
四个功能:dump, dumps, load, loads
示例1:把字典写入文件中
pickle序列化:
importpickle
info={'name' : 'MR','age': 18}
f= open('info.txt','wb')
f.write( pickle.dumps( info ))#pickle.dumps 会把原数据类型变为二进制类型。#f.write( pickle.dumps( info )) == pickle.dump(info, f)
示例2:把文件中的内容读取出来
pickle反序列化:
importpickle
f= open('info.txt','rb')
data= pickle.loads(f.read()) #== data = pickle.load(f)
print(data['age'])
六、程序目录结构规范
引用自:https://www.cnblogs.com/alex3714/articles/5765046.html
解释:
1、bin/: 存放项目的一些可执行文件,当然可以起名script/之类的也行。
2、foo/: 存放项目的所有源代码。(1) 源代码中的所有模块、包都应该放在此目录。不要置于顶层目录。(2) 其子目录tests/存放单元测试代码; (3) 程序的入口最好命名为main.py。
3、docs/: 存放一些文档
4、setup.py: 安装、部署、打包的脚本。
5、requirements.txt: 存放软件依赖的外部Python包列表。
6、readme: 项目说明文件。
七、补充内容:
(1)lambda() 函数
lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。
a = lambda x,y: x+yprint(a(2,3))
(2)try-except 语句
基本语法:
try:
检测范围exceptException [as reason]:
出现异常(Exception)后处理的代码
示例:
try:
int ('abc')
sum= 1 + '1'f= open ('我为啥是一个文件.txt')print(f.read())
f.close()exceptOSError as reason:print('文件出错\n 错误的原因是:' +str(reason))exceptTypeError as reason:print('类型出错\n 错误的原因是:' +str(reason))exceptValueError as reason:print('值出错\n 错误的原因是:' + str(reason))
注意:try 语句一旦检测到异常,后面的语句就不会被执行
(3)try-finally
解释:基本用法与try-except 相似,只是finally 之后的代码无论怎么样都会执行,可以try-except-finaaly 连用,这样如果try中没有异常,则会跳过except,直接执行finally 里面的代码
python 3.5 format_python 3.5学习笔记(第四章)相关推荐
- 《Go语言圣经》学习笔记 第四章 复合数据类型
<Go语言圣经>学习笔记 第四章 复合数据类型 目录 数组 Slice Map 结构体 JSON 文本和HTML模板 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. ...
- 计算机网络(第7版)谢希仁著 学习笔记 第四章网络层
计算机网络(第7版)谢希仁著 学习笔记 第四章网络层 第四章 网络层 4.3划分子网和构造超网 p134 4.3.1划分子网 4.3.2使用子网时分组的转发 4.3.3无分类编址CIDR(构建超网) ...
- Effective Java(第三版) 学习笔记 - 第四章 类和接口 Rule20~Rule25
Effective Java(第三版) 学习笔记 - 第四章 类和接口 Rule20~Rule25 目录 Rule20 接口优于抽象类 Rule21 为后代设计接口 Rule22 接口只用于定义类型 ...
- 机器人导论(第四版)学习笔记——第四章
机器人导论(第四版)学习笔记--第四章 4.1 引言 4.2 解的存在性 4.3 当n<6时操作臂子空间的描述 4.4 代数解法和几何解法 4.5 简化成多项式的代数解法 4.6 三轴相交的Pi ...
- 线性代数学习笔记——第四章学习指南——n维向量空间
一.学习内容及要求 1. 内容: §4.1. n维向量空间的概念 线性代数学习笔记--第四十讲--n维向量空间的概念 线性代数学习笔记--第四十一讲--n维向量空间的子空间 §4.2. 向量组的线性相 ...
- python实验题第四章_「Python」2020.03.16学习笔记 | 第四章列表、元组、字典-习题(11-13)...
学习测试开发的Day74,真棒! 学习时间为1H 第四章列表.元组.字典-习题(11-13) 11.求两个集合的交集和并集 代码 list1=[1,2,3,4] list2=[2,3,5,5] def ...
- 深度之眼 - Python学习笔记——第四章 组合数据类型
第四章 组合数据类型 4.1 列表 列表是可变的! 4.1.1 列表的表达 序列类型:内部元素有位置关系,能通过位置序号访问其中元素 列表是一个可以使用多种类型元素,支持元素的增.删.查.改操作的序列 ...
- Lan Goodfellow 《DEEP LEARNING》学习笔记 --第四章
https://app.yinxiang.com/shard/s64/nl/22173113/a89ab8f8-3937-419c-8b81-cc913abaa35a/ 为了方便起见,我用的可手写的a ...
- 趣学python教孩子学编程_《趣学Python——教孩子学编程》学习笔记第1-3章
第1章 Python不是大蟒蛇 1.1 关于计算机语言 计算机程序是一组让计算机执行某种动作的指令.软件就是计算机程序的集合. 一种编程语言就是一种特定的与计算机交谈的方式,这种方式使用计算机和人都能 ...
最新文章
- VS2017配置OpenCV3.2+contrib3.2
- 从控制器到驱动器的WD——硬盘巨头启示录之西数篇
- linux selenium_爬虫界又出神器|一款比selenium更高效的利器
- 谈谈WPF中的CollectionView与CollectionViewSource
- 大学的软件测试怎么学
- Angular refreshView里Component template函数的执行原理
- 使用action framework 实现order change时自动发送邮件
- 户外lisp导向牌如何安装_聚焦热点、难点,持续开展户外广告(招牌)专项整治...
- 04Hadoop中的setPartitionerClass/SortComparator/GroupingComparator问题
- React开发(124):ant design学习指南之form中的属性
- hive执行更新和删除操作
- live2d动态壁纸android,Live2d动态壁纸
- 敏感词过滤和谐社会1.0版
- 校园网设计超超超级详细的配置来了(以河北科技大学为例)
- linux下卸载grads,linux下安装grads
- 对话西蒙斯:解密金融模型和量化投资帝国
- 如何开发一套完整的医疗远程会诊系统方案
- OBS视频采集流程分析
- 游戏服务器设计(C#)简单版
- 马云推出的“天猫精灵”到底有多牛? 细思极恐怖