python基础练习题(进阶)03

版权声明:未经原作者允许不得转载本文内容,否则将视为侵权 https://blog.csdn.net/springhammer/article/details/88550448

3.1 编写函数test(password, earning, age)用于检测输入错误。要求输入密码password第一个符号不能是数字,工资earnings的范围是0—20000,工作年龄的范围是18—70。若三项检查都通过则返回True。

代码:

input
def test(password, earning, age):
    assert password[0] not in ['0','1','2','3','4','5','6','7','8','9']
    assert int(earning)>=0 and int(earning)<=20000
    assert int(age)>=18 and int(age)<=70
    return True
print("password:")
password = input()
print("earning:")
earning = input()
print("age:")
age = input()
print(test(password, earning, age))

结果:
在这里插入图片描述

3.2 输入某年某月某日,判断这一天是这一年的第几天。

代码:

dat = input('请输入某年某月某日,格式为 yyyy-mm-dd :')
y = int(dat[0:4])  #获取年份
m = int(dat[5:7])  #获取月份
d = int(dat[8:])  #获取日
ly = False
if y%100 == 0:  #若年份能被100整除
    if y%400 == 0:  #且能被400整除
        ly = True  #则是闰年
    else:
        ly = False
elif y%4 == 0:  #其它情况下,若能被4整除
    ly = True  #则为闰年
else:
    ly = False
if ly == True:  #若为闰年,则2月份有29天
    ms = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
else:
    ms = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

days = 0
for i in range(1, 13):  #从112逐一判断,以确定月份
    if i == m:
        for j in range(i-1):  #确定月份i之后,则将ms列表中的前i-1项相加
            days += ms[j]
        print('%s是该年份的第%s天。' % (dat, (days + d))) #最后再加上“日”,即是答案

结果:
在这里插入图片描述

3.3 创建文本文件

创建文本文件FarewellCambridge.txt。内容包含以下语句:
Very quietly I take my leave
As quietly as I came here
Quietly I wave good-bye
To the rosy clouds in the western sky
The golden willows by the riverside
Are young brides in the setting sun
Their reflections on the shimmering waves
统计单词总数目以及各个单词出现的次数(注意:直接将上述语句拷贝到程序中,不需要自己录入)。

代码:

import re
file1 = open("FarewellCambridge.txt","w+")
file1.write('''Very quietly I take my leave
As quietly as I came here
Quietly I wave good-bye
To the rosy clouds in the western sky
The golden willows by the riverside
Are young brides in the setting sun
Their reflections on the shimmering waves''')
file1.seek(0)

f=open("FarewellCambridge.txt")
data = f.read()
word_reg = re.compile(r'\w+')
word_list = word_reg.findall(data)
word_list = [word.lower() for word in word_list] #转小写
print("单词总数:",len(word_list))
word_set = set(word_list) #避免重复查询
words_dict = {word: word_list.count(word) for word in word_set}
print("各个单词对应的数为:")
for k,v in words_dict.items():
    print(k,v)
f.close()

结果:
在这里插入图片描述

3.4 读取文本文件

对于上一题建立的文本文件,使用read()读文件,将其中所有小写字母变成大写字母,大写字母变成小写字母,并在屏幕上显示。

代码:

file = open('FarewellCambridge.txt','r')
a=file.read()

b = []
for n in a :
   if "a"<= n <= "z":
      b.append(n.upper())
   elif"A" <= n <= "Z" :
      b.append(n.lower())
   else:
      b.append(n)
print("".join(b))

结果:
在这里插入图片描述

3.5 处理异常情况

编写函数devide(x, y),x为被除数,y为除数,x,y均要求为整数。另外要求:
1、被零除时,调用异常处理输出"division by zero! ";
2、判断x,y不是整数时,强制转换为整数再调用本函数,如果x,y是整数则不用转换;
3、若没有异常则输出计算结果。

代码:

class DTError(Exception):  #自定义异常,没有这个类定义 ,下面的DTError就会报错
   pass
def devide(x,y):
    try: 
        ans=x/y
        if(type(x)!=type(y)):  #如果两个数类型不同,raise语句抛出(自定义)异常
            raise DTError

    except ZeroDivisionError:   #抛出除数为0的异常
        return  'division by zero!'

    except DTError:   #类型不同的异常
        print ('这两个数类型不同')  #先提示类型不同
        x=int(x)  #将x,y强制转换成int,再次调用函数
        y=int(y)
        devide(x,y)
        return ans

    else:
        return ans

结果:
在这里插入图片描述

3.6 随机生成密码

利用26个英文字母和10个数字组成的列表随机生成10个8位密码,并存储在文件passwords.txt中。
代码:

import string, random
src_upp = string.ascii_uppercase
src_let = string.ascii_lowercase
src_num = string.digits
lis = []
count = input('请输入次数:').strip()


# for 循环实现(产生密码数可能不足)
for i in range(int(count)):
    print(i)
    # 先随机定义3种类型各自的个数(总数为8)
    upp_c = random.randint(1, 6)
    low_c = random.randint(1, 8-upp_c - 1)
    num_c = 8 - (upp_c + low_c)
    # 随机生成密码
    password = random.sample(src_upp, upp_c)+random.sample(src_let, 				low_c)+random.sample(src_num, num_c)
    # 打乱列表元素
    random.shuffle(password)
    # 列表转换为字符串
    new_password = ''.join(password)+'\n'
    if new_password not in lis:
        lis.append(new_password)
with open('password.txt', 'w') as fw:
    fw.seek(0)
    fw.writelines(lis)
fw.close()

结果:
在这里插入图片描述

3.7 读取程序并转换

读取一个python源程序文件(*.py格式),将文件中所有除了保留字以外的小写字母变成大写字母,生成的新文件仍然能被python环境执行。
代码:

# -*- coding :utf-8 -*-
import keyword
f= open('test.py','r', encoding='UTF-8')
content  = f.read()
f.close()

table = ['range','print','list','set','keyword','kwlist','end']
fs = ''     #用于存储改变后的内容
temp = ''   #临时字符串,用于判断和处理
for ch in content:
    if ch.isalpha():    #如果是字母,则加到temp后面,用于后面处理
        temp +=ch
    else:               #如果不是字母,表示一个连续的字母构成的字符串结束,此时ch非字母
        if (not keyword.iskeyword(temp)) and (temp not in table):   #如果不是保留字和内置方法,将其变成大写
            temp = temp.upper()
        fs+=temp    #将temp添加到fs
        fs+=ch      #添加 非字母ch 注意不能和 fs+=temp 位置颠倒
        temp = ''   #清空临时字符串,用于下次使用

f = open('test','w')
f.write(fs)
f.close()

测试代码:

import random  # 随机数产生10个整数(0-100),放入一个列表中,统计出现次数最多的数字.

number = []              # 1.存放随机数列表

for i in range(0, 10):    # 2.循环10次

    num = random.randint(0,100)       # 3.生成0-100之间的随机整数

    number.append(num)                   # 4.添加到列表中
print(number)

转换后代码:

import random  # 随机数产生10个整数(0-100),放入一个列表中,统计出现次数最多的数字.

NUMBER = []              # 1.存放随机数列表

for I in range(0, 10):    # 2.循环10NUM = RANDOM.RANDINT(0,100)       # 3.生成0-100之间的随机整数

    NUMBER.APPEND(NUM)                   # 4.添加到列表中
print(NUMBER)

3.8 字符和数字分析

读取文本文件中的字符和数字,统计各个字符和数字出现频率,按照字符和数字出现频率分别降序打印字母和数字。
代码:

f=open("data.txt","r")
zifuji=[]
x=f.read()
#读取文件的每一行保存在列表中
for i in x:
    zifuji.append(i)
#将列表转换从集合
zifu=set(zifuji)
#用c1保存字母字符以及对应个数,c2保存数字字符及其对应个数
c1=[]
c2=[]
for i in zifu:
    if ord('a')<=ord(i)<=ord('z') or ord('A')<=ord(i)<=ord('Z') :
        c1.append([i,zifuji.count(i)])
    if ord('0')<=ord(i)<=ord('9'):
        c2.append([i,zifuji.count(i)])
#更新列表,将两个列表的内容按照字符对应个数的大小从大到小排序
for i in range(len(c1)-1):
    for j in range(i+1,len(c1)):
        if c1[i][1]<c1[j][1]:
            c1[i],c1[j]=c1[j],c1[i]
for i in range(len(c2)-1):
    for j in range(i+1,len(c2)):
        if c2[i][1]<c2[j][1]:
            c2[i],c2[j]=c2[j],c2[i]
#打印两个列表的内容
print("字符和数字出现的情况如下:")
for i in c1:
    print(i)
for i in c2:
    print(i)

结果
在这里插入图片描述

	我想能看到这里的同学,无外乎两种人:来拷贝代码的人 和 来拷贝代码的人。

但,在拷贝走的时候,你要想清楚一件事,把代码拷走之后有个蛋用,搞明白对你来说才是最重要的。

好了,就酱紫。

 

老铁,这要是都不赞,说不过去吧!!!


最后对自己说:
你现在所遭遇的每一个不幸,都来自一个不肯努力的曾经。

猜你喜欢

转载自blog.csdn.net/springhammer/article/details/88550448