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

1. 实验任务1

task1.py

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,内置作用域;line3,全域作用域;line7,局部作用域,line11;全域作用域

task2.py

task2_1.py

def func1(a, b, c, d, e, f):
    '''
    返回参数a,b,c,d,e,f构成的列表
    默认,参数按位置传递; 也支持关键字传递
    '''
    return [a,b,c,d,e,f]
def func2(a, b, c,*, d, e, f):
    '''
    返回参数a,b,c,d,e,f构成的列表
    *后面的参数只能按关键字传递
    '''
    return [a,b,c,d,e,f]
def func3(a, b, c, /, d, e, f):
    '''
    返回参数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) )

 

 (1:

在line33后,尝试增加一行函数调用,重新运行程序,查看解释器中出现的错误提示信息是什么。

 

 (2:

 

 task2_2.py

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

 

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

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

task2_3.py

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

 


def solve(a,b,c):
    '''
    求解一元二次方程,返回方程的两个根
    :param a,b,c: int 方程系数
    :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:
        a,b,c = eval(input('Enter eqution coefficient:'))
        if a == 0:
            raise
    except:
        print('invalid input,or,a is zero')
        break
    else:
        root1,root2 = solve(a,b,c)
        print(f'root1 = {root1:.2f},root2 = {root2:.2f}')
        print()

 

 

 4. 实验任务4

def list_generator(a,b,c = 1):
    y = []
    while a<=b:
        y.append(a)
        a+=c
    return y

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

def is_prime(n):
    x = 2
    m = True
    if n == 2:
        return True
    while n > x:
        if n%x == 0 and m == True:
            m = False
        else:
            x+=1
    return m

for number in range(2,21,2):
    for x in range(2,int(number/2)+1):
        y = number-x
        if is_prime(x) == True and is_prime(y) == True:
            print('{}={}+{}'.format(number,x,y))
            break

 

 6. 实验任务6

def encoder(s):
    ls = []
    for i in s:
        x = ord(i)
        if (x>=97 and x<=117) or (x>=65 and x<=85):
            ls.append(chr(x+5))
        if (x>=86 and x<=90) or (x>=118 and x<=122):
            ls.append(chr(x-21))
        if  x<65 or x>122:
            ls.append(chr(x))
    return ''.join(ls)
def decoder(s):
    ls = []
    for i in s:
        x = ord(i)
        if (x >= 102 and x <= 122) or (x >= 70 and x <= 90):
            ls.append(chr(x - 5))
        if (x >= 65 and x <= 69) or (x >= 97 and x <= 101):
            ls.append(chr(x+21))
        if x < 65 or x > 122:
            ls.append(chr(x))
    return ''.join(ls)
x = input('输入英文文本: ')
s = encoder(x)
print(f'编码后的文本:{s}')
print(f'对编码后的文本解码:{decoder(s)}')

 

 7. 实验任务7

 

 

def collatz(n):
    if n%2 == 0:
        return n/2
    elif n%2!=0:
        return n*3+1
while True:
    l = []
    try:
        x = eval(input('enter a positive integer:'))
        if type(x) is not int or x <= 0:
            raise NameError
    except NameError:
        print('Error:must be a positive integer')
    else:
        while x>1:
            l.append(x)
            x = collatz(x)
        l.append(x)
        print(l)

 

posted @ 2022-05-09 22:43  何处寻清欢  阅读(29)  评论(1编辑  收藏  举报