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

一、实验结论:

 1.实验任务1:task1.py

程序源码:

 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)。 这4处使用的标识符sum是同一个对象的名称吗?如果不是,请以文字方式回答这4行中标识符sum的作用域。 

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

 

2.实验任务2:task2_2.py

程序源码:

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.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.实验任务3:task3.py

程序源码:

 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.实验任务4:task4.py

程序源码:

 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.实验任务5:task5.py

程序源码:

 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.实验任务6:task6.py

程序源码:

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

运行结果截图:

 

二、实验总结:

1. 复习python中函数定义、调用的语法规则,及,位置参数、关键字参数
2. 练习python中try...except...else, raise语句用法,及,异常处理机制
3. 复习标识符在命名空间作用域的判定准则:L-E-G-B (Local, Enclosing, Global, Built-in) 
4. 能识别适合用递归求解的问题,正确编写递归函数 
5. 能正确分析标识符的作用域,合理使用局部对象、全局对象 
 
posted @ 2023-05-20 15:33  myf-  阅读(36)  评论(0)    收藏  举报