學習 Python 很吃力,我是不是可以放棄編程了?

題主從來沒有接觸過編程,現在在學習Python。簡單的格式化符號「%」我用了接近1個小時來理解。後來做練習也是反覆出錯,只能看別人的代碼來嘗試搞明白符號位置問題和 print 函數中的印表機制。 請大家表達一下看法,如此簡單的一個問題,而我用了很長時間理解,還犯錯。我是不是真的不適合編程? 我不是來尋求安慰或者比慘的,謝謝大家!

==========:)========

提主在這裡就不一個個謝大家了, 感謝大家的回復,其實問完這個問題後,我又奮不顧身的跳入坑中去了,我向來自卑總是懷疑自己,性格關係, 還有,我不會放棄的,謝謝大家.


其實吧,

你也沒不能接受別人一分鐘能賺你一輩子的錢吧…

比爾蓋茨動動手指就有一套房子,你不是也沒覺得有什麼不對嗎?

那你為什麼不能接受有人一分鐘能學你一輩子的知識…

別人用一分鐘學你一個小時的事情,不也沒什麼不對嗎?

能接受了就好辦了,別人學多快(自己學多慢),關你鳥事。

學習是為了把自己變得厲害,

不是為了把自己變得比別人厲害。

因為不管你學不學,總有無數人永遠比你厲害,也有無數人永遠沒你厲害。

但如果你不學,你就永遠不會變得更厲害。


果然學編程也是要看歷史的進程。我剛開始學習的時候,互聯網泡沫剛破,行業一片鬼哭狼嚎,程序員工資又低,又找不到工作,ADSL都還沒普及,也沒有什麼培訓班,學習還得泡書店。結果幾年下來心無雜念,從來沒打算以後能靠編程幹什麼,就跟彈鋼琴打籃球一樣,自己覺得說不定哪天不高興就算了呢。沒想到後來居然走了狗屎運(逃

反觀你們現在這些初學者,明明已經這麼方便了,要是肯跟我當初一樣繼續心無雜念的學習,造詣肯定會更高的。失敗怕什麼,大不了10年後放棄唄。


做事就是困難的, 要認識到這點

而且其實你很幸福了, 至少知道自己應該學什麼, 很多人連學什麼都不知道

你的問題也算是普遍問題了, 主要原因在於:

  1. 編程是全新的領域, 過往積累的人生經驗不適用, 相當於成年外國人學用筷子, 困難可想而知
  2. 在學習新東西的時候仍然使用老的認知手段/方法, 但是老體系不夠好
  3. 教材不夠好, 沒有用通俗易懂的例子給你講解概念 (重要的是例子, 人是會自己根據例子總結規律的)
  4. 資料太老, 格式化字元串這種事情, 早就不應該用 % 了, 至少應該用 str.format 函數

舉個例子, 格式化字元串你看下面的例子, 我什麼都不和你說, 你都能自己看懂

print("from {} to {} at {}".format(1, 3, "earth"))
# 輸出結果如下
# from 1 to 3 at earth

所以會有很多人學得很慢很難很痛苦也是很正常的

我給你一台鋼琴, 隨手丟一本不知道誰寫的鋼琴入門, 你一樣快不了(當然也好不了....)


學任何東西,入門的時候,先慢後快是很正常的,你看小學生加減乘除就得學3年。


從0到1,是最艱難吃力的一步。

我15年的時候,在其它論壇發過一篇帖子,也是零基礎開始學Python的。閱讀量挺高的。

希望對題主有幫助。

原文地址是 Python+flask+SQLAlchemy 半年自學~跳槽成功~ (排版比知乎好。

使用前說明:

本人大學專業是CS,大學的時候編程很差,畢業後並沒有做程序開發的工作,但是大學聽課很認真(拿了獎學金和一些其他名譽),所以各種語言的語法基礎還有其他CS必修課還是有點印象的。半年前才第一次接觸python,然後打開了新世界的大門。

前不久去找工作,很高興拿到了幾個offer ,已經選擇了自己超超超超級喜歡的一個,剛吃完酸菜魚,心情比較好,決定分享一下自己的學習經驗和路線,希望對其他人也有所幫助。

不過因為本人還比較菜,所以要為加入新公司做各種功課,以免自己開車太慢導致後面塞車。所以時間不多,這個帖子的內容會比較粗略梗概。如果大家有什麼問題,我會盡量回答,但是不保證自己有空和有能力可以解答。僅供參考(對,這就是免責申明:D

下面是正文:

總體路線: Python+Pygame+Flask+SQLAlchemy

主要書籍:

1.笨方法學Python (電子版)

2.Python 核心編程(電子版)

3. Python基礎教程(紙質版)

4. FlaskWeb開發:基於Python的Web應用開發實戰(電子版)

主要的參考網站:

1. Assignments — Problem Solving with Algorithms and Data Structures
http://interactivepython.org/runestone/static/pythonds/index.html666

2. SQLite – Python | w3cschool菜鳥教程
http://www.w3cschool.cc/sqlite/sqlite-python.html631

3. Python / Python 編碼風格指南中譯版(Google SOC) | Elias的個人主頁
http://www.elias.cn/Python/PythonStyleGuide?from=Develop.PythonStyleGuide#toc32321

4.Python 的神奇方法指南 - 開源中國社區
http://www.oschina.net/question/253614_115412470

4.用Python和Pygame寫遊戲-從入門到精通(目錄) | 目光博客
http://eyehere.net/2011/python-pygame-novice-professional-index/414

5.歡迎進入Flask大型教程項目! — flask mega-tutorial 1.0 documentation
http://www.pythondoc.com/flask-mega-tutorial/724

6.歡迎使用 Flask — Flask 0.10.1 documentation
http://www.pythondoc.com/flask/372

7.擴展包來源: http://www.lfd.uci.edu/~gohlke/pythonlibs/60 http://www.pythontip.com/winpy_libs43

8.其他: 25本免費的Python電子書 - 博客 - 伯樂在線
http://blog.jobbole.com/29281/863

9.9本免費的Python編程書 - 博客 - 伯樂在線
http://blog.jobbole.com/765/392

本人的github: https://github.com/dodoru

可以看到我的很多練習代碼還有我fork 來學習的代碼。 很多地方有瑕疵,大家看看了解我當時的學習進度和水平就好,(?﹏?),憑良心說,我的代碼不是很好,所以並不是用來模仿學習的好對象。

學習安排

註:本人是業餘時間,一般晚上8:00 - 12:00 和周末學習代碼的,經常會有一些其他雜事,所以只能擔保每天至少兩小時,大家可按照自己的鹹魚時間加快速度。

第一個月: 基礎篇 (3.12 - 4.12)

https://github.com/dodoru/learn_in_python1.1K

第一周:安裝python2.7 ,利用笨方法學python 練習基本語法

第二周:被推薦使用pycharm, 超級好用,強烈推薦,本人在默認設置里把製表符Tab 改成了四個空格;然後訓練寫了堆棧

第三周:訓練基本的數據結構,自己寫鏈表和隊列

第四周:繼續把笨方法學python 差不多敲完

第二個月:加強篇 (4.12 - 5.12 )

第一周:因為記憶力比較差的緣故,我又重寫了一次基本的堆棧隊列和鏈表。

第二周:看python 核心編程《基礎篇》。

第三周:繼續看python 核心編程《基礎篇》,簡單寫斗獸棋的程序(失敗)。

第四周:繼續看python 核心編程《基礎篇》,繼續修改斗獸棋(失敗),掉頭寫五子棋,開始接觸pygame。

註:接下來5/6月,因為在崗工作(計算機相關工作,但不是編程開發)很忙,所以沒有很多時間寫代碼,進度會偏慢.這期間學習的pygame 是為了鍛煉基本的編程技能,還有培養自己對python 編程的樂趣。 如果你本省具有比較好的編程基礎也對編程早早具有強烈的愛好,可以跳過兩個月的pygame.

第三個月: Pygame A (5.12 - 6.12)
https://github.com/dodoru/LearnPygame125

第一周:繼續寫五子棋,然後開始用pygame 開始寫打磚塊 breakblock。

第二周:繼續寫打磚塊,為了存儲遊戲的數據信息,中途學了一點點json。

第三周:寫好打磚塊,獲得成就感。電力效果 MAX。

第四周:抄別人的Pygame 音樂播放器,失敗。因為別人的音樂播放器中 含有manage.py 暫時無法理解。所以跳過去了。

第四個月:Pygame B + Flask (初步) (6.12-7.12)

第一周: 抄別人的飛機大戰,學會使用音樂各種創造遊戲效果(然並卵,只能培養樂趣)。 學習一點點turtle 用來畫圖(https://docs.python.org/2/library/turtle.html) (然並卵,只能培養樂趣)。

第二周:還在抄別人的pygame 代碼(然並卵,所以被朋友責罵了,畢竟我學習python的目標還是要出去找工作的,而不是用來自娛自樂的。不過這個時候,我已經開始對python 情根深種了)。

第三周: 開始看Flask 的那本薄薄的書,第一天快速瀏覽書的目錄結構,第二天開始往後看,然後到了模板引擎那裡死掉了。

第四周:又看了一次Flask 的書,還是到了第四章就死掉。跑去看python核心編程《高級篇》前半部,我得靜靜心,因為半個月毫無進展很挫敗;

註:至此,學習python 遇到了最大的挫敗感,我看一本書,來去看,每個字都能看懂,但是蓋了書,我還是什麼都不懂。甚至對著書本抄代碼,運行起來也不對,僅僅因為我沒有理解 templates 這個默認路徑辨別的 文件夾是什麼意思。我簡直要瘋掉了!!!想死的心都有了。不過接下來的兩個月超級充實。大家要有被艹( ▼-▼ )的心理準備。

第五個月:Flask (7.12-8.12)

https://github.com/dodoru/learn_in_python1.1K

第一周:對著FLask 中文學習網站從頭到尾敲,不懂就看第三第四次查資料問人厚著臉皮求幫助。然後順便學習了一點http 協議 和 get post ,socket等基本網路編程知識。

第二周:突然開竅,繼續對著Flask 的中文學習網站敲,一直敲到了能夠用txt作為簡單存儲文件來設計網站。

第三周:把txt 改為 sqlite3, 熟悉SQL語句,初步學習SQLAlchemy

第四周:學習cookie 和 session 等

第六個月:Flask+SQLAlchemy (8.12-9.12)

第一周: 練習 SQLAlchemy (https://github.com/dodoru/flask_todo),開始修改原來用sqlite3 存儲數據的demo網站;

第二周:利用flask-mail 增加發送用戶密碼的功能,網站功能基本OK,打包成Lilium(https://github.com/dodoru/Lilium),繼續狂砍書,學會blueprint。

第三周:繼續狂看書,然後抄他們的大型博客(修改未完成)。然後寫簡歷。

第四周:找工作。
---over---

劇場時間:

9月1日開始找工作,挑了8家看著很喜歡的公司投遞簡歷,拿到五個面試通知,剛好堆積在三天內,9月5日專門請假去面試(單程7個小時,自費,我本來以為會沒人要我的,所以第一輪是試水),結果沒想到,基本上都很順利,同一天拿到了三個口頭offer,雖然不是特別好(畢竟不是特別厲害),但是也是可以在一線城市勉強活下來了。

然後回來等email offer , 心裡很開心也有一定的糾結 ,沒等到,有點怕,又投了幾個簡歷。
然後碰到了我超超超超級喜歡的一個創業公司,在電話面試和機試通過後讓我過去,臨去之前查看公司背景資料(現在還在後悔),被嚇到了,結果就一直抖(到了現在還在抖),腦袋一片空白。也不知道自己回答了什麼,所有的腦細胞都變成離散的顆粒,完全無法啟動,所以很混亂。但是技術負責人超級nice 還是給了我一個offer ,(可以足夠讓我在那個城市裡活下去了) , 當天回家路上我發獃了三個小時後又哭又笑又失眠又早醒,簡直要瘋了,所以第二天早上矜持不到四個小時,就接受了。

下午又有收到一個電話offer :D 不過當場毫無負擔地拒絕掉了,然後兩天後,開始主動回復那些給我郵件offer 和口頭offer 的公司,免得互相耽誤,聽說口頭offer 如果不回復也可以,但是我總覺得如果不回復就流程變成殭屍進程,心理不舒服,回復完之後,直接結束進程特別舒爽。

之後到現在還是在做夢的狀態,現在在學 js 和 jquery 還有 scrapy. :

最後
能夠在半年內快速學習python+flask+SQLAlchemy 僅僅靠個人閉門造車是不可能的。
用腳趾頭都能猜出我肯定有搜索各種資料和問題,潛水在幾個技術群和博客里默默圍觀的。
為了避免被人肉,就不自爆技術群了。這是我在知乎的回答,是講怎麼向大牛們請教問題的:

如何向領域內的大牛求助,有什麼注意事項?
我覺得最重要是態度,動機,坦誠,水平。
求學的態度要好,厚臉皮,人家幫你是善良,不理你是正常,所以願意指點就應該感恩了。
動機要純良,不要惡意滿滿,不要故意挖坑給對方跳,不要利用小聰明或者咬文嚼字故意曲解對方的話語作為把柄。基本上,大牛門見多識廣,大多會判定對方是有心向學還是故意找茬,偶爾發生誤判也是為了自我保護。
坦誠大概是我身上為數不多的閃光點,自己是怎麼想的,是不是真的懂,有沒有學過,有沒有接觸過,做過哪些嘗試和推論,前因後果,如果對方問,就坦誠地說。絕對不要不懂裝懂。
水平就是問之前至少搜一搜看看有沒有類似的問題,就我來說,大部分遇到的問題都不是我一個人的問題。所以問之前,先搜索看看別人怎麼說的,如果不理解或者找不到合理的解釋,就可以發問了。
http://www.zhihu.com/question/35661919/answer/64048242900

祝我幸福快樂,早成小牛,請保佑我:D
the same to you.

——————————2015年9月————————————

有很長一段時間,我看到這篇文章,會很難受。

我當時對小牛的標準是很低的,那時候我在井底,覺得跳出去井口,就成為小牛。結果,當我跳出井口,發現世界沒有我想像那麼美好,我在這世界叢林中又太卑微。

現在,我沒有幸福快樂。

但是,對過去感到自豪羞愧難受唯獨不後悔。

—————————— 2017年6月 ————————————


Never Say Never.

相反,我喜歡這種吃力的感覺。

至少吃力之後,我能明白這個%到底意味著什麼,我明白了yield是什麼,我明白了asyncio是什麼,我還用了一周的時間來理解threading並且我做到了,吃力是進步的源泉。

為什麼會喜歡吃力的感覺?因為我覺得所有人都和我一樣,我智商也不低,我吃力他一定也吃力,而很多人在這個旅途中放棄了。但是我沒有,我做到了,那我就學習到了很多人不願意吃力去學習的東西。我一直堅信:想要成功就要做別人不想做的事情,所以我願意吃力。

當然,還有的人選擇不吃力,選擇複製粘貼代碼的方式來學會編程,恐怕你讓他在沒有網路的情況下寫一個生產者消費者他都無從下手。

那麼你願意做哪種人呢?


是。

但不是因為你學的不夠快,而是因為你剛遇到點困難就開始懷疑自己適不適合編程。

如果這種思維模式延續下去,每當遇到點困難,都這麼懷疑自己,你肯定干不長久。

我回想自己當初學編程的時候,從來沒有過這個想法。

……

評論中也有網友提到,遇到困難只會覺得有趣,非弄懂不可,這大抵就是興趣的力量。


1. 腦迴路的問題

我堂姐是清華博士生,她說對於編程,她完全沒有「sense」。

後來她自學ruby,一周後她就自己搭建博客了,

我問她為什麼學黑魔法都那麼快,

她說強迫自己多讀了一些之後,找到「sense」了。

什麼是「sense」??

愛因斯坦說,語言是思維的工具。

你的腦迴路使用任何新工具都需要時間來適應/磨合。

python雖然是個簡單的工具,但卻絕對不是自然語言的思維方式,

適應這種腦迴路是需要時間的。

舉個最簡單了例子:

穿越回過去,找那些歷史上最偉大的數學家,讓他們學編程

先從最基本的概念入手,

x = 1
x = x + 1

一巴掌就拍過來了,( ̄ε(# ̄)☆╰╮( ̄▽ ̄///)

數學家怎麼可能認可 x = x + 1這種表述形式的存在?!!

然後我就被當做異教徒抓起來了。

但是換一下表達方式

x0 = 1
x1 = x0 + 1

那些數學家在這個地方就完全沒有任何誤解,

但是,我們一開始就教給小盆友 x = x + 1的話,

告訴他們兩個x是不同時間點的,一個是原來的,一個是新的。

小盆友也同樣是完全沒有任何阻礙地接受了這種表述。

越是在自己的領域深入,自己的慣性思考越是難以轉變,

比如數學專業的人學OO編程很吃力,學FP編程反而很輕鬆。

題主說自己的情況很少,

不曉得你是哪種腦迴路的,

反正適應新的思維工具,總是需要時間的。

如果是文科生,推薦perl,詩人的語言(手動斜眼.jpg)

【說明】:

評論處的風向好像不對,我並沒有在黑perl的說,

比如用perl寫一個斐波那契的lazy的序列,難道不覺得很驚艷嗎?

my @fib = 1, 1, *+* ... *;
say @fib[^10]; # 結果 1 1 2 3 5 8 13 21 34 55

另外,perl的正則表達式,一直被追趕,從未被超越。還有,linux系統內置perl……

除了語法很像詩以外,全身上下沒有其他黑點。

當然,語法像寫詩也不是黑點,只能說不對大部分人胃口。

所以,這同樣只是個看個人「感覺」的問題,

說不定「電波對上」了,就get到其「靈魂」了。

2. python的問題

大家公認python入門簡單,

這些觀點,都是從實用性角度出發的,

-- 說Python容易入門,是因為,從入門到可以拿來幹活,這個過程比較快。

最能直觀感受到編程的「sense」東西,

或許是因人而異的。

我小學六年級,從別的同學那裡學到了如何搗騰魔獸爭霸的地圖編輯器,

通過「技能根據等級計算傷害」 了解了變數,

通過「召喚不可見單位出來釋放簡單魔法」 了解了函數調用,

(ps:在周圍召喚8個不可見的沒有碰撞體積的小精靈,對不同方向放衝擊波,模仿影魔的大招)

「sense」應該是從這裡中找到的,

我覺得我還算比較幸運。

不知道題主的具體年齡,

如果現階段不是特別需要實用性高的編程知識的話,

從遊戲編輯器入手,或許是個更好的選擇。

3. 選擇教材的問題

由於我是軟體專業的,教材都是老師選好的,並且有學業任務壓著,

而且,學不懂可以問老師,作業不懂可以抄同學的。

但是,從網上找教程自學就不一樣了,

如果是以前,出版物少,那麼我們能找到的,必然是傳世經典。

但是信息爆炸的年代,選擇很多,想找到高質量的內容就不那麼容易了。

例如:

網上JavaScript的教材非常多,但是很多都有嚴重的問題。

比如,教材裡面會這樣教,

fetch("https://github.com")
.then(res =&> /* do something */ )

發請求到github,然後根據結果,做一些事情。

這種用法很常見,幾乎可以當做js內置的語言特性來用。

然鵝,如果有C基礎的話,想要真正理解這段js代碼,也需要一個很長的學習過程:

啥是回調?啥是lambda表達式?閉包是什麼意思?....

promise是啥?為什麼要用promise?啥叫非同步IO? .....

大部分的「教程」都是功利性很強的。

原理性的東西慢慢學就好。


(Thank you @Abby Deng for this amazing translation!)

無痛苦學習編程的步驟是 (Steps to learn how to code without suffering):

  1. 找到個你真的想做的東西 (Find something you actually want to make)
  2. 在網上搜搜和你想做的這個東西非常相近的代碼 (Search online for code that is very similar to what you want to make)
  3. 運行這個代碼並玩玩它 (Run that code and play around with it)
  4. 自己試試更改代碼里的一些東西使得代碼更接近你想要的東西 (Change the code a little bit to make it fit what you want)
  5. 你自己所做的更改可能會使得代碼破損 運行不了了;上網搜搜程序報的錯誤信息 (The change you made probably broke the code; search for the error message online)
  6. 自己修正程序 bug (Fix your bug)
  7. 運行代碼並享受你自己定製的程序吧! (Run the code and enjoy your new customized program)
  8. 重複步驟 4-7 (Repeat steps 4-7)

- - - - -

如果你花了好幾個小時來搞出個新東西,這是沒問題的。這隻會讓你永遠不會忘記你學到的新東西。

It』s fine if it takes you hours to figure out something new. That just means you』ll never forget it.


題主使用的教材不對。請看我給我老婆寫的教材:

教老婆學python》

註:未完待續....等我整理完了會發到水風的遊戲思考 - 知乎專欄,歡迎關注。

什麼是code:
code就就是一種語言,一種計算機能讀懂的語言。計算機是一個傻逼,他理解不了默認兩可的任何東西。比如,你讓你老公去買個西瓜,你老公會自己決定去哪裡買,買幾個,找個搞活動打折的買,總之,你給他錢,他就給你買回來讓你吃到爽的西瓜。但是,你想讓計算機買一個西瓜?你要告訴他:去門口的鮮豐水果店買,買沙瓤無子西瓜,若旁邊的店打折,就去旁邊的店買。總之,你不能讓計算機做任何決定,你要清楚的告訴他所有情況下的所有的行為。而code,就是你和計算機交流的語言,或者說是對計算機的命令。

我們就把計算機理解為一個人,這個人很死板,只能按照你給他的詳細命令進行工作。而這個人工作速度特別特別快,並且保證工作結果都是正確的。

編程語言其實不重要,重要的是要明白如何和計算機交流,明白了這個也就能看懂代碼了。

python就是一種和計算機交流的語言,這種語言單詞(關鍵字)不多,規則也少。下面所有的內容都基於python。

判斷

當你命令計算機做一件事情的時候,這件事情可能分一些情況進行處理。
判斷通常涉及到的關鍵字有:if , else, elseif, and, or,&<, &>,=,&<=,&>=,==

比如,你讓計算機買西瓜,希望買到打折的西瓜,不打折的話你就不吃了。

if 水果店打折:
買西瓜
else:
不買了

通過這個命令,計算機變得更智能了一些,他可以根據情況執行你的命令。

水果店不打折你就吃不到西瓜,你不開心。那麼,我們讓計算機更智能一些。假如西瓜打折,就買西瓜;不打折的話讓計算機跟老闆講價,老闆同意打折,就買西瓜;不同意,不吃了;

if 水果店打折:
買西瓜
else:
與老闆講價
if 講價成功:
買西瓜
else:
不吃了。

雖然和老闆講價一般都能講成功,但是有的老闆給力給打五折,有的老闆只給打九折。你就想了,若老闆打五折,我就買兩個,今天吃一個,明天吃一個。若老闆不給力,打折不到五折,就買一個,今天先吃,明天再說。

if 水果店打折:
買西瓜
else:
與老闆講價
if 打折成功 and 打折力度&<=5: 買兩個西瓜 elseif 打折成功 and 打折力度 &> 5:
買一個西瓜
else:
不吃了。

此外,有沒有發現,打著成功這段代碼其實也可以寫成:

if 打折成功:
if 打折力度&<=5: 買兩個西瓜 else: 買一個西瓜 else: 不吃了。

由此可見,計算機也不是完全的一成不變,只要你給他的命令他能理解並且不會默認兩可,他都可以完成工作。

and的意思代表且,or的意思代表或。and和or的順序不同,結果也不同,可以通過括弧來說明判斷條件的優先順序。

a==b是比較a和b是否相等的意思,而=代表賦值。賦值的含義,我在下面的變數章節介紹。

循環

python中涉及到循環的關鍵字包括:for...in... ,while,break,continue

上面的例子我們已經讓電腦成功的可以根據不同的情況去水果店買西瓜了,但是若老闆不打折,你就吃不到西瓜了。這時,你就想了,咱們小區門口有三家水果店,分別是鮮豐水果、四季水果和路邊攤,一家不打折不代表三家都不打折啊,所以你希望電腦可以去三家都去看看,挑一家打折的店買西瓜。

for 水果店 in (鮮豐水果、四季水果和路邊攤):
if 水果店 打折:
買西瓜
break(循環結束)
else:
啥都不做
帶西瓜回家

循環的意義在於,可以用電腦對不同的對象執行相同的命令。

介紹下break,break的意思就是結束循環。比如,這段代碼中的break表示,我們一旦買了西瓜,那麼就帶西瓜回家。

變數

現在是時候介紹"變數"這個重要的東西了。

我們依然把電腦理解為幫我們工作的一個人,那麼作為一個人,他需要有記憶力,而我們就可以通過變數去控制、利用計算機的記憶力。

變數可以理解為計算機的一個記憶單元,計算機擁有極好的記憶力,所以,可以隨心所欲的使用,用完了就扔,需要了就要。(當然,說隨心所欲是不嚴謹的,但是你可以理解為隨心所欲)

那為什麼叫變數呢,就是因為可以改變。為什麼要改變呢?比如我們都有自己的年齡,我今年18,明年就19了。所以,"年齡"在我的記憶里是每年改變的。

變數對應的一個東西叫常量,在我的記憶力,我的老婆是江江同學。而這個"老婆"這個記憶單元在我的腦子裡是不會變的,她永遠都是江江同學。常量你現在可以不用理解,我寫主要是為了秀恩愛。

現在,計算機又要去買西瓜了。不過這次,你希望計算機可以在三個水果店中,找到一個打折力度最大的水果店去買水果。

之前所有水果店的最大折扣 = None
之前給最大折扣的水果店 = None
for 水果店 in (鮮豐水果、四季水果和路邊攤):
當前水果店折扣 = 老闆給的折扣
if 當前水果店折扣 &< 之前所有水果店的最大折扣:#4折比5折力度大 之前所有水果店的最大折扣 = 當前水果店折扣 之前給最大折扣的水果店 = 水果店 去 之前給最大折扣的水果店 買一個西瓜

以上有以下幾個記憶單元:

  • 之前所有水果店的最大折扣
  • 之前給最大折扣的水果店
  • 當前水果店折扣
  • 水果店 注意,for a in b,a也是一個變數,他在每次執行的時候都是b中的當前執行的一個元素。

這裡需要介紹一些概念:

  • None 在python中表示空,表示這個記憶單元現在啥都沒有。比如在我情竇初開時,腦海中就已經有了情人這個記憶單元,我一直在尋找,但遇到你之前一直沒有找到,所以那段時間這個記憶單元裡面一直是空。
  • 賦值符號:=。 注意,在計算機語言裡面,一個"="號表示賦值,兩個等號"=="表示比較前後元素。賦值的意思是,把後面的元素,放到前面的變數裡面。

變數的作用域

作用域這個東西非常重要,但是真心不想講,因為沒辦法結合現實的例子,不過還是大體說明下。

還是剛才的例子,我加了行號,並且我使用-代表空格,表示代碼的縮進。

1 之前所有水果店的最大折扣 = None
2 之前給最大折扣的水果店 = None
3 for 水果店 in (鮮豐水果、四季水果和路邊攤):
4 ---當前水果店折扣 = 老闆給的折扣
5 ---if 當前水果店折扣 &< 之前所有水果店的最大折扣:#4折比5折力度大 6 ------之前所有水果店的最大折扣 = 當前水果店折扣 7 ---之前給最大折扣的水果店 = 水果店 8 去 之前給最大折扣的水果店 買一個西瓜

你看這個例子可能納悶,為什麼要先給"之前所有水果店的最大折扣"、"之前給最大折扣的水果店"這兩個變數賦值為None呢。就是因為作用域問題。

你看這個程序,每行代碼的縮進都是不一樣的。變數作用域可以理解為:一個變數,只有在其第一次出現的地方的縮進,以及縮進更多的代碼裡面,才有效。我們第1、2行的變數,就可以用於3-8行,因為這些代碼的縮進都在1、2行的後面。而第四行的變數"當前水果店折扣",只在5、6、7行有效

1 A = None
2 ————B = None
3 ————..
4 ————————C = None
5 ————————..
6 ————D = None
7 ————..
8 ————————..
9 ————————..
10 ..
11 ..

再舉個例子,ABCD是變數,..代表某些代碼。A的作用域就是1-11行,即1-11行都可以使用A。B的作用域是2-9行,C的作用域只有4-5行,注意,8-9行就不能再使用C了,雖然他的縮進和4、5行一樣,作用域遇到第一個不能用縮進行代碼即結束。D的作用域就是6-9行。

函數和模塊

看懂以上幾節,大概應該明白計算機如何執行代碼的了。

而函數和模塊,和之前的介紹不太一樣。之前是介紹如何讓計算機工作,是面向計算機的。而這一節,是面向人的,是如何讓我們寫給計算機的代碼看起來更加簡潔、明了。函數和模塊都是對代碼結構的優化,否則一個稍微大點的項目,一大坨代碼,計算機看得懂人看不懂,不利於管理和交流。

首先說函數。函數是一系列代碼的集合,用函數一般是有幾個原因:
1.給一段代碼起個名字。
2.這段代碼和使用它的代碼關係不大,所以可以抽出來,抽出來後代碼更簡潔。關係不大的意思就是:使用函數的代碼通過傳給函數幾個參數,函數就可以執行。
3.代碼集合起來就可以在代碼的不同地方使用。

依然我們去買西瓜,不過我們希望電腦可以今天買完西瓜明天再買一個。按照之前的方式,這個邏輯應該寫成這樣:

for 水果店 in (鮮豐水果、四季水果和路邊攤):
if 水果店打折:
買西瓜
else:
與老闆講價
if 打折成功 and 打折力度&<=5: 買兩個西瓜 elseif 打折成功 and 打折力度 &> 5:
買一個西瓜
else:
不吃了。

休息一天。

for 水果店 in (鮮豐水果、四季水果和路邊攤):
if 水果店打折:
買西瓜
else:
與老闆講價
if 打折成功 and 打折力度&<=5: 買兩個西瓜 elseif 打折成功 and 打折力度 &> 5:
買一個西瓜
else:
不吃了。

上面的代碼可以實現我們的要求,但是買西瓜的代碼其實是重複的,對於重複代碼,管理起來比較麻煩,比如你想改一點,那麼就要去各個地方都改一次。

那麼,我們把買西瓜的代碼弄成一個函數,代碼就可以整理為:

def 買西瓜_函數():
for 水果店 in (鮮豐水果、四季水果和路邊攤):
if 水果店打折:
買西瓜
else:
與老闆講價
if 打折成功 and 打折力度&<=5: 買兩個西瓜 elseif 打折成功 and 打折力度 &> 5:
買一個西瓜
else:
不吃了。

買西瓜_函數()
休息一天。
買西瓜_函數()

這一次,代碼整潔多了,而且,我們每次想修改買西瓜的代碼,都只需要改這個函數一處代碼都可以。

在python中,使用def function_name():定義函數,函數下面所有的縮進都屬於這個函數,叫函數體。

使用function_name()調用函數。

函數參數

現在你又不滿足與電腦只會買西瓜了,你又想吃柚子。怎麼辦呢,那麼是不是我們又要寫一個買柚子的函數呢。

當然可以再寫一個買柚子函數,但是買柚子函數的邏輯和買西瓜函數的邏輯都是一樣的,命令也一樣,唯一的區別就是之前是賣西瓜,現在是買柚子。如果再寫一個類似的買柚子函數,那麼又出現剛才說的問題,每次修改買水果的邏輯,都需要同時去修改買西瓜、買柚子函數,如果柚子吃膩了,又要買香蕉、蘋果、梨,豈不是要寫非常多的函數?

為了解決這個問題,其實有一個更好的方法,就是使用函數參數。

由於我們買水果(無論是西瓜、還是柚子)的功能都是一樣的,所以我們可以寫一個買水果函數,買水果函數定義了買一個水果的流程,當我們使用這個函數的時候,我們只要告訴這個函數我們要買什麼水果,函數就可以根據你告訴他的水果名,去買對應的水果。

買水果函數的代碼如下:

def 買水果函數(水果名):
for 水果店 in (鮮豐水果、四季水果和路邊攤):
if 水果店打折:
買[水果名]
else:
與老闆講價
if 打折成功 and 打折力度&<=5: 買兩個[水果名] elseif 打折成功 and 打折力度 &> 5:
買一個[水果名]
else:
不吃了。

買水果函數(西瓜)#讓電腦去買西瓜
買水果函數(柚子)#讓電腦去買柚子

在python中想使用函數參數,只需要在函數定義的時候,在括弧裡面加上參數即可,我們這裡的參數就是"水果名"。在函數體中代碼可以使用函數參數。

在調用函數的時候,把一個變數或者常量寫在函數名後面的括弧裡面,傳給函數。

注意,若是存在多個參數,函數定義和調用函數的參數順序一定要一致。

在python中,還存在默認參數、關鍵字參數等稍微高級一點的使用方式,舉個例子,不詳細說明了。

def sum(a, b = 0,c = 1):#b/c是默認參數
return a+b+c

func(1,0,1)
func(1)
func(1,c=1)

這三個func調用的結果都是一樣的。

未完待續....等我整理完了會發到水風的遊戲思考 - 知乎專欄,歡迎關注。


1、初學者碰到挫折是很正常的,不要為一時的困難而放棄,關鍵時對從事軟體開發要有興趣,

如果沒有興趣,可以培養興趣。

2、經常對初學者說,字元串格式化,就是前面占坑,後面填坑,秒懂。

just 語法。

3、建議格式化字元串,用新的語法,format

加油!


我曾經給一個學妹補課 她學地理的 要拿一門入門的基礎編程課

我幫她看了個作業 她就一定要我給她補課 說不補課她就完蛋了

我看了一下她的水平 確實有點費勁。。。

當時教她寫for loop 我告訴她 i=0 又讓她寫了幾個類似的loop 看上去像是掌握了

然後教她寫作業里的一個題 具體記不清了 大概就是在一個list裡面 看找不到的到跟給的str相同 還是首位相同的str 最後return t/f

我說 你這樣想 我們假設一個i i=true 別問我為啥是i 別說我名字取的不好 小姑娘還停留在只有xyz字母才能當變數的思維定勢里

然後她的眼神中就露出了驚恐和絕望

她說

學姐啊 這 i 不是等於 0 么

我說這i啊 就跟xyz一樣 你解方程矩陣 都是xyz 出來的結果 還能每次都一樣了??

我看她還困惑

我說 小明猜不出腦筋急轉彎 小明笨死了

第二天 小明上學去了 為啥?小明不是死了嗎??

這是另一個小明啊! 這個i 也一樣 上一個i=0 這個i=true i還可以是蘋果香蕉大鴨梨啊

她說 好像懂了 大概懂了。 其實我看的出 。。。她應該還沒太懂

還有永遠記不得加冒號 :這個叫冒號沒錯吧

我也教了她怎麼看報錯 我就不懂了這error出來說的也不是代碼 說的都是人話 還是很貼心很詳細的人話 咋就看不懂呢

有次布置給她作業 給我發了張照片 我找不到圖了 大概就是這樣一個東西

File "&", line 1

if i&<5

^

SyntaxError: invalid syntax

她說照著我給她的示範寫的 一樣一樣的 我說你好好看看 她說看了 試了20遍 一樣一樣的。。。我說你不要看我的答案 看看error 她說看不懂 ???????

我一口老血啊 當然啦 我是溫柔的大姐姐 我不會發脾氣 我帶著如春風般的微笑告訴她

冒號呢!!!!!!!!!!!!!!!!!!!!!!!?????????

另一個是我最好的朋友 學化學的 一個課需要用到py 讓我教她寫

不吹不黑 基本什麼都不用我說第二遍 還能舉一反三 就告訴她len是看長度的 自己就會用這個檢驗自己的答案

總之吧 人和人的天賦 智商是不一樣的 放不放棄還是看興趣有多大 執著有多少吧

//============================

我再多說兩句 有個挺重要的事就是你為啥學 你的興趣甚至信仰才是你堅持下去的動力

打我學這個的第一天起我就沒想過放棄 是真的想都沒想過

我初中的時候參加了69聖戰 那時候憤青啊 看著大神們都沖在前線 我打雜幹些跟技術毫不相干的事 覺得自己特別廢物 特別無能 聖戰結束之後我買了本譚浩強的 c語言程序設計 算是我夢想的起點

打那時候起我就知道我這輩子想幹什麼 我以後的路要怎麼走 到我大學的第一門基礎入門課 這中間有四年

大二時候有一門課的作業 我第一次感覺毫無頭緒無從下手 身邊的男猴子們都陸續寫完了 我費勁吧啦的才好不容易寫出了最簡單的部分

我自己跑去走廊里嚎啕大哭 想抽自己大嘴巴 覺得自己怎麼笨的跟豬似的 哭完了又回去接著寫接著磨最後終於是完成了 那時候我都沒想過什麼我適合不適合 放棄不放棄 我就是覺得我可能確實天賦不如別人 我可能要更努力一點才可以

我聽過太多人說想干這行因為工資高 好找工作什麼的 怎麼說呢 沒有什麼比開心更重要了 就這麼點熱情 就這麼點激情 還是想奉獻給自己喜歡的行業 就這麼點腦汁 還是想琢磨研究自己喜歡的事


高票答為何都這麼mean?

大概和高票們一樣,我身邊的人,從其他語言轉到python,從開始寫第一句到真正用起來也就一兩天。

但重點是大家大多科班出身,coding這麼多年了啊,知道大概就那麼回事。

如果從頭開始,退一萬步,誰不是學了一個學期的c加一個學期的c++加數據結構?一個陌生領域,幾個小時建立基本概念有什麼問題呢?保不準比你當年快多了。

至於問題本身,和「我學了幾個小時XX但遇到了困難我應該放棄么」如出一轍吧,就不說了。


緊急回答:千萬不要

作為一個從一窮二白文科生轉行入IT的程序猿大叔,我可以肯定的告訴你:現在放棄還太早了

學編程難不難?難。

但其實也沒有你想的那麼難!

一圖勝前言,雖然我這張圖畫得不咋地, (〃"▽"〃)

這張圖表現的是學習編程各個階段的難度,或者能力提升情況。(難度越大,學會了之後能力提升也越高,這個應該能夠理解吧。)

題主你現在應該處於第一個階段。

萬事開頭難,但學編程開頭尤其難!

我法律是自學的,一次性的就過了司法資格考試;我創業做裝修,摸爬滾打出來,設計施工樣樣在行;但就是這學編程,坑了爹呀!

真心坑爹啊!說起來都是淚……我一個文科生,從中間開始學編程,這是一種神馬體驗?是「坐飛機」的體驗呀!我26年的人生中,第一次體會到什麼叫「上課坐飛 機」:老師講的每一個字我都聽得懂,但連在一起我就什麼都不懂,完全不懂他在說什麼。上機好一點,我TM至少知道開機。當然,除了開機我其他什麼都不會了。

想看原文的,拿去:如何通過自學找到一份開發的工作? - 知乎

雖然現在這些「碼農」「搬磚」「程序猿」「IT民工」自黑得厲害,好像到處都在哀嘆程序員的門檻越來越低,一副江河日下朝不保夕的樣子。但其實入行IT,能有份正兒八經編程的工作一直做著,還是相當不容易的。

關於「 編程究竟難在哪裡?」,安利一個視頻:http://v.youku.com/v_show/id_XMjc4MDM4NjU0NA==.html?spm=a2h3j.8428770.3416059.1

第一次做的直播,閑得無聊的,湊合著看看也行。

我入行程序員那時候,年齡大時間緊,就報的培訓班,一個班25個同學,最後找到對口編程工作的,不到5個人;前段時間有網友因為IT培訓糾紛找我,他們班30人,找到工作的就3個!你自己算一下這個成功率。

不要我這樣說把你嚇著了吧?

來,看看這個:如何評價 2016 年 IT 業年平均工資破 12 萬元,首次超過金融業,排名各行業門類首位?雞血了吧?呵呵。

開玩笑的。

但無論如何,你現在就放棄還是太早了,完全還可以再抗一抗。重新看一下我給的那張圖,只要把第一個階段扛過去了,後面就輕鬆多了。

接觸編程的新人,最頭痛的有兩個地方:

一、沒辦法理解。

這說的是傳統的科班教學,一上來就是二進位,計算機原理,數據結構和演算法之類的,當頭一棒,kuang……夢碎了一地。這個話題我說過多次了:這些東西,新人最好是先繞過,放一放,先上手,對編程有個直觀的印象之後,再回頭慢慢理解……

但題主應該是自學的,應該沒這個問題,那我們直接往下說。

二、沒辦法操作。

對於全自學的同學來說,這簡直是一個噩夢:你連環境都搭不起來

題主你好歹還print,「hello world」整出來了吧?多少同學,連這一步都做不到呀。

我當初是在家折騰了一兩天吧?Visual Studio都裝不起,VisualStudio,宇宙最傻IDE,現在感覺就像是安裝個office一樣的步驟,都搞不定。絕大部分的書根本不講,默認你就已經裝好了;好不容易找到一本給你講的,看起來是一步一步說得蠻清晰的,然後一步一坑,為毛我的電腦就不按這樣來呢?!再重來,又掛掉,暴走,崩潰,最後整個人都瘋掉……

那種淚奔……

然而,你要明白,非常非常重要的一點:

這種難,不是你應該放棄的那種「難」!

好吧,為了告訴你什麼是你「應該放棄的難」,飛哥豁出去了……

比如說,讓我去跑一百米跨欄,難,真難!別說得世界冠軍,就小區冠軍都不行,怎麼練都不行,腿短;

又比如說,讓我進軍娛樂圈,做什麼「小鮮肉」,難,真難。去趟韓國都不行,哥是實力派,你們都知道的,怎麼能靠臉?!

明白了吧?

有些東西,是要靠天賦的,得靠祖師爺賞你碗飯吃才行。

但編程,不過是門手藝,是不需要多少天賦的。做大師可能沒指望,但踏踏實實勤勤懇懇,做個匠人,完全沒有問題。

做開發寫代碼,我寫了快十年了,終於也有人開始叫我「大神」,但我有什麼天賦?沒有!絕對沒有,我自己是塊什麼料我自己清楚,我就生了一副好牙口,吹牛打屁還行……當年我考軟考,成績是七十多不到八十,我非常非常滿意,因為一道十幾分的演算法大題我根本就沒做——不會做,真不會,這演算法原原本本書上寫著的,外加註釋講解,我都不懂,你現在讓我自個兒寫出來,你還是殺了我吧!還痛快點。

但我還不是過來了?

因為你現在碰到的這些問題,就是一些「坑」,新人都得踩的「坑」。你看大神行雲流水,不過是這些坑他都踩過了,而且還不止踩了一遍!什麼搭不起環境、編譯通不過、連不上資料庫……有技術含量嗎?好像也有點,但高深嗎?複雜嗎?不可理喻嗎?這些東西甚至都不需要你理解,你知道就行;知道了,也就是那麼一回事。

只不過,這些瑣碎的、無聊的、毫無技術含量的東西,編書的人都懶得寫,所以對初學者而言,就成了繞不過的攔路虎。

說了這麼多,怎麼辦?攔路虎再是個紙老虎,也得趕走才行啊!

第一嘛,當然就是報個名,參加個培訓班。但千萬被誤會,我不是培訓班的托,他們也沒給我廣告費,所以就此打住。我的廣告在這裡,一個我妙手偶得的good idea:

一對一遠程互助平台:一起幫

如果碰到了上面所說的這種問題,到一起幫發個求助,然後別人會直接和你聯繫,通過桌面共享等遠程手段,直接的幫你解決問題!不要你一句我一句傻乎乎的寫,像傳統的論壇一樣,效率太低:那是問也問不清楚,答也答不清楚。

試運行了一段時間,用過的人都說好,不可能不好!你一晚上都搞不定的事,我十分鐘給你解決了,怎麼可能不好?

但大家不能都當「伸手黨」,都只等著別人幫你,你也得想辦法幫幫別人。所以我設計了「時間幣」制度……看了這麼久的廣告,給你們點福利:要註冊的趁早,「註冊就送時間幣」的政策我馬上就要停了。

不好意思,打了點廣告。但憑良心說,也就最後這點是廣告,硬廣,全面的都是肺腑之言。我特么也不想做廣告,但「一起幫」「一起幫」,要大家一起幫才行,我渾身都是鐵,又能打幾顆釘,是不是?

網路推廣我真不行,就像上次:

全靠各位粉絲了,能分享的就分享一把

收藏進:野生程序員 - 收藏夾 - 知乎,歡迎關注。


謝邀 :)

抱歉來晚了,這個題下勸退和反勸退的答案已經很多了,我覺得大多數答主,不論是勸退的還是反勸退的,大多是出於好意,覺得題主不必繼續浪費時間還不如去干點別的,或者繼續走編程的康庄大道。。 我覺得都沒毛病。但我真不覺得能通過這樣一個問題就能判斷出來題主是不是適合編程,花了一個小時理解 % 這個格式符號確實效率不高,但誰在學習新知識的時候沒有遇到過類似的情景呢?就不說編程了,上小學初中高中的時候就沒有經常糾結一個問題半天一直搞不定但最後被老師點了一下就馬上明白了的么?

所以我也不勸退或者反勸退,就來支個招,建議題主找一個志同道合的小夥伴一起學,身邊沒有就網上找相關的社區,遇到問題了幾個人討論一下或者真誠地請教一下就很容易避免鑽到牛角尖里出不來這種情況。而且在幫別人解決問題的這個過程中自己的理解也會更深刻。學會問問題很重要,問的時候描述清楚,有點誠意,別怕被噴,總有人會來解答的。

最後想說才剛開始學就不要想適不適合這種亂七八糟問題,記得看過一個Ted talk說學一門知識入門需要20個小時,所以怎麼著也要先投入20個小時以後再來考慮這種問題吧。。


我剛學編程那陣,還沒有自己的電腦,上機機會少,都半年了才學會打字。各種想法都不知道用什麼實現,就簡單粗暴的抄API手冊,還抄錯了選了IBM OS/2的手冊。

學編程的第三年開始玩pascal,以會寫函數沾沾自喜。能定義個結構體,特別是帶遞歸的就很高興了。

學編程的第4年,用VB和Delphi的時候,還不習慣自己做事件映射,而是整個程序都是各種控制項的響應函數。至於提取獨立的程序模塊,簡直不敢想。

學編程的第7年,學了Java,才算是開始學習寫靜態函數,寫各種類,寫繼承。

學編程第8年,才首次接觸了Python,學的很開心,實現了唯一一次沒有延期的課程設計。至於高級的列表迭代器,函數式編程,還無法接受。

然後開心的用了近一年後,學編程的第9年,我就大學畢業了。

有些你看起來很順的人,也許只是個早飛的笨鳥,在面對多次挫折後堅持了下來,直到被你看到。


那就是C的printf,不怪你,畢竟是能逼瘋C語言初學者的第一道門檻


朋友,你不要誤把入門時候因為流程不熟悉的坑而覺得是編程的鍋,好比我剛開始因為找不到word的按鈕位置,就說我不適合寫字?

編程真正難的是在後期多技術融合,設計一個程序要考慮架構設計部署數據流很多事情,那才開始難。

你現在僅僅是沒有領進門而已,你拿出高考時候的精神,學習了C的使用方式,或者說是按鈕(比喻)位置。入了門再去衡量自己是不是真的不適合。

我好多同學在大一時被C語言嚇怕了,後來抱著和題主一樣的觀念,反正我編程學不會,又不想做一堆扯淡的學生工作,還不想動彈,好迷茫啊,然後在宿舍看四年直播思考人生。

朋友,別太快否定自己。只有足夠了解才能知道這行到底適不適合。

一些值得看的相關回答:

  1. 想知道大家都用python寫過哪些有趣的腳本? - 知乎。 #
  2. 你寫過的自己覺著最牛X的黑程序? - 知乎。 #
  3. 學習Python很吃力,我是不是可以放棄編程了? - 知乎 #
  4. Python爬蟲傳送post請求要攜帶哪些參數? - 知乎。 #
  5. 不想拿學位證的計算機在校生? - 知乎。#
  6. 你在實驗室經歷過最危險的事情是什麼? - 知乎。 #
  7. 如果你能預知未來,你會不會更加努力? - 知乎。 #


很多人應該明白,python再簡單,也是有門檻的,不只是轉行的心理門檻,而是人本身自然的思維能力門檻(不是指的智商,而可能是理解力、抽象能力、數理邏輯能力等具體領域的能力)。

事實上相當多的一群人確實依然達不到程序員崗位對編程能力的最低門檻。他們對編程能力上限,確實達不到python要求的下限,就像很多人數學能力的上限,連工科微積分的下限都達不到,是同一個道理。

所以這也是我反對輕易轉行、隨意勸退的原因之一。很多很多人,不是轉行到了CS,就能找到工作的。

具體到題主,我不希望你輕言放棄,但如果你覺得你在沒有心理負擔的前提下,依然無法學好Python,那你應該認真考慮一下放棄編程,嘗試其他領域,比如微商、自媒體等。


是的,下一個。


推薦閱讀:

網易雲課堂上自學編程?
剛入門的有關編程學生,可以通過寫什麼比較大的項目提高自己的綜合能力?
非程序員適合學習哪些編程知識?
怎麼學C語言?
零基礎如何自學編程成為一名程序員,有哪些書推薦?

TAG:Python | 編程 | 自學編程 |