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.lxweimin.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.lxweimin.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協議 通信的時候,雙方必須知道對方的標識,好比發郵件必須知道對方的郵件地址?;ヂ摼W上每個計算機的唯一標識就是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中有個語法是尾遞歸優化,遞歸需要很多內存空間,存儲局部變量的值,所以容易導致棧溢出。系統給每個進程分配的??臻g是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)