实验4 函数与异常处理应用编程
1. 实验任务1
task1.py
print(sum) sum = 42 print(sum) def inc(n): sum = n+1 print(sum) return sum sum = inc(7) + inc(7) print(sum)
问题: task1.py源码中,共有4处有python语句 print(sum) (line1, line3, line7, line11)。 这4处使用的标识符sum是代表一个变量名吗?如果不是,请分别指出这4行中变量sum的作用域。
答:不是,line1,内置作用域;line3,全域作用域;line7,局部作用域,line11;全域作用域
task2.py
task2_1.py
def func1(a, b, c, d, e, f): ''' 返回参数a,b,c,d,e,f构成的列表 默认,参数按位置传递; 也支持关键字传递 ''' return [a,b,c,d,e,f] def func2(a, b, c,*, d, e, f): ''' 返回参数a,b,c,d,e,f构成的列表 *后面的参数只能按关键字传递 ''' return [a,b,c,d,e,f] def func3(a, b, c, /, d, e, f): ''' 返回参数a,b,c,d,e,f构成的列表 /前面的参数只能按位置传递 ''' return [a,b,c,d,e,f] # func1调用:按位置传递、按参数传递都可以 print( func1(1,9,2,0,5,3) ) print( func1(a=1, b=9, c=2, d=0, e=5, f=3) ) print( func1(1,9,2, f=3, d=0, e=5)) # func2调用:d,e,f必须按关键字传递 print( func2(11, 99, 22, d=0, e=55, f=33) ) print( func2(a=11, b=99, c=22, d=0, e=55, f=33) ) # func3调用:a,b,c必须按位置传递 print( func3(111, 999, 222, 0, 555, 333)) print( func3(111, 999, 222, d=0, e=555, f=333) )
(1:
在line33后,尝试增加一行函数调用,重新运行程序,查看解释器中出现的错误提示信息是什么。
(2:
task2_2.py
list1 = [1, 9, 8, 4]
print( sorted(list1) )
print( sorted(list1, reverse=True) )
print( sorted(list1, True) )
问:python内置函数sorted()中,参数reverse的传递方式是否必须使用关键字传递?
答:python内置函数sorted()中,参数reverse的传递方式必须使用关键字传递
task2_3.py
def func(a,b,c,/,*,d,e,f): return ([a,b,c,d,e,f]) print(func(1,2,3,d=4,e=5,f=6))
3. 实验任务3
def solve(a,b,c): ''' 求解一元二次方程,返回方程的两个根 :param a,b,c: int 方程系数 :return: tuple ''' delta = b*b-4*a*c delta_sqrt = abs(delta)**0.5 p1 = -b/2/a p2 = delta_sqrt/2/a if delta>=0: root1 = p1 + p2 root2 = p1 - p2 else: root1 = complex(p1,p2) root2 = complex(p1,-p2) return root1,root2 print(solve.__doc__) while True: try: a,b,c = eval(input('Enter eqution coefficient:')) if a == 0: raise except: print('invalid input,or,a is zero') break else: root1,root2 = solve(a,b,c) print(f'root1 = {root1:.2f},root2 = {root2:.2f}') print()
4. 实验任务4
def list_generator(a,b,c = 1): y = [] while a<=b: y.append(a) a+=c return y list1 = list_generator(-5,5) print(list1) list2 = list_generator(-5,5,2) print(list2) list3 = list_generator(1,5,0.5) print(list3)
5. 实验任务5
def is_prime(n): x = 2 m = True if n == 2: return True while n > x: if n%x == 0 and m == True: m = False else: x+=1 return m for number in range(2,21,2): for x in range(2,int(number/2)+1): y = number-x if is_prime(x) == True and is_prime(y) == True: print('{}={}+{}'.format(number,x,y)) break
6. 实验任务6
def encoder(s): ls = [] for i in s: x = ord(i) if (x>=97 and x<=117) or (x>=65 and x<=85): ls.append(chr(x+5)) if (x>=86 and x<=90) or (x>=118 and x<=122): ls.append(chr(x-21)) if x<65 or x>122: ls.append(chr(x)) return ''.join(ls) def decoder(s): ls = [] for i in s: x = ord(i) if (x >= 102 and x <= 122) or (x >= 70 and x <= 90): ls.append(chr(x - 5)) if (x >= 65 and x <= 69) or (x >= 97 and x <= 101): ls.append(chr(x+21)) if x < 65 or x > 122: ls.append(chr(x)) return ''.join(ls) x = input('输入英文文本: ') s = encoder(x) print(f'编码后的文本:{s}') print(f'对编码后的文本解码:{decoder(s)}')
7. 实验任务7
def collatz(n): if n%2 == 0: return n/2 elif n%2!=0: return n*3+1 while True: l = [] try: x = eval(input('enter a positive integer:')) if type(x) is not int or x <= 0: raise NameError except NameError: print('Error:must be a positive integer') else: while x>1: l.append(x) x = collatz(x) l.append(x) print(l)