title: python高级进阶
参考文献
前言
我的文件目录
virtaulenv虚拟环境合集:
$ cd ~/.virtualenvs
python 工程文件夹
$ cd PycharmProjects
python3包路径
$ pip3 -V
python 等安装包路径
$ cd /usr/local/Cellar/python3 $ cd /usr/local/bin/python3 $ which python3 /usr/local/bin/python3
over
python入门最基本注意点
- 使用python3。熟练使用脚本安装python。
- 使用virtaulenv。构建独立的运行环境。
- 使用pycharm,pycharm中interpreter使用virtaulenv。构建优秀的调试和运行环境。
- 第三方库练习。
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 小魔法
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基本用法
参考文献
https://virtualenv.pypa.io/en/stable/userguide/
创建
$ virtualenv ENV #创建虚拟环境 ENV/lib ENV/include ENV/lib/pythonX.X/site-packages/ 安装的第三方库列表 $(py3env_test) ➜ source bin/activate #activate script $(py3env_test) ➜ deactivate
The
--system-site-packages
OptionIf 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).
over
virtualenvwrapper安装
参考文献:https://pythonguidecn.readthedocs.io/zh/latest/dev/virtualenvs.html#virtualenv
安装(确保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。
几个比较喜欢的细节点记录如下:
创建项目的时候可以选择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
自带Debug和断点功能,那只小虫就是断点debug功能。
研究IDE。要像Xcode一样。
pycharm使用virtualenv
参考文献:
https://segmentfault.com/a/1190000003758895
具体操作:
- 打开Pycharm / Preference / Project Interpreter
- 点击该界面的最右侧的一个锯齿形状的按钮 ,在下拉列表中有个 "Create VirtualEnv" 选项
- 在弹出的对话框中输入要配置的环境信息:
1.1 Name中输入名称,如flask
1.2 Location选择:选择配置好的virtualenv的默认目录- 创建项目。
- 我创建的项目virtaulenv合集位于:
~/.virtualenvs
目录下- 目前我使用的virtualenv是
py3env_test
,直接选择more,然后选择这个env就好- 修改virtaulenv目录,比如下载requests包,可以放到这个虚拟目录下。
- 运行项目。点运行项目会默认让你去构建。
- 运行项目(需要构建configuration):http://ilaotan.github.io/2015/08/24/python-virtualEnv-pycharm.html
pycharm开发笔记
- 使用virtaulenv,可以避免系统库被污染。直接创建virtaulenv。
- 可以运行run和调试debug python脚本
Flask web开发笔记
参考文献:http://www.jianshu.com/p/6dce773cb6b8
使用方式
nginx + gunicorn + flask
使用虚拟virtaulenv,通过pycharm创建项目和python类型的脚本。然后选择~/.virtualenvs/newEnv 虚拟环境。然后构建python脚本的运行环境。
source bin/activate
开启虚拟环境安装python web 框架 —flask
(newEnv) ➜ pip install flask
测试flask是否安装成功
from flask import Flask app = Flask(__name__) @app.route('/') def index(): return 'hello world' if __name__ == '__main__': app.debug = True app.run()
启动flask
本项目直接在pycharm构建运行即可。 此时,用浏览器访问 http://127.0.0.1:5000 就能看到网页显示hello world。
使用gunicorn 部署python web
(newEnv) ➜ pip install gunicorn
pip freeze
pip 是一个重要的工具,python 用来管理包。还有一个最佳生产就是每次使用 pip 安装的库,都写入一个 requirement 文件里面,既能知道自己安装了什么库,也方便别人部署时,安装相应的库。
(newEnv) ➜ pip freeze > requirements.txt
启动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
安装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的路径
启动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
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。
$ 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++编译的程序占用的内存分为以下几个部分:
- 栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
- 堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
- 全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
- 文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
- 程序代码区—存放函数体的二进制代码。
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
参考文档
python每日实战练习
参考文献:
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)