Python入门
Python与其他语言相比的优势
Python与C和Java相比,运行速度较慢。但随着技术发展,CPU运行速度越来越快,性能的瓶颈往往不在CPU的运行速度,而在网络和数据库的调用上。这就和电瓶车与轿车在堵车时的运行速度一样,与车本身的运行速度无关。
Python变量和数据类型
Python中的布尔类型
a = 'python'
print 'hello,', a or 'world' #hello, python
b = ''
print 'hello,', b or 'world' #hello, word
Python之创建tuple
- tuple和list非常类似,但是,tuple一旦创建完毕,就不能修改了。创建tuple和创建list唯一不同之处是用()替代了[]
t = ('Adam','Lisa','Bart')
- 单元素tuple要多加一个逗号,避免歧义
t=(1,)
Python中什么是set
- 创建set的方式是调用set()并传入一个list,list的元素将作为set的元素
- set中的元素不重复且无序
- 用add()可以直接添加,而remove()前需要判断。因为remove()不存在的元素会报错
Python之调用函数
- Python的函数返回多值其实就是返回一个tuple,但可以省略括号,写起来更方便
第一个Python程序
输入和输出
- Python提供了一个input(),可以让用户输入字符串,并存放到一个变量里
>>> name = input()
Michael
Python基础
数据类型和变量
- 整数的地板除//永远是整数,即使除不尽。要做精确的除法,使用/就可以。
使用list和tuple
- 只有1个元素的tuple定义时必须加一个逗号,,来消除歧义
>>> t = (1,)
>>> t
(1,)
使用dict和set
- 要删除一个key,用pop(key)方法,对应的value也会从dict中删除
- 对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。
函数
函数的参数
- *args是可变参数,args接收的是一个tuple;**kw是关键字参数,kw接收的是一个dict。
生成器
- 如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
迭代器
- 凡是可作用于for循环的对象都是Iterable类型;凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
返回函数
- 返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变
def count():
def f(j):
def g():
return j*j
return g
fs = []
for i in range(1, 4):
fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
return fs
序列化
- Pytho语言特定的序列化模块是pickle,但如果要把序列化搞得更通用、更符合Web标准,就可以使用json模块
- json模块的dumps()和laods()函数是定义得非常好的接口的典范。当我们使用时,只需要传入一个必须的参数。
进程和线程
多进程
- 在Unix/Linux下,可以使用fork()调用实现多进程
- 要实现跨平台的多进程,可以使用multiprocessing模块
- 进程间的通信是通过Queue、Pipes等实现的
多线程
- 多线程编程,模型复杂,容易发生冲突,必须用锁加以隔离,同时,又要小心死锁的发生
- Python解释器由于设计时有GIL全局锁,导致了多线程无法利用多核。多线程的并发在Python中就是一个美丽的梦。但可以通过多进程实现多核任务。多个Python进程有各自独立的GIL锁
- 一个ThreadLocal变量虽然是全局变量,但每个线程都只能读写自己线程的独立副本,互补干扰。ThreadLocal解决了参数在一个线程中各个函数之间互相传递的问题
- 在Thread和Porcess中,应当优先选择Process,因为Process更稳定