標籤:函數 seek tell
1.函數基本文法及特性函數是什麼?
函數一詞來源於數學,但編程中的「函數」概念,與數學中的函數是有很大不同的,具體區別,我們後面會講,編程中的函數在英文中也有很多不同的叫法。在BASIC中叫做subroutine(子過程或子程式),在Pascal中叫做procedure(過程)和function,在C中只有function,在Java裡面叫做method。
定義: 函數是指將一組語句的集合通過一個名字(函數名)封裝起來,要想執行這個函數,只需調用其函數名即可
特性:
減少重複代碼
使程式變的可擴充
使程式變得易維護
文法定義
def sayhi():#函數名 print("Hello, I‘m nobody!") sayhi() #調用函數
可以帶參數
#下面這段代碼a,b = 5,8c = a**bprint(c) #改成用函數寫def calc(x,y): res = x**y return res #返回函數執行結果 c = calc(a,b) #結果賦值給c變數print(c)
2.函數參數與局部變數
形參變數只有在被調用時才分配記憶體單元,在調用結束時,即刻釋放所分配的記憶體單元。因此,形參只在函數內部有效。函數調用結束返回主調用函數後則不能再使用該形參變數
實參可以是常量、變數、運算式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使參數獲得確定值
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/85/DA/wKioL1esUsyQ85ZtAABeHblJ2rA475.png-wh_500x0-wm_3-wmp_4-s_3572000357.png" title="形參.png" alt="wKioL1esUsyQ85ZtAABeHblJ2rA475.png-wh_50" />
3.預設參數
看下面代碼
def func_test(x,y):#x,y為形參 res = x+y return resz = func_test(2,4) #2,4為x,y的實參print(z)
test(x,y,z=9(1,2,3) test(1,z=8,y=2)test(1,2) C:\Users\congcong.du\AppData\Local\Programs\Python\Python35\python.exe C:/Users/congcong.du/PycharmProjects/test/day3/123------------128------------129------------
另外,你可能注意到了,在把country變成預設參數後,我同時把它的位置移到了最後面,為什麼呢?
4.參數組*args,傳字典 **kwargs
#參數組#若你的函數在定義時不確定使用者想傳入多少個參數,就可以使用非固定參數。#*args 接收位置參數,不接受關鍵字參數,轉化為元組def test1(name,*args): print(name) print(args)test1("alex",1,2,3,4,5,5)C:\Users\congcong.du\AppData\Local\Programs\Python\Python35\python.exe C:/Users/congcong.du/PycharmProjects/test/day3/func.pyalex(1, 2, 3, 4, 5, 5)print("=========字典=======")#傳字典 **kwargs :將關鍵字參數,轉換為字典的方式def test2(**kwargs): print(kwargs) print(kwargs["name"])test2(name="alex",age=8,sex="man")test2(**{‘age‘: 8, ‘name‘: ‘alex‘, ‘sex‘: ‘man‘})#混和def test3(name,age=18,**kwargs): print(name) print(age) print(kwargs)test3("alex", sex="man")test3("alex",1,sex="man",hobby="tsl")test3("alex",sex="man",hobby="tsl",age=1)print("---------------------")def test4(name,age=18,*args,**kwargs): print(name) print(age) print(args) print(kwargs)test4("alex",34,1,2,3,sex="man", hobby="tsl") #關鍵字參數,一定要在最後一個位置參數後maintest4("alex",age=34,sex="man",hobby="tsl")
5.局部變數
局部變數只在他的範圍內其起作用,也可以聲明為全域變數,不過因為寫代碼長的時候隨便聲明可能會亂,所以不推薦。
def change_name(name): print("before change:",name) name = "裡面的局部變數" print("after change:", name)name=(‘外面的全域變數‘)change_name(name)print("在外面看看name改了麼?",name)‘‘‘before change: 外面的變數after change 裡面的變數在外面看看name改了麼? 外面的變數‘‘‘
print("===========全域/局部變數=======")sex = "m"def test5(n): #global age #如果要在函數內改全域變數,用global聲明 sex = "g" #局部變數改不了全域的變數 print("before change:", n,sex) n = "Alex Li" #這個函數就是這個變數的範圍 age = 20 print("after change:", n,age,sex)name = "alex"test5(name)#print(name,age,sex) #age局部變數不能在函數外使用print(name,sex)
函數內是可以修改全域列表的
print("======函數修改列表====")names = ["alex","jack","rain"]def change_list(): names[0]= "ALEX" print(names)change_list()print(names)
6.遞迴函式
#函數內部調用自己。#1.必須有一個明確的結束條件,最大遞迴次數999.#2.每次進入更深一層遞迴時,問題規模相比上次遞迴應有減少#3.效率不高,遞迴層次過多會導致棧溢出(在電腦中,函數調用是通過棧(stack)這種資料結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴調用的次數過多,會導致棧溢出)
print("========遞迴函式=========")#函數內部調用自己。1.必須有一個明確的結束條件,最大遞迴次數999.#2.每次進入更深一層遞迴時,問題規模相比上次遞迴應有減少#3.效率不高def test6(n): print(n) if int(n/2) > 0: return test6(int(n/2)) print("-->",n)test6(10)7.高階函數
print("========高階函數=========")#變數可以指向函數,函數的參數能接收變數,那麼一個函數就可以接收另一個函數作為參數,這種函數就稱之為高階函數。#abs 轉化為正數的函數def add(x,y,f): return f(x)+f(y)res = add(3,-6,abs)print(res)
8.字元編碼與轉碼
Python3中預設的字元編碼為Unicode,可以直接encode為其他編碼
python2中預設為windows下的gbk,所有得非Unicode都要先decode為Unicode,然後再encode為其他的字元編碼。
借圖
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M02/85/DC/wKiom1esacvA6DnyAAMp8AVB0cs616.png-wh_500x0-wm_3-wmp_4-s_2222948684.png" title="轉碼.png" alt="wKiom1esacvA6DnyAAMp8AVB0cs616.png-wh_50" />
import sysprint(sys.getdefaultencoding()) #顯示字元編碼a_unicode="夫風起於青萍之末" #這個是unicode格式print(a_unicode)a_gbk=a_unicode.encode(‘gbk‘) #預設是unicode格式,轉化為gbk格式print(a_gbk)a_gb2312=a_gbk.decode(‘gbk‘).encode(‘gb2312‘) #先decode轉化為unicode格式,括弧裡告訴自己是gbk格式的,再encode轉化,括弧裡寫要轉化的格式。print(a_gb2312) #gbk是gb2312升級版,常用漢字的編碼基本相同a_unicode2=a_gbk.decode(‘gbk‘) #轉化為unicode格式print(a_unicode2)
9.day3 檔案操作 seek tell 修改開啟檔案的模式:
"+" 同時讀寫某個檔案:
r+,可讀寫檔案。【可讀;可追加】
w+,寫讀
a+,追加讀
"U"表示在讀取時,可以將 \r \n \r\n自動轉換成 \n (與 r 或 r+ 模式同使用)
"b"表示處理二進位檔案(如:FTP發送上傳ISO鏡像檔案,linux可忽略,windows處理二進位檔案時需標註)
1.read()、readline()、readlines()的區別
#!/usr/bin/env python#-*- coding:utf-8 -*-# Author:DCC###預設讀模數式file = open("test_file","r",encoding="utf-8") #檔案控制代碼print(file.read())data = file.read() #所有內容data1 = file.read() #第二次讀,是讀不出資料的file.seek(0) #將游標歸零data2 = file.read() #游標歸零後就可以再出讀出資料file.close()
#!/usr/bin/env python#-*- coding:utf-8 -*-# Author:DCCfile = open("test_file","r",encoding="utf-8") #檔案控制代碼print(file.read()) #讀出全部file.seek(0)print(file.readline()) #讀出一行file.seek(0)print(file.readlines()) #把文章內容以分行符號分割,並產生list格式C:\Users\congcong.du\AppData\Local\Programs\Python\Python35\python.exe C:/Users/congcong.du/PycharmProjects/test/day3/file.py1如果你真的愛我 讓我走開2心疼你當初反覆那樣的說3如果你真的愛我 讓我走開4我決心不從舊夢中 掙脫5如果你真的愛我 讓我走開6心疼你為我藏住分離的苦7如果我知道你是這樣的難過8會一個人走向寂寞1如果你真的愛我 讓我走開[‘1如果你真的愛我 讓我走開\n‘, ‘2心疼你當初反覆那樣的說\n‘, ‘3如果你真的愛我 讓我走開\n‘, ‘4我決心不從舊夢中 掙脫\n‘, ‘5如果你真的愛我 讓我走開\n‘, ‘6心疼你為我藏住分離的苦\n‘, ‘7如果我知道你是這樣的難過\n‘, ‘8會一個人走向寂寞‘]
file = open("test_file","r",encoding="utf-8") #檔案控制代碼for i in range(5): print(file.readline()) #讀出前五行 file.close()
for line in file.readlines(): #轉化為列表格式了 print(line.strip())
#!/usr/bin/env python#-*- coding:utf-8 -*-# Author:DCCfile = open("test_file","r",encoding="utf-8") #檔案控制代碼#將檔案全部讀入記憶體for index,line in enumerate(file.readlines()): #讀列表和下標 if index == 9: print("-----------------") continue print(line.strip()) ‘‘‘ #這個效率最高,for line in file,逐行讀到記憶體‘‘‘count = 0for line in file: if count == 9: print("--------------------") count += 1 continue print(line) count += 1‘‘‘
#!/usr/bin/env python#-*- coding:utf-8 -*-# Author:DCC##預設讀模數式file = open("test_file","r",encoding="utf-8") #檔案控制代碼print(file.tell()) #列印游標當前的位置print(file.readline())print(file.readline())print(file.readline())print(file.tell())file.seek(0) #移動歸零print(file.tell())file.flush #重新整理,從記憶體寫到磁碟file.close()C:\Users\congcong.du\AppData\Local\Programs\Python\Python35\python.exe C:/Users/congcong.du/PycharmProjects/test/day3/file.py01如果你真的愛我 讓我走開2心疼你當初反覆那樣的說3如果你真的愛我 讓我走開1100
#!/usr/bin/env python#-*- coding:utf-8 -*-# Author:DCC#修改思路:開啟一個檔案,從舊檔案,讀一行寫一行,改一行,寫一行f = open("test_file","r",encoding="utf-8")f_new = open("test_file.bak","w",encoding="utf-8")for line in f: if "心疼" in line: line = line.replace("心疼","xinteng") print(line) f_new.write(line)f.close()f_new.close()
#with#python 一行不要超過80個字元,用換行with open("yesterday","r",encoding="utf-8") as f,open("yesterday2","r",encoding="utf-8") as f2: for line in f: print(line) for line2 in f2: print(line2)
本文出自 “東風十裡柔情” 部落格,謝絕轉載!
Python,Day3 - Python基礎3