python高级进阶


title: python高级进阶

参考文献
  1. https://pythonguidecn.readthedocs.io/zh/latest/
  2. 廖雪峰: http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431864715651c99511036d884cf1b399e65ae0d27f7e000
前言

我的文件目录

  1. virtaulenv虚拟环境合集:

    $ cd ~/.virtualenvs
    
  2. python 工程文件夹

    $ cd PycharmProjects
    
  3. python3包路径

    $ pip3 -V
    
  4. python 等安装包路径

    $ cd /usr/local/Cellar/python3
    $ cd /usr/local/bin/python3
    $ which python3
    /usr/local/bin/python3
    
  5. over

python入门最基本注意点
  1. 使用python3。熟练使用脚本安装python。
  2. 使用virtaulenv。构建独立的运行环境。
  3. 使用pycharm,pycharm中interpreter使用virtaulenv。构建优秀的调试和运行环境。
  4. 第三方库练习。
python安装
解决 同时安装 python3,python2环境时,用pip安装 python3 包
应用场景

默认mac上已经安装了 python2; 而我又安装了 python3,并使用 python3;

安装了 pip 默认,pip安装的包安装在了 python2上了;

但是我想用 pip把安装的包安装在 python3上 ,所以如下解决方式;

1:在mac上先安装 virtualenv

   $ sudo pip install virtualenv

2: 找到 python3的路径;
   $ which python 
   $ /usr/bin
   $ which python3
   $ /usr/local/bin
   也不记得我是什么时候安装以何种方式安装过python3了。
   $ brew list 
   $ python3 ,可能是通过brew安装在Mac上的

   默认 python2的路径都在 /usr/lib/目录下,但是python3的不在

   终端:which python3 发现python3 在 /usr/local/lib/目录下

3:执行 virtualenv 命令,修改 pip的安装路径 到 python3上,此处是使用python3创建一个虚拟env,名字为py3env

    $ sudo virtualenv -p /usr/local/bin/python3 py3env

    $ source py3env/bin/activate

4:环境修改之后:

   查看变量修改是否成功

   $ pip -V

   $ pip 1.5.4 from /usr/bin/py3env/lib/python3.4/site-packages (python 3.4)

  看到结果: 后面出现了 python3的路径,说明修改成功

5:安装python3包程序

   $ pip install 包名,即可

个人目标:
研究一个月python,一个月java, 一个月Linux
 
pycharm

工欲善其事必先利其器。

使用pycharm 这款python IDE可以节约不少开发时间。有语法提示和简洁优雅的界面,对开发而言,是非常省事的。

我使用 : http://idea.lanyus.com 这个Lisence server 破解了pycharm。

安装python3&终端使用python3

使用brew 安装python3,要方便省事。

安装方法:http://www.jianshu.com/p/51811fa24752

$ brew install python3
$ brew ls 
$ python3 
#如果python3无响应,则考虑到
$ echo $PATH
$ vi /etc/paths
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
默认python3在/usr/local/bin下,因此需要将/usr/local/bin放到最上面,zhs在寻找路径时按照从上往下的路径搜寻
#如果路径正确,而python3还是没有响应,则考虑删除python3,brew uninstall python3,然后再次重新安装

over

pyenv python多版本管理

有点像node的nvm。pyenv是Python的多版本管理工具。

参考:https://my.oschina.net/lionets/blog/267469

pyenv 是一个类 Unix 环境下的 Python 版本管理工具。

Linux上安装 pyenv需要做些准备工作,然后才能用curl安装

$ yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel 
$ curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
我在默认路径安装:
$ which pyenv 
$ /root/.pyenv/bin/pyenv
$ 该文档建议安装在$HOME/.pyenv路径下
$ 安装完毕后,系统提示需要添加环境变量:
WARNING: seems you still have not added 'pyenv' to the load path.

# Load pyenv automatically by adding
# the following to ~/.bash_profile:

export PATH="/root/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

$ 结合该文档。我们添加如下参数:
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

并重启shell
$ exec $SHELL
最后发现无效,所以尝试退出服务器, exit ,重新登录服务器才生效

over

virtualenv 小魔法

参考:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432712108300322c61f256c74803b43bfd65c6f8d0d0000

python实践: https://pythonguidecn.readthedocs.io/zh/latest/dev/virtualenvs.html#virtualenv

jinja2: http://docs.jinkan.org/docs/jinja2/intro.html#id2

每个应用可能需要各自拥有一套“独立”的Python运行环境。virtualenv就是用来为一个应用创建一套“隔离”的Python运行环境。
$ pip3 install virtualenv 
$ pip3 list 
然后,假设我们开发一个新的项目,需要一套独立的Python运行环境,可以这么做:
$ mkdir pythonproject_1
$ cd pythonproject_1
pythonproject_1 $ virtualenv --no-site-packages venv (创建一个独立的Python运行环境,命名为venv)

先激活虚拟环境:
$ source venv/bin/activate 

命令virtualenv就可以创建一个独立的Python运行环境,我们还加上了参数--no-site-packages,这样,已经安装到系统Python环境中的所有第三方包都不会复制过来,这样,我们就得到了一个不带任何第三方包的“干净”的Python运行环境

在venv环境下,用pip安装的包都被安装到venv这个环境下,系统Python环境不受任何影响。也就是说,venv环境是专门针对myproject这个应用创建的。

退出venv环境:
$ deactivate 

在激活的条件下
$  pip install jinja2
并且调试:
>>> from jinja2 import Template
>>> template = Template('Hello {{ name }}!')
>>> template.render(name='John Doe')
'Hello John Doe!
virtualenv基本用法
  1. 参考文献

    https://virtualenv.pypa.io/en/stable/userguide/

  2. 创建

    $ virtualenv ENV   #创建虚拟环境
    ENV/lib ENV/include ENV/lib/pythonX.X/site-packages/ 安装的第三方库列表
    $(py3env_test) ➜  source bin/activate #activate script
    $(py3env_test) ➜  deactivate 
    
    
  3. The --system-site-packages Option

    If you build with virtualenv --system-site-packages ENV, your virtual environment will inherit packages from /usr/lib/python2.7/site-packages (or wherever your global site-packages directory is).
    
  4. over

virtualenvwrapper安装

参考文献:https://pythonguidecn.readthedocs.io/zh/latest/dev/virtualenvs.html#virtualenv

  1. 安装(确保virtualenv已经安装)

    $ pip install virtualenvwrapper
    $ export WORKON_HOME=~/Envs
    $ source /usr/local/bin/virtualenvwrapper.sh
    
python requests框架
$ 使用virtualenv 建立虚拟环境
$ sudo pip install requests
$ python3 
>>> import requests
>>> r = requests.post('https://api.yirimao.com/activity/get-newest-activity')
>>> print(r.text)
一堆json数据
python框架Pillow
$ pip install Pillow

$ python3
>>> from PIL import Image
>>> im = Image.open('/Users/yxt/Desktop/launch.jpg')
>>> print(im.format, im.size, im.mode)
PNG (400, 300) RGB
>>> im.thumbnail((200, 100))
>>> im.save('/Users/yxt/Desktop/999/thumb.jpg', 'JPEG')

//先要创建/Users/yxt/Desktop/999文件夹
bin/ ,usr/bin, usr/local/bin模块

和usr/local/bin模块的区别:http://blog.csdn.net/csfreebird/article/details/48804797

/bin 存放系统管理员和普通用户都要使用的程序。

/sbin 存放用于系统恢复,系统启动,系统维护等程序

/usr/bin 登录用户可以使用的预装程序一般都放在这里

/usr/share/bin 可以通过web访问的程序一般放在这里

local 目录下的都不是系统预装,而是手动编译或者安装的程序

usr 指 Unix System Resource,而不是User

  • /usr/bin里面的都是系统预装的可执行程序,会随着系统升级而升级

  • /usr/local/bin目录是给用户放置自己的可执行程序的地方,推荐放在这里,不会被系统升级而覆盖同名文件

  • 如果两个目录下有相同的可执行程序,谁优先执行受到PATH环境变量的影响,比如我的一台服务器的PATH变量为:

    $ echo $PATH  
    $ /usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/dean/bin  
    这里/usr/local/bin优先于/usr/bin, 一般都是如此。
    
  • /lib目录都是为/bin, /sbin准备的,一般作为开发者不用关心

    /lib , /usr/lib , /usr/local/lib

    开发者需要关心下面的事情,一个应用程序启动的时候,会在/lib 和 /usr/lib库中查找动态库,如果动态库没有放在此处,需要用环境变量LD_LIBRARY_PATH指定。比如在程序启动脚本中这样写,就能在/usr/local/lib目录中加载到自己放进去的动态库.

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib 
    注意,这是运行时的环境变量,和程序编译时没有关系。
    
  • 阿帆

CentOS安装git

在centos上安装git:https://my.oschina.net/antsky/blog/514586

图方便,使用 yum install git .

也可以使用apt-get安装,但是centos本机没有安装apt-get。

$ git --version 
$ git 
安装pyenv python多版本管理工具

Django框架学习

菜鸟教程:http://www.runoob.com/django/django-first-app.html


pycharm使用总结

pycharm是一款非常好用的python开发IDE。

几个比较喜欢的细节点记录如下:

  1. 创建项目的时候可以选择python版本。目前我的python版本全部(除系统自带版本外)用brew管理。brew会将安装好的版本放置在 usr/local/Cellar:

    $ pip -V
    pip 9.0.1 from /usr/local/lib/python2.7/site-packages (python 2.7)
    $ pip3 -V
    pip 9.0.1 from /usr/local/lib/python3.6/site-packages (python 3.6)
    $ which python3
    /usr/local/bin/python3
    
    

    over

  2. 自带Debug和断点功能,那只小虫就是断点debug功能。

  3. 研究IDE。要像Xcode一样。

pycharm使用virtualenv

参考文献:

https://segmentfault.com/a/1190000003758895

具体操作:

  1. 打开Pycharm / Preference / Project Interpreter
  2. 点击该界面的最右侧的一个锯齿形状的按钮 ,在下拉列表中有个 "Create VirtualEnv" 选项
  3. 在弹出的对话框中输入要配置的环境信息:
    1.1 Name中输入名称,如flask
    1.2 Location选择:选择配置好的virtualenv的默认目录
  4. 创建项目。
  5. 我创建的项目virtaulenv合集位于:~/.virtualenvs 目录下
  6. 目前我使用的virtualenv是 py3env_test ,直接选择more,然后选择这个env就好
  7. 修改virtaulenv目录,比如下载requests包,可以放到这个虚拟目录下。
  8. 运行项目。点运行项目会默认让你去构建。
  9. 运行项目(需要构建configuration):http://ilaotan.github.io/2015/08/24/python-virtualEnv-pycharm.html
pycharm开发笔记
  1. 使用virtaulenv,可以避免系统库被污染。直接创建virtaulenv。
  2. 可以运行run和调试debug python脚本
Flask web开发笔记

参考文献:http://www.jianshu.com/p/6dce773cb6b8

廖雪峰: http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00140262673295076f525af00734a8e924c5fc6ff5b6091000

  1. 使用方式

    nginx + gunicorn + flask
    
  2. 使用虚拟virtaulenv,通过pycharm创建项目和python类型的脚本。然后选择~/.virtualenvs/newEnv 虚拟环境。然后构建python脚本的运行环境。

  3. source bin/activate 开启虚拟环境

  4. 安装python web 框架 —flask

    (newEnv) ➜ pip install flask
    
    
  5. 测试flask是否安装成功

    from flask import Flask
    app = Flask(__name__)
    @app.route('/')
    def index():
        return 'hello world'
    if __name__ == '__main__':
        app.debug = True
        app.run()
    
  6. 启动flask

    本项目直接在pycharm构建运行即可。
    此时,用浏览器访问 http://127.0.0.1:5000 就能看到网页显示hello world。
    
  7. 使用gunicorn 部署python web

    (newEnv) ➜  pip install gunicorn
    
  8. pip freeze

    pip 是一个重要的工具,python 用来管理包。还有一个最佳生产就是每次使用 pip 安装的库,都写入一个 requirement 文件里面,既能知道自己安装了什么库,也方便别人部署时,安装相应的库。

    (newEnv) ➜  pip freeze > requirements.txt
    
  9. 启动gunicorn

    通过上面的步骤已经在虚拟环境中装好了gunicorn。gunicorn具体的参考文献为:http://gunicorn.org/ 非常明了! 于是我新建了一个yy.python 文件,并且在终端尝试连接:

    $  gunicorn -w 4 -b127.0.0.1:8000 yy:app 
    
    (newEnv) ➜  firtPycharmProject gunicorn -w 4 -b127.0.0.1:8000 yy:app 
    [2017-04-14 00:13:47 +0800] [58319] [INFO] Starting gunicorn 19.7.1
    [2017-04-14 00:13:47 +0800] [58319] [INFO] Listening at: http://127.0.0.1:8000 (58319)
    [2017-04-14 00:13:47 +0800] [58319] [INFO] Using worker: sync
    [2017-04-14 00:13:47 +0800] [58322] [INFO] Booting worker with pid: 58322
    [2017-04-14 00:13:47 +0800] [58323] [INFO] Booting worker with pid: 58323
    [2017-04-14 00:13:47 +0800] [58324] [INFO] Booting worker with pid: 58324
    [2017-04-14 00:13:47 +0800] [58325] [INFO] Booting worker with pid: 58325
    ^C[2017-04-14 00:14:10 +0800] [58319] [INFO] Handling signal: int
    [2017-04-14 00:14:10 +0800] [58322] [INFO] Worker exiting (pid: 58322)
    [2017-04-14 00:14:10 +0800] [58325] [INFO] Worker exiting (pid: 58325)
    [2017-04-14 00:14:10 +0800] [58324] [INFO] Worker exiting (pid: 58324)
    [2017-04-14 00:14:10 +0800] [58323] [INFO] Worker exiting (pid: 58323)
    [2017-04-14 00:14:10 +0800] [58319] [INFO] Shutting down: Master
    
  10. 安装Nginx

$ brew intall nginx 
$ nginx #启动nginx 
$ lsof -i tcp:8080 #查看8080端口是否被占用
$ kill PID #根据进程号杀死进程
$ sudo killall nginx #强制退出Nginx
$ /usr/local/etc/nginx/nginx.conf              #nginx 的配置文件                 
$ /usr/local/Cellar/nginx/1.10.1/bin/nginx     #启动nginx的路径
  1. 启动pythonweb.py

    以上步骤完成以后,我们想通过flask 框架,gunicorn工具连接pythonweb.py文件。这个是运行结果。在浏览器中打开端口发现成功调取数据!

    (newEnv) ➜  firtPycharmProject gunicorn -w 4 -b127.0.0.1:8080 pythonweb:app 
    
    [2017-04-14 00:26:59 +0800] [58552] [INFO] Starting gunicorn 19.7.1
    [2017-04-14 00:26:59 +0800] [58552] [INFO] Listening at: http://127.0.0.1:8080 (58552)
    [2017-04-14 00:26:59 +0800] [58552] [INFO] Using worker: sync
    [2017-04-14 00:26:59 +0800] [58555] [INFO] Booting worker with pid: 58555
    [2017-04-14 00:26:59 +0800] [58556] [INFO] Booting worker with pid: 58556
    [2017-04-14 00:26:59 +0800] [58557] [INFO] Booting worker with pid: 58557
    [2017-04-14 00:26:59 +0800] [58558] [INFO] Booting worker with pid: 58558
    
  2. overf

python安装

Mac系统自带python2.7,Mac下很多软件如xcode-build等依赖该版本的python,所以千万不要删除这个版本的python。

误删python2.7急救

如果你sb到误删了该版本的python,你会发现你连Xcode都无法打开了

其实不要慌,只需要重新到python官网下一个python2.7安装就好了。嘻嘻。

实在不行,将刚安装的2.7移动到原来的python2.7的位置。祝你好运。

sudo mv /Library/Frameworks/Python.framework/Versions/3.4 /System/Library/Frameworks/Python.framework/Versions 
pyenv

pyenv是python的版本管理工具,类似node的nvm。

https://github.com/yyuu/pyenv

$ brew install pyenv
今天安装pyenv时报错,于是先更新brew
$ sudo brew upgrade
//pyenv 常用命令
$ pyenv --help
$ pyenv --versions
$ pyenv install 3.4.5
//安装失败的原因:
安装失败是常有的事情,或者是make install失败,编译失败。
选一个低一点的版本的python重新安装。
python基本语法
1.切片、列表生成器    
classmates = ['chiller', 'tom', 'mm']
print(classmates[0:2])
print([x * x for x in range(1,11)])
2.生成器
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b , a+b
        n = n+1
    return 'done'

f = fib(5)
print(next(f))
3.高阶函数
函数名是变量
4.map\reduce
def f(x):
    return x*x

r = map(f, [1,2,3,4,5])
print(list(r))
5.functools.partial将某些函数的参数固定住,返回一个新的函数。
6.*args和**kw参数
7.一个包要成为包,该目录下必须有__init__.py的文件,否则python会把这个目录当成普通目录。__init__.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,而它的模块名就是mycompany。
8. __slots__限制实例的属性
9. 用get_name和set_name的方式给类的属性设置存取方法。
class Student(object):
    def get_name(self):
        return self._score
    def set_name(self,value):
        self.name = value

 s = Student()
 s.set_name('gaolong')
 s.get_name()#galong 
10.装饰器给类定义属性
class Student(object):
    @property
    def score(self):
        return self._score
    @score.setter
    def score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be integer')
        if value < 0 or value > 100:
            raise ValueError('score must between 0~100')
        self._score = value
s = Student()
s.score = 90
print(s.score)
11.只定义getter,不定义setter方法就是只读属性
12.多继承与Minxin
class Bat(Mammal, Flyable)
      pass
既集成Mammal,又集成Flayble
MinXin:
class Dog(Mammal, RunnableMixIn, CarnivorousMixIn):
    pass
Python自带了TCPServer和UDPServer这两类网络服务,而要同时服务多个用户就必须使用多进程或多线程模型,这两种模型由ForkingMixIn和ThreadingMixIn提供。
13.定制类
__str__ :打印类信息
__iter__:循环
__getattr__:调用不存在的属性时,避免报错
__call__:直接在实例本身调用方法
14.使用枚举类
15.使用元类:运行时
type():可以查看一个类型或者变量的类型,我们说class的定义就是在运行时动态创建的,而创建的class的方法就是使用type()函数。
Hello = type('Hello', (object,), dict(hello=fn))
16.操作文件和目录
17.序列化
可存储和可传输
我们把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。
序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。
反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。
json:不同语言之间传递对象必须把对象序列化成标准格式,如XML\JSON

pycharm引入第三方库

file-->default Settings-->Project interpreter-->python3.5-->+选择available packages导入第三方库。比起pip导入和管理第三方库更加简便。

$ cd /Users/gaolong/Library/Python/3.5/lib/python/site-packages
$ cd /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages

//报错,导入aiohttp或者beautifulsoup4
导入第三方库时发现包的地址位置不对,实际导入的位置在上面那个文件夹中,而pycharm/site-packages文件夹下并没有这个我导入的第三方库。
需要在 project interpreter-->show all-->左下角的show path for interpreter改变地址,选择我们的pycharm的地址。记住点击OK要用力。
//环境配置的根本在于路径!!!
//shell编程的根本在于路径

import aiohttp
如果上一句不报错就是导入成功了。
python爬虫学习

python的主攻方向有网络编程、数据处理、web后台开发等,个人主攻python的爬虫方向,并且首先熟悉python语法,为python做自动化处理,为提高工作效率做准备。

#encoding:UTF-8
import urllib.request

url = "http://www.baidu.com"
data = urllib.request.urlopen(url).read()
data = data.decode('UTF-8')
print(data)
上述是一个简单的爬虫,爬取指定页面的数据。
python基本库的学习

python提供大量的内置库学习

1.with as 语句与try except finally语句
with request.urlopen('https://api.douban.com/v2/book/2129650') as f:
    data = f.read()
    print('Status:', f.status, f.reason)
    for k, v in f.getheaders():
        print('%s,: %s' % (k, v))
    print('Data:', data.decode('utf-8'))
with as 语句会将函数返回结果给后面的as 执行!python执行with as时会调用__enter__函数,然后把该函数return的值传给as后指定的变量。
//post请求
post请求需要传输大量的参数和header
//Handler,通过Proxy去访问网站。

Python网络编程

网络通讯其实就是两个进程之间的通讯

1.互联网最重要的协议是TCP/IP协议

通信的时候,双方必须知道对方的标识,好比发邮件必须知道对方的邮件地址。互联网上每个计算机的唯一标识就是IP地址,类似123.123.123.123。如果一台计算机同时接入到两个或更多的网络,比如路由器,它就会有两个或多个IP地址,所以,IP地址对应的实际上是计算机的网络接口,通常是网卡。

IP协议负责把数据从一台计算机通过网络发送到另一台计算机。数据被分割成一小块一小块,然后通过IP包发送出去。由于互联网链路复杂,两台计算机之间经常有多条线路,因此,路由器就负责决定如何把一个IP包转发出去。IP包的特点是按块发送,途径多个路由,但不保证能到达,也不保证顺序到达。

IP地址实际上是一个32位整数(称为IPv4),以字符串表示的IP地址如192.168.0.1实际上是把32位整数按8位分组后的数字表示,目的是便于阅读。

IPv6地址实际上是一个128位整数,它是目前使用的IPv4的升级版,以字符串表示类似于2001:0db8:85a3:0042:1000:8a2e:0370:7334。

TCP协议则是建立在IP协议之上的。TCP协议负责在两台计算机之间建立可靠连接,保证数据包按顺序到达。TCP协议会通过握手建立连接,然后,对每个IP包编号,确保对方按顺序收到,如果包丢掉了,就自动重发。

许多常用的更高级的协议都是建立在TCP协议基础上的,比如用于浏览器的HTTP协议、发送邮件的SMTP协议等。

一个IP包除了包含要传输的数据外,还包含源IP地址和目标IP地址,源端口和目标端口。

端口有什么作用?在两台计算机通信时,只发IP地址是不够的,因为同一台计算机上跑着多个网络程序。一个IP包来了之后,到底是交给浏览器还是QQ,就需要端口号来区分。每个网络程序都向操作系统申请唯一的端口号,这样,两个进程在两台计算机之间建立网络连接就需要各自的IP地址和各自的端口号。

一个进程也可能同时与多个计算机建立链接,因此它会申请很多端口。
//tcp是建立可靠连接、并且通讯双方都可以以流的形式发送数据,相对TCP 、UDP则是面向无连接的协议。
 //使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包。但是,能不能到达就不知道了。
 //虽然用UDP传输数据不可靠,但它的优点是和TCP比,速度快,对于不要求可靠到达的数据,就可以使用UDP协议
  
绑定数据库

为了便于程序保存和读取数据,而且能直接通过条件快速查询到指定的数据,就出现了数据库。

HTTP协议
1.Request Header
GET / HTTP/1.1
GET表示一个读取请求,将从服务器获取网页数据,/表示URL的路径,URL总是以/开头,/就表示首页,最后的HTTP/1.1指示采用的HTTP协议版本是1.1。目前HTTP协议的版本就是1.1,但是大部分服务器也支持1.0版本,主要区别在于1.1版本允许多个HTTP请求复用一个TCP连接,以加快传输速度。
Host:www.sina.com.cn
 表示请求的域名是www.sina.com.cn。
HTTP响应分为Header和Body两部分(Body是可选项),我们在Network中看到的Header最重要的几行如下:
    200 OK
    
堆栈、堆、栈的区别

python中有个语法是尾递归优化,递归需要很多内存空间,存储局部变量的值,所以容易导致栈溢出。系统给每个进程分配的栈空间是2M,32位系统。

参考文献:http://www.cppblog.com/oosky/archive/2006/01/21/2958.html

一个由c/C++编译的程序占用的内存分为以下几个部分:

  1. 栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
  2. 堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
  3. 全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
  4. 文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
  5. 程序代码区—存放函数体的二进制代码。
2.1申请方式 
stack: 
由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间 
heap: 
需要程序员自己申请,并指明大小,在c中malloc函数 
如p1 = (char *)malloc(10); 
在C++中用new运算符 
如p2 = (char *)malloc(10); 
但是注意p1、p2本身是在栈中的。 
utf-8编码和Unicode编码的区别

oo

参考文档
  1. http://www.yiibai.com/python/python3-webbug-series1.html
  2. http://www.cnblogs.com/xin-xin/p/4297852.html

python每日实战练习

参考文献:
  1. https://github.com/Yixiaohan/show-me-the-code
  2. https://www.zhihu.com/question/29372574
  3. http://www.aosabook.org/en/500L/blockcode-a-visual-programming-toolkit.html
000将图片或者头像加一段文字

http://www.aosabook.org/en/500L/blockcode-a-visual-programming-toolkit.html

from PIL import Image, ImageDraw, ImageFont
 
def add_num(img):
    draw = ImageDraw.Draw(img)
    myfont = ImageFont.truetype('C:/windows/fonts/Arial.ttf',size=20)
    fillcolor = "#ff0020"
    width, heigth = img.size
    draw.text((width-40, 0), "lizhixin", font=myfont, fill=fillcolor)
    img.save('result.jpg','jpeg')
 
    return 0
 
if __name__ == '__main__':
    image = Image.open('image.jpg')
    add_num(image)

推荐阅读更多精彩内容