Python說文解字_雜談06

 1. 序列類型的分類:數組

  容器類型:list、tuple,dequeapp

  扁平序列:str、bytes、bytearray、array.array函數

  可變序列:list、dequte、bytearray、array性能

  不可變序列:str、tuple、bytesspa

 

2. 序列的abc繼承關係:code

  魔法函數構成了協議對象

 

3.序列的+ +=和extend的區別:blog

my_list = []
my_list.append(1)
my_list.append("a")

from collections import abc

a = [1,2]
# a = list()
c = a + [3,4]
# c = a + (3,4)  # 拋異常
print(c)


# 就地加
a += [3,4]
a += (3,4)  # 能夠爲任意的序列類型
a.extend((3,4))
# def __iadd__(self, values):
#     self.extend(values)
#     return self
a.append((1,2,4))
print(a) 

  記住:咱們知道類函數的實現是經過魔法函數來實現的。其中+號表示的是同類項的相加。排序

  記住:+=和extend是同樣的,所以+=是經過__iadd__來實現extend的。繼承

  記住:append表示添加的是元素位置。

  記住:不能用變量名去接收這些方法,由於沒有返回值(aa = a.extend是錯誤的)

 

4. 實現可切片的對象:

# 模式[start:end:step]
r"""
    其中,第一個數字start表示切片開始位置,默認是0
    第二個數字end表示切片截止(但不包含)位置(默認爲列表長度】
    第三個數字step表示切片的步長(默認爲1)
    當start爲0時能夠省略,當end爲列表長度時能夠省略。
    當start爲1時能夠生路,而且省略步長時能夠同時省略最後一個冒號。
    另外,當step爲負整數時,表示反向切片,這時start應該比end的值要大才行。
"""
aList = [3,4,5,6,7,9,11,13,15,17]
# 取值的操做
print(aList[::]) #返回包含原裏列表中全部元素的新列表
print(aList[::-1]) #返回包含原列表中全部元素的逆序列表
print(aList[::2]) # 隔一個取一個,獲取偶數位置的元素
print(aList[1::2]) #隔一個取一個,獲取奇數位置的元素
print(aList[3:6]) # 指定切片的開始和結束位置
print(aList[0:100]) # 切片結束位置大於列表長度時,從裏誒包尾部截斷
print(aList[100:]) # 切片開始位置大於列表長度時,返回空列表

# 賦值的操做
aList[len(aList):] = [9]
print(aList) # 在列表尾部增長元素
aList[:0] = [1,2]
print(aList) # 在列表頭部插入元素
aList[3:3] = [4]
print(aList) # 在列表中間位置插入元素
aList[:3] = [1,2]
print(aList) #替換元素列表元素,等號兩邊的裏誒包長度相同
aList[3:] = [4,5,6]
print(aList) # 等號兩邊的列表長度也能夠不相等
aList[::2] = [0] * 3  # 將元素賦值三份
print(aList) # 隔一個修改一個
aList[::2] = ['a','b','c'] # 隔一個修改一個
print(aList)
# aList[::2] = [1,2] # 左側切片不連續,等號兩邊列表長度必須相等
aList[:3] = [] #刪除列表中前3個元素
del aList[:3] # 切片元素連續
del aList[::3] # 切片元素不連續,隔一個刪一個。
print(aList)

 

import numbers
class Group:
    # 支持切片操做
    def __init__(self,group_name,company_name,staffs):
        self.group_name = group_name
        self.company_name = company_name
        self.staffs = staffs

    def __reversed__(self):
        self.staffs.reverse()

    def __getitem__(self, item):
        cls = type(self)
        if isinstance(item,slice):
            return cls(group_name=self.group_name,company_name=self.company_name,staffs=self.staffs[item])
        elif isinstance(item,numbers.Integral):
            return cls(group_name=self.group_name,company_name=self.company_name,staffs=[self.staffs[item]])

    def __len__(self):
        return len(self.staffs)

    def __iter__(self):
        return iter(self.staffs)

    def __contains__(self, item):
        if item in self.staffs:
            return True
        else:
            return False


staffs = ["bobby1","imooc","bobby2","bobby3"]
group = Group(company_name="imooc",group_name="user",staffs=staffs)
sub_group = group[:2]
print(group.staffs)
# sub_group1 = group[0]
# print(group.staffs)
# reversed(group)
# for user in group:
#     print(user)

  記住:這是一個比較多的用魔法函數實現切片操做。

  記住:難理解的是cls = type(self),返回值:<class '__main__.Group'>,這是拿到類的對象 ,其實能夠改寫成下面方式

    def __getitem__(self, item):
        # cls = type(self)
        # print(type(self))
        if isinstance(item,slice):
            return Group(group_name=self.group_name,company_name=self.company_name,staffs=self.staffs[item])
        elif isinstance(item,numbers.Integral):
            return Group(group_name=self.group_name,company_name=self.company_name,staffs=[self.staffs[item]])

 

  記住:可是這裏爲何要用type返回類對象呢?這是一種相對方式,爲的是若是更改類名能夠不用修改內部的代碼。

 

5. bisect二分迭代類型操做:

import bisect
from collections import deque

# 用來處理已排序的序列,始終用來維持已排序的序列,升序。
# 二分查找
inter_list = []
bisect.insort(inter_list,3)
bisect.insort(inter_list,2)
bisect.insort(inter_list,5)
bisect.insort(inter_list,1)
bisect.insort(inter_list,6)


print(inter_list)
# 總結:
# bisect.bisect(data,1)
# 做用,查找該數值將會插入的位置並返回,而不會插入,返回是會在那個數字以後插入
# 表示:num > .... 插入
a1 = bisect.bisect(inter_list,4)
print(a1)

# bisect_left 和 bisect_right 函數
# 該函數用入處理將會插入重複數值的狀況,返回將會插入的位置
# 第一:從左邊看num>...插入位置
# 第二:從右邊看 ... < num 出入位置。
a2 = bisect.bisect_left(inter_list,2)
print(a2)
a3 = bisect.bisect_right(inter_list,2)
print(a3)

# insort  函數 insort_left  和 insort_right
bisect.insort(inter_list,2)
print(inter_list)

 

7.數組:

# array, deque
# 數組:存儲連續的內存空間,效率很是高的。
import array
# array 和list的一個重要區別,array只能存放指定的數據類型。
# array的性能比list高。

my_array = array.array("i")
my_array.append(1)
my_array.append("abc")
print(my_array)

 

  記住:咱們是會用 列表,何時用數組

 

8. 列表推導式、生成器表達式、字典推導式、集合推導式。

# 列表生成式(列表推導式)
# 1. 提取1-20之間的奇數
odd_list = []
for i in range(21):
    if i %2 ==1:
        odd_list.append(i)

print(odd_list)


# 列表生成式
odd_list = [i for i in range(21) if i %2 == 1 ]

# 2.邏輯複雜的狀況
def handle_item(item):
    return item * item

odd_list1 = [handle_item(i) for i in range(21) if i %2 == 1 ]

# 列表生成式性能高於列表操做。

 

  記住:列表生成式不能太複雜了。要不就放棄了可讀性。另外列表生成式的操做高於列表操做。

 

# 生成器表達式:
odd_list = (i for i in range(21) if i %2 == 1 )
print(type(odd_list))
# <class 'generator'>
for item in odd_list:
    print(item)

  記住:生成器經過for循環打印出來。

odd_gen = (i for i in range(21) if i %2 == 1 )

odd_list = list(odd_gen)
print(odd_list)

  記住:生成器能夠轉回成list再打印出來也是能夠的。

 

# 字典推導式
my_dict = {"bobby1":22,"bobby2":23,"imooc":5}
reversed_dict = {value:Key for Key,value in my_dict.items()}
print(reversed_dict)
# {22: 'bobby1', 23: 'bobby2', 5: 'imooc'}

 

 

# 集合推導式
# my_set = set(my_dict.keys())
my_set = {Key for Key,value in my_dict.items()}
print(my_set)
print(type(my_set))
# <class 'set'>
相關文章
相關標籤/搜索