参考
函数和常用语法
raw_input 与 input
raw_input 只在 2 中存在,返回字符串,在 2 中,input 返回输入表达式的值;
3 中 input 返回字符串。
type
查看变量类型
交换两变量值1a, b = b, a
while/for else 语句
跟 if else 相同,在 while/for 条件为假时执行 else。所以,在未进入循环或循环正常完成后,else 部分会执行,而循环被 break 或出现异常,则不会执行 else。
1
2
3
4
5
6for value in ["Sat","Sun","Mon"]:
if value == "Sun":
print("Bingo!")
break
else:
print("No Sunday.")
yield 关键字
在函数中使用 yield 关键字让函数返回一个 生成器。 该生成器调用方式十分奇特,类似于断点调试,在调用其 next() 方法时运行到 yield 关键字处并返回参数,可多次调用直到函数结束(抛出 StopIteration 异常)。可以在函数中使用多个 yield,就像设置多个断点。隐含的一个特性是,每次只能取到下一个值,而不能回退取到上一个值。通常用 for/while 循环使用生成器,以代替循环调用 next(),
1
2
3
4
5
6
7
8
9
10
11def (stop):
print "step in"
for i in range(stop):
yield i
print "yield %g" % i
i += 1
g = gen(3) # 函数返回一个生成器
print "called gen" # 在调用 g.next() 方法前,gen 内代码不会执行
for i in g:
print i
sign 函数1sign = lambda a: 1 if a > 0 else -1 if a < 0 else 0
print 不换行
python2 中 print 不换行,python3 中使用参数 end=''1print("Hello World", end='')
dict 键列表
使用 list(dict) 获取 dict 的键列表
惯用处理
pip 更换仓库源1pip install numpy -i http://pypi.mirrors.ustc.edu.cn/simple/ # 临时用中科大源安装numpy
pip 下载安装包并离线安装1
2
3
4# 只下载包
pip download -d ./download_packs_dir -r ./requirements.txt
# 只安装
pip install --no-index --find-links=./download_packs_dir -r ./requirements.txt
从文件路径获取文件名与扩展名1
2
3
4import os
filepath = '/tmp/log.txt'
filename = os.path.basename(filepath) # 文件名
print(os.path.splitext(filename)) # 分离扩展名
时间
datetime 与 字符串相互转换1
2
3
4
5from datetime import datetime
id_s = "337259199211056344"[6:14] # 身份证号
d = datetime.strptime(id_s, '%Y%m%d')
print((datetime.now() - d).days) # 距今多少天,datetime相减得delta对象
print(d.strftime('%Y-%m-%d')) # datetime 格式化输出字符串
判断对象为数字1
2
3import numbers
x = 1
print(isinstance(x, numbers.Number))
读 excel 表1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16import xlrd
def read_excel(excel_name, sheet_name):
bk = xlrd.open_workbook(excel_name)
sh = bk.sheet_by_name(sheet_name)
nrows = sh.nrows #获取行数
ncols = sh.ncols #获取列数
print("excel %s, sheet %s, nrows %d, ncols %d" % (excel_name, sheet_name, nrows,ncols))
row_list = []
for i in range(0, nrows): #获取各行数据
row_data = sh.row_values(i)
row_list.append(row_data)
return row_list
生成随机数
random1
2
3
4import random
random.random() # 0 到 1 小数
random.randint(m,n) # m 到 n 整数
random.sample(list, n) # 从 list 不放回抽样 n 个,返回列表
正态随机
生成正态随机数列可用numpy.random.normal(mu, sigma, sample_num)
正则
匹配例子1
2
3import re
str = "截止日期:2016-7-11 2:44:29。余额:137533。逾期金额:28747。"
print(re.findall(r"余额:(.+?)。", str))
list 操作
range()1
2
3
4
5# range(stat=0,stop,step=1)
range(10) # 返回 0 到 9 列表
range(1,10) # 返回 1 到 9 列表
range(1,10,2) # 返回以 2 为步长 1 到 9 列表
range(0,-10,-1) # 返回 0 到 -9 列表
列表推导式1[x**2 for x in range(10)] # 创建一个新 list
切片
list 切片作为右值,会复制数据并返回引用。而对切片的修改会直接作用于原 list 上。1
2
3
4
5
6
7# list[start:stop:step], 用法类似 range,如果意义明确,可省略参数
# 索引可为负,可以超出范围
la = lb # 只能复制引用
la = lb[:] # 复制数据,返回引用给 la
lb[::-1] # lb 逆序列表 copy
lb[-2:-1] = [2, 4] # 将 lb 最后两个数赋为 2, 4
del lb[0:2] # 删除 lb 第 0、1 号元素
增加元素1
2
3
4list.append(x) # 追加到末尾
list.insert(i, x) # 插入到 i 处
la = lb + lc # 创建一个新 list,顺序加入 lb、lc 中元素
la.extend(lb) # 在 la 中依次添加 lb 中元素
判断元素存在1
2x in list # 返回 bool 类型,是否存在 x
list.count(x) # 返回 x 出现次数
按索引查元素
索引可为负,范围: [-len, len-1]
按元素查索引1list.index(x) # 第一次出现 x 位置,如果 x 不存在会报错
删除元素1
2
3
4del list[index] # 删除 index 处元素
list.remove(x) # 删除 x 元素,如果不存在会报错
list.pop(index=-1) # 返回并删除 index 处元素
# 直接用切片复制保留元素到新列表中,也是一种方法
反转1list.reverse()
zip 合并1
2zip(la,lb,lc) # “同索引元素”组成元组,构成列表,长度为输入最短列表的长度
[a + b for a,b in zip(la,lb)]
模块
一个模块是一个源文件,文件名即模块名。模块由 import 语句加载后,便可以访问其中定义的对象。
import 与 from import
当 python 解释器 import 一个模块时,会执行其中的代码。1
2import module # 加载 module,使用其中对象时应该用 module.obj
from module import obj # 加载 module,只能使用 obj 对象,不用加 module 前缀
__name__ 属性
当 python 解释器加载一个模块时,会设置每个模块的属性 __name__。 只有当前运行模块的该属性被设置为 __main__,所以可用以下语句判断当前模块是否是程序入口1
2if __name__ == "__main__":
pass
模块搜索路径1
2
3# sys.path 列表存储了模块搜索路径
import sys
sys.path # 可修改该列表以修改模块搜索路径
搜索路径初始包括:
运行脚本目录
环境变量 PYTHONPATH 中存储的值
Python 模块的安装目录
dir()1
2dir() # 返回当前模块定义的对象名列表
dir(module) # 返回 module 定义的对象名列表
模块安装
三种方式:
进入下载安装包目录,运行 setup.py 程序:1
2
3
4
5
6
7# 源码安装
cd download_dir
python setup.py install # 运行 setup.py 安装程序
# 用 pip 安装,自动安装依赖包
pip install PackageName
# 用 easy_install 安装,不推荐使用
easy_install PackageName
win下 Anaconda 安装依赖包
进入Anaconda安装目录1
2
3cd Scripts
pip install PackageName -i https://pypi.tuna.tsinghua.edu.cn/simple/
# -i 后接国内镜像地址url,提升速度
更换conda源(清华):1
2conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes
包
是一个包含 __init__.py 的文件夹,导入模块时需要加上包前缀,类似 Java。
作用域
三大作用域
只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如if、try、for等,甚至列表推导式也是)不会引入新的作用域
子级作用域与上级
在子级作用域可访问上级作用域变量。让上级变量指向另一个对象不能使用语句 same_name = obj, 该句被视为在子级作用域定义一个同名变量,并隐藏了上级变量。
1
2
3
4
5
6
7def run():
print("read y: %d" % y) # 读取全局变量
x = 1 # 创建一个局部变量 x
x, y = 0, 0
run()
print("global x: %d" % x)
global 与 nonlocal 语句
如果想在子级作用域中让上级作用域变量指向其他对象,可以用 global 与 nonlocal 语句。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18x, y = 0, 0
def outer():
# nonlocal x 这样声明会报错,python 不能找到非全局的上级变量 x
x, y = 1, 1
def inner():
nonlocal x
x = 2
global y
y = 2
inner()
print("outer:", x, y)
outer()
print("global:", x, y)
# 输出:
# outer: 2 1
# global: 0 2
global 最先出现,用于在局部引用全局变量,随后又加入 nonlocal,使子级作用域引用 非全局的 上级变量。
类变量与实例变量
类变量的定义与访问其中两种方式:
class_name.class_var
类定义内方法定义外 class_var
实例变量定义与访问有两种方式:
obj_name.obj_var
在有 self 参数的方法定义中 self.obj_var
用访问实例的方式可以访问类变量,就像 在子级作用域访问上级变量,只能访问而不能让其指向另一个对象,而且如果实例变量与类变量同名则访问实例变量。
1
2
3
4
5
6
7
8
9
10class cls:
v1 = 0 # 定义类变量
def __init__(self):
self.v1 = 1 # 定义实例变量,隐藏同名类变量
cls.v2 = 0 # 定义类变量
obj = cls()
print cls.v1, cls.v2 # 访问类变量
print obj.v1, obj.v2 # 分别访问实例变量 v1 与类变量 v2
字符串
模板
类似 C 语言的格式化字符串,用 % 号连接模板字符串(Template)与匹配元组。
1
2
3
4'%s is a string. %d is a int.' % ("Hello World", 0) # 该表达式返回一个字符串
# 也可将元组替换成字典,模板对应加入 (key)
"I'm %(name)s, and I love %(num)g." % {"num":math.pi, "name":"Mike"}
原生字符串(常量)
在字符串字面量前加 r ,会使之成为原生字符串字面量,不会对字符进行转义。
1r"n" == "\n" # 返回 True
加操作
字符串只允许与字符串进行加操作
函数参数
参数传递
函数形参(函数定义参数)复制了实参(传入函数的变量)的引用,类似 Java,对形参引用对象的修改实际上在修改实参引用对象,但让形参指向其他对象不会对实参有影响。
缺省与变长
函数参数的定义顺序与调用顺序应该遵循:关键字参数–>缺省参数–>变长参数–>关键字参变长数
关键字参数
最基本的一类参数,调用时可指明形参名(关键字)。与其他参数不同,必需赋值。1
2
3
4
5
6
7def fun(a, b):
print a, b
fun(1, 2) # 一般调用方法
fun(b=1, a=2) # 指明形参名可乱序
fun(1, b=2) # 可行
fun(1, a=2) # 这样调用出错
fun(a=1, 2) # 同样出错
缺省参数
缺省参数有缺省值。除了顺序在关键字参数后以及有缺省值外,与关键字参数基本相同。1
2
3def fun(a, b=2): # b 为缺省参数
print a, b
fun(1, 2)
变长参数
参数个数不定,形参最终得到元组,调用时可不传,一个个传递或传一个元组。1
2
3
4
5
6def fun(a, *b): # b 为变长参数
for i in b:
print a + i
fun(1, 2, 3)
fun(1, *(2, 3)) # 用元组传递变长参数,加星号,称作解包
fun(1) # 不传或解包空元组都可行
关键字变长参数
参数个数不定,而且必须指明关键字。形参最终得到字典,与变长参数类似,调用时可不传,一个个传递或传一个字典。1
2
3
4
5def fun(**kwargs):
for k, v in kwargs.items():
print "get " + k + "=" + str(v)
fun(a=1, s="hi")
fun(**{"a": 1, "s": "hi"}) # 字典解包,注意关键字必须为字符串
参数顺序1
2
3def fun(a, b=1, *c, **d): # 函数定义时形参须根据类型按序定义
pass
fun(1, 2, 3, d1=4) # 函数调用时也根据类型按序传入
常识
元组元素不能改变
False
判断语句中None,False,空字符串””,0,空列表[],空字典{},空元组()都相当于False
虚拟环境1
2
3
4
5
6sudo pip3 install virtualenv
# 创建虚拟环境,python3,无已安装包
virtualenv -p python3 --no-site-packages venv
source venv/bin/activate # 激活
pip freeze > requirement # pip freeze
deactivate # 退出虚拟环境
文件操作
当前目录1
2import os
os.getcwd()
简单文件读写1
2
3
4
5
6
7
8
9col = []
with open('file_path.csv', 'r') as df:
for line in df:
tmp = line.strip().split(',')
col.append(int(tmp[3])) # 读取第4列
with open('out_path', 'w') as df: # 'a' 追加
for val in col:
df.write("%dn" % val)
在控制台运行源文件1execfile('python_code.py')
错误及解决办法
pip安装出现SOCKS支持问题
报错Missing dependencies for SOCKS support。在Ubuntu下,用unset all_proxy && unset ALL_PROXY命令解除代理设置。