实验四 函数与异常编程处理
实验任务1
task1-1
实验源码
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是Built-in内置作用域,line3和line11是Global全局作用域,line7是Local局部作用域。
实验任务2
task2-1
实验源码
def func1(a, b, c, d, e, f):
return [a,b,c,d,e,f]
def func2(a, b, c,*, d, e, f):
return [a,b,c,d,e,f]
def func3(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) )
实验截图

问题:python内置函数sorted()中,参数reverse的传递方式是否必须使用关键字传递?
回答:是的。
task2-2
实验源码
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
task3-1
实验源码
def solve(a, b, c):
'''
求解一元二次方程, 返回方程的两个根:para: a,b,c: float 方程系数: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:
t = input('输入一元二次方程系数a b c, 或者,输入#结束: ')
if t == '#':
print('结束计算,退出')
break
a, b, c = map(float, t.split())
if a == 0:
raise ValueError('a = 0, 不是一元二次方程')
except ValueError as e:
print(repr(e))
print()
except:
print('有其它错误发生\n')
else:
root1, root2 = solve(a, b, c)
print(f'root1 = {root1:.2f}, root2 = {root2:.2f}')
print()
实验截图

实验任务4
task4-1
实验源码
def list_generator(x,y,z=1):
list=[]
while x<=y:
list.append(x)
x=x+z
return list
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
task5-1
实验源码
def is_prime(n):
if n==2:
return True
else:
for i in range(2,int((n**0.5)+1)):
if n%i==0:
return False
return True
for i in range(4,21,2):
for x in range(2,i):
if is_prime(i-x):
print(f'{i}={x}+{i-x}')
break
实验截图

实验任务6
task6-1
实验源码
def encoder(text):
text=list(text)
i=0
while i< len(text):
if text[i].isalpha():
if text[i].islower():
if ord(text[i])<=117:
text[i]=chr(ord(text[i])+5)
else:
text[i]=chr(ord(text[i])+5-26)
if text[i].isupper():
if ord(text[i])<=85:
text[i] = chr(ord(text[i]) + 5)
else:
text[i] = chr(ord(text[i]) + 5 - 26)
i+=1
return ''.join(text)
def decoder(text):
text = list(text)
i = 0
while i < len(text):
if text[i].isalpha():
if text[i].islower():
if ord(text[i]) >= 102:
text[i] = chr(ord(text[i]) - 5)
else:
text[i] = chr(ord(text[i]) - 5 + 26)
if text[i].isupper():
if ord(text[i]) >= 46:
text[i] = chr(ord(text[i]) - 5)
else:
text[i] = chr(ord(text[i]) - 5 + 26)
i += 1
return ''.join(text)
for i in range(3):
title='Remote Interpreter Reinitialized'
print(title.center(60,'*'))
text=input('输入英文文本:')
encoded_text=encoder(text)
print('编码后的文本:',encoded_text)
decoded_text=decoder(encoded_text)
print('对编码后的文本解码:',decoded_text)
实验截图

实验任务7
task7-1
实验源码
def collatz(n):
lst = [n]
while lst[-1] != 1:
if lst[-1] % 2 == 0:
lst.append(lst[-1]//2)
else:
lst.append(lst[-1]*3+1)
return lst
try:
n = int(input('Enter a positive integer:'))
if n <= 0:
raise
except:
print('Error: must be a positive integer')
else:
print(collatz(n))
实验截图

实验任务8
task8-1
实验源码
def func(n):
if n ==1:
return 1
else:
return 1+2*func(n-1)
while True:
x = input()
if x == '#':
print('计算结束')
break
n = int(x)
ans = func(n)
print(f'n = {n}, ans = {ans}')
实验截图


浙公网安备 33010602011771号