自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

向上吧贺凯

java web、机器学习、Linux与C++

  • 博客(126)
  • 问答 (1)
  • 收藏
  • 关注

原创 流畅的python笔记(二十一)类元编程

目录前言一、类工厂函数二、定制描述符的类装饰器三、导入时和运行时比较场景练习场景1解答场景2解答四、元类基础知识场景练习场景3解答场景4解答五、定制描述符的元类六、元类的特殊方法__prepare__七、类作为对象前言类元编程是指在运行时创建或定制类的技艺。python中类是一等对象,因此任何时候都可以使用函数新建类,而无需使用class关键字。类装饰器也是函数,不过能够审查、修改甚至把被装饰的类替换成其他类。 最后,元类是...

2021-11-10 21:48:24 2964

原创 流畅的python笔记(二十)属性描述符

前言描述符是对多个属性运用相同存取逻辑的一种方式。 描述符是实现了特定协议的类,这个协议包括__get__、__set__和__delete__方法。property类实现了完整的描述符协议。描述符是python的独有特征,不仅在应用层使用,在语言的基础设施中也有用到。一、描述符示例:验证属性LineItem类第三版:一个简单的描述符实现了__get__、__set__、__delete__方法的类是描述符。描述符的用法是,创建一个实例,作为另一个类的类属性。下面例子中,我...

2021-11-10 12:34:25 852

原创 流畅的python笔记(十九)动态属性和特性

前言python中,数据的属性和处理数据的方法统称属性attribute,即方法只是可调用的属性。除了这二者之外,我们还可以创建特性property,在不改变类接口的前提下,使用存取方法(即读值方法和设值方法)修改数据属性。 python使用点号访问属性时,比如obj.attr,python解释器会调用特殊的方法(如__getattr__和__setattr__)计算属性。用户自定义的类可以通过__getattr__方法实现虚拟属性,当访问不存在的属性时,即时计算属性的值。 ...

2021-11-08 22:13:16 1086

原创 流畅的python笔记(十七)使用期物处理并发

目录前言一、网络下载的三种风格依序下载的脚本使用concurrent.futures模块的下载脚本flags_threadpool.py期物在哪里二、阻塞型IO和GIL三、使用concurrent.futures模块启动进程四、实验Executor.map方法五、显示下载进度并处理错误前言本章讨论concurrent.futures模块。期物的概念:期物指一种对象,表示异步执行的操作,是concurrent.futures模块和asynicio包的基础。一

2021-11-02 16:55:31 1040

原创 流畅的python笔记(十六)协程

一、生成器如何进化成协程python2.5以后,yield关键字可以在表达式中使用,而且生成器API增加了.send(value)方法。生成器的调用方可以使用.send()方法发送数据,发送的数据会成为生成器函数中yield表达式的值。因此生成器可以作为协程使用。协程是指一个过程,这个过程与调用方协作,产出由调用方提供的值。 除了.send()方法外,还添加了.throw()和.close()方法:send()方法,调用方使用send方法发送数据,该数据会成为生成器函数中yield...

2021-11-01 21:23:21 1035

原创 流畅的python笔记(十五)上下文管理器和else块

前言本章讨论python中的流程控制特性:with语句和上下文管理器,with语句会设置一个临时的上下文,交给上下文管理器对象控制,并且负责清理上下文。 for、while、try语句的else子句。一、if语句之外的else块...

2021-10-31 15:25:55 213

原创 流畅的python笔记(十四)可迭代的对象、迭代器和生成器

前言迭代器模式:扫描内存中放不下的数据集时,要找到一种惰性获取数据项的方式,即按需一次获取一个数据项,这就是迭代器模式。python为了抽象出迭代器模式,加入了关键字yield,这个关键字用于构建生成器,其作用与迭代器一样。所有生成器都是迭代器,因为生成器完全实现了迭代器接口。根据《设计模式:可复用面向对象软件的基础》中的定义,迭代器用于从一个集合中取出元素,生成器则用于凭空生成元素,但在python社区中,大多时候把迭代器和生成器视作同一概念。 在python3中...

2021-10-30 00:05:09 902

原创 流畅的python笔记(十三)正确重载运算符

一、运算符重载基础python对运算符重载加了一些限制。不能重载内置类型的运算符 不能新键运算符,只能重载现有的 某些运算符不能重载------is、and、or、not(位运算符&、|、~可以)

2021-10-28 09:57:08 928

原创 流畅的python笔记(十二)继承的优缺点

目录一、子类化内置类型很麻烦二、多重继承和方法解析顺序三、多重继承的真实应用四、处理多重继承五、Django通用视图中的混入一、子类化内置类型很麻烦python2.2之前,内置类型不能子类化。python2.2以后内置类型可以子类化了,但是内置类型的方法不会调用子类覆盖的方法,比如下边例子,用继承的内置类型的方法无法调用覆盖的内置类型的方法。DoppelDict继承内置的dict类型,它会把存入的值重复一下,即[1, 2]变成[1, 2, 1, 2],并且具体的实现委托给

2021-10-27 21:13:23 326

原创 流畅的python笔记(十一)接口:从协议到抽象类型

一、python文化中的接口与协议接口定义:每个类都有接口,类实现或继承的公开属性(方法或数据属性),包括特殊方法,都是接口。受保护的属性和私有属性不在接口中(即便在python并不存在真正受保护的和私有的属性,而只是采用命名约定实现的)。接口补充定义:对象公开方法的自己,让对象在系统中扮演特定的角色。python文档中的文件类对象或可迭代对象就是指这样一些类,它们实现了文件类对象的方法集合或可迭代需要的方法集合。协议是接口,但不是正式的,只由文档和约定定义。比如序列协议,是python最基础的

2021-10-27 18:24:18 798

原创 笔试题------英语句子结构

句子结构合法:主语有1到多个谓语有且仅有1个宾语有0到多个#include <bits/stdc++.h>using namespace std;// 三个单词表unordered_set<string> zhuyu;unordered_set<string> weiyu;unordered_set<string> binyu;bool judge(vector<string> &temp){

2021-10-24 18:06:44 160

原创 流畅的python笔记(十)序列的修改、散列和切片

前言本章定义表示多维向量的Vector类,其中的元素是浮点数,将支持以下功能:基本的序列协议------__len__和__getitem__ 正确表述拥有很多元素的实例 适当的切片支持,用于生成新的Vector实例 综合各个元素的值计算散列值 自定义的格式语言扩展此外,还将通过__getattr__方法实现属性的动态存取,虽然序列类型通常不会这么做。一、Vector类:用户定义的序列类型二、Vector类第一版:与Vector2d兼容这里故意不让Vector的构造方法和Vec

2021-10-24 15:26:28 2419

原创 流畅的python笔记(九)符合python风格的对象

目录前言一、对象表示形式二、再谈向量类三、备选构造方法四、classmethod与staticmethod五、格式化显示六、让Vector2d可散列七、python的私有属性和”受保护“属性八、使用__slots__类属性节省空间定义类属性__slots__使用__slots__的问题九、覆盖类属性前言本章接续第一章,说明如何实现很多python类型中常见的特殊方法。包含以下话题:支持用于生成对象其他表示形式的内置函数(repr()、byte()等

2021-10-20 17:59:45 641

原创 流畅的python笔记(八)对象引用、可变性和垃圾回收

一、变量不是盒子python中变量不是盒子,而是盒子上贴的标签。对象才是盒子。对象一般是指一块存储空间,变量是对象上贴的标签,一个对象可以贴好多个标签,即可以对应很多个变量名。如下例子,把变量a和b分配给了同一个列表对象,类似于C++中的引用概念,python中的变量的本质都是C++中的引用。因为对象在右边,总是先于变量创建,因此正确说法是把某变量分配给某对象,而不是反过来。二、标识、相等性和别名...

2021-10-19 23:39:07 412 1

原创 流畅的python笔记(七)函数装饰器和闭包

前言函数装饰器用于在源码中“标记”函数,以某种方式增强函数的行为。要掌握装饰器,必须了解闭包,必须知道nonlocal关键字。一、装饰器基础知识装饰器是可调用的对象,其参数是被装饰的函数,因此装饰器可以认为是一种特殊的高阶函数。装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象。假如有个名为decorate的装饰器:@decoratedef target(): print("running target()")上述代码如下述代...

2021-10-18 22:34:58 353

原创 流畅的python笔记(六)使用一等函数实现设计模式

目录一、重构策略模式经典策略模式使用作为对象的函数实现策略模式自动选择最佳策略找出模块中的全部策略globals()使用单独模块专门保存所有策略二、命令模式总结一、重构策略模式经典策略模式策略模式的定义是:定义 一系列算法(策略),把它们一一封装起来,并且使它们可以相互替换。策略模式使得算法可以独立于使用它的客户而变换,即不同的客户都可以使用某个算法或其它算法。 下面是一个电商领域使用策略模式的例子。策略模式设计的内容如下:...

2021-10-18 00:41:52 180

原创 流畅的python笔记(五)一等函数

前言“一等对象”是指满足下述条件的程序实体:在运行时创建 能赋值给变量或数据结构中的元素 能作为参数传给函数 能作为函数的返回结果在python中,整数、字符串、字典等都是一等对象,这跟其它编程语言一致,但是python中的所有函数也是一等对象,或者可以称之为一等函数(所有函数都是一等函数,不存在二等三等函数的说法)。一、把函数视作一等对象def factorial(n): '''returns n! good!''' return 1 if n < 2 el

2021-10-17 22:26:00 569

原创 流畅的python笔记(四)文本和字节序列

一、字符问题

2021-10-14 22:50:46 1215

原创 流畅的python笔记(三)字典和集合

一、泛映射类型collections.abc模块中有Mapping和MutableMapping两个抽象基类,他们的作用是为dict和其它泛映射类型定义形式接口。可以用isinstance函数来判定某个对象是不是泛映射类型import collectionsmy_dict = {}print(isinstance(my_dict, collections.Mapping))# 输出True所谓泛映射类型即键值对类型。泛映射类型中键必须是可散列的,可散列对象有三点要求:第一:

2021-10-08 11:30:10 881

原创 流畅的python笔记(二)数据结构

一、内置序列类型概览python的核心特点之一是对序列数据类型的支持。按照序列能否存放不同类型对象分类:容器序列list、tuple和collections.deque,这些是容器序列类型,同一个序列对象中可以存放不同类型的数据。扁平序列 str、bytes、bytearray、memoryview和array.array,这些是扁平序列类型,这种一个序列对象中只能容纳一种类型。 容器序列存放的是其所包含的任意类型对象的引用,而扁平序列...

2021-09-16 16:33:05 1176

原创 笔试题------查找积分对

有关整除,倍数等问题可以试试转化成余数来做。这是一道华为的笔试题。本答案仅供参考。#include<bits/stdc++.h>using namespace std;// 计算余数数组,如果配对能成,则两数余数相加一定等于average或0int main(){ int average, N; // 历史平均得分和人数 cin>>average>>N; N = N * 2; // cout<&l..

2021-09-15 22:47:35 472 1

原创 流畅的python笔记(一)Python数据模型

一、python最好的品质之一是一致性没有仔细去查看一致性的具体解释,仅以自己理解,以书上的一个例子来说吧,在python中用len(collection)来得到序列行对象collection的序列长度。len是python的标准库内置函数。对于python中的所有序列数据对象(无论是内置或者自定义类对象),求其长度的方法都是用内置的len函数,而不是有些用collection.size(),有些用collection.length()等。所以当我们看到代码中用了len(collection)时,即便c

2021-09-12 17:37:05 605

原创 python&numpy&torch数据操作

目录python基础数据类型numpy多维数组torch中的Tensortorch中tensor操作算术操作,以加法为例索引操作改变形状运算内存开销Tensor与numpy互相转换tensor 转 numpynumpy转tensortensor可以放到GPU上由于在机器学习领域,python中的基础数据类型一般要转换成numpy中的多维数组或者torch的tensor来计算,本来简要描述其中的一些要点。https://tangshusen.me/...

2021-08-24 23:47:08 1038

原创 python导入模块

python中一个.py文件是一个模块,一个拥有__init__.py文件的文件夹是一个包,也可以认为是一个模块,这两种模块都是可以导入到其它模块中的。首先讲讲普通A.py模块。# A.pydef A1(): print("this is A1")class A2: name = "I am A2"x = "A's member" 如果要在其它模块中使用A.py模块中的类,函数,变量等,需要将模块A导入其它模块,导入方法有精确导入和模糊...

2021-08-24 23:14:55 604

原创 leetcode15. 三数之和

class Solution {public: vector<vector<int>> threeSum(vector<int>& nums) { int len = nums.size(); vector<vector<int>> ans; // 数组长度小于3就不用算三数之和了 if(len < 3) return ans; ...

2021-08-09 13:16:00 84

原创 leetcode322 & 518. 零钱兑换

经典动态规划:考虑最后一步,如果要凑成金额i,最后一步用的是硬币c,那么总共的硬币数就是 dp[i - c] + 1dp[i]是状态数组,含义是凑成金额i最少需要多少硬币。转移方程:dp[i] = dp[i - c] + 1class Solution {public: int coinChange(vector<int>& coins, int amount) { int len = coins.size(); vect...

2021-08-09 10:32:55 134

原创 leetcode572. 另一棵树的子树

主要分两种情况,一种是两棵树有相同的根节点,一种是子树在原树的左子树或者右子树上。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(i...

2021-08-09 09:44:27 233

原创 剑指offer 07. 重建二叉树

https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/二叉树的问题一般都是用递归。这里给出了前序遍历序列和中序遍历序列,要求重建二叉树。我们用一个递归函数func来实现这个功能,func函数六个参数:preorder:前序数组inorder:中序数组pre_left:递归时候用于切分前序数组的左边界pre_right:递归时候用于切分前序数组的右边界in_left:递归时候用于切分中序数组的左边界in_ri

2021-08-08 17:15:33 147

原创 二叉树的层序遍历问题

https://leetcode-cn.com/problems/maximum-width-of-binary-tree/因为二叉树的结构与满二叉树相同,因此可以用满二叉树的编号方式给二叉树中所有结点编号,当然要通过二叉树的层序遍历来实现。如果一个结点编号为i,那么其左孩子编号就是 2 * i,其右孩子就编号成2 * i + 1。比较重要的是为了防止编号越来越大而超过int的表示范围,可以在给每一层编号的时候减去一个统一的偏移量offset需要在for循环外边定义。/** * Defini

2021-08-07 19:44:12 138

原创 leetcode300. 最长递增子序列

动态规划状态数组dp[i]:含义是以nums[i]为结尾的最长递增子序列,这里的意思是这个子序列一定包含nums[i]。状态转移方程:对于所有小于i的索引j,如果nums[j]是小于nums[i]的,那么就可以把nums[i]接上去,形成更长的自增子序列。if(nums[j] < nums[i]){dp[i] = max(dp[i], dp[j] + 1)}class Solution {public: int lengthOfLIS(vector<int&...

2021-08-07 18:39:13 93

原创 leetcode76. 最小覆盖子串

https://leetcode-cn.com/problems/minimum-window-substring/滑动窗口法,用left和right来维护一个滑动窗口。用两个哈希表分别用来存储窗口内的字符以及给定的子串。比较巧妙的地方是用cnt来统计滑窗内有多少个有效字符。tips:写代码的时候老是把right和left当成哈希表的键来用,这种小错误需要谨慎。class Solution {public: string minWindow(string s, string.

2021-08-07 18:22:55 97

原创 leetcode2. 两数相加

两点考虑,第一点,两个链表长度可能不等,第二点,加完以后可能还有最后一个进位。此外,题中构建链表的方法可以,先定义head和tail都指向nullptr,然后第一个插入结点时让head和tail同时指向第一个结点,接下来用tail来滑动增加结点。构造链表的时候一定得用两个指针才行。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ...

2021-08-07 11:25:31 110

原创 leetcode337. 打家劫舍Ⅲ

两个状态数组,且对于树的问题跟数组不一样,状态数组用的是哈希表,键是树结点的指针,值是以这个结点为根节点的树可以偷到的钱的最高金额。两个状态数组,分别表示今晚偷了根节点和没有偷根节点,y表示偷了根节点的情况下偷的最高金额,n表示没有偷根节点的情况下偷到的最高金额。 当今晚偷了根节点,那么肯定没有偷其两个孩子。即: y[root] = g[root->left] + g[root->right] 当今晚没有偷根节点,那么可以偷其两个孩子,也...

2021-08-06 17:09:05 137

原创 leetcode213. 打家劫舍Ⅱ

https://leetcode-cn.com/problems/house-robber-ii/submissions/跟打家劫舍第一题相比就是把房子变成了环状。也就是第一个房子和最后一个房子不能一起偷了。因此可以把偷第1个到第n个房子的问题转换成两个分支,一个是计算偷盗第1个到第n-1个房子,一个是偷第2个到第n个房子。最后看这两个分支哪个钱多,就输出哪一个。注意这里还是用滚动数组来实现的动态规划,降低空间复杂度。class Solution {public: int rob(.

2021-08-06 12:13:52 142

原创 leetcode 198. 打家劫舍

https://leetcode-cn.com/problems/house-robber/状态数组 dp[i]意思是从第0个房屋到第i个房屋能偷到的最高金额。考虑偷盗的最后一步,即偷第i个房子的时候,如果偷了i那么就不偷i-1,那么此时偷到的金额是 dp[i] = dp[i - 2] + nums[i]如果没有偷i,那么dp[i] = dp[i - 1]所以状态转移方程为 dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])初始值为 dp[0.

2021-08-06 10:53:10 107

原创 两数之和变种------找到所有满足条件的数对

一、数对不重复https://www.lintcode.com/problem/587/description方法是排序加双指针,注意在判断两数之和等于target的分支里边,需要进行去重操作。且while中条件一定要用 i < j,因为中间会改变i和j,用 i != j是不准确的。class Solution {public: /** * @param nums: an array of integer * @param target: An inte

2021-08-05 16:33:19 617

原创 leetcode 1605. 给定行和列的和求可行矩阵

https://leetcode-cn.com/problems/find-valid-matrix-given-row-and-column-sums/贪心策略,因为要找到一个可行的非负整数矩阵,我们考虑前边能放元素的时候尽量放上,后边不能放的时候就放0就行。因此矩阵每个位置我们都放上其对应行数组和列数组中的较小值,然后更新行数组和列数组,因为用的是较小值,所以更新以后一定是一个等于0一个大于0。class Solution {public: vector<vector&lt

2021-08-05 10:45:42 377

原创 leetcode 413. 等差数列划分

https://leetcode-cn.com/problems/arithmetic-slices/动态规划,dp[i]的含义是以nums[i]结尾的等差数列的个数则假设nums.size() == 6的话,那么所有的等差字数个数就等于以nums[2] nums[3] nums[4] nums[5]为结尾的等差子数列的个数求和。比如 nums = [1, 2, 3, 4, 5, 6]则以nums[2] = 3结尾的等差数列个数dp[2] = 1,即 1 2 3以nums[3] =.

2021-08-05 10:32:10 158

原创 leetcode 64. 矩阵最小路径和

https://leetcode-cn.com/problems/minimum-path-sum/经典二维dp,但是注意二维dp数组要注意边界问题,即在边上的位置和其它位置处理方法可能不一样,递推公式不一样。class Solution {public: int minPathSum(vector<vector<int>>& grid) { // 二维dp,状态函数的含义是到某个位置上的数字总和最少为多少 if(gr.

2021-08-04 23:17:48 148

原创 leetcode 257. 二叉树的所有路径

https://leetcode-cn.com/problems/binary-tree-paths/只需要从根节点开始深搜,然后如果遇到一个点既没有左孩子也没有有孩子,那就找到了一条路径。深搜的过程中要用一个字符串记录路径。注意temp不能用引用类型的参数,因为深搜的时候搜到某个路径再回溯的时候temp也应该回退到以前的状态,如果temp是引用类型的话,会导致搜索路径回溯以后temp改变了。即分支污染问题。/** * Definition for a binary tree node.

2021-08-04 22:46:38 93

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除