2017年6月26日 星期一

[Python]From-(forget date)-To-20170626

說好要學的Python呢?

是的,從以前就說要學,但是太懶就沒動。終於在最近開始動手看著教學一步步學習,學習
最好的一個方法就是把自己的學習歷程寫出來,方便日後有一個參考。恩?那我現在再做什
麼?沒錯,我就是在寫學習歷程,說來慚愧,知道要寫但一直在學python,有心得也忘了補
上,只好現在亡羊補牢。


寫在前面,本網誌基本上,你應該很難看到有什麼新發現之類,畢竟Python的官方文件都寫
得很清楚,但我還是會貼一些我自己寫的東西,不過第一篇文章我還事先統整我到目前為只學習的Python的心得筆記,這是簡潔籠統的。

個人用,但也歡迎提出意見一起學習


~20170626

System: Mint Linux(VmWare)
Python version: version3
Python tutorial web : liaoxuefeng.com ( I' m very thanks it)

(環境安裝 / Linux 相關使用方法請自行搞定)

Python note:

1. 
Python 是直譯方式執行程式,走到那才執行到哪邊(跟網頁有點類似..),因此Python是"執行"時候才會爆出問題,跟C/C++/Java不太一樣,這三者可以透過編譯先告知錯誤。

2.
Terminal模式下的Python,是交互方法執行Python,當然也可以寫成檔案後(XXXX.py),注意副檔名".py",透過Python3 XXXX.py執行,檔案跟Terminal不同的地方在於:前者會一次執行,後者輸入一行就解釋一行,後者適合學習使用,前者則是開發。

Note : Python3 XXXX.py的意思是透過Python3編譯器執行XXXX.py,但是過往的Python1.2則是Python XXXX.py,不須要加"版本編號",因為Python3改了很多東西,為了區別跟1.2版的不同,特地用這方式。對了,如果你堅持用Windows下安裝Python運行,執行的cmd是不一樣,請自行處理,本文不描述

3.
關於輸出:

a.print('hello,'world') #hello world - python透過"," 分隔,輸出時會變成空白字元,對,字串使用' 單引號進行處理,不過"也可以,基於官方用單引號,這邊還是以單引號為主

b.python 註解使用"#",編寫使用Tab進行縮排(default 4 space)

c.需要使用特定字元包含在輸出中,可以使用"\"在要輸出的文字之前,特殊字元其實跟C/C++等語言一樣

4.
'''...'''需要顯示多行時可以使用,在交互氏看起來會像是


.







但是寫成檔案的話,將 ">>>"去掉就可以

5.
Python在string上的處理有點不同,舉個例子
   a='string1'
   b=a
   a='abcd'
  pritn(a) #abcd
  print(b) #string1
 關於解釋可以參考:點這

6.
"/" 符號用在除法有不同的意思: 單 / 除出來的數字會是浮點數, // 則是整數(永遠),要取餘數的話跟C/C++一樣,掛 "%"就好

7.
'ABC'.encoder('ascii') # b'ABC' ,掛b表示變成bytes形式
    ' 中文'.encoder('u-tf8') #b'\xe4\xb8\xad\xe6\x96\x87' ,中文字是兩byte表示一個字,但有6byte阿?空格阿..空格算一個字元。
   不過中文請勿使用ASCII進行encode,會解不出來

8. 
b'ABC' .decode('ascii') # 'ABC' 用ascii 進行解碼,還原罷了

9.
進行檔案編寫,Python3請用utf-8處理,方法是在最前面加上這兩行:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

10. 
python一樣可以跟C相同,進行字串的格式化處理
%d int
%f float
%s string
%x hex value

ex: 'Hello, %s' % 'world' # 'Hello, world' , 注意格式化字串不是用","隔開,而是用"%"
另外,如果不確定該用什麼格式,用%s就對了,永遠有效

11.
list - 有序集合 : 可以任意添加任何的數值,想同頭尾開開的array就好
list的宣告 : L=[x,y,z]
tuple - 有序集合:不同的地方在tuple宣告完畢(包含數值),就無法在變更裡面的內容
tuple的宣告 : t=(x,y,z)
tuple在定義只有一個元素的時候,要宣告成: t=(1,),注意
這樣一來,print(t) 就會顯示(1,)

12.
tuple其實有一個可變得方法,但需要使用到list包含在tuple中,原理其實就是改變list的內容,.....?tuple的內容不是不能變嘛?但我今天改的是list阿?tuple裡面有放list可以改?可以,但其實這算偷雞啦,為了系統的安全還是不要這樣搞吧

t = ('a', 'b', ['A', 'B'])
t[2][0] = 'X'
t[2][1] = 'Y'
print(t)  #('a', 'b', ['X', 'Y'])

想想list的特性吧

13
dict ,辭典,有用jave或者C#的對字典的資料表示不陌生(C++好像也有?)
就是key:value的組合
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
字典就是速度快,缺點就是浪費空間(因為你比人家多key,多佔兩倍空間)

14
set其實跟dict很類似,但是set有自動過濾重複value的功能,類似dict中key不能重複的,所以set其實是保存key,但實際上使用你不太需要去瞭解這方面,另Set沒有排序功能,所以大量set element時,每次輸出的順序有可能不同
s = set([1, 1, 2, 2, 3, 3])
print(s) #{1,2,3}
注意,Set經過print後,是用{}顯示,跟輸入時不同

set可以做and/or的運算喔
s1 = set([1, 2, 3])
s2 = set([2, 3, 4])
print(s1 & s2) #{2, 3}
print(s1 | s2) #{1, 2, 3, 4}

整理: list使用[],tuple使用(),字典使用{}

15.
from (filename but no sub name) import (function name) 引用自寫python function時,需要宣告這一串

16.
power(x) / power(x, n) : 位置參數,宣告使用該參數時候一定至少要有對應的input,前者要一個,後者要兩個,Power(x, n=2):其中n有先定義,這是默認參數。這表示使用的時候不輸入第二個參數的話,自動使用預設值2處理,定義一個function:
def power(x, n=2):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

result=power(5)
print(result) # 25

但如果是
result=power(5,3)
print(result) # 125
當使用者需要修改輸入的階層數的話

Note:當傳入的是一個list的話

def add_end(L=[]):
    L.append('END')
    return L

result = add_end([1, 2, 3])
print(result) #[1, 2, 3, 'END']

傳入空值 :
result = add_end()
print(result) #['END']

但是在乎叫一次的話就變成
result = add_end()
print(result) #['END','END']

那是因為L跟[]其實都是變量,相當於b=a這樣的安排,所以[]有變化,L就會變化,避免這情況的話,要改寫成為

def add_end(L=None):
    if L is None:
        L = []
    L.append('END')
    return L

result = add_end()
print(result) #['END']

result = add_end()
print(result) #['END']

17. 可變參數

def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum

加個* 表示cale接收到的numbers是一個tuple形式的參數

EX:
nums = [1, 2, 3]
calc(*nums) #可以寫成這樣

18.
關鍵字參數
def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)

注意 **kw ,它傳進來的是一個dict,字典

EX:
print(person('Michael', 30)) #name: Michael age: 30 other: {}

print(person('Bob', 35, city='Beijing')) #name: Bob age: 35 other: {'city': 'Beijing'}
print(person('Adam', 45, gender='M', job='Engineer')) #name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}

不過除了可以直接傳參數進去,也可以先在外面組成字典後再傳進去

extra = {'city': 'Beijing', 'job': 'Engineer'}

person('Jack', 24, city=extra['city'], job=extra['job']) #name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

關鍵字參數另外一個作用就是,可以在函數中判斷進入的關鍵字是否包含指定的value

def person(name, age, **kw):
    if 'city' in kw:
        # 有city
        pass
    if 'job' in kw:
        # 有job
        pass
    print('name:', name, 'age:', age, 'other:', kw)

19.
命名關鍵字

這是用來限制使用者一定要輸入指定的參數

def person(name, age, *, city, job):
    print(name, age, city, job)

其中 * 一定要寫,而 * 後面的參數就是使用者一定要輸入的參數

EX :
person('Jack', 24, city='Beijing', job='Engineer') #Jack 24 Beijing Engineer

Note :

Python的函數可以將上面提到的關鍵字全部整合在一起,但是,有順序:
必選參數、默認參數、可變參數、命名關鍵字參數和關鍵字參數。



沒有留言:

張貼留言

[Python] Partial function

在Python中有許多偏函數( Partial function)可以使用,常見的就是string的轉換 ex : int('50') #50 這個例子就是把string type的50轉換成int的50,而且是10進制 那好,問題來了,能不能變成8...