python一些需要注意的点
通过使用python对机器学习里一些算法的实现,发现自己对python的一些语言特性比较模糊,虽然不用像做python开发一样任何细节都要知道,但是我们经常接触到的,经常使用的语法,你真的清楚吗?
区分 class 的类变量和实例变量:
class A(object): epoch = 0 def __init__(self,reg=0.0): self.reg = reg self.__name = "smile" def find(self): pass def __merge(self): pass
如上面代码所示,在类的
__init__
方法里 ,self.reg
和self.__name
都是类的实例变量,只是后者是私有变量,只能类内访问。epoch
是类变量,即所有实例都共享这一个变量,一个实例修改了此变量,则反映到所有实例当中。区分类的私有方法和公有方法:
上面代码里,__merge()
是私有方法,find()
公有方法。
from … import 和 import区别:
>>> import numpy >>> numpy.array([1,2,3,4]) array([1, 2, 3, 4])
>>> from numpy import * >>> array([1,2,3,4]) array([1, 2, 3, 4])
看到区别了吧,用
from ... import
对于我们来说,操作更加方便。函数的参数:
参数类型有4种:必选参数、默认参数、可变参数、关键字参数
1.必选参数
def f(x): pass
2.默认参数
def f(x,y=0): pass
注意!如果有必选参数,必选参数必须在默认参数前面。当不按顺序提供部分默认参数时,需要把参数名写上。定义默认参数要牢记一点:默认参数必须指向不变对象!具体可参考廖雪峰python教程
3.可变参数
下面代码引自廖雪峰python 里面对参数的讲解。廖雪峰python教程
def calc(*numbers): sum = 0 for n in numbers: sum = sum + n * n return sum
>>> calc(1,2) 5 >>> calc() 0 >>> nums = [1,2,3] >>> calc(*nums) 14
可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。这些参数在函数调用时自动组成一个tuple。
4.关键字参数
关键字参数允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组为一个dict。def person(name, age, **kw): print 'name:', name, 'age:', age, 'other:', kw
>>> person('Michael', 30) name: Michael age: 30 other: {} >>> person('Adam', 45, gender='M', job='Engineer') name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'} >>> kw = {'city': 'Beijing', 'job': 'Engineer'} >>> person('Jack', 24, **kw) name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
注意!!当参数组合时,顺序必须是:必选参数、默认参数、可变参数和关键字参数 。必须确保四个参数的相对顺序正确,即 可以是 必选参数,关键字参数。
作用域
这篇文章讲的python作用域很好。
python里没有块级作用域
但是有局部作用域,即函数里
python有作用域链,会由内向外找
在函数未执行之前,作用域已经形成了,作用域链也生成了