Python-100天(一)

2020-10-29  本文已影响0人  d4d98020ef88

之前Python就已经学过了,Flask也玩的一溜一溜的。
但是间隔时间有些长,所以就找个一个项目重新温习一下,顺便记录一下。
这个系列文章会根据 Python - 100天 的流程走下去,当然其中有一些重复性的我就不介绍了,Django这个就不介绍了,因为跟Flask重复了,而且Django体量太大,不适合拿来用于学习。

Python简介

Python的历史

  1. 1989年圣诞节:Guido von Rossum开始写Python语言的编译器。
  2. 1991年2月:第一个Python编译器(同时也是解释器)诞生,它是用C语言实现的(后面),可以调用C语言的库函数。在最早的版本中,Python已经提供了对“类”,“函数”,“异常处理”等构造块的支持,还有对列表、字典等核心数据类型,同时支持以模块为基础来构造应用程序。
  3. 1994年1月:Python 1.0正式发布。
  4. 2000年10月16日:Python 2.0发布,增加了完整的垃圾回收,提供了对Unicode的支持。与此同时,Python的整个开发过程更加透明,社区对开发进度的影响逐渐扩大,生态圈开始慢慢形成。
  5. 2008年12月3日:Python 3.0发布,它并不完全兼容之前的Python代码,不过因为目前还有不少公司在项目和运维中使用Python 2.x版本,所以Python 3.x的很多新特性后来也被移植到Python 2.6/2.7版本中。

目前我们使用的Python 3.7.x的版本是在2018年发布的,Python的版本号分为三段,形如A.B.C。其中A表示大版本号,一般当整体重写,或出现不向后兼容的改变时,增加A;B表示功能更新,出现新功能时增加B;C表示小的改动(例如:修复了某个Bug),只要有修改就增加C。如果对Python的历史感兴趣,可以阅读名为《Python简史》的博文。

Python的优缺点

Python的优点很多,简单的可以总结为以下几点。

  1. 简单和明确,做一件事只有一种方法。
  2. 学习曲线低,跟其他很多语言相比,Python更容易上手。
  3. 开放源代码,拥有强大的社区和生态圈。
  4. 解释型语言,天生具有平台可移植性。
  5. 对两种主流的编程范式(面向对象编程和函数式编程)都提供了支持。
  6. 可扩展性和可嵌入性,例如在Python中可以调用C/C++代码。
  7. 代码规范程度高,可读性强,适合有代码洁癖和强迫症的人群。

Python的缺点主要集中在以下几点。

  1. 执行效率稍低,因此计算密集型任务可以由C/C++编写。
  2. 代码无法加密,但是现在很多公司都不销售卖软件而是销售服务,这个问题会被弱化。
  3. 在开发时可以选择的框架太多(如Web框架就有100多个),有选择的地方就有错误。

Python的应用领域

目前PythonWeb应用开发、云基础设施、DevOps、网络数据采集(爬虫)、数据分析挖掘、机器学习等领域都有着广泛的应用,因此也产生了Web后端开发、数据接口开发、自动化运维、自动化测试、科学计算和可视化、数据分析、量化交易、机器人开发、自然语言处理、图像识别等一系列相关的职位。

100天计划 - Day01~15

基础知识就不详细介绍了,这个可以在下面这个网站上学习。
Python教程

Day01~15 - Python语言基础

当然也可以查看已经整理好的简要文档

Day01 - 初识Python

Day02 - 语言元素

Day03 - 分支结构

Day04 - 循环结构

Day05 - 05.构造程序逻辑

Day06 - 函数和模块的使用

Day07 - 字符串和常用数据结构

Day08 - 面向对象编程基础

Day09 - 面向对象进阶

Day10 - 图形用户界面和游戏开发

Day11 - 文件和异常

Day12 - 字符串和正则表达式

Day13 - 进程和线程

Day14 - 网络编程入门和网络应用开发

Day15 - 图像和办公文档处理

第一篇我们就扯一些稀奇古怪的东西

Python参考书籍

先列出一些Python学习的参考书籍

入门读物

  1. 《Python基础教程》(Beginning Python From Novice to Professional
  2. 《Python学习手册》(Learning Python
  3. 《Python编程》(Programming Python
  4. 《Python Cookbook》
  5. 《Python程序设计》(Python Programming: An Introduction to Computer Science
  6. 《Modern Python Cookbook》

进阶读物

  1. 《Python核心编程》(Core Python Applications Programming
  2. 《流畅的Python》(Fluent Python
  3. 《Effective Python:编写高质量Python代码的59个有效方法》(Effective Python 59 Specific Ways to Write Better Python
  4. 《Python设计模式》(Learning Python Design Patterns
  5. 《Python高级编程》(Expert Python Programming
  6. 《Python性能分析与优化》(Mastering Python High Performance

Web框架

  1. 《Django基础教程》(Tango with Django
  2. 《轻量级Django》(Lightweight Django
  3. 《Python Web开发:测试驱动方法》(Test-Driven Development with Python
  4. 《Web Development with Django Cookbook》
  5. 《Test-Driven Development with Django》
  6. 《Django Project Blueprints 》
  7. 《Flask Web开发:基于Python的Web应用开发实战》(Flask Web Development: Developing Web Applications with Python
  8. 《深入理解Flask》(Mastering Flask

爬虫开发

  1. 《用Python写网络爬虫》(Web Scraping with Python
  2. 《精通Python爬虫框架Scrapy》(Learning Scrapy
  3. 《Python网络数据采集》(Web Scraping with Python
  4. 《Python爬虫开发与项目实战》
  5. 《Python 3网络爬虫开发实战》

数据分析

  1. 《利用Python进行数据分析》(Python for Data Analysis
  2. 《Python数据科学手册》(Python Data Science Handbook
  3. 《Python金融大数据分析》(Python for Finance
  4. 《Python数据可视化编程实战》(Python Data Visualization Cookbook
  5. 《Python数据处理》(Data Wrangling with Python

机器学习

  1. 《Python机器学习基础教程》(Introduction to Machine Learning with Python
  2. 《Python机器学习实践指南》(Python Machine Learning Blueprints
  3. 《Python Machine Learning Case Studies》
  4. 《Python机器学习实践:测试驱动的开发方法》(Thoughtful Machine Learning with Python A Test Driven Approach
  5. 《Python机器学习经典实例》(Python Machine Learning Cookbook
  6. 《TensorFlow:实战Google深度学习框架》

Python编程惯例

“惯例”这个词指的是“习惯的做法,常规的办法,一贯的做法”,与这个词对应的英文单词叫“idiom”。由于Python跟其他很多编程语言在语法和使用上还是有比较显著的差别,因此作为一个Python开发者如果不能掌握这些惯例,就无法写出“Pythonic”的代码。下面我们总结了一些在Python开发中的惯用的代码。

  1. 让代码既可以被导入又可以被执行。

    if __name__ == '__main__':
    
  2. 用下面的方式判断逻辑“真”或“假”。

    if x:
    if not x:
    

    的代码:

    name = 'jackfrued'
    fruits = ['apple', 'orange', 'grape']
    owners = {'1001': '骆昊', '1002': '王大锤'}
    if name and fruits and owners:
        print('I love fruits!')
    

    不好的代码:

    name = 'jackfrued'
    fruits = ['apple', 'orange', 'grape']
    owners = {'1001': '骆昊', '1002': '王大锤'}
    if name != '' and len(fruits) > 0 and owners != {}:
        print('I love fruits!')
    
  3. 善于使用in运算符。

    if x in items: # 包含
    for x in items: # 迭代
    

    的代码:

    name = 'Hao LUO'
    if 'L' in name:
        print('The name has an L in it.')
    

    不好的代码:

    name = 'Hao LUO'
    if name.find('L') != -1:
        print('This name has an L in it!')
    
  4. 不使用临时变量交换两个值。

    a, b = b, a
    
  5. 用序列构建字符串。

    的代码:

    chars = ['j', 'a', 'c', 'k', 'f', 'r', 'u', 'e', 'd']
    name = ''.join(chars)
    print(name)  # jackfrued
    

    不好的代码:

    chars = ['j', 'a', 'c', 'k', 'f', 'r', 'u', 'e', 'd']
    name = ''
    for char in chars:
        name += char
    print(name)  # jackfrued
    
  6. EAFP优于LBYL。

    EAFP - Easier to Ask Forgiveness than Permission.

    LBYL - Look Before You Leap.

    的代码:

    d = {'x': '5'}
    try:
        value = int(d['x'])
        print(value)
    except (KeyError, TypeError, ValueError):
        value = None
    

    不好的代码:

    d = {'x': '5'}
    if 'x' in d and isinstance(d['x'], str) \
    and d['x'].isdigit():
        value = int(d['x'])
        print(value)
    else:
        value = None
    
  7. 使用enumerate进行迭代。

    的代码:

     fruits = ['orange', 'grape', 'pitaya', 'blueberry']
     for index, fruit in enumerate(fruits):
     print(index, ':', fruit)
    

    不好的代码:

    fruits = ['orange', 'grape', 'pitaya', 'blueberry']
    index = 0
    for fruit in fruits:
        print(index, ':', fruit)
        index += 1
    
  8. 用生成式生成列表。

    的代码:

    data = [7, 20, 3, 15, 11]
    result = [num * 3 for num in data if num > 10]
    print(result)  # [60, 45, 33]
    

    不好的代码:

    data = [7, 20, 3, 15, 11]
    result = []
    for i in data:
        if i > 10:
            result.append(i * 3)
    print(result)  # [60, 45, 33]
    
  9. 用zip组合键和值来创建字典。

    的代码:

    keys = ['1001', '1002', '1003']
    values = ['骆昊', '王大锤', '白元芳']
    d = dict(zip(keys, values))
    print(d)
    

    不好的代码:

    keys = ['1001', '1002', '1003']
    values = ['骆昊', '王大锤', '白元芳']
    d = {}
    for i, key in enumerate(keys):
        d[key] = values[i]
    print(d)
    

说明:这篇文章的内容来自于网络,有兴趣的读者可以阅读原文

PEP8风格指南

PEPPython Enhancement Proposal的缩写,通常翻译为“Python增强提案”。每个PEP都是一份为Python社区提供的指导Python往更好的方向发展的技术文档,其中的第8号增强提案(PEP 8)是针对Python语言编订的代码风格指南。尽管我们可以在保证语法没有问题的前提下随意书写Python代码,但是在实际开发中,采用一致的风格书写出可读性强的代码是每个专业的程序员应该做到的事情,也是每个公司的编程规范中会提出的要求,这些在多人协作开发一个项目(团队开发)的时候显得尤为重要。我们可以从Python官方网站的PEP 8链接中找到该文档,下面我们对该文档的关键部分做一个简单的总结。

空格的使用

  1. 使用空格来表示缩进而不要用制表符(Tab)。这一点对习惯了其他编程语言的人来说简直觉得不可理喻,因为绝大多数的程序员都会用Tab来表示缩进,但是要知道Python并没有像C/C++Java那样的用花括号来构造一个代码块的语法,在Python中分支和循环结构都使用缩进来表示哪些代码属于同一个级别,鉴于此Python代码对缩进以及缩进宽度的依赖比其他很多语言都强得多。在不同的编辑器中,Tab的宽度可能是2、4或8个字符,甚至是其他更离谱的值,用Tab来表示缩进对Python代码来说可能是一场灾难。
  2. 和语法相关的每一层缩进都用4个空格来表示。
  3. 每行的字符数不要超过79个字符,如果表达式因太长而占据了多行,除了首行之外的其余各行都应该在正常的缩进宽度上再加上4个空格。
  4. 函数和类的定义,代码前后都要用两个空行进行分隔。
  5. 同一个类中,各个方法之间应该用一个空行进行分隔。
  6. 二元运算符的左右两侧应该保留一个空格,而且只要一个空格就好。

标识符命名

PEP 8倡导用不同的命名风格来命名Python中不同的标识符,以便在阅读代码时能够通过标识符的名称来确定该标识符在Python中扮演了怎样的角色(在这一点上,Python自己的内置模块以及某些第三方模块都做得并不是很好)。

  1. 变量、函数和属性应该使用小写字母来拼写,如果有多个单词就使用下划线进行连接。
  2. 类中受保护的实例属性,应该以一个下划线开头。
  3. 类中私有的实例属性,应该以两个下划线开头。
  4. 类和异常的命名,应该每个单词首字母大写。
  5. 模块级别的常量,应该采用全大写字母,如果有多个单词就用下划线进行连接。
  6. 类的实例方法,应该把第一个参数命名为self以表示对象自身。
  7. 类的类方法,应该把第一个参数命名为cls以表示该类自身。

表达式和语句

Python之禅(可以使用import this查看)中有这么一句名言:"There should be one-- and preferably only one --obvious way to do it.",翻译成中文是“做一件事应该有而且最好只有一种确切的做法”,这句话传达的思想在PEP 8中也是无处不在的。

  1. 采用内联形式的否定词,而不要把否定词放在整个表达式的前面。例如if a is not b就比if not a is b更容易让人理解。
  2. 不要用检查长度的方式来判断字符串、列表等是否为None或者没有元素,应该用if not x这样的写法来检查它。
  3. 就算if分支、for循环、except异常捕获等中只有一行代码,也不要将代码和ifforexcept等写在一起,分开写才会让代码更清晰。
  4. import语句总是放在文件开头的地方。
  5. 引入模块的时候,from math import sqrtimport math更好。
  6. 如果有多个import语句,应该将其分为三部分,从上到下分别是Python标准模块第三方模块自定义模块,每个部分内部应该按照模块名称的字母表顺序来排列。

Zen of Python(Python之禅)

Beautiful is better than ugly. (优美比丑陋好)
Explicit is better than implicit.(清晰比晦涩好)
Simple is better than complex.(简单比复杂好)
Complex is better than complicated.(复杂比错综复杂好)
Flat is better than nested.(扁平比嵌套好)
Sparse is better than dense.(稀疏比密集好)
Readability counts.(可读性很重要)
Special cases aren't special enough to break the rules.(特殊情况也不应该违反这些规则)
Although practicality beats purity.(但现实往往并不那么完美)
Errors should never pass silently.(异常不应该被静默处理)
Unless explicitly silenced.(除非你希望如此)
In the face of ambiguity, refuse the temptation to guess.(遇到模棱两可的地方,不要胡乱猜测)
There should be one-- and preferably only one --obvious way to do it.(肯定有一种通常也是唯一一种最佳的解决方案)
Although that way may not be obvious at first unless you're Dutch.(虽然这种方案并不是显而易见的,因为你不是那个荷兰人这里指的是Python之父Guido
Now is better than never.(现在开始做比不做好)
Although never is often better than *right* now.(不做比盲目去做好极限编程中的YAGNI原则
If the implementation is hard to explain, it's a bad idea.(如果一个实现方案难于理解,它就不是一个好的方案)
If the implementation is easy to explain, it may be a good idea.(如果一个实现方案易于理解,它很有可能是一个好的方案)
Namespaces are one honking great idea -- let's do more of those!(命名空间非常有用,我们应当多加利用)

上一篇 下一篇

猜你喜欢

热点阅读