当前位置 : 首页 » 文章分类 :  开发  »  Python

Python

Python 学习笔记

Python 的练手项目有哪些值得推荐?
https://www.zhihu.com/question/29372574

《Python Cookbook》3rd Edition - 中文翻译
https://python3-cookbook.readthedocs.io/zh_CN/latest/copyright.html


命令行参数

sys.argv

可以通过 sys 包的 sys.argv 来获取命令行参数
sys.argv 是命令行参数列表。
len(sys.argv) 是命令行参数个数。
sys.argv[0] 表示脚本名。

import sys

print '参数个数为:', len(sys.argv), '个参数。'
print '参数列表:', str(sys.argv)

argparse

argparse 模块也是 Python 自带的一个命令行参数模块
使用 argparse 模块可以给定义 Python 脚本的命令行参数及简写,默认值、以及help

Python 命令行参数的3种传入方式
https://tendcode.com/article/python-shell/


DocString文档字符串

可以在函数体的第一行使用一对三个单引号 ''' 或者一对三个双引号 """ 来定义文档字符串。
你可以使用 __doc__(注意双下划线)调用函数中的文档字符串属性。

例如

#!/usr/bin/python
# -*- coding: UTF-8 -*-

def function():
        ''' say something here!
        '''
        pass

print (function.__doc__) # 调用 doc

结果
say something here!


内置函数

range()

Python3 range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型,所以打印的时候不会打印列表。
Python3 list() 函数是对象迭代器,可以把 range() 返回的可迭代对象转为一个列表,返回的变量类型为列表。list(range(10))
Python2 range() 函数返回的是列表。

range(stop)
range(start, stop[, step])

start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)


可变参数

元组可变参数(变量前加*)

def function(arg1, *args) 形参前加 * 表示用元组存储可变参数
function 匹配万第一个固定参数 arg1 后,剩余的参数一元组的形式存储在 args 中

def function(arg1, *args):
  print arg1
  print len(args)

字典可变参数(变量前加**)

def function(arg1, **arg) 形参前加 ** 表示用 字典 存储可变参数,这时调用函数的方法则需要采用 arg1=value1,arg2=value2 这样的形式。


字符串

字符串格式化

age = 30
name = masikkk
str = "我是 %s, 我今年 %d" % (name, age)

f-string

f-string 是 python3.6 之后版本添加的,称之为字面量格式化字符串,是新的格式化字符串的语法。
f-string 格式化字符串以 f 开头,后面跟着字符串,字符串中的表达式用大括号 {} 包起来,它会将变量或表达式计算后的值替换进去,实例如下:

name = 'Runoob'
str1 = f'Hello {name}'  # 替换变量

str2 = f'{1+2}'         # 使用表达式

多行字符串

同一个字符串字符串因为太长而需要换行的话,有以下几种方式:
1、反斜杠 \

s = 'aaa' \
    'bbb'
print(s)

实际上,Python3 正在抛弃这种容易出错的方法,而是用 () 表达式:

2、括号表达式

s = ('aaa'
     'bbb')
print(s)

注意:多行字符串在代码中是多行,只要字符串中没有 \n 打印出来还是同一行,只是为了不超出行宽。


Tuple 元组

Python 的元组与列表类似,不同之处在于元组的元素不能修改也不能删除。
元组使用小括号,列表使用方括号。
元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。

tup1 = ('Google', 'Runoob', 1997, 2000)
tup2 = (1, 2, 3, 4, 5 )
tup3 = "a", "b", "c", "d"   #  不需要括号也可以

元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用:

tup1 = (50) # 不加逗号,类型为整型
tup2 = (50,) # 加上逗号,类型为元组

访问元组中元素
可以使用下标索引来访问元组中的值

tup1 = ('Google', 'Runoob', 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7 )

print ("tup1[0]: ", tup1[0])
print ("tup2[1:5]: ", tup2[1:5])

with as 原理

类似 java 中的 try with resource
原理:
with 所求值的对象必须有一个 __enter__() 方法,一个 __exit__() 方法。紧跟 with 后面的语句被求值后,返回对象的 __enter__() 方法被调用,这个方法的返回值将被赋值给as后面的变量。当with后面的代码块全部被执行完之后,将调用前面返回对象的 __exit__() 方法。


读写文件

读文件

通常而言,读取文件有以下几种方式:
一次性读取所有内容,使用 read()readlines()
按字节读取,使用 read(size)
按行读取,使用 readline()

‘r’ 读模式
‘w’ 写模式
‘a’ 追加模式
‘b’ 二进制模式(可添加到其他模式中使用)
‘+’ 读/写模式(可添加到其他模式中使用)

推荐使用 with 语句,可自动调用 close 方法

读取全部

with open('/path/to/file', 'r') as f:
    data = f.read()
with open('data.txt', 'r') as f:
    lines = f.readlines()
    line_num = len(lines)
    print lines
    print line_num

按字节读取

with open('path/to/file', 'r') as f:
    while True:
        piece = f.read(1024)        # 每次读取 1024 个字节(即 1 KB)的内容
        if not piece:
            break
        print piece

按行读取

f = open("/Users/user/file.csv")
for line in f.readlines():
    print line
with open('data.txt', 'r') as f:
    while True:
        line = f.readline()     # 逐行读取
        if not line:
            break
        print line,             # 这里加了 ',' 是为了避免 print 自动换行

写文件

with open('/Users/ethan/data2.txt', 'w') as f:
    f.write('one\n')
    f.write('two')

如果上述文件已存在,则会清空原内容并覆盖掉;
如果上述路径是正确的(比如存在 /Users/ethan 的路径),但是文件不存在(data2.txt 不存在),则会新建一个文件,并写入上述内容;
如果上述路径是不正确的(比如将路径写成 /Users/eth ),这时会抛出 IOError;

如果我们想往已存在的文件追加内容,可以使用 ‘a’ 模式,如下:

with open('/Users/ethan/data2.txt', 'a') as f:
    f.write('three\n')
    f.write('four')

查看 python 版本

python -Vpython --version

$ python -V
Python 2.7.16

VirtualEnv

virtualenv为应用提供了隔离的Python运行环境,解决了不同应用间多版本的冲突问题。


PyCharm

http://www.jetbrains.com/pycharm/

.ignore插件安装及配置

设置 -> Plugins 搜索 .ignore 插件安装。安装后重启 PyCharm
项目上点右键 -> New -> .ignore file -> .gitignore file(Git)
然后配置 .gitignore 文件需要忽略的语言项,选择 Python, JetBrains, VirtualEnv


python2升级python3

编译安装python3.7

很多服务器自带了 python 2

$ python -V
Python 2.7.5
$ whereis python
python: /usr/bin/python /usr/bin/python2.7 /usr/lib/python2.7 /usr/lib64/python2.7 /etc/python /usr/include/python2.7 /usr/share/man/man1/python.1.gz
$ ll python*
lrwxrwxrwx. 1 root root    7 1月  29 2019 python -> python2
lrwxrwxrwx. 1 root root    9 1月  29 2019 python2 -> python2.7
-rwxr-xr-x. 1 root root 7216 10月 31 2018 python2.7

安装编译 Python3 需要依赖的包

sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel

安装 pip

#运行这个命令添加epel扩展源
yum -y install epel-release
#安装pip
yum install python-pip

下载 python 3.7
在 python 官网找到下载链接 https://www.python.org/downloadsk/
sudo wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz

解压
sudo tar -xzvf Python-3.7.0.tgz

进入 Python-3.7.0 目录,依次执行下面命令进行手动编译
sudo ./configure prefix=/usr/local/python3
如果报错 configure: error: no acceptable C compiler found in $PATH
说明没有安装合适的编译器。这时,需要安装/升级 gcc 及其它依赖包
sudo yum install gcc gcc-c++
安装完后继续执行
sudo ./configure

编译安装
sudo make && make install

1、报错 zipimport.ZipImportError: can’t decompress data; zlib not available
是因为缺少zlib 的相关工具包导致的, 安装zlib相关依赖包
sudo yum install zlib*
只安装 zlib 包后还是会报错,还需一个修改
在重新编译之前还需要在安装源文件中修改 Modules/Setup.dist 文件,将

#zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz

这行前面的注释 # 去掉,保存好再次编译安装

2、报错 /usr/bin/install: 无法删除”/usr/local/bin/python3.7m”: 权限不够
感觉可能是因为我没用root账号执行,su 切换为 root 账号后再编译安装

3、报错 ModuleNotFoundError: No module named ‘_ctypes’
3.7 版本需要一个新的包libffi-devel,安装此包之后再次进行编译安装
yum install libffi-devel
终于安装成。

设置 3.7 为默认版本

安装 3.x 完成后查看版本

$ python3 -V
Python 3.7.4
$ python -V
Python 2.7.16

将原来 python 的软链接重命名(centos 7中默认已有 python2 软链,不需再手动创建)
sudo mv /usr/bin/python /usr/bin/python2
将 python3 链接到 /usr/bin/
sudo ln -s /usr/local/python3/bin/python3.7 /usr/bin/python3.7
将 python3.7 链接到默认python命令 /usr/bin/python, 强制覆盖:
sudo ln -sf /usr/bin/python3.7 /usr/bin/python
这时,再查看 Python 的版本:

$ python -V
Python 3.7.0

输出的是 3.x,说明默认已经使用的是 python3 了

配置 yum 和 yum-utils

升级 Python 之后,由于将默认的 python 指向了 python3,yum 不能正常使用(yum必须用python2),需要编辑 yum 的配置文件:
sudo vim /usr/bin/yum
#!/usr/bin/python 改为 #!/usr/bin/python2,保存退出即可。
如果装了 yum-utils 也需要将 yum-config-manager 脚本中的 python 改为 python2
sudo vim /usr/bin/yum-config-manager
#!/usr/bin/python 改为 #!/usr/bin/python2,保存退出即可。

CentOS 7 下 安装 Python3.7
https://segmentfault.com/a/1190000015628625

新装的CentOS 7安装python3
https://blog.csdn.net/lovefengruoqing/article/details/79284573

Linux 升级 Python 至 3.x
https://blog.csdn.net/liang19890820/article/details/51079633

问题解决zipimport.ZipImportError: can‘t decompress data; zlib not availabl
https://m.pythontab.com/article/1365

在CentOS上安装Python3的三种方法
https://www.centos.bz/2018/01/%E5%9C%A8centos%E4%B8%8A%E5%AE%89%E8%A3%85python3%E7%9A%84%E4%B8%89%E7%A7%8D%E6%96%B9%E6%B3%95/


pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available

安装 python3.7 后发现使用pip会出现如下报错:

$ pip install flask
pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Collecting flask
  Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/flask/
  Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/flask/
  Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/flask/
  Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/flask/
  Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/flask/
  Could not fetch URL https://pypi.org/simple/flask/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/flask/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping
  Could not find a version that satisfies the requirement flask (from versions: )
No matching distribution found for flask
pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping

openSSL是系统自带的,所以一定是安装了的
pip 提示找不到 ssl 模块是因为 在 ./configure 过程中,如果没有加上–with-ssl参数时,默认安装的软件涉及到ssl的功能不可用,刚好pip3过程需要ssl模块,而由于没有指定,所以该功能不可用。

cd Python-3.7.4
sudo ./configure --with-ssl
sudo make && install

SimpleHTTPServer

python 的 SimpleHTTPServer

python自带了一个web服务器 SimpleHTTPServer
我们可以很简单地输入下面的命令来启动web服务器,提供一个文件浏览的web服务。

python -m SimpleHTTPServer

然后在浏览器输入 http://localhost:8000
就可以看到当前目录下的所有目录和文件了。
即默认端口为8000,可以加参数指定端口,例如:

python -m SimpleHTTPServer 8080

更复杂的用法直接可以看python的文档:http://docs.python.org/library/simplehttpserver.html

此外这样启动的http服务器在ctrl+c后就停止了,可以加参数 & 使之在后台运行:

python -m SimpleHTTPServer &

生成的新的进程为当前bash的子进程,所以,当我们关闭当前bash时,相应的子进程也会被kill掉,这也不是我们想要的结果。

在命令的开头加一个nohup,忽略所有的挂断信号,如果当前bash关闭,则当前进程会挂载到init进程下,成为其子进程,这样即使退出当前用户,其8000端口也可以使用。

nohup python -m SimpleHTTPServer 8000 &

基于SimpleHTTPServer的文件上传下载工具

python 写的轻量级的文件共享服务器(基于内置的 SimpleHTTPServer 模块)支持文件上传下载

300行python代码的轻量级HTTPServer实现文件上传下载(Python3版本)
https://github.com/masikkk/py/blob/master/tools/http_server_with_upload.py

拷贝自
https://gist.github.com/0312birdzhang/7dc7b8fde43b64ecd004


上一篇 Flask

下一篇 Docker

阅读
评论
3,274
阅读预计15分钟
创建日期 2019-08-25
修改日期 2020-11-28
类别
标签

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论