python 练习100题及答案解析

news/2024/11/9 10:01:33/

python 练习100题及答案解析

  • 001 变量更新
    • 答案解析
  • 002 变量命名规则
    • 答案解析
  • 003 比较和赋值
    • 答案解析
  • 004 类型错误
    • 答案解析
  • 005 缩进错误
    • 答案解析
  • 006 不正确的结束
    • 答案解析
  • 007 关键字错误
    • 答案解析
  • 008 名字未定义NameError
    • 答案解析
  • 009 序列索引
    • 答案解析
  • 010 序列切片
    • 答案解析
  • 011 序列前位置切片
    • 答案解析
  • 012 负数索引
    • 答案解析
  • 013 负数切片
    • 答案解析
  • 014 序列索引步长
    • 答案解析
  • 015 Range函数
    • 答案解析
  • 016 Range和推导式
    • 答案解析
  • 017 Range字符串
    • 答案解析
  • 018 移除重复元素
    • 答案解析
  • 019 列表的排序
    • 答案解析
  • 020 简单字典
    • 答案解析
  • 021 访问字典元素
    • 答案解析
  • 022 字典元素加和
    • 答案解析
  • 023 字典KeyError
    • 答案解析
  • 024 添加字典key
    • 答案解析
  • 025 对字典使用函数
    • 答案解析
  • 026 字典过滤
    • 答案解析
  • 027 格式化输出
    • 答案解析
  • 028 多层索引访问
    • 答案解析
  • 029 遍历字典
    • 答案解析
  • 030 打印字母a到z
    • 答案解析
  • 031 打印数字1到10
    • 答案解析
  • 032 计算1到100数字的和
    • 答案解析
  • 033 计算1到100偶数数字和
    • 答案解析
  • 034 输出元素和下标
    • 答案解析
  • 035 同时遍历多个序列
    • 答案解析
  • 036 编写加速度函数
    • 答案解析
  • 037 函数TypeError
    • 答案解析
  • 038 方法不存在
    • 答案解析
  • 039 函数参数数目错误
    • 答案解析
  • 040 函数调用方式
    • 答案解析
  • 041 函数计算球的体积
    • 答案解析
  • 042 函数默认值参数
    • 答案解析
  • 043 全局变量
    • 答案解析
  • 044 函数局部变量
    • 答案解析
  • 045 局部变量和全局变量
    • 答案解析
  • 046 字符串与数字计算
    • 答案解析
  • 047 字符串格式化
    • 答案解析
  • 048 字符串拆分
    • 答案解析
  • 049 文件中的英文单词计数
    • 答案解析
  • 050 多分隔符单词计数
    • 答案解析
  • 051 生成字母文件
    • 答案解析
  • 052 成对字母文件
    • 答案解析
  • 053 成对三字母文件
    • 答案解析
  • 054 每个字母一个文件
    • 答案解析
  • 055 扫描字母文件列表
    • 答案解析
  • 056 满足条件的字母文件
    • 答案解析
  • 057 多级字典
    • 答案解析
  • 058 修改多级字典
    • 答案解析
  • 059 多级字典加值
    • 答案解析
  • 060 字典变JSON
    • 答案解析
  • 061 JSON变字典
    • 答案解析
  • 062 JSON添加数据
    • 答案解析
  • 063 无限循环打印
    • 答案解析
  • 064 定时打印
    • 答案解析
  • 065 渐进式定时打印
    • 答案解析
  • 066 有结束条件的循环
    • 答案解析
  • 067 空语句
    • 答案解析
  • 068 忽略循环下一句
    • 答案解析
  • 069 英汉翻译
    • 答案解析
  • 070 英汉翻译异常处理
    • 答案解析
  • 071 英汉翻译文件词典
    • 答案解析
  • 072 当前日期时间
    • 答案解析
  • 073 输入年龄计算生日
    • 答案解析
  • 074 计算活了多少天
    • 答案解析
  • 075 计算今天明天昨天的日期
    • 答案解析
  • 076 输出间隔内的所有日期
    • 答案解析
  • 077 用户名检测器
    • 答案解析
  • 078 随机密码生成器
    • 答案解析
  • 079 密码强度检测器
    • 答案解析
  • 080 详细错误密码检测器
    • 答案解析
  • 081 文件内容乘数字
    • 答案解析
  • 082 计算最大值最小值平均值
    • 答案解析
  • 083 文件合并
    • 答案解析
  • 084 文件交集
    • 答案解析
  • 085 每种爱好的喜欢人数
    • 答案解析
  • 086 实现文件的关联
    • 答案解析
  • 087 判断日期格式
    • 答案解析
  • 088 提取电话号码
    • 答案解析
  • 089 提取邮箱地址
    • 答案解析
  • 090 多个禁用词替换
    • 答案解析
  • 091 给手机号打上马赛克
    • 答案解析
  • 092 扫描目录下所有文件
    • 答案解析
  • 093 扫描py文件的行数
    • 答案解析
  • 094 自动整理文件夹
    • 答案解析
  • 095 自动压缩文件夹
    • 答案解析
  • 096 Requests模块报错
    • 答案解析
  • 097 来自URL的文件
    • 答案解析
  • 098 下载URL的图片
    • 答案解析
  • 099 给网页提交数据
    • 答案解析
  • 100 打开百度搜索
    • 答案解析

习题资源来自:https://www.w3cschool.cn/minicourse/play/antpython02

001 变量更新

#如下代码输出什么内容?
a = 2
a = 4
a = 6
print(a + a + a)

答案解析

答案:18

解释:

python读取和执行代码是从上往下的

变量a被更新了3次最后的值是6,所以a+a+a会是18

002 变量命名规则

# 如下代码会报什么错误?
a = 1
_a = 2
_a2 = 3
2a = 4

答案解析

答案:第4行会报错,因为变量的名字,不能以数字开头

解释:变量名字可以用字母或者下划线开头,不能是其他

003 比较和赋值

# 如下代码会报什么错误?
a = 1
b = 2
print(a == b)
print(b == c)

答案解析

答案:会报错说,变量c没有被定义

解释:变量需要先被声明定义,才能被使用

004 类型错误

#修改如下代码,让它的输出是数字1+2结果为3。要求:不要修改前两行,只修改第3行
a = "1"
b = 2
print(a + b)

答案解析

a = "1"
b = 2
print(int(a) + b)

解释:

  • python的变量有不同的类型
  • 这个练习中,a是字符串类型、b是数字类型
  • 数字和字符串,是不能直接相加的
  • 使用python自带的int()函数,可以将字符串转换成数字

005 缩进错误

# 如下代码想要判断字符串中的字母是不是等于e,等于的话输出这个字母
# 但是报错了,为什么?怎么修复?
for letter in "Hello":if letter == "e":print(letter)

答案解析

for letter in "Hello":if letter == "e":print(letter)
e

解释:

  • if判断语句下的控制体,需要增加一个缩进,下方控制的代码可以有多行
  • 注意,缩进是2个空格、4个空格、TAB键都可以,但是单个文件必须前后一致
  • 代码有的是4个空格(小文件),有的是2个空格(大文件代码太多PPT放不下),只要是单个文件内一致,就能运行不影响

006 不正确的结束

print(type("Hey".replace("ey","i")[-1])

答案解析

print(type("Hey".replace("ey","i")[-1]))
<class 'str'>

解释:

  • 代码会报错:SyntaxError: unexpected EOF while parsing,意思是Python发现了不正确的文件内容结尾
  • 本代码中,缺少了最后面的括号,因为括号不匹配,报非正常结束EOF错误

007 关键字错误

pass = input("Please enter your password: ")
print(pass)

答案解析

pass1 = input("Please enter your password: ")
print(pass1)
Please enter your password: ts123654
ts123654

解释:

  • 代码会报语法错误SyntaxError: invalid syntax
  • 因为pass是Python自己保留的关键字
  • pass不能作为普通的变量名,修改变量的名字例如pass1或者其他名字即可修复

008 名字未定义NameError

print(math.sqrt(9))

答案解析

import math
print(math.sqrt(9))

解释

  • math是python内置模块,但是默认是不会自动引入的
    math这个模块如果想要引入,使用import math,然后就可以用它的方法了

009 序列索引

# 完成如下代码,输出序列的第二个元素"b"
letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]

答案解析

letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
print(letters[1])
b

解释:

  • 列表中每个元素的下标,都是从0开始,每次加1往后加的
  • 使用元素的下标,可以访问对应位置的元素

H E L L O

0 1 2 3 4

010 序列切片

# 完成如下代码,输出子序列,包含元素d、e、f
letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]

答案解析

letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
print(letters[3:6])
['d', 'e', 'f']

解释:

  • d的下标是3、e的下标是4、f的下标是5
  • 因为切片的第二个元素是不包含的,所以得写成[3:6]

011 序列前位置切片

# 完成如下代码,输出前三个元素的子序列,包含元素a、b、c
letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]

答案解析

letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
print(letters[:3])
['a', 'b', 'c']

解释:

  • [:3]是[0:3]的简写形式,两个办法都能达到目标

012 负数索引

# 完成如下代码,使用负数索引,输出字母i
letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]

答案解析

letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
print(letters[-2])
i

解释:

  • 负数索引从最后一个元素往前数,最后一个元素是-1,往前每次减去1

H E L L O

0 1 2 3 4

-5-4-3-2-1

013 负数切片

# 完成如下代码,获得一个切片,得到最后的3个元素[h, i, j]
letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]

答案解析

letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
print(letters[-3:])
['h', 'i', 'j']

解释:

  • [-3:]意思是从-3这个位置的下标的元素,到列表的末尾
  • 对于这个场景,只能写[-3:],冒号后面的数字不用写也没法写,这样就包含了列表后面的所有元素

014 序列索引步长

# 完成如下代码,获得一个切片,包含元素['a', 'c', 'e', 'g', 'i']
letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]

答案解析

letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
print(letters[::2])
['a', 'c', 'e', 'g', 'i']

解释:

  • 序列切片的完整语法,是[start:end:step]
  • 如果不传step参数,默认是1
  • [:]意思是整个列表,从开始到结尾
  • [::2]意思是,从开始(包含)到结尾,但是步长2

015 Range函数

# 编写代码,生成如下数字List,注意要用函数生成,别手动生成
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

答案解析

my_range = range(1, 21)
print(list(my_range))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

解释:

  • range()函数是一个python内置函数,可以生成数字序列
  • range()函数生成的是一个range对象,不是python的list
  • 如果想得到python的list,得用list()函数转换range对象到list对象

016 Range和推导式

# 完成如下代码
my_range = range(1, 21)
# 你的代码需要使用my_range变量最终产生如下输出:
# [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200]

答案解析

my_range = range(1, 21)
print([x * 10 for x in my_range])
[10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200]

解释:

  • 列表推导式用于快速生成一个列表
  • 形如:[x*2 for x in list if x>3]

017 Range字符串

# 完成如下代码
my_range = range(1, 21)# 你的代码需要使用my_range变量最终产生如下输出:
# ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20'] 

答案解析

my_range = range(1, 21)
print([str(x) for x in my_range])
['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20']

解释:

  • str函数可以将其他的变量类型,转换成字符串类型

018 移除重复元素

# 完成代码,移除列表中的重复值,最终产生如下输出:a = ["1", 1,  2]
a = ["1", 1, "1", 2]

答案解析

# 答案1:
a = ["1", 1, "1", 2]
a = list(set(a))
print(a)
['1', 1, 2]

解释:

  • set函数可以把list变成set,达到去重的效果
  • 对于set,可以用list函数重新变回列表
  • 这个办法有点问题,可能会改变元素的顺序,因为set里面的元素是不固定的
  • 例如结果可能是:[‘1’, 2, 1],数字2跑到1的前面了
# 答案2:
a = ["1", 1, "1", 2]
b = []
for i in a:if i not in b:b.append(i)
print(b)
['1', 1, 2]

解释:

  • 这个办法可以保持元素的顺序,一定会输出[‘1’, 1, 2],而不会出现[‘1’, 2, 1]
  • 问题在于,这个办法效率不高,对每个a的元素,都要挨个判断是不是在b列表,如果列表很大的时候,花费时间较长

019 列表的排序

# 完成代码,对列表排序,得到排序后的结果
lista = [20, 40, 30, 50, 10]
# 最终产生如下输出:lista is [50, 40, 30, 20, 10]

答案解析

lista = [20, 40, 30, 50, 10]
lista.sort(reverse=True)
print("lista is", lista)
lista is [50, 40, 30, 20, 10]

解释:

  • list.sort可以实现排序
  • 默认是升序排列,如果想要降序,加一个参数reverse=True

020 简单字典

# 编写代码,创建一个字典:字典的Key是字母a和b, 字典的value分别是1和2

答案解析

# 答案1:这是简单的大括号的语法d = {"a": 1, "b": 2}
print(d)
{'a': 1, 'b': 2}
# 答案2: dict是一个函数,可以用key=value的方式进行,这时候key为a和b不用写成字符串形式d = dict(a = 1, b = 2)
print(d)
{'a': 1, 'b': 2}

021 访问字典元素

# 完成如下代码,最终输出数值2
d = {"a": 1, "b": 2}

答案解析

d = {"a": 1, "b": 2}
print(d["b"])
2

解释:

  • 字典使用key来访问对应的value

022 字典元素加和

# 完成如下代码,计算key为a和b的值value的加和,最终输出数值3
d = {"a": 1, "b": 2, "c": 3}

答案解析

d = {"a": 1, "b": 2, "c": 3}
print(d["b"] + d["a"])
3

解释:

  • 字典的key可以多次访问
  • 如果想加和所有的字典元素值,继续后面的练习题

023 字典KeyError

# 如下会报什么错误?为什么会报这个错误?
# 如果想得到"男"该怎么修正呢?
d = {"姓名": "小明", "性别": "男"}
print(d["男"])
---------------------------------------------------------------------------KeyError                                  Traceback (most recent call last)<ipython-input-30-71716603513b> in <module>()2 # 如果想得到"男"该怎么修正呢?3 d = {"姓名": "小明", "性别": "男"}
----> 4 print(d["男"])KeyError: '男'

答案解析

d["性别"]
'男'

会有如下报错信息:KeyError: ‘男’

答案:

  • 字典中没有key==‘男’,'男’是一个字典的值
  • 如果想访问’男’,可以用d[“性别”]

解释:

  • 如果一个key在字典中不存在,却访问了它,就会报错说KeyError

024 添加字典key

# 给如下代码新增一对key:value,key是c,value是3最终输出为:{'a': 1, 'c': 3, 'b': 2}
d = {"a": 1, "b": 2}

答案解析

d = {"a": 1, "b": 2}
d["c"] = 3
print(d)
{'a': 1, 'b': 2, 'c': 3}

解释:

  • 字典最直观的添加Key的方式,就是dict[key]=value

025 对字典使用函数

# 计算如下字典的所有value的数字的和,最终输出结果6
d = {"a": 1, "b": 2, "c": 3}

答案解析

d = {"a": 1, "b": 2, "c": 3}
print(sum(d.values()))
6

解释:

  • d.values()返回一个类似list的dict_values对象
  • sum()函数可以直接对dict_values对象求和

026 字典过滤

# 移除如下字典中所有value大于1的key:value对,过滤后,输出{'a': 1} 
d = {"a": 1, "b": 2, "c": 3}

答案解析

d = {"a": 1, "b": 2, "c": 3}
d = {key: value for key, value in d.items() if value <= 1}
print(d)
{'a': 1}

解释:

  • 字典推导式的形式,形如 {key:value for 循环 if 条件} 的形式
  • d.items()会返回每个key:value对

027 格式化输出

'''
创建一个字典:key是a、b、c,value分别是列表1~10、列表11~20、列表21~30
格式化输出字典,最终产生如下整齐的输出:
{'a': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],'b': [11, 12, 13, 14, 15, 16, 17, 18, 19, 20],'c': [21, 22, 23, 24, 25, 26, 27, 28, 29, 30]}
'''

答案解析

from pprint import pprint
d = {"a": list(range(1, 11)),"b": list(range(11, 21)),"c": list(range(21, 31))}
pprint(d)
{'a': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],'b': [11, 12, 13, 14, 15, 16, 17, 18, 19, 20],'c': [21, 22, 23, 24, 25, 26, 27, 28, 29, 30]}

解释:

  • list(range)的组合,可以把一串数字变成list
  • pprint打印数据,会产生比较整齐的输出

028 多层索引访问

# 对于如下字典dict,怎样访问key=b的列表的第3个元素,输出数字13d = {"a": list(range(1, 11)), "b": list(range(11, 21)),  "c": list(range(21, 31))}

答案解析

d = {"a": list(range(1, 11)),"b": list(range(11, 21)),"c": list(range(21, 31))}
print(d["b"][2])
13

解释:

  • 先访问d[“b”],是一个列表,11~21
  • 对这个列表,用下标[2]得到第3个元素,即13

029 遍历字典

"""
遍历如下字典dict,得到以下三行输出:
a has value [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b has value [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
c has value [21, 22, 23, 24, 25, 26, 27, 28, 29, 30]
"""
d = {"a": list(range(1, 11)), "b": list(range(11, 21)),  "c": list(range(21, 31))}

答案解析

d = {"a": list(range(1, 11)),"b": list(range(11, 21)),"c": list(range(21, 31))}
for key, value in d.items():print(key, "has value", value)
a has value [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b has value [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
c has value [21, 22, 23, 24, 25, 26, 27, 28, 29, 30]

解释:

  • d.items()可以遍历字典的每一对key和value

030 打印字母a到z

# 打印字母a到z,每行一个字母

答案解析

import string
for letter in string.ascii_lowercase:print(letter)

解释:

  • string.ascii_lowercase,不要加括号,是一个字符串,包含a~z
  • 使用for循环,可以遍历这个字符串,得到每个字母

031 打印数字1到10

# 编写代码,打印从1到10,每个数字一行

答案解析

for i in range(1, 11):print(i)

解释:

  • for循环会重复操作,直到后面的序列被消耗完毕
  • range函数[begin, end),包括第一个数字,不包含第二个数字,所以需要是11

032 计算1到100数字的和

# 编写代码,计算从1到100的和,包含1和100,即:1+2+3+4+.....+99+100

答案解析

sum_value = 0
for i in range(1, 100 + 1):sum_value += i
print(sum_value)
5050

解释:

  • 因为要包含100,所以range的第二个参数可以加1
  • 用sum_value变量,循环加和即可得到结果

033 计算1到100偶数数字和

"""
编写代码,计算从1到100中偶数的数字和
即:2+4+6+8+.....+98+100
输出结果:2550"""

答案解析

sum_value = 0
for i in range(1, 100 + 1):if i % 2 == 1:continuesum_value += i
print(sum_value)
2550

解释:

  • 配合for和range函数
  • number % 2 == 0 说明是偶数,%在这里是取余数的意思
  • 如果是i是奇数,那么%2==1,则会跳过这数字

034 输出元素和下标

"""根据a产生如下输出:
Item 1 has index 0
Item 2 has index 1
Item 3 has index 2
"""
a = [1, 2, 3]

答案解析

a = [1, 2, 3]
for index, item in enumerate(a):print(f"Item {item} has index {index}")
Item 1 has index 0
Item 2 has index 1
Item 3 has index 2

解释:

  • enumerate(a)函数产出数组的(下标index,数值item)数据对
  • 用for index, item in enumerate(a)可以依次取出index和item
  • 在字符串前面加个f符号,里面可以用{item}、{index}的方式访问变量,这叫f-string语法

035 同时遍历多个序列

"""
编写代码根据a,b经过处理产出如下内容,其中5=1+4、7=2+5、9=3+6:
5
7
9
"""a = [1, 2, 3]
b = (4, 5, 6)

答案解析

a = [1, 2, 3]
b = (4, 5, 6)
for i, j in zip(a, b):print(i + j)
5
7
9

提示:

  • 不同的序列(列表、元组都叫序列),可以用zip打包在一起
  • zip的返回是一各个的元组,里面包含各个序列的对应元素

036 编写加速度函数

'''
创建函数,计算加速度,初始和结束的速度为v1和v2,初始和结束的时间为t1和t2
a=(v2-v1)/(t2-t1),
然后,将参数(v1, v2, t1, t2)分别取值为(0, 10, 0, 20),调用函数,得到结果为:0.5
'''

答案解析

def acceleration(v1, v2, t1, t2):a = (v2 - v1) / (t2 - t1)return a
print(acceleration(0, 10, 0, 20))
0.5

解释:

  • 定义函数的形式,为 def 函数名字(参数列表),在函数体内可以return结果
  • 调用函数的形式,为 函数名(实际参数值列表),得到函数return的返回值

037 函数TypeError

# 如下代码会报错,为什么?怎么修复错误?
def foo(a, b):print(a + b)x = foo(2, 3) * 10

答案解析

答案:

  • 代码的第4行会报错,因为Python不能完成None和数字的相乘
  • 这个函数做了print,但是没有return,没有return结果的函数,默认返回None

解决办法:
把print改成return,可以让函数返回一个具体的值

def foo(a, b):return a + bx = foo(2, 3) * 10
print(x)
50

038 方法不存在

# 如下代码为了输出数字的cosine值,但是报错了说方法cosine不存在,该怎么修正?
import math
print(math.cosine(1))

答案解析

import math
print(dir(math))
print(help(math.cos))
print(math.cos(1))
['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']
Help on built-in function cos in module math:cos(...)cos(x)Return the cosine of x (measured in radians).None
0.5403023058681398

解释:

  • print(dir(math))可以查看这个模块的所有方法名
  • print(help(math.cos))可以看到这个方法的注释,看到是计算cosine的
  • 如果在pycharm中,可以按住键盘的ctrl键同时鼠标左键点击math.cos方法名,可以看到这个方法的源代码的注释

039 函数参数数目错误

# 如下代码报错,为什么,怎么修正它?
import math
print(math.pow(2))

答案解析

import math
print(math.pow(2, 3))
8.0

解释:

  • math.pow用于计算数字的N次方,需要2个参数,例如2的3次方
  • 这里的数字3,可以随意改成其他数字,但是必须有这个第二个参数
  • 可以print(help(math.pow))看下这个函数的说明

040 函数调用方式

# 如下代码会报错,为什么?怎么修复?
def foo(a=1, b=2):return a + bx = foo - 1

答案解析

代码会报错:

TypeError: unsupported operand type(s) for -: ‘function’ and ‘int’ 原因:x = foo - 1,这里的foo是一个函数对象,函数对象和int数字是没法相减的报错

修复方式:要调用一个函数,得在函数名后面加上括号,本题目中是foo()

def foo(a=1, b=2):return a + bx = foo() - 1
print(x)

041 函数计算球的体积

'''
编写函数,计算球的体积V=(4/3)*pi*r^3
要求函数的参数半径r,有一个默认值10
然后用r=2为参数,调用函数得到结果
'''

答案解析

import math
def volume(r=10):return (4 * math.pi * r ** 3) / 3print(volume())print(volume(2))

解释:

  • 函数参数可以用等号的方式,提供默认值;
  • 调用函数时,默认值可以不提供参数,也可以覆盖参数值

042 函数默认值参数

# 如下代码会报错,为什么?怎么修复?
def foo(a=2, b):return a + b

答案解析

报错信息:SyntaxError: non-default argument follows default argument

解释:

  • 带默认值的参数,应该放到后面
  • 这样如果只传1个参数,才能达到使用默认值参数的效果
def foo(b, a=2):return a + bprint(foo(3))
print(foo(3, 4))

043 全局变量

# 如下代码会输出什么内容?为什么呢?
c = 1
def foo():return c
c = 3
print(foo())

答案解析

解释:

  • 第1行:c的值是1
  • 第2~3行:创建了个函数,这时候只是函数定义,并没有被执行
  • 第4行:变量c被更新,值是3
  • 第5行:调用函数foo返回c,这时候c已经是3了,所以输出数字3
c = 1
def foo():return c
c = 3
print(foo())

044 函数局部变量

# 如下代码会输出什么内容?为什么呢?
c = 1
def foo():c = 2return c
c = 3
print(foo())
2

答案解析

解释:

  • python的函数,从上往下一行一行执行
  • 函数内可以访问函数外的全局变量,但是局部变量的优先级更高

045 局部变量和全局变量

# 如下代码的最后一行,会报错说NameError: name 'c' is not defined
# 怎样修复代码,让代码不报错,并且输出数值1?
def foo():c = 1return c
foo()
print(c)

答案解析

def foo():global cc = 1return cfoo()
print(c)
1

解释:

  • 函数内的c是局部变量,不能直接被外部访问的
  • 可以将函数内的c,声明成全局变量,在外部即可访问
  • 加上global c,会将变量c的生效范围变成全局作用域
  • print©的这个c,访问的是全局作用域的c,所以不报错了

046 字符串与数字计算

# 如下代码会报错,为什么?怎么修复?
age = input("What's your age? ")
age_last_year = age - 1
print("Last year you were %s." % age_last_year)

答案解析

age = input("What's your age? ")
age_last_year = int(age) - 1
print("Last year you were %s." % age_last_year)
What's your age? 20
Last year you were 19.

解释:

  • input函数使得用户可以提供自己的输入给变量
  • input函数每次都会返回一个str类型字符串
  • 如果想实现字符串和数字的计算,得把字符串转换成数字,使用int(变量)即可

047 字符串格式化

# 如下代码让用户输入name和age,然后拼接字符串
# 但是代码会报错 TypeError,为什么?怎么修复?有另一种办法吗?
name = input("Enter name: ")
age = input("Enter age: ")
print("Your name is %s and your age is %s" % name, age)

答案解析

name = input("Enter name: ")
age = input("Enter age: ")
print("Your name is %s and your age is %s" % (name, age))
print(f"Your name is {name} and your age is {age}")

解释:

  • 每个%占位符,在后面的%需要一个变量对应起来,如果多于一个%占位符,后面的%之后需要跟一个元组tuple包含多个变量,所以需要用(name, age)这个元组
  • f-string是第二种好用的格式化方式,形如f"Your name is {name}",在字符串中可以用{变量名}的方式格式化

048 字符串拆分

# 创建一个函数,以任何一个英文字符串作为入参数,返回英文单词的数目

答案解析

def count_words(string):string_list = string.split()return len(string_list)
print(count_words("You are a good student !"))
6

解释:

  • split可以提供一个分隔符参数进行分割,例如split(","),如果不传递则用空白分隔符
  • split的结果是一个List,用len(list)可以得到元素个数

049 文件中的英文单词计数

"""
编写函数,传入.txt文件路径作为参数,统计文件中英文单词的数目
输入:新建一个txt文件,名字为p049.txt,粘贴如下内容到文件里,作为参数文件:
Living without an aim is like sailing without a compass.
"""

答案解析

def count_words(filepath):with open(filepath, 'r') as file:string = file.read()string_list = string.split(" ")return len(string_list)print(count_words("p049.txt"))#注意路径

解释:

  • 这段代码直接访问了p049.txt,那么要求p049.txt在当前.py代码同一个目录下
  • 如果.txt不在当前目录,请用绝对路径,例如 D:/workbench/psstest/p049.txt
  • file.read()读取文件的所有内容,str.split(" ")按空格分割

050 多分隔符单词计数

"""
编写函数,传入.txt文件路径作为参数,统计文件中英文单词的数目
注意,不只是空格分割,也可能是逗号分隔输入:新建一个txt文件,名字为p050.txt,粘贴如下内容到文件里,作为参数文件:A tree is a woody perennial plant,typically with branches.
"""

答案解析

import re
def count_words(filepath):with open(filepath, 'r') as file:string = file.read()string_list = re.split(r",| ", string)print(string_list)return len(string_list)print(count_words("p050.txt"))

解释:

  • re是python内置的正则表达式模块,可以实现模式匹配
  • 模式的意思:例如一个字符串“包含10个数字”、“逗号或者空格作为分隔符”等模式
  • re.split的第一个参数,一般都前一个r意思是raw-string,里面如果有反斜线不用多次转义

051 生成字母文件

# 编写代码,生成一个文件p051.txt,每一行是一个英文字母,从a~z

答案解析

import string
with open("p051.txt", "w") as file:for letter in string.ascii_lowercase:file.write(letter + "\n")

解释:

  • open(“p051.txt”, “w”)用于新建一个文件并写入,"w"是write写入的意思
  • string.ascii_lowercase是一个字符串,包含a~z的26个英文字母

052 成对字母文件

'''编写代码,生成文件p052.txt,每一行是两个英文字母的组合:
ab
cd
ef
...
yz
''' 

答案解析

import string
with open("p052.txt", "w") as f:for i, j in zip(string.ascii_lowercase[::2], string.ascii_lowercase[1::2]):f.write(i + j + "\n")

提示:

  • string.ascii_lowercase[::2] 生成acegikmoqsuwy
  • string.ascii_lowercase[1::2] 生成bdfhjlnprtvxz
  • zip的返回是一个个的元组,里面包含各个序列的对应元素

053 成对三字母文件

'''编写代码,生成文件p053.txt,每一行是三个英文字母的组合:
abc
def
ghi
jkl
mno
pqr
stu
vwx
yz '''

答案解析

import string
letters = string.ascii_lowercase + " "
slice1 = letters[0::3]
slice2 = letters[1::3]
slice3 = letters[2::3]
with open("p053.txt", "w") as file:for s1, s2, s3 in zip(slice1, slice2, slice3):file.write(s1 + s2 + s3 + "\n")

解释:

  • zip函数可以将多个序列同时打包在一起,不只是2个,可以是3个,这里的步长改成3
  • zip函数的多个序列,如果遇到了最短的序列,就会结束zip,为了让yz,最后2个字母有所匹配,所以在最开始的letters,加了个空格,变成27个字母

054 每个字母一个文件

'''
编写代码,
1、在当前目录下新建一个目录,名字为 p054
2、给26个英文字母在p054目录下生成一个文件,文件名分别是a.txt、b.txt ~~ z.txt,文件内容分别是字母a、b~~z
'''

答案解析

import os
import string
if not os.path.exists("p054"):os.makedirs("p054")for letter in string.ascii_lowercase:with open(f"p054/{letter}.txt", "w") as f:f.write(letter)

解释:

  • os.makedirs可以创建目录,os.path.exists可以判断目录是否存在
  • f"p054/{letter}.txt"是f-string的字符串格式化方法,前面加上f字母,字符串中可以用{变量名}的方式提供变量

055 扫描字母文件列表

'''
编写代码,
1、扫描p054文件夹,里面是a.txt/b.txt~z.txt共26个文件,每个文件的都是对应字母a~z
2、读取每个文件的内容,最终产出一个list,是字母a~z'''

答案解析

import globletters = []
file_list = glob.glob("p054/*.txt")
for file in file_list:with open(file) as f:letters.append(f.read().strip())print(letters)

解释:

  • glob.glob(“p054/*.txt”) 可以匹配得到文件列表
  • f.read()可以读取文件所有内容,.strip()可以去除两边的空格

056 满足条件的字母文件

'''编写代码,
1、扫描p054文件夹,里面是a.txt/b.txt~z.txt共26个文件,每个文件的都是对应字母a~z
2、如果文件里的内容字母,属于字符串"python"中的字母,则存入结果列表
3、打印结果列表'''

答案解析

import globletters = []
file_list = glob.glob("p054/*.txt")
check = "python"for file in file_list:with open(file) as f:letter = f.read().strip()if letter in check:letters.append(letter)print(letters)

解释:

  • glob.glob(“p054/*.txt”) 可以匹配得到文件列表
  • if letter in check,可以判断一个字母是不是在一个字符串里

057 多级字典

'''如下是一个多级字典,也就是说每个字典的KEY的VALUE,也是个数据结构
怎么访问employees的第二个人,得到他的lastName,即 Smith '''d = {"employees": [{"firstName": "John", "lastName": "Doe"},{"firstName": "Anna", "lastName": "Smith"},{"firstName": "Peter", "lastName": "Jones"}],"owners": [{"firstName": "Jack", "lastName": "Petter"},{"firstName": "Jessy", "lastName": "Petter"}]}

答案解析

print(d['employees'][1]['lastName'])

解释:

  • 访问d[‘employees’],得到:
    [{‘firstName’: ‘John’, ‘lastName’: ‘Doe’},
    {‘firstName’: ‘Anna’, ‘lastName’: ‘Smith’},
    {‘firstName’: ‘Peter’, ‘lastName’: ‘Jones’}]
  • 访问d[‘employees’][1],得到:{‘firstName’: ‘Anna’, ‘lastName’: ‘Smith’}
  • 访问d[‘employees’][1][‘lastName’],得到Smith

058 修改多级字典

'''如下是一个多级字典,也就是说每个字典的KEY的VALUE,也是个数据结构
怎么访问 employees 的第二个人,修改他的 lastName 将值从 Smith 改成 Smooth'''d = {"employees": [{"firstName": "John", "lastName": "Doe"},{"firstName": "Anna", "lastName": "Smith"},{"firstName": "Peter", "lastName": "Jones"}],"owners": [{"firstName": "Jack", "lastName": "Petter"},{"firstName": "Jessy", "lastName": "Petter"}]}

答案解析

d['employees'][1]['lastName'] = "Smooth" 

解释:

  • 访问d[‘employees’][1][‘lastName’],是Smith值的位置
  • 直接给 d[‘employees’][1][‘lastName’] 赋值,即可修改这个位置的值

059 多级字典加值

'''
如下是一个多级字典,也就是说每个字典的KEY的VALUE,也是个数据结构
怎么给 employees 添加一个人:'firstName': 'Albert', 'lastName':'Bert'
'''d = {"employees": [{"firstName": "John", "lastName": "Doe"},{"firstName": "Anna", "lastName": "Smith"},{"firstName": "Peter", "lastName": "Jones"}],"owners": [{"firstName": "Jack", "lastName": "Petter"},{"firstName": "Jessy", "lastName": "Petter"}]}

答案解析

d["employees"].append({'firstName': 'Albert', 'lastName': 'Bert'})

解释:

  • 访问d[‘employees’],得到一个list列表
    [{‘firstName’: ‘John’, ‘lastName’: ‘Doe’},
    {‘firstName’: ‘Anna’, ‘lastName’: ‘Smith’},
    {‘firstName’: ‘Peter’, ‘lastName’: ‘Jones’}]
  • 执行d[“employees”].append({‘firstName’: ‘Albert’, ‘lastName’: ‘Bert’},
    即可给这个列表添加一个元素,这个元素是一个字典

060 字典变JSON

# 把如下字典,变成JSON格式,存入一个文件 p060.json{'employees': [{'firstName': 'John', 'lastName': 'Doe'},{'firstName': 'Anna', 'lastName': 'Smith'},{'firstName': 'Peter', 'lastName': 'Jones'}],'owners': [{'firstName': 'Jack', 'lastName': 'Petter'},{'firstName': 'Jessy', 'lastName': 'Petter'}]}

答案解析

import jsond = {"employees": [{"firstName": "John", "lastName": "Doe"},{"firstName": "Anna", "lastName": "Smith"},{"firstName": "Peter", "lastName": "Jones"}],"owners": [{"firstName": "Jack", "lastName": "Petter"},{"firstName": "Jessy", "lastName": "Petter"}]}with open("p060.json", "w") as f:f.write(json.dumps(d, indent=2))

解释:

  • json.dumps,可以把字典变成JSON字符串
  • 使用with的方法写入文件,可以不用自己close文件,with会自己关闭
  • indent=2可以加可以不加,加了之后会让JSON样式更加缩进美观

061 JSON变字典

# 用python加载p60.json文件,转成字典,并且进行格式化输出

答案解析

import json
import pprintwith open("p060.json") as f:d = json.loads(f.read())
pprint.pprint(d)
{'employees': [{'firstName': 'John', 'lastName': 'Doe'},{'firstName': 'Anna', 'lastName': 'Smith'},{'firstName': 'Peter', 'lastName': 'Jones'}],'owners': [{'firstName': 'Jack', 'lastName': 'Petter'},{'firstName': 'Jessy', 'lastName': 'Petter'}]}

解释:

  • json.loads可以将字符串加载到JSON格式
  • pprint可以实现字典的格式化输出

062 JSON添加数据

'''完成如下步骤:
1.用python加载p060.json文件,转成字典
2.给 employees 添加一个人:
'firstName': 'Albert', 'lastName': 'Bert'
3.将数据生成json,结果存到 p062.json文件'''

答案解析

import jsonwith open("p060.json") as f:d = json.loads(f.read())d["employees"].append({'firstName': 'Albert', 'lastName': 'Bert'})with open("p062.json", "w") as f:f.write(json.dumps(d, indent=2))

解释:

  • open函数的第二个参数如果不加是读取模式,加w是写入模式
  • json.loads从字符串加载到json格式
  • json.dumps将对象变成json字符串

063 无限循环打印

'''实现python代码,无限循环,一直打印字符串 hello
输出如下内容,注意是无限输出:
hello
hello
hello
hello
hello
hello
hello
...
'''

答案解析

while True:print("hello")while 1 < 2:print("hello")

解释:

  • 只要while的条件一直为True即可
  • 因为条件一直不结束,这个叫做“无限循环”,或者叫做“死循环”

064 定时打印

# 实现python代码,每两秒钟输出hello字符串,无限继续:

答案解析

import timewhile True:print("Hello")time.sleep(2)

解释:

  • time.sleep(2)可以让程序暂停2秒钟,这个数字可以自己指定,单位是秒

065 渐进式定时打印

# 实现python代码,输出hello,停顿1秒;输出hello,停顿2秒;输出hello,停顿3秒,...按此一直持续:

答案解析

import timei = 0
while True:i = i + 1print("Hello")time.sleep(i)

解释:

  • time.sleep(i)可以让程序暂停i秒钟
  • i相当于一个计数器,可以从0开始计数

066 有结束条件的循环

# 实现python代码,输出hello,停顿1秒;输出hello,停顿2秒;输出hello,停顿3秒;
# 打印4次hello,然后退出循环:

答案解析

import timei = 0
while True:i = i + 1print("Hello")if i > 3:print("End of loop")breaktime.sleep(i)

解释:

  • 在while循环中,增加if和break配合,可以按条件退出循环
  • break用于退出循环

067 空语句

# 如下代码只能输出一个Hello,只修改break这行代码,让程序交替输出Hello、Hi、Hello、Hi,持续不断while True:print("Hello")if 2 > 1:breakprint("Hi")

答案解析

# while True:
#     print("Hello")
#     if 2 > 1:
#         pass
#     print("Hi")

解释:

  • pass 是 Python 中的关键字,用来让解释器跳过此处,什么都不做
  • 这个位置可以放其他的空语句,例如只放一个1+1,但是pass更加专业

068 忽略循环下一句

# 如下代码只能输出一个Hello,只修改break这行代码,让程序持续输出Hello、Hello、Hello,持续不断while True:print("Hello")if 2 > 1:breakprint("Hi")

答案解析

while True:print("Hello")if 2 > 1:continueprint("Hi")

解释:

  • pass可以跳过当前语句,但是继续往下执行,也会进入下一次循环
  • break会忽略当次循环下方语句,直接退出当前循环
  • continue会忽略当次循环下方语句,依然进入下一个循环

069 英汉翻译

'''
完成如下程序,让用户可以输入一个英文单词,程序给出中文翻译结果。实现效果:
Enter word: apple
苹果
'''d = {"apple": "苹果", "orange": "桔子", "banana": "香蕉"}

答案解析

d = {"apple": "苹果", "orange": "桔子", "banana": "香蕉"}def translate(word):return d[word]word = input("Enter word: ")print(translate(word))

解释:

  • 用函数的方式,将来可以复用translate功能
  • 这个词典很小,如果是全量英文数据,就可以实现全部英文查询了

070 英汉翻译异常处理

'''
如下程序实现功能,让用户可以输入一个英文单词,程序给出中文翻译结果。
按以下要求修改程序:如果输入的英文单词不在字典中,输出信息“单词不在词典中”
限制:请使用try catch的异常机制完成本题目,效果如下:
Enter word: hello
单词不在词典中
'''d = {"apple": "苹果", "orange": "桔子", "banana": "香蕉"}def translate(word):return d[word]word = input("Enter word: ")
print(translate(word))

答案解析

d = {"apple": "苹果", "orange": "桔子", "banana": "香蕉"}
def translate(word):try:return d[word]except KeyError:return "单词不在词典中"word = input("Enter word: ")
print(translate(word))

解释:

  • d[word]访问字典的数据,如果key不存在,会抛出KeyError错误
  • 使用try…except可以捕获异常,在except中指定异常处理逻辑
  • 这里的KeyError可以忽略,就会捕获所有异常

071 英汉翻译文件词典

"""
如下是英汉翻译词典文件,用python加载词典文件
当用户输入英语单词时,返回中文文字
增加:程序应该处理大小写情况,例如输入Apple也能返回apple的翻译自己新建 p071.txt 粘贴内容如下:
apple,苹果
orange,桔子
banana,香蕉
pear,梨
peach,桃
grape,葡萄
lemon,柠檬效果:
Enter word: Apple
苹果
"""

答案解析

engdict = {}
with open("p071.txt", encoding="utf8") as f:for line in f:eng, ch = line.strip().split(",")engdict[eng] = chdef translate(word):try:return engdict[word]except KeyError:return "单词不在词典中"word = input("Enter word: ").lower()
print(translate(word))

解释:

  • 先将字典从文件加载,第一列是英文,第二列是中文
  • 因为要处理小写,在input函数后加一个lower()即可

072 当前日期时间

"""
编写Python代码,输出当前的日期时间
形如:2023-06-09 20:20:27
提示:使用datetime模块
"""

答案解析

from datetime import datetimeprint(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
2023-06-09 13:48:27

解释:

  • datetime是内置的日期时间处理模块
  • datetime.now()返回当前的时间对象
  • datetime.now().strftime可以将时间对象格式化
  • 格式化字符串 %Y 等符号,参照文档:https://strftime.org/

073 输入年龄计算生日

"""编写Python代码,用户可以输入年龄数字,程序打印生日年份
请输入年龄:20
你的出生年份是:2003
提示:datetime.now().year可以得到当前时间的年份"""

答案解析

from datetime import datetimeage = int(input("请输入年龄:"))
year_birth = datetime.now().year - age
print(f"你的出生年份是:{year_birth}")
请输入年龄:22
你的出生年份是:2001

提示:

  • input函数得到的是字符串,需要转换成数字,才能执行减法
  • datetime.now().year是当前的年份,减去年龄就是出生年份
  • f-string是简单的格式化字符串的方法

074 计算活了多少天

"""编写Python代码,用户可以输入生日,程序打印活了多少天
请输入生日:2002-6-9
7665天 #执行代码的日期变化结果会跟着发生改变
提示:
datetime.datetime.strptime("2022-05-14", "%Y-%m-%d"),可以将字符串转换成日期对象
日期对象可以直接相减,差值对象可以得到天数"""

答案解析

import datetimebirthday = input("请输入生日:")
birthday_date = datetime.datetime.strptime(birthday, "%Y-%m-%d")
curr_datetime = datetime.datetime.now()
minus_datetime = curr_datetime - birthday_date
print(minus_datetime.days, "天")
请输入生日:2000-06-09
8400 天

提示:

  • datetime.datetime.strptime(“2022-05-14”, “%Y-%m-%d”),可以将字符串转换成日期对象
  • 日期对象可以直接相减,差值对象可以得到天数

075 计算今天明天昨天的日期

"""
编写代码,输出今天、昨天、明天、一周前的日期
可以编写个函数实现如果今天是2023-06-09,输出形如:
2023-06-09  2023-06-10  2023-06-08  2023-06-02提示:
datetime.datetime.now()得到当前日期对象
datetime.timedelta(days=days)可以得到一个时间间隔对象
日期对象和间隔对象的加法和减法,得到结果对象
"""

答案解析

import datetimedef diff_days(days):pdate_obj = datetime.datetime.now()time_gap = datetime.timedelta(days=days)pdate_result = pdate_obj - time_gapreturn pdate_result.strftime("%Y-%m-%d")print(diff_days(0), diff_days(1), diff_days(-1), diff_days(7))

提示:

  • datetime.datetime.now()得到当前日期对象
  • datetime.timedelta(days=days)可以得到一个时间间隔对象,days可以是0、正数、负数
  • 日期对象和间隔对象的加法和减法,得到结果对象

076 输出间隔内的所有日期

'''
编写代码,输入开始日期,结束日期,返回中间的所有日期例如,输入:begin_date = "2022-06-02",end_date = "2022-06-09"
打印如下内容:
['2022-06-02','2022-06-03','2022-06-04','2022-06-05','2022-06-06','2022-06-07','2022-06-08','2022-06-09']
'''

答案解析

import datetime
def get_date_range(begin_date, end_date):date_list = []while begin_date <= end_date:date_list.append(begin_date)begin_date_object = datetime.datetime.strptime(begin_date, "%Y-%m-%d")days1_timedelta = datetime.timedelta(days=1)begin_date = (begin_date_object + days1_timedelta).strftime("%Y-%m-%d")return date_listbegin_date = "2023-06-02"
end_date = "2023-06-09"
date_list = get_date_range(begin_date, end_date)
print(date_list)
['2023-06-02', '2023-06-03', '2023-06-04', '2023-06-05', '2023-06-06', '2023-06-07', '2023-06-08', '2023-06-09']

077 用户名检测器

'''
写Python代码,要求用户输入用户名,进行检测:
1、用户名至少6位;
2、文件名不能在文件p077_users.txt中存在
自己新建文件:p077_users.txt,粘贴如下内容进去:
xiaoming
xiaowang
xiaozhang
xiaozhao
xiaoqian
xiaosun
结果演示:
请输入用户名: pss
长度小于6位,请重新输入请输入用户名: xiaoming
用户名已存在,请重新输入请输入用户名: abcdefg
用户名检测通过
'''

答案解析

while True:username = input("请输入用户名:")with open("p077_users.txt") as f:users = [name.strip() for name in f.readlines()]if len(username) < 6:print("长度小于6位,请重新输入")continueif username in users:print("用户名已存在,请重新输入")continueelse:print("用户名检测通过")break

解释:

  • f.readlines()可以得到文件中所有的行
  • 本代码可以和检测密码的代码结合起来,实现用户名加密码的检测

078 随机密码生成器

"""
编写Python代码,用户输入密码位数,给出一个随机密码生成请输入密码位数:20
@X_>;HrLM9f?0Elg+q{o提示:
python自带的string模块,提供多种字符集合,小写字母:string.ascii_lowercase;大写字母:string.ascii_uppercase;数字:string.digits;标点符号:string.punctuation
random是随机数模块,random.sample可以从序列中随机得到几个字符的列表
"""

答案解析

import string
import random
words = string.ascii_lowercase + string.ascii_uppercase + string.digits + string.punctuation
len = int(input("请输入密码位数:"))
chosen = random.sample(words, len)
password = "".join(chosen)
print(password)
请输入密码位数:8
@Y5QH-[U

提示:

  • 先将string的几大字符串拼接在一起,作为候选集
  • random.sample采样几个字符,得到一个列表
  • 用str的join方法,可以将列表的每个元素,拼接成一个大字符串

079 密码强度检测器

"""编写Python代码,需要用户一直输入密码,直到满足如下条件才退出循环:至少包含一个数字;
至少包含一个大写字母;
密码至少6位数;实现效果如下,如果不满足条件会一直循环:
请输入密码: abcdefg
密码校验不通过,请重新输入请输入密码: abc12
密码校验不通过,请重新输入请输入密码: abcAA2
密码校验通过"""

答案解析

while True:pwd = input("请输入密码: ")have_number = any([i.isdigit() for i in pwd])have_upper = any([i.isupper() for i in pwd])if have_number and have_upper and len(pwd) >= 6:print("密码校验通过")breakelse:print("密码校验不通过,请重新输入")

解释:

  • any这个方法,参数可以是一个list/set等序列,如果任何一个元素为True,那么any返回True
  • 如果通过校验,则break退出循环;否则打印信息,继续下一次循环;

080 详细错误密码检测器

"""
编写Python代码,需要用户一直输入密码,直到满足如下条件才退出循环:
至少包含一个数字;
至少包含一个大写字母;
密码至少6位数;实现效果如下,如果不满足条件会一直循环,注意会给出多个不满足的信息:请输入密码: abcdefg
密码不通过,有如下原因:
*需要至少一位数字
*需要至少一位大写字母请输入密码: abc12
密码不通过,有如下原因:
*需要至少一位大写字母
*需要至少6位密码请输入密码: abcAA2
密码校验通过"""

答案解析

while True:msgs = []psw = input("请输入密码: ")if not any([i.isdigit() for i in psw]):msgs.append("需要至少一位数字")if not any([i.isupper() for i in psw]):msgs.append("需要至少一位大写字母")if len(psw) < 6:msgs.append("需要至少6位密码")if len(msgs) == 0:print("密码检测通过")breakelse:print("密码不通过,有如下原因: ")for note in msgs:print("*", note)

解释:

  • msgs为出错信息列表,任何一个检测不通过,就放进msgs;
  • 如果msgs为空,说明所有检测通过;如果不为空,则有多条检测不通过,会挨个输出

081 文件内容乘数字

"""新建文件p081.txt,将如下内容粘贴到文件中
编写代码,给每个数字乘以2,结果输出到p081_output.txtx,y
3,5
4,9
6,10
7,11
8,12"""

答案解析

with open("p081.txt") as fin, open("p081_output.txt", "w") as fout:for line in fin:if "x,y" in line:fout.write(line)else:x, y = line.strip().split(",")x = int(x) * 2y = int(y) * 2fout.write(f"{x},{y}\n")

解释:

  • with后面的open,可以用逗号分割多个
  • 读取文件时,返回的都是字符串形式,需要转成数字做计算

082 计算最大值最小值平均值

"""
输入一个成绩文件,计算成绩的最大值最小值平均值文件名:p082.txt,自己复制如下内容进去即可:学号,姓名,分数
101,小张,88
102,小王,77
103,小李,99
104,小赵,66
105,小强,55"""

答案解析

def compute_score():scores = []with open("./p082.txt") as f:for line in f:line = line.strip()fields = line.split(",")scores.append(int(fields[-1]))max_score = max(scores)min_score = min(scores)avg_score = round(sum(scores) / len(scores), 2)return max_score, min_score, avg_scoremax_score, min_score, avg_score = compute_score()
print(max_score, min_score, avg_score)

解释:

  • max、min、sum是三个函数,可以统计list的结果
  • 函数可以返回多个值,外部用多个变量接收即可
  • round(数字, 2)会给小数保留两位数字

083 文件合并

"""
用python编写代码,把这两个txt纵向拼接在一个文件,存入p083.txt自己粘贴文件:p083_xiaomei.txt
小美 看韩剧
小美 跳舞
小美 逛街
小美 看综艺自己粘贴文件:p083_xiaohua.txt
小花 看电影
小花 逛街
小花 购物
小花 跳舞
小花 看小说"""

答案解析

with open("p083.txt", "w", encoding='utf8') as fout:for fname in ["p083_xiaomei.txt", "p083_xiaohua.txt"]:with open(fname, encoding='utf8') as f:for line in f:fout.write(line)

解释:

  • for循环可以遍历多个文件,每个文件单独读取和处理
  • 因为源文件的每行都带结尾的\n换行符,所以写出文件时直接写入即可不用加换行符

084 文件交集

"""用python编写代码,计算两个人的爱好的交集自己粘贴文件:p083_xiaomei.txt
小美 看韩剧
小美 跳舞
小美 逛街
小美 看综艺自己粘贴文件:p083_xiaohua.txt
小花 看电影
小花 逛街
小花 购物
小花 跳舞
小花 看小说输出:
逛街
跳舞提示:set集合,有方法叫做 intersection,可以直接计算交集"""

答案解析

def get_aihao(fname):aihao = []with open(fname, encoding='utf8') as f:for line in f:aihao.append(line.split()[1])return aihaoxiaomei = get_aihao("p084_xiaomei.txt")
xiaohua = get_aihao("p084_xiaohua.txt")
for i in set(xiaomei).intersection(set(xiaohua)):print(i)

解释:

  • set集合,有方法叫做 intersection,可以直接计算交集

085 每种爱好的喜欢人数

"""
输入一个(姓名,爱好)文件,计算每个爱好的人数文件名:p085.txt,自己复制如下内容进去即可,姓名和爱好之间是一个空格分割的:
小张 篮球,羽毛球
小王 篮球,乒乓球
小李 篮球,台球
小赵 篮球,足球,台球
小马 乒乓球,台球
小钱 羽毛球,足球
小孙 乒乓球,台球
小强 羽毛球输出如下内容:
篮球 4
羽毛球 3
乒乓球 3
台球 4
足球 2
"""

答案解析

like_count = {}
with open("p085.txt", encoding='utf8') as fin:for line in fin:line = line[:-1]sname, likes = line.split(" ")like_list = likes.split(",")for like in like_list:if like not in like_count:like_count[like] = 0like_count[like] += 1for key, value in like_count.items():print(key, value)

解释:

  • 用字典实现计数,key是爱好,value是人数
  • dict.items()可以同时输出key和value

086 实现文件的关联

"""
有两个文件:
文件1:成绩文件,列为(学号、成绩)
文件2:学生信息文件,列为(学号,姓名)
关联两个文件,得到(学号、姓名、成绩),结果存入 p086.txt
自己新建文件粘贴内容:
p086_grade.txt
101,90
102,88
103,89
104,95自己新建文件粘贴内容:
p086_student.txt
101,小明
102,小王
103,小张
104,小李得到结果:
p086.txt
101,小明,90
102,小王,88
103,小张,89
104,小李,95
"""

答案解析

grade_dict = {}
with open("p086_grade.txt", encoding="utf8") as f:for line in f:sno, grade = line.strip().split(",")grade_dict[sno] = grade
fout = open("p086.txt", "w", encoding="utf8")
with open("p086_student.txt", encoding="utf8") as f:for line in f:sno, sname = line.strip().split(",")grade = grade_dict[sno]fout.write(f"{sno},{sname},{grade}\n")
fout.close()

解释:

  • 要想实现文件关联,先将一个文件存入字典,第二个文件根据KEY获取第一个字典的VALUE,实现关联

087 判断日期格式

"""
编写函数date_is_right,判断日期是不是 YYYY-MM-DD 的格式
如果是返回True,否则返回False
测试结果形如:
2023-06-09 True
202-06-09 False
2026/06-09 False
20230609 False
20a30609 False
"""

答案解析

import redef date_is_right(date):return re.match(r"\d{4}-\d{2}-\d{2}", date) is not Noneprint("2023-06-09", date_is_right("2023-06-09"))
print("202-06-09", date_is_right("202-06-09"))
print("2023/06-09", date_is_right("2023/06-09"))
print("20230609", date_is_right("20230609"))
print("20a30609", date_is_right("20a30609"))

解释:

  • re.match会给字符串匹配模式,如果匹配成功返回Match对象,匹配不成功返回None
  • \d可以代表0到9的任何一个数字,{2}和{4}表示前面的\d会出现2和4次

088 提取电话号码

如下文字中,有很多电话号码,用python提取打印出来
白日依19989881888山尽,黄河入45645546468798978海流。
欲穷12345千里目,更上15619292345一层楼。
输出内容:
19989881888
15619292345提示:
电话号码的规则是:都是数字1开头,并且包含11位数字
re.findall方法,可以搜索文本中的所有匹配的模式

答案解析

import recontent = """ 白日依19989881888山尽,黄河入45645546468798978海流。
欲穷12345千里目,更上15619292345一层楼。
"""
pattern = r"1\d{10}"
results = re.findall(pattern, content)
for result in results:print(result)

解释:

  • r"1\d{10}"可以匹配11位数字,第一个字母是数字1;r意思是raw-string,方便编写正则模式
  • re.findall方法,可以搜索文本中的所有匹配的模式

089 提取邮箱地址

"""
如下文字中,有很多邮箱地址,用python提取打印出来
寻隐者12345@qq.com不遇
朝代:唐asdf12dsa#abc.com代
作python666@163.cn者:贾岛
松下问童子,言师python-abc@163com采药去。
只在python_ant-666@sina.net此山中,云深不知处。输出内容:
12345@qq.com
python666@163.cn
python_ant-666@sina.net提示:
邮箱地址的模式位:多位字母/数字/下划线/中划线 @ 多位字母数字 . 2~4位字母
"""

答案解析

import recontent = """ 寻隐者12345@qq.com不遇
朝代:唐asdf12dsa#abc.com代
作python666@163.cn者:贾岛
松下问童子,言师python-abc@163com采药去。
只在python_ant-666@sina.net此山中,云深不知处。
"""
pattern = re.compile(r"[a-zA-Z0-9_-]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,4}")
results = pattern.findall(content)for result in results:print(result)

解释:

  • re.compile可以提前编译正则表达式,后续多次使用性能更好
  • re.findall可以搜索多种匹配模式
  • 点号是正则的特殊符号,如果相匹配点号,得用.

090 多个禁用词替换

"""
如下文字中,有很多不允许使用的词语,包含 最好、最低、绝对
用python将这三个词语,都替换成***字符串
输入内容:
这个商品很好,质量最好、用起来很不错,并且价格最低,绝对的物美价廉输出内容:
这个商品很好,质量***、用起来很不错,并且价格***,***的物美价廉提示:
re.sub可以实现正则替换字符串
r"最好|最低|绝对"就可以同时匹配很多个字符串
"""

答案解析

import recontent = """ 这个商品很好,质量最好、用起来很不错,并且价格最低,绝对的物美价廉
"""
pattern = r"最好|最低|绝对"
print(re.sub(pattern, "***", content))
 这个商品很好,质量***、用起来很不错,并且价格***,***的物美价廉

解释:

  • re.sub可以实现正则替换字符串
  • r"最好|最低|绝对"就可以同时匹配很多个字符串

091 给手机号打上马赛克

"""
如下文字中,有一些手机号数字
用python将所有的手机号,只保留开始和结尾数字,中间用******代替输入内容:
白日依19989881888山尽,黄河入45645546468798978海流。
欲穷12345千里目,更上15619292345一层楼。输出内容:
白日依19******88山尽,黄河入45645546468798978海流。
欲穷12345千里目,更上15******45一层楼。提示:
手机号总共11位数字,总是数字1开头
在正则里可以加括号,代表分组,在re.sub时可以用\1、\2代表第几个分组
"""

答案解析

import recontent = """ 白日依19989881888山尽,黄河入45645546468798978海流。
欲穷12345千里目,更上15619292345一层楼。
"""
pattern = r"(1\d)\d{7}(\d{2})"
print(re.sub(pattern, r"\1******\2", content))

解释:

  • 每个括号是一个分组,(1\d)是开头代表2个数字,(\d{2})是结尾的2个数字,中间7个数字
  • 在re.sub的第二个参数,用\1和\2可以引用前面的两个分组

092 扫描目录下所有文件

"""
提供一个目录路径,用python扫描所有的文件,列出文件路径
例如:
dir = r"D:\workbench\python-exercises-100p"输出内容:
D:\workbench\python-exercises-100p\.gitignore
D:\workbench\python-exercises-100p\LICENSE
D:\workbench\python-exercises-100p\Python练习100题课件.pptx
D:\workbench\python-exercises-100p\ceshi01.py 1
D:\workbench\python-exercises-100p\p001.py 5
D:\workbench\python-exercises-100p\p002.py 4
D:\workbench\python-exercises-100p\p003.py 4
D:\workbench\python-exercises-100p\p004.py 3
D:\workbench\python-exercises-100p\p005.py 3
等等提示:
os.walk可以递归扫描目录
根据自己电脑的实际情况自定义一个路径,并输出对应路径的的文件
"""

答案解析

import os
dir = r"D:\workbench\python-exercises-100p"
for root, dirs, files in os.walk(dir):for file in files:fpath = os.path.join(root, file)print(fpath)

解释:

  • 因为反斜线\在python字符串中有特殊含义,例如\n其实是换行符,因此如果要写路径,在前面加个r表示raw-string,那么后面的字符串中反斜线将会是正常的字符而不是转义符号
  • os.walk返回的root是当前扫描到的目录地址,dirs和files则是当前扫描到的目录下的子目录列表、子文件列表
  • os.path.join,可以拼接一个目录和一个文件名,得到一个结果路径

093 扫描py文件的行数

"""
提供一个目录路径,用python找出所有的.py文件展示文件路径,以及文件的行数输入内容:
dir = r"D:\workbench\python-exercises-100p"
输出内容:
D:\workbench\python-exercises-100p\ceshi01.py 1
D:\workbench\python-exercises-100p\p001.py 5
D:\workbench\python-exercises-100p\p002.py 4
D:\workbench\python-exercises-100p\p003.py 4
D:\workbench\python-exercises-100p\p004.py 3
D:\workbench\python-exercises-100p\p005.py 3提示:
os.walk可以递归扫描目录,判断如果是.py文件,则读取文件计算行数
使用file.endswith(".py")可以判断是不是.py文件
len(f.readlines())可以统计文件行数"""

答案解析

import osdir = r"D:\workbench\python-exercises-100p"
for root, dirs, files in os.walk(dir):for file in files:if file.endswith(".py"):fpath = os.path.join(root, file)with open(fpath, encoding="utf8") as f:print(fpath, len(f.readlines()))

解释:

  • 使用file.endswith(".py")可以判断是不是.py文件
  • len(f.readlines())可以统计文件行数

094 自动整理文件夹

"""
自己新建一个目录 arrange_dir
自己在文件夹下,手动新建多个“假文件”:
aaa.txt bbb.mp3 ccc.avi ccc.jpg ddd.jpg eee.txt fff.mp3 ggg.jpg hhh.txt iii.mp3编写代码,按后缀名将文件移动到 arrange_dir 下的多个子目录(txt、mp3、avi、jpg),如下效果所示
arrange_dirtxtaaa.txteee.txthhh.txt
mp3bbb.mp3fff.mp3iii.mp3
aviccc.avi
jpgccc.jpgddd.jpgggg,jpg提示:
os.listdir可以列出当前目录下的所有文件
os.path.splitext可以得到文件后缀名,例如.txt、.mp3
os.mkdir可以创建目录
shutil.move可以移动文件
"""

答案解析

import os
import shutil
dir = "./arrange_dir"
for file in os.listdir(dir):ext = os.path.splitext(file)[1]ext = ext[1:]if not os.path.isdir(f"{dir}/{ext}"):os.mkdir(f"{dir}/{ext}")source_path = f"{dir}/{file}"target_path = f"{dir}/{ext}/{file}"shutil.move(source_path, target_path)

解释:

  • os.listdir可以列出当前目录下的所有文件
  • os.path.splitext可以得到文件后缀名,例如.txt、.mp3
  • os.mkdir可以创建目录
  • shutil.move可以移动文件

095 自动压缩文件夹

'''
提供任何一个目录地址,用python实现文件夹的压缩,压缩成zip格式
例如:dir = r"D:\workbench\python-exercises-100p"
则会生成一个文件 r"D:\workbench\python-exercises-100p.zip"
这个压缩文件是对这个目录的压缩结果提示:
python自带的zipfile模块可以实现压缩
有些文件以~$字符串开头,是临时文件,需要忽略掉
'''

答案解析

import os
import zipfile
def do_zip_compress(dirpath):output_name = f"{dirpath}.zip"parent_name = os.path.dirname(dirpath)zip = zipfile.ZipFile(output_name, "w", zipfile.ZIP_DEFLATED)for root, dirs, files in os.walk(dirpath):for file in files:if str(file).startswith("~$"):continuefilepath = os.path.join(root, file)writepath = os.path.relpath(filepath, parent_name)zip.write(filepath, writepath)zip.close()dirpath = r"D:\workbench\python-exercises-100p"
do_zip_compress(dirpath)

解释:

  • zipfile.ZipFile可以新建压缩文件,用write方法即可写入文件
  • 需要处理相对路径的问题,os.path.relpath可以获取相对路径

096 Requests模块报错

"""
请自己创建一个空文件,文件名是requests.py,请注意文件名不要写错了,然后粘贴如下代码到文件中:
import requestsr = requests.get("https://www.baidu.com/")
print(r.text[:100])执行代码会报错,module 'requests' has no attribute 'get'
想办法修正
"""

答案解析

答案:代码文件名不能是requests.py,改成其他名字即可

解释:

  • requests是一个开源库,自己是有get方法的
  • 报错是因为,python本身导入类库时,会先从本地文件导入,它发现了本地文件有一个requests.py就导入了,但是这是我们自己的文件,里面确实没有get方法
  • 如果改完了文件名,报错说requests不存在,则需要自己安装一下代码包

097 来自URL的文件

"""
用Python访问URL:http://antpython.net/static/py100/life_is_great.txt
然后打印文件中的如下内容:
Life Is Great
I am happy.
I have many friends.
I have a large family.
I have four brothers and four 
--- 后面内容省略提示:使用开源的requests模块实现
"""

答案解析

import requestsr = requests.get("http://antpython.net/static/py100/life_is_great.txt")
print(r.text)

解释:

  • requests是python的开源模块,可以请求URL的结果
  • requests.get可以访问一个URL
  • requests.get的结果,有一个属性是text,放置了这个URL的结果内容

098 下载URL的图片

"""
这个URL是一个图片,用python下载图片,存入到本地p098.jpeg:
https://img2.baidu.com/it/u=16845247,2548960002&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=627
"""

答案解析

import requestsurl = "https://img2.baidu.com/it/u=16845247,2548960002&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=627"
r = requests.get(url)
with open("p098.jpeg", "wb") as f:f.write(r.content)

解释:

  • 如果要下载文件,需要用open的wb模式写入文件,写入的时候,用resp.content二进制形式,不能用resp.text

099 给网页提交数据

"""
这是一个网页,里面有一个表单可以提交数据
http://antpython.net/webspider/grade_form
使用python提交一条数据,并且在网页上看到效果:
姓名:B0901970_1,语文88,数学99,英语66提示:
可以用chrome浏览器的f12打开network,查看后台请求
表单提交的Url是:http://antpython.net/webspider/grade_form
提交方法是post,数据格式为 sname: xx,yuwen: 66,shuxue: 77,yingyu: 88
用requests.post提交即可
"""

答案解析

import requestsurl = "http://antpython.net/webspider/grade_form"
datas = {"sname": "B0901970_1", "yuwen": 66, "shuxue": 77, "yingyu": 88}resp = requests.post(url, data=datas)
print(resp.status_code)
200

解释:

  • requests.post可以发送表单post请求,data可以提供数据,可以是字典形式
  • resp.status_code如果是200,说明请求成功

100 打开百度搜索

"""
编写代码,让用户输入一个词语,代码自动打开浏览器,在百度搜索关键词,展示结果
例如用户输入python,自动打开这个界面提示:
百度搜索的URL:https://www.baidu.com/s?wd=python 这个wd=python,可以替换关键词
python有个模块webbrowser,用它的webbrowser.open(url)可以直接浏览器打开一个URL
f-string可以用f"https://www.baidu.com/s?wd={query}"的方式拼接字符串
"""

答案解析

import webbrowserquery = input("请输入搜索词: ")
webbrowser.open(f"https://www.baidu.com/s?wd={query}")

提示:

  • 百度搜索的URL:https://www.baidu.com/s?wd=python 这个wd=python,可以替换关键词
  • python有个模块webbrowser,用它的webbrowser.open(url)可以直接浏览器打开一个URL
  • f-string可以用f"https://www.baidu.com/s?wd={query}"的方式拼接字符串

http://www.ppmy.cn/news/301216.html

相关文章

Spring高级装配--条件化的bean

目录 条件化创建bean的例子 使用 解析 条件化创建bean的例子 希望一个或多个bean只有在应用的类路径下包含特定的库时创建希望某个bean只有当另外某个特定的bean也声明之后才会创建要求某个特定的环境变量设置之后&#xff0c;才会创建某个bean在Spring 4之前&#xff0c;很…

基于深度学习的高精度袋鼠检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度袋鼠检测识别系统可用于日常生活中或野外来检测与定位袋鼠目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的袋鼠目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型…

浅谈集群,分布式和微服务的区别

一.概念 集群&#xff1a; 分布式&#xff1a; 微服务&#xff1a; 二.区别 集群是多台服务器一起处理同一个业务,可以使用负载均衡使得每一个服务器的负载相对平衡,集群中的一台服务器出现问题,该服务器所负责的业务可以由其他的服务器代为处理。直白一点:就是只有一个项目&…

基于FPGA的ROM-VGA图像处理(老师好帅系列)

如出现看不懂&#xff0c;在评论区留下邮箱&#xff0c;直接发工程&#xff0c;希望大家都能学好FPGA 一.top层 module vga_rom_pic(input sys_clk, //系统时钟input sys_rst_n, //复位信号//VGA接口 output …

docker安装torna1.16.2

一、docker拉取torna镜像 docker pull tanghc2020/torna:1.16.2 二、创建映射容器的文件目录 mkdir -p -m 777 /mydata/torna/config 三、导入mysql数据库&#xff0c;执行torna.sql CREATE DATABASE /*!32312 IF NOT EXISTS*/torna /*!40100 DEFAULT CHARACTER SET utf8m…

使用Docker虚拟化出一个Centos7操作系统(140、141机器上执行)

1.使用Docker虚拟化出一个Centos7操作系统&#xff08;140、141机器上执行&#xff09; Docker官网&#xff1a;https://docs.docker.com/ Docker文档&#xff1a;https://docs.docker.com/engine/reference/commandline/network_rm/ 1.1 Docker安装 1.1.1 支持的操作系统 …

docker虚拟化技术文档(自己总结最全版本)

目录 1 使用Docker虚拟化出一个Centos7操作系统&#xff08;140、141机器上执行&#xff09; 2 1.1 Docker安装 3 1.1.1 支持的操作系统 3 1.1.2 前提条件 3 1.1.3 使用yum安装&#xff08;CentOS7下&#xff09; 3 1.1.4 使用脚本安装Docker&#xff08;Centos7下&#xff09…

Nginx安装教程

前言&#xff1a; 同步文章图片有问题想看带有图片版的请移步&#xff1a; https://www.yuque.com/docs/share/3fbd7d5a-639c-4ca8-8500-00071b7cb23d?#BvpWF 本篇文章涉及nginx的安装&#xff0c;目前分为两个版本linux安装和win10的安装 其中nginx的安装涉及到无root权限和…