学习Python正式笔记(上)

python正式笔记

[为什么学Python?]

Python 越来越火爆

Python 在诞生之初,因为其功能不好,运转功率低,不支持多核,根本没有并发性可言,在计算功能不那么好的年代,一直没有火爆起来,甚至很多人根本不知道有这门语言。

随着时代的发展,物理硬件功能不断提高,而软件的复杂性也不断增大,开发效率越来越被企业重视。因此就有了不一样的声音,在软件开发的初始阶段,性能并没有开发效率重要,没必然为了节省不到 1ms 的时间却让开发量增加好几倍,这样划不过来。也就是开发效率比机器效率更为重要,那么 Python 就逐渐得到越来越多开发者的亲睐了。

在 12-14 年,云计算升温,大量创业公司和互联网巨头挤进云计算领域,而最著名的云核算开源渠道 OpenStack 就是基于 Python 开发的。

随后几年的备受关注的人工智能,机器学习首选开发语言也是 Python。

至此,Python 已经成为互联网开发的焦点。在「Top 10 的编程语言走势图」可以看到,Python 已经跃居第三位,而且在 2017 年还成为了最受欢迎的语言。

Python 开发薪资高

Python 开发人员是收入最高的开发人员之一,特别是在数据科学,机器学习和 Web 开发方面。

在北上广深一线城市上,Python 开发的薪资都达到了 2w+ 。

Python 容易入门且功能强大

你作为一名初学者,学习 Python 就是你最好的选择,因为它容易学,功能强大,很容易就能构建 Web 应用,非常适合初学者作为入门的开发语言。

Python 还一度被爆纳入高考,收编到小学课本,所以也建议弟弟小华可以酌情学习。

学习 Python 是不错的选择,因为 Python 很可能就是未来开发的主流方向,多学一门语言,多一个防身技能。而且 Python 有强大的功能库,能非常快速的开发工具,为你的本职开发工作提供护航。

Python代码规范

前言

本来不应该把这个章节放在那面前面的,因为还没进行学习之前,直接看这个章节,会感觉有很多莫名其妙的东西。

但是把这个章节放在前面的用意,只是让你预览一下,有个印象,而且在以后的学习中,也方便大家查阅。

目录

一、简明概述

1、编码

  • 如无特殊情况, 文件一律使用 UTF-8 编码
  • 如无特殊情况, 文件头部必须加入#-*-coding:utf-8-*-标识

2、代码格式

2.1、缩进

  • 统一使用 4 个空格进行缩进

2.2、行宽

每行代码尽量不超过 80 个字符(在特殊情况下可以略微超过 80 ,但最长不得超过 120)

理由:

  • 这在查看 side-by-side 的 diff 时很有帮助
  • 方便在控制台下查看代码
  • 太长可能是设计有缺陷

2.3、引号

简单说,自然语言使用双引号,机器标示使用单引号,因此 代码里 多数应该使用 单引号

  • 自然语言 使用双引号 "..."
    例如错误信息;很多情况还是 unicode,使用u"你好世界"
  • 机器标识 使用单引号 '...'
    例如 dict 里的 key
  • 正则表达式 使用原生的双引号 r"..."
  • 文档字符串 (docstring) 使用三个双引号 """......"""

2.4、空行

  • 模块级函数和类定义之间空两行;
  • 类成员函数之间空一行;
class A:

    def __init__(self):
        pass

    def hello(self):
        pass


def main():
    pass   
  • 可以使用多个空行分隔多组相关的函数
  • 函数中可以使用空行分隔出逻辑相关的代码

3、import 语句

  • import 语句应该分行书写
# 正确的写法
import os
import sys

# 不推荐的写法
import sys,os

# 正确的写法
from subprocess import Popen, PIPE
  • import语句应该使用 absolute import
# 正确的写法
from foo.bar import Bar

# 不推荐的写法
from ..bar import Bar
  • import语句应该放在文件头部,置于模块说明及docstring之后,于全局变量之前;
  • import语句应该按照顺序排列,每组之间用一个空行分隔
import os
import sys

import msgpack
import zmq

import foo
  • 导入其他模块的类定义时,可以使用相对导入
from myclass import MyClass
  • 如果发生命名冲突,则可使用命名空间
import bar
import foo.bar

bar.Bar()
foo.bar.Bar()

4、空格

  • 在二元运算符两边各空一格[=,-,+=,==,>,in,is not, and]:
# 正确的写法
i = i + 1
submitted += 1
x = x * 2 - 1
hypot2 = x * x + y * y
c = (a + b) * (a - b)

# 不推荐的写法
i=i+1
submitted +=1
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)
  • 函数的参数列表中,,之后要有空格
# 正确的写法
def complex(real, imag):
    pass

# 不推荐的写法
def complex(real,imag):
    pass
  • 函数的参数列表中,默认值等号两边不要添加空格
# 正确的写法
def complex(real, imag=0.0):
    pass

# 不推荐的写法
def complex(real, imag = 0.0):
    pass
  • 左括号之后,右括号之前不要加多余的空格
# 正确的写法
spam(ham[1], {
   eggs: 2})

# 不推荐的写法
spam( ham[1], {
    eggs : 2 } )
  • 字典对象的左括号之前不要多余的空格
# 正确的写法
dict['key'] = list[index]

# 不推荐的写法
dict ['key'] = list [index]
  • 不要为对齐赋值语句而使用的额外空格
# 正确的写法
x = 1
y = 2
long_variable = 3

# 不推荐的写法
x             = 1
y             = 2
long_variable = 3

5、换行

Python 支持括号内的换行。这时有两种情况。

  1. 第二行缩进到括号的起始处
foo = long_function_name(var_one, var_two,
                         var_three, var_four)
  1. 第二行缩进 4 个空格,适用于起始括号就换行的情形
def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)

使用反斜杠\换行,二元运算符+ .等应出现在行末;长字符串也可以用此法换行

session.query(MyTable).\
        filter_by(id=1).\
        one()

print 'Hello, '\
      '%s %s!' %\
      ('Harry', 'Potter')

禁止复合语句,即一行中包含多个语句:

# 正确的写法
do_first()
do_second()
do_third()

# 不推荐的写法
do_first();do_second();do_third();

if/for/while一定要换行:

# 正确的写法
if foo == 'blah':
    do_blah_thing()

# 不推荐的写法
if foo == 'blah': do_blash_thing()

6、docstring

docstring 的规范中最其本的两点:

  1. 所有的公共模块、函数、类、方法,都应该写 docstring 。私有方法不一定需要,但应该在 def 后提供一个块注释来说明。
  2. docstring 的结束"""应该独占一行,除非此 docstring 只有一行。
"""Return a foobar
Optional plotz says to frobnicate the bizbaz first.
"""

"""Oneline docstring"""

二、注释

1、注释

1.1、块注释

“#”号后空一格,段落件用空行分开(同样需要“#”号)

# 块注释
# 块注释
#
# 块注释
# 块注释

1.2、行注释

至少使用两个空格和语句分开,注意不要使用无意义的注释

# 正确的写法
x = x + 1  # 边框加粗一个像素

# 不推荐的写法(无意义的注释)
x = x + 1 # x加1

1.3、建议

  • 在代码的关键部分(或比较复杂的地方), 能写注释的要尽量写注释

  • 比较重要的注释段, 使用多个等号隔开, 可以更加醒目, 突出重要性

app = create_app(name, options)


# =====================================
# 请勿在此处添加 get post等app路由行为 !!!
# =====================================


if __name__ == '__main__':
    app.run()

2、文档注释(Docstring)

作为文档的Docstring一般出现在模块头部、函数和类的头部,这样在python中可以通过对象的__doc__对象获取文档.
编辑器和IDE也可以根据Docstring给出自动提示.

  • 文档注释以 “”" 开头和结尾, 首行不换行, 如有多行, 末行必需换行, 以下是Google的docstring风格示例
# -*- coding: utf-8 -*-
"""Example docstrings.

This module demonstrates documentation as specified by the `Google Python
Style Guide`_. Docstrings may extend over multiple lines. Sections are created
with a section header and a colon followed by a block of indented text.

Example:
    Examples can be given using either the ``Example`` or ``Examples``
    sections. Sections support any reStructuredText formatting, including
    literal blocks::

        $ python example_google.py

Section breaks are created by resuming unindented text. Section breaks
are also implicitly created anytime a new section starts.
"""
  • 不要在文档注释复制函数定义原型, 而是具体描述其具体内容, 解释具体参数和返回值等
#  不推荐的写法(不要写函数原型等废话)
def function(a, b):
    """function(a, b) -> list"""
    ... ...


#  正确的写法
def function(a, b):
    """计算并返回a到b范围内数据的平均值"""
    ... ...
  • 对函数参数、返回值等的说明采用numpy标准, 如下所示
def func(arg1, arg2):
    """在这里写函数的一句话总结(如: 计算平均值).

    这里是具体描述.

    参数
    ----------
    arg1 : int
        arg1的具体描述
    arg2 : int
        arg2的具体描述

    返回值
    -------
    int
        返回值的具体描述

    参看
    --------
    otherfunc : 其它关联函数等...

    示例
    --------
    示例使用doctest格式, 在`>>>`后的代码可以被文档测试工具作为测试用例自动运行

    >>> a=[1,2,3]
    >>> print [x + 3 for x in a]
    [4, 5, 6]
    """
  • 文档注释不限于中英文, 但不要中英文混用

  • 文档注释不是越长越好, 通常一两句话能把情况说清楚即可

  • 模块、公有类、公有方法, 能写文档注释的, 应该尽量写文档注释

三、命名规范

1、模块

  • 模块尽量使用小写命名,首字母保持小写,尽量不要用下划线(除非多个单词,且数量不多的情况)
# 正确的模块名
import decoder
import html_parser

# 不推荐的模块名
import Decoder

2、类名

  • 类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头
class Farm():
    pass

class AnimalFarm(Farm):
    pass

class _PrivateFarm(Farm):
    pass
  • 将相关的类和顶级函数放在同一个模块里. 不像Java, 没必要限制一个类一个模块.

3、函数

  • 函数名一律小写,如有多个单词,用下划线隔开
def run():
    pass

def run_with_env():
    pass
  • 私有函数在函数前加一个下划线_
class Person():

    def _private_func():
        pass

4、变量名

  • 变量名尽量小写, 如有多个单词,用下划线隔开
if __name__ == '__main__':
    count = 0
    school_name = ''
  • 常量采用全大写,如有多个单词,使用下划线隔开
MAX_CLIENT = 100
MAX_CONNECTION = 1000
CONNECTION_TIMEOUT = 600

5、常量

  • 常量使用以下划线分隔的大写命名
MAX_OVERFLOW = 100

Class FooBar:

    def foo_bar(self, print_):
        print(print_)

一、第一个 Python 程序

好了,说了那么多,现在我们可以来写一下第一个 Python 程序了。

一开始写 Python 程序,个人不太建议用专门的工具来写,不方便熟悉语法,所以这里我先用 Sublime Text 来写,后期可以改为用 PyCharm 。

第一个 Python 程序当然是打印 Hello Python 啦,我以前打印的是“我爱你”,哈哈,害羞、、。

新建一个文件,命名为 HelloPython.py , 注意,这里是以 .py 为后缀的文件。

然后打开文件,输入 print('Hello Python')

最后就可以打开命令行窗口,把当前目录切换到 HelloPython.py 所在目录,就可以运行这个程序了,下面就是运行的结果。

当然,如果你是使用 Sublime Text ,并且在安装 Python 的时候配置好了环境变量,直接按 Ctrl + B 就可以运行了,运行结果如下:

二、集成开发环境(IDE): PyCharm

我本人一直是建议你在学习周期使用文本编辑器或者是Sublime Text 这个工具来写 Python 程序的,因为这样有利于我们了解整个流程。

PyCharm 是由 JetBrains 打造的一款 Python IDE,支持 macOS、 Windows、 Linux 系统。

PyCharm 下载地址 : https://www.jetbrains.com/pycharm/download/
现在我给你电脑上都已经安装了这两个软件,但建议可以自己手动安装,方便日后你自己搭建环境。

基本数据类型和变量

一、Python 语法的简要说明

每种语言都有自己的语法,不管是自然语言(英语,中文)还是计算机编程语言。

Python 也不例外,它也有自己的语法规则,然后编辑器或者解析器根据符合语法的程序代码转换成 CPU 能够执行的机器码,然后执行。

Python 的语法比较简单,采用缩进方式。

Python语法.png

如上面的代码截图,以 # 开头的语句是注释,其他每一行都是一个语句,当语句以冒号 : 结尾时,缩进的语句视为代码块。

要注意的是 Python 程序是大小写敏感的,如果写错了大小写,程序会报错。

二、print() 函数

这里先说一下 print() 函数,如果你是新手,可能对函数不太了解,没关系,在这里你只要了解它的组成部分和作用就可以了,后面函数这一块会详细说明的。

print() 函数由两部分构成 :

  1. 指令:print
  2. 指令的执行对象,在 print 后面的括号里的内容

print() 函数的作用是让计算机把你给它的指令结果,显示在屏幕的终端上。这里的指令就是你在 print() 函数里的内容。

比如在上一章节中,我们的第一个 Python 程序,打印 print('Hello Python')

它的执行流程如下:

  1. 向解释器发出指令,打印 ‘Hello Python’
  2. 解析器把代码解释为计算器能读懂的机器语言
  3. 计算机执行完后就打印结果

可能这里有人会问,为什么要加单引号,直接 print(Hello Python) 不行吗?

如果你写代码过程中,有这样的疑问,直接写一下代码,自己验证一下是最好的。

显然,去掉单引号后,运行结果标红了(报错),证明这是不可以的。

主要是因为这不符合 Python 的语法规则,去掉单引号后, Python 解释器根本没法看懂你写的是什么。

所以就报 SyntaxError: invalid syntax 的错误,意思是:语法错误。说明你的语句不合规则。

三、Python 的基本数据类型

1、字符串

字符串英文 string ,是 python 中随处可见的数据类型,字符串的识别也非常的简单,就是用「引号」括起来的。

引号包括单引号 ' ' ,双引号 " " 和 三引号 ''' ''' ,比如 'abc'"123" 等等。

这里请注意,单引号 '' 或双引号 "" 本身只是一种表示方式,不是字符串的一部分,因此,字符串 'abc' 只有 a,b,c 这 3 个字符。

如果善于思考的你,一定会问?

为什么要有单引号 ' ' ,双引号 " " 和 三引号 ''' ''' 啊,直接定死一个不就好了,搞那么麻烦,那么多规则表达同一个东西干嘛?

对,一般来说一种语法只用一个规则来表示是最好的,竟然现在字符串有三种不同的表示,证明是有原因的。

那么我们先来看下这三种方式,来定义同样内容的字符串,再把它打印出来,看看是怎样的。

打印出来的结果是一样的。

那如果我们的字符串不是 两点水,是 两'点'水 这样呢?

这样就直接报错了。

但是要注意,用单引号 ' ' 不行,用双引号 " " 是可以的。

打印的结果也跟预想的一样:

至于三引号,也是一样的,如果字符串内容里面含有双引号,也是会报同样的错误的。那么这时候你就可以用三引号了。

那么用单引号,双引号定义的字符串就不能表示这样的内容吗?

并不是的,你可以使用转义字符。

比如单引号,你可以使用 \' 来表示,双引号可以使用 \" 来表示。

注意,这里的是反斜杠 \, 不是斜杆 /

了解了之后,直接程序测试一下:

运行结果如下:

最后,也提一下, 三引号 ''' ''' 是直接可以分行的。

运行结果:

2、整数

整数英文为 integer 。代码中的整数跟我们平常认识的整数一样,包括正整数、负整数和零,是没有小数点的数字。

Python 可以处理任意大小的整数,例如:1100-80800,等等。

运行结果:

当然,要注意了,如果数字你用引号括起来了,那就属于字符串,而不属于整数。比如 '100' , 这 100 是字符串,不是整数。

在现实世界中,整数我们通常会做计算,因此代码世界也是一样,整数可以直接加减乘除。

比如:

程序运行结果:

这里提示下大家,看看上面的例子,有没有发现什么?

看下 int4 打印出来的结果,是 0.5 , 是一个小数。

而我们上面对整数的定义是什么?

是没有小数点的数字。

因此 int4 肯定不是整数。

这里我们可以使用 type() 函数来查看下类型。

结果如下:

可以看到 int4 是 float 类型,而 int1 ,int2,int3 都是 int 整数类型。

那么 float 是什么类型呢?

float 是浮点数类型,是我们下面会说到的。

在说浮点数之前,你可以看下 Python 的算术运算符有哪些,有个印象。

3、浮点数

浮点数的英文名是 float ,是指带小数的数字。

浮点数跟整数有很多类似的地方,但是浮点数是最折磨人的,也是最难让人捉摸透的。

就好比世界级的大佬 Herb Sutter 说的:「世上的人可以分为3类:一种是知道自己不懂浮点运算的;一种是以为自己懂浮点运算的;最后一种是极少的专家级人物,他们想知道自己是否有可能,最终完全理解浮点运算。」

为什么这么说呢?

看下面的例子 ,像整数一样,只是基本的浮点数加法运算。

可是运算结果,对于初学者来说,可能会接受不了。

对于第一个还好,0.55+0.41 等于 0.96 ,运算结果完全一致。可是后面两个,你会发现怎么出现了那么多个零。

这是因为计算机对浮点数的表达本身是不精确的。保存在计算机中的是二进制数,二进制对有些数字不能准确表达,只能非常接近这个数。

所以我们在对浮点数做运算和比较大小的时候要小心。

4、布尔值

布尔值和布尔代数的表示完全一致,一个布尔值只有 TrueFalse两种值,要么是 True,要么是 False,在 Python 中,可以直接用 True、False 表示布尔值(请注意大小写),也可以通过布尔运算计算出来。

布尔值可以用 andornot 运算。

and 运算是与运算,只有所有都为 True,and 运算结果才是 True。

or 运算是或运算,只要其中有一个为 True,or 运算结果就是 True。

not 运算是非运算,它是一个单目运算符,把 True 变成 False,False 变成 True。

5、空值

基本上每种编程语言都有自己的特殊值——空值,在 Python 中,用 None 来表示

四、 字符串的编码问题

我们都知道计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),0 - 255被用来表示大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母 A 的编码是 65,小写字母 z 的编码是 122。

如果要表示中文,显然一个字节是不够的,至少需要两个字节,而且还不能和 ASCII 编码冲突,所以,中国制定了 GB2312 编码,用来把中文编进去。

类似的,日文和韩文等其他语言也有这个问题。为了统一所有文字的编码,Unicode 应运而生。Unicode 把所有语言都统一到一套编码里,这样就不会再有乱码问题了。

Unicode 通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为 0 就可以。

因为 Python 的诞生比 Unicode 标准发布的时间还要早,所以最早的Python 只支持 ASCII 编码,普通的字符串 ‘ABC’ 在 Python 内部都是 ASCII 编码的。

Python 在后来添加了对 Unicode 的支持,以 Unicode 表示的字符串用u'...'表示。

不过在最新的 Python 3 版本中,字符串是以 Unicode 编码的,也就是说,Python 的字符串支持多语言。就像上面的例子一样,我的代码中没有加u'...',也能正常显示。

不过由于 Python 源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为 UTF-8 编码。当Python 解释器读取源代码时,为了让它按 UTF-8 编码读取,我们通常在文件开头写上这两行:

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

第一行注释是为了告诉 Linux/OS X 系统,这是一个 Python 可执行程序,Windows 系统会忽略这个注释;

第二行注释是为了告诉 Python 解释器,按照 UTF-8 编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。

申明了 UTF-8 编码并不意味着你的 .py 文件就是 UTF-8 编码的,必须并且要确保文本编辑器正在使用 UTF-8 without BOM 编码

五、基本数据类型转换

Python 中基本数据类型转换的方法有下面几个。

方法 说明
int(x [,base ]) 将x转换为一个整数
float(x ) 将x转换到一个浮点数
complex(real [,imag ]) 创建一个复数
str(x ) 将对象 x 转换为字符串
repr(x ) 将对象 x 转换为表达式字符串
eval(str ) 用来计算在字符串中的有效 Python 表达式,并返回一个对象
tuple(s ) 将序列 s 转换为一个元组
list(s ) 将序列 s 转换为一个列表
chr(x ) 将一个整数转换为一个字符
unichr(x ) 将一个整数转换为 Unicode 字符
ord(x ) 将一个字符转换为它的整数值
hex(x ) 将一个整数转换为一个十六进制字符串
oct(x ) 将一个整数转换为一个八进制字符串

注:在 Python 3 里,只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。

这里我们可以尝试一下这些函数方法。

比如 int() 函数,将符合规则的字符串类型转化为整数 。

输出结果:

注意这里是符合规则的字符串类型,如果是文字形式等字符串是不可以被 int() 函数强制转换的。

还有小数形式的字符串也是不能用 int() 函数转换的。

这样转换会报错。

但这并不是意味着浮点数不能转化为整数,而是小数形式的字符串不能强转为字符串。

浮点数还是可以通过 int() 函数转换的。

比如:

输出结果:

但是你会发现,结果是 88 ,后面小数点的 0.88 被去掉了。

这是因为 int() 函数是将数据转为整数。如果是浮点数转为整数,那么 int() 函数就会做取整处理,只取整数部分。所以输出的结果为 88 。

其余的方法就不一一列举了,只要多用,多试,这些方法都会慢慢熟悉的。还有如果是初学者,完全可以每个方法都玩一下,写一下,随便写,然后运行看结果,反正你的电脑又不会因为这样而玩坏的。

六、Python 中的变量

1、变量的创建和赋值

在 Python 程序中,变量是用一个变量名表示,可以是任意数据类型,变量名必须是大小写英文、数字和下划线(_)的组合,且不能用数字开头,比如:

a=88

这里的 a 就是一个变量,代表一个整数,注意一点是 Python 是不用声明数据类型的。在 Python 中 = 是赋值语句,跟其他的编程语言也是一样的,因为 Python 定义变量时不需要声明数据类型,因此可以把任意的数据类型赋值给变量,且同一个变量可以反复赋值,而且可以是不同的数据类型。

Python 中的变量.png

这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。例如 Java 是静态语言。

2、变量的指向问题

我们来看下这段

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值