Python之路-python(set集合、文本操作、字符編碼 )


一、集合操作(set)                                                                                                                          

    1、定義:

      set集合,是一個無序且不重復的元素集合。

 

      集合對象是一組無序排列的可哈希的值,集合成員可以做字典中的鍵。集合支持用in和not in操作符檢查成員,由len()內建函數得到集合的基數(大小), 用 for 循環迭代集合         的成員。但是因為集合本身是無序的,不可以為集合創建索引或執行切片(slice)操作,也沒有鍵(keys)可用來獲取集合中元素的值。

 

    2、特性:

      1、無序

      2、去重

      3、關系測試 

    3、常用操作:

 

      交集(&)(intersection):兩者都存在的      

1 >>>a = [1,2,3,4,5]
2 >>>b = [4,5,6,7,8]
3 >>>a_set = set(a)
4 >>>b_set = set(b)
5 >>>rint(a_set.intersection(b_set))
6 >>>print(a_set.intersection(b_set),type(a_set.intersection(b_set)))
7 >>>{4, 5} <class 'set'>#可以看出字典和集合都是{},先將a和b都轉成集合,然后求出交集(它們兩都有的)

 

      並集(|)(union):去重后所有元素放一起

1 >>>a = [1,2,3,4,5]
2 >>>b = [4,5,6,7,8]
3 >>>a_set = set(a)
4 >>>b_set = set(b)
5 >>>print(a_set.union(b_set))

 

      差集(-)(difference):語法使用規則是你有我沒有

1 >>>a = [1,2,3,4,5]
2 >>>b = [4,5,6,7,8]
3 >>>a_set = set(a)
4 >>>b_set = set(b)
5 >>>print(a_set.difference(b_set))#(前后存在順序問題,a里面有的b里面沒有的(有---沒有))
6 >>>print(b_set.difference(a_set))#b里面有的a里面沒有

 

      子集(issubset):a是不是b的子集和b是不是a的子集

1 >>>a = [1,2,3,4,5]
2 >>>b = [4,5,6,7,8]
3 >>>a_set = set(a)
4 >>>b_set = set(b)
5 >>>print(a_set.issubset(b_set))
6 >>>print(b_set.issubset(a_set))
7 >>>False
8 >>>False

     

        父集(issuperset):a是不是b的父集和b是不是a的子集

1 >>>a = [1,2,3,4,5]
2 >>>b = [4,5,6,7,8]
3 >>>a_set = set(a)
4 >>>b_set = set(b)
5 >>>print(a_set.issuperset(b_set))
6 >>>print(b_set.issuperset(a_set))
7 >>>False
8 >>>False

        

        對稱差集(^)(symmetric_difference):a和b都互相都沒有(去重后放到一起)

1 >>>a = [1,2,3,4,5]
2 >>>b = [4,5,6,7,8]
3 >>>a_set = set(a)
4 >>>b_set = set(b)
5 >>>print(a_set.symmetric_difference(b_set))
6 >>>{1, 2, 3, 6, 7, 8}
a = [1,2,3,4,5]
b = [4,5,6,7,8]
a_set = set(a)
b_set = set(b)
print(a_set.isdisjoint(b_set))#前后兩者存在交集就返回False,沒有交集就打印True
解釋:
    isdisjoint是判斷a和b是否存在交集,如果存在返回False,不存在交集返回Trun

 

 

        4、基本操作

    

      .add(增加)添加一項

1 >>>a = [1,2,3,4,5]
2 >>>a_set = set(a)
3 >>>print(a_set)
4 >>>a_set.add(55)#一次只能添加一個元素,否則會報錯
5 >>>print(a_set)

     

      .update([增加多項])

1 >>>a = [1,2,3,4,5]
2 >>>a_set = set(a)
3 >>>print(a_set)
4 >>>a_set.update('88','lei','lei')
5 >>>print(a_set,type(a_set))
6 >>>{1, 2, 3, 4, 5}
7 >>>{1, 2, 3, 4, 5, '8', 'e', 'l', 'i'} <class 'set'>#通過結果不難看出集合天然去重

 

      .remove('刪除')(沒有的話報錯)

1 >>>a = [1,2,3,4,5]
2 >>>a_set = set(a)
3 >>>print(a_set)
4 >>>a_set.remove(1)#一次只能刪除一個,否則會報錯
5 >>>print(a_set,type(a_set))

 

      .copy(復制)

>>>a = [1,2,3,4,5]
>>>a_set = set(a)
>>>b_set = a_set.copy()
>>>print(a_set,type(a_set))
>>>print(b_set,type(b_set))
>>>{1, 2, 3, 4, 5} <class 'set'>
>>>{1, 2, 3, 4, 5} <class 'set'>


      .pop(刪除任意一個並返回這個元素)

1 >>>a = [1,2,3,4,5]
2 >>>a_set = set(a)
3 >>>b_set = a_set.pop()#隨機刪除,並返回刪除的元素
4 >>>print(a_set,type(a_set))
5 >>>print(b_set)
6 >>>{2, 3, 4, 5} <class 'set'>
7 >>>1


      .discard(刪除)(沒有不會報錯)

1 >>>a = [1,2,3,4,5]
2 >>>a_set = set(a)
3 >>>b_set = a_set.discard(5)
4 >>>print(a_set)
5 >>>print(b_set)
6 >>>{1, 2, 3, 4}
7 >>>None#有的話刪除后並返回一個None
8 >>>就算沒有,不報錯,也只會返回一個None

 

二、文件操作                                                                                                                                       

       提示:2.7里面的file文件操作3.x沒有

      1、標准操作:

f = open("yesterday",'w',encoding="utf-8")#文件句柄(放到了內存什么位置)
f.write("哈哈哈")#寫入內容,如果沒有該文件就自動創建
f.close#(關閉文件)

 

      2、建議操作:

>>>with open("yesterday","w",encoding='utf-8') as data:#讀寫完后自動關閉,因為windows上默認的編碼是gbk,所以需要轉換成utf-8
       data.write("哈哈哈")

     

      3、打開模式:

r,只讀模式(默認)。
w,只寫模式。(不可讀;不存在就自動創建;存在則刪除內容)
a,追加模式。(可讀;   不存在則創建;存在則只追加內容)
"+" 表示可以同時讀寫某個文件

r+,可讀寫文件。【可讀;可寫;可追加】
w+,寫讀
a+,同a
"U"表示在讀取時,可以將 \r \n \r\n自動轉換成 \n (與 r 或 r+ 模式同使用)

rU
r+U
"b"表示處理二進制文件(如:FTP發送上傳ISO鏡像文件,linux可忽略,windows處理二進制文件時需標注)

  .readlines(讀成一個列表,所有內容)#默認每行之間有空行因為有\n,用strip()就行
  .readline(默認一次只讀一行)
  .seek#位置0是開始
  .tell#打印當前位置
  .encoding#當前編碼
  .readable#文件是否可讀
  .writeable#是否可寫
  .flush#默認是等內存緩存滿了才寫入,強刷讀一條直接寫入硬盤

     

        小練習

1 #!/usr/bin/env python
2 #—*—coding:utf-8—*—
3 with open("yesterday","r",encoding='utf-8') as data_1 , \
4     open("yesterdaybak","w",encoding='utf-8') as data_2:#讀寫完后自動關閉
5     for line in data_1.readlines():
6         if "中國石油" in line:
7             line = line.replace("中國石油","中國石化")
8         data_2.write(line)
yesterday#文件更改前
新浪
百度
中國石油


yesterdaybak#更改后文件內容
新浪
百度
中國石化

 

 

三、字符編碼與轉碼                                                                                                                               

 

     

 

        1、python3練習

打開文件yesterday(windows上),內容如下
新浪
百度
中國石油
>>>with open("yesterday","r") as data:
>>>    for line in data:
>>>        line = line.strip('\n')
>>>        print(line)
報錯: UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 18: illegal multibyte sequence
解釋:
      我們知道utf-8是unicode的擴展,windows上默認編碼是gbk,按照上圖所示打開文件的時候我們需要將gbk轉碼直接解碼(encoding)成utf-8。
      如果是python2,.x的話,如果編碼格式是gbk,我們首先需要將gbk轉碼成unicode,然后再將unicode解碼(encoding)成utf-8。

 

 

 

四、函數                                                                                                                                             

     

      1、定義:

        函數是指將一組語句的集合通過一個名字(函數名)封裝起來,要想執行這個函數,只需調用其函數名即可

 

      2、特性:

        1、減少重復性

        2、是程序擴展性好

        3、使程序更容易維護

 

      3、語法:

1 >>>def func():
2 >>>    print("你好中國!")
3 >>>func()

 

      4、執行順序:

>>>def func():#1>>#3(首先python程序通過關鍵字發現這是個函數)(當執行完func()時候又到了這里)
>>>    print("你好中國!")#4(最后才執行到這里)
>>>func()#2(然后從上往下,這里執行了上面的函數)

      

      5、函數參數

1 #默認參數
2 def func(x,y):#這里的x和y只是形參(形式參數)
3     print(x)
4     print(y)
5 func(1,2)#這里是實參(實際參數,就是真真切切要往函數體里面傳的參數)
6 #1對應x,2對應y,也就是說實參合形參是平行對應的,否則打印出的效果就相反了。形參和實參不能多也不能少,否則報錯。
1 #關鍵參數
2 def func(x,y,z):
3     print(x)
4     print(y)
5     print(z)
6 func(x= "中國",y="北京",z = "海淀")
7 #這樣的話就沒有了順序的問題,只是要求形參和實參一定要對應,不能多,也不能少

 

1 #默認參數和關鍵參數混用
2 def func(x,y,z="22"):#默認參數和關鍵參數混合使用的時候,關鍵參數必須在最后
3     print(x)
4     print(y)
5     print(z)
6 
7 func(1,2,z='33')#默認參數和關鍵參數混合使用的時候,關鍵參數必須在最后。
8 #如上,z,如果如果沒有給傳實際參數,默認使用形式參數賦的值,如果實參給了就用實參的參數。

       

        萬能參數一(*)

1 #非固定參數(萬能參數)
2 def func(*args):#*是關鍵指定不可變,args是名稱可以更改
3     print(args[0])
4     print(args,type(args))
5 func(1,2,3,4)#通過結果可看出*傳進去的是元祖
6 >>>1
7 >>>(1, 2, 3, 4) <class 'tuple'>

 

        萬能參數二(**)

1 #非固定參數(萬能參數**kwargs)
2 def func(**kwargs):
3     print(kwargs,type(kwargs))
4 func(Name = '中國',Age = '上下五千年')
5 #**因為**輸出的是字典,所以傳值得時候一定是類似xxx = yyyy形式。

 

        局部變量和全局變量

1 name = "china"
2 def func(*args,**kwargs):
3     name = "beijing"#注意,局部變量是存在於函數體內的變量,全局變量是不在任何一個函數體內的變量
4     print(name)#如果局部變量和全局變量同時存在的話,優先使用局部變量
5     print(args)
6     print(kwargs)
7 func(1,2,3,age = "上下五千年")
 1 #更改全局變量
 2 name = "china"
 3 def func(*args,**kwargs):
 4     global name#引用全局變量的name
 5     print(name)#打印結果肯定是china
 6     name = "Beijing"#修改,這里有點像如果引用一個變量,首先從函數體內找,如果函數體內沒有就找全局變量
 7     print(name)
 8     print(args)
 9     print(kwargs)
10 func(1,2,3,age = "上下五千年")
11 >>>china
12 >>>Beijing
13 >>>(1, 2, 3)
14 >>>{'age': '上下五千年'}

 

       

        6、函數返回值

1 要想獲取函數的執行結果,就可以用return語句把結果返回
2 
3 注意:
4 
5 函數在執行過程中只要遇到return語句,就會停止執行並返回結果,so 也可以理解為 return 語句代表着函數的結束
6 如果未在函數中指定return,那這個函數的返回值為None 

        

        7、函數的遞歸

定義:在函數內部,可以調用其他函數。如果一個函數在內部調用自身本身,這個函數就是遞歸函數。
#函數的遞歸
def info(n):
    print(n)
    if int(n/2) > 0:
        return  info(int(n/2))
    print(">>>>",n)
info(10)
結果:
10
5
2
1
>>>> 1
遞歸特性:

1. 必須有一個明確的結束條件

2. 每次進入更深一層遞歸時,問題規模相比上次遞歸都應有所減少

3. 遞歸效率不高,遞歸層次過多會導致棧溢出(在計算機中,函數調用是通過棧(stack)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞歸調用的次數過多,會導致棧溢出)

 

        8、高階函數

        變量可以指向函數,函數的參數能接收變量,那么一個函數就可以接收另一個函數作為參數,這種函數就稱之為高階函數。

def add(x,y,f):#實參將3和-6傳給形參
    return f(x) + f(y)#返回值首先將3和-6取絕對值(那就是3和6),再相加,結果肯定是9

res = add(3,-6,abs)#abs是內置函數,讓的定義簡單里面就是去絕對值
print(res)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM