《Python语言程序设计基础》课后习题程序整理(第5~7章) – 小奥の部落格

《Python语言程序设计基础》课后习题程序整理(第5~7章)

程序大多数为自己编写,程序可能不是最优,复杂度不是最好,也有可能存在理解错题意的问题,敬请谅解。

习题内容为高等教育出版社出版的由嵩天教授等编写的《Python语言程序设计基础(第2版)》中的习题内容。

第五章 函数和代码复用

5.2 实现isOdd()函数,参数为整数,如果整数为奇数,返回True,否则返回False。

5.3 实现isNum()函数,参数为一个字符串,如果这个字符串属于整数、浮点数或复数的表示,则返回True,否则返回False。

def isNum(num):
    if num.isnumeric():
        return True
    #下面为判断是否为复数的一种方法
    elif len(num)==len(set(num)):
        return True
    else:
        return False
 
num = input("请输入字符串:")
isnum = isNum(num)
if isnum:
    print("你输入的字符串是数字!")
else:
    print("你输入的字符串不是数字!")

5.4 实现multi()函数,参数个数不限,返回所有参数的乘积。

def multi(nums):
    '''
    计算传入数字之积
    '''
    m=1
    for i in nums:
        m=m*i
    return m
 
item_num1 = input("请输入数字,以空格分隔,若输入完成请按回车:")
item_num = item_num1.split(' ')
ls =[]
for i in item_num:
    i = eval(i)
    ls.append(i)
ans = multi(ls)
print(ans)

5.5 实现isPrime()函数,参数为整数,要有异常处理。如果整数是质数,返回True,否则返回False。

集中实现以上5.2、5.5的代码:
def isOdd(num):
    '''
    判断num数字是否是奇数,若是返回True,否则返回False
    '''
    if num%2 ==1:
        return True
    else:
        return False
 
def isPrime(num):
    '''
    判断是否是质数,若是则返回True,否则返回False
    '''
    if num ==1:
        return False
    elif num ==2 or num ==3:
        return True
    else:
        for i in range(3,num):
            if(num%i == 0):
                return False
        return True
   
 
def switFunction(item,num):
    '''
    选择所需要的功能并输出结果
    '''
    if(item == 1):
        ans = isOdd(num)
        if ans:
            print("{}是奇数".format(num))
        else:
            print("{}不是奇数".format(num))
    if(item == 2):
        ans = isPrime(num)
        if ans:
            print("{}是质数".format(num))
        else:
            print("{}不是质数".format(num))
    if(item!=1 and item!=2):
        print("请选择正确的功能")
       
func_num = input("请选择你所需要的功能,1为判断奇数,2为判断质数:")
func_num = eval(func_num)
item_num = input("请输入你需要判断的数字:")
item_num = eval(item_num)
switFunction(func_num,item_num)

5.7 汉诺塔问题。采用递归方法解决汉诺塔问题,要求输入汉诺塔的层数,输出整个移动流程。

def move(n,a,b,c): 
    if n==1: 
        print(a,'-->',c) 
    else: 
        move(n-1,a,c,b)   #将前n-1个盘子从a移动到b上 
        move(1,a,b,c)     #将最底下的最后一个盘子从a移动到c上 
        move(n-1,b,a,c)   #将b上的n-1个盘子移动到c上 
move(3,'A','B','C')

第六章 组合数据类型

6.1 随机密码生成。编写程序,在26个字母大小写和9个数字组成的列表中随机生成10个8位密码。

#6.1 random password
from random import choice
def rand_pass(N):
    ls = []#create list
    #add alpha and number into list
    for i in range(97,123):
        ls.append(chr(i))
    for i in range(65,91):
        ls.append(chr(i))
    for i in range(48,58):
        ls.append(chr(i))
    #build one password
    return ''.join(choice(ls) for i in range(N))
#produce ten passwords
for i in range(10):
    ans_ls = rand_pass(8)
    print(ans_ls)

6.2 重复元素判定。编写一个函数,接受列表作为参数,如果一个元素在列表中出现了不止一次,则返回True,但不要改变原来列表的值。同时编写调用这个函数和测试结果的程序。

6.3 利用集合的无重复性改编程序练习题6.2的程序,获得一个更快更简洁的版本。

6.2/6.3代码如下:
def repDetermination_1(ls):
    '''
    Determinant of repeated elements.
    If a list has repeated elements, return True.
    If it does not has, return False
    This is the Method ONE.
    '''
    for i in range(len(ls)):
        for j in range(i+1,len(ls)):
            if ls[i] == ls[j]:
                return True
    return False
   
def repDetermination_2(ls):
    '''
    Determinant of repeated elements.
    If a list has repeated elements, return True.
    If it does not has, return False
    This is the Method TWO.
    '''
    len_or = len(ls)# original list
    ls_set = len(set(ls))#after being a set
    #if the original list has repeated elements, the length will be different
    if len_or == ls_set:
        return False
    else:
        return True
 
ls = input("请输入元素,以空格分隔。输入完毕,请按回车:\n")
ls = ls.split(" ")
ans_1 = repDetermination_1(ls)
ans_2 = repDetermination_2(ls)
print("方法一得到的结果是{};\n方法二得到的结果是:{}".format(ans_1,ans_2))

6.5 生日悖论分析。生日悖论指如果一个房间里有23人或以上,那么至少有两个人生日相同的概率大于50%。编写程序,输出在不同随机样本数量下,23个人中至少两个人生日相同的概率。

import random
 
def generate_birthday(stu_nums):
    '''
    Generate the birthday of 23 students.
    '''
    birth_date= []
    for i in range(stu_nums):
        birth_date.append(random.randint(1,365))
    return birth_date
 
def equal_birthday(birth_date):
    x = birth_date[:]
    x.sort()
    for i in range(len(x)-1):
        if x[i] == x[i+1]:
            return True
    return False
 
def birth_count(samples, stu_nums):
    count = 0
    m = []
    for i in range(samples):
        m = generate_birthday(stu_nums)
        if equal_birthday(m):
            count +=1
    return count
 
samples = input("请输入样本数:\n")
samples = eval(samples)
stu_nums = 0
while(stu_nums <23):
    stu_nums = input("请输入人数,不得小于23,默认为23:\n")
    stu_nums = eval(stu_nums)
count = birth_count(samples,stu_nums)
rate = count/samples*100
print("概率为{:.2f}%".format(rate))

第七章:文件和数据格式化

7.1 Python源文件改写。编写一个程序,读取一个Python源程序文件,将文件中所有除保留字外的小写字母换成大写字母,生成后的文件要能够被Python解释器正确执行。

import keyword
 
excludes = keyword.kwlist
exclud = ['print','format'] 
fname = input("请输入要打开的文件(包含后缀名):\n")
f = open(fname,'r').readlines()
print(f)
ls = []
for i in f:
    i = i.split(" ")
    ls.append(i)
 
print(ls)
#建立一个每行所有单词为一个元素的列表
new_name = input("请输入新建的文件的文件名(包含后缀名):\n")
fo = open(new_name,'w+')
for i in range(len(ls)):
    if f[i].isspace():
        fo.write(" ")
    for j in range(len(ls[i])):
        x = ls[i][j]
        if x in excludes:
            x = x.lower()
        else:
            x = x.upper()
        if x ==ls[i][len(ls[i])-1]:
            fo.write(x +"\n")
        else:
            fo.write(x+" ")
fo.close()
print("处理结束!")

程序仍然存在问题,例如range或者print因为和其它字符组成一个字符串,暂时想不到如何分割然后让其仍然小写。

7.2 图像文件压缩。使用PIL库对图片进行等比例压缩,无论压缩前文件大小如何,压缩后文件小于10KB。

from PIL import Image
def resizeImg(ori_name, des_name, dst_w, dst_h, save_q):
    im = Image.open(ori_name)
    ori_w,ori_h = im.size
    widthRatio = heightRatio = None
    ratio = 1
    if(ori_w and ori_w>dst_w) or (ori_h and ori_h >dst_h):
        if dst_w and ori_w>dst_w:
            widthRatio = float(dst_w/ori_w)
        if dst_h and ori_h>dst_h:
            heightRatio = float(dst_h/ori_h)
       
        if widthRatio and heightRatio:
            if heightRatio < widthRatio:
                ratio = heightRatio
            else:
                ratio = widthRatio
        if widthRatio and not heightRatio:
            ratio = widthRatio
        if heightRatio and not widthRatio:
            ratio = heightRatio
        newWidth = int(ori_w *ratio)
        newHeight = int(ori_h *ratio)
    else:
        newWidth = ori_w
        newHeight = ori_h
 
    im.resize((newWidth,newHeight),Image.ANTIALIAS).save(des_name, 
    quality=save_q)
   
ori_name = '1.jpg'
des_name = '1_modify.jpg'
dst_w = 300
dst_h = 300
save_q = 50
resizeImg(ori_name, des_name, dst_w, dst_h, 
save_q)

You May Also Like

About the Author: 小奥

不忘初心,奋力前行!

发表评论

电子邮件地址不会被公开。

This site uses Akismet to reduce spam. Learn how your comment data is processed.