builtins.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. def all(iterable):
  2. for i in iterable:
  3. if not i:
  4. return False
  5. return True
  6. def any(iterable):
  7. for i in iterable:
  8. if i:
  9. return True
  10. return False
  11. def enumerate(iterable, start=0):
  12. n = start
  13. for elem in iterable:
  14. yield n, elem
  15. n += 1
  16. def __minmax_reduce(op, args):
  17. if len(args) == 2: # min(1, 2)
  18. return args[0] if op(args[0], args[1]) else args[1]
  19. if len(args) == 0: # min()
  20. raise TypeError('expected 1 arguments, got 0')
  21. if len(args) == 1: # min([1, 2, 3, 4]) -> min(1, 2, 3, 4)
  22. args = args[0]
  23. args = iter(args)
  24. try:
  25. res = next(args)
  26. except StopIteration:
  27. raise ValueError('args is an empty sequence')
  28. while True:
  29. try:
  30. i = next(args)
  31. except StopIteration:
  32. break
  33. if op(i, res):
  34. res = i
  35. return res
  36. def min(*args, key=None):
  37. key = key or (lambda x: x)
  38. return __minmax_reduce(lambda x,y: key(x)<key(y), args)
  39. def max(*args, key=None):
  40. key = key or (lambda x: x)
  41. return __minmax_reduce(lambda x,y: key(x)>key(y), args)
  42. def sum(iterable):
  43. res = 0
  44. for i in iterable:
  45. res += i
  46. return res
  47. def map(f, iterable):
  48. for i in iterable:
  49. yield f(i)
  50. def filter(f, iterable):
  51. for i in iterable:
  52. if f(i):
  53. yield i
  54. class zip:
  55. def __init__(self, *iterables):
  56. self.iterables = [iter(it) for it in iterables]
  57. def __iter__(self):
  58. return self
  59. def __next__(self):
  60. result = []
  61. for it in self.iterables:
  62. result.append(next(it))
  63. return tuple(result)
  64. def reversed(iterable):
  65. a = list(iterable)
  66. a.reverse()
  67. return a
  68. def sorted(iterable, key=None, reverse=False):
  69. a = list(iterable)
  70. a.sort(key=key, reverse=reverse)
  71. return a
  72. def help(obj):
  73. if hasattr(obj, '__func__'):
  74. obj = obj.__func__
  75. # print(obj.__signature__)
  76. if obj.__doc__:
  77. print(obj.__doc__)
  78. def complex(real, imag=0):
  79. import cmath
  80. return cmath.complex(real, imag) # type: ignore
  81. def dir(obj) -> list[str]:
  82. tp_module = type(__import__('math'))
  83. if isinstance(obj, tp_module):
  84. return [k for k, _ in obj.__dict__.items()]
  85. names = set()
  86. if not isinstance(obj, type):
  87. obj_d = obj.__dict__
  88. if obj_d is not None:
  89. names.update([k for k, _ in obj_d.items()])
  90. cls = type(obj)
  91. else:
  92. cls = obj
  93. while cls is not None:
  94. names.update([k for k, _ in cls.__dict__.items()])
  95. cls = cls.__base__
  96. return sorted(list(names))
  97. class set:
  98. def __init__(self, iterable=None):
  99. iterable = iterable or []
  100. self._a = {}
  101. self.update(iterable)
  102. def add(self, elem):
  103. self._a[elem] = None
  104. def discard(self, elem):
  105. self._a.pop(elem, None)
  106. def remove(self, elem):
  107. del self._a[elem]
  108. def clear(self):
  109. self._a.clear()
  110. def update(self, other):
  111. for elem in other:
  112. self.add(elem)
  113. def __len__(self):
  114. return len(self._a)
  115. def copy(self):
  116. return set(self._a.keys())
  117. def __and__(self, other):
  118. return {elem for elem in self if elem in other}
  119. def __sub__(self, other):
  120. return {elem for elem in self if elem not in other}
  121. def __or__(self, other):
  122. ret = self.copy()
  123. ret.update(other)
  124. return ret
  125. def __xor__(self, other):
  126. _0 = self - other
  127. _1 = other - self
  128. return _0 | _1
  129. def union(self, other):
  130. return self | other
  131. def intersection(self, other):
  132. return self & other
  133. def difference(self, other):
  134. return self - other
  135. def symmetric_difference(self, other):
  136. return self ^ other
  137. def __eq__(self, other):
  138. if not isinstance(other, set):
  139. return NotImplemented
  140. return len(self ^ other) == 0
  141. def __ne__(self, other):
  142. if not isinstance(other, set):
  143. return NotImplemented
  144. return len(self ^ other) != 0
  145. def isdisjoint(self, other):
  146. return len(self & other) == 0
  147. def issubset(self, other):
  148. return len(self - other) == 0
  149. def issuperset(self, other):
  150. return len(other - self) == 0
  151. def __contains__(self, elem):
  152. return elem in self._a
  153. def __repr__(self):
  154. if len(self) == 0:
  155. return 'set()'
  156. return '{'+ ', '.join([repr(i) for i in self._a.keys()]) + '}'
  157. def __iter__(self):
  158. return iter(self._a.keys())