Python
創(chuàng)新互聯(lián)公司專(zhuān)注于企業(yè)營(yíng)銷(xiāo)型網(wǎng)站、網(wǎng)站重做改版、阿拉善盟網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5開(kāi)發(fā)、商城網(wǎng)站定制開(kāi)發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性?xún)r(jià)比高,為阿拉善盟等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
Python(發(fā)音:[ 'paiθ(?)n; (US) 'paiθ?n ]),是一種面向?qū)ο蟮慕忉屝缘挠?jì)算機(jī)程序設(shè)計(jì)語(yǔ)言,也是一種功能強(qiáng)大而完善的通用型語(yǔ)言,已經(jīng)具有十多年的發(fā)展歷史,成熟且穩(wěn)定。Python 具有腳本語(yǔ)言中最豐富和強(qiáng)大的類(lèi)庫(kù),足以支持絕大多數(shù)日常應(yīng)用。
這種語(yǔ)言具有非常簡(jiǎn)捷而清晰的語(yǔ)法特點(diǎn),適合完成各種高層任務(wù),幾乎可以在所有的操作系統(tǒng)中運(yùn)行。
目前,基于這種語(yǔ)言的相關(guān)技術(shù)正在飛速的發(fā)展,用戶(hù)數(shù)量急劇擴(kuò)大,相關(guān)的資源非常多。
Python的Hello World程序
下面是一個(gè)在標(biāo)準(zhǔn)輸出設(shè)備上輸出Hello World的簡(jiǎn)單程序,這種程序通常作為開(kāi)始學(xué)習(xí)編程語(yǔ)言時(shí)的第一個(gè)程序:
#!/usr/bin/env python
print "Hello, world!"
或者:
import sys
sys.stdout.write("Hello, world\n")
Python的歷史
Python的創(chuàng)始人為Guido van Rossum。1989年圣誕節(jié)期間,在阿姆斯特丹,Guido為了打發(fā)圣誕節(jié)的無(wú)趣,決心開(kāi)發(fā)一個(gè)新的腳本解釋程序,做為 ABC 語(yǔ)言的一種繼承。之所以選中 Python(大蟒蛇的意思)作為程序的名字,是因?yàn)樗且粋€(gè)Monty Python的飛行馬戲團(tuán)的愛(ài)好者。
ABC是由Guido參加設(shè)計(jì)的一種教學(xué)語(yǔ)言。就Guido本人看來(lái),ABC 這種語(yǔ)言非常優(yōu)美和強(qiáng)大,是專(zhuān)門(mén)為非專(zhuān)業(yè)程序員設(shè)計(jì)的。但是ABC語(yǔ)言并沒(méi)有成功,究其原因,Guido 認(rèn)為是非開(kāi)放造成的。Guido 決心在 Python 中避免這一錯(cuò)誤(的確如此,Python 與其它的語(yǔ)言如C、C++和Java結(jié)合的非常好)。同時(shí),他還想實(shí)現(xiàn)在 ABC 中閃現(xiàn)過(guò)但未曾實(shí)現(xiàn)的東西。
就這樣,Python在Guido手中誕生了。實(shí)際上,第一個(gè)實(shí)現(xiàn)是在Mac機(jī)上。可以說(shuō),Python是從ABC發(fā)展起來(lái),主要受到了Modula-3(另一種相當(dāng)優(yōu)美且強(qiáng)大的語(yǔ)言,為小型團(tuán)體所設(shè)計(jì)的)的影響。并且結(jié)合了Unix shell和C的習(xí)慣。
Python在編程語(yǔ)言中的定位
很多大規(guī)模軟件開(kāi)發(fā)計(jì)劃例如 Zope, Mnet 及 BitTorrent. Google都在廣泛地使用它。
通常認(rèn)為,Python是一種解釋性的語(yǔ)言,但是這種說(shuō)法是不正確的,實(shí)際上,Python在執(zhí)行時(shí),首先會(huì)將.py文件中的源代碼編譯成Python的byte code(字節(jié)碼),然后再由Python Virtual Machine來(lái)執(zhí)行這些編譯好的byte code。這種機(jī)制的基本思想跟Java,.NET是一致的。然而,Python Virtual Machine與Java或.NET的Virtual Machine不同的是,Python的Virtual Machine是一種更高級(jí)的Virtual Machine。這里的高級(jí)并不是通常意義上的高級(jí),不是說(shuō)Python的Virtual Machine比Java或.NET的功能更強(qiáng)大,而是說(shuō)和Java 或.NET相比,Python的Virtual Machine距離真實(shí)機(jī)器的距離更遠(yuǎn)。或者可以這么說(shuō),Python的Virtual Machine是一種抽象層次更高的Virtual Machine。
基于C的Python編譯出的字節(jié)碼文件,通常是.pyc格式。
Python的特色
可擴(kuò)充性可說(shuō)是Python作為一種編程語(yǔ)言的特色。新的內(nèi)置模塊(module)可以用C 或 C++寫(xiě)成。而我們也可為現(xiàn)成的模塊加上Python的接口。Python可以使用戶(hù)避免過(guò)分的語(yǔ)法的羈絆而將精力主要集中到所要實(shí)現(xiàn)的程序任務(wù)上。
Python也被稱(chēng)為是一門(mén)清晰的語(yǔ)言。因?yàn)樗淖髡咴谠O(shè)計(jì)它的時(shí)候,總的指導(dǎo)思想是,對(duì)于一個(gè)特定的問(wèn)題,只要有一種最好的方法來(lái)解決就好了。這在由Tim Peters寫(xiě)的python格言(稱(chēng)為T(mén)he Zen of Python)里面表述為:
There should be one-- and preferably only one --obvious way to do it.
有意思的是,這正好和Perl語(yǔ)言(另一種功能類(lèi)似的高級(jí)動(dòng)態(tài)語(yǔ)言)的中心思想TMTOWTDI(There's More Than One Way To Do It)完全相反。這似乎是人們常把Perl和Python互相比較的重要原因。
Python語(yǔ)言是一種清晰的語(yǔ)言的另一個(gè)意思是,它的作者有意的設(shè)計(jì)限制性很強(qiáng)的語(yǔ)法,使得不好的編程習(xí)慣(例如if語(yǔ)句的下一行不向右縮進(jìn))都不能通過(guò)編譯。這樣有意的強(qiáng)制程序員養(yǎng)成良好的編程習(xí)慣。其中很重要的一項(xiàng)就是Python的縮進(jìn)規(guī)則。
例如if語(yǔ)句:
if age21:
print "You cannot buy wine!\n"
print "But you can buy chewing gum.\n"
print "this is outside if\n"
一個(gè)和其他大多數(shù)語(yǔ)言(如C)的區(qū)別就是,一個(gè)模塊的界限,完全是由每行的首字符在這一行的位置來(lái)決定的(而C語(yǔ)言是用一對(duì)花括號(hào){}來(lái)明確的定出模塊的邊界的,與字符的位置毫無(wú)關(guān)系)。這一點(diǎn)曾經(jīng)引起過(guò)爭(zhēng)議。因?yàn)樽詮腃這類(lèi)的語(yǔ)言誕生后,語(yǔ)言的語(yǔ)法含義與字符的排列方式分離開(kāi)來(lái),曾經(jīng)被認(rèn)為是一種程序語(yǔ)言的進(jìn)步。不過(guò)不可否認(rèn)的是,通過(guò)強(qiáng)制程序員們縮進(jìn)(包括if,for和函數(shù)定義等所有需要使用模塊的地方),Python確實(shí)使得程序更加清晰和美觀(guān)。
另外Python在其他部分的設(shè)計(jì)上也堅(jiān)持了清晰劃一的風(fēng)格,這使得Python稱(chēng)為一門(mén)易讀性、易維護(hù)性好,并且被大量用戶(hù)所歡迎的、用途廣泛的語(yǔ)言。
Python直接編寫(xiě)的程序段有時(shí)運(yùn)行效率甚至高于用C編寫(xiě)的程序。
Python的局限
雖然Python是一個(gè)非常成功的語(yǔ)言,但是也有必要明白它的局限性。
1. 強(qiáng)制縮進(jìn)
這也許不應(yīng)該被稱(chēng)為局限,但是它用縮進(jìn)來(lái)區(qū)分語(yǔ)句關(guān)系的方式還是給很多初學(xué)者帶來(lái)了困惑。即便是很有經(jīng)驗(yàn)的Python程序員,也可能陷入陷阱當(dāng)中。最常見(jiàn)的情況是tab和空格的混用會(huì)導(dǎo)致錯(cuò)誤,而這是用肉眼無(wú)法分別的。
2. 命令行輸出問(wèn)題
很多時(shí)候不能將程序連寫(xiě)成一行,如import sys;for i in sys.path:print i。而perl和awk就無(wú)此限制,可以較為方便的在shell下完成簡(jiǎn)單程序,不需要如Python一樣,必須將程序?qū)懭胍粋€(gè).py文件。(對(duì)很多用戶(hù)而言這也不算是限制)
Python的前景
Python在編程領(lǐng)域的占有率一直處于穩(wěn)步上升之中,根據(jù)最新的數(shù)據(jù),Python排名第六。前五名分別是Java、C、VB、PHP和C++. 作為一個(gè)很年輕的語(yǔ)言,Python的位置已經(jīng)相當(dāng)令人振奮了。隨著微軟將Python納入.Net 平臺(tái),相信Python的將來(lái)會(huì)更加強(qiáng)勁發(fā)展。Python 很可能會(huì)成為.Net平臺(tái)快速開(kāi)發(fā)的主流語(yǔ)言。欲了解這方面情況,請(qǐng)參考Iron Python的相關(guān)信息.
著名的搜索引擎 Google 也大量使用Python。更加令人吃驚的是,在Nokia智能手機(jī)所采用的Symbian操作系統(tǒng)上,Python成為繼C++,Java之后的第三個(gè)編程語(yǔ)言!可見(jiàn)Python的影響力之巨大。
Python的應(yīng)用
Zope-應(yīng)用服務(wù)器
Plone-內(nèi)容管理系統(tǒng)
Django-鼓勵(lì)快速開(kāi)發(fā)的web framework
Twisted - Python Network Application Framework Python的網(wǎng)絡(luò)應(yīng)用程序框架
TurboGears - 另一個(gè)Web應(yīng)用快速開(kāi)發(fā)框架
Bit Torrent - 著名的BT下載工具
2006年的Google編程大賽已經(jīng)將Python作為參賽語(yǔ)言之一
lua
Lua 是一個(gè)小巧的腳本語(yǔ)言。作者是巴西人。該語(yǔ)言的設(shè)計(jì)目的是為了嵌入應(yīng)用程序中,從而為應(yīng)用程序提供靈活的擴(kuò)展和定制功能。它的主頁(yè)是 。
Lua最著名的應(yīng)用是在暴雪公司的網(wǎng)絡(luò)游戲WOW中。
Lua腳本可以很容易的被C/C++代碼調(diào)用,也可以反過(guò)來(lái)調(diào)用C/C++的函數(shù),這使得Lua在應(yīng)用程序中可以被廣泛應(yīng)用。不僅僅作為擴(kuò)展腳本,也可以作為普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和維護(hù)。
Lua由標(biāo)準(zhǔn)C編寫(xiě)而成,代碼簡(jiǎn)潔優(yōu)美,幾乎在所有操作系統(tǒng)和平臺(tái)上都可以編譯,運(yùn)行。
一個(gè)完整的Lua解釋器不過(guò)200k,在目前所有腳本引擎中,Lua的速度是最快的。這一切都決定了Lua是作為嵌入式腳本的最佳選擇。
Lua 有一個(gè)同時(shí)進(jìn)行的JIT項(xiàng)目,提供在特定平臺(tái)上的即時(shí)編譯功能,這將給Lua帶來(lái)更加優(yōu)秀的性能。請(qǐng)?jiān)L問(wèn) 來(lái)了解這個(gè)項(xiàng)目。
和Python等腳本不同,Lua并沒(méi)有提供強(qiáng)大的庫(kù),這是由它的定位決定的。所以L(fǎng)ua不適合作為開(kāi)發(fā)獨(dú)立應(yīng)用程序的語(yǔ)言。不過(guò)Lua還是具備了比如數(shù)學(xué)運(yùn)算和字符串處理等基本的功能。
Lua 目前的最新版本是 5.1.
1 目標(biāo)
LUA的目標(biāo)是成為一個(gè)很容易嵌入其它語(yǔ)言中使用的語(yǔ)言。大多數(shù)程序員也認(rèn)為它的確做到了這一點(diǎn)。
很多應(yīng)用程序使用LUA作為自己的嵌入式腳本語(yǔ)言,以此來(lái)實(shí)現(xiàn)可配置性、可擴(kuò)展性。這其中包括魔獸世界、博德之門(mén)等。
2 特性
LUA有如下特性:
輕量級(jí) LUA語(yǔ)言的官方版本只包括一個(gè)精簡(jiǎn)的核心和最基本的庫(kù)。這使得LUA體積小、啟動(dòng)速度快,從而適合嵌入在別的程序里。
可擴(kuò)展 LUA并不象其它許多"大而全"的語(yǔ)言那樣,包括很多功能,比如網(wǎng)絡(luò)通訊、圖形界面等。但是LUA可以很容易地被擴(kuò)展:由宿主語(yǔ)言(通常是C或C++)提供這些功能,LUA可以使用它們,就像是本來(lái)就內(nèi)置的功能一樣。
其它特性 LUA還具有其它一些特性:同時(shí)支持面向過(guò)程編程和面向?qū)ο缶幊?;自?dòng)內(nèi)存管理;提供一系列數(shù)據(jù)結(jié)構(gòu),包括數(shù)組、鏈表、集合、字典、散列表等;語(yǔ)言?xún)?nèi)置正則表達(dá)式匹配;閉包(closure);函數(shù)也可以看做一個(gè)值;提供多線(xiàn)程支持;等等。
3 示例代碼
是的,你猜對(duì)了:hello world...
print "Hello, world!"
一個(gè)比較復(fù)雜一點(diǎn)的例子,但是它展示了什么是閉包:
function create_a_counter()
local count = 0
return function()
count = count + 1
return count
end
end
create_a_counter()返回一個(gè)記數(shù)器,每次調(diào)用這個(gè)記數(shù)器,都會(huì)得到一個(gè)比上次大1的值。
local?function?decode(str,?skey)
str?=?str?or?""
skey?=?skey?or?"cxphp"
local?replaceStr?=?string.gsub(str,?"O0O0O",?"=")
replaceStr?=?string.gsub(replaceStr,?"o000o",?"+")
replaceStr?=?string.gsub(replaceStr,?"oo00o",?"/")
local?strArr??=?{}
local?replaceStrLen?=?string.len(replaceStr)
for?pos?=?1,?replaceStrLen,?2?do
local?posEnd?=?math.min(pos?+?1,?replaceStrLen)
strArr?[#strArr?+?1]?=?string.sub(replaceStr,?pos,?posEnd)
end
local?strCount?=?#strArr
for?key?=?1,?string.len(skey)?do
local?value?=?string.sub(skey,?key,?key)
print(key,?value,?strArr[key],?string.sub(strArr[key],?2,?2))
if?key?=?strCount?and?strArr[key]?and?string.sub(strArr[key],?2,?2)?==?value?then
strArr[key]?=?string.sub(strArr[key],?1,?1)
end
end
local?needToDecode?=?table.concat(strArr)
print(needToDecode)
--?TODO:?find?a?lib?base64_decode
end
我大致瀏覽了下,沒(méi)細(xì)看你的程序,沒(méi)寫(xiě)過(guò)php,不知道其規(guī)則;
修復(fù)你報(bào)錯(cuò)應(yīng)該是可以的,不行再問(wèn)~
base64需要自己找個(gè)庫(kù)調(diào)用一下,其他部分實(shí)現(xiàn)了,下面是代碼
local function decode(str, skey) str = str or "" skey = skey or "cxphp" local replaceStr = string.gsub(str, "O0O0O", "=") replaceStr = string.gsub(replaceStr, "o000o", "+") replaceStr = string.gsub(replaceStr, "oo00o", "/") local strArr = {} local replaceStrLen = string.len(replaceStr) for pos = 1, replaceStrLen, 2 do local posEnd = math.min(pos + 1, replaceStrLen) strArr [#strArr + 1] = string.sub(replaceStr, pos, posEnd) end local strCount = #strArr for key = 1, string.len(skey) do local value = string.sub(skey, key, key) print(key, value, strArr[key], string.sub(strArr[key], 2, 2)) if key = strCount and strArr[key] and string.sub(strArr[key], 2, 2) == value then strArr[key] = string.sub(strArr[key], 1, 1) end end local needToDecode = table.concat(strArr) print(needToDecode) -- TODO: find a lib base64_decodeend
php作為排名top2 互聯(lián)網(wǎng)開(kāi)發(fā)工具,非常流行,可以參考:中國(guó)最大的25個(gè)網(wǎng)站采用技術(shù)選型方案
php這個(gè)名稱(chēng)實(shí)際上有兩層含義
直接定義:
php-fpm從php5.3.3開(kāi)始已經(jīng)進(jìn)入到php源代碼包,之前是作為patch存在的
很少人會(huì)去讀php本身源代碼,我6年前解決php內(nèi)存泄露問(wèn)題的時(shí)候做了些研究,最近再查看了一番,發(fā)現(xiàn)php的開(kāi)發(fā)者很有誠(chéng)意,這是一款非常出色的服務(wù)器軟件,支持如下
在linux服務(wù)器上,如果不設(shè)置 events.mechanism ,那么默認(rèn)就是采用epoll,所以
php-fpm的IO模型并發(fā)處理能力和nginx是完全一致
nginx以性能卓越聞名,大部分程序員都認(rèn)為php效率低下,看了源代碼,才知道這是傳奇啊
在高性能部署的時(shí)候,大家往往會(huì)針對(duì)性的優(yōu)化nginx 。我自己之前部署php程序也犯了錯(cuò)誤,8G內(nèi)存的server,php-fpm的max children都會(huì)設(shè)置128+,現(xiàn)在看來(lái)太多了,參考nginx的部署:
php-fpm配置為 3倍 cpu core number就可以了
php-fpm穩(wěn)定性比nginx稍差 這是因?yàn)閜hp-fpm內(nèi)置了一個(gè)php解析器,php-fpm進(jìn)程就和php程序捆綁了,如果php腳本寫(xiě)得不好,有死循環(huán)或者阻塞在某個(gè)遠(yuǎn)端資源上,會(huì)拖累加載它的php-fpm進(jìn)程
而nginx和后端應(yīng)用服務(wù)器之間通過(guò)網(wǎng)絡(luò)連接,可以設(shè)置timeout,不容易堵死的
php-fpm的fastcgi是短連接 我原以為是長(zhǎng)連接的,看了代碼才知道也是短連接,處理一個(gè)request就關(guān)閉掉
php-fpm接口采用fastcgi 非常遺憾,php-fpm和fastcgi完全綁定了,無(wú)法獨(dú)立使用 。只能部署在支持http-fcgi協(xié)議轉(zhuǎn)換程序背后(nginx)。其實(shí)可以考慮在php-fpm代碼包里面引入http協(xié)議支持,這樣php-fpm可以獨(dú)立運(yùn)行,讓nodejs無(wú)話(huà)可說(shuō)
php-fpm等同于OpenResty OpenResty是一個(gè)國(guó)人開(kāi)發(fā)的nginx模塊,就是在nginx引入lua解釋器. 實(shí)際上,它和php-fpm的唯一差別就是一個(gè)采用php語(yǔ)法,一個(gè)用lua,所以O(shè)penResty要作為nginx增強(qiáng)包使用還可以,要選擇它作為一個(gè)主要編程工具,沒(méi)有任何必要
從架構(gòu)上來(lái)說(shuō),php-fpm已經(jīng)做到最好,超過(guò)大多數(shù) python部署工具,我再也不黑它了
這關(guān)系不大的,git和SVN差不多,是一個(gè)版本控制器,lua我在unity 3D上看過(guò),是另一門(mén)語(yǔ)言