1.编程实现检测密码安全强度。密码至少包含6位字符至多包含16位字符,主要由数字、小写字母、大写字母和特殊字符组成,密码的安全强度主要和字符串的复杂程度有关系,字符串中包含的字符种类越多,安全强度越高,按照该标准,可将安全强度分为搞强度密码(4种字符)、中高强度密码(3种字符)、中低强度密码(2种字符)、弱密码(1种字符)。
import re
def check_password_strength(password):
if len(password) < 6 or len(password) > 16:
return "密码长度应在6-16个字符之间"
pattern_dict = {
r'\d': '数字',
r'[a-z]': '小写字母',
r'[A-Z]': '大写字母',
r'[^0-9a-zA-Z]': '特殊字符'
}
match_count = 0
for pattern in pattern_dict.keys():
if re.search(pattern, password):
match_count += 1
if match_count == 4:
return "强度密码"
elif match_count == 3:
return "中高强度密码"
elif match_count == 2:
return "中低强度密码"
else:
return "弱密码"
ps=input('请输入密码:')
print(check_password_strength(ps))
实验结果:
2.编程实现单行带刷新的文本进度条。进度条是计算机处理任务或执行软件中常用的增强用户体验的重要手段,它能够实时显示任务或软件的执行进度。
import sys
import time
def show_progress_bar(percent):
progress_bar_width = 50
num_of_chars = int(percent / 100 * progress_bar_width)
sys.stdout.write('\r')
sys.stdout.write("[%-50s] %d%%" % ('=' * num_of_chars, percent))
sys.stdout.flush()
time.sleep(0.1)
percent=int(input('请输入当前进度:'))
print(show_progress_bar(percent))
实验结果:
3.编写程序生成随机密码,在26个字符大小写和9个数字组成的列表中随机生成10个8位密码。
import random
def generate_random_password():
characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
password = ''
for i in range(8):
password += random.choice(characters)
return password
def generate_multiple_passwords(num):
passwords = []
for i in range(num):
passwords.append(generate_random_password())
return passwords
print('随机生成的密码为:',generate_multiple_passwords(10))
实验结果:
4.编写程序输出n位自幂数。从键盘输入一个数字,例如输入数字3,即可输出所有的水仙花数。三位自幂数:水仙花数,四位自幂数:四叶玫瑰数,五位自幂数:五角星数,六位自幂数:六合数,七位自幂数:北斗七星数,八位自幂数:八仙数,九位自幂数:九九重阳数,十位自幂数:十全十美数。
def is_narcissistic_number(num):
n = len(str(num))
sum_of_powers = 0
for digit in str(num):
sum_of_powers += int(digit) ** n
return num == sum_of_powers
def find_narcissistic_numbers(n):
start = 10 ** (n - 1)
end = 10 ** n
narcissistic_numbers = []
for i in range(start, end):
if is_narcissistic_number(i):
narcissistic_numbers.append(i)
return narcissistic_numbers
n=int(input('请输入一个数字:'))
print(find_narcissistic_numbers(n))
实验结果:
5.使用列表实现筛选法求素数,输入一个大于2的自然数,然后输出该数以内所有素数组成的列表。所谓素数,是指除了1和自身之外没有其他因素的自然数。
def find_primes(max_num):
primes = []
candidates = list(range(2, max_num + 1))
while candidates:
prime = candidates.pop(0)
primes.append(prime)
candidates = list(filter(lambda x: x % prime != 0, candidates))
return primes
num=int(input('请输入一个数:'))
print(find_primes(num))
实验结果:
6.使用列表推导式实现矩阵的乘法。矩阵相乘的前提条件是第一个矩阵的列数(column)和第二个矩阵的行数(row)相同。
# def matrix_multiply(a, b):
# if len(a[0]) != len(b):
# return None
# result = [[sum(x * y for x, y in zip(row, col)) for col in zip(*b)] for row in a]
# return result
# a=[[1,2],[3,4]]
# b=[[5,6],[7,8]]
# print(matrix_multiply(a,b))
# 第一个矩阵
matrix1 = [[1, 2], [3, 4], [5, 6]]
# 第二个矩阵
matrix2 = [[1, 2, 3], [4, 5, 6]]
# 确认矩阵相乘的前提条件
if len(matrix1[0]) != len(matrix2):
print("无法相乘:第一个矩阵的列数与第二个矩阵的行数不同")
else:
# 初始化结果矩阵为零矩阵
result_matrix = [[0 for j in range(len(matrix2[0]))] for i in range(len(matrix1))]
# 利用列表推导式计算结果矩阵
result_matrix = [[sum(a * b for a, b in zip(row, col)) for col in zip(*matrix2)] for row in matrix1]
# 输出结果矩阵
for row in result_matrix:
print(row)
实验结果:
7.使用jieba中文分词库完成《三国演义》人物出场统计。
注意:这里需要下载《三国演义》文本文件
import jieba
# 读取《三国演义》文本文件
with open('sgyy.txt', 'r', encoding='utf-8') as f:
sgyy = f.read()
# 使用jieba分词,得到分词后的字符串列表
words = jieba.lcut(sgyy)
# 统计人物出现次数
counts = {}
for i in range(len(words)-1):
if words[i] == '关于' and words[i+1][0] == '人':
# 判断是否为人名出场
name = words[i+1]
counts[name] = counts.get(name, 0) + 1
# 将统计结果按出场次数从高到低排序
items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True)
# 输出前10个出场次数最多的人物名及出场次数
for i in range(10):
name, count = items[i]
print(name, count)
实验结果:
8.使用集合实现筛选法求素数。输入一个大于2的自然数,输出该数以内所有素数组成的集合。
def find_primes_set(num):
primes = set(range(2, num + 1))
for i in range(2, int(num ** 0.5) + 1):
if i in primes:
primes.difference_update(range(i * 2, num + 1, i))
return primes
n=int(input('请输入一个数字:'))
print(find_primes_set(n))
实验结果:
9.明明的随机数。明明想在学校中请⼀些同学⼀起做⼀项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留⼀个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从大到小排序,按照排好的顺序去找同学做调查。
# import random
#
# # 生成随机整数
# N = 1000
# random_list = [random.randint(1, 1000) for i in range(N)]
#
# # 去重
# random_set = set(random_list)
#
# # 再次转换为列表,并排序
# new_list = list(random_set)
# new_list.sort()
#
# # 输出去重并排序后的元素
# for i in new_list:
# print(i)
import random
def dedup_and_sort(data):
return sorted(set(data), reverse=True)
data = [random.randint(1, 1000) for _ in range(100)]
deduped_and_sorted_data = dedup_and_sort(data)
print(deduped_and_sorted_data)
实验结果: