python3学习第三周
1.列表,元組操作
列表是通過下標(索引)對元素進行增刪該查的。
列表中可以嵌套列表,元組。
列表是有序的。
元組是只讀的,不能更改。
2.字符串操作
字符串是不能更改的
3.字典操作
字典是通過key對value進行增刪改查的。
字典可以嵌套列表,字典。
字典是無序的。
4.集合操作
集合是一個無序的,不重復的數據組合,它的主要作用是
a.去重:把一個列表變成集合,就自動去重了。
b.關系測試:測試兩組數據之間的交集、差集、并集等關系。
a=set([1,2,3,4,5,6])?? #創建一個數字集合
b=set("hello")?????? #創建一個字符集合
list_01=set([1,2,3,4,5,6])
 list_02=set([4,5,6,7,8])
 list_03=[1,2,3,4,5,4,5,6]
print(list_01,type(list_01),list_02)
 print(set(list_03))??? #把列表list_03轉換成集合完成去重
 print(list_01.union(list_02)) #求兩個集合的并集
 print(list_01.intersection(list_02)) #求兩個集合的交集
 print(list_01.difference(list_02))?? #求兩個集合的差集
 print(list_02.difference(list_01))?? #求兩個集合的差集
 print(list_01.issubset(list_02))?? #判斷list_01是list_02的子集嗎
 print(list_01.issuperset(list_02))?? #判斷list_01是list_02的父集嗎
 print(list_01.symmetric_difference(list_02))?? #求list_01和list_02的對稱差集
 print(list_01.isdisjoint(list_02))?? #判斷list_01和list_02是否有交集,無返回ture
 print(list_01 | list_02) #求兩個集合的并集
 print(list_01 & list_02) #求兩個集合的交集
 print(list_01 - list_02)? #求兩個集合的差集
 print(list_01 ^ list_02)?? #求list_01和list_02的對稱差集
 a=set([1,2,3])
 a.add(99)?? #給集合中添加一項
 a.update([77,88]) #給集合中添加多項
 a.remove(99)? #刪除集合中的指定元素,如果指定元素不存在,就會報錯
 a.discard(99) #刪除集合中的指定元素,如果指定元素不存在,不會報錯
 print(1 in a)?? #判斷1是否是集合a的一員
 print(0 not in a) #判斷0是否不是集合a的一員
 print(len(a)) #求集合中的元素個數或者長度
 print(a.pop()) #隨機刪除一個元素,并返回這個元素
?
5.文件操作
對文件操作的流程:
a.打開文件,得到文件句柄并賦值給一個變量
b.通過句柄對文件進行操作
c.關閉文件
文件操作例子:
 f=open("bbc_news","r",encoding="utf-8")? #"r"表示以讀的模式打開文件,得到句柄并賦值給f
 date=f.read() #通過句柄讀取文件并賦值給date
 print(date)
 f.close() #關閉文件
 f=open("bbc_news2","w",encoding="utf-8")? #"w"表示以寫的模式打開文件,得到句柄并賦值給f
 #"w"也表示創建一個文件
 f.write("123456") #通過句柄給文件寫入內容
 f.close() #關閉文件
 f=open("bbc_news2","a",encoding="utf-8")? #"a"表示以append追加模式打開文件,得到句柄并賦值給f
 f.write("\n78910") #通過句柄給文件末尾寫入內容
 f.close() #關閉文件
 # readlines() #讀取所有行并返回列表
 #打印出文件中的前兩行
 #是低效率循環
 f=open("bbc_news","r",encoding="utf-8")
 for index,line in enumerate(f.readlines()):
 ??? if index<2:
 ??????? print(line.strip())
 #打印出文件中的前兩行
 f=open("bbc_news","r",encoding="utf-8")
 #讀一行放進內存,輸出后就刪除,讀取過程中內存中始終只有一行數據
 #是高效率循環
 count=0
 for line in f:
 ??? if count<2:
 ??????? print(line.strip())
 ??????? count+=1
f.close()
 #高效率循環打印出文件中的所有行
 f=open("bbc_news","r",encoding="utf-8")
 for line in f:
 ??? print(line.strip())
 f.close()
 f=open("bbc_news","r",encoding="utf-8")
 print(f.tell()) #打印出當前文件句柄的指針位置
 print(f.readline())
 print(f.tell())
 f.seek(0)?????? #讓當前文件句柄的指針位置回到零
 print(f.readline())
 print(f.tell())
 print(f.encoding) #打印出文件的編碼格式
 print(f.fileno()) #打印出文件在內存中的編號
 print(f.seekable())#判斷文件句柄的指針位置能否回到零
 f.close()
 f=open("bbc_news2","a",encoding="utf-8")
 f.write("hello2\n")
 f.flush() #刷新:強制把寫在緩存或者內存中的內容寫到硬盤上
 f.close()
 #flush()應用打印進度條
 import sys,time
 for i in range(50):
 ??? sys.stdout.write("#")
 ??? sys.stdout.flush()
 ??? time.sleep(0.2)
 f=open("bbc_news","a",encoding="utf-8")
 f.truncate(10) #從文件的首行首字符開始截斷10個字符
 f.close()"""
 f=open("bbc_news","r+",encoding="utf-8") #以讀寫模式打開文件
 print(f.readline())
 f.write("\nagaggg") #以讀寫模式打開文件然后寫,結果是在文件最后追加
 f=open("bbc_news","a+",encoding="utf-8") #以追加讀寫模式打開文件
 f=open("bbc_news","rb") #以二進制模式讀取文件,網絡傳輸只能用二進制,視頻也是二進制
 f=open("bbc_news3","wb") #以二進制模式寫入文件
 f.write("hello".encode()) #"hello".encode()把字符串轉二進制
 f.close()
文件修改:
f=open("bbc_news","r",encoding="utf-8")
 f_new=open("bbc_news.bk","w",encoding="utf-8")
 """
 #修改文件后保存到新文件中(源文件不變)
 for line in f:
 ??? if "你" in line:
 ??????? line=line.replace("你","她")
 ??? f_new.write(line)
 f.close()
 f_new.close()"""
with用法:
#用with打開文件,執行完后會自動關閉打開的文件
 with open("bbc_news","r",encoding="utf-8") as f:
 ??? for line in f:
 ??????? print(line)
 #用with可以同時打開幾個文件
 with open("bbc_news","r",encoding="utf-8") as f, \
 ??????? open("bbc_news2", "r", encoding="utf-8") as f2:
?
#在dos環境下運行該文件輸入:python 文簡名.py 參數1 參數2
 #Sys.argv其實就是一個列表,里邊的項為本文件的絕對路徑+用戶輸入的參數
 import sys
 print(sys.argv) #打印列表(該列表元素是本文件的絕對路徑+參數1+參數2)
 print(sys.argv[0]) #打印出列表中的第一個元素
 print(sys.argv[1]) #打印出列表中的第二個元素
6.字符編碼與轉碼
# -*- coding:utf-8 -*-? 表示本文件的編碼格式
 # Author:張潑
 #無論是gbk轉uft-8,還是utf-8轉gbk,都需要先轉換成Unicode,
 # 而在python3中字符串的編碼格式是unicode,所以可以直接轉換成其它編碼格式
 #encode()轉化為其它編碼格式,decode()轉換成Unicode格式,
 #在Python3中要正常顯示字符串要把字符串轉換成Unicode格式
 s="你好" #在python3中字符串編碼格式是Unicode
 unicode_to_gbk=s.encode("gbk") #Unicode轉bgk
 gbk_to_unicode=unicode_to_gbk.decode("gbk") #bgk換Unicode
 unicode_to_utf8=gbk_to_unicode.encode("utf-8") #Unicode換uft-8
 #gbk轉uft-8
 s.encode("gbk").decode("gbk").encode("utf-8")
 print(unicode_to_gbk)
 print(gbk_to_unicode)
 print(unicode_to_utf8)
7.函數
(1)函數基本語法及特性
函數概念:函數是指將一組語句的集合通過一個名字(函數名)封裝起來,要想執行這個函數,只需調用其函數名即可。
import? time
 #打印日志并且加上日志打印時間時間
 time_format="%Y-%m-%d %X"
 time_curent=time.strftime(time_format)
 def logger():
 ??? with open("a.text","a+",encoding="utf-8") as f:
 ??????? f.write("%s你是我的小蘋果!\n"%time_curent)
 def test():
 ??? logger()
 test()
特性:a.減少重復代碼
????? b.使程序變得可拓展
?? ???c.使程序邊的可維護
a.函數定義:
def test():
?????? print("hello")
def test():
?????? pass
b.函數調用:
test()
c.帶參函數:
def cal(x,y):
?????? res=x+y
?????? return res
(2)函數參數
a.形參變量只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。因此,形參只在函數內部有效。函數調用結束返回主調用函數后則不能再使用該形參變量
b.實參可以是常量、變量、表達式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使參數獲得確定值
def cal(x,y): #x,y為形參
 ?? res=x+y
 ?? return res
 c=cal(3,5) #3,5為實參
 print(c)
調用函數時,給形參傳入值可以按照位置傳入,也可以按照關鍵字傳入。
位置參數調用:
cal(4,1) #4,1為位置參數調用(按位置傳入),與形參一一對應
關鍵字參數調用:
cal(y=1,x=4)? # y=1,x=4為關鍵字參數調用(按關鍵字傳入),與形參順序無關。
c.默認參數:
#帶有默認參數的函數
deftest(x,y=2):
 ??? print(x)
 ??? print(y)
 test(1)? #用默認值
 test(1,y=6)? #用你指定的值
總結:
這個參數在調用時不指定,那就用默認值,指定了的話,就用你指定的值
d.非固定參數:
若函數在定義時不確定用戶想傳入多少實參數,就可以使用非固定參數。
*表示這個參數的個數不確定,args表示參數名
#非固定參數函數定義1
 def sum(a,b,*args): ?#args接收位置參數,并轉換為元組形式
 ??? print(a,b,args)
 sum(1,3) ?#輸出:1 3 ()? #后面這個()就是args,只是因為沒傳值,所以為空
 sum(1,3,4,5,6,7,8,9) ?#輸出:1 3 (4, 5, 6, 7, 8, 9)
#非固定參數函數定義2
**表示這個參數的個數不確定,kwargs表示參數名
def sum(a,b,**kwargs): ?#kwargs接收關鍵字參數,并轉換為字典形式
 ??? print(a,b,kwargs)
 sum(1,3) ?#輸出:1 3 {} #后面這個{}就是args,只是因為沒傳值,所以為空
 sum(1,3,c=6,d=8) ?#輸出:1 3 {'c': 6, 'd': 7}
#非固定參數函數定義3
def test(a,b,*args,**kwargs):
 ??? print(a)
 ??? print(b)
 ??? print(args)
 ??? print(kwargs)
 test(1,2,3,4,name="zb",id="001")
輸出結果:
1
2
(3, 4)
{'name': 'zb', 'id': '001'}
test(1,2,name="zb",id="001")
輸出結果:
1
2
()
{'name': 'zb', 'id': '001'}
總結:
args接收N個位置參數,并轉換為元組形式。
kwargs接N個收關鍵字參數,并轉換為字典形式。
(4)全局與局部變量
a.在子程序中(函數)定義的變量稱為局部變量,在程序的一開始定義的變量稱為全局變量。
b.全局變量作用域是整個程序,局部變量作用域是定義該變量的函數。
c.當全局變量與局部變量同名時:
在定義局部變量的函數內,局部變量起作用;在其它地方全局變量起作用。
d.字符串、數字這類全局變量是不能用局部變量直接更改的,列表、字典、集合、類這類全局變量是能夠用局部變量直接更改的
name="liu chen"
 def change_name():
 ??? global name?? #聲明此處的變量為全局變量,就可以改全局變量的值
 ??? name="wjb"
 ??? print(name)
 change_name()
 print(name)
#在函數中定義全局變量,不要用
 def change_name():
 ??? global name?? #聲明此處的變量為全局變量
 ??? name="wjb"
 ??? print(name)
 change_name()
names=["n1","n2"]
 def chang_name():
 ??? names[0]="mn"? #更改全局變量names的值
 ??? print(names)
 chang_name()
(5)返回值
返回值的數=0時,則返回none
返回值的數=1時,則返回object
返回值的數>1時,則返回元組tuple
要想獲取函數的執行結果,就可以用return語句把結果返回,為什么要有返回值,因為其它程序可能要用的。
注意:
a.函數在執行過程中只要遇到return語句,就會停止執行并返回結果,也可以理解為 return 語句代表著函數的結束
b.如果未在函數中指定return,那這個函數的返回值為None?
(6)遞歸
在函數內部,可以調用其他函數。如果一個函數在內部調用自身本身,這個函數就是遞歸函數。
遞歸特性:
a.必須有一個明確的結束條件。
b.每次進入根深一層遞歸時,問題規模都應該比上一次遞歸都應該減少。
c.效率不高。
def calc(n):
 ??? print(n)
 ??? if int(n/2)>0:
 ??????? return calc(int(n/2))
 ??? print("->",n)
 calc(10)
?
(7)匿名函數
(8)函數式編程介紹
函數式編程與我們所說的函數不一樣。
函數式編程
def test1():
?????? print("so do i")
?????? return 0
面向過程編程
def test2():
?????? print("so do i")
總結:
如果函數體中有return的叫函數式編程,否則叫面向過程編程
(9)高階函數
高階函數概念:一個函數接收另一個函數作為參數,那么這個函數叫高階函數。
def calc(a,b,f):
 ??? print(f(a)+f(b))
 calc(3,-9,abs)
(10)內置函數
5.內置函數
程序練習
1.實現簡單的替換功能
#把舊文件中的語句替換成新的,存放在新文件中
def replaced(old_file,new_file,old_word,new_word):
 ??? with open(old_file,"r",encoding="utf-8")as f1,\
 ??????? open(new_file,"w",encoding="utf-8") as f2:
 ??????? for line in f1:
 ??????????? if old_word in line:
 ??????????????? line=line.replace(old_word,new_word)
 ??????????????? f2.write(line)
 ??????????? else:
 ??????????????? f2.write(line)
 replaced("b.text","c.text","櫻桃","花生")
2.修改haproxy配置文件
?#查詢
 def query():
 ??? with open("d.text","r",encoding="utf-8") as f1:
 ??????? for line in f1:
 ??????????? if line.strip().startswith("backend") or line.strip().startswith("server"):
 ??????????????? print(line.strip())
 #添加
 def add_bs():
 ??? arg_dict = {
 ??????? "bakend": "www.hao123.com",
 ??????? "record": {
 ??????????? "server": "100.1.8.9 100.1.8.9",
 ??????????? "weight": 20,
 ??????????? "maxconn": 30
 ??????? }
 ??? }
 ??? with open("d.text","a",encoding="utf-8") as f2:
 ??????? f2.write("\n"+"bakend "+arg_dict["bakend"])
 ???? ???f2.write("\n"+"??????? server "+str(arg_dict["record"]["server"])+\
 ???????????????? " weight "+str(arg_dict["record"]["weight"])+\
 ???????????????? " maxconn "+str(arg_dict["record"]["maxconn"]))
 #刪除
 def delete():
 ??? with open("d.text","r",encoding="utf-8") as f1,\
 ??????? open("e.text", "w", encoding="utf-8") as f2:
 ??????? for line in f1:
 ??????????? if "bakend www.hao123.com"==line.strip():
 ??????????????? line=line.replace("bakend www.hao123.com","")
 ??????????????? f2.write(line)
 ??????????? elif "server 100.1.8.9 100.1.8.9 weight 20 maxconn 30"==line.strip():
 ??????????????? line=line.replace("server 100.1.8.9 100.1.8.9 weight 20 maxconn 30","")
 ??????????????? f2.write(line)
 ??????????? else:
 ??????????????? f2.write(line)
 #打印選項
 menus={"1":"查詢","2":"添加","3":"刪除","4":"退出"}
 for i in menus:
 ??? print(i+"."+menus[i])
 #選擇功能
 ischoice=True
 while ischoice:
 ??? choice = int(input("請選擇功能:"))
 ??? if choice==1:
 ??????? print("你選的是查詢,查詢結果如下:")
 ??????? query()
 ??? elif choice==2:
 ??????? print("你選的是添加")
 ??? ????add_bs()
 ??? elif choice==3:
 ??????? print("你選的是刪除")
 ??????? delete()
 ??? else:
 ??????? print("你選的是退出")
 ??????? ischoice=False
轉載于:https://www.cnblogs.com/zhangpo/p/9119580.html
總結
以上是生活随笔為你收集整理的python3学习第三周的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 第四篇 Python循环
- 下一篇: 修改Sublime Text3左侧导航字
