基础事项
变量命名
- 变量名尽量小写
- 类名首字母大写
括号与数据类型
括号 | 数据类型 | 例子 |
---|---|---|
[] | 列表 | [123,’abc’,1.23] |
() | 元组 | (1,2,3,4)) |
{} | 字典 | {‘name’:’wa’,’age’:20} |
其它
- = 操作符代表赋值,例如:x = 10,执行结果,x 赋值为 10;
- == 操作符代表等于判断,例如:1 == 2,执行结果为 False。
Python 2 和 3 差异
- print 在3中不是一个保留字,也不是一条语句,而是一个内置的函数调用。
python交互模式下清屏
在Linux shell中,清屏操作是clear;在Win cmd中,清屏操作是cls。
在交互模式中使用python,如果要清屏,可以import os,通过os.system()来调用系统命令clear或者cls来实现清屏。
1 | import os |
但是此时shell中的状态是:
1 | 0 |
首行会有一个0。这个0实际上是os.system()的返回值,0是成功,非零即error code(具体os.system()与命令返回值的对应关系可参考这里)。
可以存储这个返回值,不让其打印出来:
1 | import os |
这样就是真正的清屏了:
1 | >>> |
python下编译 .py 为 .pyc
生成单个pyc文件:
命令:
1 | python -m py_compile file.py |
脚本:
1 | import py_compile |
批量生成pyc文件:
命令:
1 | python -m compileall /root/src/ |
脚本:
1 | import compileall |
生成pyc文件后删除原py文件,直接执行pyc文件(方法同py文件)
Python语句和语法
语句
语句 | 角色 | 例子 |
---|---|---|
赋值 | 创建引用值 | a,b,c = ‘good’,’bad’,’ugly’ |
调用 | 执行函数 | log.write(‘hello,world’) |
打印调用 | 打印对象 | print(“hello world”) |
if/elif/else | 选择动作 | if ‘print’ in text: print(text) |
for/else | 序列迭代 | for x in mylist: print(x) |
while/else | 一般循环 | while x>y: print(“hello”) |
pass | 空占位符 | while True: pass |
break | 循环退出 | while True: if exittest(): break |
continue | 继续下一次循环 | while True: if skiptest(): continue |
def | 函数和方法 | def f(a,b,c=1,*d): print(a+b+c+d[0]) |
return | 函数返回结果 | def f(a,b,c=1,*d): return a+b+c+d[0] |
yield | 生成器表达式 | def gen(n): for i in n:yield i * 2 |
global | 命名空间,全局变量 | x = ‘old’ def function(x): global x,y,;x = ‘new’ |
nonlocal | 局部变量(python3.0+) | def outer(): x = ‘old’ def function(): nonlocalx;n=’new’ |
import | 模块访问,导入 | import sys |
from | 模块属性访问 | from sys import stdin |
class | 创建对象 | class Subclass(Superclass): staticData = [] def method(self): pass |
try/except/finally | 捕捉异常 | try: action() except: print(‘action error’) |
raise | 触发异常 | raise EbdSearch(location) |
assert | 调试检查 | assert x>y,’x too small’ |
with/as | 环境管理器 | with open(‘data’) as myfile: process(myfile) |
del | 删除引用 | del data[k] del data[i:j] del obj.attr del variable |
语法
与其他语言的比较
1 | if ( x > y) { |
上面可能是 c、c++、Java 或者其他语言语句。下面是与之等价的 Python 语言语句:
1 | if x > y: # 可以没有 (),也可以有 |
数学操作符
优先级从高到低
操作符 | 操作 | 例子 | 求值为 |
---|---|---|---|
** | 指数 | 2**3 | 8 |
% | 取模/取余数 | 22%8 | 6 |
// | 整除/商数取整 | 22//8 | 2 |
/ | 除法 | 22/8 | 2.75 |
- | 减法 | 5-2 | 3 |
+ | 加法 | 2+2 | 4 |
增强赋值操作符
针对+、-、*、/和%,都有增强的赋值操作符,如下表:
增强的赋值语句 | 等价的赋值语句 |
---|---|
spam += 1 | spam = spam+1 |
spam -= 1 | spam = spam-1 |
spam /= 1 | spam = spam/1 |
spam %= 1 | spam = spam%1 |
转义操作符
转义字符 | 描述 |
---|---|
\(在行尾时) | 续行符 |
\\ | 反斜杠符号 |
\‘ | 单引号 |
\“ | 双引号 |
\a | 响铃 |
\b | 退格(Backspace) |
\e | 转义 |
\000 | 空 |
\n | 换行 |
\v | 纵向制表符 |
\t | 横向制表符 |
\r | 回车 |
\f | 换页 |
\oyy | 八进制数,yy代表的字符,例如:\o12代表换行 |
\xyy | 十六进制数,yy代表的字符,例如:\x0a代表换行 |
\other | 其它的字符以普通格式输出 |
比较运算符
表达式 | 描述 |
---|---|
x == y | x等于y |
x !=y | x不等于y |
x < y | x小于y |
x >= y | x大于或等于y |
x is y | x和y是同一个对象 |
x is not y | x和y是不同的对象 |
x in y | x是容器(如序列)y的成员 |
x not in y | x不是容器(如序列)y的成员 |
x not in y
等同于not x in y
,前者更符合常识,与其他语言一致
True 和 False
注意,首字母大写。在Python中任何对象都可判断其布尔值,除了
0
、0.0
、''
、None
和所有空的序列与集合
(列表,字典,集合)布尔值为False
之外,其它的都为True
,我们可以使用函数bool()
进行判别:
1 | '-1') bool( |
in 和 not in 操作符
1 | 'bat' in ['cat','bat','rat','elephant'] |
条件判断
1 | 6 x = |
循环
for 循环
1 | for c in 'spam': |
嵌套循环
1 | for i in range(1,10): |
while 循环
1 | 4 x= |
break 和 continue
1 | 5 x= |
局部和全局作用域
局部变量不能在全局作用域内使用
1 | def spam(): |
输出结果
1 | Traceback (most recent call last): |
局部作用域不能使用其他局部作用域内的变量
例子
1 | def spam(): |
输出结果
1 | 99 |
全局变量可以在局部作用域中读取
- 例子,局部作用域中不赋值变量,则使用全局变量
1 | def spam(): |
输出结果
1 | 42 |
- 例子,局部作用域中赋值变量,则使用局部变量
1 | def spam(): |
输出结果
1 | 11 |
- 例子,局部作用域中先使用变量,之后定义(赋值)变量,则会出错
1 | def spam(): |
输出结果
1 | Traceback (most recent call last): |
因为 spam 函数中有针对 eggs 的赋值语句,因此 Python 认为 eggs 是局部变量。但 print(eggs)的执行在 eggs 赋值之前,局部变量 eggs 并不存在,因此出错。
global 语句
例子,在函数内用 global 修饰符指定使用全局变量
1 | def spam(): |
输出结果
1 | spam |
异常处理 try
例子1,用 try 和 except 语句处理异常
1 | def spam(divideBy): |
输出结果
1 | 21.0 |
例子2,用 try 和 except 语句处理异常
1 | def spam(divideBy): |
输出结果
1 | 21.0 |
字符串
字符串格式化
- 表达式形式 %
1 | '%s,bbb,%s' % ('aaa','ccc') #格式化表达式 |
- 字符串方法调用 str.format()
1 | '{0},bbb,{1}'.format('aaa','ccc') #格式化方法(2.6,3.0) |
- f 字符串 - 在字符串前加上 f
1 | 'Python' a= |
- 模板字符串
1 | from string import Template |
联合与拆分
- 联合 join()
1 | '/'.join(['','usr','bin','env']) |
- 拆分 split
1 | '/usr/bin/env'.split('/') |
切片
1 | '12345654321' s= |
列表
创建数值列表 range()
1 | 1,5) range( |
遍历列表
1 | for v in range(1,5): |
列表解析
1 | 2 for v in range(1,5)] [v** |
列表简单计算统计
1 | 0 r= |
多重赋值
一般方式
1 | 'fat','black','looud'] cat = [ |
多重赋值方式
1 | 'fat','black','looud'] cat = [ |
用 del 删除列表值
1 | 'cat','bat','rat','elephant'] spam=[ |
用 remove 方法删除列表值
1 | 'fat','black','looud'] cat = [ |
如果该值在列表中多次出现,只删除第一个。
元组 tuple
元组与列表几乎一样,区别在于:1.元组用 (),列表用[]。2.元组和字符串一样,不可改变。
1 | 'hello',42,0.5) eggs=( |
如果元组中只有一个值,需要在该值后面跟上一个逗号,表明这是一个元组,比如:
1 | 'hello',)) type(( |
用 list() 和 tuple() 函数转换类型
如同 str(12) 将返回 ‘12’ 类似,list() 和 tupel() 返回列表和元组类型。
1 | 'hello',42,0.5)) list(( |
引用与 copy() 、 deepcopy()
引用
- 对字符串和数值进行引用赋值时,直接复制的内容,即在内从中重新分配了内存空间,用来存放新的对象:
1 | 'a' spam= |
- 列表引用赋值时,指向的是对象所在的内存地址,因此指向的内容是一致的,如下所示:
1 | 0,1,2,3,4,5] spam=[ |
coyp() 和 deepcopy()
- copy() 不是简单引用,而是分配新的内存地址给新变量并赋值
1 | 'ABCD') spam = list( |
- deepcopy()深拷贝,相对于copy()的浅拷贝(shallow copy),如果要复制的列表中包含了列表,就用copy.deepcopy()。
字典
创建字典
1 | # 常见方式 |
字典使用
1 | 'name':'wa','age':20} d={ |
遍历键–值
- 键值对 items()
1 | 'name':'wz','first':'z','last':'w'} d={ |
- 遍历所有 键 keys()
1 | for k in d.keys(): # 遍历所有 键 keys() |
- 遍历所有 值 values()
1 | for v in d.values(): # 遍历所有 值 values() |
检查字典中的键或值
- 检查键或值
1 | 'name':'wz','first':'z','last':'w'} d={ |
- 嵌套 if 判断
1 | 'first'] n=[ |
get() 方法
1 | 'name':'wz','first':'z','last':'w'} d={ |
setdefault() 方法
1 | 'name':'wz','first':'z','last':'w'} d={ |
漂亮打印
如果在程序中导入 pprint 模块,就可以用 pprint() 和 pformat() 函数来用漂亮的格式打印字典内容。下面例子对比了 print() 和 pprint():
- 普通打印
1 | 'It was a bright cold day in April, and the clocks were striking thirteen.' message = |
- 漂亮打印
pprint() 在屏幕上输出结果,pformat() 得到漂亮打印的文本字符串。
1 | import pprint |
函数
简单函数
1 | def func(): |
位置实参和关键字实参
1 | def func(para): |
带默认值参数
1 | def func(para='默认参数值'): # 默认值 |
任意数量实参
1 | def func(*para): # 任意数量实参 |
模块导入
模块是扩展名为.py的文件,函数存在于模块中,使用函数之前需要导入。
- test.py 文件内容
函数与函数之间空两行
1 | def func2(para='默认参数值'): |
导入整个模块
1 | import test |
导入指定函数
1 | from test import func |
导入所有函数
1 | from test import * |
导入类
与导入函数格式一致。
类
- 类是模块内的属性
创建类
test.py 文件内容
1 | class Dog(): |
创建和操作实例
1 | import test |
类继承
- 超类列在子类开头的括号中。 含有继承的类成为子类,子类所继承的类就是超类。
子类与超类
test.py 文件增加继承类内容
1 | class Dog(): # 超类 |
测试继承类
1 | import test |
继承在Python 2.7 和 3 之间的差异
- Python 3中的继承
1 | class Dog(): |
- Python 2.7中的继承
1 | class Dog(object): |
类截获Python运算符
截获Python运算符,即运算符重载,让用类写成的对象,可以截获并相应在内置类型上的运算:加法、切片、打印和点号运算符等。
运算符重载例子
- 当心的实例构造时,会调用init(self是新的ThirdClass对象)。
- 当ThirdClass实例出现在 + 表达式中时,则会调用add。
- 当打印一个对象的时候(从技术上讲,当通过 str 内置函数或者其 Python 内部的等价形式来将其转换为打印字符串的时候),运行str。
1 | class FirstClass: # Define a class object |
self
- Python 中的 self 相当于 C++ 或 Java 中的 this,在 Python 中 self 必须明确写出来。
- self 不一定必须写成 self,可以起任何其他名字(比如:a,b,this等),鉴于其总是指向对象本身,因此习惯上将其命名为 self。
- self 指向创建的实例本身(是实例,而不是类)。参考下面代码:
1 | class Test: |
Python 正则表达式
内容太多,独立发布,参见 Python 正则表达式。
例子程序
猜数字
1 | import random |
Collatz 序列
1 | def collatz(number): |
打印列表内容
1 | def plst(lst): |