本章内容:

一、、装饰器

二、生成器

三、迭代器

四、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学习笔记(第四章)相关推荐

  1. 《Go语言圣经》学习笔记 第四章 复合数据类型

    <Go语言圣经>学习笔记 第四章 复合数据类型 目录 数组 Slice Map 结构体 JSON 文本和HTML模板 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. ...

  2. 计算机网络(第7版)谢希仁著 学习笔记 第四章网络层

    计算机网络(第7版)谢希仁著 学习笔记 第四章网络层 第四章 网络层 4.3划分子网和构造超网 p134 4.3.1划分子网 4.3.2使用子网时分组的转发 4.3.3无分类编址CIDR(构建超网) ...

  3. Effective Java(第三版) 学习笔记 - 第四章 类和接口 Rule20~Rule25

    Effective Java(第三版) 学习笔记 - 第四章 类和接口 Rule20~Rule25 目录 Rule20 接口优于抽象类 Rule21 为后代设计接口 Rule22 接口只用于定义类型 ...

  4. 机器人导论(第四版)学习笔记——第四章

    机器人导论(第四版)学习笔记--第四章 4.1 引言 4.2 解的存在性 4.3 当n<6时操作臂子空间的描述 4.4 代数解法和几何解法 4.5 简化成多项式的代数解法 4.6 三轴相交的Pi ...

  5. 线性代数学习笔记——第四章学习指南——n维向量空间

    一.学习内容及要求 1. 内容: §4.1. n维向量空间的概念 线性代数学习笔记--第四十讲--n维向量空间的概念 线性代数学习笔记--第四十一讲--n维向量空间的子空间 §4.2. 向量组的线性相 ...

  6. python实验题第四章_「Python」2020.03.16学习笔记 | 第四章列表、元组、字典-习题(11-13)...

    学习测试开发的Day74,真棒! 学习时间为1H 第四章列表.元组.字典-习题(11-13) 11.求两个集合的交集和并集 代码 list1=[1,2,3,4] list2=[2,3,5,5] def ...

  7. 深度之眼 - Python学习笔记——第四章 组合数据类型

    第四章 组合数据类型 4.1 列表 列表是可变的! 4.1.1 列表的表达 序列类型:内部元素有位置关系,能通过位置序号访问其中元素 列表是一个可以使用多种类型元素,支持元素的增.删.查.改操作的序列 ...

  8. Lan Goodfellow 《DEEP LEARNING》学习笔记 --第四章

    https://app.yinxiang.com/shard/s64/nl/22173113/a89ab8f8-3937-419c-8b81-cc913abaa35a/ 为了方便起见,我用的可手写的a ...

  9. 趣学python教孩子学编程_《趣学Python——教孩子学编程》学习笔记第1-3章

    第1章 Python不是大蟒蛇 1.1 关于计算机语言 计算机程序是一组让计算机执行某种动作的指令.软件就是计算机程序的集合. 一种编程语言就是一种特定的与计算机交谈的方式,这种方式使用计算机和人都能 ...

最新文章

  1. VS2017配置OpenCV3.2+contrib3.2
  2. 从控制器到驱动器的WD——硬盘巨头启示录之西数篇
  3. linux selenium_爬虫界又出神器|一款比selenium更高效的利器
  4. 谈谈WPF中的CollectionView与CollectionViewSource
  5. 大学的软件测试怎么学
  6. Angular refreshView里Component template函数的执行原理
  7. 使用action framework 实现order change时自动发送邮件
  8. 户外lisp导向牌如何安装_聚焦热点、难点,持续开展户外广告(招牌)专项整治...
  9. 04Hadoop中的setPartitionerClass/SortComparator/GroupingComparator问题
  10. React开发(124):ant design学习指南之form中的属性
  11. hive执行更新和删除操作
  12. live2d动态壁纸android,Live2d动态壁纸
  13. 敏感词过滤和谐社会1.0版
  14. 校园网设计超超超级详细的配置来了(以河北科技大学为例)
  15. linux下卸载grads,linux下安装grads
  16. 对话西蒙斯:解密金融模型和量化投资帝国
  17. 如何开发一套完整的医疗远程会诊系统方案
  18. OBS视频采集流程分析
  19. 游戏服务器设计(C#)简单版
  20. 马云推出的“天猫精灵”到底有多牛? 细思极恐怖

热门文章

  1. PermutationsUnique,求全排列,去重
  2. 高德地图 android api 实现自动定位
  3. 深入理解 ViewState
  4. HDU1328 ZOJ1240 IBM Minus One【水题】
  5. NUC1422 字母旋转游戏【水题】
  6. 素性测试AKS算法程序
  7. 强化学习 —— gym
  8. 云计算服务与基本术语、概念
  9. 中英文对照 —— 战争与军事
  10. python列表删除行_Python DataFrame – 删除具有属于值列表的列值的行