Problem-1
op的功能:对若干个整数进行求和,对若干个字符串进行拼接。
op的执行分为两步。
第一步:调用op函数,传入的参数是操作的名称和操作的参数的类型。返回一个操作实例。这一步只是获取_op的实例化对象,并不执行_op函数内部的逻辑代码。当然,也不会调用_type_checker函数,因为只有执行_op函数的时候才会调用并执行_type_checker函数。
第二步:对第一步调用op函数返回的_op实例化对象作为一个新的函数进行调用,调用的时候只传递实例化参数。然后就会依次执行_op函数。_op函数首先调用_type_checker函数对传入_op函数的参数的个数和类型进行校验,校验的参照物就是调用op函数传递进来的参数。其实是对传递进op函数的arg_types进行校验,首先对参数的个数进行校验,然后对各个参数的类型进行校验。
输出
3
operation add’s 1th argument is of type int, but str given
operation add takes 2 arguments, but 3 given
helloworld
operation concat’s 0th argument is of type str, but int given
Problem-2
def flatten(nested):
if isinstance(nested, list):
for sublist in nested:
for element in flatten(sublist):
yield element
else :
yield nested
print(list(flatten([[[1],2],3,4,[5,[6,7]],8])))
flatten函数的功能:讲嵌套列表中的元素提取出来放在同一个列表当中。
flatten函数的工作机制:flatten函数内部含有yield关键字,所以flatten就变成了生成器函数。使用递归的方式,每碰到一个嵌套的列表,对于该列表中的每一个元素,都会调用flatten函数,因此是递归调用。当然,flatten的递归终止条件是传入flatten的参数不是列表。也就是说,传入flatten的参数是一个数字。但是yield很特殊,第二次调用yield时,它可以从上次调用yield之后的位置处继续执行。所以,当递归调用生成器函数时,实际上只会对同一个位置的元素执行一次yield操作,然后yield就变化了位置。
只有到达递归的最底层之后,会进行递归结束时的退栈操作,这时才会执行yield操作。经过多层的flatten之后,到达最底层的那个生成器函数。所以需要首先从最高层的flatten生成器函数开始进行yield,直到最底层的flatten生成器函数执行yield之后,才算是yield操作完成。也就是说,可以把yield本身可以把它看成是一个递归的函数。因为高层的生成器函数的yield调用了下一层的生成器函数的yield,直到最底层的生成器函数调用yield之后,才算是完成。
综上,yield函数的输出是:[1,2,3,4,5,6,7,8]
Problem-3
decorator函数相当于时一个装饰器,这个和Java中的面向切面变成有些相似。即在执行A操作的时候来执行这个操作的前置操作,或者在A操作执行完成之后,来利用decorator函数来做一些收尾的工作。因为python是一种边解释边执行的变成语言,在执行say_whee()之前会解释执行print(“Something is happening before the function is called.”),在say_wheel()之后会解释执行print(“Something is happening after the function is called.”)。
所以,最后的输出结果时:
print(“Something is happening before the function is called.”)
Whee!
print(“Something is happening after the function is called.”)
Problem-4
a = ‘hello’
s = help(type(a))
print(s)
class str(object)
| str(object='') -> str
| str(bytes_or_buffer[, encoding[, errors]]) -> str
|
| Create a new string object from the given object. If encoding or
| errors is specified, then the object must expose a data buffer
| that will be decoded using the given encoding and error handler.
| Otherwise, returns the result of object.__str__() (if defined)
| or repr(object).
| encoding defaults to sys.getdefaultencoding().
| errors defaults to 'strict'.
|
| Methods defined here:
|
| __add__(self, value, /)
| Return self+value.
|
| __contains__(self, key, /)
| Return key in self.
|
| __eq__(self, value, /)
| Return self==value.
|
| __format__(...)
| S.__format__(format_spec) -> str
|
| Return a formatted version of S as described by format_spec.
|
| __ge__(self, value, /)
| Return self>=value.
|
| __getattribute__(self, name, /)
| Return getattr(self, name).
|
| __getitem__(self, key, /)
| Return self[key].
|
| __getnewargs__(...)
|
| __gt__(self, value, /)
| Return self>value.
|
| __hash__(self, /)
| Return hash(self).
|
| __iter__(self, /)
| Implement iter(self).
|
| __le__(self, value, /)
| Return self<=value.
|
| __len__(self, /)
| Return len(self).
|
| __lt__(self, value, /)
| Return self<value.
|
| __mod__(self, value, /)
| Return self%value.
|
| __mul__(self, value, /)
| Return self*value.n
|
| __ne__(self, value, /)
| Return self!=value.
|
| __new__(*args, **kwargs) from builtins.type
| Create and return a new object. See help(type) for accurate signature.
|
| __repr__(self, /)
| Return repr(self).
|
| __rmod__(self, value, /)
| Return value%self.
|
| __rmul__(self, value, /)
| Return self*value.
|
| __sizeof__(...)
| S.__sizeof__() -> size of S in memory, in bytes
|
| __str__(self, /)
| Return str(self).
|
| capitalize(...)
| S.capitalize() -> str
|
| Return a capitalized version of S, i.e. make the first character
| have upper case and the rest lower case.
|
| casefold(...)
| S.casefold() -> str
|
| Return a version of S suitable for caseless comparisons.
|
| center(...)
| S.center(width[, fillchar]) -> str
|
| Return S centered in a string of length width. Padding is
| done using the specified fill character (default is a space)
|
| count(...)
| S.count(sub[, start[, end]]) -> int
|
| Return the number of non-overlapping occurrences of substring sub in
| string S[start:end]. Optional arguments start and end are
| interpreted as in slice notation.
|
| encode(...)
| S.encode(encoding='utf-8', errors='strict') -> bytes
|
| Encode S using the codec registered for encoding. Default encoding
| is 'utf-8'. errors may be given to set a different error
| handling scheme. Default is 'strict' meaning that encoding errors raise
| a UnicodeEncodeError. Other possible values are 'ignore', 'replace' and
| 'xmlcharrefreplace' as well as any other name registered with
| codecs.register_error that can handle UnicodeEncodeErrors.
|
| endswith(...)
| S.endswith(suffix[, start[, end]]) -> bool
|
| Return True if S ends with the specified suffix, False otherwise.
| With optional start, test S beginning at that position.
| With optional end, stop comparing S at that position.
| suffix can also be a tuple of strings to try.
|
| expandtabs(...)
| S.expandtabs(tabsize=8) -> str
|
| Return a copy of S where all tab characters are expanded using spaces.
| If tabsize is not given, a tab size of 8 characters is assumed.
|
| find(...)
| S.find(sub[, start[, end]]) -> int
|
| Return the lowest index in S where substring sub is found,
| such that sub is contained within S[start:end]. Optional
| arguments start and end are interpreted as in slice notation.
|
| Return -1 on failure.
|
| format(...)
| S.format(*args, **kwargs) -> str
|
| Return a formatted version of S, using substitutions from args and kwargs.
| The substitutions are identified by braces ('{' and '}').
|
| format_map(...)
| S.format_map(mapping) -> str
|
| Return a formatted version of S, using substitutions from mapping.
| The substitutions are identified by braces ('{' and '}').
|
| index(...)
| S.index(sub[, start[, end]]) -> int
|
| Like S.find() but raise ValueError when the substring is not found.
|
| isalnum(...)
| S.isalnum() -> bool
|
| Return True if all characters in S are alphanumeric
| and there is at least one character in S, False otherwise.
|
| isalpha(...)
| S.isalpha() -> bool
|
| Return True if all characters in S are alphabetic
| and there is at least one character in S, False otherwise.
|
| isdecimal(...)
| S.isdecimal() -> bool
|
| Return True if there are only decimal characters in S,
| False otherwise.
|
| isdigit(...)
| S.isdigit() -> bool
|
| Return True if all characters in S are digits
| and there is at least one character in S, False otherwise.
|
| isidentifier(...)
| S.isidentifier() -> bool
|
| Return True if S is a valid identifier according
| to the language definition.
|
| Use keyword.iskeyword() to test for reserved identifiers
| such as "def" and "class".
|
| islower(...)
| S.islower() -> bool
|
| Return True if all cased characters in S are lowercase and there is
| at least one cased character in S, False otherwise.
|
| isnumeric(...)
| S.isnumeric() -> bool
|
| Return True if there are only numeric characters in S,
| False otherwise.
|
| isprintable(...)
| S.isprintable() -> bool
|
| Return True if all characters in S are considered
| printable in repr() or S is empty, False otherwise.
|
| isspace(...)
| S.isspace() -> bool
|
| Return True if all characters in S are whitespace
| and there is at least one character in S, False otherwise.
|
| istitle(...)
| S.istitle() -> bool
|
| Return True if S is a titlecased string and there is at least one
| character in S, i.e. upper- and titlecase characters may only
| follow uncased characters and lowercase characters only cased ones.
| Return False otherwise.
|
| isupper(...)
| S.isupper() -> bool
|
| Return True if all cased characters in S are uppercase and there is
| at least one cased character in S, False otherwise.
|
| join(...)
| S.join(iterable) -> str
|
| Return a string which is the concatenation of the strings in the
| iterable. The separator between elements is S.
|
| ljust(...)
| S.ljust(width[, fillchar]) -> str
|
| Return S left-justified in a Unicode string of length width. Padding is
| done using the specified fill character (default is a space).
|
| lower(...)
| S.lower() -> str
|
| Return a copy of the string S converted to lowercase.
|
| lstrip(...)
| S.lstrip([chars]) -> str
|
| Return a copy of the string S with leading whitespace removed.
| If chars is given and not None, remove characters in chars instead.
|
| partition(...)
| S.partition(sep) -> (head, sep, tail)
|
| Search for the separator sep in S, and return the part before it,
| the separator itself, and the part after it. If the separator is not
| found, return S and two empty strings.
|
| replace(...)
| S.replace(old, new[, count]) -> str
|
| Return a copy of S with all occurrences of substring
| old replaced by new. If the optional argument count is
| given, only the first count occurrences are replaced.
|
| rfind(...)
| S.rfind(sub[, start[, end]]) -> int
|
| Return the highest index in S where substring sub is found,
| such that sub is contained within S[start:end]. Optional
| arguments start and end are interpreted as in slice notation.
|
| Return -1 on failure.
|
| rindex(...)
| S.rindex(sub[, start[, end]]) -> int
|
| Like S.rfind() but raise ValueError when the substring is not found.
|
| rjust(...)
| S.rjust(width[, fillchar]) -> str
|
| Return S right-justified in a string of length width. Padding is
| done using the specified fill character (default is a space).
|
| rpartition(...)
| S.rpartition(sep) -> (head, sep, tail)
|
| Search for the separator sep in S, starting at the end of S, and return
| the part before it, the separator itself, and the part after it. If the
| separator is not found, return two empty strings and S.
|
| rsplit(...)
| S.rsplit(sep=None, maxsplit=-1) -> list of strings
|
| Return a list of the words in S, using sep as the
| delimiter string, starting at the end of the string and
| working to the front. If maxsplit is given, at most maxsplit
| splits are done. If sep is not specified, any whitespace string
| is a separator.
|
| rstrip(...)
| S.rstrip([chars]) -> str
|
| Return a copy of the string S with trailing whitespace removed.
| If chars is given and not None, remove characters in chars instead.
|
| split(...)
| S.split(sep=None, maxsplit=-1) -> list of strings
|
| Return a list of the words in S, using sep as the
| delimiter string. If maxsplit is given, at most maxsplit
| splits are done. If sep is not specified or is None, any
| whitespace string is a separator and empty strings are
| removed from the result.
|
| splitlines(...)
| S.splitlines([keepends]) -> list of strings
|
| Return a list of the lines in S, breaking at line boundaries.
| Line breaks are not included in the resulting list unless keepends
| is given and true.
|
| startswith(...)
| S.startswith(prefix[, start[, end]]) -> bool
|
| Return True if S starts with the specified prefix, False otherwise.
| With optional start, test S beginning at that position.
| With optional end, stop comparing S at that position.
| prefix can also be a tuple of strings to try.
|
| strip(...)
| S.strip([chars]) -> str
|
| Return a copy of the string S with leading and trailing
| whitespace removed.
| If chars is given and not None, remove characters in chars instead.
|
| swapcase(...)
| S.swapcase() -> str
|
| Return a copy of S with uppercase characters converted to lowercase
| and vice versa.
|
| title(...)
| S.title() -> str
|
| Return a titlecased version of S, i.e. words start with title case
| characters, all remaining cased characters have lower case.
|
| translate(...)
| S.translate(table) -> str
|
| Return a copy of the string S in which each character has been mapped
| through the given translation table. The table must implement
| lookup/indexing via __getitem__, for instance a dictionary or list,
| mapping Unicode ordinals to Unicode ordinals, strings, or None. If
| this operation raises LookupError, the character is left untouched.
| Characters mapped to None are deleted.
|
| upper(...)
| S.upper() -> str
|
| Return a copy of S converted to uppercase.
|
| zfill(...)
| S.zfill(width) -> str
|
| Pad a numeric string S with zeros on the left, to fill a field
| of the specified width. The string S is never truncated.
|
| ----------------------------------------------------------------------
| Static methods defined here:
|
| maketrans(x, y=None, z=None, /)
| Return a translation table usable for str.translate().
|
| If there is only one argument, it must be a dictionary mapping Unicode
| ordinals (integers) or characters to Unicode ordinals, strings or None.
| Character keys will be then converted to ordinals.
| If there are two arguments, they must be strings of equal length, and
| in the resulting dictionary, each character in x will be mapped to the
| character at the same position in y. If there is a third argument, it
| must be a string, whose characters will be mapped to None in the result.
None
Problem-5
“” ➞ 0
“5 6 +” ➞ 11
“6 5 5 7 * - /” ➞ 5
“x y +” ➞ Invalid instruction or operand
class MyException(Exception): # 定义自己的异常类型
def __init__(self,msg):
self.msg = msg
def __str__(self):
return self.msg
class Stack:
def __init__(self):
self.opes = [] # 存放运算符
self.nums = [] # 存放操作数
def push_operate(self,o):
self.opes.append(o)
def pop_operate(self):
return self.opes.pop()
def push_num(self,o):
self.nums.append(o)
def pop_num(self):
return self.nums.pop()
def __del__(self): # 析构函数,用于删除不用的资源
del self.opes
del self.nums
if __name__ == "__main__":
s = Stack()
opes = input('please input:')
c2 = opes.strip('"')
have_exception = 0
if c2 == '':
print(0)
else:
try:
c = c2.split(' ') # 分离出运算数和运算符,组成列表赋值给c
for i in c: # 对所有的数字进行操作
if i not in ['+','-','*','/']:
s.push_num(i) # 存放操作数
for i in range(0, len(c))[::-1]: # 倒着输出下标
if c[i] in ['+','-','*','/']:
s.push_operate(c[i]) # 存放操作符
if len(s.opes) == 0: # 如果操作符为空
raise MyException("Invalid instruction or operand")
while len(s.opes): # 依次检查每一个字符
try:
n1 = int(s.pop_num())
n2 = int(s.pop_num())
n3 = 0
op = s.pop_operate()
if op == '+':
n3 = n1 + n2
# print("{}{}{}={}".format(n1, op, n2, n3)) # 打印出运算过程
elif op == '-':
n3 = n1 - n2
# print("{}{}{}={}".format(n1, op, n2, n3))
elif op == '*':
n3 = n1 * n2
# print("{}{}{}={}".format(n1, op, n2, n3))
elif op == '/':
n3 = n1 / n2
# print("{}{}{}={}".format(n1, op, n2, n3))
s.push_num(n3)
except Exception as e:
raise MyException('Invalid instruction or operand')
break
except MyException as me:
have_exception = 1
print(me.msg)
if have_exception == 0:
print('{}'.format(s.pop_num()))