1. 程式人生 > >python學習筆記 ----- day1

python學習筆記 ----- day1

python 3 中預設為使用utf-8編碼方式,但是python 2則使用ASCII。

'''  '''  可以用來多行註釋,也可以用來寫多行字串。

Input()函式

在python 2.x中有raw_input() 和 input() 兩種輸入,在python 3.x中把raw_input() 和 input()整合成了一個函式,

就是input()函式。

python 3.x 中 ,input()接受任意的輸入,預設為字串處理,並返回字串型別。

在 2.x的input()在輸入時必須原樣輸入,如果想輸入字串asdfg,就必須輸入“asdfg"。(方法雞肋)

python的

分為標準庫和第三方庫。可以直接匯入的庫是標準庫,而第三方庫必須要下載安裝才可以用。

標準庫例如sys,os等。

記錄兩個os中的函式: 

# 獲取當前目錄下的檔案
cdm_res = os.system("dir") #執行命令不儲存結果
cdm_res = os.popen("dir").read()#獲取當前目錄儲存在cdm_res總中
print("--->",cdm_res)
# 在當前目錄建立目錄
os.mkdir("new_dir")

pyc是個什麼東西?

編譯型語言就是執行程式的時候把程式轉換成機器語言,然後執行。比如c語言,.c -> .exe

解釋型語言就是沒有編譯,直接執行,在執行的時候直譯器對程式進行逐行的解釋,執行。(類似於邊執行邊編譯)

java是通過編譯器變成“中間編碼”,然後執行的時候在利用直譯器進行逐行的翻譯。(先編譯後解釋)

python與java是類似的,只是python不用手動編譯,編譯的過程對使用者是透明的。PyCodeObject是程式編譯後的結果,當python執行完是,直譯器將PyCodeObject寫回pyc,當第二次執行的時候直接執行pyc檔案,不用再次編譯的。pyc是預編譯後生成的一個位元組碼檔案。

資料型別

整型:在python 2.x中會分為長整型和短整型,儲存一個數字如果超過短整型時會自動存為long。

但是python3.x中並沒有區分,都是int型。

浮點數:表示形式為小數。52.3E4 = 52.3 * 10 ** 4 。還可以表示複數,j表示虛數

布林值:真或假  /  Ture and False 

bytes型別:在python3中文字和二進位制有明顯的區分。文字總是unicode,由str型別表示,二進位制資料則是用bytes型別表示。

檔案也可以用位元組包來表示,那麼字串和字元包能夠相互轉換,str -> bytes 使用encode。bytes -> str 使用decode。

msg = '我愛天安門'
print(msg)
print(msg.encode())
print(msg.encode().decode())

結果:
我愛天安門
b'\xe6\x88\x91\xe7\x88\xb1\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8'
我愛天安門

encode(),decode()在python3中預設為utf-8編碼

在python3中資料的傳輸必須以二進位制的形式傳輸,所以在socket傳輸資料的時候可能會用到二進位制和字串的轉換。

三元運算

result = a1 if a1>b else a2

如果if後面的式為真,結果為a1 ,為假則結果為a2。
 

列表:name = [ ]

按位置取 name[n],取name中的第n個元素。列表的切片:name[a:b] 取name中的[a,b)左閉右開。

插入 name.insert() 或者 .append(),刪除name.remove() 或者 del name[a] 或者 name.pop()。pop預設刪除最後一個。

查詢位置 name.index("aaa") ,返回aaa的下標。統計 name.count()  清空 .clear()  翻轉 .reverse() 排序 .sort() 按照ASCII 。合併 .extend()

淺copy : 可以想象成只copy了第一層的資料。

import copy
person = [1,5,8,9,8,5,7,[881,400]]
# 淺copy的三種形式
p1 = person.copy()
p2 = person[:]
p3 = list(person)
person[0] = 500
person[7][0] = 5000
# p1[1][1] = 50
print(person)
print(p1,"\n",p2,'\n',p3)
結果:
[500, 5, 8, 9, 8, 5, 7, [5000, 400]]
[1, 5, 8, 9, 8, 5, 7, [5000, 400]] 
 [1, 5, 8, 9, 8, 5, 7, [5000, 400]] 
 [1, 5, 8, 9, 8, 5, 7, [5000, 400]]

如果直接用“=”來複制的時候:完全相同

import copy
person = [1,5,8,9,8,5,7,[881,400]]
# 直接等號
p1 = person
person[0] = 500
person[7][0] = 5000
# p1[1][1] = 50
print(person)
print(p1)
結果:
[500, 5, 8, 9, 8, 5, 7, [5000, 400]]
[500, 5, 8, 9, 8, 5, 7, [5000, 400]]

深copy : 完全獨立的兩個列表,佔用兩份的空間地址

import copy
person = [1,5,8,9,8,5,7,[881,400]]
# 深copy
p1 = copy.deepcopy(person)
person[0] = 500
person[7][0] = 5000
# p1[1][1] = 50
print(person)
print(p1)
結果:
[500, 5, 8, 9, 8, 5, 7, [5000, 400]]
[1, 5, 8, 9, 8, 5, 7, [881, 400]]

元組:和列表差不多,但是一旦建立就不可以更改,又叫做只讀列表。name = ()

函式: name.isdigit() 判斷變數是否為數值。enumerate(name) ,把列別的下標取出後與列表打包在一起

字串處理相關函式:

name.capitalize()  -----  首字母大寫

name.count("a")   -----  統計數量

name.center(50,"-")  ------  列印50個字元,不足位用”-“補足

name.endswith("ex")  ---- 判斷是否為”ex"結尾,返回Ture 或者 False

name.expandtabs(tabsize=30) --- 用30個空格代替tab

name.find("y") ----- 返回字母y所在的下標

name.format()  --- 格式化輸出

name.format_map()  -----  傳入一個字典,和format作用一樣。

name.isalnum() ---- 判斷是否只有字元和數字

name.isalpha()  ---- 判斷是否只包含字元

name.isdigit() ---- 判斷是否為整數

name.isidentifier() ---- 判斷是否為合法識別符號

 name.isnumeric() ----- 判斷是否只包含數字

name.isspace() ---- 判斷是否為空格

name.istitle()  ----  判斷是否每個首字母大寫

name.isprintable() ----- 是否可以列印,例如tty file ,drive file不可列印

“+“.join(sequence)  -----  用”+“連線sequence中的每個元素

name.ljust(50,"-")  ------  不夠50位在最後用“----”補足

name.rjust(50."*") ----- 不夠50位在最前面用***補足

name.lower() -----  變為小寫

name.upper() ----- 變為大寫

name.strip() ----- 去掉兩邊的空格和回車

name.lstrip() ---- 去掉左邊的空格和回車

name.rstrip() ---- 去掉右邊的空格和回車

p = str.maketrans("abcdef","12356")      name.translate(p)  ----- 把name中的'abcdef' 換成對用的 ’123456‘

name.replace("l","L",1)  ---- 用第二個字元代替第一個字元,第三個數字代表替換的數量。

name.split() -----  把字串按照空格分隔變成列表。預設為空格,可以改成按照其他字元分割

name.splitlines() --- 按照換行符分隔

name.swapcase()  --- 倒置字串

name.title() ---- 變成一個title,首字母大寫

name.zfill()  ---- 不足位用0補足

字典:字典是無序的。且字典沒有下標,是通過key值索引。所以key必須是唯一的。

# key - value
info = {
    'stu1101':"zzhang",
    'stu1102':"yyang",
    'stu1103':"qqqang",
}

修改或增添的時候直接賦值:(如果key存在直接修改,如果key不存在則新增一個)

info['stu1101'] = "iiiuys"
info['stu1104'] = 'hahahaha'
print(info)
結果:
{'stu1101': 'iiiuys', 'stu1102': 'yyang', 'stu1103': 'qqqang', 'stu1104': 'hahahaha'}

刪除:info.pop("key")  隨機刪除:info.popitem()  查詢: info["key"] (要確定字典中有這一項) info.get() 可以查詢,如果沒有就返回None

判斷是否存在:’key' in info  存在返回true,不存在返回false

info.value() --- 所有value的值

info.key() ---- 所有的key

info.setdefault() --- 如果存在返回其值,不存在則建立一個新的項。

info.update(b) ---  把兩個字典合併,有交叉部分就更新,無交叉部分就建立。

info.fromkeys()  --- 初始化一個字典,並賦一個初始化的值。(類似淺copy,一個修改全部修改,除非只有一層)

字典的迴圈:

info = {
    'stu1101':"zzhang",
    'stu1102':"yyang",
    'stu1103':"qqqang",
}
for i in info:
    print(i,info[i])

# for k,v in info.items():
#     print(k,v)

結果:
stu1101 zzhang
stu1102 yyang
stu1103 qqqang

info.items()  ---- 以列表返回可遍歷的(鍵,值)元組陣列。

k = info.items()
print(k)

結果:
dict_items([('stu1101', 'zzhang'), ('stu1102', 'yyang'), ('stu1103', 'qqqang')])

集合:去重合並,關係測試。集合也是無序的。

集合的建立:

list_1 = [1,2.4,5,4,8,6,1,7,8]
list_1 = set(list_1)
print(list_1,type(list_1))
結果:
{1, 2.4, 4, 5, 6, 7, 8} <class 'set'>

兩個集合的交集:list_1 & list_2

list_1 = [1,2.4,5,4,8,6,1,7,8]
list_1 = set(list_1)
list_2 = set([1,8,54,69,4])
print(list_1.intersection(list_2))
結果:
{8, 1, 4}

並集:list_1 | list_2

print(list_1.union(list_2))
結果:
{1, 2, 4, 5, 6, 7, 8, 69, 54}

差集:list_1 - list_2

print(list_1.difference(list_2))
結果:
{2.4, 5, 6, 7}

子集關係判斷:

print(list_1.issubset(list_2))#判斷2是否是1的子集
print(list_2.issuperset(list_1))#判斷1是否是2的父集

對稱差集:  list.symmetric_difference() -----  去掉交集的並集  list_1 ^ list_2

list.isdisjoint() ---- 判斷交集是否為空,空返回true 。

基本操作:集合中無法插入,只能新增。

新增:t.add()   新增多項:t.update([1,2,3,4,5])  長度:len(a)   

刪除:t.remove() t.pop()【隨機刪除並返回】  t.discard() 刪除指定的值並返回

x in a  --- 測試x是否是a的成員   x not in a ---- 測試x是否不是a的成員