生命苦短,我用 python
Python是一种功能强大的语言,有着功能丰富的第三方包,推崇功能齐全的理念,被广泛用于多种场景下。
*nix系统默认的已经内置了一个python,可通过 python -V
检测:
python文件类型分3种,均可直接执行
- 源码 .py, 唯一可编辑的代码类型
- 字节码 .pyc,源码编译获得
# 通过python脚本来编译一个源码文件
import py_compile
py_compile.compile('hello.py')
- 优化代码 .pyo,源码优化获得
# python解释器输出优化代码
python -O -m py_complie hello.py
python程序分package、module、function三个层次
- 包即目录,由
__init__.py
文件(必选) 和 多个模块文件组成 - 模块即py文件,其中可包含:代码、函数、类,
python语法示例
第一行注释(组织行)用于指定解释器,第二行注释用于指定编码从而中文支持
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os, sys
help('类名') #模块均可通过help函数帮助文档
## 控制语句,python没有switch ##
input1 = int(input('请键入数字'))
if input1 == 1:
print 'a';
elif input1 == 2:
print 'b';
else
del input1 #删除变量
while int(input('请输入小于4的数字')) < 4:
print 'OK';
else:
print '输入错误';
for x in range(0, 24 , 1):
print x
## 字符串 ##
str1 = 'hello world'
str1.startswith('hello')
'hello' in str1
str1.find('hello')
## python的三种序列类型 ##
list1 = ['student', 'teacher'] # list列表,可变类型,传统意义的数组
tuple1 = ('student', 'teacher') #tuple元组,不可变类型,单个元素的元组必须跟一个逗号以区分
dict1 = {'role1':'student', 'role2':'teacher'} # 字典,键值对
#列表操作
','.join(list1)
list2 = list1[:] #一份全量拷贝,非refer
list1.append('xxx')
#元组操作
print '%s and %s' % tuple1 #格式化输出
#字典操作
for role, title in dict1.items():
print 'xxx'
if 'role1' in dict1:
print 'xxx'
if dict1.has_key('role1'):
print 'xxx'
## 生成器Generator ##
* 将迭代数据转为数据算法:每次迭代,临时挂起循环,弹出一个值立即进入使用,使用结束继续下一次迭代
* 生成器使用循环来使用其数据,`for`循环内部通过`next()`方法机制获得生成器中下一个值
* 创建Generator:
- 简单Generator基于列表生成式改造: var1 = (x * x for x in range(100))
- 复杂Generator可用`yield` 关键字函数
## 函数 ##
# 函数不明确指定,则默认 `return None`
# 可以从函数的第一行开始定义docstring文档字符串,多行字符串形式,首行大写字母开始句号结尾,第二行空行,第三行描述,通过 `__doc__` 来调用docstring
def welcome(name, from, to='usa'):
print 'welcome ', name, ' from ', from, ' to ', to;
welcome(name='tom', from='china') #关键参数式调用
# *前缀多余函数参数会作为元组存储在args; **前缀多余函数参数会作为字典存储在args
def powersum(arg1, *args):
print args;
## 模块 ##
#import导入的对象将从`sys.path`中搜索相应的`.py`模块,并运行其主块的语句
import 模块 #单一的导入模块, 可读性好,同时没有名字冲突
from 模块 import 符号表 # 这种导入形式是不推荐
import sys
sys.argv #命令行参数列表,第一个元素为脚本名称,其后元素为传入参数
sys.path #模块的搜索路径列表(同PYTHONPATH环境变量),第一个空字符串元素代表当前目录
#__name__常量能获得当前模块名,当模块被直接python解释执行而非导入时,模块名设为 '__main__'
if __name__ == '__main__':
print 'current is in main module'
dir('sys') #dir函数返回sys模块的符号表,不指定模块则返回当前模块的信息
# 注意事项
* 模块私有变量和函数约定加_、 __ 下划线前缀
* 模块搜索路径(sys.path变量):当前目录、内置模块、第三方模块
* 增加模块搜索路径
- `sys.path.append(xxx)`
- 修改`PYTHONPATH`环境变量
## 面向对象 ##
#对象所有成员都是公共的
# 特例:__打头的变量是实际私有的,_打头的变量是惯例上认为的私有
class Foo
count = 1 #类变量
def __init__(self, name):
self.name = name #对象变量
def welcome(self, name):
print 'hi, ' + name
#继承
class Foomore(Foo)
def say(self, words)
print words
foomore = Foomore('Tom')
foomore.welcome()
## 文件处理 ##
file1 = file('test.dat', 'w')
file1.write('xxxx')
while True:
line = fiel1.readline()
if len(line) == 0: break; #当行语句
file1.close()
## 异常 ##
import sys
try:
s = input('请输入')
except EOFError, e:
print '程序退出'
sys.exit()
except:
print '程序有异常'
## 列表综合 ##
listone = [2, 3, 4]
listtwo = [2*i for i in listone if i > 2] #listone中所有大于2的数都是原来的2倍的列表
## lambda ##
#lambda语句用来创建新的函数对象
def make_repeater(n):
return lambda s: s*n #lambda需要一个参数,后面仅跟单个表达式作为函数体
twice = make_repeater(2)
print twice('word') #word作为s参数传入lambda
注意事项
- 变量与简单标量值是copy关系,每次copy都将创建新的变量,即便变量名相同,可以通过
id()
函数获取变量标识来验证 - 变量与复杂对象间是refer关系,copy必须通过切片来进行
- 任何类型都是对象,可通过
type
类来查看具体类型 - 不支持自增自减
- 大小写敏感
- 可以使用分号在一个物理行上划分多个逻辑行,但不建议
- 可通过行末反斜杠\来续行
- 全局变量需要global声明,
global a, b, c
字符串要点
- 字符串可以通过单引号、双引号来标识,多行字符串通过三引号(‘’‘...’‘’)标识
- r或R前缀可以标识字符串为不转义的自然字符串
- 相邻字符串会被自动拼接
Unicode编码
- utf-8存储 -> Unicode加载到内存 -> 数据展现
- u或U前缀来标识Unicode字符串,
u'中'和u'\u4e2d'
表示了同一个数据 - utf-8标准:汉子一般为三个字节,生僻字可能为4~6个字节
- unicode转utf-8:
u'中文'.encode('utf-8') => '\xe4\xb8\xad\xe6\x96\x87'
PDB调试
程序加断点
import pdb
pdb.set_trace()
调试命令
l # 查看周围代码
n # 单步执行
p # 打印变量
c # 继续执行
q # 退出
sublime下python提示插件推荐用Anaconda
来源:oschina
链接:https://my.oschina.net/u/2400083/blog/724348