python單劃線雙劃線
1. python2和python3的區別,轉換及共存
python2和python3的區別
1.性能
Py3.0運行 pystone benchmark的速度比Py2.5慢30%。Guido認為Py3.0有極大的優化空間,在字元串和整形操作上可以取得很好的優化結果。
Py3.1性能比Py2.5慢15%,還有很大的提升空間。
2.編碼
Py3.X源碼文件默認使用utf-8編碼,這就使得以下代碼是合法的:
>>> 中國 = 'china'
>>>print(中國)
china
3. 語法
1)去除了<>,全部改用!=
在Python 2里,為了得到一個任意對象的字元串表示,有一種把對象包裝在反引號里(比如`x`)的特殊語法。在Python 3里,這種能力仍然存在,但是你不能再使用反引號獲得這種字元串表示了。你需要使用全局函數repr()。
Notes
Python 2
Python 3
①
`x` repr(x)
②
`'PapayaWhip' + `2`` repr('PapayaWhip'+repr(2))
Note:x可以是任何東西—一個類,函數,模塊,基本數據類型,等等。repr()函數可以使用任何類型的參數。
2)去除``,全部改用repr()
3)關鍵詞加入as 和with,還有True,False,None
4)整型除法返回浮點數,要得到整型結果,請使用//
由於人們常常會忽視Python 3在整數除法上的改動(寫錯了也不會觸發Syntax Error),所以在移植代碼或在Python 2中執行Python 3的代碼時,需要特別注意這個改動。
所以,我還是會在Python 3的腳本中嘗試用float(3)/2或 3/2.0代替3/2,以此來避免代碼在Python 2環境下可能導致的錯誤(或與之相反,在Python 2腳本中用from __future__ import division來使用Python 3的除法)。
Python 2
print'3/2=',3/2print'3//2=',3//2print'3/2.0=',3/2.0print'3//2.0=',3//2.0
3/2=13//2=13/2.0=1.53//2.0=1.0
默認,如果兩個操作數都是整數,Python 2 自動執行整型計算。
Python 3
print('3/2=',3/2)print('3//2=',3//2)print('3/2.0=',3/2.0)print('3//2.0=',3//2.0)
3/2=1.53//2=13/2.0=1.53//2.0=1.0
Note: 需要注意的是「雙劃線」(//)操作符將一直執行整除,而不管操作數的類型,這就是為什麼 5.0//2.0 值為 2.0。Python 3 中,/ 操作符是做浮點除法,而 // 是做整除(即商沒有餘數,比如 10 // 3 其結果就為 3,余數會被截除掉,而 (-7) // 3 的結果卻是 -3。這個演算法與其它很多編程語言不一樣,需要注意,它們的整除運算會向0的方向取值。而在 Python 2 中,/ 就是整除,即和 Python 3 中的 // 操作符一樣。
5)加入nonlocal語句。使用noclocal x可以直接指派外圍(非全局)變數
6)print
去除print語句,加入print()函數實現相同的功能。同樣的還有 exec語句,已經改為exec()函數
在Python 2里,print是一個語句。無論你想輸出什麼,只要將它們放在print關鍵字後邊就可以。
Python 3里,print()是一個函數。就像其他的函數一樣,print()需要你將想要輸出的東西作為參數傳給它。
例如:
2.X: print "The answer is", 2*2
3.X: print("The answer is", 2*2)
2.X: print x, # 使用逗號結尾禁止換行
3.X: print(x, end=" ") # 使用空格代替換行
在Python 2里,如果你使用一個逗號(,)作為print語句的結尾,它將會用空格分隔輸出的結果,然後在輸出一個尾隨的空格(trailing space),而不輸出回車(carriage return)。在Python 3里,通過把end=' '作為一個關鍵字參數傳給print()可以實現同樣的效果。參數end的默認值為'
',所以通過重新指定end參數的值,可以取消在末尾輸出回車符。
2.X: print # 輸出新行
3.X: print() # 輸出新行
2.X: print >>sys.stderr, "fatal error"
3.X: print("fatal error", file=sys.stderr)
在Python 2里,你可以通過使用>>pipe_name語法,把輸出重定向到一個管道,比如sys.stderr。在Python 3里,你可以通過將管道作為關鍵字參數file的值傳遞給print()來完成同樣的功能。參數file的默認值為std.stdout,所以重新指定它的值將會使print()輸出到一個另外一個管道。
2.X: print (x, y) # 輸出repr((x, y))
3.X: print((x, y)) # 不同於print(x, y)!
exec語句
exec()函數使用一個包含任意Python代碼的字元串作為參數,然後就像執行語句或者表達式一樣執行它。exec()跟eval()是相似的,但是exec()更加強大並更具有技巧性。eval()函數只能執行單獨一條表達式,但是exec()能夠執行多條語句,導入(import),函數聲明—實際上整個Python程序的字元串表示也可以。
Notes
Python 2
Python 3
①
execcodeString exec(codeString)
②
execcodeStringina_global_namespace exec(codeString,a_global_namespace)
③
execcodeStringina_global_namespace,a_local_namespace exec(codeString,a_global_namespace,a_local_namespace)
在最簡單的形式下,因為exec()現在是一個函數,而不是語句,2to3會把這個字元串形式的代碼用括弧圍起來。
Python 2里的exec語句可以指定名字空間,代碼將在這個由全局對象組成的私有空間里執行。Python 3也有這樣的功能;你只需要把這個名字空間作為第二個參數傳遞給exec()函數。
更加神奇的是,Python 2里的exec語句還可以指定一個本地名字空間(比如一個函數里聲明的變數)。在Python 3里,exec()函數也有這樣的功能。
- execfile('a_filename') exec(compile(open('a_filename').read(),'a_filename','exec'))
- for line in a_file.xreadlines(): for line in a_file:
- for line in a_file.xreadlines(5): no change (broken)
如果你以前調用沒有參數的xreadlines(),2to3會把它轉換成文件對象本身。在Python 3里,這種轉換後的代碼可以完成前同樣的工作:一次讀取文件的一行,然後執行for循環的循環體。
如果你以前使用一個參數(每次讀取的行數)調用xreadlines(),2to3不能為你完成從Python 2到Python 3的轉換,你的代碼會以這樣的方式失敗:AttributeError: '_io.TextIOWrapper' object has no attribute 'xreadlines'。你可以手工的把xreadlines()改成readlines()以使代碼能在Python 3下工作。(readline()方法在Python 3里返回迭代器,所以它跟Python 2里的xreadlines()效率是不相上下的。)
- u'PapayaWhip' 'PapayaWhip'
- ur'PapayaWhipfoo' r'PapayaWhipfoo'
Python 2里的Unicode字元串在Python 3里即普通字元串,因為在Python 3里字元串總是Unicode形式的。
Unicode原始字元串(raw string)(使用這種字元串,Python不會自動轉義反斜線"")也被替換為普通的字元串,因為在Python 3里,所有原始字元串都是以Unicode編碼的。
- unicode(anything) str(anything)
- from sys import maxint from sys import maxsize
execfile語句
就像以前的exec語句,Python 2里的execfile語句也可以像執行Python代碼那樣使用字元串。不同的是exec使用字元串,而execfile則使用文件。在Python 3里,execfile語句已經被去掉了。如果你真的想要執行一個文件里的Python代碼(但是你不想導入它),你可以通過打開這個文件,讀取它的內容,然後調用compile()全局函數強制Python解釋器編譯代碼,然後調用新的exec()函數。
Notes
Python 2
Python 3
7)輸入函數改變了,刪除了raw_input,用input代替: Python 2有兩個全局函數,用來在命令行請求用戶輸入。第一個叫做input(),它等待用戶輸入一個Python表達式(然後返回結果)。第二個叫做raw_input(),用戶輸入什麼它就返回什麼。這讓初學者非常困惑,並且這被廣泛地看作是Python語言的一個「肉贅」(wart)。Python 3通過重命名raw_input()為input(),從而切掉了這個肉贅,所以現在的input()就像每個人最初期待的那樣工作。
2.X:guess = int(raw_input('Enter an integer : ')) # 讀取鍵盤輸入的方法
3.X:guess = int(input('Enter an integer : '))
Note:如果你真的想要請求用戶輸入一個Python表達式,計算結果,可以通過調用input()函數然後把返回值傳遞給eval()。
I/O方法xreadlines()
在Python 2里,文件對象有一個xreadlines()方法,它返回一個迭代器,一次讀取文件的一行。這在for循環中尤其有用。事實上,後來的Python 2版本給文件對象本身添加了這樣的功能。
在Python 3里,xreadlines()方法不再可用了。2to3可以解決簡單的情況,但是一些邊緣案例則需要人工介入。
Notes
Python 2
Python 3
①
②
8)改變了順序操作符的行為,例如x<y,當x和y類型不匹配時拋出TypeError而不是返回隨即的 bool值
9)去除元組參數解包。不能def(a, (b, c)):pass這樣定義函數了
10)新式的8進制字變數,相應地修改了oct()函數。
2.X的方式如下:
>>> 0666
438
>>> oct(438)
'0666'
3.X這樣:
>>> 0666
SyntaxError: invalid token (<pyshell#63>, line 1)
>>> 0o666
438
>>> oct(438)
'0o666'
11)增加了 2進制字面量和bin()函數
>>> bin(438)
'0b110110110'
>>> _438 = '0b110110110'
>>> _438
'0b110110110'
12)擴展的可迭代解包。在Py3.X 里,a, b, *rest = seq和 *rest, a = seq都是合法的,只要求兩點:rest是list對象和seq是可迭代的。
13)新的super(),可以不再給super()傳參數,
>>> class C(object):
def __init__(self, a):
print('C', a)
>>> class D(C):
def __init(self, a):
super().__init__(a) # 無參數調用super()
>>> D(8)
C 8
<__main__.D object at 0x00D7ED90>
14)支持class decorator。用法與函數decorator一樣:
>>> def foo(cls_a):
def print_func(self):
print('Hello, world!')
cls_a.print = print_func
return cls_a
>>> @foo
class C(object):
pass
>>> C().print()
Hello, world!
class decorator可以用來玩玩狸貓換太子的大把戲。更多請參閱PEP 3129
4. 字元串和位元組串
Python 2有兩種字元串類型:Unicode字元串和非Unicode字元串。Python 2有基於ASCII的str()類型,其可通過單獨的unicode()函數轉成unicode類型,但沒有byte類型。
而在Python 3中,終於有了Unicode(utf-8)字元串,以及兩個位元組類:bytes和bytearrays。Python 3隻有一種類型:Unicode字元串(Unicode strings)。只有str一種類型,但它跟2.x版本的unicode幾乎一樣。
Notes
Python 2
Python 3
①
②
全局函數unicode()
Python 2有兩個全局函數可以把對象強制轉換成字元串:unicode()把對象轉換成Unicode字元串,還有str()把對象轉換為非Unicode字元串。
Python 3隻有一種字元串類型,Unicode字元串,所以str()函數即可完成所有的功能。(unicode()函數在Python 3里不再存在了。)
Notes
Python 2
Python 3
5.數據類型
1)Python 2有為非浮點數准備的int和long類型。int類型的最大值不能超過sys.maxint,而且這個最大值是平台相關的。可以通過在數字的末尾附上一個L來定義長整型,顯然,它比int類型表示的數字范圍更大。
在Python 3里,只有一種整數類型int,大多數情況下,它很像Python 2里的長整型。
Note:檢查一個變數是否是整型,獲得它的數據類型,並與一個int類型(不是long)的作比較。你也可以使用isinstance()函數來檢查數據類型;再強調一次,使用int,而不是long,來檢查整數類型。
sys.maxint
由於長整型和整型被整合在一起了,sys.maxint常量不再精確。但是因為這個值對於檢測特定平台的能力還是有用處的,所以它被Python 3保留,並且重命名為sys.maxsize。
Notes
Python 2
Python 3
①
②
2. python的基本語法是什麼
語法規則,條件語句、循環語句、方法、類那些。基本內數據類型,Python是弱類型需要容,但還是有類型的,這些類型的特點及操作。內置庫API的使用,比如sqlite、網路請求庫、json等。
Python由荷蘭數學和計算機科學研究學會的Guido van Rossum於1990 年代初設計,作為一門叫做ABC語言的替代品。
Python提供了高效的高級數據結構,還能簡單有效地面向對象編程。Python語法和動態類型,以及解釋型語言的本質,使它成為多數平台上寫腳本和快速開發應用的編程語言,隨著版本的不斷更新和語言新功能的添加,逐漸被用於獨立的、大型項目的開發。
Python解釋器易於擴展,可以使用C或C++(或者其他可以通過C調用的語言)擴展新的功能和數據類型。 Python 也可用於可定製化軟體中的擴展程序語言。Python豐富的標准庫,提供了適用於各個主要系統平台的源碼或機器碼。
2021年10月,語言流行指數的編譯器Tiobe將Python加冕為最受歡迎的編程語言,20年來首次將其置於Java、C和JavaScript之上。
3. python多行注釋符號是什麼
python中的注釋有多種,有單行注釋,多行注釋,批量注釋,中文注釋也是常用的。
一、python單行注釋符號(#):井號(#)常被用作單行注釋符號,在代碼中使用#時,它右邊的任何數據都會被忽略,當做是注釋。print 1 #輸出1,#號右邊的內容在執行的時候是不會被輸出的。
二、批量、多行注釋符號:在python中也會有注釋有很多行的時候,這種情況下就需要批量多行注釋符了。多行注釋是用三引號''' '''包含的。
python正則表達式的注釋方法:學過正則都知道,那簡直是天書,為了提高正則的可讀性,正則表達式中提供了X(VERBOSE): 詳細模式。這個模式下正則表達式可以是多行,忽略空白字元,並可以加入注釋。
Python:
是完全面向對象的語言。函數、模塊、數字、字元串都是對象。並且完全支持繼承、重載、派生、多繼承,有益於增強源代碼的復用性。Python支持重載運算符和動態類型。
相對於Lisp這種傳統的函數式編程語言,Python對函數式設計只提供了有限的支持。有兩個標准庫(functools, itertools)提供了Haskell和Standard ML中久經考驗的函數式程序設計工具。
4. Python有哪些基本語法與變數
Python的多行語句
如語句過長,導致編輯器的窗口寬度不能完全完全顯示時。就可以使用“”符合將一行語句分為多行顯示。
Python引導
在Python語言中,引號主要用於表示字元串。可以使用單引號(')、雙引號(”)、三引號(’’’),引號必須成對使用。單引號和雙引號用於程序中的字元串表示;三引號允許一個字元串可以跨多行、字元串中可以包含換行符、製表符以及其他特殊字元,三引號也用於程序中的注釋。
Python標識符
標識符用於Python語言的變數、關鍵字、函數、對象等數據的命名。標識符的命名需要遵循下面的規則。
① 可以由字母(大寫A—Z或小寫a—z)、數字(0—9)和_(下劃線)組合而成,但不能由數字開頭;
② 不能包含除_以外的任何特殊字元,如:%、#、&、逗號、空格等;
③ 不能包含空白字元(換行符、空格和製表符稱為空白字元);
④ 標識符不能是Python語言的關鍵字和保留字;
⑤ 標識符區分大小寫,num1和Num2是兩個不同的標識符。
⑥ 標識符的命名要有意義,做到見名知意。
Python關鍵字
Python預先定義了一部分有特別意義的標識符,用於語言自身使用。這部分標識符稱為關鍵字或保留字,不能用於其它用途,否則會引起語法錯誤,隨著Python語言的發展,其預留的關鍵字也會有所變化。表1列出了Python預留的關鍵字。
變數
用標識符命名的存儲單元的地址稱為變數,變數是用來存儲數據的,通過標識符可以獲取變數的值,也可以對變數進行賦值。對變數賦值的意思是將值賦給變數,賦值完成後,變數所指向的存儲單元存儲了被賦的值,在Pyhton語言中賦值操作符為“=、+=、-=、*=、/=、%=、**=、//=”。
當程序使用變數存儲數據時,必須要先聲明變數,然後才能使用。
可以在變數聲明時給變數賦值,也可以不賦值。聲明變數時,不需要聲明數據類型,Python會自動選擇數據類型進行匹配。
關於Python有哪些基本語法與變數,環球青藤小編就和大家分享到這里了,學習是永無止境的,學習一項技能更是受益終身,所以,只要肯努力學,什麼時候開始都不晚。如果您還想繼續了解關於python編程的學習方法及素材等內容,可以點擊本站其他文章學習。
5. python注釋符號是什麼
Python中的注釋有單行注釋和多行注釋,Python中單行注釋以#符號開頭,多行注釋用三個單引號'''符號或者三個雙引號"""符號將注釋括起來。
一、python單行注釋符號(#):井號(#)常被用作單行注釋符號,在代碼中使用#時,它右邊的任何數據都會被忽略,當做是注釋。print 1 #輸出1,#號右邊的內容在執行的時候是不會被輸出的。
二、批量、多行注釋符號:在python中也會有注釋有很多行的時候,這種情況下就需要批量多行注釋符了。多行注釋是用三引號''' '''包含的。
python正則表達式的注釋方法:學過正則都知道,那簡直是天書,為了提高正則的可讀性,正則表達式中提供了X(VERBOSE): 詳細模式。這個模式下正則表達式可以是多行,忽略空白字元,並可以加入注釋。
基本語法
Python的設計目標之一是讓代碼具備高度的可閱讀性。它設計時盡量使用其它語言經常使用的標點符號和英文單字,讓代碼看起來整潔美觀。它不像其他的靜態語言如C、Pascal那樣需要重復書寫聲明語句,也不像它們的語法那樣經常有特殊情況和意外。
Python開發者有意讓違反了縮進規則的程序不能通過編譯,以此來強製程序員養成良好的編程習慣。並且Python語言利用縮進表示語句塊的開始和退出(Off-side規則),而非使用花括弧或者某種關鍵字。增加縮進表示語句塊的開始,而減少縮進則表示語句塊的退出。
6. python 變數單下劃線和雙下劃線的區別
1、_xxx 不能用於』from mole import *』 以單下劃線開頭的表示的是protected類型的變數。
即保護類型只能允許其本身與子類進行訪問。
2、__xxx 雙下劃線的表示的是私有類型的變數。只能是允許這個類本身進行訪問了。連子類也
不可以
3、__xxx___ 定義的是特列方法。像__init__之類的
7. python中,函數名前後的雙劃線有什麼作用
每一個mole都有一個叫__name__的變數,它的值就是mole的名字
比如os.__name__ 是"os",sys模塊的__name__是"sys"
__main__也是一個模塊,但是這個模塊比較特殊,其他的模塊都有一個對應的同名py文件,比如os.py, sys.py,這個模塊卻沒有對應的固定名字的py文件,不管你執行 什麼.py,它的名字都是__main__。它指的是正在運行的模塊,即主模塊。
上面說過,每個模塊都有__name__這個變數, 那麼主模塊也不例外,主模塊的__name__變數,值就是"__main__"
解釋了半天,再說你的問題:__name__和name是兩個不同的變數,__name__有定義而name沒有定義,使用沒有定義的變數就要出錯,這沒有什麼好說的。
例如你寫:
if name == '__main__':是一個變數未定義的錯誤
而當你寫 if __name__ == 'main':的時候,由於__name__的值其實是'__main__',所以if的條件為假,不會執行你的代碼。
最後,你可以自己寫一點測試代碼來探索這個問題,文件名就叫test.py,代碼也很簡單:
print(__name__)
importtest
輸出有兩行,第一行毫無疑問是__main__,第二行比較有意思,輸出是test,因為此時test.py作為一個模塊被import其__name__就是"test"。
8. python 中下劃線使用的規范
PEP-8是Python的編程規范,可以看看,Naming Conventions那一節介紹了前/後、單/雙下劃線的用法。