参考
函数和常用语法
raw_input 与 input
raw_input
只在 2 中存在,返回字符串,在 2 中,input
返回输入表达式的值;\
3 中 input 返回字符串。
type
查看变量类型
交换两变量值
1 | a, b = b, a |
while/for else 语句
跟 if else 相同,在 while/for 条件为假时执行 else。所以,在未进入循环或循环正常完成后,else 部分会执行,而循环被 break 或出现异常,则不会执行 else。
1 | for value in ["Sat","Sun","Mon"]: |
yield 关键字
在函数中使用 yield 关键字让函数返回一个 生成器。 该生成器调用方式十分奇特,类似于断点调试,在调用其 next()
方法时运行到 yield 关键字处并返回参数,可多次调用直到函数结束(抛出 StopIteration 异常)。可以在函数中使用多个 yield,就像设置多个断点。隐含的一个特性是,每次只能取到下一个值,而不能回退取到上一个值。通常用 for/while
循环使用生成器,以代替循环调用 next()
,
1 | def gen(stop): |
sign 函数
1 | sign = lambda a: 1 if a > 0 else -1 if a < 0 else 0 |
print 不换行
python2 中 print 不换行,python3 中使用参数 end=''
1
print("Hello World", end='')
dict 键列表
使用 list(dict)
获取 dict
的键列表
惯用处理
pip 更换仓库源
1 | pip install numpy -i http://pypi.mirrors.ustc.edu.cn/simple/ # 临时用中科大源安装numpy |
pip 下载安装包并离线安装
1 | # 只下载包 |
从文件路径获取文件名与扩展名
1 | import os |
时间
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 | import numbers |
读 excel 表
1 | import xlrd |
生成随机数
random
1 | import random |
正态随机
生成正态随机数列可用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 | # range(stat=0,stop,step=1) |
列表推导式
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 | list.append(x) # 追加到末尾 |
判断元素存在
1 | x in list # 返回 bool 类型,是否存在 x |
按索引查元素
索引可为负,范围: [-len, len-1]
按元素查索引
1 | list.index(x) # 第一次出现 x 位置,如果 x 不存在会报错 |
删除元素
1 | del list[index] # 删除 index 处元素 |
反转
1 | list.reverse() |
zip 合并
1 | zip(la,lb,lc) # “同索引元素”组成元组,构成列表,长度为输入最短列表的长度 |
模块
一个模块是一个源文件,文件名即模块名。模块由 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 | # sys.path 列表存储了模块搜索路径 |
搜索路径初始包括:
- 运行脚本目录
- 环境变量 PYTHONPATH 中存储的值
- Python 模块的安装目录
dir()
1 | dir() # 返回当前模块定义的对象名列表 |
模块安装
三种方式:
进入下载安装包目录,运行 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 | def run(): |
global 与 nonlocal 语句
如果想在子级作用域中让上级作用域变量指向其他对象,可以用 global
与 nonlocal
语句。
1 | x, y = 0, 0 |
global
最先出现,用于在局部引用全局变量,随后又加入 nonlocal
,使子级作用域引用 非全局的 上级变量。
类变量与实例变量
类变量的定义与访问其中两种方式:
class_name.class_var
- 类定义内方法定义外
class_var
实例变量定义与访问有两种方式:
obj_name.obj_var
- 在有
self
参数的方法定义中self.obj_var
用访问实例的方式可以访问类变量,就像 在子级作用域访问上级变量,只能访问而不能让其指向另一个对象,而且如果实例变量与类变量同名则访问实例变量。
1 | class cls: |
字符串
模板
类似 C 语言的格式化字符串,用 % 号连接模板字符串(Template)与匹配元组。
1 | '%s is a string. %d is a int.' % ("Hello World", 0) # 该表达式返回一个字符串 |
原生字符串(常量)
在字符串字面量前加 r ,会使之成为原生字符串字面量,不会对字符进行转义。
1 | r"\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 | def fun(a, b=1, *c, **d): # 函数定义时形参须根据类型按序定义 |
常识
元组
- 元素不能改变
False
判断语句中None,False,空字符串””,0,空列表[],空字典{},空元组()都相当于False
虚拟环境
1 | sudo pip3 install virtualenv |
文件操作
当前目录
1 | import os |
简单文件读写
1 | col = [] |
在控制台运行源文件
1 | execfile('python_code.py') |
错误及解决办法
pip安装出现SOCKS支持问题
报错Missing dependencies for SOCKS support
。在Ubuntu下,用unset all_proxy && unset ALL_PROXY
命令解除代理设置。