標籤:溢出 ble 問題 ram ctr lin apc nta min
Python基礎使用者輸入
username = input(‘請輸入使用者名稱:‘)
pyc到底是什嗎?
Python和Java和C#一樣,都是基於虛擬機器的語言,當我們用Python hello.py的時候,就是告訴虛擬機器我要開始工作了,虛擬機器在解釋之前,第一項工作是編譯,編譯的結果儲存在記憶體的PyCodeObject中,當Python程式運行結束後,Python解譯器則將PyCodeObject寫回到pyc檔案中,當python程式第二次運行時,首先程式會在硬碟中尋找pyc檔案,如果找到,先對.pyc檔案和.py檔案的最近一次的修改時間進行判斷,如果.pyc檔案的修改時間晚於.py檔案,說明.py檔案中的原始碼未修改過,則直接載入,否則就重複上面的過程,所以我們應該這樣來定位PyCodeObject和pyc檔案,我們說pyc檔案其實是PyCodeObject的一種持久化儲存方式。
###三元運算子
result = ‘yes’ if username == ‘kernel’ else ‘no’
Python資料類型
字串
不可更改
str.capitalize() 首字母大寫
str.casefold() 大寫全部變小寫
str.upper() 轉換成大寫字母
str.lower() 轉換成小寫字母
str.swapcase() 大小寫反轉
str.title() 每個單詞的首字母大寫
str.center(index:總長度,str:前後填充的字元) 內容置中
str.encode() 將字串編碼成buytes格式
stt.count(‘kernel‘) 統計kernel在字串中出現的次數
str.endswith(‘kernel‘) 判斷字串是否以kernel結尾
‘kernel\t‘.expandtabs(index) 輸出kernel,將\t轉換成多長的空格
列表
列表是我們最以後最常用的資料類型之一,通過列表可以對資料實現最方便的儲存、修改等操作
定義列表
names = [‘tom‘,‘amy‘,‘jack‘]
切片
names[1:3] 擷取下標1-3的值,包括1,不包括3
names[:3] 從頭開始取
names[::2] 切片的步長
names[:-1] 擷取最後一個值
追加
names.append(‘dawei‘)
插入
names.insert(2,‘dawei‘)
刪除
names.pop() 刪除最後一個元素
names.remove(‘amy‘) 刪除指定值的元素
del names[1] 刪除指定索引上的元素
修改
names[1] = ‘lack‘
擴充
number = [1,2,3]
names.extend(number)
names=[‘tom‘,‘amy‘,‘jack‘, 1, 2, 3]
拷貝
names_copy = names.copy()
只能拷貝嵌套列表的第一層列表,如果想拷貝嵌套列表需要使用copy模組的deepcopy()
統計
names.count(‘tom‘)
排序&翻轉
names.sort()
names.reverse()
擷取下標
names.index(‘tom‘)
- 元組
元組一旦建立,無法更改,也叫唯讀列表
定義元祖
names = (‘tom‘,‘jack‘,‘amy‘)
統計
names.count(‘tom‘)
擷取下標
names.index(‘tom‘)
- 字典
字典一種key - value 的資料類型,使用就像我們上學用的字典,通過筆劃、字母來查對應頁的詳細內容,無序且鍵是唯一的
定義字典
info = {
‘stu1101‘: "tom",
‘stu1102‘: "amy",
‘stu1103‘: "jack",
增加
info[‘stu1104‘] = ‘dawei‘
刪除
del info[‘stu1101‘]
info.pop(‘stu1101‘)
info.popitem() 隨機刪除
修改
info[‘stu1101‘] = ‘lanlan‘
尋找
info.get(‘stu1101‘) 如果存在傳回值,如果不存在返回-1
info["stu1104"] 如果存在傳回值,如果不存在報錯
其他
info.values()
info.keys()
info.setdefault("stu1104","dawei")
info.item()
- 集合
集合是一個無序的,不重複的資料群組合,去重,關係
定義集合
s = set([1,2,3,4])
t = set(‘hello‘)
交集
b = s |t
s.union(t)
並集
b = t & s
s.intersection(t)
補集
b = t - s
s.difference(t)
差集
b = t ^ s
s.symmetric_difference(t)
添加
t.add(‘h‘)
t.update([1,2,3])
刪除
t.remove(‘h‘)
其他
x in t 判斷x是否在集合t中
x not in t 判斷x是否不再集合t中
s.issubset(t) 判斷s是否是t的子集
s.issuperset(t) 判斷t是否是s的自己
s.copy() 淺複製
檔案
開啟檔案、
f = open(‘filename‘,‘r‘) 需要手動關閉檔案
with open(‘filename‘,‘r‘) 自動關閉檔案
r 唯讀
w 唯寫,先清空資料,寫入
x 如果檔案存在,報錯,如果不存在,建立並寫入資料
a 追加
b 二進位方式開啟
(+) 可讀可寫
- 操作檔案
f.read() 讀取全部資料
f.seek(0) 調整遊標位置
f.tell() tell當前指標所在的位置(位元組)
f.write(‘‘) 寫入資料
f.flush() 重新整理緩衝區
f.fileno() 檔案描述符
f.readable() 判斷是否可讀
f.readline() 讀取一行
f.truncate() 清空遊標後面的資料
- 關閉檔案
f.close()
函數
定義
def xxx():
函數體
def xxx():
pass
傳回值
return 傳回值,如果沒有指定return,則返回None
參數
普通參數def information(anem,age):passinformation(‘kernel‘,21)指定參數def infoemation(name,age): pass information(name = ‘kernel’,age = 21) 預設參數 def infoemation(name,age,addr = ‘山東’): pass information(‘kernel’,21)動態參數 def infoemation(*args,**kargs): pass
變數範圍
函數內部聲明的變數叫局部變數,函數體外部聲明的變數叫全域變數
局部變數的生命週期是函數體結束,全域變數的生命週期是程式結束
全域變數
全域變數範圍是整個程式,當局部變數與全域變數同名時,局部變數起作用,如果想使用全域變數,需要聲明global 全名變數名
- 遞迴
必須有一個明確的結束條件
每次進入更深一層遞迴時,問題規模相比上次遞迴都應有所減少
遞迴效率不高,遞迴層次過多會導致棧溢出
data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]def binary_search(dataset,find_num):if len(dataset) >1:mid = int(len(dataset)/2)if dataset[mid] == find_num: #find itprint("找到數字",dataset[mid])elif dataset[mid] > find_num :# 找的數在mid左面print("\033[31;1m找的數在mid[%s]左面\033[0m" % dataset[mid])return binary_search(dataset[0:mid], find_num)else:# 找的數在mid右面print("\033[32;1m找的數在mid[%s]右面\033[0m" % dataset[mid])return binary_search(dataset[mid+1:],find_num)else:if dataset[0] == find_num: #find itprint("找到數字啦",dataset[0])else:print("沒的分了,要找的數字[%s]不在列表裡" % find_num)binary_search(data,66)
匿名函數
f = lambda a,b: a+b
result = f(2,3)
內建函數
abs() 絕對值
all() 參數為一個可迭代的資料類型,如果全為真,返回真
any() 同上,有一個為真就是真
bin() 接收十進位,轉換成二進位
oct() 接收十進位,轉換成八進位
hex() 接收十進位,轉換成十六進位
bytes() 接收字串和編碼類別型,轉換成位元組
str() 接收字串和編碼類別型,轉換成字串
callable() 檢測函數是否可以被調用
chr() 將整型轉換成字元
ord() 將字元轉換成整型
compile() 將字串編譯成Python代碼
exec() 執行Python代碼
eval() 將字串變成運算式並執行
help() 查看協助
divmod() 返回一個包含商和餘數的元祖
isintance() 判斷對象是否是一個類的執行個體
issubclass() 判斷某個類是否是一個類的子類
filter() 接收一個函數和一個可迭代的對象,迴圈可迭代對象並執行函數,函數返回true,將元素添加到結果中
map() 接收一個函數和一個可迭代的對象,迴圈可迭代對象並執行函數,將函數傳回值添加到結果中
zip() 接收多個列表,將多個列表相同位置的元素組合成一個元組
物件導向
(Object Oriented Programming,OOP,物件導向程式設計)對函數進行分類和封裝,此編程方式需要使用 “類” 和 “對象” 來實現,所以,物件導向編程其實就是對 “類” 和 “對象” 的使用
迭代器
可以被next()函數調用並不斷返回下一個值的對象稱為迭代器,產生器都是Iterator對象,但list、dict、str雖然是Iterable,卻不是Iterator,把list、dict、str等Iterable變成Iterator可以使用iter()函數
產生器
建立一個包含100萬個元素的列表,如果僅僅需要前面的幾個元素,那後面的元素所佔用的空間就浪費了,在Python中,有一種可以邊迴圈,邊計算後面元素的機制,成為產生器,產生器就是一個具有建立資料能力的一個對象
裝飾器
@+函數名
功能:
自動執行outer函數並且將f作為參數傳遞
將outer函數的傳回值重新賦值給f
def outer(func):def inner(*args,**kwargs):print(‘before‘)ret = func(*args,**kwargs)print(‘after‘)return retreturn inner@outerdef f(msg):print(msg) f(‘kernel!‘)
反射
利用字串的形式去模組中操作成員
hasattr() 接收一個對象和一個字串成員名 ,如果找到返回Ture,如果沒有找到返回False
getattr() 接收一個對象和一個字串成員名,如果找到返回成員,如果沒有報錯
setattr() 接收一個對象和一個字串成員名,並設定成員
delattr() 接收一個對象和一個字串成員名,如果刪除成功就返回True
異常
- 異常基礎
while True:try: print(int(input(‘num1:‘))+int(input(‘num2:‘)))except Exception as e: print(e)
常用異常
AttributeError 試圖訪問一個對象沒有的樹形,比如foo.x,但是foo沒有屬性x
IOError 輸入/輸出異常;基本上是無法開啟檔案
ImportError 無法引入模組或包;基本上是路徑問題或名稱錯誤
IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊
IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]
KeyError 試圖訪問字典裡不存在的鍵
KeyboardInterrupt Ctrl+C被按下
NameError 使用一個還未被賦予對象的變數
SyntaxError Python代碼非法,代碼不能編譯(個人認為這是語法錯誤,寫錯了)
TypeError 傳入物件類型與要求的不符合
UnboundLocalError 試圖訪問一個還未被設定的局部變數,基本上是由於另有一個同名的全域變數,
導致你以為正在訪問它
ValueError 傳入一個調用者不期望的值,即使值的類型是正確的
- 異常的其他結構
try:# 主代碼塊passexcept KeyError,e:# 異常時,執行該塊passelse:# 主代碼塊執行完,執行該塊passfinally:# 無論異常與否,最終執行該塊pass
- 主動觸發異常
try:raise Exception(‘主動觸發‘)except Exception,e:print e
- 斷言
assert 條件
利用字串的形式去匯入模組
obj = import(‘manager‘)
obj = import(‘lib.manager‘) 預設情況下只能匯入到lib
obj = import(‘lib.manager‘,formlist=True) 即允許模組名使用拼接
Python中的特殊變數
- doc py檔案的文檔注釋
- cached 匯入模組的pyc檔案的路徑
- file 當前運行檔案的所在的路徑
- package 檔案隸屬與哪個包
- name 只有當前檔案的name == ‘main‘
Python基礎總結