主頁 > 後端開發 > Python基礎知識學習

Python基礎知識學習

2021-01-24 22:08:39 後端開發

Python基礎知識

建議有程式語言基礎的童鞋閱讀,零基礎閱讀可能會有點費解

點擊下載 python最新版本

文章目錄

  • Python基礎知識
    • 注釋方法
    • 資料型別
    • 輸入和輸出
      • 輸入
      • 輸出
    • 算數運算子
    • 常用運算函式
    • 比較運算子
    • 邏輯運算子
    • 成員運算子
    • 分支
    • 回圈
    • 串列
      • 串列的取值
      • 獲取元素的下標
      • 獲取串列中多個元素(切片)
      • 串列的增刪改操作
        • 增加
        • 洗掉
        • 修改
      • 串列的排序
      • 串列生成式
      • 串列常用函式
    • 字典(物件)
      • 字典的創建方式
      • 字典的常用操作
      • 獲取字典的試圖方法
      • 字典的遍歷
      • 字典的生成式
    • 元組
      • 元組的創建方式
      • 元組的遍歷
    • 集合
      • 集合的創建
      • 集合的常用操作
      • 集合間的關系
    • 字串的常用操作
      • 字串的查詢操作方法
      • 字串的大小寫轉換操作的方法
      • 字串內容對齊操作的方法
      • 字串分割操作的方法
      • 判斷字串操作的方法
      • 字串操作的其他方法
      • 字串格式化操作
      • 字串編碼和解碼操作
    • 函式
      • 函式的定義和使用
      • 函式的回傳值
      • 函式的默認值
      • 函式的引數定義
    • python例外處理機制
      • 例外捕獲
      • 例外捕獲else
      • try...except...else...finally結構
      • python常見的例外型別
    • 類與物件
      • 類的創建
      • 類實體物件
      • 動態系結屬性和方法
      • 面向物件的三大特征
    • 模塊和包
      • 匯入模塊
    • 檔案的讀寫
      • 內置函式open()創建檔案物件
      • 常用的檔案打開模式
      • 檔案物件的常用方法
      • with陳述句(背景關系管理器)
      • 目錄操作 (os 和 os.path)
    • python內置模塊

注釋方法

# 單行注釋
''' 多行注釋 '''

資料型別

關鍵字名稱示例
chr單個字符'', 'd'
str字串(多個chr)'dd', '你好'
int整數1,2,3,4
float浮點數3.1415926
bool布爾Ture, False
list串列[1,2,3,4]
tuple元組('name', 'age')
dict字典{'name':'zzl'}
set集合{'zzl', 'age', 'gender'}

查看資料型別函式
type(變數) 回傳該變數的資料型別

資料型別轉換函式
int(num) 將num轉換為整數型別
float(num) 將num轉換為浮點數型別
bool(num) 將num轉換為布爾型別
str(num) 將num轉換為字串型別

注:

  • int bool float 任何兩種型別都可相互轉換
  • 任何型別都可以轉換為字串

注:

  • str -> int 要求全部為數字
  • str -> float 要求全部為數字,且可存在一個小數點

注:當布林值False轉換為str后, 在轉換為bool會變成True

輸入和輸出

輸入

語法 inp = input('提示文本')

注:輸入結果為str資料型別,如須做其他操作可進行資料轉換

輸出

  1. 默認輸出
print('hello, world')
  1. 占位符輸出
# %s 的s表示變數的資料型別
print('名字:%s,年齡:%s,性別:%s' % (name, age, sex)) 
  1. 推薦使用
print(f'名字:{name},年齡:{age},性別:{sex}')

算數運算子

+ - * / ** // %

前四個同其他編程語言用法相同


** 表示平方計算 5 ** 2 === 5的2次方
// 表示做除運算后取整
% 取余運算

簡寫形式
+= -= *= /= **= //+ %=


注:
+ 也可用于字串拼接
* 當任意一邊為字串時,則表示重復字串

常用運算函式

round(num, count) 表示對num四舍五入,并保留小數點后count位

比較運算子

> < >= <= = !=

常用函式

  • ord(chr) 回傳該chr的ASCII碼(只能為單個字符)
  • chr(num) 回傳該ASCII對應的字符

邏輯運算子

andornot

運算子含義
and真真為真,其他為假(第一項為真則回傳第二項的值,如第一項為假則回傳第一項的值)
or假假為假,其他為真(第一項為真,則回傳第一項的值,如第一項為假,則回傳第二項的值)
not取反

成員運算子

innot in

運算子含義示例
in判斷某字符是否存在于某字串'h' in 'hello'
not in判斷某字符是否不存在于某字串'h' not in 'hello'

分支

單分支

# 注意縮進
if bool運算式:  
    print('執行')  

雙分支

# 注意縮進
if bool運算式:  
    print('執行陳述句1')  
else:
    print('執行陳述句2')

分支嵌套

# 注意縮進
if bool運算式:  
    if bool運算式2:
        print('執行嵌套陳述句')
    else:
        print('執行陳述句1')  
else:
    print('執行陳述句2')

多分支

# 注意縮進
if bool運算式1:  
    print('執行陳述句1')  
elif bool運算式2:
    print('執行陳述句2')
elif bool運算式...:
    print('執行陳述句...')
else: 
    print('如上都不滿足,則執行這條陳述句')

回圈

回圈控制

只能在回圈陳述句中使用,只對距離最近的回圈起作用

break # 跳出本回圈
continue # 結束本次回圈,執行下一次回圈 

while回圈

# 注意判斷條件
while bool運算式:
    print('執行陳述句')

for回圈


# range(start, end, rule) 從start開始,到end-1,間隔為rule,rule的正負表示正序或倒序
# range(1, 11) 輸出1~10,不包括最大值11
# range(1, 11, 2) 輸出1~10,不包括最大值11, 第三個引數表示為每次間隔2
# range(11, 1, -2) 輸出11~2,不包括最小值值1, 第三個引數為負數,則表示為倒序且每次間隔2
# range(5) 簡寫形式,0~5的范圍

for i in range(1,11):
    print(i)

回圈else結構

只有回圈完整執行完畢后,才會執行else陳述句
當回圈程序中執行break陳述句后,else將不執行

# while  
while bool運算式:  
    print('執行陳述句')
else:
    print('while  else陳述句')
    
# for  
for i in range(10):  
    print('執行陳述句')
else:
    print('for  else陳述句')

串列

物件是存盤單個資料的容器,而串列(陣列)就是存盤多個資料的容器,任何資料型別都可以存放

# 字面量創建新串列
lst = [1,'2','三']

# 使用list函式創建新串列
lst = list([1,'2','三'])

串列的取值

  1. 通過索引下標取值
  2. 使用for回圈

獲取元素的下標

  1. list.index(‘元素’) 找不到元素則拋出例外, 可預先使用in方法判斷是否存在

獲取串列中多個元素(切片)

list[start:end:step]
從start索引位置開始,截取到end-1位置結束,步長為step

其中step可為負值,表示從start位置往左邊截取開始

start默認值為0
end默認值為串列長度
step默認值為1

省略引數但 : 必須存在 list[::]

串列的增刪改操作

增加

  • append(item)
    在原有的串列末尾添加一個元素
lst = [10, 20, 30] 
lst.append(100)
print(lst) # [10, 20, 30, 100] 
  • extend( [] )
    在原有的串列末尾至少添加一個元素,添加元素必須是串列(添加多個)
lst = [10, 20, 30] 
lst.extend([99, 100])
print(lst) # [10, 20, 30, 99, 100] 
  • insert(index, item)
    在原有的串列指定位置添加一個元素
lst = [10, 20, 30] 
lst.insert(1, 99)
print(lst) # [10, 99, 20, 30] 
  • 切片添加多個元素(指定位置添加多個元素)
    使用切片把選擇到的元素替換掉
lst = [10, 20, 30] 
lst[1:] = [99]
print(lst) # [10, 99]

洗掉

  • remove(item)
    在原有的串列洗掉一個元素,如果有重復元素只洗掉一個,如果元素不存在則拋出例外
lst = [10, 20, 30] 
lst.remove(20)
print(lst) # [10, 30] 
  • pop(index)
    洗掉指定索引位置的元素,如果指定索引不存在則拋出例外
    不傳index,則洗掉末尾元素
lst = [10, 20, 30] 
lst.pop(1)
print(lst) # [10, 30] 
  • clear()
    清空串列
lst = [10, 20, 30] 
lst.clear()
print(lst) # []  
  • 切片洗掉元素
    使用切片把選擇到的元素替換為空
lst = [10, 20, 30] 
lst[1:] = []
print(lst) # [10]
  • 洗掉串列,即釋放記憶體(謹慎使用)
lst = [10, 20, 30] 
del lst
print(lst) # 會拋出例外, lst is not defined

修改

  • 直接重新賦值
lst = [10, 20, 30] 
lst[1] = 40
print(lst) # [10, 40, 30]  
  • 切片修改(批量修改)
lst = [10, 20, 30] 
lst[1:3] = [40, 50, 60]
print(lst) # [10, 40, 50, 60]  

串列的排序

  • sort()
    在原串列的基礎上排序
    傳入reserse=True降序排序
    傳入reserse=False生序升序
    不傳默認升序
# sotr()  
lst = [9, 3, 2, 8] 
lst.sort()  
print(lst) # [2, 3, 8, 9]  

# sotr(reserse=True)  
lst = [9, 3, 2, 8] 
lst.sort(reserse=True)  
print(lst) # [9, 8, 3, 2]

# sotr(reserse=False)  
lst = [9, 3, 2, 8] 
lst.sort(reserse=False)  
print(lst) # [2, 3, 8, 9]  
  • sorted(lst[,rule ])
    使用內置函式sorted()進行排序,將產生一個新串列物件
    傳入第二引數reserse=True降序排序
    傳入第二引數reserse=False生序升序
    不傳第二引數默認升序
# sorted(lst)  
lst = [9, 3, 2, 8] 
new_list = sorted(lst)  
print(new_list) # [2, 3, 8, 9]  

# sorted(lst, reserse=True) 
lst = [9, 3, 2, 8] 
new_lsit = sorted(lst, reserse=True)  
print(new_list) # [9, 8, 3, 2]

# sorted(lst, reserse=False)  
lst = [9, 3, 2, 8] 
new_lsit = sorted(lst, reserse=False)   
print(new_list) # [2, 3, 8, 9]  

串列生成式

  • [i for i in renge(1, 11)]
    串列生成的運算式
lst = [i*i for i in renge(1, 6)]
print(lst) # [1, 4, 9, 16, 25]

串列常用函式

  • len(list):串列元素個數
  • max(list):回傳串列元素最大值
  • min(list):回傳串列元素最小值

字典(物件)

python的內置資料結構之一,以鍵值對的方式存盤資料,在其他語言中也叫物件,

字典的創建方式

  • info = {'name':'zzl', 'age':18}
  • info = dict(name='zzl', age=18)

字典的常用操作

  • 獲取字典中的元素
info = {'name':'zzl', 'age':18}  

# []方式
print(info['name']) # zzl  
print(info['sex']) # error: keyError 

# get()方式
print(info.get('name')) # zzl
print(info.get('sex')) # None  
print(info.get('sex', '男')) # 如果sex欄位為None的話,則列印 '男' 默認值
  • key的判斷
    in, not in
info = {'name':'zzl', 'age':18}  

# in
print('name' in info) # True  

# not in
print('sex' nor in info) # True
  • key的洗掉
info = {'name':'zzl', 'age':18}  

del info['name'] # 洗掉name欄位
print(info) # {'age':18}

info.clear() # 清空該字典  
print(info) # {}
  • 新增key
info = {'name':'zzl', 'age':18}  
info['sex'] = '男'
print(info) # {'name':'zzl', 'age':18, 'sex':'男'}  
  • 修改key
info = {'name':'zzl', 'age':18}  
info['age'] = 20
print(info) # {'name':'zzl', 'age':20}  

獲取字典的試圖方法

  • keys()
    回傳字典的所有key組成的串列
info = {'name':'zzl', 'age':18}  
keys = info.keys()
print(keys) # ['age', 'name']
  • values()
    回傳字典的所有value組成的串列
info = {'name':'zzl', 'age':18}  
values = info.value()
print(values) # [18, 'zzl']
  • items()
    回傳字典的所有key:value組成的串列
info = {'name':'zzl', 'age':18}  
itmes = info.items()
print(items) # [('age', 18), ('name', 'zzl')]

字典的遍歷

info = {'name':'zzl', 'age':18}  

for item in info:
    print(item,info[item])
# age 'zzl'
# name 18

字典的生成式

items = ['Fruits', 'Books', 'Others'] 
prices = [98, 97, 95] 
d = { item:price for item, price in zip(items, prices) }
print(d) # {'Others': 95, 'Books': 97, 'Fruits': 98}

字典的特點

  1. 字典中的所有元素都是一個key-value對,key不允許重復,value可以重復
  2. 字典中的元素是無序的
  3. 字典中的key必須是不可變物件,(即key不能為變數)
  4. 字典也可以根據需要動態的伸縮
  5. 字典會浪費較大的記憶體,是一種使用空間換時間的資料結構

元組

串列的另一種形式,是不可變序列

元組的創建方式

# 直接用小括號書寫
t = ('python', 'world', '20') 

# 使用內置函式tuple() 
t1 = tuple( ('python', 'world', '20') )

t3 = ('python',) # 如果元組只有一個元素,則在元素后面加上 ,  

# 獲取元組的元素
t[0] # python

元組的遍歷

t = ('python', 'world', '20') 

for item in t:
    print(item)
# python
# world 
# 20

注:

  1. 如果元組中物件本身是不可變物件,則不能再參考其他物件
  2. 如果元組中的物件是可變物件,則可變物件的參考不允許改變,但資料可以改變

集合

python語言提供的內置資料結構
與串列、字典都屬于可變型別的序列
集合是沒有value的字典
集合的存盤是無序的

集合的創建

# 集合的value不能重復
s = {2, 3, 4, 5, 2, 4} 
print(s)  # {2,3,4,5}

# set()函式  
s1 = set(range(6)) 
print(s1) # set([0, 1, 2, 3, 4, 5])

s2 = set([1,2,3,5,6,4,3])
print(s2) # set([1, 2, 3, 4, 5, 6])

s3 = set((1,23,5,32,1))
print(s3) # set([32, 1, 5, 23])

s4 = set('python')  
print(s4) # set(['h', 'o', 'n', 'p', 't', 'y'])

s5 = set({12,4,23,4,12})  
print(s5) # set([12, 4, 23])

# 定義集合
s6 = set()

集合的常用操作

s = {10, 20, 30, 40, 50}   

# 判斷是否存在
print(10 in s) # True   
print(70 in s) # False

# 新增  
s.add(80) 
print(s) # {10, 20, 30, 40, 50, 80}  

# 新增多個  
s.update({200, 400})  
print(s) # {10, 20,, 200, 30, 40, 50, 400, 80}  

# 洗掉  
s.remove(10) 
print(s) # {20,, 200, 30, 40, 50, 400, 80} 
s.remove(900) # error: keyError
s.discard(900) # 如果有則洗掉900, 沒有也不會報錯
s.pop() # 隨機洗掉一個, 不能傳參  
s.clear() # 清空集合

集合間的關系

兩個集合是否相等(判斷集合中的元素是否完全相等)

s1 = {10, 20, 30, 40}
s2 = {20, 40, 10, 20} 
print(s1 == s2) # True
print(s1 != s2) # False

一個集合是否是另一個集合的子集

假如集合s1的元素里包括集合s2的全部元素,則s2是s1的子集

s1 = {10, 20, 30, 40}
s2 = {20, 40} 
print(s2.issubset(s1)) # True

一個集合是否是另一個集合的超集

與上相反,假如集合s1的元素里包括集合s2的全部元素,則s1是s2的超集

s1 = {10, 20, 30, 40}
s2 = {20, 40} 
print(s1.issuperset(s2)) # True

一個集合和另一個集合是否無交集

如果一個集合里某個元素,在另一個集合里也有存盤,則兩個集合有交集

s1 = {10, 20, 30, 40}
s2 = {80, 60} 
print(s1.isdisjoint(s2)) # False 無交集

字串的常用操作

字串的查詢操作方法

方法名稱作用
index()查找子串第一次出現的位置,如果查找的子串不存在時,則拋出ValueError
rindex()查找子串最后一次出現的位置,如果查找的子串不存在時,則拋出ValueError
find()查找子串第一次出現的位置,如果查找的子串不存在時,則回傳-1
rfind()查找子串最后一次出現的位置,如果查找的子串不存在時,則回傳-1

字串的大小寫轉換操作的方法

方法名稱作用
upper()把字串中所有字符都轉成大寫字母
lower()把字串中所有字符都轉成小寫字母
swapcase()把字串中所有大寫字母轉成小寫字母,把所有小寫字母轉成大寫字母
capitalize()把第一個字符轉換為大寫,其余字符小寫
title()把每個單詞的第一個字符轉換為大寫,把每個單詞的剩余字符轉換為小寫

字串內容對齊操作的方法

方法名稱作用
center()居中對齊,第一個引數指定寬度,第二個引數指定填充符,第二個引數是可選的,默認是空格,如果設定寬度小于實際寬度,則回傳原字串
ljust()左對齊,第一個引數指定寬度,第二個引數指定填充符,第二個引數是可選的,默認是空格,如果設定寬度小于實際寬度,則回傳原字串
rjust()右對齊,第一個引數指定寬度,第二個引數指定填充符,第二個引數是可選的,默認是空格,如果設定寬度小于實際寬度,則回傳原字串
zfill()右對齊,左邊用0填充,該方法只接收一個引數,用于指定字串的寬度,如果設定寬度小于實際寬度,則回傳原字串

字串分割操作的方法

方法名稱作用
split(cha, max)從字串的左邊開始分割,默認分割符是空格,回傳值是一個串列,第一個引數為分割符,第二個引數為最大分割次數
split(cha, max)從字串的右邊開始分割,默認分割符是空格,回傳值是一個串列,第一個引數為分割符,第二個引數為最大分割次數

判斷字串操作的方法

方法名稱作用
isidentifier()判斷指定字串是不是合法的識別符號
isspace()判斷指定字串是否由空白字符組成(回車、換行、水平制表符tab)
isalpha()判斷指定字串是否全部由字母組成
isdecimal()判斷指定字串是否全部由十進制的數字組成
isnumeric()判斷指定字串全部由數字組成
isalnum()判斷指定字串是否全部由字母和數字組成

字串操作的其他方法

方法名稱作用
replace()第1個引數指定被替換的子串
第2個引數指定替換子串的字串
該方法回傳替換后的字串,替換前的字串不會發生變化
該方法的第3個引數可以指定最大替換次數
cha.join(lst)cha將串列后元組的字串合并成一個字串,使用方法為cha.join(lst)

字串格式化操作

# %s 的s表示資料型別  s:字串  i:整數
print('我叫%s,我今年%i歲' % ('zzl', 18)) # 我叫zzl,我今年18歲'

# {}里的數字表示后面變數的索引,可重復使用
print('我叫{0},我今年{1}歲,我真的叫{0}'.format('zzl', 18)) # 我叫zzl,我今年18歲,我真的叫zzl'

# 前面加f  可在{}中直接填寫變數
print(f'我叫{'zzl'},我今年{18}歲') # 我叫zzl,我今年18歲'

字串編碼和解碼操作

# 編碼

s = '好好學習,天天向上'
# 使用GBK格式進行編碼, 此格式中,一個中文占兩個位元組
print(s.encode(encoding='GBK')) #b'\xba\xc3\xba\xc3\xd1\xa7\xcf\xb0\xa3\xac\xcc\xec\xcc\xec\xcf\xf2\xc9\xcf'

# 使用UTF-8格式進行編碼 此格式中,一個中文占三個位元組
print(s.encode(encoding='UTF-8')) #b'\xe5\xa5\xbd\xe5\xa5\xbd\xe5\xad\xa6\xe4\xb9\xa0\xef\xbc\x8c\xe5\xa4\xa9\xe5\xa4\xa9\xe5\x90\x91\xe4\xb8\x8a'



# 解碼  (使用什么格式編碼,就必須使用什么格式解碼,否則會報錯)

# 使用GBK格式進行編碼
print(s.encode(encoding='GBK').decode(encoding='GBK')) # 好好學習,天天向上

# 使用UTF-8格式進行編碼
print(s.encode(encoding='UTF-8').decode(encoding='UTF-8')) # 好好學習,天天向上

函式

函式的定義和使用

# 定義
def 函式名(a, b): # 引數a和b
    函式體  
    return  # 回傳值  
    
# 使用  
函式名()  

# 代碼演示  
def cals(a, b):
    c = a + b 
    return c
    
res = cals(20, 30) # 50  

函式的引數傳遞

  • 位置傳參,cals(20, 30) ,此時a的值是20, b的值是30
  • 關鍵字傳參, cals(b=70, a=30) 此時a的值是30, b的值是70

函式的回傳值

  1. 如果函式沒有回傳值(函式執行完畢之后,不需要給呼叫處提供資料),return可以省略不寫
  2. 函式的回傳值,如果是1個,直接回傳原值
  3. 函式的回傳值,如果是多個,回傳的結果為元組
def fun(lst):
    odd = [] # 存放奇數  
    even = [] # 存放偶數
    for i in lst:
        if (i%2) :
            odd.append(i)
        else:
            even.append(i)
    return odd,even

lst = [10, 23, 65, 78, 32, 77] 
print(fun(lst)) # ([23, 65, 77], [10, 78, 32])

函式的默認值

在定義函式的時候,可以給形參賦上默認值,當沒傳引數的時候,函式會取默認值,如果傳參和默認值同時存在,傳的引數會替換掉默認值

def cals(a, b = 10):
    c = a + b 
    return c
    
res = cals(20) # 30  
res = cals(20, 30) # 50

函式的引數定義

  • 個數可變的位置引數
    定義函式時,可能無法確定傳遞的實參個數,這個時候就要使用可變的位置形參,使用*定義,結果為一個元組
def fun(*args);
    print(args)

fun(1)  # (1,)
fun(1,2,3)  # (1, 2, 3)
  • 個數可變的關鍵字引數(指定引數名傳遞引數)
    定義函式時,可能無法確定傳遞的關鍵字實參個數,這個時候就要使用可變的關鍵字形參,使用*定義,結果為一個字典
def fun(**args);
    print(args)

fun(a=10)  # {'a':10}
fun(a=10, b=20, c=30)  # {'a':10, 'b':20, 'c':30}

以上引數在函式定義時,一種方式只能定義一次,
當兩種引數定義方式同時存在時,位置形參必須在關鍵字形參前面

python例外處理機制

例外捕獲

try:
    可能出現例外的陳述句放在這里 
except 你要捕獲的例外型別:
    捕獲到例外后你想做什么
except 你要捕獲的例外型別:
    捕獲到例外后你想做什么
...
except BaseException as e: # 這種情況是以上例外型別都沒捕獲到,則執行這塊代碼
    print('出錯了', e)
print('程式照常執行')

例外捕獲else

try:
    可能出現例外的陳述句放在這里 
except 你要捕獲的例外型別:
    捕獲到例外后你想做什么
except 你要捕獲的例外型別:
    捕獲到例外后你想做什么
...
except BaseException as e: # 這種情況是以上例外型別都沒捕獲到,則執行這塊代碼
    print('出錯了', e)
else:
    print('如果沒有例外則執行else部分')

try…except…else…finally結構

try:
    a = int(input('請輸入第一個整數'))
    b = int(input('請輸入另一個整數'))
    res = a/b
except BaseException as e:
    print('出錯了', e)
else:
    print('結果為:'res)
finlly:
    print('無論是否產生例外,總會被執行的代碼')

python常見的例外型別

例外型別描述
ZeroDivisionError除零or向零取余
IndexError序列中沒有此索引
KeyError映射中沒有這個鍵
NameError未宣告or未定義
SyntaxError語法錯誤
ValueError傳入無效的引數

類與物件

類的創建

  • 類屬性: 類中方法外的變數稱為類屬性,被該類的所有實體物件共享
  • 類方法: 使用@classmethod修飾的方法,可使用類名直接訪問
  • 靜態方法: 使用@staticmethod修飾的方法,可使用類名直接訪問
# Stubent為類的名稱,由一個或多個單詞組成,(建議類名書寫方式為每個單詞首字母大寫)
class Student:
    native_pace = '河南' # 直接寫在類里的變數,稱為屬性
    
    # 初始化函式( 建構式 )
    def __init__(self, name ,age):
        # 創建實體的時候 對name和age屬性進行賦值
        self.name = name
        self.age = age
    
    # 定義在類里面的方法為實體方法
    def eat(self):
        print('吃飯')
    
    # 靜態方法 (靜態方法里不允許寫self)
    @staticmethod 
    def method():
        print('使用staticmethod進行修飾,所以我是靜態方法')
        
        
    # 類方法
    @classmethod 
    def cm(cls):
        print('使用calssmethod進行修飾,所以我是類方法')
    

類實體物件

# 類實體創建語法  stu = Student()
# 假設已存在上面的 Student 類  

# stu1就是Student類的實體物件,該實體物件中可以訪問到類中的屬性和方法
stu1 = Student('zzl', 18) # 創建實體
print(stu1.name) # zzl
print(stu1.age) # 18
stu1.eat() # 吃飯

動態系結屬性和方法

# 假設已存在Student類  
stu = Student('zzl', 18)  

# 系結 gender 屬性 
stu.gender = '男' 
print(stu.gender) # 男

# 系結 show 方法
def show():
    print('show方法執行')
stu.show = show
stu.show() # show方法執行

面向物件的三大特征

  • 封裝 (提高程式的安全性)
    將資料(屬性)和行為(方法)封裝到類物件中,在方法內部對屬性進行操作,在類物件的外部呼叫方法,這樣無需關心方法內部的具體實作細節,從而隔離了復雜度,在python中沒有專門的修飾符用戶屬性的私有化,如果該屬性不想被類物件訪問,可以在屬性名前面加兩個 ‘_’

  • 繼承

  • 多型

代碼演示

# 繼承
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def info(self):
        print(self.name, self.age)


class Student(Person):
    def __init__(self, name, age, stu_no):
        super().__init__(name, age)
        self.stu_no = stu_no


class Teacher(Person):
    def __init__(self, name, age, teachofyear):
        super().__init__(name, age)
        self.teachofyear = teachofyear


stu = Student('張三', 20, 10001)
teacher = Teacher('李四', 35, 10)

stu.info() # 張三 20
teacher.info() # 李四 35

# python 支持多繼承 
class A(class1, class2):  
    pass
    
# 方法重寫  
# 方法重寫就是在子類里定義與父類重名的方法,這樣就會優先呼叫子類的定義的方法

模塊和包

定義:每一個.py檔案就是一個模塊

使用模塊化的好處

  1. 方便其他程式和腳本的匯入使用
  2. 避免函式名和變數名沖突
  3. 提高代碼的可維護性
  4. 提高代碼的可重用性

匯入模塊

# 匯入模塊
import 模塊名稱 [as 別名]  

# 匯入模塊中的指定函式(or 變數 or 類)
from 模塊名稱 import 函式/變數/

包是一個分層次的目錄結構,它將一組功能相近的模塊組織在一個目錄下

作用

  1. 代碼規范
  2. 避免模塊名稱沖突

包與目錄的區別

  1. 包含__init__.py檔案的目錄稱為包
  2. 目錄里通常不存在__init__.py檔案

包的匯入
import 包名.模塊名

檔案的讀寫

內置函式open()創建檔案物件

# file = open( filename, [mode, encoding] )

# 假設有一個名為a的文本檔案,里面有hello world
file = open('a.txt', 'r')
print(file.readlines()) # ['hello world']
file.close()

常用的檔案打開模式

打開模式描述
r以只讀模式打開檔案,檔案的指標將會放在檔案的開頭
w以只寫模式打開檔案,如果檔案不存在則創建,如果檔案存在,則覆寫原有內容,檔案指標在檔案的開頭
a以追加模式打開檔案,如果檔案不存在則創建,檔案指標在檔案開頭,如果檔案存在,則在檔案末尾追加內容
b以二進制方式打開檔案,不能單獨使用,需要與其他模式一起使用,rb,后者wb
+以讀寫方式打開檔案,不能單獨使用,需要與其他模式一起使用,如a+

檔案物件的常用方法

方法名描述
read([size])從檔案中讀取size個位元組或字符的內容回傳,若省略size,則讀取到檔案末尾,即一次讀取檔案所有內容
readline()從文本檔案中讀取一行內容
readlines()把文本檔案中每一行都作為獨立的字串物件,并將這些物件放入串列回傳
write(str)將字串str內容寫入檔案
writelines(s_list)將字串串列s_list寫入文本檔案,不添加換行符
seek(offset[, whence])把檔案指標移動到新的位置,offset表示相對與whence的位置:
offset:為正則往結束方向移動,為負則往開始方向移動
whence不同的值代表不同含義:
0:從檔案頭開始計算(默認值)
1:從當前位置開始計算
2:從檔案末尾開始計算
tell()回傳檔案指標的當前位置
flush()把緩沖區的內容寫入檔案,但不關閉檔案
close()把緩沖區的內容寫入檔案,同時關閉檔案,釋放檔案物件相關資源

with陳述句(背景關系管理器)

with陳述句可以自動管理背景關銑澩,不論什么原因跳出with陳述句都能確保檔案正確的關閉,以此來達到釋放資源的目的

# with使用  
with open(filename, mode) as file:
    pass 

目錄操作 (os 和 os.path)

  1. os模塊是python內置的與作業系統功能和檔案系統相關的模塊,該模塊中的陳述句的執行結果通常與作業系統有關,在不同的作業系統上運行,得到的結果可能不一樣
  2. os模塊與os.path模塊用于對目錄或檔案進行操作
import os
# 打開計算器
os.system('calc.exe')
# 打開記事本
os.system('notepad.exe')

# 打開可執行檔案
os.startfile('路徑')

os模塊操作目錄相關函式

函式說明
getcwd()回傳當前的作業目錄
listdir(path)回傳指定路徑下的檔案和目錄資訊
mkdir(path[, mode])創建目錄
makedirs(path1/path2…[, mode])創建多級目錄
rmdir(path)洗掉目錄
removedirs(path1/path2…)洗掉多級目錄
chdir(path)將path設定為當前作業目錄

os.path模塊操作目錄相關函式

函式說明
abspath(path)用于獲取檔案或目錄的絕對路徑
exists(path)用于判斷檔案或目錄是否存在,如果存在回傳True,否則回傳False
join(path, name)將目錄與目錄,或者目錄與檔案名連接起來
split(path)分離目錄和檔案名
splittext(name)分離檔案名和擴展名
basename(path)從一個目錄中提取檔案名
dirname(path)從一個路徑中提取檔案路徑,不包括檔案名
isdir(path)判斷是否為路徑

python內置模塊

使用import關鍵字引入

模塊描述
random亂數生成
traceback處理例外
sys與python解釋器及環境操作相關的標準庫
time提供與時間相關的各種函式的標準庫
os提供了訪問作業系統服務功能的標準庫
calendar提供與日期相關的各種函式的標準庫
urllib用于讀取來自網上(服務器)資料的標準庫
json用于使用JSON序列化和反序列化物件
re用于在字串中執行正則運算式匹配和替換
math提供標準算術運算函式的標準庫
decimal用于進行精準控制運算精度、有效數位和四舍五入操作的十進制運算
logging提供了靈活的記錄事件、錯誤、警告和除錯資訊等日志資訊的功能

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/251785.html

標籤:python

上一篇:Python之Scrapy爬蟲教程NBA球員資料存放到Mysql資料庫

下一篇:【kimol君的無聊小發明】—用python寫論文下載器(圖形化界面)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more