目录 start
目录 end |2018-06-13| 码云 | CSDN | OSChina
摘自 Python核心编程 第三版 Wesley Chun著
列出所有已安装模块 pydoc pydoc3
巨坑: tab和空格不能混用,如果你复制别人的代码是tab,自己敲空格,就会缩进错误!!!!, 天灭tab空格保平安, 要不是kate编辑器显示了tab字符,找半天都不知道错在哪
import this 就会输出Zen Of Python | 官方文档    优美胜于丑陋(Python 以编写优美的代码为目标)
    明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)
    简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)
    复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)
    扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)
    间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)
    可读性很重要(优美的代码是可读的)
    即便假借特例的实用性之名,也不可违背这些规则(这些规则至高无上)
    
    不要包容所有错误,除非你确定需要这样做(精准地捕获异常,不写 except:pass 风格的代码)
    
    当存在多种可能,不要尝试去猜测
    而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法)
    虽然这并不容易,因为你不是 Python 之父(这里的 Dutch 是指 Guido )
    
    做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量)
    
    如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准)
    
    命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召)
# 多行注释: """ """0 八 0x 十六 0b 二1.2e2 13.34e-23+4j 0.1-0.5j"" '' :falsesudo apt install python3-venv
python3 -m venv web 或者 virtualenv --no-site-packages web 不将系统中安装的包带入该环境source web/bin/activate
deactivatepip | Python的包管理器
pip freeze > requirements.txt 这个命令会将当前环境安装的包全部列出来, 适合env环境下使用
pip install pipreqs 然后 pipreqs /path/to/projectpip install -r requirements.txtglobal x 声明引用全局变量xfor in while 例如:for i in range(1,10,2): 范围 [1,10) 增量为2while True:`` while ‘2’ in nums:`` while num<2:while 列表: 直到列表为空退出循环    if (b==0) and (a==1) :
        pass
        print("pass")
    else:
        print("Hi")
序列通用操作(包含:字符串,列表,元组)
索引,从左至右:0,1,2...n 从右至左:-1,-2...-n切片(截取序列的部分) temp[:] 返回一个副本
temp[2:4]就是[2,4)temp[1:]1到最后 temp[-3:] [-3,-1]temp[:4] [0,4) temp[:-3] [0,-3]加:lista+listb 直接连接乘:lista*4判断是否存在:in not intappend()/extend()尾部加入元素/列表 insert(index, "") 元素插入到任意位置,其后元素后移del list[2]/ remove("apple") /pop(index) index为空指最后一个sort(reverse=True) z-a 列表全是字符串才可r"d:\python27\" r前缀表示转义字符看成普通字符temp = "python" temp[0] 结果:p temp.index("p") 结果是:0index('s') 找到s字符的下标find('s',[start,end]) 找s的下标,只有一个整数参数则是startreplace('s','v') 替换count('sd') 计数split('') 正则切分 空参数默认是空格join('') 列表转化成字符串的方法cmp(str1,str2) 比较两个字符串是否相等+ 进行拼接 可以拼接字符串 列表a in b 判断a是否在b里存在* 重复序列 例如 print "-"*20 就会输出20个 -b = "www.github.com" c = b.split(".") "#".join(c) 实现了将字符串的 . 换成了#"i am %s %d" % ("python",67)%s %d %f 和C语言一样占位符
"i am {0} {1} ..".format(23,"ret")"i am {name} {age} ..".format(age=23,name="ret")title() 首字母大写字符串,列表,元组相互转换:
encode("utf-8"): str -> bytesdecode(): bytes -> str    # coding:utf-8
    unicode_str = unicode('使用',encoding='utf-8')
    print unicode_str.encode('utf-8')
    import codecs
    codecs.open('filename',encoding='utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb9 in position 2: invalid start bytedict['a'] = 2323del dict['name']{'d':['we','e']}算术运算符
* 乘,不仅可以用于数字,还可以用于字符串 ,/ 除,和Java不一样,整数相除也会得到浮点数// 取整除,得到商的整数部分 ,% 取余数 ,** 幂运算 可以用来开根关系运算符
逻辑运算符
身份运算符
a is b 就是比较 id(a) id(b) 相同则是返回1位运算符
<< >> 左右移& |按位与或^ ~ 按位异或 按位翻转算术运算符优先级 ** / // % +
转义字符:
print('Hi')
print("%10s - %-10s"%(name, addr))end=''def show_help():
    start='\033[0;32m'
    end='\033[0m'
    print("%-26s %-20s"%(start+"-h"+end, "帮助"))
print 'Hi'只有输入参数,没有选项
    import sys
    print("脚本名:", sys.argv[0])
    for i in range(1, len(sys.argv)):
        print("参数", i, sys.argv[i])
python tree.py hi op 顺序是python,第一个参数是文件,之后才是别的参数 结果>> 脚本名 tree.py 参数1 hi 参数2 op
有选项 getopt.getopt(args, options[, long_options])
    import sys, getopt
    opts, args = getopt.getopt(sys.argv[1:], "hi:o:")
    for op, value in opts:
    
sys.argv[1:]为要处理的参数列表,sys.argv[0]为脚本名,所以用sys.argv[1:]过滤掉脚本名。"hi:o:": 当一个选项只是表示开关状态时,即后面不带附加参数时,在分析串中写入选项字符。当选项后面是带一个附加参数时,在分析串中写入选项字符同时后面加一个":"号。
 opts和args。opts为分析出的格式信息。args为不属于格式信息的剩余的命令行参数。
--version--file=error.txtgetopt.getopt(sys.argv[1:], "hi:o:", ["version", "file="])Github地址 | 在脚本头部添加文档来实现读取参数的便捷 会读取输入返回字典对象,可以很方便的读取输入的参数,但是需要书写大量文档, 适合参数比较多的时候,一眼过去简洁明了
Github地址快速的简洁的生成CLI 不过要自己书写帮助文档输出,小量参数的话,开发十分的便利 可以和类一起,也可以和方法一起
import fire
def main(action=None):
    print(action)
    if action == '-h':
        show_help()
       
fire.Fire(main)
// 使用时 py filename.py -h  
形参赋值传递方式
就是直接用看起来和Java一样,但不是按类型和位置,只是位置create(name='df')def create(name='df')list[:]以下两种情况(* 和 **),都必须放在形参列表的最后 (两者同时使用时:* 只能在 ** 前 )
create(age, *name) create(12, 's','d')
元组 不能指定没有的名称 错误:create(12,d=2, 2,3,4)create(age, **name) create(12, name='d', lo=23)
字典def hi(name, age=0, *names, **s) hi('d', 23,34, d=6) age会被赋值23def hi(name, *names, age=0, **s) hi('d', 23,34, d=6) 这样写age就不会赋值,除非指定名称 age=23返回值
将函数写在一个py文件里,然后导入 import 文件名,名曰导入模块
import creat as fun 给模块加别名from create import create_aliens, type_button 多个就,分隔 同理 as给函数加别名 * 通配所有注意:递归深度,Python中递归默认深度是 989, 要么更改实现,要么就 sys.setrecursionlimit(10000000)
Python 不存在多态,存在鸭子类型 博客介绍
写在一个py文件里,默认构造器,可以加参数 def __init__(self):
属性:
self.name,在任何方法中声明过即可__name私有的类属性, 类不能访问对象属性    class People:
        name = 'md'
    p = People()
    p.name = 'gh' # 声明了实例属性覆盖了类属性
    del p.name # 删除实例属性,恢复类属性引用
方法:
__开头是私有的,只能在对象的公有方法中self.__引用构造函数和析构函数:
def __init__(self)def __del__(self)    class Person:
        # 对象方法, 将对象作为参数self传进去
        def say(self):
            print('hi')
        # 静态方法
        @staticmethod
        def drink():
            print('static method')
        # 类方法,将类作为参数cls传进去
        @classmethod
        def eat(cls):
            print('class method')
self 代表了自身引用 类似Java的this
特别不舒服 init 这种命名 不像Java的构造函数重载,这个就是后面覆盖前面定义的__init__ 不管形参列表
导入和函数一样 注意继承中类的依赖
Python是支持多重继承的
同文件 父类定义要在子类之前
父类的构造器不会自动调用,需要显式使用父类构造器:
super(子类名, self).__init__(参数)super().__init__(参数)父类名.__init__()重写父类方法:只需要定义一个和父类方法同名的方法即可,因为没有多态,覆盖时形参不作考虑
多态:
__add__(self, x) 减__sub__(self, x)    try:
        print(5/0)
    except ZeroDivisionError:
        print("0 不能做除数")
    else:
        print("成功")
    finally:
        print('finally')
try except else finally
| except 分句使用形式 | 说明 | 
|---|---|
| except | 捕获所有类型 | 
| except name | 只捕获指定类型 | 
| except name, value | 捕获指定类型,并获得抛出的异常对象 | 
| except (name1, name2) | 捕获列出的异常 | 
| except (name1, name2), value | 捕获列出的异常,获得抛出的异常对象 | 
class MyExcetion(Exception):with open('a.py') as files:| 常见异常类 | 描述 | 
|---|---|
| NameError/UnboundLocalError | 引用不存在的变量/或者引用在声明之前 | 
| ZeroDivisionError | 除数为0 | 
| SyntaxError | 语法错误 | 
| IndexError | 索引错误 | 
| KeyError | 使用不存在的字典关键字 | 
| IOError | 输入输出错误 | 
| ValueError | 搜索列表中不存在的值 | 
| AtrributeError | 调用不存在的方法 | 
| TypeError | 未强制转换就混用数据类型 | 
| EOPError | 文件结束标识错误 | 
file = open('') 只读打开使用with来操作 好处是Python自动关闭文件    with open('filename') as name: 
        name.read()
为写打开新文本文件只读 file = open('a.txt','w+'[,coding='utf-8']) 打开删空
file.write('')
os模块
os.rename('filename1','filename2') mvos.remove('filename.py') rmos.listdir(path) lsos.getcwd() pwdos.makedirs(r'path') mkdiros.chdir('') 改变一个目录os.rmdir('') 删除该目录,前提是空目录os.path模块
shutil模块
b 表示字节流(二进制文件) 不加表示字符流(文本文件)
| 方式 | 意义 | 当存在 | 当不存在 | 
|---|---|---|---|
| r | 只读打开 | 打开 | 返回空指针 | 
| w | 只写打开新 | 打开删空 | 新建打开 | 
| a | 追加打开 | 打开 | 新建打开 | 
| r+ | 读打开可写 | 打开 | 返回空指针 | 
| w+ | 写打开新可读 | 打开删空 | 新建打开 | 
| a+ | 追加打开可读 | 打开 | 新建打开 | 
| rb | 只读打开 | 打开 | 返回空指针 | 
| wb | 只写打开新 | 打开删空 | 新建打开 | 
| ab | 追加打开 | 打开 | 新建打开 | 
| rb+ | 读打开可写 | 打开 | 返回空指针 | 
| wb+ | 写打开新可读 | 打开删空 | 新建打开 | 
| ab+ | 追加打开可读 | 打开 | 新建打开 | 
    alien = {'color': 'green', 'age': '23'}
    files = 'a.json'
    with open(files, 'w') as o:
        json.dump(alien, o)
    data = json.load(files)
    # 引用
    data['root']['name']
    import os
    from configparser import ConfigParser
    path = os.path.split(os.path.realpath(__file__))[0]
    mainConf = path + '/main.conf'
    cf = ConfigParser()
    cf.read(mainConf)
    host = cf.get('redis', 'host')
    # 写 但是要有write节点
    cf.set('write', 'add', '12')
    cf.write(open(mainConf, 'r+'))
    ```
    _对应的conf_
    ```conf
        [redis]
        host=127.0.0.1
. 测试通过 E 测试运行错误 F 测试断言不通过sudo apt install python3-mysqldbsudo apt install libmysqlclient-devsudo pip install mysql-python安装模块
sudo pip install redissudo pip3 install redis使用
参考官方文档 Create a Dockerfile in your Python app project
    FROM python:3
    WORKDIR /usr/src/app
    COPY requirements.txt ./
    RUN pip install --no-cache-dir -r requirements.txt
    COPY . .
    CMD [ "python", "./your-daemon-or-script.py" ]
or (if you need to use Python 2)
    FROM python:2
    WORKDIR /usr/src/app
    COPY requirements.txt ./
    RUN pip install --no-cache-dir -r requirements.txt
    COPY . .
    CMD [ "python", "./your-daemon-or-script.py" ]
python 3.5 安装
    sudo apt install python3-matplotlib 
    sudo apt install python3.5-dev python3.5-tk tk-dev
    sudo apt install libfreetype6-dev g++
id() 查看内存地址help(方法名) 展示方法的说明文档dir(对象) 展示对象的方法APIcodecs 编码os 操作系统相关API
os.path.split(os.path.realpath(__file__))[0]subprocess 代码time
redis 和Redis命令完美融合httpie HTTP方便的交互
参数==值python-docx 文档    qt4-dev-tools 中包括了Qt Assistant,Qt Linguist,Qt Creator
    qt4-doc 这个是帮助文档
    qt4-qtconfig Qt的配置工具,这个装好默认好
    qt4-demos 官方的一些Demo
    qt4-designer 可视化窗体设置工具