本章内容:

  一、、装饰器

  二、生成器

  三、迭代器

  四、python中的内置方法

  五、json & pickle 的数据序列化及反序列化

  六、程序目录结构规范

  七、补充内容

一、装饰器:

  1、概念:装饰器的本质是函数,用于装饰其他函数,就是给其他函数添加附加的功能

  2、什么情况下要使用装饰器?

    (1)不能修改被装饰函数的源代码

    (2)不能修改被装饰函数的调用方式

    (装饰器对于被装饰函数是完全透明的,不会影响被装饰函数)

  示例:

  定义一个sayhi()函数,调用函数时,打印“你好,xx”,代码如下:

def sayhi(name):
print('Hi,',name)
sayhi("MR")

  现在想要给这个函数添加新功能,计算该程序执行的时间,要求不能对原函数进行修改,而且不能修改原函数的调用方式。

import time
def timer(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)
return wrapper @timer # 相当于执行了 sayhi = timer(sayhi)
def sayhi(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 传值

  '''

   函数生成器示例:

def myGen():
print('生成器被执行!')
yield 1 # 打印1
yield 2 # 打印2
myG = myGen() print(next(myG)) print(next(myG))
# 第一次调用生成器,会打印'生成器被执行!',然后在yield前停下 ,每使用一次next方法都会执行一次yield。

4、斐波那契数列

(1)普通方法

list_fib = []
def fib(max):
a = 0
b = 1
n = 0
while n < max:
print(b)
list_fib.append(b)
a,b = b, a + b # 这里是给 a 和 b 同时赋值
n = n+1 fib(10)
print('list_fib = ',list_fib)

(2)用函数生成器实现

def fib(max):
a = 0
b = 1
n = 0
while n < max:
yield b
a,b = b, a + b # 同时赋值
n = n+1 f = 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([]))
def func1():
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 in res:
print(i)

15、map() : 根据提供的函数对指定序列做映射。

  第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

res = map(lambda n: n*n, range(10))
for i in res:
print(i)
print(type(res))
>>>

0
1
4
9
16
25
36
49
64
81

16、reduce()  : 函数会对参数序列中元素进行累积。

  函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给reduce中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。

from functools import reduce
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() :  函数会以字典类型返回当前位置的全部局部变量。

def test():
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 in zip(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序列化

import json

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反序列化

import json
f = open('info.txt','r')
data = json.loads(f.read())
print(data['age'])

2、pickle模块: 用于python特有的类型和python的数据类型之间的转换

  四个功能:dump, dumps, load, loads

示例1:把字典写入文件中

  pickle序列化:

import pickle

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反序列化:

import pickle
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+y
print(a(2,3))

(2)try-except 语句

基本语法:

try:
检测范围
except Exception [as reason]:
出现异常(Exception)后处理的代码

示例:

try:
int ('abc')
sum = 1 + ''
f = open ('我为啥是一个文件.txt')
print(f.read())
f.close()
except OSError as reason:
print('文件出错\n 错误的原因是:' + str(reason))
except TypeError as reason:
print('类型出错\n 错误的原因是:' + str(reason))
except ValueError as reason:
print('值出错\n 错误的原因是:' + str(reason))

注意:try 语句一旦检测到异常,后面的语句就不会被执行

(3)try-finally

解释:基本用法与try-except 相似,只是finally 之后的代码无论怎么样都会执行,可以try-except-finaaly 连用,这样如果try中没有异常,则会跳过except,直接执行finally 里面的代码

python 3.5学习笔记(第四章)的更多相关文章

  1. [Python学习笔记][第四章Python字符串]

    2016/1/28学习内容 第四章 Python字符串与正则表达式之字符串 编码规则 UTF-8 以1个字节表示英语字符(兼容ASCII),以3个字节表示中文及其他语言,UTF-8对全世界所有国家需要 ...

  2. Python(Head First)学习笔记:四

    4 持久存储:文件存储.读写 数据保存到文件:在学习的过程中出现了一个问题,老是报一个错:SyntaxError: invalid syntax: 这个是语法错误,后来搜了下才知道是python2.7 ...

  3. Python基础教程学习笔记:第一章 基础知识

    Python基础教程 第二版 学习笔记 1.python的每一个语句的后面可以添加分号也可以不添加分号:在一行有多条语句的时候,必须使用分号加以区分 2.查看Python版本号,在Dos窗口中输入“p ...

  4. o'Reill的SVG精髓(第二版)学习笔记——第四章

    第四章:基本形状 4.1线段 SVG可以使用<line>元素画出一条直线段.使用时只需要指定线段起止点的x和y坐标即可.指定坐标时可以不带单位,此时会使用用户坐标,也可以带上单位,如em. ...

  5. 《Python基础教程(第二版)》学习笔记 -> 第四章 字典

    字典是Python中唯一内建的映射类型. 字典中的值并没有特殊的顺序,但是都存储在一个特定的键(Key)里.键可以是数字.字符串甚至是元组. 字典的使用 某些情况下,字典比列表更加适用: 表征游戏棋盘 ...

  6. Python学习笔记 -- 第四章

    高阶函数 变量可以指向函数 f=abs f(-10) 10 变量f指向abs函数,直接调用abs()函数和调用f()完全相同 传入参数 变量可以指向函数,函数的参数可以接收另一个函数的参数,这种函数成 ...

  7. Java 学习笔记 ------第四章 认识对象

    本章学习目标: 区分基本类型与类类型 了解对象与参考的关系 从打包器认识对象 以对象观点看待数组 认识字符串的特性 一."=" 和 "==" 当=用于基本类型时 ...

  8. Python 3.5学习笔记(第二章)

    本章内容 1.模块 2.数据类型与数据运算 3.进制 4.byte 与 string 的互相转换 5.列表 6.元组 7.字符串操作 8.字典 一.模块 Python 把某些常用的定义存放在文件中,为 ...

  9. Python 3.5学习笔记(第一章)

    本章内容: 1.安装python 3.5 和 PyCharm 社区版 2.第一个python程序 3.变量 4.字符编码 5.用户输入 6.字符串格式化输出 7.if .else .elif 8.fo ...

  10. 《metasploit渗透测试魔鬼训练营》学习笔记第四章—web应用渗透

    继续来学习metasploit...记好笔记是很重要的,下面开始正文: 二.WEB应用渗透技术     1.WEB应用渗透基础知识        先介绍WEB应用攻击的主要类型(大致介绍,具体请自行查 ...

随机推荐

  1. PHP MYSQL 获取记录总数

    $qid = mysql_query(“SELECT count(aid) as total FROM table group by aid “);//你的查询 $res = mysql_fetch_ ...

  2. Windows下 Composer 安装 Thinkphp5 的记录.

    首先安装Composer, 下载地址: https://www.phpcomposer.com/ Windows安装过程及其简单,请自行搜索解决. 接下来Win+R, 启动命令行窗口,以下所有操作都是 ...

  3. 我怎么忽略了身份框架魔法,只是使用OWIN验证的中间件,以获得要求我寻求什么呢?

    该OWIN中间件的东西第三方登录集成到您的ASP.NET应用程序是非常酷的,但我似乎无法弄清楚如何就剜出来的新的ID,它取代了蹩脚的成员身份 API.我没有兴趣在坚持所产生的债权,并在英法为基础的数据 ...

  4. C# ACCESS 修改表记录提示"UPDATE 语句语法错"问题

    错误的sql 语句如下: sqlStr =  "update tb_userInfo set passWord='" + pw + "' where userName=' ...

  5. 为什么不用C++写游戏(聪明的程序员不用C++折磨自己)(这些工作,QT都替开发者解决了,C++没有根类导致太多的问题,也没有字符串类)

    当今世界上绝大多数游戏都是C++写的,为什么要说不呢? 要做什么?写游戏. 写游戏首先要考虑些什么?做什么样的游戏,图形.音效.游戏逻辑如何实现. 用C++要先考虑什么?定义跨平台数据类型抽象,实现常 ...

  6. 说说IEnumerable和yield

    IEnumerable数据类型是我比较喜欢的数据类型,特别是其强类型IEnumerable<T>更获得Linq的支持使得代码看起来更加优雅.整洁. 编写返回值为IEnumerable(或I ...

  7. 【操作系统】elementary OS 和 deepin OS

    文章摘自:http://blog.sina.com.cn/s/blog_64fb59d90102x3xa.html 部分参考:https://bbs.deepin.org/forum.php?mod= ...

  8. m3u8解析、转码、下载、合并

    m3u8解析.转码.下载.合并 现在网也上大多数视频需要下载都很麻烦,极少数是MP4,大多都是m3u8, 先说视频下载, pc端: 打开网页,点击视频播放,打开开发者工具,找到网络那一栏, 等整个网页 ...

  9. 面试还不知道BeanFactory和ApplicationContext的区别?

    接口 BeanFactory 和 ApplicationContext 都是用来从容器中获取 Spring beans 的,但是,他们二者有很大不同 我看到过很多问 BeanFactory 和 App ...

  10. Kali Linux Web渗透测试手册(第二版) - 1.1 - Firefox浏览器下安装一些常用的插件

    一.配置KALI Linux和渗透测试环境 在这一章,我们将覆盖以下内容: l  在Windows和Linux上安装VirtualBox l  创建一个Kali Linux虚拟机 l  更新和升级Ka ...