Python 内部培训
Python简介
快速、高效的开发语言
胶水语言
生态链完善
广泛用于科学计算、数据挖掘等领域
本讲义约定使用Python 版本
版本由于库没有跟上,暂时不推荐使用
语法特色
动态语言特性 — 可在运行时改变对象本身(属性和方法等)
基于C/C++和JAVA,但有很大区别
缩进方式,建议使用空格,不要用TAB
多个语句在一行使用;分隔
注释符是#,多行使用docstring(’’’…’’’)
变量无需类型定义
可进行函数式编程FP
的变迁
编程规范
PEP8 编码规范
Google Python 编码规范
Google Python > PEP8编码规范
开发环境
PyCharm(支持PEP8 语法规范、跨平台、远
程调试、上传…)
IPython
VIM– 主要在linux下使用
其它编辑器
UE,notepad++,editplus…
工欲善其,事必先利其器
开发环境
PyCharm 调试
Ctrl+Alt+S --属性配置
Ctrl+Shift+Alt+L --格式化文件 PPE8
Ctrl+B -- 查看对象
Ctrl+L --查找
Ctrl+N --切换类
Ctrl+Shift+N --切换文件
Shift+F9/F10 --Debug/Run
单击行 --设置断点
工欲善其,事必先利其器
PDB调试
Python –m pdb
b --设置断点 (行,函数名)
s -- step over
n -- next
c --continue
r --run
L --显示代码
Exit()
工欲善其,事必先利其器
字符编码
默认的是OS的本地编码
是unicode内部编码
.py文件第一行:#coding=utf-8,不指定编码
时,文件中包含非ASCII字符会报错
s1 = "中文1"
s2 = u"中文2"
print unicode(s1,'utf-8').encode('gbk')
print ('gbk')
print type(unicode(s1,'utf-8')),type(s2),type(('gbk'))
Hello world
表达式
2 + 3
3 + (7 * 4)
3 ** 5
‘Hello’ + ‘World’
变量赋值
a = 4 << 3
b = a *
c = (a+b)/
a = “Hello World”
x,y = 4+2,”python”
pass 语句 – 不做任何事时使用
if a < b:
pass
else:
c = a
None
Python特有的空值表示
与C/C++中的NULL是不同的
函数没有明确返回的话,默认返回是None
不能与其它类型进行运算
字符串string
str[::], str[0], str[1:2], str[-1:]
find/index() #没有找到子串,前者不会扔出异常
replace(),split(), strip()
“sub” in “str” #是否存在子串
join()
>>>lst = [‘1’, ’2’, ’abc’, ’4’, ’5’]
>>>‘,’.join(lst)
‘1,2,abc,4,5’
列表list
赋值
a = [2, 3, 4] # A list of integer
b = [2, 7, , “Hello”]
c = []
d = [2, [a, b]] # 嵌套列表
e = a + b # Join two lists
操作
x = a[1] # Get 2nd element (0 is first)
y = b[1:3] # Return a sub-list
z = d[1][0][2] # Nested lists
b[0] = 42 # Change an element
print sum(a) # = 9
x = (0) # pop第一个数据
tuple
赋值
f = (2,3,4,5) # A tuple of integers
g = (,) # An empty tuple
h = (2, [3,4], (10,11,12))# A tuple containing mixed objects
操作
x = f[1] # Element access. x = 3
y = f[1:3] # Slices. y = (3,4)
z = h[1][1] # Nesting. z = 4
特色
与list类似,最大的不同tuple是一种只读且不可变更的数据
结构
不可取代tuple中的任意一个元素,因为它是只读不可变更
的,也不能进行像list一样的加法操作
字典dict
赋值
a = { } # An empty dictionary
b = { ’x’: 3, ’y’: 4 } #有点类似json格式
c = { ’uid’: 105,
’login’: ’beazley’,
’name’ : ’David Beazley’
}
操作
u = c[’uid’] # Get an element
c[’shell’] = "/bin/sh" # Set an element
dict2 = (dict1) #使用dict1中的数据去更新dict2
if _key("directory"): # Check for presence of an member
d = c[’directory’]
else:
d = None
d = (“directory”,None) # 带默认值的方式
集合set
>>> set( [“hello”, “world”, “of”, “words”, “of”, “world”]
)
set(['world', 'hello', 'words', 'of'])
如何删除重复数据
Ls1 = [1,3,5,3,7,4,5]
Ls2 = list(set(Ls1))
可以使用&、|求两个set的交集、并集、补集、全集
s1 = set([1,2,3])
s2 = set([2,4])
s1 & s2 #{2}
s1 | s2 #{1,2,3,4}
s1 - s2 #{1,3}
s1 ^ s2 #{1,3,4}
Hello world
if…elif…else语句:
没有switch,有更高级的变通方式(dict字典方式)
if a == ‘+’:
b = ‘+’
elif a == ‘-’:
b = ‘-’
else:
b = None
布尔表达式– and, or, not
if b >= a and b <= c:
print ‘bool is True’
if not (b < a or c > c):
print ‘not expr, value is True’
循环
While..else语句
while a < b:
a = a + 1
else:
print ‘a=’,a
For语句(遍历序列的元素)
for item in [3, 4, 10, 25]:
print item
else:
print ‘final’
# Print characters one at a time
for c in "Hello World":
print c
# Loop over a range of numbers
for i in xrange(0,100,2):
print i
for i in xrange(len(list1)):
print list1[i]
死循环怎么办?
桌面应用可以马上知道,并杀死对应进程
服务器应用怎么去监控?
计数器:在循环的最里面计数,超过指定数值就退出,
缺点太多了
让函数带有超时功能
函数
def语句
def func1(a,b): #没有指针,函数内的数据只能通过返回
‘’’func spec’’’
q = a/b
r = a - q*b
return r
# 调用方式
a = func1(42,5) # a = 2
返回多个值
def func2(a,b):
q = a/b
r = a - q*b
return q,r
x,y = func2(42,5) # x = 8, y = 2
类class
class语句
class Account(object):
#只在__init__中定义成员变量
def __init__(self, initial):
‘’’ Initial Class ‘’’
= initial
#析构
def __del__(self)
pass
#字符串
def __str__(self)
desc=‘Account’
return desc
使用定义好的class
a = Account()
()
(100)
(50)
print ()
模块
程序可分成好几个模块:
一个py文件就是一个模块;
目录下面增加也是
#
def divide(a,b):
q = a/b
r = a - q*b
return q,r
def gcd(x,y):
g = y
while x > 0:
g = x
x = y % x
y = g
return g
import语句
import numbers
x,y = (42,5)
n = (7291823,
5683)
__import__()
动态载入模块
一个模块只载入一次
实例会继承新加载的模
块
异常处理
try语句
try:
f = open(“foo“,”r”)
except IOError:
print "Couldn’t open ’foo’. Sorry.“
Finally BaseException,e:
(e)
raise语句
def factorial(n):
if n < 0:
raise ValueError,"Expected non-negative number"
if (n <= 1):
return 1
else:
return n*factorial(n-1)
沒有处理的异常
>>> factorial(-1)
Traceback (innermost last):
File "<stdin>", line 1, in ?
File "<stdin>", line 3, in factorial
ValueError: Expected non-negative number
文件操作
open()函数
f = open("foo","w") # Open a file for writing
g = open("bar","r") # Open a file for reading
文件的读取/写入
("Hello World")
buff = () # Read all data
line = () # Read a single line
lines = () # Read data as a list of lines
异常处理
try:
f=open(“foo”,”w”)
exception:
XXX
文件操作
With语句
With open(‘foo’) as file:
data=()
大文件—yield
指针?引用?
Python里面没有指针
所有都是对象
对象之间都是引用(引用计数方式)
常用的对象都有cache
默认是浅拷贝,深拷贝代码
import copy
ls1 = [1,”test”,(,7),{“key”:1, “comment”:”your
comment”}]
ls2 = (ls1)
正则表达式
导入模块:
import re
p = (r'ab*', )
p = ('[a-z]+')
map/reduce
云计算的核心算法
Map是将一个大任务拆分为很多个小任务
Reduce则将每个小任务的计算结果进行收集和汇总
Filter 过滤
Python并行
多线程
Python并行
多线程(map)
Python并行
多进程
同步模式(apply_async)
异步模式(apply)
Python并行
多进程(map)
Map 为异步模式
单元测试
unittest模块中的TestCase 类代表测试用例
性能优化
Python的开发效率很高
Python的执行效率很低,比C++和JAVA都
慢
循环/函数调用等很消耗资源
数据结构的性能很高,目前可以认为是优化到
极致
优化方式:
用timeit分析之后优化对应代码
NUMPY与IO优化
使用C模块来替换业务热点
部分地方可以使用map来替代for …in…循环
性能优化
优化实例
未优化版本:
秒
CTYPE优化版本:
秒
Numpy+IO优化版本:
秒
Python程序基础框架
Python程序基础框架
主函数
Python程序基础框架
模块
公共服务:PYTHONPATH
__init__() 做初使化
测试全覆盖
Python哲学
优美胜过丑陋
明确胜过含蓄
简单胜过复杂
复杂胜过难懂
扁平胜过嵌套
稀疏胜过密集