基本数据类型补充:


set 是一个无序且不重复的元素集合

  1. class set(object):<br/>
  2. """<br/>
  3. set() -> new empty set object<br/>
  4. set(iterable) -> new set object
  5.  
  6. Build an unordered collection of unique elements.<br/>
  7. """<br/>
  8. def add(self, *args, **kwargs): # real signature unknown<br/>
  9. """<br/>
  10. Add an element to a set,添加元素
  11.  
  12. This has no effect if the element is already present.<br/>
  13. """<br/>
  14. pass
  15.  
  16. def clear(self, *args, **kwargs): # real signature unknown<br/>
  17. """ Remove all elements from this set. 清除内容"""<br/>
  18. pass
  19.  
  20. def copy(self, *args, **kwargs): # real signature unknown<br/>
  21. """ Return a shallow copy of a set. 浅拷贝 """<br/>
  22. pass
  23.  
  24. def difference(self, *args, **kwargs): # real signature unknown<br/>
  25. """<br/>
  26. Return the difference of two or more sets as a new set. A中存在,B中不存在
  27.  
  28. (i.e. all elements that are in this set but not the others.)<br/>
  29. """<br/>
  30. pass
  31.  
  32. def difference_update(self, *args, **kwargs): # real signature unknown<br/>
  33. """ Remove all elements of another set from this set. 从当前集合中删除和B中相同的元素"""<br/>
  34. pass
  35.  
  36. def discard(self, *args, **kwargs): # real signature unknown<br/>
  37. """<br/>
  38. Remove an element from a set if it is a member.
  39.  
  40. If the element is not a member, do nothing. 移除指定元素,不存在不保错<br/>
  41. """<br/>
  42. pass
  43.  
  44. def intersection(self, *args, **kwargs): # real signature unknown<br/>
  45. """<br/>
  46. Return the intersection of two sets as a new set. 交集
  47.  
  48. (i.e. all elements that are in both sets.)<br/>
  49. """<br/>
  50. pass
  51.  
  52. def intersection_update(self, *args, **kwargs): # real signature unknown<br/>
  53. """ Update a set with the intersection of itself and another. 取交集并更更新到A中 """<br/>
  54. pass
  55.  
  56. def isdisjoint(self, *args, **kwargs): # real signature unknown<br/>
  57. """ Return True if two sets have a null intersection. 如果没有交集,返回True,否则返回False"""<br/>
  58. pass
  59.  
  60. def issubset(self, *args, **kwargs): # real signature unknown<br/>
  61. """ Report whether another set contains this set. 是否是子序列"""<br/>
  62. pass
  63.  
  64. def issuperset(self, *args, **kwargs): # real signature unknown<br/>
  65. """ Report whether this set contains another set. 是否是父序列"""<br/>
  66. pass
  67.  
  68. def pop(self, *args, **kwargs): # real signature unknown<br/>
  69. """<br/>
  70. Remove and return an arbitrary set element.<br/>
  71. Raises KeyError if the set is empty. 移除元素<br/>
  72. """<br/>
  73. pass
  74.  
  75. def remove(self, *args, **kwargs): # real signature unknown<br/>
  76. """<br/>
  77. Remove an element from a set; it must be a member.
  78.  
  79. If the element is not a member, raise a KeyError. 移除指定元素,不存在保错<br/>
  80. """<br/>
  81. pass
  82.  
  83. def symmetric_difference(self, *args, **kwargs): # real signature unknown<br/>
  84. """<br/>
  85. Return the symmetric difference of two sets as a new set. 对称差集
  86.  
  87. (i.e. all elements that are in exactly one of the sets.)<br/>
  88. """<br/>
  89. pass
  90.  
  91. def symmetric_difference_update(self, *args, **kwargs): # real signature unknown<br/>
  92. """ Update a set with the symmetric difference of itself and another. 对称差集,并更新到a中 """<br/>
  93. pass
  94.  
  95. def union(self, *args, **kwargs): # real signature unknown<br/>
  96. """<br/>
  97. Return the union of sets as a new set. 并集
  98.  
  99. (i.e. all elements that are in either set.)<br/>
  100. """<br/>
  101. pass
  102.  
  103. def update(self, *args, **kwargs): # real signature unknown<br/>
  104. """ Update a set with the union of itself and others. 更新 """<br/>
  105. pass

1:创建

  1. s = set()<br/>
  2. s = {11,22,33,55}

2:转换

  1. li = [11,22,33,44]<br/>
  2. tu = (11,22,33,44)<br/>
  3. st = ''<br/>
  4. s = set(li)

3:intersection , intersection_update方法

  1. a = {11,22,33,44}<br/>
  2. b = {22,66,77,88}<br/>
  3. ret = a.intersection(b)<br/>
  4. print(ret)

intersection取得两个集合中的交集元素,并将这些元素以一个新的集合返回给一个变量接收

  1. a = {11,22,33,44}<br/>
  2. b = {22,66,77,88}<br/>
  3. a.intersection_update(b)<br/>
  4. print(a)

intersection_update取得两个集合的交集元素,并更新a集合

4:isdisjoint , issubset , issuperset方法

  1. s = {11,22,33,44}<br/>
  2. b = {11,22,77,55}<br/>
  3. ret = s.isdisjoint(b)#有交集返回False,没有交集返回True<br/>
  4. print(ret)<br/>
  5. ## False

issubset判断是否为子集

  1. a = {11,22,33,44}<br/>
  2. b = {11,44}<br/>
  3. ret = b.issubset(a)<br/>
  4. print(ret)<br/>
  5. ##########################################<br/>
  6. True

issuperset判断是否为父集

  1. a = {11,22,33,44}<br/>
  2. b = {11,44}<br/>
  3. ret = a.issubset(b)<br/>
  4. print(ret)<br/>
  5. ##########################################<br/>
  6. False

5:discard , remove , pop

  1. s = {11,22,33,44}<br/>
  2. s.remove(11)<br/>
  3. print(s)<br/>
  4. s.discard(22)<br/>
  5. print(s)<br/>
  6. s.pop()<br/>
  7. print(s)

三者都能达到移除元素的效果,区别在于remove移除集合中不存在的元素时会报错,discard移除不存在的元素是不会报错,pop无法精确控制移除哪个元素,按其自身的规则随机移除元素,返回被移除的元素,可以使用变量接收其返回值

6:symmetric_difference取差集

  1. s = {11,22,33,44}<br/>
  2. b = {11,22,77,55}<br/>
  3. r1 = s.difference(b)<br/>
  4. r2 = b.difference(s)<br/>
  5. print(r1)<br/>
  6. print(r2)<br/>
  7. ret = s.symmetric_difference(b)<br/>
  8. print(ret)<br/>
  9. ## set([33, 44])<br/>
  10. ## set([77, 55])<br/>
  11. ## set([33, 44, 77, 55])

symmetric_difference返回两个集合中不是交集的元素

上面的代码中,将symmetric_difference换成symmetric_difference_update则表示将两个集合中不是交集的部分赋值给s

7:union , update方法

  1. s = {11,22,33,44}<br/>
  2. b = {11,22,77,55}<br/>
  3. ret = s.union(b)<br/>
  4. print(ret)<br/>
  5. ## set([33, 11, 44, 77, 22, 55])

union方法合并两个集合

  1. s = {11,22,33,44}<br/>
  2. b = {11,22,77,55}<br/>
  3. s.update(b)<br/>
  4. print(s)<br/>
  5. ## set([33, 11, 44, 77, 22, 55])

update方法更新s集合,将b集合中的元素添加到s集合中!update方法也可以传递一个列表,如:update([23,45,67])

练习题:有下面两个字典

要求:

1)两个字典中有相同键的,则将new_dict中的值更新到old_dict对应键的值

2)old_dict中存在的键且new_dict中没有的键,在old_dict中删除,并把new_dict中的键值更新到old_dict中

3)最后输出old_dict

  1. # 数据库中原有<br/>
  2. old_dict = {<br/>
  3. "#1":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 },<br/>
  4. "#2":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 },<br/>
  5. "#3":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 }<br/>
  6. }
  7.  
  8. # cmdb 新汇报的数据<br/>
  9. new_dict = {<br/>
  10. "#1":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 800 },<br/>
  11. "#3":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 },<br/>
  12. "#4":{ 'hostname':'c2', 'cpu_count': 2, 'mem_capicity': 80 }<br/>
  13. }
  1. old_keys = set(old_dict.keys())<br/>
  2. new_keys = set(new_dict.keys())<br/>
  3. #需要更新元素的键<br/>
  4. update_keys = old_keys.intersection(new_keys)<br/>
  5. print(update_keys)<br/>
  6. #需要删除元素的键<br/>
  7. del_keys = old_keys.difference(new_keys)<br/>
  8. #需要添加元素的键<br/>
  9. add_keys = new_keys.difference(old_keys)<br/>
  10. print(del_keys)<br/>
  11. print(add_keys)<br/>
  12. update_keys = list(update_keys)<br/>
  13. for i in update_keys :<br/>
  14. old_dict[i] = new_dict[i]<br/>
  15. del_keys = list(del_keys)<br/>
  16. for j in del_keys :<br/>
  17. del old_dict[j]<br/>
  18. for k in list(add_keys) :<br/>
  19. old_dict[k] = new_dict[k]<br/>
  20. print(old_dict)<br/>
  21. ########################################<br/>
  22. {'#3': {'hostname': 'c1', 'cpu_count': , 'mem_capicity': }, '#1': {'hostname': 'c1', 'cpu_count': , 'mem_capicity': }, '#4': {'hostname': 'c2', 'cpu_count': , 'mem_capicity': }}

答案

collections系列

一、计数器(counter)

Counter是对字典类型的补充,用于追踪值的出现次数。

ps:具备字典的所有功能 + 自己的功能

  1. c = Counter('abcdeabcdabcaba')<br/>
  2. print c<br/>
  3. 输出:Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
  1. ########################################################################<br/>
  2. ### Counter<br/>
  3. ########################################################################
  4.  
  5. class Counter(dict):<br/>
  6. '''Dict subclass for counting hashable items. Sometimes called a bag<br/>
  7. or multiset. Elements are stored as dictionary keys and their counts<br/>
  8. are stored as dictionary values.
  9.  
  10. >>> c = Counter('abcdeabcdabcaba') # count elements from a string
  11.  
  12. >>> c.most_common(3) # three most common elements<br/>
  13. [('a', 5), ('b', 4), ('c', 3)]<br/>
  14. >>> sorted(c) # list all unique elements<br/>
  15. ['a', 'b', 'c', 'd', 'e']<br/>
  16. >>> ''.join(sorted(c.elements())) # list elements with repetitions<br/>
  17. 'aaaaabbbbcccdde'<br/>
  18. >>> sum(c.values()) # total of all counts
  19.  
  20. >>> c['a'] # count of letter 'a'<br/>
  21. >>> for elem in 'shazam': # update counts from an iterable<br/>
  22. ... c[elem] += 1 # by adding 1 to each element's count<br/>
  23. >>> c['a'] # now there are seven 'a'<br/>
  24. >>> del c['b'] # remove all 'b'<br/>
  25. >>> c['b'] # now there are zero 'b'
  26.  
  27. >>> d = Counter('simsalabim') # make another counter<br/>
  28. >>> c.update(d) # add in the second counter<br/>
  29. >>> c['a'] # now there are nine 'a'
  30.  
  31. >>> c.clear() # empty the counter<br/>
  32. >>> c<br/>
  33. Counter()
  34.  
  35. Note: If a count is set to zero or reduced to zero, it will remain<br/>
  36. in the counter until the entry is deleted or the counter is cleared:
  37.  
  38. >>> c = Counter('aaabbc')<br/>
  39. >>> c['b'] -= 2 # reduce the count of 'b' by two<br/>
  40. >>> c.most_common() # 'b' is still in, but its count is zero<br/>
  41. [('a', 3), ('c', 1), ('b', 0)]
  42.  
  43. '''<br/>
  44. # References:<br/>
  45. # http://en.wikipedia.org/wiki/Multiset<br/>
  46. # http://www.gnu.org/software/smalltalk/manual-base/html_node/Bag.html<br/>
  47. # http://www.demo2s.com/Tutorial/Cpp/0380__set-multiset/Catalog0380__set-multiset.htm<br/>
  48. # http://code.activestate.com/recipes/259174/<br/>
  49. # Knuth, TAOCP Vol. II section 4.6.3
  50.  
  51. def __init__(self, iterable=None, **kwds):<br/>
  52. '''Create a new, empty Counter object. And if given, count elements<br/>
  53. from an input iterable. Or, initialize the count from another mapping<br/>
  54. of elements to their counts.
  55.  
  56. >>> c = Counter() # a new, empty counter<br/>
  57. >>> c = Counter('gallahad') # a new counter from an iterable<br/>
  58. >>> c = Counter({'a': 4, 'b': 2}) # a new counter from a mapping<br/>
  59. >>> c = Counter(a=4, b=2) # a new counter from keyword args
  60.  
  61. '''<br/>
  62. super(Counter, self).__init__()<br/>
  63. self.update(iterable, **kwds)
  64.  
  65. def __missing__(self, key):<br/>
  66. """ 对于不存在的元素,返回计数器为0 """<br/>
  67. 'The count of elements not in the Counter is zero.'<br/>
  68. # Needed so that self[missing_item] does not raise KeyError<br/>
  69. return 0
  70.  
  71. def most_common(self, n=None):<br/>
  72. """ 数量大于等n的所有元素和计数器 """<br/>
  73. '''List the n most common elements and their counts from the most<br/>
  74. common to the least. If n is None, then list all element counts.
  75.  
  76. >>> Counter('abcdeabcdabcaba').most_common(3)<br/>
  77. [('a', 5), ('b', 4), ('c', 3)]
  78.  
  79. '''<br/>
  80. # Emulate Bag.sortedByCount from Smalltalk<br/>
  81. if n is None:<br/>
  82. return sorted(self.iteritems(), key=_itemgetter(1), reverse=True)<br/>
  83. return _heapq.nlargest(n, self.iteritems(), key=_itemgetter(1))
  84.  
  85. def elements(self):<br/>
  86. """ 计数器中的所有元素,注:此处非所有元素集合,而是包含所有元素集合的迭代器 """<br/>
  87. '''Iterator over elements repeating each as many times as its count.
  88.  
  89. >>> c = Counter('ABCABC')<br/>
  90. >>> sorted(c.elements())<br/>
  91. ['A', 'A', 'B', 'B', 'C', 'C']
  92.  
  93. # Knuth's example for prime factors of 1836: 2**2 * 3**3 * 17**1<br/>
  94. >>> prime_factors = Counter({2: 2, 3: 3, 17: 1})<br/>
  95. >>> product = 1<br/>
  96. >>> for factor in prime_factors.elements(): # loop over factors<br/>
  97. ... product *= factor # and multiply them<br/>
  98. >>> product
  99.  
  100. Note, if an element's count has been set to zero or is a negative<br/>
  101. number, elements() will ignore it.
  102.  
  103. '''<br/>
  104. # Emulate Bag.do from Smalltalk and Multiset.begin from C++.<br/>
  105. return _chain.from_iterable(_starmap(_repeat, self.iteritems()))
  106.  
  107. # Override dict methods where necessary
  108.  
  109. @classmethod<br/>
  110. def fromkeys(cls, iterable, v=None):<br/>
  111. # There is no equivalent method for counters because setting v=1<br/>
  112. # means that no element can have a count greater than one.<br/>
  113. raise NotImplementedError(<br/>
  114. 'Counter.fromkeys() is undefined. Use Counter(iterable) instead.')
  115.  
  116. def update(self, iterable=None, **kwds):<br/>
  117. """ 更新计数器,其实就是增加;如果原来没有,则新建,如果有则加一 """<br/>
  118. '''Like dict.update() but add counts instead of replacing them.
  119.  
  120. Source can be an iterable, a dictionary, or another Counter instance.
  121.  
  122. >>> c = Counter('which')<br/>
  123. >>> c.update('witch') # add elements from another iterable<br/>
  124. >>> d = Counter('watch')<br/>
  125. >>> c.update(d) # add elements from another counter<br/>
  126. >>> c['h'] # four 'h' in which, witch, and watch
  127.  
  128. '''<br/>
  129. # The regular dict.update() operation makes no sense here because the<br/>
  130. # replace behavior results in the some of original untouched counts<br/>
  131. # being mixed-in with all of the other counts for a mismash that<br/>
  132. # doesn't have a straight-forward interpretation in most counting<br/>
  133. # contexts. Instead, we implement straight-addition. Both the inputs<br/>
  134. # and outputs are allowed to contain zero and negative counts.
  135.  
  136. if iterable is not None:<br/>
  137. if isinstance(iterable, Mapping):<br/>
  138. if self:<br/>
  139. self_get = self.get<br/>
  140. for elem, count in iterable.iteritems():<br/>
  141. self[elem] = self_get(elem, 0) + count<br/>
  142. else:<br/>
  143. super(Counter, self).update(iterable) # fast path when counter is empty<br/>
  144. else:<br/>
  145. self_get = self.get<br/>
  146. for elem in iterable:<br/>
  147. self[elem] = self_get(elem, 0) + 1<br/>
  148. if kwds:<br/>
  149. self.update(kwds)
  150.  
  151. def subtract(self, iterable=None, **kwds):<br/>
  152. """ 相减,原来的计数器中的每一个元素的数量减去后添加的元素的数量 """<br/>
  153. '''Like dict.update() but subtracts counts instead of replacing them.<br/>
  154. Counts can be reduced below zero. Both the inputs and outputs are<br/>
  155. allowed to contain zero and negative counts.
  156.  
  157. Source can be an iterable, a dictionary, or another Counter instance.
  158.  
  159. >>> c = Counter('which')<br/>
  160. >>> c.subtract('witch') # subtract elements from another iterable<br/>
  161. >>> c.subtract(Counter('watch')) # subtract elements from another counter<br/>
  162. >>> c['h'] # 2 in which, minus 1 in witch, minus 1 in watch<br/>
  163. >>> c['w'] # 1 in which, minus 1 in witch, minus 1 in watch<br/>
  164. -1
  165.  
  166. '''<br/>
  167. if iterable is not None:<br/>
  168. self_get = self.get<br/>
  169. if isinstance(iterable, Mapping):<br/>
  170. for elem, count in iterable.items():<br/>
  171. self[elem] = self_get(elem, 0) - count<br/>
  172. else:<br/>
  173. for elem in iterable:<br/>
  174. self[elem] = self_get(elem, 0) - 1<br/>
  175. if kwds:<br/>
  176. self.subtract(kwds)
  177.  
  178. def copy(self):<br/>
  179. """ 拷贝 """<br/>
  180. 'Return a shallow copy.'<br/>
  181. return self.__class__(self)
  182.  
  183. def __reduce__(self):<br/>
  184. """ 返回一个元组(类型,元组) """<br/>
  185. return self.__class__, (dict(self),)
  186.  
  187. def __delitem__(self, elem):<br/>
  188. """ 删除元素 """<br/>
  189. 'Like dict.__delitem__() but does not raise KeyError for missing values.'<br/>
  190. if elem in self:<br/>
  191. super(Counter, self).__delitem__(elem)
  192.  
  193. def __repr__(self):<br/>
  194. if not self:<br/>
  195. return '%s()' % self.__class__.__name__<br/>
  196. items = ', '.join(map('%r: %r'.__mod__, self.most_common()))<br/>
  197. return '%s({%s})' % (self.__class__.__name__, items)
  198.  
  199. # Multiset-style mathematical operations discussed in:<br/>
  200. # Knuth TAOCP Volume II section 4.6.3 exercise 19<br/>
  201. # and at http://en.wikipedia.org/wiki/Multiset<br/>
  202. #<br/>
  203. # Outputs guaranteed to only include positive counts.<br/>
  204. #<br/>
  205. # To strip negative and zero counts, add-in an empty counter:<br/>
  206. # c += Counter()
  207.  
  208. def __add__(self, other):<br/>
  209. '''Add counts from two counters.
  210.  
  211. >>> Counter('abbb') + Counter('bcc')<br/>
  212. Counter({'b': 4, 'c': 2, 'a': 1})
  213.  
  214. '''<br/>
  215. if not isinstance(other, Counter):<br/>
  216. return NotImplemented<br/>
  217. result = Counter()<br/>
  218. for elem, count in self.items():<br/>
  219. newcount = count + other[elem]<br/>
  220. if newcount > 0:<br/>
  221. result[elem] = newcount<br/>
  222. for elem, count in other.items():<br/>
  223. if elem not in self and count > 0:<br/>
  224. result[elem] = count<br/>
  225. return result
  226.  
  227. def __sub__(self, other):<br/>
  228. ''' Subtract count, but keep only results with positive counts.
  229.  
  230. >>> Counter('abbbc') - Counter('bccd')<br/>
  231. Counter({'b': 2, 'a': 1})
  232.  
  233. '''<br/>
  234. if not isinstance(other, Counter):<br/>
  235. return NotImplemented<br/>
  236. result = Counter()<br/>
  237. for elem, count in self.items():<br/>
  238. newcount = count - other[elem]<br/>
  239. if newcount > 0:<br/>
  240. result[elem] = newcount<br/>
  241. for elem, count in other.items():<br/>
  242. if elem not in self and count < 0:<br/>
  243. result[elem] = 0 - count<br/>
  244. return result
  245.  
  246. def __or__(self, other):<br/>
  247. '''Union is the maximum of value in either of the input counters.
  248.  
  249. >>> Counter('abbb') | Counter('bcc')<br/>
  250. Counter({'b': 3, 'c': 2, 'a': 1})
  251.  
  252. '''<br/>
  253. if not isinstance(other, Counter):<br/>
  254. return NotImplemented<br/>
  255. result = Counter()<br/>
  256. for elem, count in self.items():<br/>
  257. other_count = other[elem]<br/>
  258. newcount = other_count if count < other_count else count<br/>
  259. if newcount > 0:<br/>
  260. result[elem] = newcount<br/>
  261. for elem, count in other.items():<br/>
  262. if elem not in self and count > 0:<br/>
  263. result[elem] = count<br/>
  264. return result
  265.  
  266. def __and__(self, other):<br/>
  267. ''' Intersection is the minimum of corresponding counts.
  268.  
  269. >>> Counter('abbb') & Counter('bcc')<br/>
  270. Counter({'b': 1})
  271.  
  272. '''<br/>
  273. if not isinstance(other, Counter):<br/>
  274. return NotImplemented<br/>
  275. result = Counter()<br/>
  276. for elem, count in self.items():<br/>
  277. other_count = other[elem]<br/>
  278. newcount = count if count < other_count else other_count<br/>
  279. if newcount > 0:<br/>
  280. result[elem] = newcount<br/>
  281. return result
  282.  
  283. Counter

Counter

二、有序字典(orderedDict )

orderdDict是对字典类型的补充,他记住了字典元素添加的顺序

  1. class OrderedDict(dict):<br/>
  2. 'Dictionary that remembers insertion order'<br/>
  3. # An inherited dict maps keys to values.<br/>
  4. # The inherited dict provides __getitem__, __len__, __contains__, and get.<br/>
  5. # The remaining methods are order-aware.<br/>
  6. # Big-O running times for all methods are the same as regular dictionaries.
  7.  
  8. # The internal self.__map dict maps keys to links in a doubly linked list.<br/>
  9. # The circular doubly linked list starts and ends with a sentinel element.<br/>
  10. # The sentinel element never gets deleted (this simplifies the algorithm).<br/>
  11. # Each link is stored as a list of length three: [PREV, NEXT, KEY].
  12.  
  13. def __init__(self, *args, **kwds):<br/>
  14. '''Initialize an ordered dictionary. The signature is the same as<br/>
  15. regular dictionaries, but keyword arguments are not recommended because<br/>
  16. their insertion order is arbitrary.
  17.  
  18. '''<br/>
  19. if len(args) > 1:<br/>
  20. raise TypeError('expected at most 1 arguments, got %d' % len(args))<br/>
  21. try:<br/>
  22. self.__root<br/>
  23. except AttributeError:<br/>
  24. self.__root = root = [] # sentinel node<br/>
  25. root[:] = [root, root, None]<br/>
  26. self.__map = {}<br/>
  27. self.__update(*args, **kwds)
  28.  
  29. def __setitem__(self, key, value, dict_setitem=dict.__setitem__):<br/>
  30. 'od.__setitem__(i, y) <==> od[i]=y'<br/>
  31. # Setting a new item creates a new link at the end of the linked list,<br/>
  32. # and the inherited dictionary is updated with the new key/value pair.<br/>
  33. if key not in self:<br/>
  34. root = self.__root<br/>
  35. last = root[0]<br/>
  36. last[1] = root[0] = self.__map[key] = [last, root, key]<br/>
  37. return dict_setitem(self, key, value)
  38.  
  39. def __delitem__(self, key, dict_delitem=dict.__delitem__):<br/>
  40. 'od.__delitem__(y) <==> del od[y]'<br/>
  41. # Deleting an existing item uses self.__map to find the link which gets<br/>
  42. # removed by updating the links in the predecessor and successor nodes.<br/>
  43. dict_delitem(self, key)<br/>
  44. link_prev, link_next, _ = self.__map.pop(key)<br/>
  45. link_prev[1] = link_next # update link_prev[NEXT]<br/>
  46. link_next[0] = link_prev # update link_next[PREV]
  47.  
  48. def __iter__(self):<br/>
  49. 'od.__iter__() <==> iter(od)'<br/>
  50. # Traverse the linked list in order.<br/>
  51. root = self.__root<br/>
  52. curr = root[1] # start at the first node<br/>
  53. while curr is not root:<br/>
  54. yield curr[2] # yield the curr[KEY]<br/>
  55. curr = curr[1] # move to next node
  56.  
  57. def __reversed__(self):<br/>
  58. 'od.__reversed__() <==> reversed(od)'<br/>
  59. # Traverse the linked list in reverse order.<br/>
  60. root = self.__root<br/>
  61. curr = root[0] # start at the last node<br/>
  62. while curr is not root:<br/>
  63. yield curr[2] # yield the curr[KEY]<br/>
  64. curr = curr[0] # move to previous node
  65.  
  66. def clear(self):<br/>
  67. 'od.clear() -> None. Remove all items from od.'<br/>
  68. root = self.__root<br/>
  69. root[:] = [root, root, None]<br/>
  70. self.__map.clear()<br/>
  71. dict.clear(self)
  72.  
  73. # -- the following methods do not depend on the internal structure --
  74.  
  75. def keys(self):<br/>
  76. 'od.keys() -> list of keys in od'<br/>
  77. return list(self)
  78.  
  79. def values(self):<br/>
  80. 'od.values() -> list of values in od'<br/>
  81. return [self[key] for key in self]
  82.  
  83. def items(self):<br/>
  84. 'od.items() -> list of (key, value) pairs in od'<br/>
  85. return [(key, self[key]) for key in self]
  86.  
  87. def iterkeys(self):<br/>
  88. 'od.iterkeys() -> an iterator over the keys in od'<br/>
  89. return iter(self)
  90.  
  91. def itervalues(self):<br/>
  92. 'od.itervalues -> an iterator over the values in od'<br/>
  93. for k in self:<br/>
  94. yield self[k]
  95.  
  96. def iteritems(self):<br/>
  97. 'od.iteritems -> an iterator over the (key, value) pairs in od'<br/>
  98. for k in self:<br/>
  99. yield (k, self[k])
  100.  
  101. update = MutableMapping.update
  102.  
  103. __update = update # let subclasses override update without breaking __init__
  104.  
  105. __marker = object()
  106.  
  107. def pop(self, key, default=__marker):<br/>
  108. '''od.pop(k[,d]) -> v, remove specified key and return the corresponding<br/>
  109. value. If key is not found, d is returned if given, otherwise KeyError<br/>
  110. is raised.
  111.  
  112. '''<br/>
  113. if key in self:<br/>
  114. result = self[key]<br/>
  115. del self[key]<br/>
  116. return result<br/>
  117. if default is self.__marker:<br/>
  118. raise KeyError(key)<br/>
  119. return default
  120.  
  121. def setdefault(self, key, default=None):<br/>
  122. 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od'<br/>
  123. if key in self:<br/>
  124. return self[key]<br/>
  125. self[key] = default<br/>
  126. return default
  127.  
  128. def popitem(self, last=True):<br/>
  129. '''od.popitem() -> (k, v), return and remove a (key, value) pair.<br/>
  130. Pairs are returned in LIFO order if last is true or FIFO order if false.
  131.  
  132. '''<br/>
  133. if not self:<br/>
  134. raise KeyError('dictionary is empty')<br/>
  135. key = next(reversed(self) if last else iter(self))<br/>
  136. value = self.pop(key)<br/>
  137. return key, value
  138.  
  139. def __repr__(self, _repr_running={}):<br/>
  140. 'od.__repr__() <==> repr(od)'<br/>
  141. call_key = id(self), _get_ident()<br/>
  142. if call_key in _repr_running:<br/>
  143. return '...'<br/>
  144. _repr_running[call_key] = 1<br/>
  145. try:<br/>
  146. if not self:<br/>
  147. return '%s()' % (self.__class__.__name__,)<br/>
  148. return '%s(%r)' % (self.__class__.__name__, self.items())<br/>
  149. finally:<br/>
  150. del _repr_running[call_key]
  151.  
  152. def __reduce__(self):<br/>
  153. 'Return state information for pickling'<br/>
  154. items = [[k, self[k]] for k in self]<br/>
  155. inst_dict = vars(self).copy()<br/>
  156. for k in vars(OrderedDict()):<br/>
  157. inst_dict.pop(k, None)<br/>
  158. if inst_dict:<br/>
  159. return (self.__class__, (items,), inst_dict)<br/>
  160. return self.__class__, (items,)
  161.  
  162. def copy(self):<br/>
  163. 'od.copy() -> a shallow copy of od'<br/>
  164. return self.__class__(self)
  165.  
  166. @classmethod<br/>
  167. def fromkeys(cls, iterable, value=None):<br/>
  168. '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S.<br/>
  169. If not specified, the value defaults to None.
  170.  
  171. '''<br/>
  172. self = cls()<br/>
  173. for key in iterable:<br/>
  174. self[key] = value<br/>
  175. return self
  176.  
  177. def __eq__(self, other):<br/>
  178. '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive<br/>
  179. while comparison to a regular mapping is order-insensitive.
  180.  
  181. '''<br/>
  182. if isinstance(other, OrderedDict):<br/>
  183. return dict.__eq__(self, other) and all(_imap(_eq, self, other))<br/>
  184. return dict.__eq__(self, other)
  185.  
  186. def __ne__(self, other):<br/>
  187. 'od.__ne__(y) <==> od!=y'<br/>
  188. return not self == other
  189.  
  190. # -- the following methods support python 3.x style dictionary views --
  191.  
  192. def viewkeys(self):<br/>
  193. "od.viewkeys() -> a set-like object providing a view on od's keys"<br/>
  194. return KeysView(self)
  195.  
  196. def viewvalues(self):<br/>
  197. "od.viewvalues() -> an object providing a view on od's values"<br/>
  198. return ValuesView(self)
  199.  
  200. def viewitems(self):<br/>
  201. "od.viewitems() -> a set-like object providing a view on od's items"<br/>
  202. return ItemsView(self)
  203.  
  204. OrderedDict

OrderedDict

三、默认字典(defaultdict) 

defaultdict是对字典的类型的补充,他默认给字典的值设置了一个类型。

  1. class defaultdict(dict):<br/>
  2. """<br/>
  3. defaultdict(default_factory[, ...]) --> dict with default factory
  4.  
  5. The default factory is called without arguments to produce<br/>
  6. a new value when a key is not present, in __getitem__ only.<br/>
  7. A defaultdict compares equal to a dict with the same items.<br/>
  8. All remaining arguments are treated the same as if they were<br/>
  9. passed to the dict constructor, including keyword arguments.<br/>
  10. """<br/>
  11. def copy(self): # real signature unknown; restored from __doc__<br/>
  12. """ D.copy() -> a shallow copy of D. """<br/>
  13. pass
  14.  
  15. def __copy__(self, *args, **kwargs): # real signature unknown<br/>
  16. """ D.copy() -> a shallow copy of D. """<br/>
  17. pass
  18.  
  19. def __getattribute__(self, name): # real signature unknown; restored from __doc__<br/>
  20. """ x.__getattribute__('name') <==> x.name """<br/>
  21. pass
  22.  
  23. def __init__(self, default_factory=None, **kwargs): # known case of _collections.defaultdict.__init__<br/>
  24. """<br/>
  25. defaultdict(default_factory[, ...]) --> dict with default factory
  26.  
  27. The default factory is called without arguments to produce<br/>
  28. a new value when a key is not present, in __getitem__ only.<br/>
  29. A defaultdict compares equal to a dict with the same items.<br/>
  30. All remaining arguments are treated the same as if they were<br/>
  31. passed to the dict constructor, including keyword arguments.
  32.  
  33. # (copied from class doc)<br/>
  34. """<br/>
  35. pass
  36.  
  37. def __missing__(self, key): # real signature unknown; restored from __doc__<br/>
  38. """<br/>
  39. __missing__(key) # Called by __getitem__ for missing key; pseudo-code:<br/>
  40. if self.default_factory is None: raise KeyError((key,))<br/>
  41. self[key] = value = self.default_factory()<br/>
  42. return value<br/>
  43. """<br/>
  44. pass
  45.  
  46. def __reduce__(self, *args, **kwargs): # real signature unknown<br/>
  47. """ Return state information for pickling. """<br/>
  48. pass
  49.  
  50. def __repr__(self): # real signature unknown; restored from __doc__<br/>
  51. """ x.__repr__() <==> repr(x) """<br/>
  52. pass
  53.  
  54. default_factory = property(lambda self: object(), lambda self, v: None, lambda self: None) # default<br/>
  55. """Factory for default value called by __missing__()."""
  56.  
  57. defaultdict

defaultdict

使用方法:

  1. import collections<br/>
  2. dic = collections.defaultdict(list)<br/>
  3. dic['k1'].append('alext')<br/>
  4. print(dic)

练习:

  1. 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。<br/>
  2. 即: {'k1': 大于66 , 'k2': 小于66}
  1. values = [11, 22, 33,44,55,66,77,88,99,90]
  2.  
  3. my_dict = {}
  4.  
  5. for value in values:<br/>
  6. if value>66:<br/>
  7. if my_dict.has_key('k1'):<br/>
  8. my_dict['k1'].append(value)<br/>
  9. else:<br/>
  10. my_dict['k1'] = [value]<br/>
  11. else:<br/>
  12. if my_dict.has_key('k2'):<br/>
  13. my_dict['k2'].append(value)<br/>
  14. else:<br/>
  15. my_dict['k2'] = [value]

原生字典

  1. from collections import defaultdict
  2.  
  3. values = [11, 22, 33,44,55,66,77,88,99,90]
  4.  
  5. my_dict = defaultdict(list)
  6.  
  7. for value in values:<br/>
  8. if value>66:<br/>
  9. my_dict['k1'].append(value)<br/>
  10. else:<br/>
  11. my_dict['k2'].append(value)
  12.  
  13. defaultdict字典解决方法
  14.  
  15. 默认字典

默认字典

四、可命名元组(namedtuple) 

根据nametuple可以创建一个包含tuple所有功能以及其他功能的类型。

  1. import collections<br/>
  2. MytupleClass = collections.namedtuple('MytupleClass',['x','y','z'])<br/>
  3. obj = MytupleClass(11,33,44)<br/>
  4. print(obj.x)<br/>
  5. print(obj.y)<br/>
  6. print(obj.z)
  1. class Mytuple(__builtin__.tuple)<br/>
  2. | Mytuple(x, y)<br/>
  3. |<br/>
  4. | Method resolution order:<br/>
  5. | Mytuple<br/>
  6. | __builtin__.tuple<br/>
  7. | __builtin__.object<br/>
  8. |<br/>
  9. | Methods defined here:<br/>
  10. |<br/>
  11. | __getnewargs__(self)<br/>
  12. | Return self as a plain tuple. Used by copy and pickle.<br/>
  13. |<br/>
  14. | __getstate__(self)<br/>
  15. | Exclude the OrderedDict from pickling<br/>
  16. |<br/>
  17. | __repr__(self)<br/>
  18. | Return a nicely formatted representation string<br/>
  19. |<br/>
  20. | _asdict(self)<br/>
  21. | Return a new OrderedDict which maps field names to their values<br/>
  22. |<br/>
  23. | _replace(_self, **kwds)<br/>
  24. | Return a new Mytuple object replacing specified fields with new values<br/>
  25. |<br/>
  26. | ----------------------------------------------------------------------<br/>
  27. | Class methods defined here:<br/>
  28. |<br/>
  29. | _make(cls, iterable, new=<built-in method __new__ of type object>, len=<built-in function len>) from __builtin__.type<br/>
  30. | Make a new Mytuple object from a sequence or iterable<br/>
  31. |<br/>
  32. | ----------------------------------------------------------------------<br/>
  33. | Static methods defined here:<br/>
  34. |<br/>
  35. | __new__(_cls, x, y)<br/>
  36. | Create new instance of Mytuple(x, y)<br/>
  37. |<br/>
  38. | ----------------------------------------------------------------------<br/>
  39. | Data descriptors defined here:<br/>
  40. |<br/>
  41. | __dict__<br/>
  42. | Return a new OrderedDict which maps field names to their values<br/>
  43. |<br/>
  44. | x<br/>
  45. | Alias for field number 0<br/>
  46. |<br/>
  47. | y<br/>
  48. | Alias for field number 1<br/>
  49. |<br/>
  50. | ----------------------------------------------------------------------<br/>
  51. | Data and other attributes defined here:<br/>
  52. |<br/>
  53. | _fields = ('x', 'y')<br/>
  54. |<br/>
  55. | ----------------------------------------------------------------------<br/>
  56. | Methods inherited from __builtin__.tuple:<br/>
  57. |<br/>
  58. | __add__(...)<br/>
  59. | x.__add__(y) <==> x+y<br/>
  60. |<br/>
  61. | __contains__(...)<br/>
  62. | x.__contains__(y) <==> y in x<br/>
  63. |<br/>
  64. | __eq__(...)<br/>
  65. | x.__eq__(y) <==> x==y<br/>
  66. |<br/>
  67. | __ge__(...)<br/>
  68. | x.__ge__(y) <==> x>=y<br/>
  69. |<br/>
  70. | __getattribute__(...)<br/>
  71. | x.__getattribute__('name') <==> x.name<br/>
  72. |<br/>
  73. | __getitem__(...)<br/>
  74. | x.__getitem__(y) <==> x[y]<br/>
  75. |<br/>
  76. | __getslice__(...)<br/>
  77. | x.__getslice__(i, j) <==> x[i:j]<br/>
  78. |<br/>
  79. | Use of negative indices is not supported.<br/>
  80. |<br/>
  81. | __gt__(...)<br/>
  82. | x.__gt__(y) <==> x>y<br/>
  83. |<br/>
  84. | __hash__(...)<br/>
  85. | x.__hash__() <==> hash(x)<br/>
  86. |<br/>
  87. | __iter__(...)<br/>
  88. | x.__iter__() <==> iter(x)<br/>
  89. |<br/>
  90. | __le__(...)<br/>
  91. | x.__le__(y) <==> x<=y<br/>
  92. |<br/>
  93. | __len__(...)<br/>
  94. | x.__len__() <==> len(x)<br/>
  95. |<br/>
  96. | __lt__(...)<br/>
  97. | x.__lt__(y) <==> x<y<br/>
  98. |<br/>
  99. | __mul__(...)<br/>
  100. | x.__mul__(n) <==> x*n<br/>
  101. |<br/>
  102. | __ne__(...)<br/>
  103. | x.__ne__(y) <==> x!=y<br/>
  104. |<br/>
  105. | __rmul__(...)<br/>
  106. | x.__rmul__(n) <==> n*x<br/>
  107. |<br/>
  108. | __sizeof__(...)<br/>
  109. | T.__sizeof__() -- size of T in memory, in bytes<br/>
  110. |<br/>
  111. | count(...)<br/>
  112. | T.count(value) -> integer -- return number of occurrences of value<br/>
  113. |<br/>
  114. | index(...)<br/>
  115. | T.index(value, [start, [stop]]) -> integer -- return first index of value.<br/>
  116. | Raises ValueError if the value is not present.
  117.  
  118. Mytuple

Mytuple

五、双向队列(deque)

一个线程安全的双向队列

  1. class deque(object):<br/>
  2. """<br/>
  3. deque([iterable[, maxlen]]) --> deque object
  4.  
  5. Build an ordered collection with optimized access from its endpoints.<br/>
  6. """<br/>
  7. def append(self, *args, **kwargs): # real signature unknown<br/>
  8. """ Add an element to the right side of the deque. """<br/>
  9. pass
  10.  
  11. def appendleft(self, *args, **kwargs): # real signature unknown<br/>
  12. """ Add an element to the left side of the deque. """<br/>
  13. pass
  14.  
  15. def clear(self, *args, **kwargs): # real signature unknown<br/>
  16. """ Remove all elements from the deque. """<br/>
  17. pass
  18.  
  19. def count(self, value): # real signature unknown; restored from __doc__<br/>
  20. """ D.count(value) -> integer -- return number of occurrences of value """<br/>
  21. return 0
  22.  
  23. def extend(self, *args, **kwargs): # real signature unknown<br/>
  24. """ Extend the right side of the deque with elements from the iterable """<br/>
  25. pass
  26.  
  27. def extendleft(self, *args, **kwargs): # real signature unknown<br/>
  28. """ Extend the left side of the deque with elements from the iterable """<br/>
  29. pass
  30.  
  31. def pop(self, *args, **kwargs): # real signature unknown<br/>
  32. """ Remove and return the rightmost element. """<br/>
  33. pass
  34.  
  35. def popleft(self, *args, **kwargs): # real signature unknown<br/>
  36. """ Remove and return the leftmost element. """<br/>
  37. pass
  38.  
  39. def remove(self, value): # real signature unknown; restored from __doc__<br/>
  40. """ D.remove(value) -- remove first occurrence of value. """<br/>
  41. pass
  42.  
  43. def reverse(self): # real signature unknown; restored from __doc__<br/>
  44. """ D.reverse() -- reverse *IN PLACE* """<br/>
  45. pass
  46.  
  47. def rotate(self, *args, **kwargs): # real signature unknown<br/>
  48. """ Rotate the deque n steps to the right (default n=1). If n is negative, rotates left. """<br/>
  49. pass
  50.  
  51. def __copy__(self, *args, **kwargs): # real signature unknown<br/>
  52. """ Return a shallow copy of a deque. """<br/>
  53. pass
  54.  
  55. def __delitem__(self, y): # real signature unknown; restored from __doc__<br/>
  56. """ x.__delitem__(y) <==> del x[y] """<br/>
  57. pass
  58.  
  59. def __eq__(self, y): # real signature unknown; restored from __doc__<br/>
  60. """ x.__eq__(y) <==> x==y """<br/>
  61. pass
  62.  
  63. def __getattribute__(self, name): # real signature unknown; restored from __doc__<br/>
  64. """ x.__getattribute__('name') <==> x.name """<br/>
  65. pass
  66.  
  67. def __getitem__(self, y): # real signature unknown; restored from __doc__<br/>
  68. """ x.__getitem__(y) <==> x[y] """<br/>
  69. pass
  70.  
  71. def __ge__(self, y): # real signature unknown; restored from __doc__<br/>
  72. """ x.__ge__(y) <==> x>=y """<br/>
  73. pass
  74.  
  75. def __gt__(self, y): # real signature unknown; restored from __doc__<br/>
  76. """ x.__gt__(y) <==> x>y """<br/>
  77. pass
  78.  
  79. def __iadd__(self, y): # real signature unknown; restored from __doc__<br/>
  80. """ x.__iadd__(y) <==> x+=y """<br/>
  81. pass
  82.  
  83. def __init__(self, iterable=(), maxlen=None): # known case of _collections.deque.__init__<br/>
  84. """<br/>
  85. deque([iterable[, maxlen]]) --> deque object
  86.  
  87. Build an ordered collection with optimized access from its endpoints.<br/>
  88. # (copied from class doc)<br/>
  89. """<br/>
  90. pass
  91.  
  92. def __iter__(self): # real signature unknown; restored from __doc__<br/>
  93. """ x.__iter__() <==> iter(x) """<br/>
  94. pass
  95.  
  96. def __len__(self): # real signature unknown; restored from __doc__<br/>
  97. """ x.__len__() <==> len(x) """<br/>
  98. pass
  99.  
  100. def __le__(self, y): # real signature unknown; restored from __doc__<br/>
  101. """ x.__le__(y) <==> x<=y """<br/>
  102. pass
  103.  
  104. def __lt__(self, y): # real signature unknown; restored from __doc__<br/>
  105. """ x.__lt__(y) <==> x<y """<br/>
  106. pass
  107.  
  108. @staticmethod # known case of __new__<br/>
  109. def __new__(S, *more): # real signature unknown; restored from __doc__<br/>
  110. """ T.__new__(S, ...) -> a new object with type S, a subtype of T """<br/>
  111. pass
  112.  
  113. def __ne__(self, y): # real signature unknown; restored from __doc__<br/>
  114. """ x.__ne__(y) <==> x!=y """<br/>
  115. pass
  116.  
  117. def __reduce__(self, *args, **kwargs): # real signature unknown<br/>
  118. """ Return state information for pickling. """<br/>
  119. pass
  120.  
  121. def __repr__(self): # real signature unknown; restored from __doc__<br/>
  122. """ x.__repr__() <==> repr(x) """<br/>
  123. pass
  124.  
  125. def __reversed__(self): # real signature unknown; restored from __doc__<br/>
  126. """ D.__reversed__() -- return a reverse iterator over the deque """<br/>
  127. pass
  128.  
  129. def __setitem__(self, i, y): # real signature unknown; restored from __doc__<br/>
  130. """ x.__setitem__(i, y) <==> x[i]=y """<br/>
  131. pass
  132.  
  133. def __sizeof__(self): # real signature unknown; restored from __doc__<br/>
  134. """ D.__sizeof__() -- size of D in memory, in bytes """<br/>
  135. pass
  136.  
  137. maxlen = property(lambda self: object(), lambda self, v: None, lambda self: None) # default<br/>
  138. """maximum size of a deque or None if unbounded"""
  139.  
  140. __hash__ = None
  141.  
  142. deque
  143.  
  144. deque

deque

注:既然有双向队列,也有单项队列(先进先出 FIFO )

  1. class Queue:<br/>
  2. """Create a queue object with a given maximum size.
  3.  
  4. If maxsize is <= 0, the queue size is infinite.<br/>
  5. """<br/>
  6. def __init__(self, maxsize=0):<br/>
  7. self.maxsize = maxsize<br/>
  8. self._init(maxsize)<br/>
  9. # mutex must be held whenever the queue is mutating. All methods<br/>
  10. # that acquire mutex must release it before returning. mutex<br/>
  11. # is shared between the three conditions, so acquiring and<br/>
  12. # releasing the conditions also acquires and releases mutex.<br/>
  13. self.mutex = _threading.Lock()<br/>
  14. # Notify not_empty whenever an item is added to the queue; a<br/>
  15. # thread waiting to get is notified then.<br/>
  16. self.not_empty = _threading.Condition(self.mutex)<br/>
  17. # Notify not_full whenever an item is removed from the queue;<br/>
  18. # a thread waiting to put is notified then.<br/>
  19. self.not_full = _threading.Condition(self.mutex)<br/>
  20. # Notify all_tasks_done whenever the number of unfinished tasks<br/>
  21. # drops to zero; thread waiting to join() is notified to resume<br/>
  22. self.all_tasks_done = _threading.Condition(self.mutex)<br/>
  23. self.unfinished_tasks = 0
  24.  
  25. def task_done(self):<br/>
  26. """Indicate that a formerly enqueued task is complete.
  27.  
  28. Used by Queue consumer threads. For each get() used to fetch a task,<br/>
  29. a subsequent call to task_done() tells the queue that the processing<br/>
  30. on the task is complete.
  31.  
  32. If a join() is currently blocking, it will resume when all items<br/>
  33. have been processed (meaning that a task_done() call was received<br/>
  34. for every item that had been put() into the queue).
  35.  
  36. Raises a ValueError if called more times than there were items<br/>
  37. placed in the queue.<br/>
  38. """<br/>
  39. self.all_tasks_done.acquire()<br/>
  40. try:<br/>
  41. unfinished = self.unfinished_tasks - 1<br/>
  42. if unfinished <= 0:<br/>
  43. if unfinished < 0:<br/>
  44. raise ValueError('task_done() called too many times')<br/>
  45. self.all_tasks_done.notify_all()<br/>
  46. self.unfinished_tasks = unfinished<br/>
  47. finally:<br/>
  48. self.all_tasks_done.release()
  49.  
  50. def join(self):<br/>
  51. """Blocks until all items in the Queue have been gotten and processed.
  52.  
  53. The count of unfinished tasks goes up whenever an item is added to the<br/>
  54. queue. The count goes down whenever a consumer thread calls task_done()<br/>
  55. to indicate the item was retrieved and all work on it is complete.
  56.  
  57. When the count of unfinished tasks drops to zero, join() unblocks.<br/>
  58. """<br/>
  59. self.all_tasks_done.acquire()<br/>
  60. try:<br/>
  61. while self.unfinished_tasks:<br/>
  62. self.all_tasks_done.wait()<br/>
  63. finally:<br/>
  64. self.all_tasks_done.release()
  65.  
  66. def qsize(self):<br/>
  67. """Return the approximate size of the queue (not reliable!)."""<br/>
  68. self.mutex.acquire()<br/>
  69. n = self._qsize()<br/>
  70. self.mutex.release()<br/>
  71. return n
  72.  
  73. def empty(self):<br/>
  74. """Return True if the queue is empty, False otherwise (not reliable!)."""<br/>
  75. self.mutex.acquire()<br/>
  76. n = not self._qsize()<br/>
  77. self.mutex.release()<br/>
  78. return n
  79.  
  80. def full(self):<br/>
  81. """Return True if the queue is full, False otherwise (not reliable!)."""<br/>
  82. self.mutex.acquire()<br/>
  83. n = 0 < self.maxsize == self._qsize()<br/>
  84. self.mutex.release()<br/>
  85. return n
  86.  
  87. def put(self, item, block=True, timeout=None):<br/>
  88. """Put an item into the queue.
  89.  
  90. If optional args 'block' is true and 'timeout' is None (the default),<br/>
  91. block if necessary until a free slot is available. If 'timeout' is<br/>
  92. a non-negative number, it blocks at most 'timeout' seconds and raises<br/>
  93. the Full exception if no free slot was available within that time.<br/>
  94. Otherwise ('block' is false), put an item on the queue if a free slot<br/>
  95. is immediately available, else raise the Full exception ('timeout'<br/>
  96. is ignored in that case).<br/>
  97. """<br/>
  98. self.not_full.acquire()<br/>
  99. try:<br/>
  100. if self.maxsize > 0:<br/>
  101. if not block:<br/>
  102. if self._qsize() == self.maxsize:<br/>
  103. raise Full<br/>
  104. elif timeout is None:<br/>
  105. while self._qsize() == self.maxsize:<br/>
  106. self.not_full.wait()<br/>
  107. elif timeout < 0:<br/>
  108. raise ValueError("'timeout' must be a non-negative number")<br/>
  109. else:<br/>
  110. endtime = _time() + timeout<br/>
  111. while self._qsize() == self.maxsize:<br/>
  112. remaining = endtime - _time()<br/>
  113. if remaining <= 0.0:<br/>
  114. raise Full<br/>
  115. self.not_full.wait(remaining)<br/>
  116. self._put(item)<br/>
  117. self.unfinished_tasks += 1<br/>
  118. self.not_empty.notify()<br/>
  119. finally:<br/>
  120. self.not_full.release()
  121.  
  122. def put_nowait(self, item):<br/>
  123. """Put an item into the queue without blocking.
  124.  
  125. Only enqueue the item if a free slot is immediately available.<br/>
  126. Otherwise raise the Full exception.<br/>
  127. """<br/>
  128. return self.put(item, False)
  129.  
  130. def get(self, block=True, timeout=None):<br/>
  131. """Remove and return an item from the queue.
  132.  
  133. If optional args 'block' is true and 'timeout' is None (the default),<br/>
  134. block if necessary until an item is available. If 'timeout' is<br/>
  135. a non-negative number, it blocks at most 'timeout' seconds and raises<br/>
  136. the Empty exception if no item was available within that time.<br/>
  137. Otherwise ('block' is false), return an item if one is immediately<br/>
  138. available, else raise the Empty exception ('timeout' is ignored<br/>
  139. in that case).<br/>
  140. """<br/>
  141. self.not_empty.acquire()<br/>
  142. try:<br/>
  143. if not block:<br/>
  144. if not self._qsize():<br/>
  145. raise Empty<br/>
  146. elif timeout is None:<br/>
  147. while not self._qsize():<br/>
  148. self.not_empty.wait()<br/>
  149. elif timeout < 0:<br/>
  150. raise ValueError("'timeout' must be a non-negative number")<br/>
  151. else:<br/>
  152. endtime = _time() + timeout<br/>
  153. while not self._qsize():<br/>
  154. remaining = endtime - _time()<br/>
  155. if remaining <= 0.0:<br/>
  156. raise Empty<br/>
  157. self.not_empty.wait(remaining)<br/>
  158. item = self._get()<br/>
  159. self.not_full.notify()<br/>
  160. return item<br/>
  161. finally:<br/>
  162. self.not_empty.release()
  163.  
  164. def get_nowait(self):<br/>
  165. """Remove and return an item from the queue without blocking.
  166.  
  167. Only get an item if one is immediately available. Otherwise<br/>
  168. raise the Empty exception.<br/>
  169. """<br/>
  170. return self.get(False)
  171.  
  172. # Override these methods to implement other queue organizations<br/>
  173. # (e.g. stack or priority queue).<br/>
  174. # These will only be called with appropriate locks held
  175.  
  176. # Initialize the queue representation<br/>
  177. def _init(self, maxsize):<br/>
  178. self.queue = deque()
  179.  
  180. def _qsize(self, len=len):<br/>
  181. return len(self.queue)
  182.  
  183. # Put a new item in the queue<br/>
  184. def _put(self, item):<br/>
  185. self.queue.append(item)
  186.  
  187. # Get an item from the queue<br/>
  188. def _get(self):<br/>
  189. return self.queue.popleft()
  190.  
  191. Queue.Queue

Queue.Queue

三元运算


三元运算(三目运算),是对简单的条件语句的缩写。

  1. # 书写格式<br/>
  2. result = 1 if 条件 else 2<br/>
  3. # 如果条件成立,那么将 “值1” 赋值给result变量,否则,将“值2”赋值给result变量
  1. a = 1<br/>
  2. name = 'poe' if a == 1 else 'jet'<br/>
  3. print(name)

深浅拷贝


一、数字和字符串

对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址。

  1. import copy<br/>
  2. # ######### 数字、字符串 #########<br/>
  3. n1 = 123<br/>
  4. # n1 = "i am alex age 10"<br/>
  5. print(id(n1))<br/>
  6. # ## 赋值 ##<br/>
  7. n2 = n1<br/>
  8. print(id(n2))<br/>
  9. # ## 浅拷贝 ##<br/>
  10. n2 = copy.copy(n1)<br/>
  11. print(id(n2))
  12.  
  13. # ## 深拷贝 ##<br/>
  14. n3 = copy.deepcopy(n1)<br/>
  15. print(id(n3))

Python高手之路【三】python基础之函数

二、其他基本数据类型

对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。

1、赋值

赋值,只是创建一个变量,该变量指向原来内存地址,如:

  1. n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
  2.  
  3. n2 = n1

Python高手之路【三】python基础之函数

2、浅拷贝

浅拷贝,在内存中只额外创建第一层数据

  1. import copy
  2.  
  3. n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
  4.  
  5. n3 = copy.copy(n1)

Python高手之路【三】python基础之函数

3、深拷贝

深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)

  1. import copy
  2.  
  3. n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
  4.  
  5. n4 = copy.deepcopy(n1)

Python高手之路【三】python基础之函数

函数


1:函数的定义

  1. def 函数名(参数):
  2.  
  3. ...<br/>
  4. 函数体<br/>
  5. ...<br/>
  6. 返回值

函数的定义主要有如下要点:

def:表示函数的关键字
函数名:函数的名称,日后根据函数名调用函数
函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等…
参数:为函数体提供数据
返回值:当函数执行完毕后,可以给调用者返回数据。

2:返回值

函数是一个功能块,该功能到底执行成功与否,需要通过返回值来告知调用者。

以上要点中,比较重要有参数和返回值:

  1. def 发送短信():
  2.  
  3. 发送短信的代码...
  4.  
  5. if 发送成功:<br/>
  6. return True<br/>
  7. else:<br/>
  8. return False
  9.  
  10. while True:
  11.  
  12. # 每次执行发送短信函数,都会将返回值自动赋值给result<br/>
  13. # 之后,可以根据result来写日志,或重发等操作
  14.  
  15. result = 发送短信()<br/>
  16. if result == False:<br/>
  17. 记录日志,短信发送失败...

3:参数

函数有三种不同的参数:

普通参数

  1. # ######### 定义函数 #########
  2.  
  3. # name 叫做函数func的形式参数,简称:形参<br/>
  4. def func(name):<br/>
  5. print name
  6.  
  7. # ######### 执行函数 #########<br/>
  8. # 'wupeiqi' 叫做函数func的实际参数,简称:实参<br/>
  9. func('poe')

默认参数

  1. def func(name, age = 18):
  2.  
  3. print "%s:%s" %(name,age)
  4.  
  5. # 指定参数<br/>
  6. func('poe', 19)<br/>
  7. # 使用默认参数<br/>
  8. func('gin')
  9.  
  10. 注:默认参数需要放在参数列表最后

动态参数

  1. def f1(*a):<br/>
  2. print(a,type(a))<br/>
  3. f1(123,456,[1,2,3],'who')<br/>
  4. ## ((123, 456, [1, 2, 3], 'who'), <type 'tuple'>)
  1. def func(**kwargs):<br/>
  2. print args<br/>
  3. # 执行方式一<br/>
  4. func(name'poe',age=18)
  5.  
  6. # 执行方式二<br/>
  7. li = {'name':'poe', age:18, 'gender':'male'}<br/>
  8. func(**li)
  1. def f1(*a,**b) :#一个星的参数必须在前,两个星的参数必须在后<br/>
  2. print(a,type(a))<br/>
  3. print(b,type(b))<br/>
  4. f1(11,22,33,k1=1234,k2=456)<br/>
  5. ## ((11, 22, 33), <type 'tuple'>)({'k2': 456, 'k1': 1234}, <type 'dict'>)

为动态参数传入列表,元组,字典:(注:这几种数据类型在函数传参的时候只有引用传递,没有值传递

  1. def f1(*args) :<br/>
  2. print(args,type(args))<br/>
  3. li = [1,2,3,4]<br/>
  4. f1(li)<br/>
  5. f1(*li)<br/>
  6. ## (([1, 2, 3, 4],), <type 'tuple'>)<br/>
  7. ## ((1, 2, 3, 4), <type 'tuple'>)
  1. def f2(**kwargs) :<br/>
  2. print(kwargs,type(kwargs))<br/>
  3. dic = {'k1':123,'k2':456}<br/>
  4. f2(k1 = dic)<br/>
  5. f2(**dic)<br/>
  6. ## ({'k1': {'k2': 456, 'k1': 123}}, <type 'dict'>)<br/>
  7. ## ({'k2': 456, 'k1': 123}, <type 'dict'>)

4:内置函数

Python高手之路【三】python基础之函数

注:查看详细猛击这里

数据类型转换函数

  1. chr(i) 函数返回ASCII码对应的字符串
    1. print(chr(65))<br/>
    2. print(chr(66))<br/>
    3. print(chr(65)+chr(66))<br/>
    4. ##########################################<br/>
    5. A<br/>
    6. B<br/>
    7. AB
  2. complex(real[,imaginary]) 函数可把字符串或数字转换为复数
    1. print(complex("2+1j"))<br/>
    2. print(complex(""))<br/>
    3. print(complex(2,1))<br/>
    4. ##########################################<br/>
    5. (2+1j)<br/>
    6. (2+0j)<br/>
    7. (2+1j)
  3. float(x) 函数把一个数字或字符串转换成浮点数
    1. print(float(12))<br/>
    2. print(float(12.2))<br/>
    3. ##########################################<br/>
    4. 12.0<br/>
    5. 12.2
  4. long(x[,base]) 函数把数字和字符串转换成长整数,base为可选的基数
  5. list(x) 函数可将序列对象转换成列表
  6. min(x[,y,z…]) 函数返回给定参数的最小值,参数可以为序列
  7. max(x[,y,z…]) 函数返回给定参数的最大值,参数可以为序列
  8. ord(x) 函数返回一个字符串参数的ASCII码或Unicode值
    1. print(ord('a'))<br/>
    2. print(ord(u"A"))<br/>
    3. ##########################################<br/>
    4. 97<br/>
    5. 65
  9. str(obj) 函数把对象转换成可打印字符串
  10. tuple(x) 函数把序列对象转换成tuple
  11. type(x) 可以接收任何东西作为参数――并返回它的数据类型。整型、字符串、列表、字典、元组、函数、类、模块,甚至类型对象都可以作为参数被 type 函数接受

abs()函数:取绝对值

  1. print(abs(-1.2))

all()函数与any函数:

all(iterable):如果iterable的任意一个元素为0、”、False,则返回False,否则返回True

  1. print(all(['a','b','c','d']))#True<br/>
  2. print(all(['a','b','','d']))#False<br/>
  3. #注意:空元组、空列表返回值为True,这里要特别注意

any(iterable):如果iterable的所有元素都为0、”、False,则返回False,否则返回True

  1. print(any(['a','b','c','d']))#True<br/>
  2. print(any(['a',0,' ',False]))#True<br/>
  3. print(any([0,'',False]))#False

ascii(object) 函数:

返回一个可打印的对象字符串方式表示,如果是非ascii字符就会输出\x,\u或\U等字符来表示。与python2版本里的repr()是等效的函数。

  1. print(ascii(1))<br/>
  2. print(ascii('a'))<br/>
  3. print(ascii(123))<br/>
  4. print(ascii('中文'))#非ascii字符<br/>
  5. ##########################################<br/>
  6. 1<br/>
  7. 'a'<br/>
  8. 123<br/>
  9. '\u4e2d\u6587'

lambda表达式:

学习条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即:

  1. # 普通条件语句<br/>
  2. if 1 == 1:<br/>
  3. name = 'poe'<br/>
  4. else:<br/>
  5. name = 'bruce'
  6.  
  7. # 三元运算<br/>
  8. name = 'poe' if 1 == 1 else 'bruce'

对于简单的函数,也存在一种简便的表示方式,即:lambda表达式

  1. # ###################### 普通函数 ######################<br/>
  2. # 定义函数(普通方式)<br/>
  3. def func(arg):<br/>
  4. return arg + 1
  5.  
  6. # 执行函数<br/>
  7. result = func(123)
  8.  
  9. # ###################### lambda ######################
  10.  
  11. # 定义函数(lambda表达式)<br/>
  12. my_lambda = lambda arg : arg + 1
  13.  
  14. # 执行函数<br/>
  15. result = my_lambda(123) 

生成随机数:

  1. import random<br/>
  2. chars = ''<br/>
  3. for i in range(4) :<br/>
  4. rand_num = random.randrange(0,4)<br/>
  5. if rand_num == 3 or rand_num == 1:<br/>
  6. rand_digit = random.randrange(0,10)<br/>
  7. chars += str(rand_digit)<br/>
  8. else:<br/>
  9. rand_case = random.randrange(65,90)<br/>
  10. case = chr(rand_case)<br/>
  11. chars += case<br/>
  12. print(chars)

filter函数

filter()函数是 Python 内置的另一个有用的高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。

例1,要从一个list [1, 4, 6, 7, 9, 12, 17]中删除偶数,保留奇数,首先,要编写一个判断奇数的函数:

  1. # filter(fn,iterable)<br/>
  2. def is_odd(x) :<br/>
  3. return x % 2 == 1<br/>
  4. li = [1, 4, 6, 7, 9, 12, 17]<br/>
  5. result = filter(is_odd,li)<br/>
  6. print(result)<br/>
  7. ##########################################<br/>
  8. [1, 7, 9, 17] 

例2:删除 列表中的None 或者空字符串

  1. li = ['test', None, '', 'str', ' ', 'END']<br/>
  2. def is_not_empty(s) :<br/>
  3. return s and len(s.strip()) > 0<br/>
  4. print(filter(is_not_empty,li))<br/>
  5. ##########################################<br/>
  6. ['test', 'str', 'END']

例3:请利用filter()过滤出1~100中平方根是整数的数,即结果应该是:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

  1. import math<br/>
  2. def is_sqr(x) :<br/>
  3. return math.sqrt(x) % 1 == 0<br/>
  4. print filter(is_sqr,range(1,101))

以上三个函数都可以使用lambda表达式的写法来书写,如:

  1. result = filter(lambda x : x % 2 == 1,[1,4,6,9,12,7,17])<br/>
  2. print(result)

map()函数

map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回

例如,对于list [1, 2, 3, 4, 5, 6, 7, 8, 9]如果希望把list的每个元素都作平方,就可以用map()函数

  1. li = [1, 2, 3, 4, 5, 6, 7, 8, 9]<br/>
  2. print(li)<br/>
  3. def f(x) :<br/>
  4. return x*x<br/>
  5. r = list(map(f,[1, 2, 3, 4, 5, 6, 7, 8, 9]))<br/>
  6. print(r)

注:在python3里面,map()的返回值已经不再是list,而是iterators, 所以想要使用,只用将iterator 转换成list 即可, 比如 list(map()) 。

进制转换函数(以下四个函数可以实现各进制间的互相转换)

bin(x) :将整数x转换为二进制字符串,如果x不为Python中int类型,x必须包含方法__index__()并且返回值为integer

oct(x):将一个整数转换成8进制字符串。如果传入浮点数或者字符串均会报错

hex(x):将一个整数转换成16进制字符串。

int():

  • 传入数值时,调用其__int__()方法,浮点数将向下取整
    1. print(int(3))#<br/>
    2. print(int(3.6))#
  • 传入字符串时,默认以10进制进行转换
    1. print(int(''))#
  • 字符串中允许包含”+”、”-“号,但是加减号与数值间不能有空格,数值后、符号前可出现空格
    1. print(int('+36'))#
  • 传入字符串,并指定了进制,则按对应进制将字符串转换成10进制整数
    1. print(int('',2))#<br/>
    2. print(int('0o7',8))#<br/>
    3. print(int('0x15',16))#

open函数,该函数用于文件处理

操作文件时,一般需要经历如下步骤:

  1. 打开文件
  2. 操作文件

一:打开文件

  1. 文件句柄 = open('文件路径', '模式')

打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。

打开文件的模式有:

  • r ,只读模式【默认】
  • w,只写模式【不可读;不存在则创建;存在则清空内容;】
  • x, 只写模式【不可读;不存在则创建,存在则报错】
  • a, 追加模式【可读; 不存在则创建;存在则只追加内容;】
  1. f = open('test.log','r')<br/>
  2. data = f.read()<br/>
  3. f.close()<br/>
  4. print(data)

“+” 表示可以同时读写某个文件

  • r+, 读写【可读,可写】
  • w+,写读【可读,可写】
  • x+ ,写读【可读,可写】
  • a+, 写读【可读,可写】
  1. # r+ 模式<br/>
  2. f = open('test.log','r+',encoding='utf-8')<br/>
  3. print(f.tell())#打印当前指针所在的位置,此时为0<br/>
  4. data = f.read()<br/>
  5. print(data)<br/>
  6. print(f.tell())#此时当前指针在文件最末尾<br/>
  7. f.close()
  1. # w+模式:先清空文件,再写入文件,写入文件后才可以读文件<br/>
  2. f = open('test.log','w+',encoding="utf-8")<br/>
  3. f.write('python')#写完后,指针到了最后<br/>
  4. f.seek(0)#移动指针到开头<br/>
  5. data = f.read()<br/>
  6. f.close()<br/>
  7. print(data)
  1. # a+模式:打开的同时,指针已经到最后,<br/>
  2. # 写时,追加,指针到最后<br/>
  3. f = open('test.log','a+',encoding="utf-8")<br/>
  4. print(f.tell())#读取当前指针位置,此时指针已经到最后<br/>
  5. f.write('c++')<br/>
  6. print(f.tell())<br/>
  7. #此时要读文件必须把指针移动到文件开头<br/>
  8. f.seek(0)<br/>
  9. data = f.read();<br/>
  10. print(data)<br/>
  11. f.close()

“b”表示以字节的方式操作

  • rb 或 r+b
  • wb 或 w+b
  • xb 或 w+b
  • ab 或 a+b

注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型

二:文件操作

  1. class file(object)<br/>
  2. def close(self): # real signature unknown; restored from __doc__<br/>
  3. 关闭文件<br/>
  4. """<br/>
  5. close() -> None or (perhaps) an integer. Close the file.
  6.  
  7. Sets data attribute .closed to True. A closed file cannot be used for<br/>
  8. further I/O operations. close() may be called more than once without<br/>
  9. error. Some kinds of file objects (for example, opened by popen())<br/>
  10. may return an exit status upon closing.<br/>
  11. """
  12.  
  13. def fileno(self): # real signature unknown; restored from __doc__<br/>
  14. 文件描述符<br/>
  15. """<br/>
  16. fileno() -> integer "file descriptor".
  17.  
  18. This is needed for lower-level file interfaces, such os.read().<br/>
  19. """<br/>
  20. return 0
  21.  
  22. def flush(self): # real signature unknown; restored from __doc__<br/>
  23. 刷新文件内部缓冲区<br/>
  24. """ flush() -> None. Flush the internal I/O buffer. """<br/>
  25. pass
  26.  
  27. def isatty(self): # real signature unknown; restored from __doc__<br/>
  28. 判断文件是否是同意tty设备<br/>
  29. """ isatty() -> true or false. True if the file is connected to a tty device. """<br/>
  30. return False
  31.  
  32. def next(self): # real signature unknown; restored from __doc__<br/>
  33. 获取下一行数据,不存在,则报错<br/>
  34. """ x.next() -> the next value, or raise StopIteration """<br/>
  35. pass
  36.  
  37. def read(self, size=None): # real signature unknown; restored from __doc__<br/>
  38. 读取指定字节数据<br/>
  39. """<br/>
  40. read([size]) -> read at most size bytes, returned as a string.
  41.  
  42. If the size argument is negative or omitted, read until EOF is reached.<br/>
  43. Notice that when in non-blocking mode, less data than what was requested<br/>
  44. may be returned, even if no size parameter was given.<br/>
  45. """<br/>
  46. pass
  47.  
  48. def readinto(self): # real signature unknown; restored from __doc__<br/>
  49. 读取到缓冲区,不要用,将被遗弃<br/>
  50. """ readinto() -> Undocumented. Don't use this; it may go away. """<br/>
  51. pass
  52.  
  53. def readline(self, size=None): # real signature unknown; restored from __doc__<br/>
  54. 仅读取一行数据<br/>
  55. """<br/>
  56. readline([size]) -> next line from the file, as a string.
  57.  
  58. Retain newline. A non-negative size argument limits the maximum<br/>
  59. number of bytes to return (an incomplete line may be returned then).<br/>
  60. Return an empty string at EOF.<br/>
  61. """<br/>
  62. pass
  63.  
  64. def readlines(self, size=None): # real signature unknown; restored from __doc__<br/>
  65. 读取所有数据,并根据换行保存值列表<br/>
  66. """<br/>
  67. readlines([size]) -> list of strings, each a line from the file.
  68.  
  69. Call readline() repeatedly and return a list of the lines so read.<br/>
  70. The optional size argument, if given, is an approximate bound on the<br/>
  71. total number of bytes in the lines returned.<br/>
  72. """<br/>
  73. return []
  74.  
  75. def seek(self, offset, whence=None): # real signature unknown; restored from __doc__<br/>
  76. 指定文件中指针位置<br/>
  77. """<br/>
  78. seek(offset[, whence]) -> None. Move to new file position.
  79.  
  80. Argument offset is a byte count. Optional argument whence defaults to<br/>
  81. (offset from start of file, offset should be >= 0); other values are 1<br/>
  82. (move relative to current position, positive or negative), and 2 (move<br/>
  83. relative to end of file, usually negative, although many platforms allow<br/>
  84. seeking beyond the end of a file). If the file is opened in text mode,<br/>
  85. only offsets returned by tell() are legal. Use of other offsets causes<br/>
  86. undefined behavior.<br/>
  87. Note that not all file objects are seekable.<br/>
  88. """<br/>
  89. pass
  90.  
  91. def tell(self): # real signature unknown; restored from __doc__<br/>
  92. 获取当前指针位置<br/>
  93. """ tell() -> current file position, an integer (may be a long integer). """<br/>
  94. pass
  95.  
  96. def truncate(self, size=None): # real signature unknown; restored from __doc__<br/>
  97. 截断数据,仅保留指定之前数据<br/>
  98. """<br/>
  99. truncate([size]) -> None. Truncate the file to at most size bytes.
  100.  
  101. Size defaults to the current file position, as returned by tell().<br/>
  102. """<br/>
  103. pass
  104.  
  105. def write(self, p_str): # real signature unknown; restored from __doc__<br/>
  106. 写内容<br/>
  107. """<br/>
  108. write(str) -> None. Write string str to file.
  109.  
  110. Note that due to buffering, flush() or close() may be needed before<br/>
  111. the file on disk reflects the data written.<br/>
  112. """<br/>
  113. pass
  114.  
  115. def writelines(self, sequence_of_strings): # real signature unknown; restored from __doc__<br/>
  116. 将一个字符串列表写入文件<br/>
  117. """<br/>
  118. writelines(sequence_of_strings) -> None. Write the strings to the file.
  119.  
  120. Note that newlines are not added. The sequence can be any iterable object<br/>
  121. producing strings. This is equivalent to calling write() for each string.<br/>
  122. """<br/>
  123. pass
  124.  
  125. def xreadlines(self): # real signature unknown; restored from __doc__<br/>
  126. 可用于逐行读取文件,非全部<br/>
  127. """<br/>
  128. xreadlines() -> returns self.
  129.  
  130. For backward compatibility. File objects now include the performance<br/>
  131. optimizations previously implemented in the xreadlines module.<br/>
  132. """<br/>
  133. pass
  134.  
  135. 2.x

2.x版本

  1. class TextIOWrapper(_TextIOBase):<br/>
  2. """<br/>
  3. Character and line based layer over a BufferedIOBase object, buffer.
  4.  
  5. encoding gives the name of the encoding that the stream will be<br/>
  6. decoded or encoded with. It defaults to locale.getpreferredencoding(False).
  7.  
  8. errors determines the strictness of encoding and decoding (see<br/>
  9. help(codecs.Codec) or the documentation for codecs.register) and<br/>
  10. defaults to "strict".
  11.  
  12. newline controls how line endings are handled. It can be None, '',<br/>
  13. '\n', '\r', and '\r\n'. It works as follows:
  14.  
  15. * On input, if newline is None, universal newlines mode is<br/>
  16. enabled. Lines in the input can end in '\n', '\r', or '\r\n', and<br/>
  17. these are translated into '\n' before being returned to the<br/>
  18. caller. If it is '', universal newline mode is enabled, but line<br/>
  19. endings are returned to the caller untranslated. If it has any of<br/>
  20. the other legal values, input lines are only terminated by the given<br/>
  21. string, and the line ending is returned to the caller untranslated.
  22.  
  23. * On output, if newline is None, any '\n' characters written are<br/>
  24. translated to the system default line separator, os.linesep. If<br/>
  25. newline is '' or '\n', no translation takes place. If newline is any<br/>
  26. of the other legal values, any '\n' characters written are translated<br/>
  27. to the given string.
  28.  
  29. If line_buffering is True, a call to flush is implied when a call to<br/>
  30. write contains a newline character.<br/>
  31. """<br/>
  32. def close(self, *args, **kwargs): # real signature unknown<br/>
  33. 关闭文件<br/>
  34. pass
  35.  
  36. def fileno(self, *args, **kwargs): # real signature unknown<br/>
  37. 文件描述符<br/>
  38. pass
  39.  
  40. def flush(self, *args, **kwargs): # real signature unknown<br/>
  41. 刷新文件内部缓冲区<br/>
  42. pass
  43.  
  44. def isatty(self, *args, **kwargs): # real signature unknown<br/>
  45. 判断文件是否是同意tty设备<br/>
  46. pass
  47.  
  48. def read(self, *args, **kwargs): # real signature unknown<br/>
  49. 读取指定字节数据<br/>
  50. pass
  51.  
  52. def readable(self, *args, **kwargs): # real signature unknown<br/>
  53. 是否可读<br/>
  54. pass
  55.  
  56. def readline(self, *args, **kwargs): # real signature unknown<br/>
  57. 仅读取一行数据<br/>
  58. pass
  59.  
  60. def seek(self, *args, **kwargs): # real signature unknown<br/>
  61. 指定文件中指针位置<br/>
  62. pass
  63.  
  64. def seekable(self, *args, **kwargs): # real signature unknown<br/>
  65. 指针是否可操作<br/>
  66. pass
  67.  
  68. def tell(self, *args, **kwargs): # real signature unknown<br/>
  69. 获取指针位置<br/>
  70. pass
  71.  
  72. def truncate(self, *args, **kwargs): # real signature unknown<br/>
  73. 截断数据,仅保留指定之前数据<br/>
  74. pass
  75.  
  76. def writable(self, *args, **kwargs): # real signature unknown<br/>
  77. 是否可写<br/>
  78. pass
  79.  
  80. def write(self, *args, **kwargs): # real signature unknown<br/>
  81. 写内容<br/>
  82. pass
  83.  
  84. def __getstate__(self, *args, **kwargs): # real signature unknown<br/>
  85. pass
  86.  
  87. def __init__(self, *args, **kwargs): # real signature unknown<br/>
  88. pass
  89.  
  90. @staticmethod # known case of __new__<br/>
  91. def __new__(*args, **kwargs): # real signature unknown<br/>
  92. """ Create and return a new object. See help(type) for accurate signature. """<br/>
  93. pass
  94.  
  95. def __next__(self, *args, **kwargs): # real signature unknown<br/>
  96. """ Implement next(self). """<br/>
  97. pass
  98.  
  99. def __repr__(self, *args, **kwargs): # real signature unknown<br/>
  100. """ Return repr(self). """<br/>
  101. pass
  102.  
  103. buffer = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  104.  
  105. closed = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  106.  
  107. encoding = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  108.  
  109. errors = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  110.  
  111. line_buffering = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  112.  
  113. name = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  114.  
  115. newlines = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  116.  
  117. _CHUNK_SIZE = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  118.  
  119. _finalizing = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  120.  
  121. 3.x

3.x版本

三:管理上下文

为了避免打开文件后忘记关闭,可以通过管理上下文,即:

  1. with open('log','r') as f:
  2.  
  3. ...

如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。

在Python 2.7 及以后,with又支持同时对多个文件的上下文进行管理,即:

  1. with open('log1') as obj1, open('log2') as obj2:<br/>
  2. pass

可使用此方法对一个文件进行读操作,同时把数据又写入到另一个打开的文件中!

read()、readline() 和 readlines()

每种方法可以接受一个变量以限制每次读取的数据量,但它们通常不使用变量。 .read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。然而 .read() 生成文件内容最直接的字符串表示,但对于连续的面向行的处理,它却是不必要的,并且如果文件大于可用内存,则不可能实现这种处理。

.readline() 和 .readlines() 非常相似。它们都在类似于以下的结构中使用:

  1. fh = open('c:\\autoexec.bat')<br/>
  2. for line in fh.readlines():<br/>
  3. print line

.readline() 和 .readlines() 之间的差异是后者一次读取整个文件,象 .read() 一样。.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for … in … 结构进行处理。另一方面,.readline() 每次只读取一行,通常比 .readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 .readline()。

练习题:用户名与密码的验证

首先新建一个文件,这里为test.log文件,内容为两行如下:

  1. admin$123<br/>
  2. ginvip$123456

1:让用户选择1或2,1为登录,2为注册

2:如果用户选择1,用户输入用户名与密码,然后与test.log文件中的用户名与密码进行验证,验证成功输出“登录成功”,否则“登录失败”

3:如果用户选择2,让用户输入用户名与密码,并与test.log文件中的用户名验证,如果test.log中用户名已经存在,则输出“该用户名已经存在”,否则将用户输入的用户与密码以上面test.log文件中的形式写入test.log文件中

  1. def check_user(user) :<br/>
  2. with open('test.log','r',encoding='utf-8') as f :<br/>
  3. for line in f :<br/>
  4. user_list = line.strip()<br/>
  5. user_list = user_list.split('$')<br/>
  6. if user == user_list[0] :<br/>
  7. return True<br/>
  8. return False<br/>
  9. def register(user,pwd) :<br/>
  10. with open('test.log','a',encoding='utf-8') as f :<br/>
  11. user_info = '\n' + user + '$' + pwd<br/>
  12. if f.write(user_info) :<br/>
  13. return True<br/>
  14. return False<br/>
  15. def login(user,pwd) :<br/>
  16. with open('test.log','r',encoding='utf-8') as f :<br/>
  17. for line in f:<br/>
  18. user_list = line.strip()<br/>
  19. user_list = user_list.split('$')<br/>
  20. if user == user_list[0] and pwd == user_list[1]:<br/>
  21. return True<br/>
  22. return False<br/>
  23. def main() :<br/>
  24. print('welcome to my website')<br/>
  25. choice = input('1:login 2:register')<br/>
  26. if choice == '':<br/>
  27. user = input('input username :')<br/>
  28. pwd = input('input password : ')<br/>
  29. if check_user(user) :<br/>
  30. print('the username is exist')<br/>
  31. else:<br/>
  32. if register(user,pwd) :<br/>
  33. print('register success')<br/>
  34. else:<br/>
  35. print('register failed')<br/>
  36. elif choice == '':<br/>
  37. user = input('input username :')<br/>
  38. pwd = input('input password : ')<br/>
  39. if login(user,pwd) :<br/>
  40. print('login success')<br/>
  41. else:<br/>
  42. print('login failed')<br/>
  43. main()

冒泡排序


冒泡排序的原理:

Python高手之路【三】python基础之函数

  1. def Bubble_sort(args) :<br/>
  2. for i in range(len(args)-1) :<br/>
  3. for j in range(len(args) -1):<br/>
  4. if args[j] > args[j+1]:<br/>
  5. temp = args[j]<br/>
  6. args[j] = args[j+1]<br/>
  7. args[j+1] = temp<br/>
  8. return args<br/>
  9. li = [33,2,10,1,9,3,8]<br/>
  10. print(Bubble_sort(li))

练习题

1、简述普通参数、指定参数、默认参数、动态参数的区别

2、写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数

  1. digit = 0<br/>
  2. case = 0<br/>
  3. space = 0<br/>
  4. other = 0<br/>
  5. def func2(s) :<br/>
  6. global digit,case,space,other<br/>
  7. if not isinstance(s,basestring) :<br/>
  8. print('the data type wrong!')<br/>
  9. return False<br/>
  10. for i in s :<br/>
  11. if i.isdigit() :<br/>
  12. digit += 1<br/>
  13. elif i.isalpha() :<br/>
  14. case += 1<br/>
  15. elif i.isspace() :<br/>
  16. space += 1<br/>
  17. else:<br/>
  18. other += 1<br/>
  19. s = 'I love python , is num 1 , o_k'<br/>
  20. a = [1,2,3]<br/>
  21. func2(s)<br/>
  22. print(digit)<br/>
  23. print(case)<br/>
  24. print(space)<br/>
  25. print(other)<br/>
  26. ########################################<br/>
  27. 1<br/>
  28. 18<br/>
  29. 8<br/>
  30. 3<br/>
  31. 问题:判断是不是字符串后直接退出函数,而不执行下面的代码?

第2题答案

3、写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。

  1. def func3(v) :<br/>
  2. if len(v) > 5 :<br/>
  3. return True<br/>
  4. else:<br/>
  5. return False<br/>
  6. a = 'I love python , is num 1 , o_k'<br/>
  7. l = [1,2,3]<br/>
  8. t = (5,7,9,10,45,10)<br/>
  9. print(func3(t))

第三题答案

4、写函数,检查用户传入的对象(字符串、列表、元组)的每一个元素是否含有空内容。

5、写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。

  1. def func5(lis) :<br/>
  2. if len(lis) > 2 :<br/>
  3. return lis[0:2]<br/>
  4. else :<br/>
  5. return False<br/>
  6. li = [1,2,3]<br/>
  7. print(func5(li))<br/>
  8. ##########################################<br/>
  9. [1, 2]

第五题答案

6、写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。

  1. def func6(lis) :<br/>
  2. new_lis = []<br/>
  3. for k in range(len(lis)) :<br/>
  4. if k % 2 == 1 :<br/>
  5. new_lis.append(lis[k])<br/>
  6. return new_lis<br/>
  7. li = [1,2,3,8,10,44,77]<br/>
  8. tu = ('poe','andy','jet','bruce','jacky')<br/>
  9. print(func6(tu))<br/>
  10. ##########################################<br/>
  11. ['andy', 'bruce']

第六题答案

7、写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。

  1. dic = {"k1": "v1v1", "k2": [,,,]}
  2.  
  3. PS:字典中的value只能是字符串或列表
  1. def func7(d) :<br/>
  2. v = d.values()<br/>
  3. li = []<br/>
  4. for i in v :<br/>
  5. if len(i) > 2:<br/>
  6. li.append(i[0:2])<br/>
  7. return li<br/>
  8. print(func7(dic))<br/>
  9. ##########################################<br/>
  10. [[11, 22], 'v1']

第七题答案

8、写函数,利用递归获取斐波那契数列中的第 10 个数,并将该值返回给调用者

  1. def fabonacci(n) :<br/>
  2. if n == 0 :<br/>
  3. return 0<br/>
  4. elif n == 1:<br/>
  5. return 1<br/>
  6. else:<br/>
  7. return fabonacci(n-1) + fabonacci(n-2)<br/>
  8. print(fabonacci(10))