python-Day3-set 集合-counter计数器-默认字典(defaultdict) -可命名元组(namedtuple)-有序字典(orderedDict)-双向队列(deque)--Queue单项队列--深浅拷贝---函数参数
上节内容回顾:
C语言为什么比起他语言块,因为C 会把代码变异成机器码
Pyhton 的 .pyc文件是什么
python 把.py文件编译成的.pyc文件是Python的字节码,
字符串本质是 字符数组,
python 一切事物都是对象,对象是类创建的,像 增加删除更改 都存在于类里边,也可以称作类的成员
set集合
set是一个无序且不重复的元素集合
- class set(object):
- """
- set() -> new empty set object
- set(iterable) -> new set object
- Build an unordered collection of unique elements.
- """
- def add(self, *args, **kwargs): # real signature unknown
- """ 添加 """
- """
- Add an element to a set.
- This has no effect if the element is already present.
- """
- pass
- def clear(self, *args, **kwargs): # real signature unknown
- """ Remove all elements from this set. """
- pass
- def copy(self, *args, **kwargs): # real signature unknown
- """ Return a shallow copy of a set. """
- pass
- def difference(self, *args, **kwargs): # real signature unknown
- """
- Return the difference of two or more sets as a new set.
- (i.e. all elements that are in this set but not the others.)
- """
- pass
- def difference_update(self, *args, **kwargs): # real signature unknown
- """ 删除当前set中的所有包含在 new set 里的元素 """
- """ Remove all elements of another set from this set. """
- pass
- def discard(self, *args, **kwargs): # real signature unknown
- """ 移除元素 """
- """
- Remove an element from a set if it is a member.
- If the element is not a member, do nothing.
- """
- pass
- def intersection(self, *args, **kwargs): # real signature unknown
- """ 取交集,新创建一个set """
- """
- Return the intersection of two or more sets as a new set.
- (i.e. elements that are common to all of the sets.)
- """
- pass
- def intersection_update(self, *args, **kwargs): # real signature unknown
- """ 取交集,修改原来set """
- """ Update a set with the intersection of itself and another. """
- pass
- def isdisjoint(self, *args, **kwargs): # real signature unknown
- """ 如果没有交集,返回true """
- """ Return True if two sets have a null intersection. """
- pass
- def issubset(self, *args, **kwargs): # real signature unknown
- """ 是否是子集 """
- """ Report whether another set contains this set. """
- pass
- def issuperset(self, *args, **kwargs): # real signature unknown
- """ 是否是父集 """
- """ Report whether this set contains another set. """
- pass
- def pop(self, *args, **kwargs): # real signature unknown
- """ 移除 """
- """
- Remove and return an arbitrary set element.
- Raises KeyError if the set is empty.
- """
- pass
- def remove(self, *args, **kwargs): # real signature unknown
- """ 移除 """
- """
- Remove an element from a set; it must be a member.
- If the element is not a member, raise a KeyError.
- """
- pass
- def symmetric_difference(self, *args, **kwargs): # real signature unknown
- """ 差集,创建新对象"""
- """
- Return the symmetric difference of two sets as a new set.
- (i.e. all elements that are in exactly one of the sets.)
- """
- pass
- def symmetric_difference_update(self, *args, **kwargs): # real signature unknown
- """ 差集,改变原来 """
- """ Update a set with the symmetric difference of itself and another. """
- pass
- def union(self, *args, **kwargs): # real signature unknown
- """ 并集 """
- """
- Return the union of sets as a new set.
- (i.e. all elements that are in either set.)
- """
- pass
- def update(self, *args, **kwargs): # real signature unknown
- """ 更新 """
- """ Update a set with the union of itself and others. """
- pass
- def __and__(self, y): # real signature unknown; restored from __doc__
- """ x.__and__(y) <==> x&y """
- pass
- def __cmp__(self, y): # real signature unknown; restored from __doc__
- """ x.__cmp__(y) <==> cmp(x,y) """
- pass
- def __contains__(self, y): # real signature unknown; restored from __doc__
- """ x.__contains__(y) <==> y in x. """
- pass
- def __eq__(self, y): # real signature unknown; restored from __doc__
- """ x.__eq__(y) <==> x==y """
- pass
- def __getattribute__(self, name): # real signature unknown; restored from __doc__
- """ x.__getattribute__('name') <==> x.name """
- pass
- def __ge__(self, y): # real signature unknown; restored from __doc__
- """ x.__ge__(y) <==> x>=y """
- pass
- def __gt__(self, y): # real signature unknown; restored from __doc__
- """ x.__gt__(y) <==> x>y """
- pass
- def __iand__(self, y): # real signature unknown; restored from __doc__
- """ x.__iand__(y) <==> x&=y """
- pass
- def __init__(self, seq=()): # known special case of set.__init__
- """
- set() -> new empty set object
- set(iterable) -> new set object
- Build an unordered collection of unique elements.
- # (copied from class doc)
- """
- pass
- def __ior__(self, y): # real signature unknown; restored from __doc__
- """ x.__ior__(y) <==> x|=y """
- pass
- def __isub__(self, y): # real signature unknown; restored from __doc__
- """ x.__isub__(y) <==> x-=y """
- pass
- def __iter__(self): # real signature unknown; restored from __doc__
- """ x.__iter__() <==> iter(x) """
- pass
- def __ixor__(self, y): # real signature unknown; restored from __doc__
- """ x.__ixor__(y) <==> x^=y """
- pass
- def __len__(self): # real signature unknown; restored from __doc__
- """ x.__len__() <==> len(x) """
- pass
- def __le__(self, y): # real signature unknown; restored from __doc__
- """ x.__le__(y) <==> x<=y """
- pass
- def __lt__(self, y): # real signature unknown; restored from __doc__
- """ x.__lt__(y) <==> x<y """
- pass
- @staticmethod # known case of __new__
- def __new__(S, *more): # real signature unknown; restored from __doc__
- """ T.__new__(S, ...) -> a new object with type S, a subtype of T """
- pass
- def __ne__(self, y): # real signature unknown; restored from __doc__
- """ x.__ne__(y) <==> x!=y """
- pass
- def __or__(self, y): # real signature unknown; restored from __doc__
- """ x.__or__(y) <==> x|y """
- pass
- def __rand__(self, y): # real signature unknown; restored from __doc__
- """ x.__rand__(y) <==> y&x """
- pass
- def __reduce__(self, *args, **kwargs): # real signature unknown
- """ Return state information for pickling. """
- pass
- def __repr__(self): # real signature unknown; restored from __doc__
- """ x.__repr__() <==> repr(x) """
- pass
- def __ror__(self, y): # real signature unknown; restored from __doc__
- """ x.__ror__(y) <==> y|x """
- pass
- def __rsub__(self, y): # real signature unknown; restored from __doc__
- """ x.__rsub__(y) <==> y-x """
- pass
- def __rxor__(self, y): # real signature unknown; restored from __doc__
- """ x.__rxor__(y) <==> y^x """
- pass
- def __sizeof__(self): # real signature unknown; restored from __doc__
- """ S.__sizeof__() -> size of S in memory, in bytes """
- pass
- def __sub__(self, y): # real signature unknown; restored from __doc__
- """ x.__sub__(y) <==> x-y """
- pass
- def __xor__(self, y): # real signature unknown; restored from __doc__
- """ x.__xor__(y) <==> x^y """
- pass
- __hash__ = None
- set
set集合
集合里不允许重复的元素存在
对象是由类创建的
要创建一个set
创建一个 set无序集合
列表有两种创建方法:
a1 = []
a2 = list()
set 通过类创建对象、
s1 = set() 这就是创建了一个集合的对象
现在可以往里边添加对象
用途:
#比如说在写爬虫的时候访问一个电商网站,访问第一个页面的时候收集到了一个商品名称,在访问第二个页面的时候又收集了一个商品名称,这个时候集合就起作用了,集合里不会有重复的元素
#访问速度快
#天生解决了重复问题
- __author__ = 'Administrator'
- # -*- coding:utf-8 -*-
- #定义一个空的集合
- s1 = set()
- #给集合添加对象
- s1.add('amd')
- #打印集合
- print(s1)
- #打印类型
- print(type(s1))
- --------------------------------------------------------------------------------
- #打印添加对象后的集合
- {'amd'}
- #打印显示所属类型为集合
- <class 'set'>
- --------------------------------------------------------------------------------
- __author__ = 'Administrator'
- # -*- coding:utf-8 -*-
- s1 = set()
- #添加对象
- s1.add('amd')
- #添加对象
- s1.add('amd')
- print(s1)
- print(s1)
- print(type(s1))
- --------------------------------------------------------------------------------
- 输出:
- #这里表明了 集合里不允许重复的元素存在所以只打印了一个
- {'amd'}
- {'amd'}
- <class 'set'>
创建set集合
- __author__ = 'Administrator'
- # -*- coding:utf-8 -*-
- s1 = set()
- s1.add('amd')
- s1.add('amd')
- print(s1)
- #打印清空数据
- print(s1.clear())
- -----------------------------------------------------------------------------------
- 输出:
- #数据存在的时候
- {'amd'}
- #清空后会显示None
- None
set清空数据clear()
- '''
- #找到不同的创建一个新的集合,
- #注意: 而不是修改原来的集合
- def difference(self, *args, **kwargs): # real signature unknown
- """
- '''
- #set()内可以传入一个列表,传入的参数set会自动的将列表转为集合,并且把重复的去掉
- aa = set(['a','b','c','c'])
- print(type(aa))
- print(aa)
- ww = set(['a','c'])
- a1 = aa.difference(ww)
- print(a1)
difference(self, *args, **kwargs):对比两个集合找到不同后生成一个新的集合
- '''
- #删除当前set中的所有包含在参数里的元素
- #在原有的集合里删除所传入的元素
- #注意: 是在原有的集合里删除,不是生成信的集合
- def difference_update(self, *args, **kwargs): # real signature unknown
- """ Remove all elements of another set from this set. """
- pass
- '''
- aa = set(['a','b','c','c'])
- a1 = set(['a','c'])
- #difference_update 没有生成信的集合而是修改了原有的集合
- a2 = aa.difference_update(a1)
- print(aa)
- print(a2)
difference_update(self, *args, **kwargs):删除当前set集合中的所有包含在参数里的元素
- #取交集,取两个集合中相同的交集,
- #注意: 并且生成一个新的集合,不是修改原来的集合
- def intersection(self, *args, **kwargs): # real signature unknown
- """
- Return the intersection of two sets as a new set.
- (i.e. all elements that are in both sets.)
- """
- pass
- '''
- a = set(['a','c','d'])
- a1 = set(['g','w','a'])
- ww = a.intersection(a1)
- print(ww)
- print(type(ww))
- -----------------------------------------------------------------------------------
- 输出:
- {'a'}
- <class 'set'>
- '''
- #对比两个集合取交集,
- #注意: 这里是取到的交集修改原来的集合,不是生成一个新的集合
- def intersection_update(self, *args, **kwargs): # real signature unknown
- """ Update a set with the intersection of itself and another. """
- pass
- '''
- a = set(['a','c','d'])
- a1 = set(['g','w','a'])
- ww = a.intersection_update(a1)
- print(a)
- print(type(a))
- print(ww)
- print(type(ww))
- ------------------------------------------------------------------------------------
- 输出:
- {'a'}
- <class 'set'>
- None
- <class 'NoneType'>
- '''
- #对比两个集合的交集,如果没有交集 返回True
- def isdisjoint(self, *args, **kwargs): # real signature unknown
- """ Return True if two sets have a null intersection. """
- pass
- '''
- a = set(['a','c','d'])
- a1 = set(['g','w',])
- ww = a.isdisjoint(a1)
- print(ww)
- -----------------------------------------------------------------------------------
- 输出:
- True
- ==============================================
- a = set(['a','c','d',])
- a1 = set(['g','w','a',])
- ww = a.isdisjoint(a1)
- print(ww)
- ----------------------------------------------------------------------------------
- 输出:
- False
isdisjoint(self, *args, **kwargs):对比两个集合的交集,如果没有交集 返回True
- '''
- #是否是子集的
- def issubset(self, *args, **kwargs): # real signature unknown
- """ Report whether another set contains this set. """
- pass
- '''
- a = set(['a','c','d',])
- a1 = set(['a','c','d',])
- #测试是否 a 中的每一个元素都在 a1 中
- ww = a.issubset(a1)
- print(ww)
- ----------------------------------------------------------------------------------
- 输出:
- True
issubset(self, *args, **kwargs):是否是子集的
- '''
- #是否是父集
- def issuperset(self, *args, **kwargs): # real signature unknown
- """ Report whether this set contains another set. """
- pass
- '''
- a = set(['a','c','d',])
- a1 = set(['a','c','d',])
- #测试是否 a1 中的每一个元素都在 a 中
- ee = a.issuperset(a1)
- print(ee)
- -----------------------------------------------------------------------------------
- 输出:
- True
def issuperset(self, *args, **kwargs):
- '''
- #pop是去一个元素里随机取一个值并且赋给一个新的变量
- def pop(self, *args, **kwargs): # real signature unknown
- """
- Remove and return an arbitrary set element.
- Raises KeyError if the set is empty.
- """
- pass
- '''
- a = set(['a','c','d',])
- a1 = set(['a','c','d',])
- w1 = a.pop()
- print(w1)
def pop(self, *args, **kwargs):
- '''
- #移除一个元素
- def remove(self, *args, **kwargs): # real signature unknown
- """
- Remove an element from a set; it must be a member.
- If the element is not a member, raise a KeyError.
- """
- pass
- '''
- a = set(['a','c','d',])
- a.remove('c')
- print(a)
- ------------------------------------------------------------------------------------
- 输出:
- {'d', 'a'}
def remove(self, *args, **kwargs):#移除一个元素
- '''
- #计算两个集合的 差集
- #注意: 计算两个几个的差集 并创建新的集合
- def symmetric_difference(self, *args, **kwargs): # real signature unknown
- """
- Return the symmetric difference of two sets as a new set.
- (i.e. all elements that are in exactly one of the sets.)
- """
- pass
- '''
- a = set(['a','c','d',])
- b = set(['a','c','w',])
- ww = a.symmetric_difference(b)
- print(ww)
- ----------------------------------------------------------------------------------
- 输出:
- {'w', 'd'}
def symmetric_difference(self, *args, **kwargs):计算两个集合的 差集,并生成新的集合
- '''
- #计算两个集合的 差集
- #注意: 计算两个几个的差集 并修改原来的集合
- def symmetric_difference_update(self, *args, **kwargs): # real signature unknown
- """ Update a set with the symmetric difference of itself and another. """
- pass
- '''
- a = set(['a','c','d',])
- b = set(['a','c','w',])
- a.symmetric_difference_update(b)
- #打印两个几个的差集
- print(a)
- ----------------------------------------------------------------------------------
- 输出:
- {'d', 'w'}
- ==============================================
- a = set(['a','c','d',])
- b = set(['a','c','w',])
- a.symmetric_difference_update(b)
- #打印两个集合的交集
- print(b)
- ------------------------------------------------------------------------------
- 输出:
- {'c', 'a', 'w'}
def symmetric_difference_update(self, *args, **kwargs):计算两个几个的差集 并修改原来的集合
- '''
- #取两个集合的并集
- #注意:将两个集合去除重复,并合并生成一个新的变量
- def union(self, *args, **kwargs): # real signature unknown
- """
- Return the union of sets as a new set.
- (i.e. all elements that are in either set.)
- """
- pass
- '''
- a = set(['a','c','d',])
- b = set(['a','c','w','wer'])
- bb = a.union(b)
- print(bb)
- ----------------------------------------------------------------------------------
- 输出:
- {'wer', 'a', 'c', 'w', 'd'}
def union(self, *args, **kwargs):#注意:将两个集合去除重复,并合并生成一个新的变量
- '''
- #更新一个集合
- #注意:这里更新的原有的集合,不是更新后新生成一个集合
- def update(self, *args, **kwargs): # real signature unknown
- """ Update a set with the union of itself and others. """
- pass
- '''
- a = set(['a','c','d',])
- b = set(['a','c','w','wer'])
- a.update(set(['wewewe']))
- print(a)
- a.update(b)
- print(a)
- ----------------------------------------------------------------------------------
- 输出:
- {'wewewe', 'a', 'd', 'c'}
- {'a', 'c', 'wewewe', 'wer', 'd', 'w'}
def update(self, *args, **kwargs): 更新一个集合
练习:寻找差异
- # 数据库中原有
- old_dict = {
- "#1":{ 'hostname':c1, 'cpu_count': 2, 'mem_capicity': 80 },
- "#2":{ 'hostname':c1, 'cpu_count': 2, 'mem_capicity': 80 }
- "#3":{ 'hostname':c1, 'cpu_count': 2, 'mem_capicity': 80 }
- }
- # cmdb 新汇报的数据
- new_dict = {
- "#1":{ 'hostname':c1, 'cpu_count': 2, 'mem_capicity': 800 },
- "#3":{ 'hostname':c1, 'cpu_count': 2, 'mem_capicity': 80 }
- "#4":{ 'hostname':c2, 'cpu_count': 2, 'mem_capicity': 80 }
- }
注意:1.无需考虑内部元素是否改变,只要原来存在,新汇报也存在,就是需要更新
2.原来的不存在就插入,新汇报的就插入
3.原来的存在,新汇报的不存在就删除
4.只需要打印出 更新的有哪些,删除的有哪些,插入的有哪些
- __author__ = 'Administrator'
- # -*- coding:utf-8 -*-
- old_dict = {
- "#1":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 },
- "#2":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 },
- "#3":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 },
- }
- new_dict = {
- "#1":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 800 },
- "#3":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 },
- "#4":{ 'hostname':'c2', 'cpu_count': 2, 'mem_capicity': 80 },
- }
- #用set集合中的取交集来判断字典的key是否都存在,如果都存在的生成一个新的变量,并且定义为集合
- update_dict = set(old_dict.keys()).intersection(set(new_dict.keys()))
- #print(update_dict)
- #定义一个空的要插入的列表
- new_list = []
- #定义一个空的要删除的列表
- delete_list = []
- #这里是把原来的数据old_dict 的key赋值给i
- for i in old_dict.keys():
- #这里判断循环中的 i 如果不在update_dict集合里,就添加到删除列表里
- if i not in update_dict:
- delete_list.append(i)
- #这里是把汇报上来的的数据new_dict 的key赋值给i
- for i in new_dict.keys():
- #这里判断 i 如果不在更新的集合中,就添加到插入的列表里
- if i not in update_dict:
- new_list.append(i)
- #一下是前几天提到的格式化输出,下面列出了两种方法,
- msg = '''
- 更新:%s
- 插入:%s
- 删除:%s
- ''' %(update_dict,new_list,delete_list)
- print("更新:%s\n删除:%s\n插入:%s" %(update_dict,delete_list,new_list))
- print(msg)
找差异源代码
collections系列
Counter功能在 collections模块里所有在使用 Counter功能的时候需要导入 collections 模块(import collections)
一.计数器(counter)
Counter是对字典类型的补充,用于追踪值得出现次数.
PS:具备字典的所有功能 加上 自己的功能
- collections 在Python里是一个文件夹 python 在导入的时候 是导入的 collections 的文件夹,导入之后 Python 会在导入的文件夹内查找Counter,找到Counter之后就可以创建对象
- collections.Counter() 的功能是将元素出现的次数做一个统计
例:
- __author__ = 'Administrator'
- import collections
- aa = collections.Counter('aabbccddeeffgg')
- print(aa)
- print(type(aa))
- -----------------------------------------------------------------------------------
- 输出:
- Counter({'g': 2, 'd': 2, 'b': 2, 'c': 2, 'f': 2, 'a': 2, 'e': 2})
- <class 'collections.Counter'>
- ########################################################################
- ### Counter
- ########################################################################
- class Counter(dict):
- '''Dict subclass for counting hashable items. Sometimes called a bag
- or multiset. Elements are stored as dictionary keys and their counts
- are stored as dictionary values.
- >>> c = Counter('abcdeabcdabcaba') # count elements from a string
- >>> c.most_common(3) # three most common elements
- [('a', 5), ('b', 4), ('c', 3)]
- >>> sorted(c) # list all unique elements
- ['a', 'b', 'c', 'd', 'e']
- >>> ''.join(sorted(c.elements())) # list elements with repetitions
- 'aaaaabbbbcccdde'
- >>> sum(c.values()) # total of all counts
- >>> c['a'] # count of letter 'a'
- >>> for elem in 'shazam': # update counts from an iterable
- ... c[elem] += 1 # by adding 1 to each element's count
- >>> c['a'] # now there are seven 'a'
- >>> del c['b'] # remove all 'b'
- >>> c['b'] # now there are zero 'b'
- >>> d = Counter('simsalabim') # make another counter
- >>> c.update(d) # add in the second counter
- >>> c['a'] # now there are nine 'a'
- >>> c.clear() # empty the counter
- >>> c
- Counter()
- Note: If a count is set to zero or reduced to zero, it will remain
- in the counter until the entry is deleted or the counter is cleared:
- >>> c = Counter('aaabbc')
- >>> c['b'] -= 2 # reduce the count of 'b' by two
- >>> c.most_common() # 'b' is still in, but its count is zero
- [('a', 3), ('c', 1), ('b', 0)]
- '''
- # References:
- # http://en.wikipedia.org/wiki/Multiset
- # http://www.gnu.org/software/smalltalk/manual-base/html_node/Bag.html
- # http://www.demo2s.com/Tutorial/Cpp/0380__set-multiset/Catalog0380__set-multiset.htm
- # http://code.activestate.com/recipes/259174/
- # Knuth, TAOCP Vol. II section 4.6.3
- def __init__(self, iterable=None, **kwds):
- '''Create a new, empty Counter object. And if given, count elements
- from an input iterable. Or, initialize the count from another mapping
- of elements to their counts.
- >>> c = Counter() # a new, empty counter
- >>> c = Counter('gallahad') # a new counter from an iterable
- >>> c = Counter({'a': 4, 'b': 2}) # a new counter from a mapping
- >>> c = Counter(a=4, b=2) # a new counter from keyword args
- '''
- super(Counter, self).__init__()
- self.update(iterable, **kwds)
- def __missing__(self, key):
- """ 对于不存在的元素,返回计数器为0 """
- 'The count of elements not in the Counter is zero.'
- # Needed so that self[missing_item] does not raise KeyError
- return 0
- def most_common(self, n=None):
- """ 数量大于等n的所有元素和计数器 """
- '''List the n most common elements and their counts from the most
- common to the least. If n is None, then list all element counts.
- >>> Counter('abcdeabcdabcaba').most_common(3)
- [('a', 5), ('b', 4), ('c', 3)]
- '''
- # Emulate Bag.sortedByCount from Smalltalk
- if n is None:
- return sorted(self.iteritems(), key=_itemgetter(1), reverse=True)
- return _heapq.nlargest(n, self.iteritems(), key=_itemgetter(1))
- def elements(self):
- """ 计数器中的所有元素,注:此处非所有元素集合,而是包含所有元素集合的迭代器 """
- '''Iterator over elements repeating each as many times as its count.
- >>> c = Counter('ABCABC')
- >>> sorted(c.elements())
- ['A', 'A', 'B', 'B', 'C', 'C']
- # Knuth's example for prime factors of 1836: 2**2 * 3**3 * 17**1
- >>> prime_factors = Counter({2: 2, 3: 3, 17: 1})
- >>> product = 1
- >>> for factor in prime_factors.elements(): # loop over factors
- ... product *= factor # and multiply them
- >>> product
- Note, if an element's count has been set to zero or is a negative
- number, elements() will ignore it.
- '''
- # Emulate Bag.do from Smalltalk and Multiset.begin from C++.
- return _chain.from_iterable(_starmap(_repeat, self.iteritems()))
- # Override dict methods where necessary
- @classmethod
- def fromkeys(cls, iterable, v=None):
- # There is no equivalent method for counters because setting v=1
- # means that no element can have a count greater than one.
- raise NotImplementedError(
- 'Counter.fromkeys() is undefined. Use Counter(iterable) instead.')
- def update(self, iterable=None, **kwds):
- """ 更新计数器,其实就是增加;如果原来没有,则新建,如果有则加一 """
- '''Like dict.update() but add counts instead of replacing them.
- Source can be an iterable, a dictionary, or another Counter instance.
- >>> c = Counter('which')
- >>> c.update('witch') # add elements from another iterable
- >>> d = Counter('watch')
- >>> c.update(d) # add elements from another counter
- >>> c['h'] # four 'h' in which, witch, and watch
- '''
- # The regular dict.update() operation makes no sense here because the
- # replace behavior results in the some of original untouched counts
- # being mixed-in with all of the other counts for a mismash that
- # doesn't have a straight-forward interpretation in most counting
- # contexts. Instead, we implement straight-addition. Both the inputs
- # and outputs are allowed to contain zero and negative counts.
- if iterable is not None:
- if isinstance(iterable, Mapping):
- if self:
- self_get = self.get
- for elem, count in iterable.iteritems():
- self[elem] = self_get(elem, 0) + count
- else:
- super(Counter, self).update(iterable) # fast path when counter is empty
- else:
- self_get = self.get
- for elem in iterable:
- self[elem] = self_get(elem, 0) + 1
- if kwds:
- self.update(kwds)
- def subtract(self, iterable=None, **kwds):
- """ 相减,原来的计数器中的每一个元素的数量减去后添加的元素的数量 """
- '''Like dict.update() but subtracts counts instead of replacing them.
- Counts can be reduced below zero. Both the inputs and outputs are
- allowed to contain zero and negative counts.
- Source can be an iterable, a dictionary, or another Counter instance.
- >>> c = Counter('which')
- >>> c.subtract('witch') # subtract elements from another iterable
- >>> c.subtract(Counter('watch')) # subtract elements from another counter
- >>> c['h'] # 2 in which, minus 1 in witch, minus 1 in watch
- >>> c['w'] # 1 in which, minus 1 in witch, minus 1 in watch
- -1
- '''
- if iterable is not None:
- self_get = self.get
- if isinstance(iterable, Mapping):
- for elem, count in iterable.items():
- self[elem] = self_get(elem, 0) - count
- else:
- for elem in iterable:
- self[elem] = self_get(elem, 0) - 1
- if kwds:
- self.subtract(kwds)
- def copy(self):
- """ 拷贝 """
- 'Return a shallow copy.'
- return self.__class__(self)
- def __reduce__(self):
- """ 返回一个元组(类型,元组) """
- return self.__class__, (dict(self),)
- def __delitem__(self, elem):
- """ 删除元素 """
- 'Like dict.__delitem__() but does not raise KeyError for missing values.'
- if elem in self:
- super(Counter, self).__delitem__(elem)
- def __repr__(self):
- if not self:
- return '%s()' % self.__class__.__name__
- items = ', '.join(map('%r: %r'.__mod__, self.most_common()))
- return '%s({%s})' % (self.__class__.__name__, items)
- # Multiset-style mathematical operations discussed in:
- # Knuth TAOCP Volume II section 4.6.3 exercise 19
- # and at http://en.wikipedia.org/wiki/Multiset
- #
- # Outputs guaranteed to only include positive counts.
- #
- # To strip negative and zero counts, add-in an empty counter:
- # c += Counter()
- def __add__(self, other):
- '''Add counts from two counters.
- >>> Counter('abbb') + Counter('bcc')
- Counter({'b': 4, 'c': 2, 'a': 1})
- '''
- if not isinstance(other, Counter):
- return NotImplemented
- result = Counter()
- for elem, count in self.items():
- newcount = count + other[elem]
- if newcount > 0:
- result[elem] = newcount
- for elem, count in other.items():
- if elem not in self and count > 0:
- result[elem] = count
- return result
- def __sub__(self, other):
- ''' Subtract count, but keep only results with positive counts.
- >>> Counter('abbbc') - Counter('bccd')
- Counter({'b': 2, 'a': 1})
- '''
- if not isinstance(other, Counter):
- return NotImplemented
- result = Counter()
- for elem, count in self.items():
- newcount = count - other[elem]
- if newcount > 0:
- result[elem] = newcount
- for elem, count in other.items():
- if elem not in self and count < 0:
- result[elem] = 0 - count
- return result
- def __or__(self, other):
- '''Union is the maximum of value in either of the input counters.
- >>> Counter('abbb') | Counter('bcc')
- Counter({'b': 3, 'c': 2, 'a': 1})
- '''
- if not isinstance(other, Counter):
- return NotImplemented
- result = Counter()
- for elem, count in self.items():
- other_count = other[elem]
- newcount = other_count if count < other_count else count
- if newcount > 0:
- result[elem] = newcount
- for elem, count in other.items():
- if elem not in self and count > 0:
- result[elem] = count
- return result
- def __and__(self, other):
- ''' Intersection is the minimum of corresponding counts.
- >>> Counter('abbb') & Counter('bcc')
- Counter({'b': 1})
- '''
- if not isinstance(other, Counter):
- return NotImplemented
- result = Counter()
- for elem, count in self.items():
- other_count = other[elem]
- newcount = count if count < other_count else other_count
- if newcount > 0:
- result[elem] = newcount
- return result
- Counter
collections方法
- 方法:most_common 是按照元素出现的次数 从多到少取 前4位 "we = aa.most_common(4)"
- __author__ = 'Administrator'
- import collections
- aa = collections.Counter('aabbcccddddeeeeeffffffggggggg')
- we = aa.most_common(4)
- print(we)
- print(type(aa))
- ----------------------------------------------------------------------------------
- 输出:
- [('g', 7), ('f', 6), ('e', 5), ('d', 4)]
- <class 'collections.Counter'>
elements
items
- __author__ = 'Administrator'
- # -*- coding:utf-8 -*-
- import collections
- aa = collections.Counter('aabbccddeeffgg')
- for item in aa.elements():
- print(item)
- for k,v in aa.items():
- print(k,v)
- ---------------------------------------------------------------------------------------------
- 输出:
- b
- b
- e
- e
- f
- f
- c
- c
- a
- a
- d
- d
- g
- g
- b 2
- e 2
- f 2
- c 2
- a 2
- d 2
- g 2
- __author__ = 'Administrator'
- # -*- coding:utf-8 -*-
- import collections
- aa = collections.Counter(['','','',''])
- print(aa)
- aa.update(['aa','','ff'])
- print(aa)
- --------------------------------------------------------------
- 输出:
- Counter({'': 1, '': 1, '': 1, '': 1})
- Counter({'': 2, '': 1, 'aa': 1, '': 1, '': 1, 'ff': 1})
update更新计数器,增加元素出现的次数
- __author__ = 'Administrator'
- # -*- coding:utf-8 -*-
- import collections
- aa = collections.Counter(['','','',''])
- print(aa)
- aa.update(['aa','','ff'])
- print(aa)
- aa.subtract(['aa',''])
- print(aa)
- --------------------------------------
- 输出:
- Counter({'': 1, '': 1, '': 1, '': 1})
- #原来33 出现了两次
- Counter({'': 2, 'aa': 1, '': 1, '': 1, 'ff': 1, '': 1})
- #通过subtract 33变成了一次
- Counter({'': 1, '': 1, 'ff': 1, '': 1, '': 1, 'aa': 0})
subtract 减少元素出现的次数
- 二、有序字典(orderedDict)
orderdDict是对字典类型的补充,他记住了字典元素添加的顺序
- class OrderedDict(dict):
- 'Dictionary that remembers insertion order'
- # An inherited dict maps keys to values.
- # The inherited dict provides __getitem__, __len__, __contains__, and get.
- # The remaining methods are order-aware.
- # Big-O running times for all methods are the same as regular dictionaries.
- # The internal self.__map dict maps keys to links in a doubly linked list.
- # The circular doubly linked list starts and ends with a sentinel element.
- # The sentinel element never gets deleted (this simplifies the algorithm).
- # Each link is stored as a list of length three: [PREV, NEXT, KEY].
- def __init__(self, *args, **kwds):
- '''Initialize an ordered dictionary. The signature is the same as
- regular dictionaries, but keyword arguments are not recommended because
- their insertion order is arbitrary.
- '''
- if len(args) > 1:
- raise TypeError('expected at most 1 arguments, got %d' % len(args))
- try:
- self.__root
- except AttributeError:
- self.__root = root = [] # sentinel node
- root[:] = [root, root, None]
- self.__map = {}
- self.__update(*args, **kwds)
- def __setitem__(self, key, value, dict_setitem=dict.__setitem__):
- 'od.__setitem__(i, y) <==> od[i]=y'
- # Setting a new item creates a new link at the end of the linked list,
- # and the inherited dictionary is updated with the new key/value pair.
- if key not in self:
- root = self.__root
- last = root[0]
- last[1] = root[0] = self.__map[key] = [last, root, key]
- return dict_setitem(self, key, value)
- def __delitem__(self, key, dict_delitem=dict.__delitem__):
- 'od.__delitem__(y) <==> del od[y]'
- # Deleting an existing item uses self.__map to find the link which gets
- # removed by updating the links in the predecessor and successor nodes.
- dict_delitem(self, key)
- link_prev, link_next, _ = self.__map.pop(key)
- link_prev[1] = link_next # update link_prev[NEXT]
- link_next[0] = link_prev # update link_next[PREV]
- def __iter__(self):
- 'od.__iter__() <==> iter(od)'
- # Traverse the linked list in order.
- root = self.__root
- curr = root[1] # start at the first node
- while curr is not root:
- yield curr[2] # yield the curr[KEY]
- curr = curr[1] # move to next node
- def __reversed__(self):
- 'od.__reversed__() <==> reversed(od)'
- # Traverse the linked list in reverse order.
- root = self.__root
- curr = root[0] # start at the last node
- while curr is not root:
- yield curr[2] # yield the curr[KEY]
- curr = curr[0] # move to previous node
- def clear(self):
- 'od.clear() -> None. Remove all items from od.'
- root = self.__root
- root[:] = [root, root, None]
- self.__map.clear()
- dict.clear(self)
- # -- the following methods do not depend on the internal structure --
- def keys(self):
- 'od.keys() -> list of keys in od'
- return list(self)
- def values(self):
- 'od.values() -> list of values in od'
- return [self[key] for key in self]
- def items(self):
- 'od.items() -> list of (key, value) pairs in od'
- return [(key, self[key]) for key in self]
- def iterkeys(self):
- 'od.iterkeys() -> an iterator over the keys in od'
- return iter(self)
- def itervalues(self):
- 'od.itervalues -> an iterator over the values in od'
- for k in self:
- yield self[k]
- def iteritems(self):
- 'od.iteritems -> an iterator over the (key, value) pairs in od'
- for k in self:
- yield (k, self[k])
- update = MutableMapping.update
- __update = update # let subclasses override update without breaking __init__
- __marker = object()
- def pop(self, key, default=__marker):
- '''od.pop(k[,d]) -> v, remove specified key and return the corresponding
- value. If key is not found, d is returned if given, otherwise KeyError
- is raised.
- '''
- if key in self:
- result = self[key]
- del self[key]
- return result
- if default is self.__marker:
- raise KeyError(key)
- return default
- def setdefault(self, key, default=None):
- 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od'
- if key in self:
- return self[key]
- self[key] = default
- return default
- def popitem(self, last=True):
- '''od.popitem() -> (k, v), return and remove a (key, value) pair.
- Pairs are returned in LIFO order if last is true or FIFO order if false.
- '''
- if not self:
- raise KeyError('dictionary is empty')
- key = next(reversed(self) if last else iter(self))
- value = self.pop(key)
- return key, value
- def __repr__(self, _repr_running={}):
- 'od.__repr__() <==> repr(od)'
- call_key = id(self), _get_ident()
- if call_key in _repr_running:
- return '...'
- _repr_running[call_key] = 1
- try:
- if not self:
- return '%s()' % (self.__class__.__name__,)
- return '%s(%r)' % (self.__class__.__name__, self.items())
- finally:
- del _repr_running[call_key]
- def __reduce__(self):
- 'Return state information for pickling'
- items = [[k, self[k]] for k in self]
- inst_dict = vars(self).copy()
- for k in vars(OrderedDict()):
- inst_dict.pop(k, None)
- if inst_dict:
- return (self.__class__, (items,), inst_dict)
- return self.__class__, (items,)
- def copy(self):
- 'od.copy() -> a shallow copy of od'
- return self.__class__(self)
- @classmethod
- def fromkeys(cls, iterable, value=None):
- '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S.
- If not specified, the value defaults to None.
- '''
- self = cls()
- for key in iterable:
- self[key] = value
- return self
- def __eq__(self, other):
- '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive
- while comparison to a regular mapping is order-insensitive.
- '''
- if isinstance(other, OrderedDict):
- return dict.__eq__(self, other) and all(_imap(_eq, self, other))
- return dict.__eq__(self, other)
- def __ne__(self, other):
- 'od.__ne__(y) <==> od!=y'
- return not self == other
- # -- the following methods support python 3.x style dictionary views --
- def viewkeys(self):
- "od.viewkeys() -> a set-like object providing a view on od's keys"
- return KeysView(self)
- def viewvalues(self):
- "od.viewvalues() -> an object providing a view on od's values"
- return ValuesView(self)
- def viewitems(self):
- "od.viewitems() -> a set-like object providing a view on od's items"
- return ItemsView(self)
- OrderedDict
orderedDict
- dic = collections.OrderedDict()
- dic['k1'] = 'v1'
- dic['k2'] = 'v2'
- dic['k3'] = 'v3'
- print(dic)
- print(dic)
- print(dic)
- print(type(dic))
- ----------------------------------------------------------------------------------
- 输出:
- OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])
- OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])
- OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])
- <class 'collections.OrderedDict'>
- ----------------------------------------------------------------------------------
- 无需字典:
- __author__ = 'Administrator'
- # -*- coding:utf-8 -*-
- import collections
- # dic = collections.OrderedDict()
- dic = dict()
- dic['k1'] = 'v1'
- dic['k2'] = 'v2'
- dic['k3'] = 'v3'
- print(dic)
- print(dic)
- print(dic)
- print(type(dic))
- --------------------------------------------------------
- #这里就会变成无序字典了
- 输出:
- {'k2': 'v2', 'k3': 'v3', 'k1': 'v1'}
- {'k2': 'v2', 'k3': 'v3', 'k1': 'v1'}
- {'k2': 'v2', 'k3': 'v3', 'k1': 'v1'}
- <class 'dict'>
OrderedDict有序字典与无序字典dict
- __author__ = 'Administrator'
- # -*- coding:utf-8 -*-
- import collections
- dic = collections.OrderedDict()
- # dic = dict()
- dic['k1'] = 'v1'
- dic['k2'] = 'v2'
- dic['k3'] = 'v3'
- print(dic)
- dic.move_to_end('k1')
- print(dic)
- -----------------------------------------------
- 输出:
- OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])
- OrderedDict([('k2', 'v2'), ('k3', 'v3'), ('k1', 'v1')])
move_to_end:把第一个拿到最后
- __author__ = 'Administrator'
- # -*- coding:utf-8 -*-
- import collections
- dic = collections.OrderedDict()
- # dic = dict()
- dic['k1'] = 'v1'
- dic['k2'] = 'v2'
- dic['k3'] = 'v3'
- print(dic)
- dic.popitem()
- print(dic)
- dic.popitem()
- print(dic)
- --------------------------------------------------------------------------------
- 输出:
- OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])
- OrderedDict([('k1', 'v1'), ('k2', 'v2')])
- OrderedDict([('k1', 'v1')])
- 在看一组例子;
- __author__ = 'Administrator'
- # -*- coding:utf-8 -*-
- import collections
- dic = collections.OrderedDict()
- # dic = dict()
- dic['k1'] = 'v1'
- dic['k2'] = 'v2'
- dic['k3'] = 'v3'
- print(dic)
- a7 = dic.popitem()
- print(a7)
- a8 = dic.popitem()
- print(a8)
- a9 = dic.popitem()
- print(a9)
- print(dic)
- ---------------------------------------------------------------------
- 输出;
- OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])
- ('k3', 'v3')
- ('k2', 'v2')
- ('k1', 'v1')
- OrderedDict()
- ---------------------------
- __author__ = 'Administrator'
- # -*- coding:utf-8 -*-
- import collections
- dic = collections.OrderedDict()
- # dic = dict()
- dic['k1'] = 'v1'
- dic['k2'] = 'v2'
- dic['k3'] = 'v3'
- print(dic)
- a1 = dic.pop('k1')
- print(a1)
- print(dic)
- ------------------------------------------------
- 输出:
- OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])
- v1
- OrderedDict([('k2', 'v2'), ('k3', 'v3')])
popitem:是按照后进先出的方法,拿到一个值赋予新的变量
- __author__ = 'Administrator'
- # -*- coding:utf-8 -*-
- import collections
- dic = collections.OrderedDict()
- # dic = dict()
- dic['k1'] = 'v1'
- dic['k2'] = 'v2'
- dic['k3'] = 'v3'
- print(dic)
- dic.update({'k1':'v111','k10':'v10'})
- print(dic)
- --------------------------------
- OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])
- OrderedDict([('k1', 'v111'), ('k2', 'v2'), ('k3', 'v3'), ('k10', 'v10')])
update:更新原来的字典,如果原来字典没有则添加
三、默认字典(defaultdict)
defaultdict是对字典的类型的补充,他默认给字典的值设置了一个类型。
- class defaultdict(dict):
- """
- defaultdict(default_factory[, ...]) --> dict with default factory
- The default factory is called without arguments to produce
- a new value when a key is not present, in __getitem__ only.
- A defaultdict compares equal to a dict with the same items.
- All remaining arguments are treated the same as if they were
- passed to the dict constructor, including keyword arguments.
- """
- def copy(self): # real signature unknown; restored from __doc__
- """ D.copy() -> a shallow copy of D. """
- pass
- def __copy__(self, *args, **kwargs): # real signature unknown
- """ D.copy() -> a shallow copy of D. """
- pass
- def __getattribute__(self, name): # real signature unknown; restored from __doc__
- """ x.__getattribute__('name') <==> x.name """
- pass
- def __init__(self, default_factory=None, **kwargs): # known case of _collections.defaultdict.__init__
- """
- defaultdict(default_factory[, ...]) --> dict with default factory
- The default factory is called without arguments to produce
- a new value when a key is not present, in __getitem__ only.
- A defaultdict compares equal to a dict with the same items.
- All remaining arguments are treated the same as if they were
- passed to the dict constructor, including keyword arguments.
- # (copied from class doc)
- """
- pass
- def __missing__(self, key): # real signature unknown; restored from __doc__
- """
- __missing__(key) # Called by __getitem__ for missing key; pseudo-code:
- if self.default_factory is None: raise KeyError((key,))
- self[key] = value = self.default_factory()
- return value
- """
- pass
- def __reduce__(self, *args, **kwargs): # real signature unknown
- """ Return state information for pickling. """
- pass
- def __repr__(self): # real signature unknown; restored from __doc__
- """ x.__repr__() <==> repr(x) """
- pass
- default_factory = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
- """Factory for default value called by __missing__()."""
- defaultdict
defaultdict
- __author__ = 'Administrator'
- # -*- coding:utf-8 -*-
- import collections
- #这里定义了一个字典输入的类型为list
- dic = collections.defaultdict(list)
- dic['k1'].append('asdf')
- print(dic['k1'])
- ---------------
- 输出:
- ['asdf']
defaultdict(list):设置一个字典输入的默认类型
四、可命名元组(namedtuple)
根据nametuple可以创建一个包含tuple所有功能以及其他功能的类型。
- class Mytuple(__builtin__.tuple)
- | Mytuple(x, y)
- |
- | Method resolution order:
- | Mytuple
- | __builtin__.tuple
- | __builtin__.object
- |
- | Methods defined here:
- |
- | __getnewargs__(self)
- | Return self as a plain tuple. Used by copy and pickle.
- |
- | __getstate__(self)
- | Exclude the OrderedDict from pickling
- |
- | __repr__(self)
- | Return a nicely formatted representation string
- |
- | _asdict(self)
- | Return a new OrderedDict which maps field names to their values
- |
- | _replace(_self, **kwds)
- | Return a new Mytuple object replacing specified fields with new values
- |
- | ----------------------------------------------------------------------
- | Class methods defined here:
- |
- | _make(cls, iterable, new=<built-in method __new__ of type object>, len=<built-in function len>) from __builtin__.type
- | Make a new Mytuple object from a sequence or iterable
- |
- | ----------------------------------------------------------------------
- | Static methods defined here:
- |
- | __new__(_cls, x, y)
- | Create new instance of Mytuple(x, y)
- |
- | ----------------------------------------------------------------------
- | Data descriptors defined here:
- |
- | __dict__
- | Return a new OrderedDict which maps field names to their values
- |
- | x
- | Alias for field number 0
- |
- | y
- | Alias for field number 1
- |
- | ----------------------------------------------------------------------
- | Data and other attributes defined here:
- |
- | _fields = ('x', 'y')
- |
- | ----------------------------------------------------------------------
- | Methods inherited from __builtin__.tuple:
- |
- | __add__(...)
- | x.__add__(y) <==> x+y
- |
- | __contains__(...)
- | x.__contains__(y) <==> y in x
- |
- | __eq__(...)
- | x.__eq__(y) <==> x==y
- |
- | __ge__(...)
- | x.__ge__(y) <==> x>=y
- |
- | __getattribute__(...)
- | x.__getattribute__('name') <==> x.name
- |
- | __getitem__(...)
- | x.__getitem__(y) <==> x[y]
- |
- | __getslice__(...)
- | x.__getslice__(i, j) <==> x[i:j]
- |
- | Use of negative indices is not supported.
- |
- | __gt__(...)
- | x.__gt__(y) <==> x>y
- |
- | __hash__(...)
- | x.__hash__() <==> hash(x)
- |
- | __iter__(...)
- | x.__iter__() <==> iter(x)
- |
- | __le__(...)
- | x.__le__(y) <==> x<=y
- |
- | __len__(...)
- | x.__len__() <==> len(x)
- |
- | __lt__(...)
- | x.__lt__(y) <==> x<y
- |
- | __mul__(...)
- | x.__mul__(n) <==> x*n
- |
- | __ne__(...)
- | x.__ne__(y) <==> x!=y
- |
- | __rmul__(...)
- | x.__rmul__(n) <==> n*x
- |
- | __sizeof__(...)
- | T.__sizeof__() -- size of T in memory, in bytes
- |
- | count(...)
- | T.count(value) -> integer -- return number of occurrences of value
- |
- | index(...)
- | T.index(value, [start, [stop]]) -> integer -- return first index of value.
- | Raises ValueError if the value is not present.
- Mytuple
nametuple
- import collections
- #创建类,等同于defaultdict
- #根据类创建对象
- MytupleClass = collections.namedtuple('Mytuple',['x', 'y', 'z'])
- aa = MytupleClass(11,22,33)
- print(aa.x,aa.y,aa.z)
- -----------------------------------
- 输出:
- 11 22 33
namedtuple
五、双向队列(deque)
一个线程安全的双向队列
- class deque(object):
- """
- deque([iterable[, maxlen]]) --> deque object
- Build an ordered collection with optimized access from its endpoints.
- """
- def append(self, *args, **kwargs): # real signature unknown
- """ Add an element to the right side of the deque. """
- pass
- def appendleft(self, *args, **kwargs): # real signature unknown
- """ Add an element to the left side of the deque. """
- pass
- def clear(self, *args, **kwargs): # real signature unknown
- """ Remove all elements from the deque. """
- pass
- def count(self, value): # real signature unknown; restored from __doc__
- """ D.count(value) -> integer -- return number of occurrences of value """
- return 0
- def extend(self, *args, **kwargs): # real signature unknown
- """ Extend the right side of the deque with elements from the iterable """
- pass
- def extendleft(self, *args, **kwargs): # real signature unknown
- """ Extend the left side of the deque with elements from the iterable """
- pass
- def pop(self, *args, **kwargs): # real signature unknown
- """ Remove and return the rightmost element. """
- pass
- def popleft(self, *args, **kwargs): # real signature unknown
- """ Remove and return the leftmost element. """
- pass
- def remove(self, value): # real signature unknown; restored from __doc__
- """ D.remove(value) -- remove first occurrence of value. """
- pass
- def reverse(self): # real signature unknown; restored from __doc__
- """ D.reverse() -- reverse *IN PLACE* """
- pass
- def rotate(self, *args, **kwargs): # real signature unknown
- """ Rotate the deque n steps to the right (default n=1). If n is negative, rotates left. """
- pass
- def __copy__(self, *args, **kwargs): # real signature unknown
- """ Return a shallow copy of a deque. """
- pass
- def __delitem__(self, y): # real signature unknown; restored from __doc__
- """ x.__delitem__(y) <==> del x[y] """
- pass
- def __eq__(self, y): # real signature unknown; restored from __doc__
- """ x.__eq__(y) <==> x==y """
- pass
- def __getattribute__(self, name): # real signature unknown; restored from __doc__
- """ x.__getattribute__('name') <==> x.name """
- pass
- def __getitem__(self, y): # real signature unknown; restored from __doc__
- """ x.__getitem__(y) <==> x[y] """
- pass
- def __ge__(self, y): # real signature unknown; restored from __doc__
- """ x.__ge__(y) <==> x>=y """
- pass
- def __gt__(self, y): # real signature unknown; restored from __doc__
- """ x.__gt__(y) <==> x>y """
- pass
- def __iadd__(self, y): # real signature unknown; restored from __doc__
- """ x.__iadd__(y) <==> x+=y """
- pass
- def __init__(self, iterable=(), maxlen=None): # known case of _collections.deque.__init__
- """
- deque([iterable[, maxlen]]) --> deque object
- Build an ordered collection with optimized access from its endpoints.
- # (copied from class doc)
- """
- pass
- def __iter__(self): # real signature unknown; restored from __doc__
- """ x.__iter__() <==> iter(x) """
- pass
- def __len__(self): # real signature unknown; restored from __doc__
- """ x.__len__() <==> len(x) """
- pass
- def __le__(self, y): # real signature unknown; restored from __doc__
- """ x.__le__(y) <==> x<=y """
- pass
- def __lt__(self, y): # real signature unknown; restored from __doc__
- """ x.__lt__(y) <==> x<y """
- pass
- @staticmethod # known case of __new__
- def __new__(S, *more): # real signature unknown; restored from __doc__
- """ T.__new__(S, ...) -> a new object with type S, a subtype of T """
- pass
- def __ne__(self, y): # real signature unknown; restored from __doc__
- """ x.__ne__(y) <==> x!=y """
- pass
- def __reduce__(self, *args, **kwargs): # real signature unknown
- """ Return state information for pickling. """
- pass
- def __repr__(self): # real signature unknown; restored from __doc__
- """ x.__repr__() <==> repr(x) """
- pass
- def __reversed__(self): # real signature unknown; restored from __doc__
- """ D.__reversed__() -- return a reverse iterator over the deque """
- pass
- def __setitem__(self, i, y): # real signature unknown; restored from __doc__
- """ x.__setitem__(i, y) <==> x[i]=y """
- pass
- def __sizeof__(self): # real signature unknown; restored from __doc__
- """ D.__sizeof__() -- size of D in memory, in bytes """
- pass
- maxlen = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
- """maximum size of a deque or None if unbounded"""
- __hash__ = None
- deque
- deque
deque
- def append(self, *args, **kwargs): # real signature unknown
- """ Add an element to the right side of the deque. """
- pass
append--往右边添加一个
- def appendleft(self, *args, **kwargs): # real signature unknown
- """ Add an element to the left side of the deque. """
- pass
appendleft--往左边添加
- def clear(self, *args, **kwargs): # real signature unknown
- """ Remove all elements from the deque. """
- pass
clear--清空这个队列
- def count(self, value): # real signature unknown; restored from __doc__
- """ D.count(value) -> integer -- return number of occurrences of value """
- return 0
count--计算队列的元素出现了多少次
- import collections
- a = collections.deque()
- #在最后插入一个队列
- a.append('')
- #在最左边插入一个队列
- a.appendleft('')
- #在最左边插入一个队列
- a.appendleft('')
- a.appendleft('')
- #打印插入的队列
- print(a)
- #统计这个队列里有几个1
- b= a.count('')
- #打印上边count统计到的有多少个1 的结果
- print("出现",b)
- --------------------------------------------------------
- 输出:
- deque(['', '', '', ''])
- 出现 2
- import collections
- #定义一个队列
- a = collections.deque()
- #在最后插入一个队列
- a.append('')
- #在最左边插入一个队列
- a.appendleft('')
- #在最左边插入一个队列
- a.appendleft('')
- a.appendleft('')
- #打印插入的队列
- print(a)
- #统计这个队列里有几个1
- b= a.count('')
- #打印上边count统计到的有多少个1 的结果
- print("出现",b)
- #从右边扩展队列
- a.extend(['yy','uu','ii'])
- print(a)
- #从左边扩展队列
- a.extendleft(['w','ee','pp'])
- print(a)
- ------------------------------------------------------
- deque(['', '', '', ''])
- 出现 2
- deque(['', '', '', '', 'yy', 'uu', 'ii'])
- deque(['pp', 'ee', 'w', '', '', '', '', 'yy', 'uu', 'ii'])
extendleft:左边队列扩展,extend--右边队列扩展
- import collections
- #定义一个队列
- a = collections.deque()
- #在最后插入一个队列
- a.append('')
- #在最左边插入一个队列
- a.appendleft('')
- #在最左边插入一个队列
- a.appendleft('')
- a.appendleft('')
- #打印插入的队列
- #print(a)
- #统计这个队列里有几个1
- b= a.count('')
- #打印上边count统计到的有多少个1 的结果
- #print("出现",b)
- #从右边扩展队列
- a.extend(['yy','uu','ii'])
- #print(a)
- #从左边扩展队列
- a.extendleft(['w','ee','pp'])
- #print(a)
- #取这个索引值得位置
- ww = a.index('ii')
- print(ww)
- --------------------------------------
- 输出:
- 9
index--取这个索引值在队列里的位置
- import collections
- #定义一个队列
- a = collections.deque()
- #在最后插入一个队列
- a.append('')
- #在最左边插入一个队列
- a.appendleft('')
- #在最左边插入一个队列
- a.appendleft('')
- print(a)
- a.rotate(2)
- print(a)
- ----------------------------------------------------------------------------------
- 输出:
- deque(['', '', ''])
- deque(['', '', ''])
rotate--转圈
注:既然有双向队列,也有单项队列(先进先出 FIFO )
Queue.Queue单项队列
- class Queue:
- """Create a queue object with a given maximum size.
- If maxsize is <= 0, the queue size is infinite.
- """
- def __init__(self, maxsize=0):
- self.maxsize = maxsize
- self._init(maxsize)
- # mutex must be held whenever the queue is mutating. All methods
- # that acquire mutex must release it before returning. mutex
- # is shared between the three conditions, so acquiring and
- # releasing the conditions also acquires and releases mutex.
- self.mutex = _threading.Lock()
- # Notify not_empty whenever an item is added to the queue; a
- # thread waiting to get is notified then.
- self.not_empty = _threading.Condition(self.mutex)
- # Notify not_full whenever an item is removed from the queue;
- # a thread waiting to put is notified then.
- self.not_full = _threading.Condition(self.mutex)
- # Notify all_tasks_done whenever the number of unfinished tasks
- # drops to zero; thread waiting to join() is notified to resume
- self.all_tasks_done = _threading.Condition(self.mutex)
- self.unfinished_tasks = 0
- def task_done(self):
- """Indicate that a formerly enqueued task is complete.
- Used by Queue consumer threads. For each get() used to fetch a task,
- a subsequent call to task_done() tells the queue that the processing
- on the task is complete.
- If a join() is currently blocking, it will resume when all items
- have been processed (meaning that a task_done() call was received
- for every item that had been put() into the queue).
- Raises a ValueError if called more times than there were items
- placed in the queue.
- """
- self.all_tasks_done.acquire()
- try:
- unfinished = self.unfinished_tasks - 1
- if unfinished <= 0:
- if unfinished < 0:
- raise ValueError('task_done() called too many times')
- self.all_tasks_done.notify_all()
- self.unfinished_tasks = unfinished
- finally:
- self.all_tasks_done.release()
- def join(self):
- """Blocks until all items in the Queue have been gotten and processed.
- The count of unfinished tasks goes up whenever an item is added to the
- queue. The count goes down whenever a consumer thread calls task_done()
- to indicate the item was retrieved and all work on it is complete.
- When the count of unfinished tasks drops to zero, join() unblocks.
- """
- self.all_tasks_done.acquire()
- try:
- while self.unfinished_tasks:
- self.all_tasks_done.wait()
- finally:
- self.all_tasks_done.release()
- def qsize(self):
- """Return the approximate size of the queue (not reliable!)."""
- self.mutex.acquire()
- n = self._qsize()
- self.mutex.release()
- return n
- def empty(self):
- """Return True if the queue is empty, False otherwise (not reliable!)."""
- self.mutex.acquire()
- n = not self._qsize()
- self.mutex.release()
- return n
- def full(self):
- """Return True if the queue is full, False otherwise (not reliable!)."""
- self.mutex.acquire()
- n = 0 < self.maxsize == self._qsize()
- self.mutex.release()
- return n
- def put(self, item, block=True, timeout=None):
- """Put an item into the queue.
- If optional args 'block' is true and 'timeout' is None (the default),
- block if necessary until a free slot is available. If 'timeout' is
- a non-negative number, it blocks at most 'timeout' seconds and raises
- the Full exception if no free slot was available within that time.
- Otherwise ('block' is false), put an item on the queue if a free slot
- is immediately available, else raise the Full exception ('timeout'
- is ignored in that case).
- """
- self.not_full.acquire()
- try:
- if self.maxsize > 0:
- if not block:
- if self._qsize() == self.maxsize:
- raise Full
- elif timeout is None:
- while self._qsize() == self.maxsize:
- self.not_full.wait()
- elif timeout < 0:
- raise ValueError("'timeout' must be a non-negative number")
- else:
- endtime = _time() + timeout
- while self._qsize() == self.maxsize:
- remaining = endtime - _time()
- if remaining <= 0.0:
- raise Full
- self.not_full.wait(remaining)
- self._put(item)
- self.unfinished_tasks += 1
- self.not_empty.notify()
- finally:
- self.not_full.release()
- def put_nowait(self, item):
- """Put an item into the queue without blocking.
- Only enqueue the item if a free slot is immediately available.
- Otherwise raise the Full exception.
- """
- return self.put(item, False)
- def get(self, block=True, timeout=None):
- """Remove and return an item from the queue.
- If optional args 'block' is true and 'timeout' is None (the default),
- block if necessary until an item is available. If 'timeout' is
- a non-negative number, it blocks at most 'timeout' seconds and raises
- the Empty exception if no item was available within that time.
- Otherwise ('block' is false), return an item if one is immediately
- available, else raise the Empty exception ('timeout' is ignored
- in that case).
- """
- self.not_empty.acquire()
- try:
- if not block:
- if not self._qsize():
- raise Empty
- elif timeout is None:
- while not self._qsize():
- self.not_empty.wait()
- elif timeout < 0:
- raise ValueError("'timeout' must be a non-negative number")
- else:
- endtime = _time() + timeout
- while not self._qsize():
- remaining = endtime - _time()
- if remaining <= 0.0:
- raise Empty
- self.not_empty.wait(remaining)
- item = self._get()
- self.not_full.notify()
- return item
- finally:
- self.not_empty.release()
- def get_nowait(self):
- """Remove and return an item from the queue without blocking.
- Only get an item if one is immediately available. Otherwise
- raise the Empty exception.
- """
- return self.get(False)
- # Override these methods to implement other queue organizations
- # (e.g. stack or priority queue).
- # These will only be called with appropriate locks held
- # Initialize the queue representation
- def _init(self, maxsize):
- self.queue = deque()
- def _qsize(self, len=len):
- return len(self.queue)
- # Put a new item in the queue
- def _put(self, item):
- self.queue.append(item)
- # Get an item from the queue
- def _get(self):
- return self.queue.popleft()
- Queue.Queue
Queue.Queue
- import queue
- #创建一个单项队列
- a = queue.Queue()
- #插入数据
- a.put('')
- ww = a.put('asdf')
- #qsize统计队列里有几个数据
- print(a.qsize())
- #到队列里通过get取数据
- print(a.get())
- #到队列里取数据
- print(a.get())
- #取数据的过程中是遵循 先进先出的规则来拿数据的
- ---------------------------------------------------------------------
- 输出:
- 2
- 999
- asdf
queue--单项队列
深浅拷贝
对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址。
拷贝是通过copy模块的copy.copy()方法来实现的拷贝
浅拷贝:copy.copy()
深拷贝:copy.deepcopy()
赋值 =
Python分为两类:
#字符串数字 属于一类
#其他的属于一类
查看一个变量的id地址
- __author__ = 'Administrator'
- # -*- coding:utf-8 -*-
- import copy
- a1 = 1
- a2 = 1
- print(id(a1))
- print(id(a2))
- ----------------------------------------------------------------------------
- 输出:
- 1583410992
- 1583410992
浅拷贝
- __author__ = 'Administrator'
- # -*- coding:utf-8 -*-
- import copy
- a1 = 'asdfasdf'
- #浅拷贝
- a2 = copy.copy(a1)
- print(id(a1))
- print(id(a2))
- ----------------------------------------------------------------------------
- 输出:
- 17973616
- 17973616
- -------------------------------------------------------------------
- 深拷贝:__author__ = 'Administrator'
- # -*- coding:utf-8 -*-
- import copy
- a1 = 'asdfasdf'
- a2 = copy.deepcopy(a1)
- print(id(a1))
- print(id(a2))
- ------------------------------------------------------------------
- 17908080
- 17908080
PS:对于数字和字符串来说无论是赋值、深拷贝还是浅拷贝 都是使用的内存里的同一个地址,所以对于数字和字符串来说深浅拷贝是无用的.
#下面来看一下列表、元祖以及字典其他...
浅拷贝只拷贝一层
- __author__ = 'Administrator'
- # -*- coding:utf-8 -*-
- import copy
- n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
- n3 = copy.copy(n1)
- print(id(n1))
- print(id(n3))
- #下面输出的更深层次的元素的内存地址是没有变的
- print(id(n1['k1']))
- print(id(n3['k1']))
- ----------------------------------------------------
- 输出:
- 6607432
- 7116936
- 7071256
- 7071256
深拷贝:
- __author__ = 'Administrator'
- # -*- coding:utf-8 -*-
- import copy
- n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
- n3 = copy.deepcopy(n1)
- print(id(n1['k3']))
- print(id(n3['k3']))
- ----------------------------------------------------------------------
- 输出:
- 12382792
- 12360072
- -----------------------------------------------------------------------------
- __author__ = 'Administrator'
- # -*- coding:utf-8 -*-
- import copy
- n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
- n3 = copy.copy(n1)
- print(id(n1['k3']))
- print(id(n3['k3']))
- ---------------------------------
- 输出:
- 18784008
- 18784008
小练习
- __author__ = 'Administrator'
- # -*- coding:utf-8 -*-
- import copy
- dic = {
- "CPU":[90,],
- "mem":[80,],
- "disk":[70,],
- }
- dic['CPU'][0] = 10
- #浅拷贝
- new_dic = copy.copy(dic)
- new_dic['mem'][0] = 100
- print(dic)
- print(new_dic)
- --------------------------
- 输出:
- {'mem': [100], 'disk': [70], 'CPU': [10]}
- {'mem': [100], 'disk': [70], 'CPU': [10]}
浅拷贝
- __author__ = 'Administrator'
- # -*- coding:utf-8 -*-
- import copy
- dic = {
- "CPU":[90,],
- "mem":[80,],
- "disk":[70,],
- }
- dic['CPU'][0] = 10
- #浅拷贝
- new_dic = copy.deepcopy(dic)
- new_dic['mem'][0] = 100
- print(dic)
- print(new_dic)
- ----------------------------------------
- 输出:
- {'CPU': [10], 'mem': [80], 'disk': [70]}
- {'CPU': [10], 'mem': [100], 'disk': [70]}
深拷贝
函数
一、背景
在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复制到现需功能处,如下:
- while True:
- if cpu利用率 > 90%:
- #发送邮件提醒
- 连接邮箱服务器
- 发送邮件
- 关闭连接
- if 硬盘使用空间 > 90%:
- #发送邮件提醒
- 连接邮箱服务器
- 发送邮件
- 关闭连接
- if 内存占用 > 80%:
- #发送邮件提醒
- 连接邮箱服务器
- 发送邮件
- 关闭连接
腚眼一看上述代码,if条件语句下的内容可以被提取出来公用,如下:
- def 发送邮件(内容)
- #发送邮件提醒
- 连接邮箱服务器
- 发送邮件
- 关闭连接
- while True:
- if cpu利用率 > 90%:
- 发送邮件('CPU报警')
- if 硬盘使用空间 > 90%:
- 发送邮件('硬盘报警')
- if 内存占用 > 80%:
对于上述的两种实现方式,第二次必然比第一次的重用性和可读性要好,其实这就是函数式编程和面向过程编程的区别:
- 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
- 面向对象:对函数进行分类和封装,让开发“更快更好更强...
函数式编程最重要的是增强代码的重用性和可读性
- __author__ = 'Administrator'
- # -*- coding:utf-8 -*-
- #定义一个函数
- def mail():
- n = 123
- n += 1
- print(n)
- #函数名mail
- mail()
- f = mail
- f()
函数的定义主要有如下要点:
- def:表示函数的关键字
- 函数名:函数的名称,日后根据函数名调用函数
- 函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等...
- 参数:为函数体提供数据
- 返回值:当函数执行完毕后,可以给调用者返回数据。
以上要点中,比较重要有参数和返回值:
Python函数的返回值
发送邮件:
- __author__ = 'Administrator'
- # -*- coding:utf-8 -*-
- #定义一个函数
- import smtplib
- from email.mime.text import MIMEText
- from email.utils import formataddr
- def mail():
- ret = True
- #上边ret的内容执行完了就会执行try,try 的意思是 如果发邮件的代码不出错的情况下就会继续执行下去,如果出错的话就会执行except的内容然后return ret
- #如果try里的内容不出错就永远不会执行except里的内容
- try:
- msg = MIMEText('邮件内容', 'plain', 'utf-8')
- #
- msg['From'] = formataddr(["aaa",'hu_***_you@126.com'])
- msg['To'] = formataddr(["没事",'352***7864@qq.com'])
- msg['Subject'] = "主题啊啊啊啊啊啊"
- server = smtplib.SMTP("smtp.126.com", 25)
- server.login("hu_***_you@126.com", "password")
- server.sendmail('hu_***_you@126.com', ['352***7864@qq.com',], msg.as_string())
- server.quit()
- except Exception:
- ret = False
- return ret
- #函数名mail
- ret = mail()
- if ret:
- print("发送成功...")
- else:
- print("发送失败!!!")
- import smtplib
- from email.mime.text import MIMEText
- from email.utils import formataddr
- msg = MIMEText('邮件内容', 'plain', 'utf-8')
- msg['From'] = formataddr(["武沛齐",'wptawy@126.com'])
- msg['To'] = formataddr(["走人",'424662508@qq.com'])
- msg['Subject'] = "主题"
- server = smtplib.SMTP("smtp.126.com", 25)
- server.login("wptawy@126.com", "邮箱密码")
- server.sendmail('wptawy@126.com', ['424662508@qq.com',], msg.as_string())
- server.quit()
Python 邮件发送实例
1、返回值
函数是一个功能块,该功能到底执行成功与否,需要通过返回值来告知调用者
- def 发送短信():
- 发送短信的代码...
- if 发送成功:
- return True
- else:
- return False
- while True:
- # 每次执行发送短信函数,都会将返回值自动赋值给result
- # 之后,可以根据result来写日志,或重发等操作
- result = 发送短信()
- if result == False:
- 记录日志,短信发送失败...
2、参数
为什么要有参数?
- def CPU报警邮件()
- #发送邮件提醒
- 连接邮箱服务器
- 发送邮件
- 关闭连接
- def 硬盘报警邮件()
- #发送邮件提醒
- 连接邮箱服务器
- 发送邮件
- 关闭连接
- def 内存报警邮件()
- #发送邮件提醒
- 连接邮箱服务器
- 发送邮件
- 关闭连接
- while True:
- if cpu利用率 > 90%:
- CPU报警邮件()
- if 硬盘使用空间 > 90%:
- 硬盘报警邮件()
- if 内存占用 > 80%:
- 内存报警邮件()
- 无参数实现
无参数
- def 发送邮件(邮件内容)
- #发送邮件提醒
- 连接邮箱服务器
- 发送邮件
- 关闭连接
- while True:
- if cpu利用率 > 90%:
- 发送邮件("CPU报警了。")
- if 硬盘使用空间 > 90%:
- 发送邮件("硬盘报警了。")
- if 内存占用 > 80%:
- 发送邮件("内存报警了。")
- 有参数实现
有参数
函数的有三中不同的参数:
- 普通参数
- 默认参数
- 动态参数
- __author__ = 'Administrator'
- # -*- coding:utf-8 -*-
- #定义一个函数
- import smtplib
- from email.mime.text import MIMEText
- from email.utils import formataddr
- #形式参数
- #user = '352***7864@qq.com'
- def mail(user):
- ret = True
- #上边ret的内容执行完了就会执行try,try 的意思是 如果发邮件的代码不出错的情况下就会继续执行下去,如果出错的话就会执行except的内容然后return ret
- #如果try里的内容不出错就永远不会执行except里的内容
- try:
- msg = MIMEText('邮件内容', 'plain', 'utf-8')
- #发件箱
- msg['From'] = formataddr(["aaa",'hu_***_you@126.com'])
- msg['To'] = formataddr(["没事",'352***7864@qq.com'])
- msg['Subject'] = "主题啊啊啊啊啊啊"
- server = smtplib.SMTP("smtp.126.com", 25)
- server.login("hu_***_you@126.com", "***")
- server.sendmail('hu_***_you@126.com', [user,], msg.as_string())
- server.quit()
- except Exception:
- ret = False
- return ret
- #函数名mail
- #括号内为实际参数
- ret = mail('352***7864@qq.com')
- ret = mail('hu_***_you@126.com')
- if ret:
- print("发送成功...")
- else:
- print("发送失败!!!")
- 普通函数
普通参数
- #默认情况下a2=99,
- def show(a1,a2=99):
- print(a1,a2)
- #执行函数的时候第一个值是赋给第一个参数,第二个值如果不定义的话函数执行的时候就会使用默认的值"99",如果第二个值制定了的话就会使用指定的值
- show(11)
- ----------------
- 输出:
- 11 99
- ===========================================
- #默认情况下a2=99,
- def show(a1,a2=99):
- print(a1,a2)
- #执行函数的时候第一个值是赋给第一个参数,第二个值如果不定义的话函数执行的时候就会使用默认的值"99",如果第二个值制定了的话就会使用指定的值
- show(11,"\n我特啊游,弄啥嘞")
- --------------------------------------
- 输出:
- 11
- 我特啊游,弄啥嘞
默认参数
- def show(a1,a2):
- print(a1,a2)
- show(a2=123,a1=999)
- -----------------------------------------------------------------------------------
- 输出:
- 999 123
指定参数
- #元祖动态参数
- def show(*arg):
- print(arg,type(arg))
- n = [11,22,33,44]
- show(n)
- ===========================================
- #字典动态参数
- def show(**arg):
- print(arg,type(arg))
- show(n1 = 'ww',99 = 88)
- ==============================================
- #如下例子会将传入的元素参数自动转换为元祖,传入的字典格式会自动转换为字典
- def show(*args,**kwargs):
- print(args,type(args),"\n",kwargs,type(kwargs))
- show(11,22,33,44,55,66,77,n8 = 99)
- ----------------------------------
- 输出:
- (11, 22, 33, 44, 55, 66, 77) <class 'tuple'>
- {'n8': 99} <class 'dict'>
元祖,字典动态参数
ps:注意
- def show(*args,**kwargs):
- print(args,type(args),)
- print(kwargs,type(kwargs))
- l = [11,22,33,44]
- d = {'n1':99,'n2':'asb'}
- #show(11,22,33,44,55,66,77,n8 = 99)
- show(l,d)
- -----------------------------------------
- 输出:
- ([11, 22, 33, 44], {'n2': 'asb', 'n1': 99}) <class 'tuple'>
- {} <class 'dict'>
- ============================================
- def show(*args,**kwargs):
- print(args,type(args),)
- print(kwargs,type(kwargs))
- l = [11,22,33,44]
- d = {'n1':99,'n2':'asb'}
- show(*l,**d)
- ----------------------------------------------
- 输出:
- (11, 22, 33, 44) <class 'tuple'>
- {'n1': 99, 'n2': 'asb'} <class 'dict'>
指定参数格式化
- s1 = "{0} is {1}"
- a = ['asb','fds']
- s2 = s1.format(*a)
- print(s2)
- ------------------------
- 输出:
- asb is fds
- ==================================
- s1 = "{name} is {acter}"
- w = s1.format(name = 'asd',acter = 'dfgh')
- print(w)
- ---------------------------------
- 输出:
- asd is dfgh
- ========================================
- s1 = "{name} is {acter}"
- d = {'name':'asd','acter':'dfgh'}
- ret = s1.format(**d)
- print(ret)
- -------------------------------------------
- 输出:
- asd is dfgh
字符串的格式化format
lambda表达式
学习条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即
- # 普通条件语句
- if 1 == 1:
- name = 'wupeiqi'
- else:
- name = 'alex'
- # 三元运算
- name = 'wupeiqi' if 1 == 1 else 'alex'
对于简单的函数,也存在一种简便的表示方式,即:lambda表达式
- # ###################### 普通函数 ######################
- # 定义函数(普通方式)
- def func(arg):
- return arg + 1
- # 执行函数
- result = func(123)
- # ###################### lambda ######################
- # 定义函数(lambda表达式)
- my_lambda = lambda arg : arg + 1
- # 执行函数
- result = my_lambda(123)
lambda存在意义就是对简单函数的简洁表示
如下表中的模块不需要任何导入都可以使用
- #所有的元素为真则为True,所有的元素为假则为False
- a1 = all([None,1,2,3,4])
- print(a1)
- -------------------------------
- 输出:
- False
- ============================================
- a1 = all([1,2,3,4])
- print(a1)
- -------------------------
- 输出:
- True
all()
- #所有元素只要有一个位真,则返回True,所有元素只要有一个位假则返回Fales
- a2 = any([None,1])
- print(a2)
- ----------------------------------------------------------
- 输出:
- True
- =============================
- a2 = any([None])
- print(a2)
- -------------------------------------------
- 输出:
- Fales
any()-所有元素只要有一个位真,则返回True,所有元素只要有一个位假则返回Fales
- #bin 是 返回一个二进制
- a3 = bin(8,)
- print(a3)
- -----------------------------------------------------------------
- 0b1000
bin 是 返回一个二进制
- #一个汉字为三个字节,转换为数组
- a4 = bytearray("猪八戒",encoding='utf-8')
- print(a4)
- -----------------
- 输出:
- bytearray(b'\xe7\x8c\xaa\xe5\x85\xab\xe6\x88\x92')
bytearray:一个汉字为三个字节,转换为数组
- print(ord('A'))
- ----------------------
- 打印
- 65
- ===================
- print(chr(65))
- ---------------------------
- 打印:
- A
# chr 是将数字转换成字符---# ord 是将字符转换成数字
- #验证码
- import random
- print(random.randint(1,9999))
random:#验证码
open函数,该函数用于文件处理
操作文件时,一般需要经历如下步骤:
- 打开文件
- 操作文件
一、打开文件
文件句柄 = open('文件路径', '模式')
打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。
打开文件的模式有:
- r,只读模式(默认)。
- w,只写模式。【不可读;不存在则创建;存在则删除内容;】
- a,追加模式。【可读; 不存在则创建;存在则只追加内容;】
"+" 表示可以同时读写某个文件
- r+,可读写文件。【可读;可写;可追加】
- w+,写读
- a+,同a
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
- rU
- r+U
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
- rb
- wb
- ab
二、操作
- class file(object)
- def close(self): # real signature unknown; restored from __doc__
- 关闭文件
- """
- close() -> None or (perhaps) an integer. Close the file.
- Sets data attribute .closed to True. A closed file cannot be used for
- further I/O operations. close() may be called more than once without
- error. Some kinds of file objects (for example, opened by popen())
- may return an exit status upon closing.
- """
- def fileno(self): # real signature unknown; restored from __doc__
- 文件描述符
- """
- fileno() -> integer "file descriptor".
- This is needed for lower-level file interfaces, such os.read().
- """
- return 0
- def flush(self): # real signature unknown; restored from __doc__
- 刷新文件内部缓冲区
- """ flush() -> None. Flush the internal I/O buffer. """
- pass
- def isatty(self): # real signature unknown; restored from __doc__
- 判断文件是否是同意tty设备
- """ isatty() -> true or false. True if the file is connected to a tty device. """
- return False
- def next(self): # real signature unknown; restored from __doc__
- 获取下一行数据,不存在,则报错
- """ x.next() -> the next value, or raise StopIteration """
- pass
- def read(self, size=None): # real signature unknown; restored from __doc__
- 读取指定字节数据
- """
- read([size]) -> read at most size bytes, returned as a string.
- If the size argument is negative or omitted, read until EOF is reached.
- Notice that when in non-blocking mode, less data than what was requested
- may be returned, even if no size parameter was given.
- """
- pass
- def readinto(self): # real signature unknown; restored from __doc__
- 读取到缓冲区,不要用,将被遗弃
- """ readinto() -> Undocumented. Don't use this; it may go away. """
- pass
- def readline(self, size=None): # real signature unknown; restored from __doc__
- 仅读取一行数据
- """
- readline([size]) -> next line from the file, as a string.
- Retain newline. A non-negative size argument limits the maximum
- number of bytes to return (an incomplete line may be returned then).
- Return an empty string at EOF.
- """
- pass
- def readlines(self, size=None): # real signature unknown; restored from __doc__
- 读取所有数据,并根据换行保存值列表
- """
- readlines([size]) -> list of strings, each a line from the file.
- Call readline() repeatedly and return a list of the lines so read.
- The optional size argument, if given, is an approximate bound on the
- total number of bytes in the lines returned.
- """
- return []
- def seek(self, offset, whence=None): # real signature unknown; restored from __doc__
- 指定文件中指针位置
- """
- seek(offset[, whence]) -> None. Move to new file position.
- Argument offset is a byte count. Optional argument whence defaults to
- (offset from start of file, offset should be >= 0); other values are 1
- (move relative to current position, positive or negative), and 2 (move
- relative to end of file, usually negative, although many platforms allow
- seeking beyond the end of a file). If the file is opened in text mode,
- only offsets returned by tell() are legal. Use of other offsets causes
- undefined behavior.
- Note that not all file objects are seekable.
- """
- pass
- def tell(self): # real signature unknown; restored from __doc__
- 获取当前指针位置
- """ tell() -> current file position, an integer (may be a long integer). """
- pass
- def truncate(self, size=None): # real signature unknown; restored from __doc__
- 截断数据,仅保留指定之前数据
- """
- truncate([size]) -> None. Truncate the file to at most size bytes.
- Size defaults to the current file position, as returned by tell().
- """
- pass
- def write(self, p_str): # real signature unknown; restored from __doc__
- 写内容
- """
- write(str) -> None. Write string str to file.
- Note that due to buffering, flush() or close() may be needed before
- the file on disk reflects the data written.
- """
- pass
- def writelines(self, sequence_of_strings): # real signature unknown; restored from __doc__
- 将一个字符串列表写入文件
- """
- writelines(sequence_of_strings) -> None. Write the strings to the file.
- Note that newlines are not added. The sequence can be any iterable object
- producing strings. This is equivalent to calling write() for each string.
- """
- pass
- def xreadlines(self): # real signature unknown; restored from __doc__
- 可用于逐行读取文件,非全部
- """
- xreadlines() -> returns self.
- For backward compatibility. File objects now include the performance
- optimizations previously implemented in the xreadlines module.
- """
- pass
- Python 2.x
Python2.0
- class TextIOWrapper(_TextIOBase):
- """
- Character and line based layer over a BufferedIOBase object, buffer.
- encoding gives the name of the encoding that the stream will be
- decoded or encoded with. It defaults to locale.getpreferredencoding(False).
- errors determines the strictness of encoding and decoding (see
- help(codecs.Codec) or the documentation for codecs.register) and
- defaults to "strict".
- newline controls how line endings are handled. It can be None, '',
- '\n', '\r', and '\r\n'. It works as follows:
- * On input, if newline is None, universal newlines mode is
- enabled. Lines in the input can end in '\n', '\r', or '\r\n', and
- these are translated into '\n' before being returned to the
- caller. If it is '', universal newline mode is enabled, but line
- endings are returned to the caller untranslated. If it has any of
- the other legal values, input lines are only terminated by the given
- string, and the line ending is returned to the caller untranslated.
- * On output, if newline is None, any '\n' characters written are
- translated to the system default line separator, os.linesep. If
- newline is '' or '\n', no translation takes place. If newline is any
- of the other legal values, any '\n' characters written are translated
- to the given string.
- If line_buffering is True, a call to flush is implied when a call to
- write contains a newline character.
- """
- def close(self, *args, **kwargs): # real signature unknown
- 关闭文件
- pass
- def fileno(self, *args, **kwargs): # real signature unknown
- 文件描述符
- pass
- def flush(self, *args, **kwargs): # real signature unknown
- 刷新文件内部缓冲区
- pass
- def isatty(self, *args, **kwargs): # real signature unknown
- 判断文件是否是同意tty设备
- pass
- def read(self, *args, **kwargs): # real signature unknown
- 读取指定字节数据
- pass
- def readable(self, *args, **kwargs): # real signature unknown
- 是否可读
- pass
- def readline(self, *args, **kwargs): # real signature unknown
- 仅读取一行数据
- pass
- def seek(self, *args, **kwargs): # real signature unknown
- 指定文件中指针位置
- pass
- def seekable(self, *args, **kwargs): # real signature unknown
- 指针是否可操作
- pass
- def tell(self, *args, **kwargs): # real signature unknown
- 获取指针位置
- pass
- def truncate(self, *args, **kwargs): # real signature unknown
- 截断数据,仅保留指定之前数据
- pass
- def writable(self, *args, **kwargs): # real signature unknown
- 是否可写
- pass
- def write(self, *args, **kwargs): # real signature unknown
- 写内容
- pass
- def __getstate__(self, *args, **kwargs): # real signature unknown
- pass
- def __init__(self, *args, **kwargs): # real signature unknown
- pass
- @staticmethod # known case of __new__
- def __new__(*args, **kwargs): # real signature unknown
- """ Create and return a new object. See help(type) for accurate signature. """
- pass
- def __next__(self, *args, **kwargs): # real signature unknown
- """ Implement next(self). """
- pass
- def __repr__(self, *args, **kwargs): # real signature unknown
- """ Return repr(self). """
- pass
- buffer = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
- closed = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
- encoding = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
- errors = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
- line_buffering = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
- name = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
- newlines = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
- _CHUNK_SIZE = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
- _finalizing = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
- Python 3.x
Python3.0
python-Day3-set 集合-counter计数器-默认字典(defaultdict) -可命名元组(namedtuple)-有序字典(orderedDict)-双向队列(deque)--Queue单项队列--深浅拷贝---函数参数的更多相关文章
- 计数器(counter),有序字典(OrderDict),默认字典(defaultdict),可命名元祖(namedtuple),双向队列(deque),单项队列(deuqe.Queue)
Python_Day_05 计数器(counter),有序字典(OrderDict),默认字典(defaultdict),可命名元祖(namedtuple),双向队列(deque),单项队列(deuq ...
- Python_Day_05 计数器(counter),有序字典(OrderDict),默认字典(defaultdict),可命名元祖(namedtuple),双向队列(deque),单项队列(deuqe.Queue)
Counter(计数器) 是一个字典的子类,存储形式同样为字典,其中存储的键为字典的元素,值为元素出现的次数,在使用之前我们需要先导入文件 import collections 初始化一个计数器 im ...
- python基础(三元运算+深浅拷贝+函数参数)
三元运算 三元运算,又称三目运算,主要作用是减少代码量,是对简单的条件语句的缩写. 书写格式: result = 值1 if 条件 else 值2 即如果条件成立,则将值1赋给result变量,如果不 ...
- python基础知识4——collection类——计数器,有序字典,默认字典,可命名元组,双向队列
1.计数器(counter) Counter是对字典类型的补充,用于追踪值的出现次数. ps:具备字典的所有功能 + 自己的功能 Counter 我们从中挑选一些相对常用的方法来举例: 在上面的例子 ...
- 八、collection系列-----计数器、有序字典、默认字典、可命名元组、双向队列、单向队列一.计数器(对字典的扩展)
一.计数器(对字典的扩展) 有如下一个字典: dic = {'k1':123,'k2':123,'k3':12} 统计12出现的次数,123出现的次数 1.统计出现次数 >>> ...
- python基础-3 集合 三元运算 深浅拷贝 函数 Python作用域
上节课总结 1 运算符 in 字符串 判断 : “hello” in "asdasfhelloasdfsadf" 列表元素判断:"li" in ['li', ...
- Python学习基础(二)——集合 深浅拷贝 函数
集合 # 集合 ''' 集合是无序不重复的 ''' # 创建列表 l = list((1, 1, 1)) l1 = [1, 1, 1] print(l) print(l1) print("* ...
- Python之深浅拷贝&函数
一.深浅拷贝 深浅拷贝是指copy模块下的copy()和deepcopy()方法. 1.浅拷贝 示例: >>> import copy >>> a = 'hello ...
- Python 双向队列Deque、单向队列Queue 模块使用详解
Python 双向队列Deque 模块使用详解 创建双向队列Deque序列 双向队列Deque提供了类似list的操作方法: #!/usr/bin/python3 import collections ...
随机推荐
- [python网络编程]DNSserver
在上一篇中,使用scrapy改动源IP发送请求的最后我们提到因为hosts文件不支持正则,会导致我们的随机域名DNS查询失败. 使用DNS代理服务器能够解决问题, 以下是我用gevent写的小工具.非 ...
- Objective-c 程序结构
类是Objective-c的核心,Objective-c程序都是围绕类进行的.Objective-c程序至少包含以下三个部分: 1.类接口:定义了类的数据和方法,但是不包括方法的实现代码. 2.类实现 ...
- Android 中文API (67) —— BluetoothClass.Device.Major
前言 本章内容是android.bluetooth.BluetoothClass.Device.Major,为Android蓝牙部分的章节翻译,版本为Android 2.3 r1,翻译来自中山大学 ...
- 怎么取消 Windows Server 2012 RDP 限制每个用户只能进行一个会话
在 Windows Server 2008 / 2008 R2 上,如果希望多个远程用户使用同一个账号同时访问服务器的 Remote Desktop(RDP),只需通过管理工具-远程桌面下的“远程桌面 ...
- 分页:T-SQL存储过程和EF存储过程的使用
首先准备好分页的T-SQL语句: create proc usp_activityFenYe @pageIndex int, @pageSize int, @pageCount int output ...
- 从开发到部署,使用django创建一个简单可用的个人博客
本文参考于: 简书-Django搭建简易博客教程:http://www.jianshu.com/p/d15188a74104 自强学堂-Django基础教程:http://www.ziqiangxue ...
- man命令重定向后有^H乱码问题
在 man ld.so>ld.so后 vim打开ld.so后出现重叠乱码问题 但是cat.less可以正常查看 解决办法: man ld.so|col -b >ld.so col命令是 ...
- Null指针
C++ Null 指针 C++ 指针 C++ 指针 在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯.赋为 NULL 值的指针被称为空指针. NULL ...
- BZOJ 1692: [Usaco2007 Dec]队列变换( 贪心 )
数据 n <= 30000 , 然后 O( n² ) 的贪心也过了..... USACO 数据是有多弱啊 = = ( ps : BZOJ 1640 和此题一模一样 , 双倍经验 ) ------ ...
- javascript 关闭页面提示
window.onbeforeunload = function (e) { e = e || window.event; // For IE and Firefox prior to version ...