2020-02-17python高手之路学习随笔(1)

2020-02-18  本文已影响0人  七天七念

第一章项目开始

2.7是python2的最后一个版本,支持到2020年结束。
一,项目布局
requirements.txt 应该包含Python包所需要的依赖包。
自动生成requirements.txt,pip freeze > requirements.txt
使用requirements.txt 安装依赖包pip install -r requirements.txt
这里的requirements.txt名字可以随意修改牡丹石requirements是最常用通俗的。
README.rst 应该为用户提供重要信息。

在python2里面需要创建init.py ,这种名称的py文件来表示本目录是一个python的包。
而在python3里面不需要这种写法了,
二,代码风格与自动检查
Pyhton代码的PEP8标准:
1每个缩进层级使用4个空格。
2每行最多79个字符。
3顶层的函数或类的定义之间空两行。
4采用ADCII或者UTF-8编码文件。
5在文件顶端,注释和文档说明之下,每行每条import 语句只能导入一个模块,同时要按标准库,第三方库和本地库的导入顺序进行分组。
6在小括号,中括号,大括号之间或者逗号之前没有额外的空格。
7类的命名采用骆驼命名法,如 CamenCase,异常的定义使用Error前缀,函数的命名使用下划线分隔的小写字母,如separated_by_underscores,私有属性或者方法用下划线开头定义,如_private。(需要注意的是类的内置方法一般都是用双下划线开头的,如help

PEP8 检测工具
您可以使用以下命令安装、升级和卸载pep8。
pip install pep8 pip install --upgrade pep8
$ pip uninstall pep8

或者使用网页下载,但是外网太卡了
https://pypi.org/project/pep8

1 检测命令为 pep8 --first optparse.py ,这里的optparse.py 可以是你要检测的文件名
类似于此
10.py:2:1: E265 block comment should start with '# '
py后面的2是行数,1位置的数字应该是代表错误所在的位置,算上空格的位置
E代表错误,W代表小错误,后面的数字2开头表示跟空格有关,3开头表示跟空行有关

2 也可以直接显示错误代码,不过适用性没尚明的命令高
pep8 --show-source --show-pep8 optparse.py

3或者可以显示每个错误的发现频率
pep8 --statistics -qq Python-2.5/Lib
但是最实用的单文件检测应该是第一个命令

其他类似的检车工具:
pyflakes(https://launchpad.net/pyflakes) 支持插件
pylint (https://pypi.python.org/pypi/pylint) 支持默认PEP8,支持插件
flake8 (https://pypi.python.org/pypi/flake8) 结合pyflakes个pep8
hacking(https://pypi.python.org/pypi/hacking) hacking是flake8 的进化版本
以上工具都可以用命令pip install +名字 下载 然后进网站看用法。
按书上Joshua Harlow所说,python的最大遗憾还是因为gil的原因导致的python缺少多核并发的能力

上面说一个名为goless的Python库能简单点,但是按现在这种时代 还是默默无闻的情况来看,估计是
再竞争中被 多进程库给淘汰了吧。然后实验 了一下,实际上这玩意还是基于gevent写的库,只是改变了风格
实际上因为多加了一层还不如学学怎么使用gevent这种库实际,被淘汰不是没有原因的。

自此高手之路第一章 项目开始结束,主要还是讲了一些包的写法组成以及语法规范的问题。
附上goless例子,你需要安装goless跟gevent库,以CPython为例

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from __future__ import print_function

import goless


def simple():
    channel = goless.chan()

    def goroutine():
        while True:
            value = channel.recv()
            channel.send(value ** 2)
    goless.go(goroutine)

    for i in range(2, 5):
        channel.send(i)
        squared = channel.recv()
        print('%s squared is %s' % (i, squared))

    # Output:
    # 2 squared is 4
    # 3 squared is 9
    # 4 squared is 16

if __name__ == '__main__':
    simple()
上一篇下一篇

猜你喜欢

热点阅读