实验4 函数与异常处理编程

实验任务1

task1.py

程序源码:

1 print(sum)
2 sum = 42
3 print(sum)
4 def inc(n):
5     sum = n+1
6     print(sum)
7     return sum
8 sum = inc(7) + inc(7)
9 print(sum)

运行测试截图:

 

1.task1.py源码中,共有4处有python语句 print(sum) (line1, line3, line7, line11)。
这4处使用的标识符sum是同一个对象的名称吗?如果不是,请以文字方式回答这4处中标识符
sum的作用域。
答:不是,line1是Built-in内置作用域,line3和line11是Global全局作用域,line7是Local局部作用域

实验任务2

task2_1.py

程序源码:

 1 def func1(a, b, c, d, e, f):
 2     return [a,b,c,d,e,f]
 3     #返回参数a,b,c,d,e,f构成的列表默认,参数按位置传递; 也支持关键字传递
 4 
 5 def func2(a, b, c,*, d, e, f):
 6     return [a,b,c,d,e,f]
 7     #返回参数a,b,c,d,e,f构成的列表,*后面的参数只能按关键字传递
 8 
 9 def func3(a, b, c, /, d, e, f):
10     return [a,b,c,d,e,f]
11     # 返回参数a,b,c,d,e,f构成的列表,/前面的参数只能按位置传递
12 
13 # func1调用:按位置传递、按参数传递都可以
14 print( func1(1,9,2,0,5,3) )
15 print( func1(a=1, b=9, c=2, d=0, e=5, f=3) )
16 print( func1(1,9,2, f=3, d=0, e=5))
17 
18 # func2调用:d,e,f必须按关键字传递
19 print( func2(11, 99, 22, d=0, e=55, f=33) )
20 print( func2(a=11, b=99, c=22, d=0, e=55, f=33) )
21 
22 # func3调用:a,b,c必须按位置传递
23 print( func3(111, 999, 222, 0, 555, 333))
24 print( func3(111, 999, 222, d=0, e=555, f=333) )

运行测试截图:

 

task2_2.py

程序源码:

1 list1 = [1, 9, 8, 4]
2 print(sorted(list1) )
3 print(sorted(list1, reverse=True))
4 print(sorted(list1, True))

运行测试截图:

 

2.python内置函数sorted()中,参数reverse的传递方式是否必须使用关键字传递?
答:必须使用关键字传递

task2_3.py

程序源码:

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.py

程序源码:

 1 def solve(a, b, c):
 2     '''求解一元二次方程, 返回方程的两个根:para: a,b,c: float 方程系数:return: tuple'''
 3     delta = b*b - 4*a*c
 4     delta_sqrt = abs(delta)**0.5
 5     p1 = -b/2/a
 6     p2 = delta_sqrt/2/a
 7     if delta >= 0:
 8         root1 = p1 + p2
 9         root2 = p1 - p2
10     else:
11         root1 = complex(p1, p2)
12         root2 = complex(p1, -p2)
13     return root1, root2
14 
15 print(solve.__doc__)
16 while True:
17     try:
18         t = input('输入一元二次方程系数a b c, 或者,输入#结束: ')
19         if t == '#':
20             print('结束计算,退出')
21             break
22         a, b, c = map(float, t.split())
23         if a == 0:
24             raise ValueError('a = 0, 不是一元二次方程')
25     except ValueError as e:
26         print(repr(e))
27         print()
28     except:
29         print('有其它错误发生\n')
30     else:
31         root1, root2 = solve(a, b, c)
32         print(f'root1 = {root1:.2f}, root2 = {root2:.2f}')
33         print()

运行测试截图:

 

 

实验任务4

task4.py

程序源码:

 1 def list_generator(a,b,c=1):
 2     lst=[]
 3     while a<=b:
 4         lst.append(a)
 5         a+=c
 6     return lst
 7 
 8 
 9 
10 list1 = list_generator(-5, 5)
11 print(list1)
12 list2 = list_generator(-5, 5, 2)
13 print(list2)
14 list3 = list_generator(1, 5, 0.5)
15 print(list3)

 

运行测试截图:

 

 实验任务5:

task5.py

实验源码:

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

运行测试截图:

 

实验任务6

task6.py

程序源码:

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

运行测试截图:

 

实验任务7

task7.py

程序源码:

 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 
12 except:
13     print('Error:must be a positive integer')
14 else:
15     lst=[n]
16     while n!=1:
17         n=collatz(n)
18         lst.append(n)
19     print(lst)

运行测试截图:

 

实验任务8

task8.py

程序源码:

 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     n=int(x)
14     ans=func(n)
15     print(f'n={n},ans={ans}')

运行测试截图:

 

 实验结论:

 

posted @ 2023-05-23 12:02  Greeeeen  阅读(26)  评论(0)    收藏  举报