python2與python3的區別
阿新 • • 發佈:2021-07-28
1、字元編碼(主要) py2: unicode(內部是unicode編碼) ->壓縮(utf8) str=bytes(根據壓縮方式,可以是utf8,gbk等) name = u'小明' name = '小明' py3: str(內部是unicode編碼) ->壓縮(utf8) bytes(根據壓縮方式,可以是utf8,gbk等) name = "小明" name = b'小明' 2、直譯器編碼(預設) py2: ascii py3: utf-8
示例
# _*_ coding:utf8 _*_ --> 宣告讓直譯器使用utf8的格式去解析字元 ####### py2直譯器預設ascii編碼 ###### # 因為上面聲明瞭# _*_ coding:utf8 _*_,因此這裡的中文直譯器會使用utf-8的格式去解析 # 若沒有宣告# _*_ coding:utf8 _*_,則直譯器預設使用ascii去解析,ascii不能解析中文 name = '小明' # 這裡沒有新增 u ,此時已經進行了編碼 name2 = u'小明' # 字元前加u,表明用現在是字元內部編碼unicode,此時還沒進行編碼編碼示例name3 = u'小明'.encode('utf-8') # 自己宣告使用什麼格式去解析字元 print name, type(name) # 小明 <type 'str'>:使用utf8解析後的字元 print name2, type(name2) # 小明 <type 'unicode'>:字元內部編碼unicode print name3, type(name3) # 小明 <type 'str'>:使用utf8解析後的字元 ####### py3直譯器預設是 utf8編碼 ###### name = '狗明' # 未宣告使用什麼編碼,則使用預設的utf-8去編碼,此時還沒進行編碼name2 = b'ming' # 這裡不能寫中文,使用 b 宣告的字元預設是用ascii去解析,ascii不能解析中文 name3 = '狗明'.encode('utf-8') # 主動宣告使用utf-8編碼 print(name, type(name)) # 狗明 <class 'str'>:python3使用預設的utf-8編碼解析後的字元 print(name2, type(name2)) # b'ming' <class 'bytes'>:使用ascii解析後的字元 print(name3, type(name3)) # b'\xe7\x8b\x97\xe6\x98\x8e' <class 'bytes'>:使用utf8解析後的字元
3、range和xrange python2: range(3) ---> [0,1,2] 列表 xrange(3) ---> 迭代器 pytohn3: range(3) ---> range(0,3) range型別,是可迭代物件,跟迭代器類似 4、經典類和新式類 繼承了object的類就是新式類 在py3中所有的類都是新式類 在py2中既有新式類又有經典類 5、yield from(py2中無) def test(): yield 666 yield 999 def func(): yield 1 yield from test() yield 2 yield 3 gen = func() for line in gen: print(line) # 1 666 999 2 3 6、input python2中input輸入的是什麼型別,它就是什麼型別 python3中input輸入的無論是什麼型別,它都是字串型別 python2中與python3的input一樣功能的是raw_input() 7、print py2: print '小明' py3: print('小明') 8、包 python2中,不是包不能相互匯入模組 python3中不是包也可以匯入 9、python3的新特性之型別註解 Python是一門動態語言,變數以及函式的引數是不區分型別。比如我們要實現一個數字相加的函式: def my_add(x, y): return x + y 但是這樣的壞處是,別人不知道你要做的是數字相加的函式,別人輸入字串,一樣是可以得到字串的拼接的 於是 Python 3 提供了一個新的特性: 型別註解: def my_add(x:int, y:int) -> int: return x + y 語法: 引數:型別 指定函式的引數型別 -> 型別 指定函式的返回值型別。 注意:Python 直譯器並不會因為這些註解而提供額外的校驗, 也就是說,這些型別註解加不加,對你的程式碼來說沒有任何影響,我一樣可以輸入字串的。 只是這麼做的好處是: 1.讓別人看得更明白 2.當你輸入str和float 型別的引數時,雖然一樣不會報錯可以得出結果,但是IDE工具會有高亮提示 10、f-string 1、介紹 f-string(formatted string literals):格式化字串常量,是Python3.6新引入的一種字串格式化方法,使格式化字串的操作更加簡便。 2、語法 f'xxx' 或 F'xxx' 且以大括號 {} 標明被替換的欄位,{}裡面可以是字串或者表示式 3、簡單替換字串:{'字串'} name = '小白' msg = f'我叫{name},今年{18}歲,性別{"男"}' print(msg) # 我叫小白,今年18歲,性別男 注意:若f使用的是單引號,那麼裡面的{}若是字串則應該用雙引號,反之一樣 4、計算表示式:{表示式} ret = f"1 add 2 is {1+2}" print(ret) # 1 add 2 is 3 5、lambda表示式:{(lambda表示式) (引數)} 注意: lambda表示式的 : 會被f-string誤認為是表示式與格式描述符之間的分隔符, 為避免歧義,需要將lambda表示式置於括號 () 內: func = f"my_add result:{(lambda x,y:x+y) (1,2)}" print(func) # my_add result:3 若不加括號則報錯: func = f"my_add result:{lambda x,y:x+y (1,2)}" print(func) File "<fstring>", line 1 (lambda x,y) ^ SyntaxError: unexpected EOF while parsing