目录 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-2
3+4j
0.1-0.5j
""
''
:falsesudo apt install python3-venv
python3 -m venv web
或者 virtualenv --no-site-packages web
不将系统中安装的包带入该环境source web/bin/activate
deactivate
pip | Python的包管理器
pip freeze > requirements.txt
这个命令会将当前环境安装的包全部列出来, 适合env环境下使用
pip install pipreqs
然后 pipreqs /path/to/project
pip install -r requirements.txt
global 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 int
append()/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 byte
dict['a'] = 2323
del 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.txt
getopt.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-mysqldb
sudo apt install libmysqlclient-dev
sudo pip install mysql-python
安装模块
sudo pip install redis
sudo 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 可视化窗体设置工具