分类 Python 下的文章

CentOS7.5 安装supervisor 4.2.1

环境:CentOS 7.5,Python2.7.16
建议使用pip安装

安装

pip install supervisor

安装之后,执行echo_supervisord_conf,如果能看到配置文件内容,说明安装成功。

生成配置文件

新建/etc/supervisor目录,然后执行命令:

echo_supervisord_conf > /etc/supervisor/supervisord.conf

配置文件名称建议使用supervisord.conf,如果你取了别的名称,后面执行supervisorctl命令时,就需要指定配置文件,否则会报错。

- 阅读剩余部分 -

Scrapy 实现博客爬虫实例

目标网址:http://i.csensix.com (即本站)
项目地址:blogSpider

系统环境

  1. CentOS 7.5
  2. Python 2.7.16
  3. Scrapy 1.7.3

实现过程

创建项目

scrapy startproject blogSpider
执行完上面的命令,会生成如下目录结构:

blogSpider/
    scrapy.cfg              # 配置文件
    blogSpider/             # 主要代码目录
        __init__.py
        items.py            # 定义项目items
        middlewares.py      # 项目中间件文件
        pipelines.py        # 项目管道文件
        settings.py         # 项目配置
        spiders/            # 爬虫目录
            __init__.py

- 阅读剩余部分 -

Centos7.5 从Python2.7.5升级到Python2.7.16

Centos7 默认安装的python版本是2.7.5,由于某些平台提示建议更新版本,防止跨脚本攻击,所以现对其进行升级,更新至2.7.16版本(截至目前2019-8-12的最新版本)。

查看当前python版本

[root@csensix ~]# python -V

运行结果:Python 2.7.5

下载并安装最新版本 Python 2.7.16

下载

.tar.xz.tgz 压缩版本二选一,这里我下载的是体积较小的 .tar.xz 版本。

# tar.xz 版本
[root@csensix ~]# wget https://www.python.org/ftp/python/2.7.16/Python-2.7.16.tar.xz

# tgz 版本
[root@csensix ~]# wget https://www.python.org/ftp/python/2.7.16/Python-2.7.16.tgz

解压

[root@csensix ~]# tar -xf Python-2.7.16.tar.xz

# 或者分两步
[root@csensix ~]# xz -d Python-2.7.16.tar.xz
[root@csensix ~]# tar xvf Python-2.7.16.tar

编译安装

[root@csensix ~]# cd Python-2.7.16
[root@csensix ~]# ./configure --prefix=/usr/local
[root@csensix ~]# make
[root@csensix ~]# make altinstall

为避免覆盖系统自带python,故没有选择常规的make install,而是使用了 make altinstall

修改默认python版本

安装完之后执行 python -V,此时显示的还是老的 2.7.5 版本,因为 /usr/bin/python 指向的还是原来的版本,所以需要做相应的更改。

首先,备份老版本

[root@csensix ~]# mv /usr/bin/python /usr/bin/python2.7.5

链接新版本

[root@csensix ~]# ln -s /usr/local/bin/python2.7 /usr/bin/python

至此,新版本安装基本完成。现在,python -V 显示的结果是 Python 2.7.16,如果希望访问老版本,那么执行 python2.7.5 即可,如下:

[root@csensix ~]# python2.7.5
Python 2.7.5 (default, Apr 11 2018, 07:36:10) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.

- 阅读剩余部分 -

快速排序(Python实现)

基本思想

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
下面这个图可以描述算法的实现过程:
快速排序

时间复杂度

快速排序是一种不稳定的排序方法,平均时间复杂度为O (nlogn),最坏情况和冒泡排序差不多,为O(n²)。

Python实现

# 简洁的实现方法
def quicksort(array):
  if len(array) < 2:
    return array
  else:
    pivot = array[0]
    less = [i for i in array[1:] if i <= pivot]
    greater = [i for i in array[1:] if i > pivot]
    return quicksort(less) + [pivot] + quicksort(greater)

print quicksort([10, 5, 2, 3]) # 结果:[2, 3, 5, 10]

# 比较容易理解的实现方法
def quick(list):
    if len(list) < 2:
        return list
    else:
        left = i = 0
        j = len(list) - 1
        
        while i != j:
            while list[j] >= list[left] and i < j:
                j -= 1

            while list[i] <= list[left] and i < j:
                i += 1
            
            if i < j:
                list[i], list[j] = list[j], list[i]
        list[i], list[left] = list[left],  list[i]
        return quick(list[left:i]) + [list[i]] + quick(list[i+1:])

注意理解:上面的第二种方法,挑选了左侧第一个数作为参考,内部循环则从对面,即列表末尾开始查找,因为如果从左侧开始查找,当满足条件i=j退出循环时,list[i]会比list[left]大,交换之后违反了左边小右边大的原则。

该实例中涉及Python的一个称作列表推导表达式的语法糖用法,即在for循环中嵌套使用if和else语句。例如:

oldList = [12, 3, 4, 6, 7, 13, 21]
newList = [x for x in oldList if x%2 == 0]
print newList # 结果:[12, 4, 6]
想了解更多Python语法糖知识,请参考:Python语法糖系列

python列表求和:循环实现与递归实现

循环实现:

def sum(arr):
  total = 0
  for x in arr:
    total += x
  return total

print sum([1, 2, 3, 4]) # 结果:10

递归实现:

def sum(arr):
  total = 0
  length = len(arr)
  if length == 0:
    return total
  else:
    return arr.pop(0) + sum(arr)
    
print sum([1,2]) # 结果:3