- python函数参数
- 位置参数——power(x, n)里的x和n
- 默认参数——power(x, n=2)里的n
- 必选参数在前,默认参数在后
- 默认参数必须指向不变对象
- 可变参数——calc(*numbers)里的numbers
- 调用calc——calc(1, 2)
-
>>> nums = [1, 2, 3] >>> calc(*nums)
- 关键字参数——person(name, age, **kw)里的**kw
- 这些关键字参数在函数内部自动组装为一个dict
-
def person(name, age, **kw): print('name:', name, 'age:', age, 'other:', kw) >>> person('Michael', 30) name: Michael age: 30 other: {} >>> person('Bob', 35, city='Beijing') name: Bob age: 35 other: {'city': 'Beijing'} >>> person('Adam', 45, gender='M', job='Engineer') name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
-
**extra
表示把extra
这个dict的所有key-value用关键字参数传入到函数的**kw
参数,kw
将获得一个dict,注意kw
获得的dict是extra
的一份拷贝,对kw
的改动不会影响到函数外的extra
- 命名关键字参数——person(name, age, *, city, job)里的city、job
- 只接收
city
和job
作为关键字参数 - 如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符
*
了 - 命名关键字参数必须传入参数名
- 只接收
- 参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
- python面向对象
- __init__方法初始化属性
- 类中定义的函数第一个参数永远是实例变量self
- 属性名字前面有__两个下划线,表示是私有变量,外部就不能访问了
- 属性名字前面有_一个下划线,表示约定该变量最好不要被外部访问,但是没有强制
- python - 动态语言 - 鸭子类型——不严格的继承体系
- isinstance() 和 dir()
- 类似
__xxx__
的属性和方法在Python中都是有特殊用途的,比如__len__
方法返回长度。在Python中,如果你调用len()
函数试图获取一个对象的长度,实际上,在len()
函数内部,它自动去调用该对象的__len__()
方法 - 由于Python是动态语言,根据类创建的实例可以任意绑定属性
-
class Student(object): def __init__(self, name): self.name = name s = Student('Bob') s.score = 90
- 不要对实例属性和类属性使用相同的名字
__slots__
变量,限制该class实例能添加的属性,对继承的子类没有用- Python内置的
@property
装饰器负责把一个方法变成属性调用 - 多继承
-
class Dog(Mammal, Runnable): pass
-
-
__str__、__iter__、__getitem__、__call__
- 使用元类
- type()
- metaclass允许你创建类或者修改类。换句话说,你可以把类看成是metaclass创建出来的“实例”。
- 进程与线程
-
对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。
有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(Thread)。
-
Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global Interpreter Lock,任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。
-
Python虽然不能利用多线程实现多核任务,但可以通过多进程实现多核任务。多个Python进程有各自独立的GIL锁,互不影响。
-
单线程的异步编程模型称为协程
-