多项式数据结构:
1 | typedef struct polyNode *polyNodePtr; |
多项式加法操作:
1 | polyNodePtr polyAdd(polyNodePtr a, polyNodePtr b) |
多项式销毁:
1 | void erase(polyNodePtr *p) |
代码:poly_list.c
多项式数据结构:
1 | typedef struct polyNode *polyNodePtr; |
多项式加法操作:
1 | polyNodePtr polyAdd(polyNodePtr a, polyNodePtr b) |
多项式销毁:
1 | void erase(polyNodePtr *p) |
代码:poly_list.c
最大子列和问题
最简单、时间复杂度为O(n^3)的实现方法
1 | def get_max_sum_subset_n3(x): |
时间复杂度为O(n^2)的实现方法
1 | def get_max_sum_subset_n2(x): |
速度最快、时间复杂度为O(n)的实现方法
1 | def get_max_sum_subset_n(x): |
Reference: 解读C的声明
发现一个解读C语言声明的好方法, 记录下来以备后患.
先上一组解读例子:
1 | int hoge; |
这种格式化的翻译不是真正的英语, 前期靠这种方式理解C语言声明确实很low, 不要着急, 熟练之后再鄙视吧。
基本元素的翻译:
func is pointer to function returning int
这句话也不好理解, 再稍加润色一下就是:
func is a poniter that point to the function that returning int
翻译成中文就是:
func 是 指向 返回int的函数 的指针
练习:char *name[10]
name is array[10] of pointer to char
name 是 指向char 的 数组double *d
d is pointer to double
d 是 指向 double类型 的 指针
。。。
Reference: answer on stackoverflow
大多数的语言中,class是一段描述如何创建对象的代码,python也是这样,不过python中的class不仅仅是这样,它本身也是一个对象。
作为一个对象,你就能对它进行如下操作:
你可以随意的创建一个class,就想任何其他对象一样的。你可以在函数中创建一个对象并将它返回,这并不是很‘动态’,因为这样只不过class的定义写进函数中而已,
当你使用class关键字时,python就会自动创建一个class对象。python提供了一个手动创建class对象的方法——type()
1 | type(object) # 返回对象的type |
以上是我们熟悉的用法,但是type()
还有一个功能——创建class对象。
1 | type(classNamem classParentTuple, classAttributeDictionary) # 返回一个新的type(class对象) |
给class对象绑定方法
1 | def echoBar(self): |
任何对象都是由class或metaclass所创建的,class对象就是由metaclass创建的
type
类似于str
(用来创建string实例的class),int
(创建整数对象的class),它就是python用来创建所有class对象的metaclasstype
是内置的metaclass,你也可以创建自己的metaclass
通过设置class的__metaclass__
属性来指定创建class对象所使用的metaclass,metaclass的值可以是任何可调用的对象,包括函数,
python会去查找metaclass所指定的对象,如果找不到,python将会使用type
来创建class对象。查找的顺序是1.在class内部查找;2.在模块内查找;
3.在父类中查找
小心!
__metaclass__
属性不会被继承!metaclass所指定的对象必须要能创建一个class对象!
使用metaclass的目的是在创建class对象的时候做一些操作,就想在创建类实例的时候,自动调用init来做一些操作。
举一个‘愚蠢’的例子来说明,在创建class对象的时候自动将所有自定义的attribute改成大写字母(显然没什么卵用),现在我们来通过设置metaclass来实现该目的。
通过函数
1 | def upper_case(futrue_class_name, futrue_class_parent, future_class_attribute): |
通过class
1 | class UpperAttrMetaclass(type): |
__new__
和__init__
差不多,后者是在创建实例时自动被调用,前者则是在创建class对象是被调用,__new__
中第一个参数是class对象本身,
就像class方法第一个参数self是实例本身一样,定义如此,不必在意
好了,这就是所有有关metaclass的概念了
metaclass属性可以是任何可调用的对象,那为什么要使用class,而不是function呢?class明显要复杂的多,自己找虐吗?
__new__``__init__``__call__
,你可以将所有的操作都放在__new__
方法中(因为它是最先调用的方法),但是分开操作更有意义一些 为什么使用这种不起眼而且易出错的特性?
你根本不用关心metaclass,因为99%的人都用不上,如果你想知道你为什么用这个特性,那么你就是那99%中的一员…
如果你实在想知道,可以举一个使用metaclass的例子来说明一下:
在web框架django中,我们这样定义model:
1 | class Person(models.Model): |
然后我这样使用model:
1 | guy = Person(name="Jerry Young", age=23) |
定义时age是一个models.IntegerField对象,而打印出来却是一个int,这就是因为创建Person class对象时使用了metaclass做了一些操作。
1.你应该清楚class是对象,也可以用来创建对象;class本身就是metaclass的实例对象;python所有的东西都是对象,他们都是class或metaclass的实例,除了type
;type
是它自己的metaclass
2.你应该清楚metaclass是很复杂的,你可能不会想在简单的代码逻辑中使用它,你可以使用两种类似功能的技术:
想通过ssh连上你的raspberry pi就应该使你的电脑和raspi处在同一个网段下(你的raspi有独立IP当我没说), 那么首先想到的就是把它们都连接到同一个路由器上, 如果手边没有路由器的话, 其实你也可以直接用一根网线直接连接你的电脑和raspi!
不就是一根网线么? 有什么好讲的? 是这样的, 笔者之前上网搜索的时候, 看过一篇帖子:Raspberry与笔记本直连, 里面有个人说
camark
发表于 2013-1-10 15:51:24 |只看该作者
肯定不行。双机直连需要特殊的网线,而且要设置在一个网段。。
笔者当时就有点失望, 不过也硬着头皮随便找了一根网线, 最后也成功了, 最后也没有深究那个人说的是否是对的, 因此, 在此强调, 照着本文操作, 可能面临的风险
其实也就是新建一个网络连接, 以Ubuntu 15.04为例子, 打开网络连接(屏幕右上角双箭头或wifi标志处), 点击编辑连接, 点击新建连接后如下图所示:
选择Ethenet(以太网), 点击创建, 在弹出来的框框中点击IPv4 Settings选项卡, Method栏选择Automatic (DHCP), 图如下:
至此, 网络设置就OK了
把网线的一头插笔记本, 一头插raspi, 点击上步新建的网络连接, 等待连接建立成功, 不出意外, 连接成功了! 出意外的肯定是网络连接没设置好或者网线是坏的(这tm不是废话么…)
连接建立后你可以查看一下笔记本的连接信息, 找出你的笔记本IP地址, 注意! 是查看你连接raspi的网络连接的IP地址, 而不是如果你连了wifi的IP地址!
假设你的笔记本IP地址是 10.42.0.1 , 使用nmap查找同网段所有主机IP地址, 在终端下键入nmap 10.42.0.1/24
, 等待片刻你会发现有两台主机, 一台你的笔记本, 一台就是raspi, 还可以看到有哪些端口打开着. 至于nmap, 你需要自行安装, 一般终端键入sudo apt-get install nmap
即可, 好了, 拿到你的raspi的IP, 就OK了, 接着键入ssh pi@raspi的IP地址
, 默认密码raspberry