Python 基礎入門學習
- 基本陳述句
- 基本資料型別
- 函式
- 檔案操作
- 面向物件
- 例外
- 模塊
三.函式
-
函式:
def 函式名(引數):
**""" 說明檔案內容 """** **代碼1** **代碼2** **.......**注意:引數可有可無,必須先定義后使用
函式中return之后的代碼并不會執行
help(函式名) 查看函式解釋說明的資訊
-
函式(二):
區域變數:只在函式體內部生效的變數
全域變數:指在函式體內、外都能生效的變數
在函式體內部修改全域變數:在函式體內部用 global 宣告變數為全域變數后修改
函式有多個回傳值時: return 后面可以直接書寫 元組、串列、字典,回傳多個值
位置引數:呼叫函式時根據函式定義的引數位置來傳遞引數,傳遞和定義引數的順序及個數必須一致
關鍵字引數:函式呼叫時,通過“鍵=值”的形式加以指定傳參,關鍵字引數之間不存在先后順序
預設引數:也叫默認引數,用于在定義函式時為引數提供默認值,呼叫函式時可以不傳入有默認值的引數,在定義和呼叫函式時,位置引數必須在預設引數之前
不定長引數:也叫可變引數,用于不確定呼叫時會傳遞多少個引數的場景,可用 包裹位置引數 或 包裹關鍵字引數 來進行引數傳遞
包裹位置傳遞(元組):
def 函式名( *args ): print( args ) 函式名( 'abc' , 123 )包裹關鍵字傳遞(字典):
def 函式名( **kwargs): print( kwargs ) 函式名( a = 'abc' , b = 123)包裹位置傳遞和包裹關鍵字傳遞都是一個組包的程序,即收集零散資料并組成一個元組或字典
回傳值拆包:
元組: return 10, 20 num1, num2 = 函式 即得到num1 = 10 , num2 = 20
字典: 對字典拆包,得到的是字典的key
-
交換變數值:
方法一:借助第三變數存盤資料
方法二: a, b = b, a
-
參考: 在python中,值是靠參考來傳遞的
可以用 id() 來判斷兩個變數是否為同一個值的參考,可以將id理解為那塊記憶體的地址標識,
-
可變型別與不可變型別:
可變型別:串列(list)、字典(dict)、集合(set)
不可變型別:整型、浮點型、字串、元組
-
函式加強應用—學員管理系統:
#定義功能界面函式 def print_info(): """函式功能界面""" print('---select---') print('1.add') print('2.delete') print('3.modify') print('4.query') print('5.show all') print('6.exit') print('----end----') #定義串列等待存盤學員資訊 info = [] #添加學員資訊函式 def add_info(): """學員添加函式""" new_name = input('input name:') new_id = input('input id:') new_tel = input('input telephone:') global info for i in info: if new_name == i['name']: print('name exists!') #return 退出當前函式,不執行下面添加資訊的代碼 return info_dict = {} info_dict['name'] = new_name info_dict['id'] = new_id info_dict['tel'] = new_tel info.append(info_dict) print('add successful!') #洗掉學員資訊 def del_info(): """學員洗掉函式""" del_name = input('input name:') global info for i in info: if del_name == i['name']: info.remove(i) print('delete successful!') break else: print('name does not exist!') #修改學員資訊 def modify_info(): """學員資訊修改函式""" modify_name = input('input name:') global info for i in info: if modify_name == i['name']: i['tel'] = input('input new telephone:') print('modify successful!') break else: print('name does not exist!') #查詢學員資訊 def search_info(): """查詢資訊函式""" search_name = input('input name:') global info for i in info: if search_name == i['name']: print('---Message---') print(f"The name is {i['name']}, The id is {i['id']}, The telephone is {i['tel']},") break else: print('name does not exist!') #展示所有學員資訊函式 def showall_info(): """展示資訊函式""" print('name\tid\ttelephone') global info for i in info: print(f"{i['name']}\t{i['id']}\t{i['tel']}") while True: #1.顯示功能界面 print_info() #2.用戶輸入功能序號 user_num = int(input('your choice:')) #3.按照用戶輸入的功能序號,執行不同的功能(函式) if user_num == 1: add_info() elif user_num == 2: del_info() elif user_num == 3: modify_info() elif user_num == 4: search_info() elif user_num == 5: showall_info() elif user_num == 6: exit_flag = input('are you sure? Y/N') if exit_flag == 'Y': break else: print('Error!') -
遞回:
特點: 函式內部自己呼叫自己、必須有出口,
#遞回函式求1~n的累加和 def num(n): #出口 if n == 1: return 1 #函式內部自己呼叫自己 return n+num(n-1)若沒有出口,則報錯提示超出最大遞回深度(996),
-
lambda運算式(匿名函式):應用場景: 化簡代碼,如果一個函式只有一個回傳值,并且只有一句代碼,可以使用lambda簡化,
lambda 引數串列: 運算式lambda運算式的引數串列可有可無,函式的引數在lambda運算式中完全適用,
lambda運算式能夠接收任何數量的引數但只能回傳一個運算式的值,
#計算 a+b 的lambda實作 fn = lambda a,b: a+b print(fn(1,2)) #輸出結果: 3lambda的引數形式:無參、有參、預設引數(默認)、可變引數*args、可變引數**kwargs,
#無參 fn1 = lambda : 100 #有參 fn2 = lambda a: a #預設引數 fn3 = lambda a,b,c=100: a+b+c #可變引數 *args(元組) fn4 = lambda *args: args #可變引數 *kwargs(字典) fn5 = lambda **kwargs: kwargslambda的應用:
#1.帶判斷的lambda fn1 = lambda a,b: a if a>b else b #兩個數比大小 fn2 = lambda n: n+fn2(n-1) if n != 1 else 1 #遞回求1~n的累加和 #2.串列資料按字典key的值排序 students = [ {'name':'Tom','age':19}, {'name':'Alice','age':20}, {'name':'Hack','age':18} ] students.sort(key=lambda n: n['name']) #按照名字首字母升序排序 students.sort(key=lambda n: n['age'], reverse=True) #按照年齡降序排序 -
高階函式:
把函式作為引數傳入,這樣的函式稱為高階函式(即復合函式),
測驗用到的小函式:
abs():對數字求絕對值
round():對數字進行四舍五入
def sum(a, b, f): return f(a)+f(b) result1 = sum(3.14, -2.8, abs) result2 = sum(3.14, -2.8, round) #lambda運算式改寫 sum = lambda a,b,f: f(a)+f(b)Python內置高階函式: map()、reduce()、filter(),
map(func, list):將傳入的函式變數func作用到串列變數list中的每個元素中,并將結果組成新的串列(python2)/迭代器(python3)回傳,#計算list1序列中各個數字的三次方 list1 = [1,2,3,4,5] def func(x): return x ** 3 result = map(func, list1) #此時result為map回傳的迭代器 print(result) #將回傳迭代器result的地址 print(list(result)) #[1, 8, 27, 64, 125]reduce(func, list):functools模塊中的一個高階函式,其中func必須有兩個引數,每次func結算的結果繼續和序列的下一個元素做累積計算,#計算list2序列中各個數字的累加和 import functools #匯入模塊 list2 = [1,2,3,4,5] def func(a,b): return a+b result = functools.reduce(func,list2) print(result) #15filter(func, list):用于過濾序列,過濾掉不符合條件的元素,并回傳一個filter物件,可用 list() 轉換為串列,#過濾list3序列中所有的偶數,只留下奇數 list3 = [1,2,3,4,5,6,7,8,9] def func(x): return x%2 != 0 result = filter(func,list3) result = list(result) print(result) #[1,3,5,7,9]
四.檔案操作
-
檔案操作:
作用:把一些內容(資料)存盤存放起來,可以讓程式下一次執行的時候直接使用,而不必重新制作一份,省時省力,
檔案操作步驟:打開檔案、讀寫等操作、關閉檔案,
open():打開一個已經存在的檔案,或創建一個新檔案,f = open(name, mode) #name: 是要打開的目標檔案名的字串(可以包含檔案所在的具體路徑) #mode: 設定打開檔案的模式(訪問模式):只讀、寫入、追加等 #此時f為name檔案的檔案物件,可通過f執行之后的讀寫等操作主訪問模式 描述 r 以只讀方式打開檔案,檔案的指標將會放在檔案的開頭,這是默認模式(訪問模式未指定時,即為只讀模式), w 打開一個檔案只用于寫入,如果該檔案已存在則打開檔案,并從開頭開始編輯,即原有內容會被洗掉,如果該檔案不存在,創建新檔案, a 打開一個檔案用于追加,如果該檔案已存在,檔案指標將會放在檔案的結尾,也就是說,新的內容將會被寫入到已有內容之后,如果該檔案不存在,創建新檔案進行寫入, (b) 以二進制形式讀取 (+) 可讀可寫 訪問模式r+、w+、a+的區別:
r+:沒有該檔案則報錯,檔案指標在開頭故能讀取資料w+:沒有該檔案會新建,檔案指標在開頭并會用新內容覆寫原有內容,故無法讀取檔案內原有的資料a+:沒有該檔案會新建,檔案指標在結尾故不能讀取資料寫入內容:write()
檔案物件.write('內容')讀取內容:read()、readlines()、readline(),
檔案物件.read(num) #num 表示要從檔案中讀取的資料的長度,不寫則默認讀取所有資料,其中換行符'\n'會占一位 檔案物件.readnlines() #按照行的方式把整個檔案的內容進行一次性讀取,并回傳一個串列,其中每一行資料為一個元素 檔案物件.readline() #一次讀取一行內容、重復呼叫readline()則依次讀取檔案中每一行的內容移動檔案指標:seek()
檔案物件.seek(偏移量,起始位置) #起始位置引數: 0開頭 1當前 2結尾應用:
#使用 a 訪問模式打開檔案,通過改變檔案指標位置來讀取資料 f = open('test.txt','a') f.seek(0,0) #此時可簡寫為 f.seek(0) con = f.read() f.close() -
檔案備份案例:
#用戶輸入當前目錄下任意檔案名,程式完成對該檔案的備份功功能(備份檔案名為 xx[備份].后綴) #1.接收用戶輸入的檔案名 old_name = input('input yoru backup file name:') #2.規劃備份檔案名 index = old_name.rfind('.') #檔案名中'.'的位置 if index > 0: #判斷檔案名,防止出現'.txt'類的無效檔案名 postfix = old_name[index:] new_name = old_name[:index] + '[備份]' + postfix #利用字串的切片重新規劃備份檔案名 #3.備份檔案寫入資料 old_f = open(old_name,'rb') new_f = open(new_name,'wb') while True: #回圈讀取,防止檔案過大時卡死 con = old_f.read(1024) if len(con) == 0: #讀取完成時 break new_f.write(con) new_f.close() old_f.close() -
檔案和檔案夾的操作:
模塊:使用 os 模塊
import os #1.檔案操作 #檔案重命名,也可以重命名檔案夾 os.rename(目標檔案名或路徑, 新檔案名) #檔案洗掉,也可以洗掉檔案夾 os.remove(目標檔案名) #2.檔案夾操作 #創建檔案夾 os.mkdir(檔案夾名字) #洗掉檔案夾 os.rmdir(檔案夾名字) #3.目錄操作 #獲取當前目錄 os.getcwd() #改變當前默認目錄 os.chdir(目錄檔案夾) #獲取目錄串列 os.listdir(目錄檔案夾) -
檔案和檔案夾操作應用案例:
#批量修改檔案名,既可添加指定字串,又能洗掉指定字串 import os #構造條件資料 flag = input('輸入操作型別(1為添加,2為洗掉):') #構造指定字串 str = input('請輸入指定字串:') #找到所有檔案 file_list = os.listdir() #添加或洗掉指定字串 for i in file_list: if flag == '1': new_name = str + i elif flag == '2': num = len(str) new_name = i[num:] else: print('操作模式輸入錯誤!') break #重命名 os.rename(i, new_name)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/187840.html
標籤:其他
