python 简介

在Python中,代码不是越多越好,而是越少越好。代码不是越复杂越好,而是越简单越好。请始终牢记,代码越少,开发效率越高。

越低级的语言,越贴近计算机,抽象程度低,执行效率高,比如C语言;越高级的语言,越贴近计算,抽象程度高,执行效率低,比如Python语言。

人工智能领域:现在最流行的人工智能技术栈就是 TensorFlow 和 PyTorch

.py 文件申明

1
2
3
4
5
.py文件开头应先写以下两条注释申明
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

fileDir = None # 全局变量声明

开发规范

开发环境根据自己的习惯安装 Python,推荐使用 pyenv,避免和已存在的版本造成冲突

安装完 Python 后安装 pipenv

通过使用环境变量控制必要的参数,如 redis 服务器地址,redis 队列名等,环境变量写在源码目录的 .env 文件中,格式如下:

1
2
REDIS_HOST=127.0.0.1
REDIS_PORT=63790

基础知识点

  • __new__方法是创建类实例的方法, __new__方法的调用是发生在__init__之前

  • 代码注释docstring: 出现在模块、函数、类、方法里第一个语句。可以用class_name.__doc__访问

  • CPython解释器: 对python语法的检查仅限于执行到的代码,故测试时必须所有逻辑判断都要测试一遍,这样才能保证代码不出语法错误!

  • python字符串连接符组合列表:+

    1
    2
    
    s = 'A'+ 'B'  # print('AB')
    L = [1] + [ L[x-1] + L[x] for x in range(1,len(L)) ] + [1] # +号用于组合列表
    
  • 对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。eg: var.replace(‘A’, ‘a’)

  • 赋值:n, a, b = 0, 0, 1 #同时赋值多个变量,相当于t = (0, 0, 1) n=t[0] a=t[1] b=t[2] #t是一个tuple

  • 大部分字符转义使用\,而格式化字符串时%的转义使用%。

  • 函数定义需要进行参数检查

  • 在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便

  • python中List删除元素的几种方法

    1
    2
    3
    4
    5
    6
    7
    
    li = [1,2,3,4,5,6]
    # 1.使用del删除对应下标的元素
    del li[2]
    #print(li) ->  li = [1,2,4,5,6]
    # 2.删除指定值的元素
    li.remove(4)
    # print(li) -> li = [1,2,5,6]
    
  • 以后遇到了IndentationError: unexpected indent你就要知道python编译器是在告诉你“Hi,老兄,你的文件里格式不对了,可能是tab和空格没对齐的问题,你需要检查下tab和空格了”。

  • Python标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题。

  • is检查两个对象是否是同一个对象,而==检查他们是否相等.

  • 把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。

  • 函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数

  • 字符串单引号、双引号、三引号

    1. 单引号中可以使用双引号,中间的会当作字符串输出
    2. 双引号中可以使用单引号,中间的会当作字符串输出
    3. 三单引号和三双引号中间的字符串在输出时保持原来的格式。[包含换行符]
  • 字符串格式化的两种方式:

    1. 使用format() [推荐使用这种方式,格式方式更多]

      “{1} {0} {1}".format(“hello”, “world”) # 设置指定位置

      “网站名:{name}, 地址 {url}".format(name=“菜鸟教程”, url=“www.runoob.com”)

      “{:.2f}".format(3.1415926)

    2. 使用%

      print(“the length of (%s) is %d” %(‘Hello World’,len(‘Hello World’)))

  • 列表list对 + 和 * 的操作符与字符串相似。+ 号用于组合列表,* 号用于重复列表。

    图片

  • 字符串和编码转换:str和bytes互相转换时,需要指定编码。最常用的编码是UTF-8。chr/ord, encode/decode

  • 错误异常处理机制

    Python内置的try…except…else…finally用来处理错误十分方便。出错时,会分析错误信息并定位错误发生的代码位置才是最关键的。[通用捕捉异常错误代码:except Exception as e]

  • 代码调试

    如果要比较爽地设置断点、单步执行,就需要一个支持调试功能的IDE。目前比较好的Python IDE有PyCharm。

    虽然用IDE调试起来比较方便,但是最后你会发现,logging才是终极武器。

  • IO编程:

    IO在计算机中指Input/Output,也就是输入和输出。由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘、网络等,就需要IO接口。

    IO编程中,Stream(流)是一个很重要的概念,可以把流想象成一个水管,数据就是水管里的水,但是只能单向流动。Input Stream就是数据从外面(磁盘、网络)流进内存,Output Stream就是数据从内存流到外面去。对于浏览网页来说,浏览器和新浪服务器之间至少需要建立两根水管,才可以既能发数据,又能收数据。

  • 图形界面:Python内置的Tkinter可以满足基本的GUI程序的要求

  • dict 和 set: set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。【可以用于list去重】

  • 字符串前加 r 和 u 的作用

    1. 字符串前加u:后面字符串以 Unicode 格式 进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时出现乱码。
    2. 字符串前加r: 去掉反斜杠的转移机制,常用于正则表达式

定义默认参数

定义默认参数要牢记一点:默认参数必须指向不变对象

  1. 不变对象:str, None, tuple, int, florat
  2. 可变对象:list

为什么要设计str、None这样的不变对象呢?因为不变对象一旦创建,对象内部的数据就不能修改,这样就减少了由于修改数据导致的错误。此外,由于对象不变,多任务环境下同时读取对象不需要加锁,同时读一点问题都没有。我们在编写程序时,如果可以设计一个不变对象,那就尽量设计成不变对象。

对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。-

1
2
3
4
5
def add_end(L=None):
    if L is None:
        L = []  #定义参数为list类型的正确方式
    L.append('END')
    return L

参数分类

  1. 可变参数。顾名思义,可变参数就是传入的参数个数是可变的

  2. 关键字参数

    可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。

  3. 命名关键字参数

  4. 在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。

所以,对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。

模块

  1. 在Python中,一个.py文件就称之为一个模块(Module)

    为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。

    [请注意,每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。__init__.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,而它的模块名就是上层文件名]

  2. 标准文件模板:

    标准模板

  3. __name__有2个取值:当模块是被调用执行的,取值为模块的名字;当模块是直接执行的,则该变量取值为:main

  4. 安装第三方模块:

    在Python中,安装第三方模块,是通过包管理工具pip或pip3完成的。eg: pip install Pillow

    1
    2
    
    pip list # 查看已安装的module
    help('modules') # 查看系统自带的moudle
    

高级特性

  1. 切片:Python的切片非常灵活,一行代码就可以实现很多行循环才能完成的操作。

    可以处理list/tuple/string等数据类型 eg: L[0:10:2] #从索引0开始,到9结束,每隔两个取数;

    L[::-1] # 倒序每隔一个取数

  2. 迭代: for in

  3. 列表生成式:

    L = [x * x for x in range(10)]

  4. 生成器[generator]:一边循环一边计算的机制。【两种语法:一:将列表生成式的[]改成()就变成了一种生成器,二:包含yield关键字的函数】

    g = (x * x for x in range(10))

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    
    # 杨辉三角高级算法:
    def triangles():
        L = [1]
        while True:
            yield L
            L.append(0)  #精髓所在
            L = [L[i-1] + L[i] for i in range(len(L))]
    
    n = 0
    for m in triangles():
        print(m)
        n = n + 1
        if n == 10:
            break
    

    调用方法:

    <1> send() #生成器函数最大的特点是可以接受外部传入的一个变量,并根据变量内容计算结果后返回。

    <2> close(0) #手动关闭生成器函数,后面的调用会直接返回StopIteration异常。

    <3> throw() #用来向生成器函数送入一个异常,可以结束系统定义的异常,或者自定义的异常。throw()后直接跑出异常并结束程序,或者消耗掉一个yield,或者在没有下一个yield的时候直接进行到程序的结尾。

    生成器函数最大的特点是可以接受外部传入的一个变量,并根据变量内容计算结果后返回。

  5. 迭代器[Iterator]:可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

    生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。

    把list、dict、str等Iterable变成Iterator可以使用iter()函数。

    Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。【惰性序列】

    Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

  6. 生成器和迭代器的区别:迭代器 包含 生成器。

函数式编程

  1. map/filter : 返回一个Iterator

  2. reduce/sorted: 直接返回值#

  3. 返回函数

    闭包:相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。

  4. 匿名函数

    lambda 定义了一个匿名函数,直接return 一个返回值

    lambda 并不会带来程序运行效率的提高,只会使代码更简洁。

    Python lambda总共以下2种写法,一种是不含if…else…的,一种是包含if…else…的:

    lambda :

    lambda : if else

  5. 装饰器:decorator可以增强函数的功能

    代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)

  6. 偏函数

    当函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。

常用命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 显示模块
pip list

# 显示过期模块
pip list --outdated

# 安装模块
pip install xxx

# 升级模块
pip install --upgrade xxx

# 升级pip3版本
pip3 install --upgrade pip