pythonsetclass
㈠ python 為什麼要繼承 object 類
沒有規定必須繼承OBJECT類。OBJECT類只是面向對象語言繼承精神的一種表現。例如OBJECTC,C++等語言在標准庫中都將所有類的基類定義位OBJECT,這樣的好處就是最大限度的利用代碼重用的的精神。但是不通語言中的OBJECT類的作用又很不一樣所以看看下面的介紹:回到PYTHON中為什麼要集成OBJECT:low-levelconstructorsnamed__new__()–低級別的構造函數.Note:Python的class__init__並不是其他語言意義上的構造函數,在new創建實例後對實例屬性初始化的函數.descriptors,–描述符.或者說描述符協議支持.descriptorprotocol__get__,__set__,__delete__等,可以閱讀descriptor文檔staticmethodsandclassmethods-靜態方法和類方法properties(computedattributes)–屬性訪問settergetter.decorators(introcedinPython2.4)–裝飾器.現在裝飾器語法糖遍布各Python框架.slots–用戶設置後可以限定實例的屬性.在Python2中替代__dict__,可以節省近2/3內存,Python3中可以不因為優化內存使用率而使用slots,因為__dict__結構內存做了優化,Note:__dict__並不是Python意義上的內置的dict,其實是一個proxy類.anewMethodResolutionOrder(MRO)–MRO方法解析次序改變(由左遞歸改為C3演算法)可能上面的你看著不太理解。通俗說一下py2.2後繼承object的目的是使這個類成為newstyleclass,沒有繼承object的為傳統classicclass,在本機進行了測試,環境為py2.7.3classFoo(object):passclassFoo1:passprinttype(Foo),type(Foo1)printdir(Foo)printdir(Foo1)printisinstance(Foo,object)printisinstance(Foo1,object)結果如下:['__class__','__delattr__','__dict__','__doc__','__format__','__getattribute__','__hash__','__init__','__mole__','__new__','__rece__','__rece_ex__','__repr__','__setattr__','__sizeof__','__str__','__subclasshook__','__weakref__']['__doc__','__mole__']TrueTrue(這個True有些疑問,Foo1不應是object的實例啊)
㈡ python中不能set+set
集合本身不支持「+」操作,一定要用+的方式,也是可以的,繼承set類,重寫__add__魔法方法即可。其實,你這個可以用求並集的方式達到目的:{1,2,3}|{4,5,6}
附上你想要方式的簡單例子:
classnewset(set):
def__add__(self,other):
returnself|other
a=newset('123')
b=newset('456')
print(a+b)
㈢ windows下配置python環境變數
您好,方法
首先第一步我們可以通過文件資源管理器中,找到此電腦,隨即右鍵點擊選擇「屬性」,當然了,如果您的桌面上有「此電腦」快捷圖標,也可以直接在桌面執行相同操作,之後便會彈出如圖所示的「系統」窗口,接下來在左邊選項卡中選擇高級系統設置。
點擊了高級系統設置之後,便會顯示「系統屬性」窗口,在該窗口的右下角便是」環境變數「選項。點擊進入環境變數的配置窗口,
接下來便是對環境變數的配置了。先在系統變數中找到「Path」一項,選中後點擊編輯,出現接下來的「編輯環境變數」窗口。這個窗口中顯示的便是計算機中已經配置好的環境變數,在此為了不破壞掉其他的變數,請不要對其他的內容做任何的操作,點擊"新建"即可。
點擊「新建」後窗口中會自動添加一項空白待填寫的輸入框,在其中輸入Python的根目錄即可。如圖所示。接下來確定保存。這個時候再WIN+R -> cmd打開命令窗口,輸入「python「 ,確認環境變數的配置成功。以上便是Win10如何配置Python環境變數。
㈣ 怎樣設計python腳本實現redis的set命令
#!/usr/bin/python
#coding=utf-8
import redis
class CRedis:
def __init__(self):
self.host = 'localhost'
self.port = 6379
self.db = 0
self.r = redis.Redis(host = self.host, port = self.port, db = self.db)
#1. strings 類型及操作
#設置 key 對應的值為 string 類型的 value
def set(self, key, value):
return self.r.set(key, value)
#設置 key 對應的值為 string 類型的 value。如果 key 已經存在,返回 0,nx 是 not exist 的意思
def setnx(self, key, value):
return self.r.setnx(key, value)
#設置 key 對應的值為 string 類型的 value,並指定此鍵值對應的有效期
def setex(self, key, time, value):
return self.r.setex(key, time, value)
#設置指定 key 的 value 值的子字元串
#setrange name 8 gmail.com
#其中的 8 是指從下標為 8(包含 8)的字元開始替換
def setrange(self, key, num, value):
return self.r.setrange(key, num, value)
#獲取指定 key 的 value 值的子字元串
def getrange(self, key, start ,end):
return self.r.getrange(key, start, end)
#mget(list)
def get(self, key):
if isinstance(key, list):
return self.r.mget(key)
else:
return self.r.get(key)
#刪除
def remove(self, key):
return self.r.delete(key)
#自增
def incr(self, key, default = 1):
if (1 == default):
return self.r.incr(key)
else:
return self.r.incr(key, default)
#自減
def decr(self, key, default = 1):
if (1 == default):
return self.r.decr(key)
else:
return self.r.decr(key, default)
#2. hashes 類型及操作
#根據email獲取session信息
def hget(self, email):
return self.r.hget('session', email)
#以email作為唯一標識,增加用戶session
def hset(self, email, content):
return self.r.hset('session', email, content)
#獲取session哈希表中的所有數據
def hgetall(self):
return self.r.hgetall('session')
#刪除hashes
def hdel(self, name, key = None):
if(key):
return self.r.hdel(name, key)
return self.r.hdel(name)
#清空當前db
def clear(self):
return self.r.flushdb()
#3、lists 類型及操作
#適合做郵件隊列
#在 key 對應 list 的頭部添加字元串元素
def lpush(self, key ,value):
return self.r.lpush(key, value)
#從 list 的尾部刪除元素,並返回刪除元素
def lpop(self, key):
return self.r.plush(key)
if __name__ == '__main__':
r = CRedis()
㈤ python集合
*事先說明:以下代碼及結果來自本設備Python控制台,在不同設備上可能結果有區別,望自己嘗試為妙
集合(set),是一種Python里的類(class),
集合類似於列表(list),可更改,可迭代(iterable),但是元素不重復
定義集合使用花括弧{},例如:
>>> s = {"apple", "banana", "strawberry", "watermelon"}
警告!!!如果使用空括弧
>>> a = {}
>>> a.__class__
<class 'dict'>
a將成為一個字典
想要定義空集合,
請使用類名。
>>> a = set()
類名定義也可以把迭代轉換為集合:
>>> b = set("abc")
>>> b
{'a', 'b', 'c'}
但是,保存後它是無序的。
>>> s
{'banana', 'watermelon', 'strawberry', 'apple'}
(結果僅供參考,在不同設備上略有不同)
下面介紹它的性質:
1. 可更改:
使用add(x)方法添加元素x:
>>> s.add("lemon")
>>> s
{'banana', 'strawberry', 'lemon', 'watermelon', 'apple'}
使用update(iter1, iter2, …)方法添加多個可迭代對象(如列表,元組(tuple),另一個集合)里的元素:
>>> s.update(("orange", "grape"))
>>> s
{'banana', 'strawberry', 'orange', 'lemon', 'watermelon', 'apple', 'grape'}
警告!!!如果使用字元串,字元串也會被迭代:
>>> a = set()
>>> a.update("apple")
>>> a
{'a', 'p', 'e', 'l'}
使用remove(x)移除元素x,如果x不存在,則拋出KeyError錯誤
>>> s.remove("lemon")
>>> s
{'banana', 'strawberry', 'orange', 'watermelon', 'apple', 'grape'}
>>> s.remove("cat")
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
s.remove("cat")
KeyError: 'cat'
使用discard(x)移除元素x,不會發生錯誤
>>> s.discard("grape")
>>> s
{'banana', 'strawberry', 'orange', 'watermelon', 'apple'}
>>> s.discard("dog")
>>> s
{'banana', 'strawberry', 'orange', 'watermelon', 'apple'}
2. 可迭代:
>>> for x in s:
... print(x)
banana
strawberry
orange
watermelon
apple
3. 可以使用 len 函數獲取集合長度;
>>> len(s)
5
可以使用in關鍵字檢查一個元素是否在集合內,將返回邏輯值(bool):
>>> "apple" in s
True
>>> "candy" in s
False
4.集合具有不重復性,因此它會自動去重:
>>> c = set("Hello World!")
>>> c
{' ', 'e', 'l', 'H', '!', 'r', 'W', 'o', 'd'}
5. 集合的運算
>>> d = set("abcdef")
>>> e = set("efghij")
>>> d
{'c', 'e', 'a', 'b', 'f', 'd'}
>>> e
{'h', 'e', 'g', 'j', 'f', 'i'}
>>> d - e # 集合d去掉集合e含有的元素,或者說集合d包含而集合e不包含的元素(不改變原集合)
{'a', 'b', 'd', 'c'}
>>> d | e # 集合d,e的所有元素
{'c', 'e', 'h', 'g', 'a', 'b', 'j', 'f', 'd', 'i'}
>>> d & e # 集合d,e都包含的元素
{'f', 'e'}
>>> d ^ e # 不同時出現在集合d, e中的元素
{'c', 'g', 'h', 'a', 'b', 'j', 'd', 'i'}
注意!!!
字元串、列表通用的+和*不適用於集合
>>> "abc" + "def"
'abcdef'
>>> [1, 2, 3] + [4, 5, 6]
[1, 2, 3, 4, 5, 6]
>>> d + e
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
d + e
TypeError: unsupported operand type(s) for +: 'set' and 'set'
>>> "a" * 5
'aaaaa'
>>> [1] * 3
[1, 1, 1]
>>> d*3
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
d * 2
TypeError: unsupported operand type(s) for *: 'set' and 'int'
(作者的小觀點:既然集合是不能重復的,那麼乘以、重復是沒有意義的)
㈥ python怎麼重寫集合方法
class Set(object):
def __init__(self,data=None):
if data == None:
self.__data = []
else:
if not hasattr(data,'__iter__'):
#提供的數據不可以迭代,實例化失敗
raise Exception('必須提供可迭代的數據類型')
temp = []
for item in data:
#集合中的元素必須是可哈希
hash(item)
if not item in temp:
temp.append(item)
self.__data = temp
#析構函數
def __del__(self):
del self.__data
#添加元素,要求元素必須可哈希
def add(self, other):
hash(other)
if other not in self.__data:
self.__data.append(other)
else:
print('元素已存在,操作被忽略')
#刪除元素
def remove(self,other):
if other in self.__data:
self.__data.remove(other)
print('刪除成功')
else:
print('元素不存在,刪除操作被忽略')
#隨機彈出並返回一個元素
def pop(self):
if not self.__dat:
print('集合已空,彈出操作被忽略')
return
import random
item = random.choice(self.__data)
self.__data.remove(item)
return item
#運算符重載,集合差集運算
def __sub__(self, other):
if not isinstance(other,Set):
raise Exception('類型錯誤')
#空集合
result = Set()
#如果一個元素屬於當前集合而不屬於另一個集合,添加
for item in self.__data:
if item not in other.__data:
result.__data.append(item)
return result
#提供方法,集合差集運算,復用上面的代碼
def difference(self,other):
return self - other
#|運算符重載,集合並集運算
def __or__(self, other):
if not isinstance(other,Set):
raise Exception('類型錯誤')
result = Set(self.__data)
for item in other.__data:
if item not in result.__data:
result.__data.append(item)
return result
#提供方法,集合並集運算
def union(self,otherSet):
return self | otherSet
#&運算符重載,集合交集運算
def __and__(self, other):
if not isinstance(other,Set):
raise Exception('類型錯誤')
result = Set()
for item in self.__data:
if item in other.__data:
result.__data.append(item)
return result
#^運算符重載,集合對稱差集
def __xor__(self, other):
return (self-other) | (other-self)
#提供方法,集合對稱差集運算
def symetric_difference(self,other):
return self ^ other
#==運算符重載,判斷兩個集合是否相等
def __eq__(self, other):
if not isinstance(other,Set):
raise Exception('類型錯誤')
if sorted(self.__data) == sorted(other.__data):
return True
return False
#>運算符重載,集合包含關系
def __gt__(self, other):
if not isinstance(other,Set):
raise Exception('類型錯誤')
if self != other:
flag1 = True
for item in self.__data:
if item not in other.__data:
#當前集合中有的元素不屬於另一個集合
flag1 = False
break
flag2 = True
for item in other.__data:
if item not in self.__data:
#另一集合中的元素不屬於當前集合
flag2 = False
break
if not flag1 and flag2:
return True
return False
#>=運算符重載,集合包含關系
def __ge__(self, other):
if not isinstance(other,Set):
raise Exception('類型錯誤')
return self == other or self > other
#提供方法,判斷當前集合是否為另一個集合的真子集
def issubset(self,other):
return self<other
#提供方法,判斷當前集合是否為另一集合的超集
def issuperset(self,other):
return self > other
#提供方法,清空集合所有元素
def clear(self):
while self.__data:
del self.__data[-1]
print('集合已清空')
#運算符重載,使得集合可迭代
def __iter__(self):
return iter(self.__data)
#運算符重載,支持in運算符
def __contains__(self, item):
return item in self.__data
#支持內置函數len()
def __len__(self):
return len(self.__data)
#直接查看該類對象時調用該函數
def __repr__(self):
return '{'+str(self.__data)[1:-1]+'}'
#使用print()函數輸出該類對象時調用該函數
__str__ = __repr__