Q-Logo 我的学习笔记分享

Entries for date "2020"

理解Python的参数传递、变量赋值及可变对象和不可变对象

Python的参数传递,既非按值传递(call-by-value),也非按引用传递(call-by-reference),而是按对象引用传递(call-by-object-reference)或者说按赋值传递(call-by-assignment)。

Python中的赋值可理解为将“变量名”与对象进行绑定。

  • “变量名”并不是对象本身,只是通过赋值与对象进行了绑定,赋值完成后,就可以通过“变量名”来引用对象。
  • 每个“变量名”到对象的绑定有其作用域。

在Python中, list, dict, set 等类型的对象是可变对象,而 str, int, tuple等类型的对象是不可变对象。

  • 对于可变对象,可以通过一些特定操作,“就地”改变其内容,内容改变后,所有引用该可变对象的变量,都会看到此变化
  • 对于不可变对象,任何操作都不能“就地”改变其内容,而只能将内容进行变换生成新的内容,返回新的对象

Python一维线性插值(内插和外插)

Python的numpy和scipy包都提供了线性插值的功能,尤其是后者,还支持外插。

numpy.interp内插例子:

>>> xp = [1, 2, 3]
>>> fp = [3, 2, 0]
>>> np.interp(2.5, xp, fp)
1.0
>>> np.interp([0, 1, 1.5, 2.72, 3.14], xp, fp)
array([3. , 3. , 2.5 , 0.56, 0. ])

scipy.interpolate.interp1d内插和外插例子:

from scipy.interpolate import interp1d

>>> x = [1, 2, 3]

>>> y = [3, 2, 0]

>>> f = interp1d(x,y,fill_value=(3,0),bounds_error=False) # 线性内插

>>> f([0, 1, 1.5, 2.72, 3.14])

array([3. , 3. , 2.5 , 0.56, 0. ])

>>> fe = interp1d(x,y, fill_value='extrapolate') # 线性内插+外插

>>> fe([0, 1, 1.5, 2.72, 3.14])

array([ 4. , 3. , 2.5 , 0.56, -0.28])