自學(xué)是門手藝 :入口
導(dǎo)讀:歡迎你來到站長在線的站長書籍欄目,你正在學(xué)習(xí)的是李笑來著作的《自學(xué)是門手藝》一書中的《入口》原文內(nèi)容如下:
永久美國免備案虛擬主機1元1天,15元1月,100元1年,1000元永久
站長在線旗下答案網(wǎng)站,全站所有題目,免費查看答案和答案解析
導(dǎo)讀:歡迎你來到站長在線的站長書籍欄目,你正在學(xué)習(xí)的是李笑來著作的《自學(xué)是門手藝》一書中的《入口》原文內(nèi)容如下:
入口
“速成”,對絕大多數(shù)人 [1] 來說,在絕大多數(shù)情況下,是不大可能的。
編程如此,自學(xué)編程更是如此。有時,遇到復(fù)雜度高一點的知識,連快速入門都不一定是很容易的事情。
所以,這一章的名稱,特意從 “ 入門 ” 改成了 “入口” —— 它的作用是給你 “指一個入口”,至于你能否從那個入口進去,是你自己的事了……
不過,有一點不一樣的地方,我給你指出的入口,跟別的編程入門書籍不一樣 —— 它們幾乎無一例外都是從一個 “Hello World!” 程序開始的…… 而我們呢?
讓我們從認識一個人開始罷……
喬治?布爾
1833 年,一個 18 歲的英國小伙腦子里閃過一個念頭:
邏輯關(guān)系應(yīng)該能用符號表示。
這個小伙子叫喬治?布爾(George Boole,其實之前就提到過我的這位偶像),于 1815 年出生于距離倫敦北部 120 英里之外的一個小鎮(zhèn),林肯。父親是位對科學(xué)和數(shù)學(xué)有著濃厚興趣的鞋匠。喬治?布爾在父親的影響下,靠閱讀自學(xué)成才。14 歲的時候就在林肯小鎮(zhèn)名聲大噪,因為他翻譯了一首希臘語的詩歌并發(fā)表在本地的報紙上。
到了 16 歲的時候,他被本地一所學(xué)校聘為教師,那時候他已經(jīng)在閱讀微積分書籍。19 歲的時候布爾創(chuàng)業(yè)了 —— 他辦了一所小學(xué),自任校長兼教師。23 歲,他開始發(fā)表數(shù)學(xué)方面的論文。他發(fā)明了 “操作演算”,即,通過操作符號來研究微積分。他曾經(jīng)考慮過去劍橋讀大學(xué),但后來放棄了,因為為了入學(xué)他必須放下自己的研究,還得去參加標準本科生課程。這對一個長期只靠自學(xué)成長的人來說,實在是太無法忍受了。
1847 年,喬治 32 歲,出版了他人生的第一本書籍,THE MATHEMATICAL ANALYSIS OF LOGIC —— 18 歲那年的閃念終于成型。這本書很短,只有 86 頁,但最終它竟然成了人類的瑰寶。在書里,喬治?布爾很好地解釋了如何使用代數(shù)形式表達邏輯思想。
1849 年,喬治?布爾 34 歲,被當年剛剛成立的女皇學(xué)院(Queen's College)聘請為第一位數(shù)學(xué)教授。隨后他開始寫那本最著名的書,AN INVESTIGATION OF THE LAWS OF THOUGHT。他在前言里寫到:
“The design of the following treatise is to investigate the fundamental laws of those operations of the mind by which reasoning is performed; to give expression to them in the symbolical language of a Calculus, and upon this foundation to establish the science of Logic and construct its method; …”
“本書論述的是,探索心智推理的基本規(guī)律;用微積分的符號語言進行表達,并在此基礎(chǔ)上建立邏輯和構(gòu)建方法的科學(xué)…… ”
在大學(xué)任職期間,喬治?布爾寫了兩本教科書,一本講微分方程,另外一本講差分方程,而前者,A TREATISE ON DIFFERENTIAL EQUATIONS,直到今天,依然難以超越。
喬治?布爾于 1864 年因肺炎去世。
喬治?布爾在世的時候,人們并未對他的布爾代數(shù)產(chǎn)生什么興趣。直到 70 年后,克勞德?香農(nóng)(Claude Elwood Shannon)發(fā)表那篇著名論文,A SYMBOLIC ANALYSIS OF RELAY AND switchING CIRCUITS 之后,布爾代數(shù)才算是開始被大規(guī)模應(yīng)用到實處。
有本書可以閑暇時間翻翻,The Logician and the Engineer: How George Boole and Claude Shannon Created the Information Age??梢哉f,沒有喬治?布爾的布爾代數(shù),沒有克勞德?香農(nóng)的邏輯電路,就沒有后來的計算機,就沒有后來的互聯(lián)網(wǎng),就沒有今天的信息時代 —— 世界將會怎樣?
2015 年,喬治?布爾誕辰 200 周年,google 設(shè)計了 專門的 Logo 紀念這位為人類作出巨大貢獻的自學(xué)奇才。
Google Doodle 的寄語是這樣的:
A very hAPPy 11001000th birthday to genius George Boole!
布爾運算
從定義上來看,所謂程序(Programs)其實一點都不神秘。
因為程序這個東西,不過是按照一定 順序 完成任務(wù)的流程(Procedures)。根據(jù)定義,日常生活中你做盤蛋炒飯給自己吃,也是完成了一個 “做蛋炒飯” 的程序 —— 你按部就班完成了一系列的步驟,最終做好了一碗蛋炒飯給自己吃 —— 從這個角度望過去,所有的菜譜都是程序……
只不過,菜譜這種程序,編寫者是人,執(zhí)行者還是人;而我們即將要學(xué)會寫的程序,編寫者是人,執(zhí)行者是計算機 —— 當然,菜譜用自然語言編寫,計算機程序由程序員用編程語言編寫。
然而,這些都不是最重要的差異 —— 最重要的差異在于計算機能做布爾運算(Boolean Operations)。
于是,一旦代碼編寫好之后,計算機在執(zhí)行的過程中,除了可以 “ 按照順序執(zhí)行任務(wù) ” 之外,還可以 “根據(jù)不同情況執(zhí)行不同的任務(wù)”,比如,“如果條件尚未滿足則重復(fù)執(zhí)行某一任務(wù)”。
計算器和計算機都是電子設(shè)備,但計算機更為強大的原因,用通俗的說法就是它 “可編程”(Programable)—— 而所謂可編程的核心就是布爾運算及其相應(yīng)的流程控制(Control Flow);沒有布爾運算能力就沒有辦法做流程控制;沒有流程控制就只能 “按順序執(zhí)行”,那就顯得 “很不智能” ……
布爾值
在 python 語言中,布爾值(Boolean Value)用 True
和 False
來表示。
注意:請小心區(qū)分大小寫 —— 因為 Python 解釋器是對大小寫敏感的,對它來說,True
和 true
不是一回事。
任何一個邏輯表達式都會返回一個布爾值。
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_Node_interactivity = "all"
# 請暫時忽略以上兩行……
1 == 2
1 != 2
False
True
1 == 2
,用自然語言描述就是 “_1 等于 2 嗎?_” —— 它的布爾值當然是 False
。
1 != 2
,用自然語言描述就是 “_1 不等于 2 嗎?_” —— 它的布爾值當然是 True
。
注意:自然語言中的 “等于”,在 Python 編程語言中,使用的符號是 ==
,不是一個等號!
請再次注意:單個等號 =
,有其他的用處。初學(xué)者最不適應(yīng)的就是,在編程語言里所使用的操作符,與他們之前在其他地方已經(jīng)習(xí)慣了的使用方法并不相同 —— 不過,適應(yīng)一段時間就好了。
邏輯操作符
Python 語言中的邏輯操作符(Logical Operators)如下表所示 —— 為了理解方便,也可以將其稱為 “比較操作符”。
比較操作符意義示例布爾值
==等于1 == 2False
!=不等于1 != 2True
>大于1 > 2False
>=大于等于1 >= 1True
<小于1 < 2True
<=小于等于1 <= 2True
in屬于'a' in 'basic'True
除了等于、大于、小于之外,Python 還有一個邏輯操作符,in
:
這個表達式 'a' in 'basic'
用自然語言描述就是:
布爾運算操作符
以上的例子中,邏輯操作符的運算對象(Operands)是數(shù)字值和字符串值。
而針對布爾值進行運算的操作符很簡單,只有三種:與、或、非:
分別用
and
、or
、not
表示
注意:它們?nèi)渴切?。因為布爾值只有兩個,所以布爾運算結(jié)果只有幾種而已,如下圖所示:
先別管以下代碼中 print()
這個函數(shù)的工作原理,現(xiàn)在只需要關(guān)注其中布爾運算的結(jié)果:
print('(True and False) yields:', True and False)
print('(True and True) yields:', True and True)
print('(False and True) yields:', False and True)
print('(True or False) yields:', True or False)
print('(False or True) yields:', False or True)
print('(False or False) yields:', False or False)
print('(not True) yields:', not True)
print('(not False) yields:', not False)
(True and False) yields: False
(True and True) yields: True
(False and True) yields: False
(True or False) yields: True
(False or True) yields: True
(False or False) yields: False
(not True) yields: False
(not False) yields: True
千萬不要誤以為布爾運算是 理科生 才必須會、才能用得上的東西…… 文理藝分科是中國的特殊分類方式,真挺害人的。比如,設(shè)計師們在計算機上創(chuàng)作圖像的時候,也要頻繁使用或與非的布爾運算操作才能完成各種圖案的拼接…… 抽空看看這個網(wǎng)頁:Boolean Operations used by Sketch App —— 這類設(shè)計軟件,到最后是每個人都用得上的東西呢。另,難道藝術(shù)生不需要學(xué)習(xí)文科或者理科? —— 事實上,他們也有文化課……
知識點:布爾運算
練習(xí)題:
流程控制
有了布爾運算能力之后,才有 根據(jù)情況決定流程 的所謂流程控制(Control Flow)的能力。
import random
r = random.randrange(1, 1000)
# 請暫時忽略以上兩句的原理,只需要了解其結(jié)果:
# 引入隨機數(shù),而后,每次執(zhí)行的時候,r 的值不同
if r % 2 == 0:
print(r, 'is even.')
else:
print(r, 'is odd.')
693 is odd.
你可以多執(zhí)行幾次以上程序,看看每次不同的執(zhí)行結(jié)果。執(zhí)行方法是,選中上面的 Cell 之后按快捷鍵 shift + enter
。
現(xiàn)在看代碼,先忽略其它的部分,只看關(guān)鍵部分:
...
if r % 2 == 0:
...
else:
...
這個 if/else
語句,完成了流程的分支功能。%
是計算余數(shù)的符號,如果 r
除以 2
的余數(shù)等于 0
,那么它就是偶數(shù),否則,它就是奇數(shù) —— 寫成布爾表達式,就是 r % 2 == 0
。
這一次,你看到了單個等號 =
:r = random.randrange(1, 1000)
。
這個符號在絕大多數(shù)編程語言中都是 “賦值”(Assignment)的含義。
在 r = 2
之中,r
是一個名稱為 r
的變量(Variable)—— 現(xiàn)在只需要將變量理解為程序保存數(shù)值的地方;而 =
是賦值符號,2
是一個整數(shù)常量(Literal)。
語句 r = 2
用自然語言描述就是:
“把
2
這個值保存到名稱為r
的變量之中”。
現(xiàn)在先別在意頭兩行代碼的工作原理,只關(guān)注它的工作結(jié)果:random.randrange(1, 1000)
這部分代碼的作用是返回一個 _1 到 1000 之間_(含左側(cè) 1
但不含右側(cè) 1000
)的隨機整數(shù)。每次執(zhí)行以上的程序,它就生成一個新的隨機整數(shù),然后因為 =
的存在,這個數(shù)就被保存到 r
這個變量之中。
計算機程序的所謂 “智能”(起碼相對于計算器),首先是因為它能做 布爾運算 。計算機的另外一個好處是 “不知疲倦”(反正它也不用自己交電費),所以,它最擅長處理的就是 “重復(fù)”,這個詞在程序語言中,術(shù)語是循環(huán)(Loop)。以下程序會打印出 10
以內(nèi)的所有奇數(shù):
for i in range(10):
if i % 2 != 0:
print(i)
1
3
5
7
9
其中 range(10)
的返回值,是 0 \~ 9
的整數(shù)序列(默認起始值是 0
;含左側(cè) 0
,不含右側(cè) 10
)。
用自然語言描述以上的程序,大概是這樣的 —— 自然語言寫在 #
之后:
for i in range(10): # 對于 0 \~ 9 中的所有數(shù)字都帶入 i 這個變量,執(zhí)行一遍以下任務(wù):
if i % 2 != 0: # 如果 i 除以 2 的余數(shù)不等于零的話,執(zhí)行下面的語句:
print(i) # 向屏幕輸出 i 這個變量中所保存的值
就算你讓它打印出一百億以內(nèi)的奇數(shù),它也毫不含糊 —— 你只需要在 range()
這個函數(shù)的括號里寫上一個那么大的整數(shù)就行……
讓它干一點稍微復(fù)雜的事吧,比如,我們想要打印出 100
以內(nèi)所有的 質(zhì)數(shù) (Primes)。
根據(jù)質(zhì)數(shù)的定義,它大于等于 2
,且只有在被它自身或者 1
做為除數(shù)時余數(shù)為 0
。判斷一個數(shù)字是否是質(zhì)數(shù)的算法是這樣的:
- 設(shè)
n
為整數(shù),n >= 2
;- 若
n == 2
,n
是質(zhì)數(shù);- 若
n > 2
,就把n
作為被除數(shù),從2
開始一直到n - 1
都作為除數(shù),逐一計算看看余數(shù)是否等于0
?
- 如果是,那就不用接著算了,它不是質(zhì)數(shù);
- 如果全部都試過了,余數(shù)都不是
0
,那么它是質(zhì)數(shù)。
于是,你需要兩個嵌套的循環(huán),第一個是負責(zé)讓被除數(shù) n
從 2
遍歷(就是依次經(jīng)歷一次)到 99
(題目是 100
以內(nèi),所以不包含 100
)的循環(huán),第二個是在前者內(nèi)部負責(zé)讓除數(shù) i
從 2
遍歷到 n - 1
的循環(huán):
for n in range(2, 100): #range(2,100) 表示含左側(cè) 2,不含右側(cè) 100,是不是第三次看到這個說法了?
if n == 2:
print(n)
continue
for i in range(2, n):
if (n % i) == 0:
break
else: # 這里目前你可能看不懂…… 但先關(guān)注結(jié)果吧。
print(n)
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
所謂算法
以上的算法可以改進(程序員們經(jīng)常用的詞匯是 “優(yōu)化”):
從 2 作為除數(shù)開始試,試到 根號n 之后的一個整數(shù)就可以了……
for n in range(2, 100):
if n == 2:
print(n)
continue
for i in range(2, int(n ** 0.5)+1): #為什么要 +1 以后再說…… n 的 1/2 次方,相當于根號 n。
if (n % i) == 0:
break
else:
print(n)
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
你看,尋找更有效的算法,或者說,不斷優(yōu)化程序,提高效率,最終是程序員的工作,不是編程語言本身的工作。關(guān)于判斷質(zhì)數(shù)最快的算法,可以看 Stackoverflow 上的討論,有更多時間也可以翻翻 Wikipedia。
到最后,所有的工具都一樣,效用取決于使用它的人。所以,學(xué)會使用工具固然重要,更為重要的是與此同時自己的能力必須不斷提高。
雖然寫代碼這事剛開始學(xué)起來好像門檻很高,那只不過是幻覺,其實門檻比它更高的多的去了。到最后,它就是個最基礎(chǔ)的工具,還是得靠思考能力 —— 這就好像識字其實挺難的 —— 小學(xué)初中高中加起來十來年,我們才掌握了基本的閱讀能力;可最終,即便是本科畢業(yè)、研究生畢業(yè),真的能寫出一手好文章的人還是少之又少一樣 —— 因為用文字值得寫出來的是思想,用代碼值得寫出來的是創(chuàng)造,或者起碼是有意義的問題的有效解決方案。有思想,能解決問題,是另外一門手藝 —— 需要終生精進的手藝。
所謂函數(shù)
我們已經(jīng)反復(fù)見過 print()
這個函數(shù)(Functions)了。它的作用很簡單,就是把傳遞給它的值輸出到屏幕上 —— 當然,事實上它的使用細節(jié)也很多,以后慢慢講。
現(xiàn)在,最重要的是初步理解一個函數(shù)的基本構(gòu)成。關(guān)于函數(shù),相關(guān)的概念有:函數(shù)名(Function Name)、參數(shù)(Parameters)、返回值(return Value)、調(diào)用(Call)。
拿一個更為簡單的函數(shù)作為例子,abs()
。它的作用很簡單:接收一個數(shù)字作為參數(shù),經(jīng)過運算,返回該數(shù)字的絕對值。
a = abs(-3.1415926)
a
3.1415926
在以上的代碼的第 1 行中,
- 我們調(diào)用了一個函數(shù)名為
abs
的函數(shù);寫法是abs(-3.1415926)
;- 這么寫,就相當于向它傳遞了一個參數(shù),其值為:
-3.1415926
;- 該函數(shù)接收到這個參數(shù)之后,根據(jù)這個參數(shù)的值在函數(shù)內(nèi)部進行了運算;
- 而后該函數(shù)返回了一個值,返回值為之前接收到的參數(shù)的值的絕對值
3.1415926
;- 而后這個值被保存到變量
a
之中。
從結(jié)構(gòu)上來看,每個函數(shù)都是一個完整的程序,因為一個程序,核心構(gòu)成部分就是 輸入 、處理、輸出:
- 它有輸入 —— 即,它能接收外部通過參數(shù)傳遞的值;
- 它有處理 —— 即,內(nèi)部有能夠完成某一特定任務(wù)的代碼;尤其是,它可以根據(jù) “輸入” 得到 “輸出”;
- 它有輸出 —— 即,它能向外部輸送返回值……
被調(diào)用的函數(shù),也可以被理解為子程序(sub-Program)—— 主程序執(zhí)行到函數(shù)調(diào)用時,就開始執(zhí)行實現(xiàn)函數(shù)的那些代碼,而后再返回主程序……
我們可以把判斷一個數(shù)字是否是質(zhì)數(shù)的過程,寫成函數(shù),以便將來在多處用得著的時候,隨時可以調(diào)用它:
def is_prime(n): # 定義 is_prime(),接收一個參數(shù)
if n < 2: # 開始使用接收到的那個參數(shù)(值)開始計算……
return False # 不再是返回給人,而是返回給調(diào)用它的代碼……
if n == 2:
return True
for m in range(2, int(n**0.5)+1):
if (n % m) == 0:
return False
else:
return True
for i in range(80, 110):
if is_prime(i): # 調(diào)用 is_prime() 函數(shù),
print(i) # 如果返回值為 True,則向屏幕輸出 i
83
89
97
101
103
107
109
細節(jié)補充
語句
一個完整的程序,由一個或者多個語句(Statements)構(gòu)成。通常情況下,建議每一行只寫一條語句。
for i in range(10):
if i % 2 != 0:
print(i)
1
3
5
7
9
語句塊
在 Python 語言中,行首空白(Leading whitespace,由空格 ' '
或者 Tab?
構(gòu)成)有著特殊的含義。
如果有行首空白存在,那么,Python 將認為這一行與其他鄰近有著相同行首空白的語句同屬于一個語句塊 —— 而一個語句塊必然由一個行末帶有冒號 :
的語句起始。同屬于一個語句塊中的語句,行首空白數(shù)量應(yīng)該相等。這看起來很麻煩,可實際上,程序員一般都使用專門的文本編輯器,比如 visual studio code,其中有很多的輔助工具,可以讓你很方便地輸入具備一致性的行首空白。
以上程序,一共三個語句,兩個語句塊,一個 for
循環(huán) 語句塊 中包含著一個 if
條件語句塊。注意第一行和第二行末尾的冒號 :
。
在很多其他的語言中,比如,javascript,用大括號 {}
作為語句塊標示 —— 這是 Python 比較特殊的地方,它組織語句塊的方式如下圖所示:
注意:在同一個文件里,不建議混合使用 Tab 和 Space;要么全用空格,要么全用制表符。
注釋
在 Python 程序中可以用 #
符號標示注釋語句。
所謂的注釋語句,就是程序文件里寫給人看而不是寫給計算機看的部分。本節(jié)中的代碼里就帶著很多的注釋。
人寫的 Python 語言代碼,要被 Python 解釋器翻譯成機器語言,而后才能讓計算機 “讀懂”,隨后計算機才可以按照指令執(zhí)行。解釋器在編譯程序的過程中,遇到 #
符號,就會忽略其后的部分(包括這個注釋符號)。
操作符
在本節(jié),我們見到的比較操作符可以比較它左右的值,而后返回一個布爾值。
我們也見過兩個整數(shù)被操作符%
連接,左側(cè)作為被除數(shù),右側(cè)作為除數(shù),11% 3
這個表達式的值是 2
。對于數(shù)字,我們可用的操作符有 +
、-
、*
、/
、//
、%
、**
—— 它們分別代表加、減、乘、除、商、余、冪。
賦值符號與操作符的連用
你已經(jīng)知道變量是什么了,也已經(jīng)知道賦值是什么了。于是,你看到 x = 1
就明白了,這是為 x
賦值,把 1
這個值保存到變量 x
之中去。
但是,若是你看到 x += 1
,就迷惑了,這是什么意思呢?
這只是編程語言中的一種慣用法。它相當于 x = x + 1
。
看到 x = x + 1
依然會困惑…… 之所以困惑,是因為你還沒有習(xí)慣把單等號 =
當作賦值符號,把雙等號 ==
當作邏輯判斷的 “等于”。
x = x + 1
的意思是說,把表達式 x + 1
的值保存到變量 x
中去 —— 如此這般之后,x
這個變量中所保存的就不再是原來的值了……
x = 0
x += 1
print(x)
1
其實不難理解,只要習(xí)慣了就好。理論上,加減乘除商余冪這些操作符,都可以與賦值符號并用。
x = 11
x %= 3 # x = x % 3
print(x)
2
總結(jié)
以下是這一章中所提到的重要概念。了解它們以及它們之間的關(guān)系,是進行下一步的基礎(chǔ)。
- 數(shù)據(jù):整數(shù)、布爾值;操作符;變量、賦值;表達式
- 函數(shù)、子程序、參數(shù)、返回值、調(diào)用
- 流程控制、分支、循環(huán)
- 算法、優(yōu)化
- 程序:語句、注釋、語句塊
- 輸入、處理、輸出
- 解釋器
你可能已經(jīng)注意到了,這一章的小節(jié)名稱羅列出來的話,看起來像是一本編程書籍的目錄 —— 只不過是概念講解順序不同而已。事實上還真的就是那么回事。
這些概念,基本上都是獨立于某一種編程語言的(Language Independent),無論將來你學(xué)習(xí)哪一種編程語言,不管是 C++,還是 javaScript,抑或是 Golang,這些概念都在那里。
學(xué)會一門編程語言之后,再學(xué)其它的就會容易很多 —— 而且,當你學(xué)會了其中一個之后,早晚你會順手學(xué)其它的,為了更高效使用微軟辦公套件,你可能會花上一兩天時間研究一下 VBA;為了給自己做個網(wǎng)頁什么的,你會順手學(xué)會 JavaScript;為了修改某個編輯器插件,你發(fā)現(xiàn)人家是用 Ruby 寫的,大致讀讀官方文檔,你就可以下手用 Ruby 語言了;為了搞搞數(shù)據(jù)可視化,你會發(fā)現(xiàn)不學(xué)會 R 語言有點不方便……
你把這些概念裝在腦子里,而后就會發(fā)現(xiàn)幾乎所有的編程入門教學(xué)書籍結(jié)構(gòu)都差不多是由這些概念構(gòu)成的。因為,所有的編程語言基礎(chǔ)都一樣,所有的編程語言都是我們指揮計算機的工具。無論怎樣,反正都需要輸入輸出,無論什么語言,不可能沒有布爾運算,不可能沒有流程控制,不可能沒有函數(shù),只要是高級語言,就都需要編譯器…… 所以,掌握這些基本概念,是將來持續(xù)學(xué)習(xí)的基礎(chǔ)。
腳注
[1]:對于自學(xué)能力強、有很多自學(xué)經(jīng)驗的人來說,速成往往真的是可能、可行的。因為他們已經(jīng)積累的知識與經(jīng)驗會在習(xí)得新技能時發(fā)揮巨大的作用,乃至于他們看起來相對別人花極少的時間就能完成整個自學(xué)任務(wù)。也就是說,將來的那個已經(jīng)習(xí)得自學(xué)能力、且自學(xué)能力已經(jīng)磨練得很強的你,常常真的可以做到在別人眼里 “速成”。
本文地址:http://003188.cn/zixueshimenshouyirukou.html
阿里云虛擬主機1G空間,120元一年
香港、美國虛擬主機100元一年,1000元永久
騰訊云雙十一0.4折起,2核8G5M三年僅700元,2核4G8M三年僅198元
猜你喜歡