实验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)

运行测试截图

 问:task1.py源码中, 共有4处python语句print(sum)(line1,line3,line7,line11)。这四处使用的标识符sum是同一个对象的名称吗?如果不是,请以文字方式回答这四行中标识符sum的作用域。

答:不是,line1是Built-in内置作用域,line3和line11是Global全局作用域,line7是Local局部作用域。

 

实验任务2

task2-1

实验源码

 1 def func1(a, b, c, d, e, f):
 2     '''
 3     返回参数a,b,c,d,e,f构成的列表
 4     默认,参数按位置传递;也支持关键字传递
 5     '''
 6     return [a, b, c, d, e, f]
 7 
 8 
 9 def func2(a, b, c, *, d, e, f):
10     '''
11     返回参数a,b,c,d,e,f构成的列表
12     *后面的参数只能按关键字传递
13     '''
14     return [a, b, c, d, e, f]
15 
16 
17 def func3(a, b, c, /, d, e, f):
18     '''
19     返回参数a,b,c,d,e,f构成的列表
20     /前面的参数只能按位置传递
21     '''
22     return [a, b, c, d, e, f]
23 
24 
25 # func1调用:按位置传递、按参数传递都可以
26 print(func1(1, 9, 2, 0, 5, 3))
27 print(func1(a=1, b=9, c=2, d=0, e=5, f=3))
28 print(func1(1, 9, 2, f=3, d=0, e=5))
29 
30 
31 # func2调用:d,e,f必须按关键字传递
32 print(func2(11, 99, 22, d=0, e=55, f=33))
33 print(func2(a=11, b=99, c=22, d=0, e=55, f=33))
34 
35 
36 # func3调用:a,b,c必须按位置传递
37 print(func3(111, 999, 222, 0, 555, 333))
38 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的传递方式是否必须使用关键字传递?

答:是的。

 

task2-3

实验源码

1 def func(a, b, c, /, *, d, e, f):
2     return([a, b, c, d, e, f])
3 print(func(1, 2, 3, d = 4, e = 5, f = 6))

运行测试截图

 

实验任务3

task3-1

 1 def solve(a, b, c):
 2     '''
 3     求解一元二次方程, 返回方程的两个根
 4 
 5     :para: a,b,c: float 方程系数
 6     :return: tuple
 7     '''
 8     delta = b*b - 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,length=1):
 2     lst=[]
 3     while start<=end:
 4         lst.append(start)
 5         start+=length
 6 
 7     return lst
 8 
 9 
10 list1 = list_generator(-5, 5)
11 print(list1)
12 
13 list2 = list_generator(-5, 5, 2)
14 print(list2)
15 
16 list3 = list_generator(1, 5, 0.5)
17 print(list3)

运行测试截图

 

实验任务5

task5

实验源码

 1 def is_prime(integer):
 2     i = 2
 3     while i<integer and integer%i != 0:
 4         i += 1
 5     return 'True' if i == integer else 'False'
 6 
 7 lst = []
 8 for i in range(2, 21):
 9     if is_prime(i) == 'True':
10         lst.append(i)
11 
12 for j in range(4, 21, 2):
13     for k in lst:
14         if is_prime(j-k) == 'True':
15             print(f'{j}={k}+{j-k}')
16             break

运行测试截图

 

实验任务6

task6

实验源码

 1 def encoder(text):
 2     ls = list(text)
 3     for i in range(len(ls)):
 4         if 'a' <= ls[i].lower() <= 'u':
 5             ls[i] = chr(ord(ls[i])+5)
 6         elif 'v' <= ls[i].lower() <= 'z':
 7             ls[i] = chr(ord(ls[i])-21)
 8         else:
 9             pass
10     return ''.join(ls)
11 
12 def decoder(text):
13     ls=list(text)
14     for i in range(len(ls)):
15         if 'f' <= ls[i].lower() <= 'z':
16             ls[i] = chr(ord(ls[i])-5)
17         elif 'a' <= ls[i].lower() <= 'e':
18             ls[i] = chr(ord(ls[i])+21)
19         else:
20             pass
21     return ''.join(ls)
22 
23 
24 text = input('输入英文文本: ')
25 
26 encoded_text = encoder(text)
27 print('编码后的文本: ', encoded_text)
28 
29 decoded_text = decoder(encoded_text)
30 print('对编码后的文本解码: ', decoded_text)

运行测试截图

 

实验任务7

task7

实验源码

 1 def collatz(n):
 2     if n%2==0:
 3         return n//2
 4     else:
 5         return n*3+1
 6 
 7 try:
 8     n=eval(input('Enter a positive integer:'))
 9     if n<=0 or n!=int(n):
10         raise
11 except:
12     print('Error: must be a positive integer')
13 else:
14     ls=[n]
15     while n!=1:
16         n=collatz(n)
17         ls.append(n)
18     print(ls)

运行测试截图

 

实验任务8

task8

实验源码

 1 def func(n):
 2     if n==0:
 3         return 0
 4     else:
 5         return 2*func(n-1)+1
 6 
 7 
 8 while True:
 9     x = input()
10     if x == '#':
11         print('计算结束')
12         break
13 
14     n = int(x)
15     ans = func(n)
16     print(f'n = {n}, ans = {ans}')

运行测试截图

 

posted @ 2023-05-23 23:56  谢幸育  阅读(38)  评论(0)    收藏  举报