Python - AnneBlog/bugMaster GitHub Wiki

1. Python环境

Python官网: https://www.python.org/

  • windows
    下载Windows x86-64 MSI installer(for python2.x)或Windows x86-64 executable installer(for python3.x)
    双击安装
    将python安装路径添加到path(通过环境变量设置)
  • centos
    tar -xzvf Python2.7.13.tgz
    cd Python2.7.13
    ./configure --prefix=/your_python_path/
    make && make install
  • 更改pip源
    mkdir ~/.pip
    vim ~/.pip/pip.conf
    [global]
    index-url = http://pypi.douban.com/simple
    trusted-host = pypi.douban.com
    disable-pip-version-check = true
    timeout = 120

2. Python基本类型&运算符

2.1 Python基本类型:

  • 类型:
    数值(number:int, float, double, complex),字符串(string),列表(list),元祖(tuple),字典(dict)

  • 分类:
    存储类型:原子类型(数值,字符串),容器类型(列表,元组,字典)
    更新类型:可变类型(列表,字典),不可变类型(元组,字符串,数值)
    访问类型:直接访问(数值),序列类型(字符串,列表,元组),映射类型(字典,哈希键值)

2.2 Python运算符

  • 算术运算
    +(加), -(减), **(乘), /(除), ***(幂运算), %(求余或取模)

    a op= b 等价于 a = a op b, 其中op可以是+, -, **, /, ***, %

  • 关系运算
    >(大于), >=(大于或等于), <(小于), <=(小于或等于), ==(等于),!=(不等于)

  • 逻辑运算
    and(与), or(或), not(非)

  • 位运算
    &(与), |(或), ~(非), ^(异或),<<(左移), >>(右移)

  • in运算
    in,not in

  • is运算
    is, not is

3. Python基本语法

3.1条件语句

if condition:    
    commands    

if condition:
   commands1    
else:   
    commands2

if condition1:    
    commands1    
elif condition2:    
    commands2    
[else:    
    commands3]   

result = true_result if condition else false_result     

3.2 循环语句

for item in sequence:    
    commands    
[else:    
    else_commands]

while condition:    
    commands    
[else:    
    else_commands]    

3.3 函数

def func_name([arg_name1[, arg_default=default_value[, *args[, **kwargs]]]]):    
    commands    

3.4 类

class super_name(object):    
    def __init__(self, arg_name1, arg_default1=default_value1):    
        self.arg_name1 = arg_name1    
        self.arg_default1 = arg_default1    

    def set(self, x, y):    
        self.arg_name1 = x    
        self.arg_default1 = y    

    def get(self):    
        print(self.arg_name1, self.arg_default1)      

    def __del__(self):    
        pass 

class sub_name(super_name):
    def __init__(self, arg_name1, arg_name2, arg_default1=default_value1, arg_default2=default_value):    
        super(sub_name, self).__init__(arg_name1, arg_default1)    
        self.arg_name2 = arg_name2    
        self.arg_default2 = arg_default2    

    def sub_set(self, x, y):    
        self.arg_name2 = x    
        self.arg_default2 = y        

    def sub_get(self, xy):    
        print(self.arg_name2, self.arg_default2, xy)          

    def __del__(self):    
        pass

class sub_sub_name(super_name, sub_name):
    def __init__(self, arg_name1, arg_name2, arg_name3, arg_default1=default_value1, arg_default2=default_value):    
        super_name.__init__(self, arg_name1, arg_default1)    
        sub_name.__init__(self, arg_name2, arg_default2)    
        self.arg_name3 = arg_name3    

    def sub_sub_set(self):    
        pass    
    
    def sub_sub_get(self):
        super_name.get(self)    
        sub_name.sub_get(self, 100)   
    
    def __del__(self):    
        pass    

3.5 异常抛出

raise Error_name(args)

3.6 异常捕获

try:    
    command_try    
except Error_name as err:    
    command_err    
else:
    command_else
finally:
    command_finally

3.7 断言

# condition为True,继续执行下一条语句;否则,抛出异常程序退出    
assert condition    

3.8 模块导入

import module_name [as alias]    
or   
from package import module_name [as alias]    

4. Python高级语法

4.1 列表解析

iter_type = [1, 2, 3, 4, 5]  # iter_type: tuple, list, dict, iter    
[item for item in iter_type]  # list    
{item for item in iter_type}  # set    
{key:value for key,value in adict.iteritems()}  # dict    

4.2 lambda表达式

func = lambda [arg1 [,arg2,.....argn]]:expression  # lambda    

4.3 yield语句

def read_file(file_name):    
    with open(file_name, "rb") as fid:    
        for line in fid:    
            yield line    

def counter(start_at):    
    count = start_at    
    while True:    
        val = (yield count)    
        if val is not None:    
            count = val    
        else:    
            count += 1    

4.4 装饰器

import time    
import traceback    

from functools import wraps    

class RetryError(Exception):    
    def __init__(self, *args, **kwargs):    
        Exception.__init__(self, *args, **kwargs)    

def no_args_decorate(func):    
    @wraps(func)    
    def wrapper(*args, **kwargs):    
        return func(*args, **kwargs)    
    return wrapper    

def has_args_decorate(times=3, interval=0):    
     def decorate(func):    
        @wraps(func)    
        def wrapper(*args, **kwargs):    
            for tm in xrange(times):    
                try:    
                    return func(*args, **kwargs)    
                except:    
                    traceback.print_exc()    
                    time.sleep(interval)    
                else:    
                    raise RetryError("[重试机制]: 共%s次,已用尽!" % times)    
        return wrapper    
    return decorate    

4.5 with上下文管理

import sys    
import signal    
import traceback    

class TimeLimitError(Exception):    
    def __init__(self, *args, **kwargs):    
        Exception.__init__(self, *args, **kwargs)    

class TimeLimit(object):    
    def __init__(self, seconds=5, is_kill=False):    
        self.seconds = seconds    
        self.is_kill = is_kill    

    def time_out(self, signum, frame):    
        if self.is_kill:    
            raise(TimeLimitError("[超时机制]函数已经运行{0}seconds,超出预计时间!函数已被杀死".format(self.seconds)))    
        else:    
            sys.stdout.write("[超时机制]函数已经运行{0}seconds,超出预计时间!函数仍在运行".format(self.seconds))    

    def __enter__(self):    
        signal.signal(signal.SIGALRM, self.time_out)    
        signal.alarm(self.seconds)    

    def __exit__(self, key, value, trackback):    
        signal.alarm(0)    

4.6 静态方法vs类方法

class MyClass(object):    
    def __init__(self):        
        self.x = 10    
    
    def get(self):    
        print(self.x)    

    @staticmethod    
    def static_method(a, b):    
        print(a,b)    
    
    @classmethod    
    def cls_method(cls, a, b):    
        print (a,b)

4.7 迭代器

class MyClass(object):  
    def __init__(self):  
        self.x = 1   
    
    def __iter__(self):  
        return self
    
    def next(self): 
        if self.x<10:   
            self.x += 1  
            return self.x  
        else:  
            raise StopIteration()    

4.8 pdb调试

python -m pdb py_script.py  

import pdb  
pdb.set_trace()  # 设置断点  

4.9 深拷贝vs浅拷贝

浅/深拷贝,只发生在容器对象(tuple,list,dict)。  
浅拷贝,是容器对象默认方式,有三种实现方式(切片操作、工厂函数、copy.copy())。  
深拷贝,只有copy.deepcopy().  

4.10 内存管理

import gc  
gc.collect()  

del var_name  
del seq_name[:]  
del seq[slice] 

4.11 协程

import time  

def consumer():  
    ret = ''  
    while True:  
        number = (yield ret)  
        if not number:  
            return  
        print('Consuming {num}...'.format(num=number))    

def produce(c):  
    c.next()  
    num = 0  
    while num < 5:  
        num += 1  
        print('Producing {num}...'.format(num=num))  
        r = c.send(n)  
        print('[PRODUCER] Consumer return: %s' % r)  
    c.close()  

4.12 偏函数

from functools import partial  

def fun(x, y, z):    
    print(x)  
    print(y)  
    print(z)  

fz = partial(fun, z='this is a test')  
fz(10, 20)  

4.13 元类

class MyMetaclass(type):  
    def __new__(cls, name, bases, attrs):  
        attrs['test'] = lambda self, value: self.append(value)  
        return type.__new__(cls, name, bases, attrsr)  

class MyTest(list, metaclass=MyMetaclass):  
    pass     

4.14 闭包

import numpy as np  
def array_fun():  
    def triangle_wave(x,c, c0, hc):  
        x = x -int(x)  
        if x>c :   
            r  = 0.0   
        elif x<c0:  
            r = x/c0*hc  
        else:  
            r = (c-x)/(c-c0)*hc  
    return r  
    x = np.linspace(0, 2, 1000)  
    trianle_unfunc1 = np.frompyfunc(triangle_wave, 4, 1)  
    print(trianle_unfunc1(x, 0.6, 0.4, 1.0))  

5. Python编程实例

5.1 文件IO

读文件        
with open(file_name, 'rb') as fid:    
    for line in fid:    
        # string.strip() 去掉字符串前后两端的空白;string.split('\t') 用'\t'切割字符串
        items = line.strip().split("\t")        

写文件    
# 如果文件不存在,则创建;如果文件存在,先清空再写    
with open(file_name, 'wb') as fid:    
    fid.write("This is a test \n")    

# 如果文件不存在,则创建;如果文件存在,内容追加在文件末尾    
with open(file_name, 'ab') as fid:    
    fid.write("This is a test \n")    

读取xlsx文件  
from openpyxl import load_workbook  
wb = load_workbook(filename = 'empty_book.xlsx')  
sheet_ranges = wb['range names']  
print(sheet_ranges['D18'].value)  
print(sheet_ranges.min_row) # 开始的行号  
print(sheet_ranges.max_row) #  结束的行号  
print(sheet_ranges.min_column) # 开始的列号  
print(sheet_ranges.max_column) # 结束的列号  
for row in range(sheet_ranges.min_row, sheet_ranges.max_row+1):  
    for col in range(sheet_ranges.min_column, sheet_ranges.max_column+1):  
        print(sheet_range.cell(row=row, column=col).value)  

写入xlsx文件  
from openpyxl import Workbook  
from openpyxl.compat import range  
from openpyxl.utils import get_column_letter  
wb = Workbook()  
dest_filename = 'empty_book.xlsx'  
ws1 = wb.active  
ws1.title = "range names"    
for row in range(1, 40):    
    ws1.append(range(600))  
ws2 = wb.create_sheet(title="Pi")  
ws2['F5'] = 3.14    
ws3 = wb.create_sheet(title="Data")    
for row in range(10, 20):    
    for col in range(27, 54):        
        ws3.cell(column=col, row=row, value="{0}".format(get_column_letter(col)))    
wb.save(filename = dest_filename)    

5.2 网络IO

5.3 多线程

5.4 多进程

5.5 进程池

5.6 消息队列

5.7 json操作

5.8 re正则

5.9 argparse命令行解析

5.10 traceback异常追踪

5.11 日期模块

5.12 logger日志

5.13 mysql操作

5.14 redis操作

5.15 mongo操作

5.16 selenium自动化测试

⚠️ **GitHub.com Fallback** ⚠️