左值 & 右值 首先还是这个老问题,什么是左值,什么是右值? 最原始的区分就是左值是可以出现在赋值符的左边和右边,然而右值只能出现在赋值符的右边。但是在C++中使用前面的方式来区别左值和右值就不合适了,那么在C++中要怎么区别呢?我的理解是:
左值是一个表示数据的表达式(如变量名或者解除引用的指针),程序可以获取它的地址 。
右值是可以出现在表达式的右边的,但不能对其应用取址运算符的值 。
在 StackOverflow上面看到一个回答 里面使用了个例子:
1 2 3 std ::string a (x) ; std ::string b (x + y) ; std ::string c (some_function_returning_a_string()) ;
Read More
这里只是记录下我对Cluster Expansion的理解,不一定正确。
首先对于直接使用DFT计算所有configuration表面上发生反应(如吸附,基元反应等)的能量是不现实的,耗资源耗时间。那么通过统一的公式对能量进行矫正可以将DFT算得能量进行延伸,得到不同configuration表面的相关能量的近似值,便是一种很方便的方法。
Cluster Expansion 便是一种通过展开的方式将相互作用矫正项表达出来的一种方法。这种方法有点类似线性代数中的使用一组基向量展开,也就类似泰勒展开和傅立叶展开。
Read More
sort方法的参数 首先还是先看看python列表中sort
方法的参数的作用。1 2 3 4 5 In [9 ]: a = ['123' , 'sd' , 'asdfgf' ] In [10]: a.sort?? Docstring: L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE* Type: builtin_function_or_method
sort在python3中有两个可选参数key
, reverse
。reverse
参数就不多说了,那么key
要怎么用?
官方文档中的解释为:
key specifies a function of one argument that is used to extract a comparison key from each list element: key=str.lower
. The default value is None (compare the elements directly).
也就是说key
需要接受一个函数对象,一个可以作为排序依据的对象,这个函数将作用域列表中的所有元素,然后根据这个函数的返回值进行排序。
Read More
自从看了《Effective C++》,我就喜欢上了这种以经验条目的书,简直是随身带的极品书,于是我也买了一本python版的《Effective Python》随时放在书包里,在地铁上,在任何闲下来的时候看,因为每个条目的长度都恰到好处,正好能将零碎的时间进行填充。
因此我想在这里记录下自己在看《Effective Python》中收获的东西。这里我的总结并一定是每个条目中作者想强调的,而是对于我自己在使用python中没有注意到的东西,因此是针对我自己的特制版《Effective Python》总结。
我有预感,这本书能给我在python方面质的飞跃。 - ( ゜- ゜)つロ 乾杯~
Read More
在python中生成器可以很方便的实现迭代协议。生成器通过生成器函数产生,生成器函数可以通过常规的def语句来定义,但是不用return返回,而是用yield一次返回一个结果,在每个结果之间挂起和继续它们的状态,来自动实现迭代协议。也就是说,yield是一个语法糖,内部实现支持了迭代器协议。
生成器的强大之一就在于他提供了协同程序的概念 ,协同程序是可以运行的独立函数调用,可以暂停或者挂起,并从程序离开的地方继续或者重新开始。同时调用者也可以向程序传入额外的数据或者异常等,传入完毕后仍能在上次暂停的地方继续执行。
Read More
迭代器 迭代器是在python2.2中被加入的,它为类序列对象提供了一个类序列的接口 。有了迭代器可以迭代一个不是序列的对象,因为他表现出了序列的行为。当在python中使用for循环迭代一个对象时,调用者几乎分辨不出他迭代的是一个迭代器对象还是一个序列对象,因为python让他(迭代器)像一个序列那样操作。
如何迭代 本质上说迭代器是个对象,但是这个对象有个特殊的方法next()
(在python3中使用__next__()
代替了next方法)。当使用for循环来遍历整个对象时候,就会自动调用此对象的__next__()
方法并获取下一个item。当所有的item全部取出后就会抛出一个StopIteration
异常,这并不是错误的发生,而是告诉外部调用者迭代完成了,外部的调用者尝试去捕获这个异常去做进一步的处理。 不过迭代器是有限制的,例如
不能向后移动
不能回到开始
也无法复制一个迭代器。 因此要再次进行迭代只能重新生成一个新的迭代器对象。
Read More