Python进阶–1

装饰器

  • 作用

保证在不改变原有函数结构的基础上,实现其功能的添加

即开放封闭原则:

  • 开放:可以增加新的功能
  • 封闭:原函数的代码不能修改
  • 可应用的场景
  1. 引入日志
  2. 函数执行时间统计
  3. 执行函数前的预处理
  4. 执行函数后的清理功能
  5. 权限检验
  6. 缓存
  • 无参无返回值的装饰器
def decorater(func):print('------>1')def addfunc():func()print('------>3')print('新增一个功能')print('再新增一个功能') print('------>4')print('------2')return addfunc@decorater        # 原理上等价于:oldfunc = decorater(oldfunc)
def oldfunc():print('可以实现一个功能')oldfunc()

------>1
------2
可以实现一个功能
------>3
新增一个功能
再新增一个功能
------>4

  • 带有基本参数的装饰器
def decorater(func):print('------>1')def addfunc(para1):     # 带参数的被修饰函数,需要在此添加参数func(para1)print('------>3')print('新增一个功能')print('再新增一个功能') print('------>4')print('------2')return addfunc@decorater
def oldfunc(para1):print('可以实现一个{}功能'.format(para1))oldfunc('收费')   # 这里oldfunc本质就是addfunc

------>1
------2
可以实现一个收费功能
------>3
新增一个功能
再新增一个功能
------>4

  • 带有可变参数和关键字参数的装饰器进阶版—*args和**kwargs
def decorater(func):def addfunc(*args, **kwargs):func(*args, **kwargs)print('略写')return addfunc@decorater      # 原理上等价于:oldfunc = decorater(oldfunc)
def oldfunc(para1):print('可以实现一个{}功能'.format(para1))@decorater      # 原理上等价于:oldfunc = decorater(oldfunc)
def oldfunc1(para1, para2):print('可以实现一个{}功能,预计花费{}元'.format(para1, para2))@decorater      # 原理上等价于:oldfunc = decorater(oldfunc)
def oldfunc2(para1, para2, para3=3):print('可以实现一个{}功能,预计花费{}元,用时{}天'.format(para1, para2, para3))oldfunc('收费')
oldfunc1('收费', 1000)
oldfunc2('收费', 1000)
oldfunc2('收费', 1000, para3=4)

可以实现一个收费功能
略写
可以实现一个收费功能,预计花费1000元
略写
可以实现一个收费功能,预计花费1000元,用时3天
略写
可以实现一个收费功能,预计花费1000元,用时4天
略写

  • 带有所有参数以及返回值的装饰器
def decorater(func):def addfunc(*args, **kwargs):func(*args, **kwargs)print('略写')return '实际花费了10天'return addfunc@decorater      # 原理上等价于:oldfunc = decorater(oldfunc)
def oldfunc2(para1, para2, para3=3):print('可以实现一个{}功能,预计花费{}元,用时{}天'.format(para1, para2, para3))result = oldfunc2('收费', 1000, para3=4)        # 等价于:oldfunc2 = addfunc
print(result)

可以实现一个收费功能,预计花费1000元,用时4天
略写
实际花费了10天

文件操作

  • 主要使用**open()**系统函数

https://www.runoob.com/python3/python3-func-open.html

https://www.runoob.com/python/python-func-open.html

  • 常用知识以及模块

os、open()

相对路径和绝对路径

  • 常用操作

仅读取–文本

with open(path + '\\调用文件\\2020_理科.txt', 'r') as f:for line in f.readlines():line_info = line.strip().split(",") info_fenshu_2020_like.append(line_info[0])info_renshu_2020_like.append(line_info[1])info_paiming_2020_like.append(line_info[2])

追加写–文本

with open(os.getcwd() + './存储下载文件/小说/{}.txt'.format(book_name), mode='a+', encoding='utf-8') as f:f.write('**********************\n')f.write('**********************\n')f.write('{}\n'.format(title))f.write('**********************\n')f.write('**********************\n')f.write('\n\n\n')f.write(content)f.write('\n\n\n\n')

写–二进制文件

with open(path + '//存储下载文件//网易下载歌曲//{}.mp3'.format(name), 'wb') as f:f.write(response.content)f.flush()

跳过第一行非数据信息

with open('test.txt') as f:print(f.readlines())with open('test.txt') as f:print(f.readline(), end='')next(f)          # 此命令可以保证跳过一行操作print(f.readline(), end='')

[‘wer\n’, ‘aer\n’, ‘awre’]
wer
awre

异常机制及异常捕获

  • 基本知识

语法错误:编写代码的时候可以人为检查

异常:出现在运行之后,通常是xxxError

有些异常不是程序的问题,而是输入不在程序正常运行的范围内。

这种情况可以通过异常处理来进行提示

  • 异常捕获注意事项

一个父异常下面可能包含很多个子异常

except异常处理是按照顺序,代码从上到下运行

所以父异常必须放在子异常后边

try:expressionexcept 子子异常:      # 子子异常是子异常1或子异常2的子异常expression0except 子异常2:      # 子异常1、子异常1两者并列,属于父异常expression1except 子异常1:expression2except 父异常 as err:print('异常是:', err)      # 可以获得错误的具体内容expression3

  • 异常处理机制

基本

try:expressionexcept Error1:expression1
---------------可添加部分---------------
except Error2:expression2except Error3:expression3...................
---------------可添加部分---------------

try - except - else

try:expressionexcept Error3:expression3         # 有else,表达式就不能出现returnelse:                  # 没有异常,才会执行else的内容expression

try - except - finally

try:expressionexcept Error3:expression3      # 有finally,即使里面有return,也会执行finally的内容finally:         # 有没有异常,都会执行,常用于f.close()expression
  • 抛出异常

有时候你需要判断代码的输入是否符合要求,并作相应处理

就可以抛出一个自定义的异常或者已有的异常机制

配合异常处理机制来明确问题所在

'''
expression
'''raise Exception('字符长度异常')
raise NameLensError('名字不合要求')

推导式

列表推导式

[表达式 (变量) for 变量 in 旧列表]

[表达式 (变量) for 变量 in 旧列表 if 条件]

[x*x for x in range(6)]
[x*x for x in range(9) if x % 2 ==0]names = ['lily', 'rouse', 'jack', 'Tom']newname = [name  for name in names  if len(name)>3]
print(newname)newname = tuple([name.upper()  for name in names  if len(name)>3])
print(newname)

[‘lily’, ‘rouse’, ‘jack’]
(‘LILY’, ‘ROUSE’, ‘JACK’)

双重循环

suit = ['♥','♦','♣','♠']
face = ['A','2','3','4','5','6','7','8','9','10','J','Q','K']
poke = [(x,y) for x in suit for y in face]

字典推导式

# 列表生成式可以使用两个变量,实现字典的键值交换d = {"X":"A","Y":"B","Z":"C"}
list5 = {v:k for k,v in d.items()}
print(list5)

集合推导式

{x for x in range(10)}

生成器

  • 基本

列表推导式可以直接创建一个列表

如果列表内容很大,且只需要前边部分数据,这样就非常占用空间。

可以用生成器generator来解决这个问题

通过某种算法推算列表元素,在循环中不断推算后续元素,就不需要创建列表,从而节省大量空间

这种一边循环一边计算的机制,就是生成器

  • 获取生成器

通过推导式生成

gener = (x * 3 for x in range(20))
print(type(gener))

<class ‘generator’>

调用

gener = (x * 3 for x in range(20))
print(type(gener))print(gener.__next__())print(next(gener))

<class ‘generator’>
0
3

超出数据量后就会抛出异常,可用异常处理机制避免这个

通过函数生成

def generator():  # 1.定义函数表达式x = 0while True:x += 1yield x     # 2.使用yiled关键字,生成器返回x的值。yield相当于 return+暂停功能g = generator()        # 3.调用,就是生成器了
print(type(g))
print(next(g))
print(next(g))g = generator()      # 重新生成,再调用
print(next(g))
print(next(g))g = generator()      # 重新生成,再调用
t1 = g.send(None)  # send的更多作用后边单列讲解
t2 = g.send(1)     # 调用send必须赋参数
print(t1, t2)

<class ‘generator’>
1
2
1
2
1 2

send()函数

def genera():n = 0while True:temp = yield nfor i in range(temp):print('----->', i)n += 1g = genera()
print(g.send(None))     # 第一次调用,必须赋予参数None
print(g.send(5))        # send函数把5传给temp,然后g.send(5)的返回值是n
print(g.send(4))        # 同理

0
-----> 0
-----> 1
-----> 2
-----> 3
-----> 4
1
-----> 0
-----> 1
-----> 2
-----> 3
2

迭代器和可迭代对象

  • 可迭代对象

迭代是访问集合元素的一种方式

可以用isinstance()函数判断对象是否可迭代

from collections import Iterablelist1 = [1, 2, 3, 4]
strs = 'abc'
ints = 100
print(isinstance(list1, Iterable))
print(isinstance(strs, Iterable))
print(isinstance(ints, Iterable))

True
True
False

不可迭代:int型数据

可迭代:元组、列表、集合、字典、字符串、生成器

  • 迭代器

可以被next()函数调用并不断返回下一个值的对象称为迭代器

是一个可以记住遍历的位置的对象

迭代器对象从集合第一个元素开始访问,直到所有元素被访问结束

gener = (x * 3 for x in range(20))
print(type(gener))print(next(gener))        # 生成器就是迭代器的一种
  • 概念辨别

迭代器是一个大类,其定义为:

可以被next()函数调用并不断返回下一个值的对象称为迭代器

其内部包含生成器

生成器可以直接迭代,直接使用next函数

还包括list、tuple、set等一系列的 “可迭代对象”

可迭代对象不可直接迭代,即不能直接调用next()函数

【是否可迭代用isinstance()函数判断】

上述可迭代对象可以使用iter()函数,使得可迭代对象变为迭代器,从而调用next()函数

list1 = [1, 2, 3, 4]
list1 = iter(list1)print(next(list1))
print(next(list1))

1

2

总的来说迭代器包含两大类

一类是生成器,可以直接迭代,生成器本身属于迭代器的一种

一类是可以通过iter()函数变为迭代器的可迭代对象

知识点 —— Python进阶-1相关推荐

  1. 知识点 —— Python进阶-3

    Python进阶–3 单例模式 常用开发模式之一 用途 确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时 比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 A ...

  2. 知识点 —— Python进阶-2

    Python进阶–2 面向对象–基础 引入理解 https://blog.csdn.net/shenzixincaiji/article/details/83576687 类.对象.属性.方法 基础 ...

  3. Python 进阶_生成器 生成器表达式

    目录 目录 相关知识点 生成器 生成器 fab 的执行过程 生成器和迭代器的区别 生成器的优势 加强的生成器特性 生成器表达式 生成器表达式样例 小结 相关知识点 Python 进阶_迭代器 & ...

  4. Python 进阶 之 知识点记忆

    Python 进阶 PEP8 编码规范, 及开发中的一些惯例和建议 练习: 规范化这段代码 from django.conf import settings from user.models impo ...

  5. Python进阶6——序列操作

    1.序列的拼接和复制 Python中使用+对序列进行拼接,使用*对序列进行复制 s=str(1234) l=list(range(2,13)) print(s,l) print('---------- ...

  6. Python 进阶之路 (十二) 尾声即是开始

    Python进阶之路总结 大家好,我的<< Python进阶之路>>到这一期就到此为止了,和 <<Python 基础起步>>不同,在掌握了一些基础知识后 ...

  7. 【Python进阶】Python进阶专栏、编程与开源框架知识星球上线,等你来follow

    大家好,今天我将在有三AI开设新专栏<Python进阶>.在这个专栏中,我们会讲述Python的各种进阶操作,包括Python对文件.数据的处理,Python各种好用的库如NumPy.Sc ...

  8. python进阶记录之基础篇二十六_Python进阶记录之基础篇(十六)

    回顾 在Python进阶记录之基础篇(十五)中,我们介绍了面向对象的基本概念以及Python中类和对象的基础知识,需要重点掌握类的创建和对象的使用.今天我们继续讲一下Python中面向对象的相关知识点 ...

  9. python进阶05并发之一基本概念

    原创博客地址:python进阶05并发之一基本概念 大多编程语言,一旦涉及并发,都会比较复杂,知识点也较多(大多为历史问题,很多技术点现在非常少使用了,但语言层面也提供支持,对于这些冷门点,只需要知道 ...

最新文章

  1. 【TCP/IP详解 卷一:协议】第十九章 TCP的交互数据流
  2. Ubuntu用apt-get安装报错:E: Could not get lock /var/lib/dpkg/lock-frontend - open (11:资源暂时不可用)
  3. [BZOJ 1588][HNOI 2002] 营业额统计
  4. JDK源码解析 Integer类使用了享元模式
  5. flume使用telnet作为入口出现connection refused
  6. 【LeetCode笔记】221. 最大正方形(Java、动态规划、思路题)
  7. 这个世界是那样的似曾相识
  8. asp.net 分页
  9. elasticsearch5.3安装kibana、x-pack插件、elasticsearch-an
  10. CheckBox的触发
  11. VMware Perl SDK error “Server Version Unavailable .. line 545”
  12. python自定义函数拟合_python自定义函数拟合
  13. python爬虫案例
  14. python创意网络爬虫_如何利用Python写简单网络爬虫
  15. 如何写出成功的商业计划书
  16. matlab脚本栏中间有条线,word中间有一根线 word中间有一条线如何去掉
  17. 中国移动 烽火HG6543C5光猫 获取超级密码教程
  18. switch函数用法与错误分析
  19. 计算机台式硬件排名,CPU天梯图2019年1月最新版 一月台式电脑处理器排名
  20. 美国电子计算机大学排名,美国大学电子计算机专业排名院校有哪些?

热门文章

  1. [Python] 人人影视签到脚本
  2. 【故障诊断分析】基于matlab滚动轴承故障诊断系统【含Matlab源码 1679期】
  3. 独家!数坤科技拟在香港上市,辅助诊断病例破亿,毛新生持股22%
  4. 2019计算机考证湖南考点
  5. html页面识别当前系统和语言
  6. python关于row的规范_python风格规范
  7. MongoDB 3.6高可用集群(分片技术)
  8. 【库】Generator:8行代码优雅解决异步嵌套
  9. 23种设计模式(第三章结构型模式7种)
  10. 帝国网站管理服务器配置信息,帝国cms 服务器设置