8.2第二課: 字符串 列表
在開課前放的優秀文章可以參考簡書的文章list : http://www.lxweimin.com/p/7cb84cfa56fa
第二課作業:
作業1:
下方是一個嵌套的列表,通過對x分割,打印“e”和“g”。
提示:使用 x[ ][ ]的形式。x如下:
x = [["a", "b", "c"],
["d", "e", "f"],
["g", "h", "i"]]
作業2:找最大值和最小值
以下給出一個團隊中成員名和他們各自的微信好友數量,請模仿上述詞頻的例子,通過for循環找出團隊中好友數最多和最少的兩個人。如下:
names = ['小趙','小錢','小孫','小李','小王','小張']
friends = [45, 100, 67, 136, 77, 17]
下文 Q&A 目錄索引:
1,代碼運行:單引號&輸出
2,代碼運行出錯
3,and, or, not 的執行優先級
4,github中無法查看代碼
5,python作為工具使用
6,如何上傳代碼至jupyter
7,Jupyter安裝完成后的根目錄
8,空格健縮進
9,代碼運行顯示不出人名
10,“空格”和“引號”的使用
11,代碼運行出錯
12,mac系統jupyternotebook無法跳轉瀏覽器
13,代碼運行:引號
14,代碼運行:引號
15,1 在不同運行中存儲的位置
16,代碼理解:unique_words,counts[index]
17,代碼理解:count[i] ,bigWord = unique_words[I]
18,python IDLE編輯中文
19,代碼運行:依次取漢字
20,代碼運行:中斷方法
21,代碼理解:內外循環
22,代碼運行出錯
23,代碼運行:執行代碼無反映
24,jupyter notebook的launch 沒反應
25,運行代碼:有星號
26,代碼運行:三引號
27,代碼理解:len, count
28,代碼運行優化:精簡步驟
29,代碼運行出錯
30,代碼理解:for i in range(len(friends)
31,()和 [ ] 用法及區別
32,代碼運行出錯
33,代碼理解:tab
34,代碼運行出錯
Q 1 :如上圖(圖2-1),我有兩個問題:
1.什么時候會出現單引號?
2.輸入 x[1][1]
? ? ? ? ? ? x[2][0]
為什么只有一個輸出?
A:1、不用print函數時會出現單引號。
2、你這樣輸入,只顯示最后一個運算結果
Q 2 :如上圖(圖2-2),最小值函數代碼那一行為什么是從1重新開始,我試了接上面的代碼直接輸入,輸出顯示錯誤。這是為什么?以及怎么轉換?中間加了一個 In[1] ,后面又是和前面連續的。
A:應該是你程序中途shutdown了吧(當程序中途停止運行時,in[ ]里面數字會重新從1開始計數),試試重啟jupyter,再運行
追問Q:不是,那是老師課件里面的。從1重新開始才能輸出正確。如果接著In[35],輸入代碼,運行In[36]的話,則輸出不正確。
Q 3 :關于 and, or, not 的執行優先級,以及str能夠用過int()變為整型嗎?
A:關于and or not的優先級問題:
not比or和and的優先級高,or和and優先級相同
比如 not True or False and True,計算順序為:
1 首先計算not True 為False
2 然后計算 False or False為False
3 然后計算False and True為False
所以結果為False
str可以使用int變為整型。比如int('123') 結果為123
追問 Q :但是1 or 0 and 0=1(0和1可直接對應True和False如果我沒理解錯的話),1 or 0 and 0 and 1 =1,(1 or 0) and 0 and 1 =0所以我覺得or要先于and執行
A:同優先級按從左到右依次執行
Q 4 :#github中無法查看代碼#
大家可以打開github中的代碼嗎?我進入到圖里的頁面就在應該顯示代碼的地方加載不出來,也沒看到可以下載的地方,請問要如何解決?拜謝~神奇的是,用最新版的chrome打開其他網頁和下載都沒問題,就是這里查看不了_(:з」∠)_
A2: PythonData 點擊這個回到首頁才有下載通道。首頁右側綠色按鈕(Clone or download)點擊就是下載地址→選擇Download ZIP 就可以下載了
Q 5 :請問,如果只用python能不能做一個工具:將微信群里的發言信息變成格式化的信息,然后分類統計和匯總?哪位能指點一下?
A:前提是微信是否可以導出,并且是明文。如果可以,就能使用python 分析了.關于分析 就要看你的具體需求了,比如某人發言條數占比、詞頻分析之類的。根據需求對數據進行處理清洗。
Q 6 : 如何上傳代碼至jupyter ?
A:Jupyter Notebook 根目錄修改 windows7
打開終端:開始→所有程序→Anaconda3→Anaconda Prompt
輸入:jupyter notebook --generate-config 生成配置文件
紅框一:輸入的代碼;紅框二:生成配置文件路徑(即文件地址)。按照路徑找到文件:右鍵→編輯jupyter_notebook_config.py 打開編輯頁面
現在需要查找修改代碼的位置:快捷鍵(Ctrl+F)
需要對這行代碼進行修改:源碼:#c.NotebookApp.notebook_dir = '' ?修改為:c.NotebookApp.notebook_dir = 'D:\python' ?。此處以修改到D盤python文件夾下為例:
鼠標點擊下即可獲得該地址。
保存文件
從新運行Jupter notebook
課件可以拷貝到D:\python下,從新打開Jupyter即可看到課件。
Q 7 :哪位可以指導一下我的Jupyter安裝完成怎么沒有課件中的的根目錄啊?
A:目錄要自己創建的
Q 8 :按空格健 沒有空格,反而是縮進了,不知道咋修改
A:這個問題好難解。確認一下你的輸入法,是不是中文全角狀態下輸入的空格。
Q 9 :如上圖(圖2-3),為什么顯示不出人名?
A:建議使用python3,python2中文有編碼問題。
Q 10 :有沒有同學總結過關于“空格”和“引號”:哪些地方硬性要求必須有空格,哪些地方可有可無,現在完全憑猜在打空格。。。 以及引號,好像 ' 和 " 都可以??
A1:引號的問題,我以前學過一點入門,好像是沒有差別。打空格是個人習慣,好看一點,你不打也沒事啊。我以前用過一個python的編程器,它會自動幫你拉開間距,很美觀。
A2:老師上課說單引號和雙引號基本可以互換,只是在需要引號套引號的時候區分,我試了一下是一樣。空格我感覺是不是個人習慣呀,余老師的課程里都打,我不打也沒影響結果,就是看著有點擠。。。
Q 11 :上圖(圖2-4)顯示,這是個什么錯誤,看著沒問題啊
A:原因可能是之前你使用了類似 max=(1, 3, 4),你可以在菜單kernel-> restart重置一下,然后再執行試試。
Q 12 :關于mac系統jupyternotebook無法跳轉瀏覽器的問題
A:大家可以看下這個鏈接:https://github.com/jupyter/notebook/issues/2438
Q 13 :print( ) 輸出,有引號,和直接變量,沒引號的輸出,有什么區別?
A:沒有區別,只是一個是notebook幫助輸出的,一個使用print輸出。我記得老師上課有說到這塊。
Q 14 :請看上圖(圖2-5),這里強制轉化成字符串,為什么沒有引號?
A:print打印出來的不帶引號,使用notebook打印是帶引號的。
Q 15 :我有個問題:
a = b = c = 1和 a =1,b =1,c =1。
1 存儲的位置是不是一樣?
第二個表達式中的“1”都存在同一個內存位置上嗎?還是在不同的位置?
A:這個問題厲害了。第一情況:計算機會在某地址創建一個整數對象1,然后a、b、c都指向它。所以此時內存中只有一個數字對象。
第二情況:計算機會生成三個新的整數對象1,分別存儲在不同的地址中,a、b、c分別指向這個三個地址,所以此時內存中有三個數字對象。
當給變量賦值的時候,是真實的劃出了內存的一個區域,并且將這個區域命名(也就是變量名);而不是指向之前已經存在的某一個區域。
Q 16 :課程中,有段代碼,我始終搞不明白。
for word in words:
index=unique_words.index(word)
counts[index]=counts[index]+1
print(counts)
[7, 2, 2, 1, 3, 2, 1, 2, 1, 1, 1, 1]
這句話中, index=unique_words.index(word)
counts[index]=counts[index]+1
這兩行是什么意思呢, counts[index] 指的是索引的次數嗎,能用更直白的話,描述這幾段代碼嗎?
A:假設現在有unique_words = ["hello", "world"]
counts = [0, 0]
注意counts中的對應位置數據就是unique_words中每個單詞的詞頻,初始時都為0。
現有列表words = ["hello", "world", "world", "world", "hello"],計算每個單詞詞頻數。下面開始遍歷words,第一個遍歷單詞為"hello",此時查找一下"hello"在unique_words哪個位置,此處位置為0,則可以把counts位置0處的值加1。此時counts的值即為[1, 0],表示hello詞頻為1,world詞頻為0,然后我們在進行第二次遍歷,單詞為world,找到其在unique_words位置為1,把對應的counts中表示world詞頻的值,即位置1處的值+1,以此類推。最終結果是counts=[2, 3],表示hello出現2次,world出現3次。
Q 17 :老師,問題在上圖(圖2-6),請過目。這里面的含義不懂,思考方式也沒清晰。
A:首先需明白unique_words和counts一一對應,unique_words為單詞列表,counts為對應位置單詞的頻數。
下面遍歷counts中的每個元素,if count[i] > bigCount : ?表示遍歷的最新的某個count值是否大于bigCount,如果成立執行下面的兩條語句:
bigWord = unique_words[I] ? , 表示把這個位置單詞找到作為bigword,也就是最高頻單詞。
bigCount = counts[I] ? ,i表示遍歷的最新位置,將bigCount賦值為最新最大值
Q 18 :直接用python IDLE打開的頁面是不能直接編輯中文的嗎?"小明" 這樣的詞是打不出來的。
A:python IDLE我沒怎么用過。通常數據分析研究會用jupyternotebook,開發人員會用pycharm。
Q 19 : 請老師指點一下,如何把一段漢字的字符挨個挑出來?我用了課程教的語句,可是出現錯誤:圖片(圖2-7)所示,而且我看漢字是以一行為一個字符串的,這樣能依次取漢字嗎?
A:unique_words.append()這行主要縮進,以保證這行代碼屬于if語句塊。
注:python以縮進區分代碼層級的。
Q 20 :(圖2-8)自定義函數,(這是個有錯誤的函數,關于if判值那邊要改),這種錯誤的函數一旦運行了,即使我esc-ii或者kernet interupt,右上角顯示了interupting kernel,卻無法正常中斷,只研究出restart中斷,想問問老師正確的中斷方法是什么
daikuane=float(input("\n請輸入貸款額,或者輸入0來結束報告"))
if daikuane==float(0):
print("結束報告")
應該直接float(input..)
A:對的,因為input出來的結果是字符串類型。因此判斷條件可以是daikuane=='0'或者float(daikuane)=='0.0'。不然==會永遠無法成立,從而出現死循環。float(daikuane)==0.0,上面寫錯了。
Q 21 :關于內外循環,我覺得i=1應該不能算是內循環, 而是外循環的一部分。我理解的內循環是紅框,外循環是橙框。和老師藍色虛線標的不同(圖2-9)
A:對的,準確的說是這樣的,理解深刻??。i是內層循環的控制變量。
Q 22 :誰幫我看看我的代碼有什么問題(圖2-10),之前運行成功過,改動了一點就失敗了,已經忘記怎么改動的了。。。。
Q 23 :作業做完了,不過遇到一個問題,就是執行代碼的時候無反映。只有重開頁面才會有反應。改過代碼后、還需要再重開一次頁面或者另外開啟一個Notebook 才會有反應、這樣周而復始的重新開啟頁面,才做完的作業。請問老師是什么問題?
A:環境不好吧,建議重啟下juypter 或者重啟下電腦之類的
Q 24 :在navigator中點擊jupyter notebook 下的launch 沒反應 是什么情況
A:我原來也遇到過這個問題。我是win7,下載了google chrome并設置成默認瀏覽器之后就可以了。
Q 25 :運行代碼有星號出現后,就沒有任何輸出了,請問怎樣除掉它?如果關了再重來之后又正常了。應該是我的錯誤操作造成的。
A:我之前也遇到這個問題,后來發現是進入了死循環。你可以看看之前運行的語句是否有死循環出不來的情況。也可以在運行頁面上方找到 Kernel 的restart 重啟
Q 26 :圖中(圖2-11),為什么是三引號,不是單,不是雙?
A:三引號是三個單引號,這樣可以換行
Q 27 : len(unique_word)=11, ?為什么counts=[0]*len(unique_word)=[0,0,0,0,0,0,0,0,0,0,0],?
A:counts是一個列表,counts = [0]*len(unique_word)就是一個初始化一個和unique_word一樣長度的列表
Q 28 :作業一:print(x[1][1])
? ? ? ? ? ? ? ? ? ? ? ? ? ? print(x[2][0])
問兩個問題:.作業一的代碼如何精簡,想只用一個 print 但是做不到;
2. 怎么用 max 和 min 函數來寫作業二?
A:print(【】【】,【】【】)
A:print(x[1][1]+x[2][0])
Q 29 :作業二(圖2-12),結果沒運行正確,不知道問題出現在哪里,求幫助
A:圖中,那里的提示是 “ if ” 那一行有語法錯誤,“ = ” 那里改成 “ is ”試試,可以對照老師的代碼看看。
Q 30 :range:生成整數序列
len:獲取序列元素個數
那么,for i in range(len(friends): ?的準確意思是什么?是 i 代表了friends數列的沒每一個元素嗎?那么len的作用是什么?
這里只對friends進行循環,沒有對names進行循環,計算機是如何把兩個數列對應起來的?或許我的問題很白癡,但我真是想不明白啊!請老師指點。
A:len是獲取列表元素個數 range可以根據長度生成一個序列。比如此處len(friends)為6,range(6)為0,1,2,3,4,5。for循環可以根據此序列對friends遍歷了。
Q 31 :望老師解答一下()和 [ ] 用法及區別,目前處于依葫蘆畫瓢階段。
A :簡單點說,()主要用于函數方法的調用,如max(1, 2, 3);而[ ]主要用于數據結構中數據的訪問,如list類型數據a, a[1]訪問位置1的元素,字典d, d["suyi"] 訪問鍵為suyi的值。
Q 32 :對作業一有疑問,print[x=[1:2],[1;2]] 結果是[ ],為什么這樣結果不對啊?(圖2-14)
A:這是因為切片操作是不會改變列表維數的,也就是x[1:2]返回的結果是[["d", "e", "f"]],仍然是個二維數組,此時訪問其中的數據,如d,則需要x[1:2][0][0],而不是x[1:2][1]。
可以考慮下為什么切片出來的結果不改變列表的維度?假設切片采用x[0:2],結果就是[["a", "b", "c"], ["d", "e", "f"]],第一維的元素是兩個元素,顯然這種情況的數據是沒有辦法降維的。
Q 33 :在print()前面多敲一個tab,和多敲兩個tab,答案都是不同,請問為什么?
A:Python是以縮進區分代碼塊的。一個tab屬于for執行語句,兩個tab屬于if里面執行語句
Q 34 :我沒弄明白,把同學但作業拿來照抄,為什么和同學打一樣但編碼也會出錯啊?搞的我心力憔悴。?
A:print 對齊 for ,逗號全英文
以上內容整理來源于新生大學討論區和作業區,若有誤請各位指正!
第二課作業同學們開始漸漸上手,有同學可以用兩種或者兩種以上的語法來解題,我返回去看了下自己的作業,只交了第一題。。。慚愧啊!