Python實現(xiàn)全角半角轉(zhuǎn)換的方法
十載的沈丘網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。營銷型網(wǎng)站的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整沈丘建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“沈丘網(wǎng)站設(shè)計”,“沈丘網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
本文實例講解了Python實現(xiàn)全角半角轉(zhuǎn)換的方法,相信對于大家的Python學(xué)習(xí)能夠起到一定的參考借鑒價值。如下所示:
一、全角半角轉(zhuǎn)換概述:
全角字符unicode編碼從65281~65374 (十六進制 0xFF01 ~ 0xFF5E)
半角字符unicode編碼從33~126 (十六進制 0x21~ 0x7E)
空格比較特殊,全角為 12288(0x3000),半角為 32 (0x20)
而且除空格外,全角/半角按unicode編碼排序在順序上是對應(yīng)的
所以可以直接通過用+-法來處理非空格數(shù)據(jù),對空格單獨處理
二、全角轉(zhuǎn)半角:
實現(xiàn)代碼如下:
def strQ2B(ustring):
"""把字符串全角轉(zhuǎn)半角"""
rstring = ""
for uchar in ustring:
inside_code=ord(uchar)
if inside_code==0x3000:
inside_code=0x0020
else:
inside_code-=0xfee0
if inside_code0x0020 or inside_code0x7e: #轉(zhuǎn)完之后不是半角字符返回原來的字符
rstring += uchar
rstring += unichr(inside_code)
return rstring
三、半角轉(zhuǎn)全角:
實現(xiàn)代碼如下:
def strB2Q(ustring):
"""把字符串半角轉(zhuǎn)全角"""
rstring = ""
for uchar in ustring:
inside_code=ord(uchar)
if inside_code0x0020 or inside_code0x7e: #不是半角字符就返回原來的字符
rstring += uchar
if inside_code==0x0020: #除了空格其他的全角半角的公式為:半角=全角-0xfee0
inside_code=0x3000
else:
inside_code+=0xfee0
rstring += unichr(inside_code)
return rstring
四、測試代碼:
a = strB2Q("abc12345")
print a
b = strQ2B(a)
print b
輸出:
abc12345
abc12345
感興趣的朋友可以調(diào)試運行一下,相信會有一定的收獲。
從開始看Python到現(xiàn)在也有半個多月了,前后看了Python核心編程和Dive
into
Python兩本書。話說半個月看兩本,是個人都知道有多囫圇吞棗,這也是因為我暫時沒有需求拿這個做大型開發(fā),主要是平時的小程序test用一用。所以我的策略是,整體瀏覽,用到時候現(xiàn)查。話說這核心編程第一版太古老了,老在講2.2之前的東西,我看的翻譯電子版,翻譯得也不好,很晦澀??赐赀@個后還有點云里霧里,看網(wǎng)上人家說DIP好,啄木鳥還有免費電子文檔,就找來看這個。怎么說呢,講的比核心編程好,但不適合第一次看的初學(xué)者。我之所以覺得講得好,是因為看核心編程,有些概念還有些模糊,看了這本書就明白不少了。要是初學(xué)者上來就看這本,保證不好理解。
下面就是在學(xué)習(xí)的過程中,在翻閱資料的過程中,總結(jié)的一些C和python比較明顯的不同之處,有大方向的,也有細節(jié)的??隙]有總結(jié)完,比如動態(tài)函數(shù),lambda這些,我都懶得往上寫了。實際上,作為兩種完全不同的語言,下面這些差異只是冰山一角而已。權(quán)當(dāng)拋磚引玉吧,至少應(yīng)該對和我有相同研究興趣,正在考慮是否學(xué)習(xí)另一門語言的朋友有點幫助。此文也算是DIP的學(xué)習(xí)筆記吧。順帶說一句,要是有朋友了解,可以幫忙推薦一下實戰(zhàn)性強的Python教材,語言這東西,不多練手,光比劃,是不可能學(xué)好的。
學(xué)習(xí)目的
我的以后的研究方向是嵌入式,顯然,C語言是我的主要語言。我不是一個語言愛好者,我以前覺得,對于做研究而不是應(yīng)用的人來說,了解多門語言,不如精通一門語言。之所以去看python,主要還是因為python更有利于快速開發(fā)一些程序,也是因為現(xiàn)在認識到,研究和應(yīng)用是不能分離的。個人以為,要想在計算機工程的競爭中立足,必須懂C語言。因為真正要做高性能編程,
不可能將機器的體系架構(gòu)拋到腦后讓Python虛擬機(或Java虛擬機等)幫你搞定所有底層。越來越多的CPU
core,越來越恐怖的內(nèi)存性能瓶頸,對于上層開發(fā)人員來說,無所謂,但是對高性能程序開發(fā)人員來說,這些是無法透明的。很多應(yīng)用,還是自己掌控比較有效。這些場合中,匯編和C還是不可替代的。但是,光知道C是不夠的,掌握一門面向?qū)ο笳Z言,相對更高層的語言,不僅對以后的個人發(fā)展有利,也會對自己的技術(shù)認識產(chǎn)生幫助。
如果要問對我來說誰更重要,我覺得還是C更重要。C的學(xué)習(xí)曲線更陡,貌似簡單,實際上到處都是陷阱,看上去比較簡單低效的程序,也不是學(xué)1,2個月就能搞定的。談到優(yōu)化的深層次和難度嘛,需要的功底是按年算的。但是一旦你C語言的基礎(chǔ)打好了,對計算機的理解,對其他語言的理解都是大有裨益的。比如,如果你有C基礎(chǔ),可以說,學(xué)過1天python,就能寫的出來一些不短的程序。后面的優(yōu)化也不是什么大不了的算法,都是非?;镜恼Z句換來換去。當(dāng)然這里不是說
Python不好,實際上,上層應(yīng)用,Python比C方便的不是一個層次。
很多人覺得,既然懂C了,那么進一步掌握C++應(yīng)該是水到渠成,但C++不是C的超集,而我又不喜歡C++的繁瑣和巨大,所以才決定看一看Python。我很喜歡Python的優(yōu)雅與快捷。
語言類型
和C不一樣,Python是一種動態(tài)類型語言,又是強類型語言。這個分類怎么理解呢?大概是可以按照下列說明來分類的:
靜態(tài)類型語言
一種在編譯期間就確定數(shù)據(jù)類型的語言。大多數(shù)靜態(tài)類型語言是通過要求在使用任一變量之前聲明其數(shù)據(jù)類型來保證這一點的。Java和 C 是靜態(tài)類型語言。
動態(tài)類型語言
一種在運行期間才去確定數(shù)據(jù)類型的語言,與靜態(tài)類型相反。Python 是動態(tài)類型的,因為它們確定一個變量的類型是在您第一次給它賦值的時候。
強類型語言
一種總是強制類型定義的語言。Java 和 Python 是強制類型定義的。您有一個整數(shù),如果不明確地進行轉(zhuǎn)換 ,不能將把它當(dāng)成一個字符串。
弱類型語言
一種類型可以被忽略的語言,與強類型相反。VBScript 是弱類型的。在 VBScript 中,您可以將字符串 ’12′ 和整數(shù) 3 進行連接得到字符串’123′,然后可以把它看成整數(shù) 123 ,所有這些都不需要任何的顯示轉(zhuǎn)換。
對象機制
具體怎么來理解這個“動態(tài)確定變量類型”,就要從Python的Object對象機制說起了。Objects(以下稱對象)是Python對于數(shù)據(jù)的抽象,Python中所有的數(shù)據(jù),都是由對象或者對象之間的關(guān)系表示的,函數(shù)是對象,字符串是對象,每個東西都是對象的概念。每一個對象都有三種屬性:實體,類型和值。理解實體是理解對象中很重要的一步,實體一旦被創(chuàng)建,那么就一直不會改變,也不會被顯式摧毀,同時通常意義來講,決定對象所支持的操作方式的類型(type,包括number,string,tuple及其他)也不會改變,改變的只可能是它的值。如果要找一個具體點的說明,實體就相當(dāng)于對象在內(nèi)存中的地址,是本質(zhì)存在。而類型和值都只是實體的外在呈現(xiàn)。然后Python提供一些接口讓使用者和對象交互,比如id()函數(shù)用來獲得對象實體的整形表示(實際在這里就是地址),type()函數(shù)獲取其類型。
這個object機制,就是c所不具備的,主要體現(xiàn)在下面幾點:
1 剛才說了,c是一個靜態(tài)類型語言,我們可以定義int a, char
b等等,但必須是在源代碼里面事先規(guī)定。比如我們可以在Python里面任意一處直接規(guī)定a =
“l(fā)k”,這樣,a的類型就是string,這是在其賦值的時候才決定的,我們無須在代碼中明確寫出。而在C里面,我們必須顯式規(guī)定char *a =
“l(fā)k”,也就是人工事先規(guī)定好a的類型
2 由于在C中,沒有對象這個概念,只有“數(shù)據(jù)的表示”,比如說,如果有兩個int變量a和b,我們想比較大小,可以用a ==
b來判斷,但是如果是兩個字符串變量a和b,我們就不得不用strcmp來比較了,因為此時,a和b本質(zhì)上是指向字符串的指針,如果直接還是用==比較,那比較的實際是指針中存儲的值——地址。
在Java中呢,我們通過使用 str1 == str2 可以確定兩個字符串變量是否指向同一塊物理內(nèi)存位置,這叫做“對象同一性”。在 Java 中要比較兩個字符串值,你要使用 str1.equals(str2)。
然后在Python中,和前兩者都不一樣,由于對象的引入,我們可以用“is”這個運算符來比較兩個對象的實體,和具體對象的type就沒有關(guān)系了,比如你的對象是tuple也好,string也好,甚至class也好,都可以用”is”來比較,本質(zhì)上就是“對象同一性”的比較,和Java中的==類似,和
C中的pointer比較類似。Python中也有==比較,這個就是值比較了。
3
由于對象機制的引入,讓Python的使用非常靈活,比如我們可以用自省方法來查看內(nèi)存中以對象形式存在的其它模塊和函數(shù),獲取它們的信息,并對它們進行操作。用這種方法,你可以定義沒有名稱的函數(shù),不按函數(shù)聲明的參數(shù)順序調(diào)用函數(shù),甚至引用事先并不知道名稱的函數(shù)。
這些操作在C中都是不可想象的。
4 還有一個很有意思的細節(jié),就是類型對對象行為的影響是各方面的,比如說,a = 1; b =
1這個語句中,在Python里面引發(fā)的,可能是a,b同時指向一個值為1的對象,也可能是分別指向兩個值為1的對象。而例如這個語句,c = []; d
= [],那么c和d是肯定指向不同的,新創(chuàng)建的空list的。沒完,如果是”c = d =
[]“這個語句呢?此時,c和d又指向了相同的list對象了。這些區(qū)別,都是在c中沒有的。
最后,我們來說說為什么python慢。主要原因就是function call overhead比較大。因為所有東西現(xiàn)在都是對象了,contruct 和destroy 花費也大。連1 + 1 都是 function call,像’12′+’45′ 這樣的要 create a third string object, then calls the string obj’s __add。可想而知,速度如何能快起來?
列表和數(shù)組
分析Python中的list和C中的數(shù)組總是很有趣的。相信可能一些朋友和一樣,初學(xué)列表的時候,都是把它當(dāng)作是數(shù)組來學(xué)的。最初對于list和數(shù)組區(qū)別的定性,主要是集中在兩點。首先,list可以包含很多不同的數(shù)據(jù)類型,比如
["this", 1, "is", "an", "array"]
這個List,如果放在C中,其實是一個字符串?dāng)?shù)組,相當(dāng)于二維的了。
其次呢,list有很多方法,其本身就是一個對象,這個和C的單純數(shù)組是不同的。對于List的操作很多樣,因為有方法也有重載的運算符。也帶來一些問題,比如下面這個例子:
加入我們要產(chǎn)生一個多維列表,用下面這個語句
A = [[None] * 2] * 3
結(jié)果,A的值會是
[[None, None], [None, None], [None, None]]
初一看沒問題,典型的二維數(shù)組形式的列表。好,現(xiàn)在我們想修改第一個None的值,用語句
A[0][0] = 5
現(xiàn)在我們再來看看A的值:
[[5, None], [5, None], [5, None]]
發(fā)現(xiàn)問題沒有?這是因為用 * 來復(fù)制時,只是創(chuàng)建了對這個對象的引用,而不是真正的創(chuàng)建了它。 *3 創(chuàng)建了一個包含三個引用的列表,這三個引用都指向同一個長度為2的列表。其中一個行的改變會顯示在所有行中,這當(dāng)然不是你想要的。解決方法當(dāng)然有,我們這樣來創(chuàng)建
A = [None]*3
for i in range(3):
A[i] = [None] * 2
這樣創(chuàng)建了一個包含三個不同的長度為2的列表。
所以,還是一直強調(diào)的,越復(fù)雜的東西,越靈活,也越容易出錯。
代碼優(yōu)化
C是一個很簡單的語言,當(dāng)我們考慮優(yōu)化的時候,通常想得也很簡單,比如系統(tǒng)級調(diào)用越少越好(緩沖區(qū)機制),消除循環(huán)的低效率和不必要的系統(tǒng)引用,等等,其實主要都是基于系統(tǒng)和硬件細節(jié)考慮的。而Python就完全不一樣了,當(dāng)然上面說的這些優(yōu)化形式,對于Python仍然是實用的,但由于
Python的語法形式千差萬別,庫和模塊多種多樣,所以對于語言本身而言,就有很多值得注意的優(yōu)化要點,舉幾個例子吧。
比如我們有一個list L1,想要構(gòu)建一個新的list L2,L2包括L1的頭4個元素。按照最直接的想法,代碼應(yīng)該是
L2 = []
for i in range[3]:
L2.append(L1[i])
而更加優(yōu)化和優(yōu)美的版本是
L2 = L1[:3]
再比如,如果s1..s7是大字符串(10K+),那么join([s1,s2,s3,s4,s5,s6,s7])就會比
s1+s2+s3+s4+s5+s6+s7快得多,因為后者會計算很多次子表達式,而join()則在一次過程中完成所有的復(fù)制。還有,對于字符串操作,對字符串對象使用replace()方法。僅當(dāng)在沒有固定字符串模式時才使用正則表達式。
所以說,以優(yōu)化為評判標(biāo)準(zhǔn),如果說C是短小精悍,Python就是博大精深。
include和import
在C語言中的include非常簡單,因為形式單一,意義明確,當(dāng)你需要用到外部函數(shù)等資源時,就用include。而Python中有一個相似的機制,就是import。乍一看,這兩個家伙挺像的,不都是我們要用外部資源(最常見的就是函數(shù)或者模塊(Python))時就用這個來指明么?其實不然,兩者的處理機制本質(zhì)區(qū)別在于,C中的include是用于告訴預(yù)處理器,這個include指定的文件的內(nèi)容,你都給我當(dāng)作在本地源文件中出現(xiàn)過。而
import呢,不是簡單的將后面的內(nèi)容*直接*插入到本地里面去,這玩意更加靈活。事實上,幾乎所有類似的機制,Python都比C靈活。這里不是說C不好,C很簡練,我其實更喜歡C。
簡單說說這個靈活性。import在python中有三種形式,import X, from X import *( or a,b,c……), X =
__import__(‘x’)。最常用的是第二種,因為比較方便,不像第一種那樣老是用X.module來調(diào)用模塊。from X import
*只是import那些public的module(一般都是不以__命名的模塊),也可以指定a,b,c來import。
什么時候用哪一種形式呢?應(yīng)該說,在大多數(shù)的模塊文檔里,都會明確告訴你應(yīng)該用哪種形式。如果需要用到很多對象,那么from X import
*可能更合適一些,但是,就目前來看,大多數(shù)第三方Python庫都不推薦使用from modulename import *
這種格式。這樣做會使引入者的namespace混亂。很多人甚至對于那些專門設(shè)計用于這種模式的模塊(包括Tkinter,
threading和matplot)都不采用這種方式。而如果你僅僅需要某個對象類a,那么用from X import a比用import
X.a更好,因為以后你調(diào)用a的函數(shù)直接用a.function()既可以了,不用加X。
如果你連自己希望import的模塊都不知道怎么辦?請注意,此時Python的優(yōu)勢就體現(xiàn)出來了,我們可以用
__import__(module)來調(diào)用module,其中這個module是字符串,這樣,可以在運行時再決定,你到底要調(diào)用什么module。舉個例子:
def classFromModule (module, Name):
mod = __import__ (module)
return getattr (mod, Name)
這里,定義了一個函數(shù)classFromModule,你可以在代碼的任何時候調(diào)用它,
o = classFromModule (ModuleOfTheClass, NameOfTheAttribute)()
只需要傳入字符串形式的你希望import的模塊ModuleOfTheClass和其中屬性的名字NameOfTheAttribute(當(dāng)然可以是數(shù)據(jù)也可以是方法),就能調(diào)用了,這個名字字符串不用事先指定,而是根據(jù)當(dāng)時運行的情況來判斷。
順帶說一句,Python中import的順序也有默認規(guī)定,這個和C中的include有點類似,因為我們一般都是先include系統(tǒng)文件,再
include自己的頭文件(而且還有和“”的區(qū)別)。Python中呢,一般應(yīng)該按照以下順序import模塊:
1. 標(biāo)準(zhǔn)庫模塊 — 如 sys, os, getopt 等
2. 第三方模塊
3. 本地實現(xiàn)的模塊。
全局變量
這里談全局變量呢,倒不是說Python和c的全局變量概念不同,他們的概念是相同的。只是在使用機制上,是有一些差異的。舉個例子:
– module.py –
globalvar = 1
def func():
print globalvar
# This makes someglobal readonly,
# any attempt to write to someglobal
# would create a new local variable.
def func2():
global globalvar
globalvar = 2
# this allows you to manipulate the global
# variable
在 func這個函數(shù)中,globalvar是只讀的。如果你使用了globalvar =
xxx這種賦值語句,Python會重新創(chuàng)造一個新的本地對象并將新值賦給它,原來的對象值不變。而在func2函數(shù)中,由于我們事先申明了
globalvar是global的,那么此時的更改就直接在全局變量上生效。
很明顯這和c中的使用機制是不一樣的,在c中,我們只要在函數(shù)外的全局區(qū)域申明了變量,就可以在函數(shù)中直接對其操作,不用還申明一個global。
Published 2008-06-22
Filed in c,code,python and
tagged c, python
int a = 10;
這里的 int a 是變量的類型聲明。這里的含義是,我想要一個變量,它的名字是 a,它是一個整數(shù)類型的變量。
后半部分, = 10,這一部分是賦值操作。后面半部分的 10 不是數(shù)字 10,而叫做 literal。很多編程語言都有不同的 numeric literal 格式可供使用。比如:
int a = 10; int b = 0x_0000_0010; int c = 0b_0000000_00000000_00000000_00000010; Console.WriteLine(a); Console.WriteLine(b); Console.WriteLine(c);
有不少同學(xué)學(xué)完 Python 后仍然很難將其靈活運用。我整理15個 Python 入門的小程序。在實踐中應(yīng)用 Python 會有事半功倍的效果。
實現(xiàn)數(shù)學(xué)里的二元二次函數(shù): f(x, y) = 2x^2 + 3y^2 + 4xy ,需要用到指數(shù)運算符 **
將一個正整數(shù)的個位數(shù),以及除個位數(shù)外的部分分離。需要用到 模(取余數(shù)) 運算符 % ,和 整除 運算符 //
實現(xiàn)一個簡單的累加器,可以接受用戶輸入3個數(shù)字,并將其累加。需要用到 復(fù)合賦值運算符:+=
輸入年份,判斷是否是閏年。閏年判斷方法:能被4整除,但不能被100整除;或者能被 400 整除。需要用到 算術(shù)運算符 和 邏輯運算符
輸入一個數(shù)字,判斷基數(shù)還是偶數(shù),需要 模 運算和 if ... else 結(jié)構(gòu)
之前做過華氏度轉(zhuǎn)攝氏度,現(xiàn)在通過 分支結(jié)構(gòu) 實現(xiàn)二者互轉(zhuǎn)。
輸入三個邊長度,判斷是否構(gòu)成三角形。 構(gòu)成三角形的條件:兩邊之和大于第三邊 。
輸入成績分數(shù),輸出分數(shù)對應(yīng)的等級。
某企業(yè)的獎金根據(jù)銷售利潤按照如下規(guī)則計算提成。輸入銷售利潤,計算獎金。
程序隨機生成一個正整數(shù),用戶來猜,程序根據(jù)猜的大小給出相應(yīng)的提示。最后,輸出用戶猜了多少次才猜中。
輸入一個正整數(shù),判斷是否是素數(shù)。 素數(shù)定義:大于1的自然數(shù)中,只能被1和它本身整除的自然數(shù)。如:3、5、7
用程序?qū)崿F(xiàn)石頭剪刀布 游戲 。
字典的key是姓名,value是身高,現(xiàn)在需要按照身高對字典重新排序。
將二元二次函數(shù)封裝在函數(shù)中,方便調(diào)用
初學(xué)python的小伙伴注意哦~不要只依賴于教程,而忽視實操的能力。不然,是很難有進步的??梢远鄤觿邮?,嘗試一下,積累經(jīng)驗。