有點子隨時更新

目前分類:2019-Python(從寫程式到脫離菜雞的歷練) (8)

瀏覽方式: 標題列表 簡短摘要

介紹完stdio,接著就進入複雜stdio與檔案間的處理層級~

---

strip 用法

stdio的輸入輸出或方法都是sys套件已經寫好的,那要如何從外加功能讓stdio 可以多一點彈性;且可以外加功能改變他的方法?

strip 效果 指向
strip 移除指定開頭及結尾的字元 開頭及結尾
rstrip 移除右邊指定的字元 結尾
lstrip 移除左邊指定的字元 開頭
  • 值得注意的是:刪除指定字元要注意指向是否有掃描到 因為此方法的刪除是依據指標來掃描刪除的
  • 另外:假如沒給任何值就是刪除控制符 ( asciiCode 0x20以下控制碼)

Ex:(玩玩strip)

a = "0987321456aaa9870156423"
b = "\n\n \n\n\n  \r\r\n\r   \r\t\a\a \a\a\t\r"
#
print(a)
print(a.strip("0123456789"))
print(a.strip("123456789"))
print(a.strip("0123456"))
print(a.strip())
print(b.strip())
#
print(a.rstrip("0123456789"))
#
print(a.lstrip("0123456789"))
  • 補充:map() 用法
    如果要從多個陣列或位置擷取資料 , 當然可以用a[x] 方法把需要的資料抓取到指定位置,但有時要做批次處理的話就顯得太”雞肋”了。 所以只要是牽扯批次處理的(讀,寫,改變結構…) 就可用此方法:
list = map("方法" , "目標資料組")
#下面較常用
'object' = list(map("方法" , "目標資料組"))

簡單的例子:

lia = { 1 , 2 , 3 , 'apple' , '[}@#$%'}
print(list(map(str , lia)))

最好用的地方在於..方法可放函數(def) 也可放class(物件導向會在談)

def procs(x,y,z):
    return x+y+z
lista = [1,3,5,7,9]
listb = [2,4,6,8,10]
listc = [100,100,100,100,100]

print(list(map(add,lista,listb,listc)))

好滴 現在可以改變stdio的方法讓他更有彈性
Ex:(stdio檔案內)

文章標籤

walley_yu(小雨) 發表在 痞客邦 留言(0) 人氣()

但stdio畢竟只是檔案流,無法作跨檔案的io。所以必須配合資料流(DF),就可以形成一種跨檔案處理。
提醒:牽扯到跨檔案處理,編輯器建議用vsCode喔~


有兩個檔案:

a.py
b.py

開始實作跨檔案stdio吧~~

  • a.py stdin , b.py stdout

#a.py
import sys
import os
import time
ton = time.time()
fb = open('b.py', 'w')  # 預設為寫入
fb.write("import sys , os \n")
fb.write("sys.stdout.write('hi')")
fb.close()  # 關閉 fb(b.py) 的編輯
toff = time.time()
time.sleep(toff-ton)  #計算執行時間
os.system("python b.py")

這裡的open函數可以建立檔案,更深入以後os套件會談到。
這程式碼可透過一些os套件的方法,讓a.py去執行b.py。 你會發現,如果透過土法鍊剛的stdio,都會很講求執行時間。因為調用b.py也須等到b.py執行完畢才可單獨調用(stdio不能同時執行,而是按步驟串列執行)。

  • 緩衝區的寫入:
sys.stdout.flush()
fname.flush()

stdout本身是有緩衝區的,印出的資料可看成一次性輸出。就好像匯流排一樣,無法負荷的資料先存入快取,等輸出時在一次拿取。

文章標籤

walley_yu(小雨) 發表在 痞客邦 留言(0) 人氣()

Import 的運作:

C語言有include,python就有import (雖然處理不像c嚴謹 ex:優先執行 # ) 但基本上import 引入函式庫(library)的功能就足夠了,所以import的功能就是把丟在library的套件或在此目錄的套件給import 進來:

  • 引入套件或函式的方法
    設xxx是套件名稱;yyy 是套件裡某個函數或物件
    import的各種用法:
  1. import xxx
    一般的用法
  2. import xxx as ooo
    有時候套件名稱太長就可以用此來簡化
  3. from xxx import yyy
    有時候整個套件只要某個屬性或類別而已 就可用此引入xxx套件的yyy
  4. from xxx import *
    如果要把全部屬性都引入的話 就用此方式
----------------------------------------------------------------------------------------------

Sort()

Python中,如果想簡單做個排序。直接用他排數列在方便不過了 , 甚至可用它來排折線圖大小
Ex1:(sort陣列數列)

#Ex1
a = [15,56,78,46,1,5]    #數字排列
b = ['ad' , 'cc' , 'bst' , 'zero' , 'fause' , 'google']    #字首排列
c = [(15 , 'google') , (56 , 1) , (948276 , 'KQGHT')]    #混和排列
a.sort()
b.sort()
c.sort()
print(a ,'\n',b ,'\n',c)

Ex2:(sort折線圖)

import matplotlib.pyplot as ptm
l_x = [8,48,66,18,25,96,11] 
l_y = [15,5,50,35,60,95,25]
l_x.sort()
l_x.sort()
ptm.plot(l_x , l_y)
ptm.show()

排序前(醜死了)
https://ithelp.ithome.com.tw/upload/images/20190912/20117399W8iOzGi9Om.png
排序後
https://ithelp.ithome.com.tw/upload/images/20190912/20117399boCPMH0Q2Q.png

qsort()

當然 python 也像c語言一樣可以自己做函式或套件,因為本身sort() 就有很多缺陷(不能排ascii 編碼,只能呼叫字元char) 除了選擇自己做函式。當然可以上網找更快演算法更好的函式來替代。就像買個替代零件,只要看個說明書(套件使用方式) 就可事半功倍呢~
這裡指的qsort() 並不是一個可用的函式,只是純粹表達更快的排列函式 建議可上github 找更好用的函式 https://github.com/search?q=python+sort


文章標籤

walley_yu(小雨) 發表在 痞客邦 留言(0) 人氣()

前面介紹了資料結構 想一定跟資料處理也有關係,因為資料處理包含了:
串並:資料流 , 檔案流處理 ; 樹:資料處理程式及演算法

資料流(DF)

可以解釋為資料的流動 流程,主要是在描述或設計資料是怎麼處理的 雖然畫流程圖時很像樹狀,但他沒有方法的分支 所以也是串並列
https://ithelp.ithome.com.tw/upload/images/20190908/201173997gzq9CCT5k.png

原始圖片:https://www.lucichart.com/pages/data-flow-diagram
------------------------------------------

一般來說 DF流程圖都會用Gane and Sarson居多 因為比較能準確表達

  • Entity:資料的來源(O)或是目的地(I) 可解釋成資料的 I/O
    Entity不能同時存在(ex:如果有兩個Entity,兩者I/O不能互接) 且Entity運作一定要有Process才能做資料儲存
  • Data Store(資料儲存):處理完的資料送至指定位置儲存
    而前面的框框可以表達標示順序,權限或類別 但沒有特殊情況就會當標籤
  • Process(處理工作):資料儲存一定是要經過電腦運算的 所以也可看成資料的方法 但要注意的是一定要有輸入輸出(I/O)
    用法也跟Data Store 的前框差不多 代表順序,權限或類別
  • Data Flow(DF):就是一開始的資料流。資料的流程會有方向,用此來表達

畫出流程圖(網路雲端儲存DF):
https://ithelp.ithome.com.tw/upload/images/20190908/201173996HEGyw4pwk.png


文章標籤

walley_yu(小雨) 發表在 痞客邦 留言(0) 人氣()

Python語言的環境
Anaconda:https://www.anaconda.com/distribution/
VsCode:https://code.visualstudio.com/download
代碼建議用python3,python2跟3語法和結構完全不同

----------------------------------------------------------------------------------------------------------------

檔案流 vs 資料流

資料流畢竟只是形容資料怎麼樣處理(搭配流程圖),但無法實際在程式表達出來。而實際在程式裡處理I/O資料的方法或程式碼 就可稱為檔案流

  • stdin , stdout是啥?
    有寫c語言的朋友對std應該不陌生,std就是標準(standard)的簡寫,何謂標準串流?<wiki解釋>;例如在一個系統環境上的軟體 如果軟體有輸出輸入的textbox。那資料是如何處理並且顯示呢? 那就是透過std的處理把資料放到硬體上,再丟出來輸出
---

在std的世界觀內:
write == 就是寫入
read == 讀取寫入的內容(無法寫入)
print()也是一種stdout(標準輸出),把打進去的內容輸出(顯示)

#等價程式 (S == P)
import sys
S = sys.stdout.write('hello'+'\n') #指標在下一行
P = print('hello')

而stdin也很直觀,就是標準輸入 像python 的input() 就是個標準輸入

#等價程式 (A == B)
import sys
A = input("textbox")
B = sys.stdin.readline()[:-1] #不換行

你可能會想 既然python內建函式那麼方便 為何還需要std? 因為有些軟體會有按鈕 , 提示框… 都屬物件的一種,而 input() 本身也有方法 屬性,如果只想給個方法(如:sys.stdin.readline)單純輸入,使用stdio 比較推薦 重要的是能做跨文件或環境的I/O

  • stderr (標準錯誤輸出)
    這個可不是單指debug(偵錯或除錯)喔 , 而是一種輸出錯誤內容的方法

debug(意指...)
把程式輸入(stdin)
輸出狀態(stdout)
有錯誤輸出錯誤(stderr)

文章標籤

walley_yu(小雨) 發表在 痞客邦 留言(0) 人氣()

資料結構概論

現代人常都會以電腦來 儲存資料,使用軟體,使用者可能不會去了解其重要性。但如果是it人或這次的目標(提升編寫能力) 就成為處理資料前首先要了解的東西

-----------------------------------------------------------------

資料結構是為了要處理複雜資料關係而衍生出來的名詞,而處理資料就有分處理資料跟運算資料2大部分。瞭解資料結構有助於對程式更了解,也更懂權限的設置觀念 甚至能改善程式架構。(程式碼以python範例)

#p1
print('ex1')
print('ex2')
print('ex3')
print('ex4')
print('ex5')
#p2
for i in range(1,6):
    print('ex%d' %i)

結果兩個都輸出

ex1
ex2
ex3
ex4
ex5

從這兩個可以了解 雖然p1跟p2輸出的結果都相同,但很明顯p1較浪費資源。p1要從記憶體拿資源五次,但p2只要跑完一次迴圈(相當於拿一次就好) 就較省資源。

  • 好處:讓寫程式事半功倍

資料2大結構

講完廢話進入重點~

  • 串並列結構

資料的輸入輸出與讀寫就是一種串並列結構 (像後面會學習到的資料流跟檔案流 只要有流的大概都是串並列結構)
特色: 每個資料執行過程沒有任何關聯 且為單一處理指定的資料,而輸入可為 (記憶體 , 暫存器 , I/O處理)

  • 樹狀結構

不只有程式 資料樹(家族表)也是樹狀結構:
https://ithelp.ithome.com.tw/upload/images/20190907/20117399yHGIjdTuOe.png
只要有判斷或是重複性質的 都可稱樹狀結構
特色: 每個資料雖關聯,但變動資料不直接影響其他資料 就像電腦資料夾下的目錄 , 判別程式…

文章標籤

walley_yu(小雨) 發表在 痞客邦 留言(0) 人氣()

昨天有提到 編譯跟直譯是取決於使用它的方法。但如果更深入的講法,這觀念其實只有對一半 因為這還關係到『本身』語言的特性。像原本python是直譯的 而透過外加的功能改變它原本程式結構,就可像c語言一樣編譯成執行檔直接執行

編譯型語言

一種通過編譯器(compiler)將原始碼編譯成機器碼,透過鏈結或中間代碼將雙邊串聯才能執行的語言。
特色: 編譯器一般會有預編譯的過程對代碼進行優化,所以速度快。但一般來講可移植性較低 因為有些只能在預設的環境才能執行

直譯型語言

直接寫程式就可以不需編譯,但每次要執行都要解釋一遍才能執行。
特色: 有良好的兼容性,可移植到任何環境中執行。前提是必須有解釋器(直譯器或虛擬機器) 但其靈活部署快速仍然是好的選擇

----------------------------------------------------------

靜態語言

一般來說靜態語言都為編譯型語言(有例外),運行時不可改變其結構
主要有 C, C++, basic…

動態語言

一般來說動態語言都為直譯型語言(有例外),運行時可以改變其結構(如新的函數、功能、代碼可以被改變)
主要有 JS, python, c#…

以python 直譯語言舉例,我現在想編譯成java檔案可以嗎? 可以使用jpythonC的編譯器把.py原代碼編成.class即可 又因為它是動態語言 程式結構可被改變(程式概念有點像java的混編),自然代碼也可被引入而不會執行失敗。

文章標籤

walley_yu(小雨) 發表在 痞客邦 留言(0) 人氣()

第 11 屆 iThome 鐵人賽 (2019年) DAY1


在了解程式之前 一定要先了解程式是怎麼交給電腦運作的,我們先從認識程式語言開始:
程式語言的基礎分類如下

高階語言 == (python,java,c++…)
低階語言 == 組合語言(assembly)
機器語言 == 2進制代碼 人類看不懂

何謂寫程式,寫程式是寫讓人看得懂的 因為真正的01機械碼是看不懂的 但如果要讓機器看得懂 就必須要先『翻譯』給電腦看。
而不同語言有合適的翻譯方式 這就取決於不同程度的語言

組譯 A

其實低階語言與機器語言的距離其實很近 是一種與硬體有密切關係的低階語言 像機械碼的000011 就相當於組合語言的add(加) 算是一種直接對應(但不是直譯)的手段,這就是它還可以叫彙編的原因 把全部程式碼一起翻譯。所以,組譯 基本上就是給組合語言翻譯用的
https://ithelp.ithome.com.tw/upload/images/20190905/20117399gdSLNBUFlS.png
...................................................................
為何用虛線分開呢? 因為直譯與編譯才是給高階語言用的 而翻譯方式就不是作對應那麼簡單了 而是把它打散(類似加密)或按照機械碼的語法

直譯 D

這種方法其實跟真正的翻譯員有點像 就是把聽到的語言翻譯成另一人看得懂的 無法一口氣把全部翻譯出來 而且因為此特性加上還需要一個程式替他邊執行邊翻譯 所以速度是最慢的。常見的語言有(JavaScript , Python…)

文章標籤

walley_yu(小雨) 發表在 痞客邦 留言(0) 人氣()

Close

您尚未登入,將以訪客身份留言。亦可以上方服務帳號登入留言

請輸入暱稱 ( 最多顯示 6 個中文字元 )

請輸入標題 ( 最多顯示 9 個中文字元 )

請輸入內容 ( 最多 140 個中文字元 )

reload

請輸入左方認證碼:

看不懂,換張圖

請輸入驗證碼