1. 程式人生 > 其它 >python2與python3的區別

python2與python3的區別

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