def

Python之装饰器的实例

北城余情 提交于 2021-01-09 05:55:35
1.1装饰器的应用:参数类型检查 函数参数的检查,一定是在函数外 函数应该作为参数,传入到检查函数中 检查函数拿到函数传入的实际参数,与形参声明对比 __annotations__属性是一个字典,其中包括返回值类型的声明。假设要做位置参数的判断,无法和字典中的声明对应。使用inspect模块 inspect模块:提供获取对象信息的函数,可以检查函数和类、类型检查 from functools import wraps import inspect def check(fn): @wraps(fn) def _check(*args,** kwargs): sig = inspect.signature(fn) params = sig.parameters # 传入的参数是有序的字典,标识的是函数的签名 keys = list(params.keys()) # 把形参的参数从字典中提取出来,利用list函数迭代出来,在利用索引取值 values = list(params.values()) # 把形参的参数注解的类型拿到,用list函数迭代,在利用索引取值 for k,v in enumerate(args): # args实参迭代,k可以利用在索引取值上 print ( ' k={},v={} ' .format(k,v)) if isinstance(v,values[k]

Python的装饰器实例用法小结

旧城冷巷雨未停 提交于 2021-01-09 05:45:43
这篇文章主要介绍了Python装饰器用法,结合实例形式总结分析了Python常用装饰器的概念、功能、使用方法及相关注意事项 一、装饰器是什么 python的装饰器本质上是一个Python函数 ,它可以让其他函数在不需要做任何代码变动的前提下 增加额外功能 ,装饰器的返回值也是一个 函数对象 。 它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。 概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。 二、为什么需要装饰器 1、先来看一个简单例子: ```python In [12]: def foo(): ...: print('I am foo') ...: - 2、增加需求 现在有一个新的需求,希望可以记录下函数的执行日志,于是在代码中添加日志代码: ```python In [13]: def foo(): ...: print('I am foo') ...: print('foo is running') ...: 3、又有需求 假设现在有100个函数需要增加这个需求,并且后续可能还要对这一百个函数都增加执行前打印日志的需求。此时再一个个改会造成大量雷同的代码。**为了减少重复写代码,我们可以这样做,重新定义一个函数:*

NameError: name 'pip' is not defined(Python3.5)

会有一股神秘感。 提交于 2021-01-09 05:35:28
问题: PyCharm IDE 创建项目或引入库提示 NameError: name 'pip' is not defined 问题解决方案 处理方法: 修改PyCharm 安装目录下文件: PyCharm 2017.3\helpers\packaging_tool.py 修改如下方法: def do_install(pkgs): try : # import pip try : from pip._internal import main except Exception: from pip import main except ImportError: error_no_pip() return main([ ' install ' ] + pkgs) def do_uninstall(pkgs): try : # import pip try : from pip._internal import main except Exception: from pip import main except ImportError: error_no_pip() return main([ ' uninstall ' , ' -y ' ] + pkgs) 来源: oschina 链接: https://my.oschina.net/u/4386697/blog/3882142

微信公众号爬虫--历史文章

为君一笑 提交于 2021-01-09 05:15:55
今天搞了一个微信公众号历史文章爬虫的demo,亲测可行,记录一下!(不喜勿喷) 缺点:1.不是很智能 2. 兼容性不是很好,但是能应付正常情况啦 使用mysql+request 数据库部分 直接建表ddl吧: CREATE TABLE `wechat_content` ( `id` int(11) NOT NULL AUTO_INCREMENT, `wechat_name` varchar(255) DEFAULT NULL COMMENT '公众号名字', `title` varchar(225) DEFAULT NULL COMMENT '文章标题', `content_url` varchar(1000) DEFAULT NULL COMMENT '文章地址', `cover` varchar(1000) DEFAULT NULL COMMENT '封面图', `source_url` varchar(1000) DEFAULT NULL COMMENT '转载url', `source_name` varchar(255) DEFAULT NULL COMMENT '转载公众号名', `datetime` varchar(255) DEFAULT NULL COMMENT '发布时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO

Django form表单

生来就可爱ヽ(ⅴ<●) 提交于 2021-01-09 04:38:59
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入的长度和格式等正不正确。如果用户输入的内容有错误就需要在页面上相应的位置显示对应的错误信息.。 Django form组件就实现了上面所述的功能。 总结一下,其实form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 保留上次输入内容 普通方式手写注册功能 views.py # 注册 def register(request): error_msg = "" if request.method == "POST": username = request.POST.get("name") pwd = request.POST.get("pwd") # 对注册信息做校验 if len(username) < 6: # 用户长度小于6位 error_msg = "用户名长度不能小于6位" else: # 将用户名和密码存到数据库 return HttpResponse("注册成功") return render(request, "register.html", {"error_msg": error_msg}) login.html <!DOCTYPE

正则表达式 实现计算器

♀尐吖头ヾ 提交于 2021-01-08 22:54:47
import re bracket = re.compile(r'\([^()]+\)') # 寻找最内层括号规则 mul = re.compile(r'(\d+\.?\d*\*-\d+\.?\d*)|(\d+\.?\d*\*\d+\.?\d*)') # 寻找乘法运算规则 div = re.compile(r'(\d+\.?\d*/-\d+\.?\d*)|(\d+\.?\d*/\d+\.?\d*)') # 寻找除法运算规则 add = re.compile(r'(-?\d+\.?\d*\+-\d+\.?\d*)|(-?\d+\.?\d*\+\d+\.?\d*)') # 寻找加法运算规则 sub = re.compile(r'(-?\d+\.?\d*--\d+\.?\d*)|(-?\d+\.?\d*-\d+\.?\d*)') # 寻找减法运算规则 c_f = re.compile(r'\(?\+?-?\d+\)?') # 检查括号内是否运算完毕规则 strip = re.compile(r'[^(].*[^)]') # 脱括号规则 def Mul(s): """计算表达式中的乘法运算""" exp = re.split(r'\*', mul.search(s).group()) return s.replace(mul.search(s).group(), str(float(exp

正则表达式计算器

点点圈 提交于 2021-01-08 22:54:30
'' 计算流程: 1.将括号表达式(内部不包含括号)匹配出来 2.计算括号表达式的值,用计算值替换原括号表达式 计算处理流程: 1)从左至右匹配,匹配出乘法或除法表达式,计算出值,塞回去替换匹配的内容 2)乘除法运算都已处理完,对剩下表达式从左至右匹配 3)匹配一个加法或减法运算式,计算出值,塞回去,替换匹配的表达式 4)直到没有匹配运算式,停止,本轮括号表达式计算替换值流程完成 3.再次进行括号表达式(内部不包含括号)匹配 4.重复2 5.直到匹配不出括号表达式,直接对剩余运算式进行乘除加减处理 ''' import re p1 = re.compile(r'\+\s*?-|-\s*?\+') # 匹配'+-或-+' 匹配-+是为了处理用户输入原始表达式中有-+的情况 p2 = re.compile(r'-\s*?-') # 匹配'--' def process_multi_divis(s): pattern = re.compile(r'-?\d+(?:\.?\d+)?\s*?[*/]{1}\s*?-?\s*?\d+(?:\.?\d+)?') # 匹配 *,/,*-,/- 四种情况 while 1: result_process_p1 = re.sub(p1, '-', s) s = re.sub(p2, '+', result_process_p1) r = re

作业:利用正则表达式知识, 编辑一个简单的表达式计算器

烈酒焚心 提交于 2021-01-08 20:46:15
开发要求:   开发一个简单的python计算器:   实现加减乘除及优先级解析;   用户输入类似这样的表达式: 1 - 2*((60-30 +(-40/5)*(9-2*5/3+7/3*99/4*2998 + 10*568/14))-(-4*3)/(16-3*2))   等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似的功能实现,运算后得出结果)      计算结果必须与真实的计算器得出结果一致; 1.  功能分析:     用户输入一个类似这样 3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4) 这样的表达式,     假设表达式里面除了包含空格、'+'、'-'、'*'、'/'和括号再无其他特殊符号,     然后自己动手写代码解析其中的表达式,实现加减乘除,     最后得出的结果与真实的计算机所算的结果必须一致。 2.   所需要的知识点:     1>  字符串的处理;     2>  正则表达式的运用;     3>  函数递归; 3.   程序实现流程分析:     1>  用正则表达式处理字符串,只提取其中的数字和运算符,并转换成列表     2>  编写一个函数,处理没有括号的基本运算的基本表达式     3>  再写一个函数递归处理带有括号的函数

RDD的五大特点

让人想犯罪 __ 提交于 2021-01-08 20:15:48
1.RDD的官网定义 A Resilient Distributed Dataset (RDD), the basic abstraction in Spark. Represents an immutable,partitioned collection of elements that can be operated on in parallel. 翻译: 弹性分布式数据集(RDD),Spark中的基本抽象。表示不可变的,分区的可以并行操作的元素集合。 解释: RDD是Resilient Distributed Dataset(弹性分布式数据集)的简称。RDD的弹性体现在计算方面,当Spark进行计算时,某一阶段出现数据丢失或者故障,可以通过RDD的血缘关系就行修复。 1、内存的弹性:内存与磁盘的自动切换 2、容错的弹性:数据丢失可以自动恢复 3、计算的弹性:计算出错重试机制 4、分片的弹性:根据需要重新分片 RDD是不可变(immutable)的,一旦创建就不可改变。RDDA-->RDDB,RDDA经过转换操作变成RDDB,这两个RDD具有血缘关系,但是是两个不同的RDD,体现了RDD一旦创建就不可变的性质。 RDD源码 abstract class RDD [ T: ClassTag ] ( @transient private var _sc: SparkContext,

用最复杂的方式学会数组(Python实现动态数组)

╄→尐↘猪︶ㄣ 提交于 2021-01-08 17:02:42
# Python序列类型的本质 在本博客中,我们来聊聊探讨Python的各种“序列”类,内置的三大常用数据结构——列表类(list)、元组类(tuple)和字符串类(str)的本质。 不知道你发现没有,这些类都有一个很明显的共性,都可以用来保存多个数据元素,最主要的功能是:每个类都支持下标(索引)访问该序列的元素,比如使用语法 `Seq[i]`。其实上面每个类都是使用 `数组` 这种简单的数据结构表示。 >本期小编推送2021初学者一定会用到的Python资料,含有小编自己呕心沥血整理的免费书籍/视频/在线文档和编辑器/源代码,关于`Python`的安装qun:850973621 但是熟悉Python的读者可能知道这3种数据结构又有一些不同:比如元组和字符串是不能修改的,列表可以修改。 ## 计算机内存中的数组结构 计算机体系结构中,我们知道计算机主存由位信息组成,这些位通常被归类成更大的单元,这些单元则取决于精准的系统架构。一个典型的单元就是一个字节,相当于8位。 计算机系统拥有庞大数量的存储字节,那么如何才能找到我们的信息存在哪个字节呢?答案就是大家平时熟知的 `存储地址` 。基于存储地址,主存中的任何字节都能被有效的访问。实际上,每个存储字节都和一个作为其地址的唯一二进制数字相关联。如下图中,每个字节均被指定了存储地址: ![image.png](https://upload