Python 2.7.x 與 Python 3.x 的不同點(diǎn)

本文翻譯自:《Key differences between Python 2.7.x and Python 3.x》

許多 Python 初學(xué)者想知道他們應(yīng)該從 Python 的哪個(gè)版本開(kāi)始學(xué)習(xí)。對(duì)于這個(gè)問(wèn)題我的答案是 “你學(xué)習(xí)你喜歡的教程的版本,然后檢查他們之間的不同。” 但如果你并未了解過(guò)兩個(gè)版本之間的差異,個(gè)人推薦使用 Python 2.7.x 版本,畢竟大部分教材等資料還是用Python 2.7.x來(lái)寫(xiě)的。

但是如果你開(kāi)始一個(gè)新項(xiàng)目,并且有選擇權(quán)?我想說(shuō)的是目前沒(méi)有對(duì)錯(cuò),只要你計(jì)劃使用的庫(kù) Python 2.7.x 和 Python 3.x 雙方都支持的話。盡管如此,當(dāng)在編寫(xiě)它們中的任何一個(gè)的代碼,或者是你計(jì)劃移植你的項(xiàng)目的時(shí)候,是非常值得看看這兩個(gè)主要流行的 Python 版本之間的差別的,以便避免常見(jiàn)的陷阱。


1 __future__模塊

Python 3.x 介紹的 一些Python 2 不兼容的關(guān)鍵字和特性可以通過(guò)在 Python 2 的內(nèi)置__future__ 模塊導(dǎo)入。如果你計(jì)劃讓你的代碼支持 Python 3.x,建議你使用 __future__模塊導(dǎo)入。例如,如果我想要 在Python 2 中表現(xiàn) Python 3.x 中的整除,我們可以通過(guò)如下導(dǎo)入:

from __future__ import division

更多的 future 模塊可被導(dǎo)入的特性被列在下表中:


(來(lái)源: https://docs.python.org/2/library/future.html


2 print函數(shù)

很瑣碎,而print語(yǔ)法的變化可能是最廣為人知的了,但是仍值得一提的是: Python 2 的 print 聲明已經(jīng)被 print()函數(shù)取代了,這意味著我們必須包裝我們想打印在小括號(hào)中的對(duì)象。
Python 2 不具有額外的小括號(hào)問(wèn)題。但對(duì)比一下,如果我們按照 Python 2 的方式不使用小括號(hào)調(diào)用print 函數(shù),Python 3 將拋出一個(gè)語(yǔ)法異常(SyntaxError)。

Python 2

print 'Python', python_version()
print 'Hello, World!'
print('Hello, World!')
print "text", ; print 'print more text on the same line'

運(yùn)行結(jié)果如下:

Python 2.7.6
Hello, World!
Hello, World!
text print more text on the same line

Python 3

print('Python', python_version())
print('Hello, World!')
print("some text,", end="") 
print(' print more text on the same line')

運(yùn)行結(jié)果如下:

Python 3.4.1
Hello, World!
some text, print more text on the same line

Python 3

print 'Hello, World!'

運(yùn)行結(jié)果如下:

File ““, line 1
  print ‘Hello, World!’
          ^
SyntaxError: invalid syntax

以上通過(guò) Python 2 使用 Printing "Hello, World" 是非常正常的,盡管如此,如果你有多個(gè)對(duì)象在小括號(hào)中,我們將創(chuàng)建一個(gè)元組,因?yàn)?code>print 在 Python 2 中是一個(gè)聲明,而不是一個(gè)函數(shù)調(diào)用。

print 'Python', python_version()
print('a', 'b')
print 'a', 'b'

運(yùn)行結(jié)果如下:

Python 2.7.7
(‘a(chǎn)’, ‘b’)
a b

3 整除

如果你正在移植代碼,這個(gè)變化是特別危險(xiǎn)的。或者你在 Python 2 上執(zhí)行 Python 3 的代碼。因?yàn)檫@個(gè)整除的變化表現(xiàn)在它會(huì)被忽視(即它不會(huì)拋出語(yǔ)法異常)。

因此,我還是傾向于使用一個(gè)float(3)/23/2.0代替在我的 Python 3 腳本保存在 Python 2 中的 3/2的一些麻煩(并且反而過(guò)來(lái)也一樣,我建議在你的 Python 2 腳本中使用 from __future__ import division)。

Python 2

print 'Python', python_version()
print '3 / 2 =', 3 / 2
print '3 // 2 =', 3 // 2
print '3 / 2.0 =', 3 / 2.0
print '3 // 2.0 =', 3 // 2.0

運(yùn)行結(jié)果如下:

Python 2.7.6
3 / 2 = 1
3 // 2 = 1
3 / 2.0 = 1.5
3 // 2.0 = 1.0

Python 3

print('Python', python_version())
print('3 / 2 =', 3 / 2)
print('3 // 2 =', 3 // 2)
print('3 / 2.0 =', 3 / 2.0)
print('3 // 2.0 =', 3 // 2.0)

運(yùn)行結(jié)果如下:

Python 3.4.1
3 / 2 = 1.5
3 // 2 = 1
3 / 2.0 = 1.5
3 // 2.0 = 1.0

4 Unicode

Python 2 有 ASCII str() 類型,unicode()是單獨(dú)的,不是 byte 類型。
現(xiàn)在, 在 Python 3,我們最終有了 Unicode (utf-8)字符串,以及一個(gè)字節(jié)類:bytebytearrays

Python 2

print 'Python', python_version()

運(yùn)行結(jié)果如下:

Python 2.7.6
print type(unicode('this is like a python3 str type'))

運(yùn)行結(jié)果如下:

< type ‘unicode’ >
print type(b'byte type does not exist')

運(yùn)行結(jié)果如下:

< type ‘str’ >
print 'they are really' + b' the same'

運(yùn)行結(jié)果如下:

they are really the same
print type(bytearray(b'bytearray oddly does exist though'))

運(yùn)行結(jié)果如下:

< type ‘bytearray’ >

Python 3

print('Python', python_version())
print('strings are now utf-8 \u03BCnico\u0394é!')

運(yùn)行結(jié)果如下:

Python 3.4.1
strings are now utf-8 μnicoΔé!
print('Python', python_version(), end="")
print(' has', type(b' bytes for storing data'))

運(yùn)行結(jié)果如下:

Python 3.4.1 has < class ‘bytes’ >
print('and Python', python_version(), end="")
print(' also has', type(bytearray(b'bytearrays')))

運(yùn)行結(jié)果如下:

and Python 3.4.1 also has < class ‘bytearray’>

5 xrange模塊

在 Python 2 中xrange()創(chuàng)建迭代對(duì)象的用法是非常流行的。比如: for循環(huán)或者是列表/集合/字典推導(dǎo)式。
  
這個(gè)表現(xiàn)十分像生成器(比如。“惰性求值”)。但是這個(gè) xrange-iterable是無(wú)窮的,意味著你可以無(wú)限遍歷。
  
由于它的惰性求值,如果你不得僅僅不遍歷它一次,xrange() 函數(shù) 比range()更快(比如 for 循環(huán))。盡管如此,對(duì)比迭代一次,不建議你重復(fù)迭代多次,因?yàn)樯善髅看味紡念^開(kāi)始。
  
在 Python 3 中,range()是像 xrange() 那樣實(shí)現(xiàn)以至于一個(gè)專門(mén)的 xrange()函數(shù)都不再存在(在 Python 3 中xrange()會(huì)拋出命名異常)。

import timeit
n = 10000
def test_range(n):
    return for i in range(n):
        pass
def test_xrange(n):
    for i in xrange(n):
        pass

Python 2

print 'Python', python_version()
print '\ntiming range()'
%timeit test_range(n)
print '\n\ntiming xrange()'
%timeit test_xrange(n)

運(yùn)行結(jié)果如下:

Python 2.7.6
timing range()
1000 loops, best of 3: 433 μs per loop
timing xrange()
1000 loops, best of 3: 350 μs per loop

Python 3

print('Python', python_version())
print('\ntiming range()')
%timeit test_range(n)

運(yùn)行結(jié)果如下:

Python 3.4.1
timing range()
1000 loops, best of 3: 520 μs per loop
print(xrange(10))

運(yùn)行結(jié)果如下:

NameError Traceback (most recent call last)
in ()
——> 1 print(xrange(10))
NameError: name ‘xrange’ is not defined

6 Python3中的range對(duì)象的__contains__方法

另外一件值得一提的事情就是在 Python 3 中range有一個(gè)新的__contains__方法(感謝 Yuchen Ying 指出了這個(gè)),__contains__方法可以加速 “查找” 在 Python 3.x 中顯著的整數(shù)和布爾類型。

x = 10000000
def val_in_range(x, val):
    return val in range(x)
def val_in_xrange(x, val):
    return val in xrange(x)
print('Python', python_version())
assert(val_in_range(x, x/2) == True)
assert(val_in_range(x, x//2) == True)
%timeit val_in_range(x, x/2)
%timeit val_in_range(x, x//2)

運(yùn)行結(jié)果如下:

Python 3.4.1
1 loops, best of 3: 742 ms per loop
1000000 loops, best of 3: 1.19 μs per loop

基于以上的 timeit 的結(jié)果,當(dāng)它使一個(gè)整數(shù)類型,而不是浮點(diǎn)類型的時(shí)候,你可以看到執(zhí)行查找的速度是 60000 倍快。盡管如此,因?yàn)?Python 2.x 的range 或者是xrange 沒(méi)有一個(gè)__contains__ 方法,這個(gè)整數(shù)類型或者是浮點(diǎn)類型的查詢速度不會(huì)相差太大。

print 'Python', python_version()
assert(val_in_xrange(x, x/2.0) == True)
assert(val_in_xrange(x, x/2) == True)
assert(val_in_range(x, x/2) == True)
assert(val_in_range(x, x//2) == True)
%timeit val_in_xrange(x, x/2.0)
%timeit val_in_xrange(x, x/2)
%timeit val_in_range(x, x/2.0)
%timeit val_in_range(x, x/2)

運(yùn)行結(jié)果如下:

Python 2.7.7
1 loops, best of 3: 285 ms per loop
1 loops, best of 3: 179 ms per loop
1 loops, best of 3: 658 ms per loop
1 loops, best of 3: 556 ms per loop

下面說(shuō)下__contain__方法并沒(méi)有加入到 Python 2.x 中的證據(jù):

print('Python', python_version())
range.__contains__

運(yùn)行結(jié)果如下:

Python 3.4.1
< slot wrapper ‘contains‘ of ‘range’ objects >
print 'Python', python_version()
range.__contains__

運(yùn)行結(jié)果如下:

Python 2.7.7
AttributeError Traceback (most recent call last)
< ipython-input-7-05327350dafb> in < module>()
1 print ‘Python’, pythonversion()
——> 2 range.`_contains`
AttributeError: ‘builtinfunctionor_method’ object has no attribute `’__contains‘`
print 'Python', python_version()
xrange.__contains__

運(yùn)行結(jié)果如下:

Python 2.7.7
AttributeError Traceback (most recent call last)
< ipython-input-8-7d1a71bfee8e> in < module>()
1 print ‘Python’, pythonversion()
——> 2 xrange.`_contains`
AttributeError: type object ‘xrange’ has no attribute '__contains__'

注意在 Python 2 和 Python 3 中速度的不同
有些人指出了 Python 3 的 range() 和 Python 2 的 xrange() 之間的速度不同。因?yàn)樗麄兪怯孟嗤姆椒▽?shí)現(xiàn)的,因此期望相同的速度。盡管如此,這事實(shí)在于 Python 3 傾向于比 Python 2 運(yùn)行的慢一點(diǎn)。

def test_while():
    i = 0
    while i < 20000:
        i += 1
    return

Python 3

print('Python', python_version())
%timeit test_while()

運(yùn)行結(jié)果如下:

Python 3.4.1
100 loops, best of 3: 2.68 ms per loop

Python 2

print 'Python', python_version()
%timeit test_while()

運(yùn)行結(jié)果如下:

Python 2.7.6
1000 loops, best of 3: 1.72 ms per loop

7 拋出異常

Python 2 接受新舊兩種語(yǔ)法標(biāo)記,在 Python 3 中如果我不用小括號(hào)把異常參數(shù)括起來(lái)就會(huì)阻塞(并且反過(guò)來(lái)引發(fā)一個(gè)語(yǔ)法異常)。
Python 2

print 'Python', python_version()

運(yùn)行結(jié)果如下:

Python 2.7.6
raise IOError, "file error"

運(yùn)行結(jié)果如下:

IOError Traceback (most recent call last)
< ipython-input-8-25f049caebb0> in < module>()
——> 1 raise IOError, “file error”
IOError: file error
raise IOError("file error")

運(yùn)行結(jié)果如下:

IOError Traceback (most recent call last)
< ipython-input-9-6f1c43f525b2> in < module>()
——> 1 raise IOError(“file error”)
IOError: file error

Python 3

print 'Python', python_version()

運(yùn)行結(jié)果如下:

Python 3.4.1
raise IOError, "file error"

運(yùn)行結(jié)果如下:

File ““, line 1
raise IOError, “file error”
      ^
SyntaxError: invalid syntax

在 Python 3 中,可以這樣拋出異常:

print('Python', python_version())
raise IOError("file error")

運(yùn)行結(jié)果如下:

Python 3.4.1
OSError Traceback (most recent call last)
< ipython-input-11-c350544d15da> in < module>()
1 print(‘Python’, python_version())
——> 2 raise IOError(“file error”)
OSError: file error

8 處理異常

在 Python 3 中處理異常也輕微的改變了,在 Python 3 中我們現(xiàn)在使用 as 作為關(guān)鍵詞。
Python 2

print 'Python', python_version()
try:
    let_us_cause_a_NameError
except NameError, err:
    print err, '--> our error message'

運(yùn)行結(jié)果如下:

Python 2.7.6
name ‘let_us_cause_a_NameError’ is not defined —> our error message

Python 3

print('Python', python_version())
try:
    let_us_cause_a_NameError
except NameError as err:
    print(err, '--> our error message')

運(yùn)行結(jié)果如下:

Python 3.4.1
name ‘let_us_cause_a_NameError’ is not defined —> our error message

9 next()函數(shù)和.next()方法

因?yàn)?next() (.next())是一個(gè)如此普通的使用函數(shù)(方法),這里有另外一個(gè)語(yǔ)法改變(或者是實(shí)現(xiàn)上改變了),值得一提的是:在 Python 2.7.5 中函數(shù)和方法你都可以使用,next()函數(shù)在 Python 3 中一直保留著(調(diào)用.next()拋出屬性異常)。
Python 2

print 'Python', python_version()
my_generator = (letter for letter in 'abcdefg')
next(my_generator)
my_generator.next()

運(yùn)行結(jié)果如下:

Python 2.7.6
‘b

Python 3

print('Python', python_version())
my_generator = (letter for letter in 'abcdefg')
next(my_generator)

運(yùn)行結(jié)果如下:

Python 3.4.1
‘a(chǎn)’
1
my_generator.next()

運(yùn)行結(jié)果如下:

AttributeError Traceback (most recent call last)
< ipython-input-14-125f388bb61b> in < module>()
——> 1 my_generator.next()
AttributeError: ‘generator’ object has no attribute ‘next’

10 For循環(huán)變量和全局命名空間泄漏

好消息:在 Python 3.x 中for循環(huán)變量不會(huì)再導(dǎo)致命名空間泄漏。
  
在 Python 3.x 中做了一個(gè)改變,在 What’s New In Python 3.0 中有如下描述:
  
“列表推導(dǎo)不再支持[... for var in item1, item2, ...] 這樣的語(yǔ)法。使用[... for var in (item1, item2, ...)]代替。也需要提醒的是列表推導(dǎo)有不同的語(yǔ)義: 他們關(guān)閉了在list()構(gòu)造器中的生成器表達(dá)式的語(yǔ)法糖, 并且特別是循環(huán)控制變量不再泄漏進(jìn)周?chē)淖饔梅秶颉?/p>

Python 2

print 'Python', python_version()
i = 1
print 'before: i =', i
print 'comprehension: ', [i for i in range(5)]
print 'after: i =', i

運(yùn)行結(jié)果如下:

Python 2.7.6
before: i = 1
comprehension: [0, 1, 2, 3, 4]
after: i = 4

Python 3

print('Python', python_version())
i = 1
print('before: i =', i)
print('comprehension:', [i for i in range(5)])
print('after: i =', i)

運(yùn)行結(jié)果如下:

Python 3.4.1
before: i = 1
comprehension: [0, 1, 2, 3, 4]
after: i = 1

11 比較不可排序類型

在 Python 3 中的另外一個(gè)變化就是當(dāng)對(duì)不可排序類型做比較的時(shí)候,會(huì)拋出一個(gè)類型錯(cuò)誤。
Python 2

print 'Python', python_version()
print "[1, 2] > 'foo' = ", [1, 2] > 'foo'
print "(1, 2) > 'foo' = ", (1, 2) > 'foo'
print "[1, 2] > (1, 2) = ", [1, 2] > (1, 2)

運(yùn)行結(jié)果如下:

Python 2.7.6
[1, 2] > ‘foo’ = False
(1, 2) > ‘foo’ = True
[1, 2] > (1, 2) = False

Python 3

print('Python', python_version())
print("[1, 2] > 'foo' = ", [1, 2] > 'foo')
print("(1, 2) > 'foo' = ", (1, 2) > 'foo')
print("[1, 2] > (1, 2) = ", [1, 2] > (1, 2))

運(yùn)行結(jié)果如下:

Python 3.4.1
TypeError Traceback (most recent call last)
< ipython-input-16-a9031729f4a0> in < module>()
1 print(‘Python’, python_version())
——> 2 print(“[1, 2] > ‘foo’ = “, [1, 2] > ‘foo’)
3 print(“(1, 2) > ‘foo’ = “, (1, 2) > ‘foo’)
4 print(“[1, 2] > (1, 2) = “, [1, 2] > (1, 2))
TypeError: unorderable types: list() > str()

12 通過(guò)input()解析用戶的輸入

幸運(yùn)的是,在 Python 3 中已經(jīng)解決了把用戶的輸入存儲(chǔ)為一個(gè) str對(duì)象的問(wèn)題。為了避免在 Python 2 中的讀取非字符串類型的危險(xiǎn)行為,我們不得不使用raw_input()代替。
Python 2

>>> my_input = input('enter a number: ')
enter a number: 123
>>> type(my_input)
<type 'int'>
>>> my_input = raw_input('enter a number: ')
enter a number: 123
>>> type(my_input)
<type 'str'>

Python 3

>>> my_input = input('enter a number: ')
enter a number: 123
>>> type(my_input)
<class 'str'>

13 返回可迭代對(duì)象,而不是列表

如果在 xrange 章節(jié)看到的,現(xiàn)在在 Python 3 中一些方法和函數(shù)返回迭代對(duì)象 — 代替 Python 2 中的列表
  
因?yàn)槲覀兺ǔD切┍闅v只有一次,我認(rèn)為這個(gè)改變對(duì)節(jié)約內(nèi)存很有意義。盡管如此,它也是可能的,相對(duì)于生成器 —- 如需要遍歷多次。它是不那么高效的。
  
而對(duì)于那些情況下,我們真正需要的是列表對(duì)象,我們可以通過(guò)list()函數(shù)簡(jiǎn)單的把迭代對(duì)象轉(zhuǎn)換成一個(gè)列表。
Python 2

print 'Python', python_version() 
print range(3) 
print type(range(3))

運(yùn)行結(jié)果如下:

Python 2.7.6
[0, 1, 2]
< type ‘list’>

Python 3

print('Python', python_version())
print(range(3))
print(type(range(3)))
print(list(range(3)))

運(yùn)行結(jié)果如下:

Python 3.4.1
range(0, 3)
< class ‘range’>
[0, 1, 2]

在 Python 3 中一些經(jīng)常使用到的不再返回列表的函數(shù)和方法:

  • zip()
  • map()
  • filter()
  • 字典的.keys()方法
  • 字典的.values()方法
  • 字典的.items()方法

更多的關(guān)于 Python 2 和 Python 3 的文章

移植到 Python 3
Should I use Python 2 or Python 3 for my development activity?
What’s New In Python 3.0
Porting to Python 3
Porting Python 2 Code to Python 3
How keep Python 3 moving forward

Python 3 的擁護(hù)者和反對(duì)者
10 awesome features of Python that you can’t use because you refuse to upgrade to Python 3
Everything you did not want to know about Unicode in Python 3
Python 3 is killing Python
Python 3 can revive Python
Python 3 is fine

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,185評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 175,656評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,647評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,446評(píng)論 6 405
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 54,951評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,189評(píng)論 0 287
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,718評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,602評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,800評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,045評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,419評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,671評(píng)論 1 281
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,420評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,755評(píng)論 2 371

推薦閱讀更多精彩內(nèi)容