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的成員