实验4 函数与异常处理编程
实验任务1
#task1
实验内容
1 print(sum) 2 sum = 42 3 print(sum) 4 5 def inc(n): 6 sum = n + 1 7 print(sum) 8 return sum 9 10 sum = inc(7) + inc(7) 11 print(sum)
实验截图
实验结论
这4处使用的标识符sum不是同一个对象的名称。line1处sum的作用域是Python内置模块的名字空间(Builtin), line3处sum的作用域是函数定义所在模块(文件)的名字空间(Global), line7处sum的作用域是函数内部命名空间(Local), line11处sum的作用域是外部嵌套函数的名字空间(Enclosing function locals)。
实验任务2
#task2_1
实验内容
1 def func1(a, b, c, d, e, f): #默认参数按位置传递,也支持关键字传递 2 return [a,b,c,d,e,f] 3 4 def func2(a, b, c,*, d, e, f): #*后面的参数只能按关键字传递 5 return [a,b,c,d,e,f] 6 7 def func3(a, b, c,/, d, e, f): #/前面的参数只能按位置传递 8 return [a,b,c,d,e,f] 9 10 11 #func1调用:按位置传递、按参数传递都可以 12 print(func1(1, 9, 2, 0, 5, 3)) 13 print(func1(a=1, b=9, c=2, d=0, e=5, f=3)) 14 print(func1(1, 9, 2, f=3, d=0, e=5)) 15 16 #func2调用:d,e,f必须按关键字传递 17 print(func2(11, 99, 22, d=0, e=55, f=33)) 18 print(func2(a=11, b=99, c=22, d=0, e=55, f=33)) 19 20 #func3调用:a,b,c必须按位置传递 21 print(func3(111, 999, 222, 0, 555, 333)) 22 print(func3(111, 999, 222, d=0, e=555, f=333))
实验截图
#task2_2
实验内容
1 list1 = [1,9,8,4] 2 3 print(sorted(list1)) 4 print(sorted(list1,reverse = True)) 5 print(sorted(list1,True))
实验截图
实验结论
python内置函数sorted()中,参数reverse的传递方式必须使用关键字传递,即要写出reverse = True或者直接不写。否则会像运行line5时那样报错。
#task2_3
实验内容
1 def func(a, b, c, /, *, d, e, f): 2 return ([a, b, c, d, e, f]) 3 4 print(func(1, 2, 3, d=4, e=5, f=6))
实验截图
实验任务3
#task3
实验内容
1 def solve(a,b,c): 2 ''' 3 求解一元二次方程,返回方程的两个根 4 5 :para:a,b,c:float 方程系数 6 :return: tuple 7 ''' 8 delta = b**2 - 4*a*c 9 delta_sqrt = abs(delta)**0.5 10 p1 = -b/2/a 11 p2 = delta_sqrt/2/a 12 13 if delta >= 0: 14 root1 = p1 + p2 15 root2 = p1 - p2 16 else: 17 root1 = complex(p1,p2) 18 root2 = complex(p1,-p2) 19 20 return root1,root2 21 22 print(solve.__doc__) 23 while True: 24 try: 25 t = input('输入一元二次方程组系数a b c,或者,输入#结束:') 26 if t == '#': 27 print('结束计算,退出') 28 break 29 a,b,c = map(float,t.split()) 30 if a == 0: 31 raise ValueError('a=0, 不是一元二次方程') 32 except ValueError as e: 33 print(repr(e)) 34 print() 35 except: 36 print('有其它错误发生\n') 37 else: 38 root1, root2 = solve(a,b,c) 39 print(f'root1 = {root1:.2f}, root2 = {root2:.2f}') 40 print()
实验截图
实验任务4
#task4
实验内容
1 def list_generator(start, end, step=1): 2 x = start 3 lst = [] 4 while x <= end : 5 lst.append(x) 6 x += step 7 return lst 8 9 list1 = list_generator(-5,5) 10 print(list1) 11 12 list2= list_generator(-5,5,2) 13 print(list2) 14 15 list3 = list_generator(1,5,0.5) 16 print(list3)
实验截图
实验任务5
#task5
实验内容
1 def is_prime(n): 2 if n == 1: 3 return False 4 elif n == 2: 5 return True 6 else: 7 for i in range(2,n): 8 if n%i == 0: 9 return False 10 break 11 if i == n-1: 12 return True 13 14 oushu_lst = [i for i in range(4,20+1) if i%2 == 0] 15 prime_lst = [k for k in range(1,20+1) if is_prime(k) == True] 16 17 index = 0 18 i = 0 19 while i < len(oushu_lst): 20 j = 0 21 while j < len(prime_lst): 22 k = 0 23 while k < len(prime_lst): 24 if oushu_lst[i] == prime_lst[j] + prime_lst[k]: 25 print(f'{oushu_lst[i]} = {prime_lst[j]} + {prime_lst[k]}') 26 index += 1 27 break 28 k += 1 29 j += 1 30 if index - 1 == i: 31 break 32 i += 1
实验截图
实验任务6
#task6
实验内容
1 def encoder(txt): 2 txt_lst = list(txt) 3 encoder_lst = [] 4 for x in txt_lst: 5 if 65 <= ord(x) <= 90: 6 t = (ord(x) - ord('A') + 5) % 26 + ord('A') 7 encoder_lst.append(chr(t)) 8 elif 97 <= ord(x) <= 122: 9 t = (ord(x) - ord('a') + 5) % 26 + ord('a') 10 encoder_lst.append(chr(t)) 11 else: 12 encoder_lst.append(x) 13 return ''.join(encoder_lst) 14 15 def decoder(txt): 16 txt_lst = list(txt) 17 decoder_lst = [] 18 for x in txt_lst: 19 if 65 <= ord(x) <= 90: 20 t = (ord(x) - ord('A') - 5) % 26 + ord('A') 21 decoder_lst.append(chr(t)) 22 elif 97 <= ord(x) <= 122: 23 t = (ord(x) - ord('a') - 5) % 26 + ord('a') 24 decoder_lst.append(chr(t)) 25 else: 26 decoder_lst.append(x) 27 return ''.join(decoder_lst) 28 29 30 text = input('输入英文文本: ') 31 encoded_text = encoder(text) 32 print('编码后的文本:', encoded_text) 33 decoded_text = decoder(encoded_text) 34 print('对编码后的文本解码:', decoded_text)
实验截图
实验任务7
#task7
实验内容
1 def collatz(n): 2 x = n 3 lst = [n] 4 while x != 1: 5 if x%2 == 0: 6 x = x/2 7 lst.append(int(x)) 8 else: 9 x = 3*x + 1 10 lst.append(int(x)) 11 return lst 12 13 try: 14 n = int(input('Enter a positive integer: ')) 15 if n <= 0: 16 raise ValueError 17 except ValueError: 18 print('Error: must be a positive integer') 19 else: 20 print(collatz(n))
实验截图
实验任务8
#task8
实验内容
1 def func(n): 2 f0 = 1 3 for i in range(n): 4 f0 = f0*2 5 return f0 - 1 6 7 while True: 8 x = input() 9 if x == '#': 10 print('计算结束') 11 break 12 n = int(x) 13 ans = func(n) 14 print(f'n = {n}, ans = {ans}')
实验截图