zip
不同数组里面对应元素压缩成元组
列表推导式
1 | result = [] |
result = [i for i in range(100) if i%2 == 0]
正则表达式
模块:import re
常用函数
match(pattern, string, flags=0)
- 从 string 开头开始匹配,如果开头就不匹配会直接返回 None,
- 匹配不成功会返回 None
- 匹配成功会返回第一次匹配的对象
search(pattern, string, flags=0)
- 从 string 中匹配字符串,不一定必须从开头开始
- 匹配不成功会返回 None
- 匹配成功会返回第一次匹配的对象
findall(pattern, string, flags=0)
- 返回所有匹配结果,返回一个 List
sub(pattern, repl, string, count=0)
- 替换 string 中匹配的字符串为 repl
- count 用来表示替换多少个
- count == 0,替换所有匹配的字符为替换字符
- count > 0,替换 count 个匹配的字符为替换字符
split(pattern, string, maxsplit)
- 根据 pattern 分割 string
- maxsplit 表示最大
compile(pattern, flags=0)
- 编译正则表达式,返回一个 pattern 对象
flags 标志位
flags 标志位用于设置匹配的附加选项,常用的 flags 如下:
选项 | 作用 |
---|---|
re.I |
忽略大小写 |
re.L |
字符集本地化,用于多语言环境 |
re.M |
多行匹配 |
re.S |
使用 . 匹配包括 \n 在内的所有字符 |
re.X |
忽略正则表达式中的空白、换行 |
正则表达式
元字符是正则表达式中最基本的组成单位,一个正则表达式中至少要包含一个元字符。
元字符表是由一组地位平等的元字符组成,匹配时会选取表中的任意一个字符,元字符表由 []
包起来,如 [xyz]
。
如果需要对正则表达式进行嵌套,就需要使用分组 ()
,我们可以通过分组将一些小元字符组合成一个大元字符。
Python 常用的元字符:
元字符 | 作用 | 元字符 | 作用 | ||
---|---|---|---|---|---|
^ |
开始字符 | [m] |
匹配单个字符串 | ||
$ |
结束字符 | [m-n] |
匹配 m ~ n 之间的字符 | ||
\w |
匹配字母、数组、下划线 | `m | m2..n | n2` | 匹配多个字符串 |
\W |
匹配不是字母、数组、下划线的字符 | [^m] |
匹配除 m 以外的字符串 | ||
\s |
匹配空白字符 | () |
分组 | ||
\S |
匹配不是空白字符的字符 | {m} |
重复 m 次 | ||
\d |
匹配数字 | {m,n} |
重复 m ~ n 次 | ||
\D |
匹配不是数字的字符 | * |
匹配 0 次或多次 | ||
\b |
匹配单词的开始和结束的位置 | + |
匹配 1 次或多次 | ||
\B |
匹配不是单词的开始和结束的位置 | ? |
p匹配 0 次或 1 次 | ||
. |
匹配任意字符 | *? |
匹配 0 次或多次,且最短匹配 | ||
{m,n}? |
重复 m ~ n 次,且最短匹配 | +? |
匹配 1 次或多次,且最短匹配 | ||
?? |
匹配 0 次或 1 次,,且最短匹配 | (?P<name>) |
为分组命名,name为分组名 | ||
`m | n` | 匹配 m 或 n | (?P=name) |
使用名为 name 的分组 |
Example
1 | import re |
import 模块
解析 JSON
基本使用
1 | import json |
Python to JSON 对照表
JSON 类型 | Python 类型 |
---|---|
Dict | object |
list,tuple | array |
string,unicode | string |
int,long,float | number |
True | true |
False | false |
None | null |
JSON to Python 对照表
Python 类型 | JSON 类型 |
---|---|
object | dict |
array | list |
string | unicode |
int | int,long |
true | True |
false | False |
null | None |
logging 模块
1 | import logging |
函数
关于 return
首先,Python 的函数是肯定有返回的,如果你没在函数中写 return,它会返回 None 的。
1 | def no_return_function(): |
关于入参
Python 函数的 5 种类型参数
必选参数(位置参数)
def power(x, n):
这种,调用的时候必须按照顺序传入x
和n
默认参数
def power(x, n=2):
,其中n
就是一个默认参数- 默认参数必须指向一个不可变对象,比如可以是一个 tuple,但不能是一个 list
可变参数
def calc(*numbers):
,加了*
的变量名会存放所有未命名的变量参数- 可变参数允许传入 0 个或任意个参数,这些可变参数在函数调用时会自动组装为一个 tuple
- 如果想把一个 list
nums = [1, 2, 3]
中的元素作为可变参数传入函数,可以这样写:calc(*nums)
关键字参数
def person(name, age, **kw):
,加了**
的变量就是关键字参数关键字参数允许你传入 0 个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个 dict
和可变参数类似,可以先组装出一个 dict,然后,把该 dict 转换为关键字参数传进去:
1
2extra = {'city': 'Beijing', 'job': 'Engineer'}
person('Jack', 24, **extra)**extra
表示把extra
这个 dict 的所有 key-value 用关键字参数传入到函数的**kw
参数,kw
将获得一个 dict,注意kw
获得的 dict 是extra
的一份拷贝,对kw
的改动不会影响到函数外的extra
命名关键字参数
命名关键字参数需要一个特殊分隔符
*
,*
后面的参数被视为命名关键字参数,就是说,必须有,必须传:1
2def person(name, age, *, city, job): # city, job 是命名参数,
print(name, age, city, job)如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符
*
了:1
2def person(name, age, *args, city, job):
print(name, age, args, city, job)命名关键字参数可以有缺省值,从而简化调用:
1
2def person(name, age, *, city='Beijing', job):
print(name, age, city, job)使用命名关键字参数时,要特别注意,如果没有可变参数,就必须加一个
*
作为特殊分隔符。如果缺少*
,Python 解释器将无法识别位置参数和命名关键字参数
*args, **kwargs
参数
1 | def func(*args, **kwargs) # 传啥进去都行 |
内部函数和闭包
- 相同点:
- 都是函数里面嵌套着函数的
- 不同点:
- 内部函数返回内部函数的直接调用
- 闭包返回内部函数本身
1 | # 内部函数 |
lambda 函数
语法
1 | lambda var1, var2: expression |
lambda 函数只会使代码更加简洁,并不会提高程序的运行效率。
lambda 函数经常用于 Python 的函数式编程,即 允许把函数本身作为参数传入到另一个函数,还允许返回一个函数。
应用
map() 函数: map
将传入的函数依次作用到序列的每个元素,并把结果作为新的 Iterator
返回
map() 函数的语法:map(函数, 序列)
1 | squares = map(lambda x: x*x, [1,2,3,4,5,6,7,8,9]) |
reduce() 函数: reduce
把结果继续和序列的下一个元素做累积计算
reduce() 函数的语法:reduce(函数, 序列)
1 | # reduce 很适合用来实现阶乘 |
列表生成式和生成器
列表生成式:
1 | for x in range(1, 11)] [x * x |
生成器: 把列表生成式的 []
换成 ()
就变成了一个生成器
1 | g = (x * x for x in range(10)) |
处理命令行参数
模块:import getopt
用到的时候再写……
面向对象
类和对象是面向对象的两个重要的概念,类是客观世界中事物的抽象,对象是类实例化后的实体。
Python 类中有许多的内置类属性:
属性 | 作用 |
---|---|
__dict__ |
一个字典,包含类的所有属性 |
__mro__ |
方法解释顺序元组 |
__base__ |
一个由所有父类组成的元组 |
__name__ |
类名 |
__doc__ |
文档字符串 |
__module__ |
类定义所在的模块 |
Python 的 toString()
方法:__str__
和 __repr__
property 装饰器:
1 | class Person(): |
多进程与多线程
Python 开发和调试运行在虚拟机 Docker 中的项目
Reference:
开始的开始,我们需要一个安装了 Dokcer 的 Linux 虚拟机,并且是一个固定 IP 的虚拟机。
创建一个 Dockerfile:
1 | from alpine:3.9 |
然后 build 镜像并创建一个容器:
1 | docker build -t ssh . |
然后就可以了,可以去 PyCharm 中连接了。
剩下的参考那篇文章就可以了。