有时候技术总是不够用,明明已经学了很多技能了,但是碰到问题还是不够用。手工处理耗时太长的问题已经困扰着希望解放双手的我们,批处理是唯一的出路,那么python的使用将彻底的解决一切的重复劳动。
1 缩进
当语句以冒号:结尾时,缩进的语句视为代码块
age = 20
if age >= 18:
print('your age is', age)
print('adult')
else:
print('you are child’)
else if 可以缩写成 elif
2 转义
使用r’'来表示内部的字符串不转义
>>> print(r'\\\t\\')
\\\t\\
3 '''
使用''' (三个“'”单引号来允许多行内容)
4 布尔值
两种值: True 和 False
可以用逻辑运算符 and or not 来参与运算
5 空值
None 特殊的空值
6 变量常量
动态语言,不需要声明类型,a = 2
常量用大写和下划线表示,但是不能保证这个值不会变化
7 除法
/ 除法的结果是浮点数
// 地板除的结果是整数
8 字符串str
- ord() 函数获取字符的整数表示
- chr() 函数把编码转换为对应的字符
- bytes类型带b前缀的单引号或双引号表示: 如 b’ABC’ ABC每个字符都只占用一个字节. (可以使用encode/decode进行编码)
- len() 计算字符个数
- 格式化 使用%运算符来格式化字符串。 或者用format()方法, 替换字符串内的{0},{1}…如 print('Hello, {0}, 成绩提升了{1:.1f}%'.format('小明', 17.125)) 打印 Hello, 小明, 成绩提升了17.1%
- str(), int(), float() 进行类型转换
- startswith()和endswith() 判断是否传入的字符串开始或结束
- join() 将字符串列表拼接成一个字符串 ','.join([])
- split() 将一个字符串分割成一个字符串列表 'asf'.split(‘ ')
- rjust(), ljust(), center() 通过插入空格或其他字符来进行对齐
- strip(), strip(),strip() 删除空白字符,或传入的字符并且字符单个匹配
注意:
- 不能进行字符串和整型数的“+”操作, 因为不支持自动类型转换。
- 字符串乘以整型数,“*”为字符串复制,进行复制字符串。
9 list
- 有序集合,可以添加和删除元素。 classmates = ['Michael', 'Bob', 'Tracy']
- classmates[-1], 获取最后一个元素, -2,倒数第二个。
- append 追加元素到末尾
- insert 把元素插入到指定位置
- pop 删除list末尾的元素, pop(i) 删除指定索引位置的元素
10 tuple
元组,有序列表,初始化后不能修改。
classmates = ('Michael', 'Bob', 'Tracy’)
t = (1,) // 一个元素的时候需要加一个逗号
- 使用tuple(数组),可以将数组转化为元组
- 使用list(元组),可以将元组转化为数组
11 循环
- for…in循环
- range() 提供生成整数序列 range(101) 生成0-100的整数序列
- while 循环
- break 语句退出循环
- continue 跳过当前的这次循环,开始下一次循环
12 字典
- dict 与iOS的Dictionary和Android的map一样
- d = {'Micheal': 95, 'Bob': 75, 'Tracy': 85}
- dict[‘key’] 当key不存在的时候会报错。需要先进行in判断
- get() 获取value, 如果key不存在返回None, d.get('Thomas', -1) 如果不存在,返回指定值
- pop() 删除key和对应的value
- setdefault() 当key不存在时,设置默认值,然后返回value。如果key存在,则直接返回value。
13 in
判断是否在集合中 ‘Thomas’ in d
14 set
- 一组不能重复的key 初始化 s = set([1,2,3,4])
- add(key) 添加元素
- remove(key) 删除元素
15 def函数
- def my_abs(x): 函数体
- pass 语句,定义什么都不做的空函数
- isinstance() 检查类型, isinstance(x, (int, float)) 检查x是否是int或float类型.包括继承关系
- return 可以返回多个值,使用的是truple
- 默认参数 def power(x, n=2): 那么第二个参数可以不传。 默认参数要牢记一点: 默认参数必须指向不变对象!
- 可变参数 参数前面加一个*号
- 关键字参数 参数前面加两个*号, 传入的是一个字典
- 命名关键字参数 特殊分隔符,后被视为命名关键字参数。如果已经定义了可变参数,那么不需要再写一个,
- 参数顺序,必选参数->默认参数->可变参数->命名关键字参数->关键字参数
16 切片Slice
L[0:3] 取集合的前三个元素,相当于L[0], L[1], L[2]
L[::5] 从0开始,每5个取一个
可以去字符串,结合进行切片操作
17 迭代Iteration
enumerate 可以将list变成索引-元素
18 列表生成式
[m + n for m in 'ABC' for n in 'XYZ’]
将表达式写前面后面紧跟for,可以二层,三层及以上
19 生成器generator
- 一边循环一边计算。将列表生成式的[]换成(), 就是生成器。
- 列表生成式是返回一个列表,而生成器是返回一个generator,通过next()函数获取下一个值。
- 如果函数中定义了yield 关键字,那么这个函数就变成了generator
20 迭代器Iterable
- 可以直接作用于for循环的对象list, tuple, dict, set, str等统称为迭代器Iterable。
- 可以被next()函数调用并不断返回下一个值的对象成为迭代器Iterator。
- 使用iter()函数,可以将Iterable变成Iterator。
21 捕获异常
try:
except XXX:
22 高阶函数
一个函数可以接受另一个函数作为参数,这个函数就是高阶函数。
- map() 接受2个参数,一个函数和一个Iterable。使用函数对Iterable中每一个元素进行运算。
- reduce() 接受2个参数,一个函数和一个Iterable, 这个函数必须接受两个参数。 把结果和下一个元素使用函数进行累计计算。
- filter() 用于过滤序列,接受一个函数和一个Iterable。
- sorted() 接受一个列表和一个函数。
- 闭包(返回函数)不要引用任何循环变量或者后续会发生变化的变量。
- 函数变量,name 属性获取函数的名字。
- 偏函数,使用functools.partial()把函数的某些参数给固定住,返回一个新的函数。
23 装饰器decorator
在代码运行期间动态增加功能的方式,称为装饰器。
@log 置于函数定义处,不仅会运行函数,还会在运行前执行log的内容。
24 模块、包
每个py文件就是一个模块,每个文件夹就是一个包,包中必须要有一个init.py的文件。
模块不能和Python自带的模块名冲突,否者将无法导入系统自带的模块。
- 导入模块 import,然后可以直接用模块内的变量和函数
- 变量名使用“_”开头,说明是private的不能直接引用,不然是public。
25 类
- class Student(object): class后紧跟类型,()中是继承的类。
- 可以自由绑定属性
- 使用init函数实例类并绑定属性
- 类中的函数,第一参数一定是self。调用的时候self不需要传递,其他参数正常传入。
- 属性名前面添加下划线”__”,那么这个属性就是私有变量,只有内部可以访问
- 如果属性名是下划线”__”开头和结尾的,那么这个属性是特殊属性,可以直接访问
- type() 获取对象的类属性
- dir() 获取对象的所有属性和方法,使用hasattr(obj, ‘x’)判断是否有属性x,setattr(obj, ‘y’, 19)设置一个属性y并赋值19,getattr(obj, ‘y’) 获取属性y的值
- 类属性,在类中直接定义属性,使用类名访问
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
26 限制实例属性
对类和实例可以动态的添加属性和方法,使用slots可以限制
class Student(object):
__slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
27 @property
负责把一个方法变成属性调用。
@property把getter方法变成属性, 并会创建另一个装饰器@xxx.setter把setter方法变成属性赋值。
如果没有定义@xxx.setter那么说明这个属性是只读属性
28 多继承MixIn
一个类可以继承多个类。
29 定制类
- str 返回类的描述,可以重载str来实现输出类的描述
- iter 使类支持for…in循环操作,同时需要实现next方法用来支持迭代
- getitem 使类可以像list一样获取第几个元素
30 枚举类
Enum类 value属性自动赋值给成员int常量,默认从1开始计数
31 文件读
- open()函数,打开一个文件对象
- read()函数, 读取内容到内存
- close()函数,关闭文件
- with 语句,可以自动调用close函数
- write() 写文件
with open('/path/to/file', 'r') as f:
print(f.read())
32 StringIO
内存中读写str
getvalue() 获取写入后的str
33 BytesIO
内存中读写bytes
34 操作文件和目录
- os模块直接调用操作系统提供的接口函数
- name 操作系统类型
- uname() 详细的系统信息
- environ 环境变量
- path 操作文件和目录模块 abspath(), join(), mkdir(), reader(), split(), splitext(),
- rename 重命名
- remove 删掉文件
35 序列化
pickling
pickle 模块
- 对象序列化 pickle.dumps(d)
- 对象反序列化 pickle.load(f)
json模块 可以直接进行对dict进行json的转换
36 多进程
fork() 调用创建一个子进程
getpid() 获取进程的ID
getppid() 获取父进程的ID
37 del
删除一个定义的变量
删除列表中一个元素
38 exec
内置语句 执行一个表达式
39 raise
触发一个异常
40 *星号
* 该位置接受任意多个非关键字(non-keyword)参数,在函数中将其转化为元组(1,2,3,4)
** 该位置接受任意多个关键字(keyword)参数,在函数**位置上转化为词典 [key:value, key:value ]
41 super
class C(B):
def meth(self, arg):
super(C, self).meth(arg)
42 **指数
指数操作, 2 ** 3 得到8
43 print不换行
print('Hello', end=' ')
print("World")
打印 Hello World
44 global
将局部变量作用域使用global声明变量,那么这个变量为全局变量
45 copy
copy.copy() 函数用来复制列表或字典这样的可变值。
copy.deepcopy() 函数用来复制列表中包含列表的情况。
46 isX字符串方法
- slower() 字符都是小写
- ismpper() 字符都是大写
- isalpha() 只包含字母,且非空
- isalnum() 只包含字母和数字,且非空
- isdecimal() 只包含数字字符,且非空(不包含小数点)
- isspace() 只包含空格,制表符和换行,且非空
- istitle() 仅包含大写字母开头,后面是小写字母的单词
47 正则表达式
import re
phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)’) #创建正则表达式
- search返回一个March对象
- findall()返回一组字符串
- sub() 用新的字符串替换掉匹配的模式
匹配符 - 字符? 表示它前面的分组在这个模式中是可选的(0次或1次)
- 字符* 表示它之前的分组在这个模式中匹配0次或多次
- 字符+ 表示它之前的分组在这个模式中匹配1次或多次
- 符号{} 表示它之前的分组重复指定次数,用两个数字“,”分隔表示一个范围
通配符: ‘.’ 匹配除了换行之外的所有字符,仅仅匹配一个字符 - 使用.* 来匹配除了换行符的所有字符
- ? 后面添加一个?,表示非贪心匹配,也就是匹配最短符合的字符串
- re.DOTALL 表示匹配所有字符
- re.IGNORECASE 或 re.I 表示不区分大小写
- re.VERBOSE 忽略正则表达式中的空格和注释
字符分类 - \d 0到9的任何数字
- \D 除了0到9的数字之外的任何字符
- \w 任何字母、数字和下划线字符 (相当于单词word)
- \W 除了字母、数字和下划线字符之外的任何字符
- \s 空格、制表符或换行符 (相当于空白space)
- \S 除了空格、制表符或换行符之外的任何字符
- [123] 自定义字符分类,匹配中括号内的字符。字符’.’,’*’,’?’,’(‘和’)’需要转义
- ^ 中括号中插入^表示非字符类。也表明必须此分组开始
- $ 必须此分组结尾
// TODO 以后再补充吧 感觉Python强大的地方是提供了好多好用的库,可以快速的实现自己的功能