热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

第一章:用Pythonic方式来思考(Ⅰ)

这篇文章是基于《EffectivePython——编写高质量Python代码的59个有效方法》[美]布雷特斯拉特金著爱飞翔译这本书中的内容,写写自己在某方面的感悟&#

这篇文章是基于《Effective Python——编写高质量Python代码的59个有效方法》[美] 布雷特·斯拉特金 著 爱飞翔 译 这本书中的内容,写写自己在某方面的感悟,并摘录一些作为读书笔记供今后鞭策。侵删。

第 1 条:确认自己所用的Python版本


  • 如果你现在想入手Python学习,那么就选择python3。

    $ python --version
    Python 2.7.8

  • 流行的Python运行环境:CPython、Jython、IronPython、PyPy。


memo


  • 选择什么版本Python下载?

    • 按照我的经验来看,最好不要选择最新版本的型号,因为会有一些包并没有匹配最新版本的,可以试试3.5/3.6。
  • 解释器的问题
    我们在编写python代码时,会得到一个以.py结尾的文件,而我们需要使用解释器去执行我们的.py文件。

    • CPython解释器:这是Python自带的一种解释器,通过 cmd(command line,命令行)便可以打开,在cmd下,输入"python",或是直接在“运行”(win+R打开)中输入python均可以进入交互式命令行界面(解释器),如下图所示:
      方法一:
      在这里插入图片描述
      在这里插入图片描述
      方法二:
      在这里插入图片描述
      在这里插入图片描述

      python还自带了一种可以直接打开的CPython解释器——IDLE ( 集成开发环境),当安装好python后,便可以发现如下图所示的应用程序,打开即可,如果找不到的话,可以在电脑中搜索idle.exe。
      在这里插入图片描述
      打开后便可以看到如下的界面中的一个:图中的Python Shell可以打开右侧的界面,点击File->New Files可以新建出左侧的界面。我们可以在右侧进行交互式编程,可以用它来当作计算器使用,在左侧界面中可以编写脚本或者小程序。
      在这里插入图片描述

    • IPyhton解释器:一种交互方式更友好的python解释器。功能和CPython并没有区别,如下图所示:
      在这里插入图片描述

    • Pypy解释器:能够提高Python代码的执行速度,会对代码进行编译,而非传统的解释执行,如果你对C语言是如何运行的有所了解的话,可能你能够理解。

    • Jython解释器:运行在Java平台的解释器。

    • IronPython解释器:运行在Microsoft.NET平台上的解释器。


第 2 条:遵循PEP 8 风格指南

Python官方关于PEP8的规范

空白


  • 使用space来表示缩进,不要使用tab。
  • 每行字符数不应该超过79。
  • 对于占据多行的长表达式来说,除了首行之外的其余各行都应该在通常的缩进级别上再加4个空格。
  • 在同一个类中,各方法之间应该用一个空行隔开。
  • 文件中的函数与类之间应该用两个空行隔开。
  • 为变量赋值的时候,在等号两边添加一个空格,其余条件下等号两边能不加空格就不要加。

memo


  • python中的空格和tab键不能混用
    否则的话则会报类似如下的错误:

    IndentationError: unindent does not match any outer indentation level

  • Pycharm中如何设置每行字符个数?
    File→Settings→Code Style→ columns
    在这里插入图片描述
    可以看到右侧显示了一条竖线来表示字符范围。
    在这里插入图片描述

  • 如何在pycharm设置pep8外部工具,实现代码的自动排版?

    • 安装autopep8

      pip install autopep8

    • 本文使用的Pycharm版本如下

      PyCharm 2019.3.1 (Community Edition)
      Build #PC-193.5662.61, built on December 19, 2019
      Runtime version: 11.0.5+10-b520.17 amd64
      VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
      Windows 10 10.0
      GC: ParNew, ConcurrentMarkSweep
      Memory: 974M
      Cores: 4
      Registry:
      Non-Bundled Plugins: izhangzhihao.rainbow.brackets

    • File - Settings - Tools - External Tools
      在这里插入图片描述
      在这里插入图片描述
      上图的内容如下:

      Name:autoPep8
      Program:autopep8
      Arguments: --in-place --aggressive --aggressive $FilePath$
      Working directory: $ProjectFileDir$
      Output filters: $FILE_PATH$\:$LINE$\:$COLUMN$\:.*

      点击OK即可配置成功。

      这是未经规范化的代码:

      # coding: utf-8
      # !/usr/bin/python
      """
      @File : useNewTemplate.py
      @Author : jiaming
      @Modify Time: 2019/11/29 21:30
      @Contact : https://blog.csdn.net/weixin_39541632
      @Version : 1.0
      @Desciption : None
      """

      import os
      import randomimport pysnooperclass Tree(object):"""xxx."""def __init__(self, left,right):"""构造函数:param left: 左节点:param right: 右节点"""self.left = leftself.right=rightpassdef print_array(self):pass@pysnooper.snoop()
      def main():"""主函数:return:"""passif __name__ == "__main__":main()

      在这里插入图片描述
      点击完毕autopep8后,我们可以看到如下的效果。

      # coding: utf-8
      # !/usr/bin/python
      """
      @File : useNewTemplate.py
      @Author : jiaming
      @Modify Time: 2019/11/29 21:30
      @Contact : https://blog.csdn.net/weixin_39541632
      @Version : 1.0
      @Desciption : None
      """

      import os
      import randomimport pysnooperclass Tree(object):"""xxx."""def __init__(self, left, right):"""构造函数:param left: 左节点:param right: 右节点"""self.left = leftself.right = rightpassdef print_array(self):pass@pysnooper.snoop()
      def main():"""主函数:return:"""passif __name__ == "__main__":main()


命名


  • 函数、类属性、变量:小写字母+下划线 (lowercase_underscore)
  • 受保护的类属性:以单个下划线开头 (_leading_underscore)
  • 私有的类属性:应该以两个下划线开头 (__double_leading_underscore)
  • 类与异常:采用驼峰命名法。百度百科:驼峰命名法
  • 模块级常量:大写+下划线分隔
  • 类中实例方法首个参数:默认为self就好
  • 类中的类方法的首个参数:默认为cls就好

表达式语句


  • 判断是否为空值或是非空值,不应该采用长度判断法,应该使用条件判断,比如:

    >>> l = []
    >>> l is None
    False
    >>> len(l) == 0
    True
    >>> l.append(1)
    >>> l is None
    False

    可以参考我的这篇博文,探究None和False的区别None和False

  • 将单行的if、while、for、except的复合语句拆分成多行完成。

  • import语句总是应该在文件开头

  • 引入模块时采用 from…import…as…格式

  • 将引入模块按照顺序引入:标准库模块,第三方模块,自用模块。每一部分的模块均按照字母顺序排列。


第 3 条:了解bytes、str与unicode的区别

Python 3有两种表示字符序列的类型:bytesstr。前者的实例包含原始的8位值,后者的实例包含Unicode字符。把Unicode字符表示为二进制数据有许多种方法,最常见的编码方式是UTF-8
要想把Unicode字符转化成为二进制数据,就必须使用encode方法,要想把二进制数据转换成为Unicode字符,则必须使用decode方法。来看下面这个样例:

>>> s = 'a'.encode()
>>> s
b'a'
>>> type(s)
<class &#39;bytes&#39;>
>>> s &#61; &#39;123&#39;.encode()
>>> s
b&#39;123&#39;
>>> s &#61; &#39;我喜欢Python&#39;.encode()
>>> s
b&#39;\xe6\x88\x91\xe5\x96\x9c\xe6\xac\xa2Python&#39;
>>> s.decode(&#39;UTF-8&#39;)
&#39;我喜欢Python&#39;

Python 3中编写接受str或bytes&#xff0c;并返回str的方法&#xff1a;
以下是在交互式命令行中运行的结果。

>>> def to_str(bytes_or_str):
... if isinstance(bytes_or_str, bytes):
... value &#61; bytes_or_str.decode(&#39;utf-8&#39;)
... else:
... value &#61; bytes_or_str
... return value
...

Python 3中编写接受str或bytes&#xff0c;并返回bytes的方法&#xff1a;
以下是在交互式命令行中运行的结果。

>>> def to_bytes(bytes_or_str):
... if isinstance(bytes_or_str, str):
... value &#61; bytes_or_str.encode(&#39;utf-8&#39;)
... else:
... value &#61; bytes_or_str
... return value
...

memo


  • 对于操作二进制文件可能出现的问题
    在python 3中&#xff0c;如果内置的open函数获取了文件的句柄&#xff0c;那么请注意&#xff0c;该句柄1会采用UTF-8编码格式来操作文件。
    向文件中写入二进制数据&#xff1a;使用的方式为(‘wb’)而不是(‘w’)。读取数据时采用(‘rb’)而不是(‘r’)

第 4 条&#xff1a;使用辅助函数来代替复杂表达式

一行代码可以有多复杂&#xff1f;

print(&#39;\n&#39;.join([&#39;&#39;.join([(&#39;Love&#39;[(x-y) % len(&#39;Love&#39;)] if ((x*0.05)**2&#43;(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3 <&#61; 0 else &#39; &#39;) for x in range(-30, 30)]) for y in range(30, -30, -1)]))

下图展现了它的结果。代码解释请参考我的这篇博客&#xff1a;心形
在这里插入图片描述
针对上述极为复杂的代码我们应该采取使用函数的方式来简化。我们只需要将上面代码中的各个语句拆分出来即可。这会让代码变得更加易读&#xff0c;比原来密集的写法更好。
由于Python短小精悍&#xff0c;功能强大&#xff0c;所以很容易就能够写出非常复杂的表达式&#xff0c;我们要避免这种写法。



  1. 是一种标识符或者指针&#xff0c;可以理解为文件的描述符&#xff0c;用来指代开发者将要操作的文件。
    在这里插入图片描述 ↩︎



推荐阅读
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • Python已成为全球最受欢迎的编程语言之一,然而Python程序的安全运行存在一定的风险。本文介绍了Python程序安全运行需要满足的三个条件,即系统路径上的每个条目都处于安全的位置、"主脚本"所在的目录始终位于系统路径中、若python命令使用-c和-m选项,调用程序的目录也必须是安全的。同时,文章还提出了一些预防措施,如避免将下载文件夹作为当前工作目录、使用pip所在路径而不是直接使用python命令等。对于初学Python的读者来说,这些内容将有所帮助。 ... [详细]
  • 通过Anaconda安装tensorflow,并安装运行spyder编译器的完整教程
    本文提供了一个完整的教程,介绍了如何通过Anaconda安装tensorflow,并安装运行spyder编译器。文章详细介绍了安装Anaconda、创建tensorflow环境、安装GPU版本tensorflow、安装和运行Spyder编译器以及安装OpenCV等步骤。该教程适用于Windows 8操作系统,并提供了相关的网址供参考。通过本教程,读者可以轻松地安装和配置tensorflow环境,以及运行spyder编译器进行开发。 ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
  • ihaveusedthedelphidatabindingwizardwithmyxmlfile,andeverythingcompilesandrunsfine. ... [详细]
  • 开发笔记:python协程的理解
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了python协程的理解相关的知识,希望对你有一定的参考价值。一、介绍什么是并发?并发的本质就是 ... [详细]
  • 校园表白墙微信小程序,校园小情书、告白墙、论坛,大学表白墙搭建教程
    小程序的名字必须和你微信注册的名称一模一样在后台注册好小程序。mp.wx-union.cn后台域名https。mp.wx-union.cn ... [详细]
  • 这篇文章主要讲解了“如何应对Android面试”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何应对 ... [详细]
  • Android NDK开发的一点尝试
    写在前面笔者是一个“原始”的C++开发者,对Java编程虽说不上抵触但也没有C++那么顺手。而且,作为一个游戏引擎,不管是在什么地方,效率总是第一位的,尤其是在移动平台这样资源吃紧 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • layui表格分页不生效怎么办
    web前端|Layui教程layuiweb前端-Layui教程小程序实例源码,ubuntuip切换,tomcat默认端改为80,爬虫完整源码,微信小程序php接口,seo专业培训班 ... [详细]
author-avatar
rockminer
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有