从C说起 在C语言里,普通变量进行赋值,赋的是值,数组赋值,赋的是地址 eg int a = 10; int b = a; ==>a=b=10 a = 20; ==>a=20≠b=10 char c[10] = "apple"; char *d = c; ==>c=d->"apple" c[0] = 'b'; ==>c=d=>"bpple" 在Python中,分为可变变量和不可变变量,传递的都是地址,但是,可变变量的修改会对原始数据造成修改,不可变变量则不会。 不可变变量(互不关心) >>> a = 1 >>> b = a >>> id(a) 140551545594848 >>> id(b) 140551545594848 >>> a = 2 >>> a 2 >>> b 1 >>> id(a) 14055 继续阅读 >>


李余通 18/03/12 22:32:41
为何要编写C扩展 保护核心代码 解决性能瓶颈 创建C一些特有的东西 环境: Linux .13.9-300.fc27.x86_64 Python 3.6.3 开始 目标 这次我么来实习制作Python3的扩展,实现两个功能: 求一个整数的绝对值 求一个字符串的逆序 用c实现这个功能: int my_abs(int n){ if(n<0) n = n * -1; return n; } void my_reverse(char *s){ if(s){ int len = strlen(s); int i; char t; for(int i= 0;i<(len-1)/2;i++){ t = s[i]; s[i] = s[len-1-i]; s[len-1-i] = t; 继续阅读 >>


李余通 18/03/11 22:17:36
Python函数参数 默认参数 def func0(name='lyt'): print(name) func0(); -->lyt func0('zxw') -->zxw 一个坑点 由于默认参数在函数定义第一次被解释器解释时,便计算出了默认参数,因此,如果默认参数是可变类型(列表,字典),则可能不会按照预期的想法进行。 def func1(l = []): l.append('a') print(l) func1(): -->['a'] func1(): -->['a','a'] 故而,使用默认参数时一般使用不可变对象,上面的修改为 def func1a(l=None): if not l: l = [] l.append('a') print(l) 可变参数 分为两种: 包裹位置传递 def func1(*args): print(args) func1 继续阅读 >>


李余通 18/03/08 16:00:34
起因 最近遇到个问题,我的web app经常会504,经过我的分析,504的页面都有一个特性就是会给用户发邮件啊,不过app以前还好着,怎么突然坏了呢,最后百般求证,发现是腾讯云的问题。 腾讯云公告 都怪自己没有留心看消息,直接忽略,栽了大坑。 解决办法 点进去自己填写信息就好了。 作者:baidu_35085676 发表于 2018/03/01 09:01:31 原文链接 https://blog.csdn.net/baidu_35085676/article/details/79407798 阅读:524 继续阅读 >>


李余通 18/03/01 09:01:31
前言 最近微信的跳一跳很火,大家看到排行榜上几百上千的分数,再看看自己百分左右的分数肯定很难过,我手残怪我吗?没关系,如果你跟着我来,也能让你分数霸榜。 原理 首先大家是有一个直观感受,根据两个箱子距离的不同,需要按压的时间也是不一样的,一般来说,一个大胆的猜测是按压时间和距离是成正比的。 这是我们的工作原理: 在跳一跳页面截图 计算出初始点和终点的距离 想办法测出距离与按压时间的系数 想办法让手机按压指定的时间 重复1-4 工具 adb调试工具,它可以辅助截图以及上传截图给电脑,以及控制手机按压位置及时间 python 处理数据 python Pillow库 一个图像库,可以获取图像信息 python matplotlib库 配合Pillow打开图像并记录鼠标点击地方的坐标 准备工作 环境 fedora 27 python3.6 安装 adb调试工具 fedora/centos sudo yum install adb ubuntu sudo 继续阅读 >>


李余通 18/01/04 20:54:33
以前学习python都是马马虎虎,导致很多特性只是知道完全不会用,现在将他们重新学习 可迭代对象(Iterable) 简单来说,所有可以放入for循环中的对象都是可迭代对象,如列表,元组,字符串,字典… 如何判断对象是否是可迭代对象? 实际上,只要实现了__iter__方法的对象就是可迭代对象,这个方法用来返回迭代器本身(特别重要)。 eg: >>> s = "dasda" >>> s.__iter__() <str_iterator object at 0x7f23ebc44470> python提供了方法判断是否是可迭代对象。 >>> from collections import Iterable >>> isinstance(s,Iterable) True 迭代器(Iterator) 似乎和上面的概念很相似。实际上,所有实现了__next__()方法的对象 继续阅读 >>


李余通 18/01/02 19:16:42
题目 现有两个按钮,按下按钮0会执行2x+1,按下1执行2x+2。x初值为0,现要求出任意正整数n应使用何种按法使得x能变成n。 遍历 打眼一看这题就是遍历啊,找所有解法,但是不同于别的简单题,需要你有一个顺序去遍历。递归呗。使用深度优先搜索。 具体如下。 #include<stdio.h> #include<stdlib.h> int success; int max(int s){ int n = 0; int t = 0; while(t<s){ t = t*2+1; n++; } return n; } void print(int arr[],int now){ int i; for(i = 0;i<now;i++){ printf("%d ",arr[i]); } puts(""); } void do_sth(i 继续阅读 >>


李余通 17/12/24 20:49:00
定义 adlist.h typedef struct listNode{ struct listNode *prev; struct listNode *next; void *value; } 可以看出,redis的链表是一个双向链表,拥有前驱和后继,数据域为void型指针,意味着数据域可以指向需要的类型。 管理链表 adlist.h typedef struct list{ listNode *head; listNode *tail; unsigned long len; //节点复制函数 void *(*dup)(void *ptr); //节点释放函数 void (*free)(void *ptr); //节点比较函数 int (*match)(void *ptr,void *key); } 容易看出,为了管理链表,redis定义了一个结构体,会去存储链表头、尾、和长 继续阅读 >>


李余通 17/12/24 20:31:44
两个可能相交的单链表,找出他们的交点 模型 head a1 a2 \ / \ / \ / | | | | tail 注意是单链表,所以他们的形状会是Y型而非X型。 分析 首先,最简单的一种方法是遍历,只是时间复杂度特别高。 简单来说,这两条链表的相交前长度都是不同的,但相交后的长度一致,那么只要想办法让他们从后往前遍历,就很容易找到交点。 - 存数组 - 用栈 其实都是相近的办法,但是栈比较高大上。 那么,就好办了,同时出栈或者同时逆序遍历,遇到下一节点不同的就是交点。 作者:baidu_35085676 发表于 2017/12/21 17:56:11 原文链接 https://blog.csdn.net/baidu_35085676/article/details/78866263 继续阅读 >>


李余通 17/12/21 17:56:11
源码分析章节,我尽量使用原生的redis源码,不去看黄建宏的注释,提高自己阅读源码的能力,此外,redis版本还是3.0 源码下载,大家可以到这 http://download.redis.io/releases/ sdsnew typedef char *sds; sds sdsnewlen(const void *init, size_t initlen) { struct sdshdr *sh; //分配内存 if (init) { sh = zmalloc(sizeof(struct sdshdr)+initlen+1); } else { sh = zcalloc(sizeof(struct sdshdr)+initlen+1); } //分配失败返回NULL if (sh == NULL) return NULL; sh->len = initlen; s 继续阅读 >>


李余通 17/12/19 22:48:51