python练习题

102 阅读12分钟
  1. 两数之和
number1 = 1.5
number2 = 3.8
sum = number1 + number2
print(f"{number1}+{number2}={sum}")
  1. 数字的阶乘
def get_jiecheng(number):
    result = 1
    while number > 0:
        result *= number
        number -= 1
    return result

print("阶乘 6=", get_jiecheng(6))
print("阶乘 3=", get_jiecheng(3))
print("阶乘 100=", get_jiecheng(100))
  1. 计算圆的面积

import math

def computer_area_of_circle(r):
    return round(math.pi * r * r, 2)
print("area of 2 is:", computer_area_of_circle(2))
print("area of 3.14 is:", computer_area_of_circle(3.14))
print("area of 6/78 is:", computer_area_of_circle(6.78))

  1. 区间内的所有素数
def is_prime(number):
    if number in (1, 2):
        return True
    for idx in range(2, number):
        if number % idx == 0:
            return False
    return True


def print_primes(begin, end):
    for number in range(begin, end + 1):
        if is_prime(number):
            print(f"{number} is a prime")


begin = 11
end = 25
print_primes(begin, end)

  1. 前n个数字的平方和

def sum_of_square(n):
    result = 0
    for number in range(1, n + 1):
        result += number * number
    return result


print("sum of square 3:", sum_of_square(3))
print("sum of square 5:", sum_of_square(5))
print("sum of square 10:", sum_of_square(10))

  1. 计算列表数字的和

def sun_of_list(param_list):
    total = 0
    for item in param_list:
        total += item
    return total


list1 = [1, 2, 3, 4, ]
list2 = [17, 5, 3, 5]

# print(f"sum of {list1},", sun_of_list(list1))
# print(f"sum of {list2},", sun_of_list(list2))

# 内置
print(f"sum of {list1},", sum(list1))
print(f"sum of {list2},", sum(list2))

  1. 数字范围内的所有偶数

def get_even_numbers(begin, end):
    result = []
    for item in range(begin, end):
        if item % 2 == 0:
            result.append(item)
    return result


begin = 4
end = 15
# 方式二
data = [item for item in range(begin, end) if item % 2 == 0]
print(f"begin={begin},end={end} even numbers:", get_even_numbers(begin, end))
print(f"begin={begin},end={end} even numbers:", data)

  1. 从列表中移除多个元素

def remove_elements_from_list(lista, listb):
    for item in listb:
        lista.remove(item)
    return lista


lista = [3, 5, 7, 9, 11, 13]
listb = [7, 11]
print(f"from {lista} remove {listb},result:", remove_elements_from_list(lista, listb))
lista = [3, 5, 7, 9, 11, 13]
listb = [7, 11]

# 列表推到式
data = [item for item in lista if item not in listb]
print(f"from {lista} remove {listb},result:", data)

  1. 实现对列表的去重

def get_unique_list(lista):
    result = []
    for item in lista:
        if item not in result:
            result.append(item)
    return result


lista = [10, 20, 30, 10, 20]
print(f"source list {lista},unique list:", get_unique_list(lista))
# set集合 去重
lista = [10, 20, 30, 10, 20]
print(f"source list {lista},unique list:", list(set(lista)))

  1. 简单对列表进行排序

lista = [20, 40, 30, 50, 10]
# 会改变列表 升序
lista.sort()
print(f"lista is {lista}")
# 降序
lista.sort(reverse=True)
print(f"lista is {lista}")
# 不会改变列表
lista = [20, 40, 30, 50, 10]
# 升序
listb = sorted(lista)
print(f"listb is {listb}")
# 降序
listb = sorted(lista, reverse=True)
print(f"listb is {listb}")

  1. 实现学生成绩的降序排序

students = [
    {"sno": 101, "sname": "小张", "sgrade": 88},
    {"sno": 102, "sname": "小王", "sgrade": 99},
    {"sno": 103, "sname": "小李", "sgrade": 77},
    {"sno": 104, "sname": "小赵", "sgrade": 66},
]
# reverse=True 降序排序
studenys_sort = sorted(students, key=lambda x: x["sgrade"], reverse=True)
print(students)
print(studenys_sort)

  1. 从列表中移除多个元素

def remove_elements_from_list(lista, listb):
    for item in listb:
        lista.remove(item)
    return lista


lista = [3, 5, 7, 9, 11, 13]
listb = [7, 11]
print(f"from {lista} remove {listb},result:", remove_elements_from_list(lista, listb))
lista = [3, 5, 7, 9, 11, 13]
listb = [7, 11]

# 列表推到式
data = [item for item in lista if item not in listb]
print(f"from {lista} remove {listb},result:", data)

  1. 实现学生成绩的降序排序

students = [
    {"sno": 101, "sname": "小张", "sgrade": 88},
    {"sno": 102, "sname": "小王", "sgrade": 99},
    {"sno": 103, "sname": "小李", "sgrade": 77},
    {"sno": 104, "sname": "小赵", "sgrade": 66},
]
# reverse=True 降序排序
studenys_sort = sorted(students, key=lambda x: x["sgrade"], reverse=True)
print(students)
print(studenys_sort)

  1. 读取成绩文件实现排序

def read_file():
    with open("./student_grade_input") as fin:
        result = []
        for line in fin:
            line = line[:-1]  # 去掉换行符
            result.append(line.split(","))  # ,切割数据
    return result


def sort_grades(datas):
    return sorted(datas, key=lambda x: int(x[2]), reverse=True)


def write_file(datas):
    with open("./student_grade_output.txt", "w") as fout:
        for data in datas:
            fout.write(",".join(data) + "\n")  # 加逗号分割 和换行


# 读取文件
datas = read_file()
print("read_file datas:", datas)
# 排序数据
datas = sort_grades(datas)
print("sort_grades datas:", datas)
# 写出文件
write_file(datas)

  1. 读取成绩文件计算最高分、最低分、平均分

def compute_score():
    scores = []
    with open("./student_grade_input") as fin:
        for line in fin:
            line = line[:-1]
            fields = line.split(",")
            scores.append(int(fields[-1]))  # 最后一列成绩
    max_score = max(scores)
    min_score = min(scores)
    avg_score = round(sum(scores) / len(scores), 2)  # 小数后2位
    return max_score, min_score, avg_score


max_score, min_score, avg_score = compute_score()
print(f"max_score={max_score},min_score={min_score},avg_score={avg_score}")

student_grade_input

101,小张,88
102,小王,77
103,小李,99
104,小赵,66
105,小强,55
  1. 统计英文文章出现最多单词数目

word_count = {}
with open("./word.txt") as fin:
    for line in fin:
        line = line[:-1]  # 去除换行符
        words = line.split()
        for word in words:
            if word not in word_count:
                word_count[word] = 0
            word_count[word] += 1
print(word_count)

# 排序
dict_sort = sorted(word_count.items(), key=lambda x: x[1], reverse=True)[:10]  # 排序前10
print(dict_sort)

  1. 统计目录下的文件大小

import os

print(os.path.getsize("word.txt"))  # 统计文件大小

sum_size = 0
for file in os.listdir("."):  # .代表当前目录
    if os.path.isfile(file):  # 判断是否是文件
        sum_size += os.path.getsize(file)

print("all size of dir:", sum_size / 1000)  # 得到结果为以kb单位

  1. 按文件后缀整理文件夹

import os
import shutil

dir = "./arrange_dir"
for file in os.listdir(dir):  # os.listdir 列出文件
    ext = os.path.splitext(file)[1]  # splitext 得到文件的后缀
    ext = ext[1:]
    if not os.path.isdir(f"{dir}/{ext}"):  # 非dir 和ext
        os.mkdir(f"{dir}/{ext}")  # os.mkdir 创建目录
    # 按后缀进行存储
    source_path = f"{dir}/{file}"
    target_path = f"{dir}/{ext}/{file}"  # 按后缀存储到不同文件
    shutil.move(source_path, target_path)  # shutil.move 移动文件
    # print(file, ext)

  1. 计算每个班级的最高分最低分平均分

# key: course ,value: grade list
course_grades = {}

with open("doc/course_student_grade_input.txt", 'r', encoding='utf-8') as fin:
    for line in fin:
        line = line[:-1]
        course, sno, sname, grade = line.split(",")
        if course not in course_grades:
            course_grades[course] = []
        course_grades[course].append(int(grade))
print(course_grades)
for course, grades in course_grades.items():
    print(course,
          max(grades),
          min(grades),
          sum(grades) / len(grades))

  1. 实现不同文件的关联

course_teacher_map = {}
with open("./doc/course_teacher.txt", "r", encoding="utf-8") as fin:
    for line in fin:
        line = line[:-1]  # 去掉分隔符
        course, teacher = line.split(",")
        course_teacher_map[course] = teacher
print(course_teacher_map)

with open("./doc/course_student_grade_input.txt", "r", encoding="utf-8") as fin:
    with open("./doc/course_student_grade_output.txt", "w", encoding="utf-8") as fout:
        for line in fin:
            line = line[:-1]
            course, sno, sname, sgrade = line.split(",")
            teacher = course_teacher_map.get(course)
            fout.write(f"{course}, {teacher}, {sno}, {sname}, {sgrade},'\n")
            # print(course, teacher, sno, sname, sgrade)

course_teacher.txt

语文,于老师
数学,树老师
英语,影老师
  1. 实现批量txt文件的合并

import os

data_dir = "./datas/many_texts"
contents = []

for file in os.listdir(data_dir):  # os.listdir 扫描文件夹
    file_path = f"{data_dir}/{file}"
    if os.path.isfile(file_path) and file.endswith(".txt"):
        with open(file_path, encoding="utf-8") as fin:
            contents.append(fin.read())  # fin.read() 读取所有内容放到contents中
# print(contents)
final_content = "\n".join(contents)  # 合并文件
with open("./datas/many_texts.txt", "w", encoding="utf-8") as fout:
    fout.write(final_content)

 方法1:按行读取   
for line in fin  
方法2:一次读取所有内容到一个字符串  
content=fin.read()  

many_texts

文件001内容-01
文件001内容-02
文件001内容-03
文件001内容-04
文件001内容-05

文件002内容-01
文件002内容-02
文件002内容-03
文件002内容-04
文件002内容-05

文件003内容-01
文件003内容-02
文件003内容-03
文件003内容-04
文件003内容-05
  1. 统计每个兴趣的学生人数
like_count = {}

with open("./datas/student.like.txt", "r", encoding="utf-8") 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] = 0
            like_count[like] += 1
print(like_count)

student.like.txt

小张 篮球,羽毛球
小王 篮球,乒乓球,台球
小李 篮球,台球
小强 羽毛球
  1. 获取当前的日期和时间
import datetime

curr_datetime = datetime.datetime.now()
print(curr_datetime, type(curr_datetime))

str_time = curr_datetime.strftime("%Y-%m-%d %H:%M:%S")
print("str_time", str_time)

print("year", curr_datetime.year)
print("month", curr_datetime.month)
print("day", curr_datetime.day)
print("hour", curr_datetime.hour)
print("minute", curr_datetime.minute)
print("second", curr_datetime.second)
  1. 计算两个日期相隔的天数
import datetime

birthday = "1997-12-20"
birthday_date = datetime.datetime.strptime(birthday, "%Y-%m-%d")  # 转换成时间对象
print(birthday_date, type(birthday_date))
curr_datetime = datetime.datetime.now()
print(curr_datetime, type(curr_datetime))

minus_datetime = curr_datetime - birthday_date
print(minus_datetime.days)
print(minus_datetime / 365)
  1. 计算任意日期7天前的日期
import datetime


def get_diff_days(pdate, days):
    pdate_obj = datetime.datetime.strptime(pdate, "%Y-%m-%d")
    time_gap = datetime.timedelta(days=days)
    pdate_result = pdate_obj - time_gap
    return pdate_result.strftime("%Y-%m-%d")


print(get_diff_days("2021-04-28", 1))
print(get_diff_days("2021-04-28", 3))
print(get_diff_days("2021-04-28", 7))
print(get_diff_days("2021-04-01", 3))
  1. 计算日期范围的所有日期
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_list


begin_date = "2021-04-28"
end_date = "2021-05-03"
date_list = get_date_range(begin_date, end_date)
print(date_list)
  1. 将unix时间戳转换成格式化日期
import datetime

unix_time = 1620747647
datetime_obj = datetime.datetime.fromtimestamp(unix_time)
datetime_str = datetime_obj.strftime("%Y-%m-%d %H:%M:%S")
print(datetime_str)
  1. 正则表达式判断字符串是否是日期
import re


def date_is_right(date):
    return re.match("\d{4}-\d{2}-\d{2}", date) is not None


date1 = "2021-05-20"
date2 = "2021/05-20"
date3 = "202-05-20"
date4 = "20210520"
date5 = "202a05-20"

print(date1, date_is_right(date1))
print(date2, date_is_right(date2))
print(date3, date_is_right(date3))
print(date4, date_is_right(date4))
print(date5, date_is_right(date5))

31.自动提取电子邮箱地址

content = """
寻隐者1234@qq.com不予
作python666@163.cn者:贾岛
"""

import re

pattern = re.compile(r"""
[a-zA-Z0-9_-]+
@
[a-zA-Z0-9]+
.
[a-zA-Z]{2,4}
""", re.VERBOSE)
results = pattern.findall(content)
for result in results:
    print(result)
  1. 验证用户密码是否规范
"""
写一个函数,验证密码是否满足条件
1.长度位于[6,20]之间
2.必须包含至少1个小写字母
3.必须包含至少1个大写字母
4.必须包含至少1个数字
5.必须包含至少1个特殊字符

返回
True,None
或者 False,原因
"""
import re


def check_password(password):
    if not 6 <= len(password) <= 20:
        return False, "密码必须在6~20之间"
    if not re.findall(r"[a-z]", password):
        return False, "必须包含至少一个小写字母"
    if not re.findall(r"[A-Z]", password):
        return False, "必须包含至少一个大写字母"
    if not re.findall(r"[0-9]", password):
        return False, "必须包含至少一个数字"
    if not re.findall(r"[^0-9a-zA-Z]", password):
        return False, "必须包含至少一个特殊字符"
    return True, None


print("Helloworld#666", check_password("Helloworld#666"))
print("Helloworld#", check_password("Helloworld#"))
print("elloworld#666", check_password("elloworld#666"))
print("Helloworld666", check_password("Helloworld666"))
  1. 提取商品价格
content = """
小明上街买菜
买了1斤黄瓜花了8元;
买了2斤葡萄花了13.5元;
买了3斤白菜花了5.4元;
"""
# 要求提取(1、黄瓜、8)、(2、葡萄、13.5)、(3、白菜、5.4)
import re

for line in content.split("\n"):
    pattern = r"(\d)斤(.*)花了(\d+(.\d+)?)元"
    match = re.search(pattern, line)
    if match:
        print(f"{match.group(1)}\t{match.group(2)}\t{match.group(3)}")
# 正则表达式加上{} 是分组概念match.group()
  1. 给文章中的手机号打上马赛克效果
content = """
百日依山尽19989881888,黄河如8766897
欲穷12345千里目,更上15619291821一层楼
"""

import re

pattern = r"(1[3-9])\d{9}"
print(re.sub(pattern, r"\1####", content))
  1. 进行多种日期格式的标准化
# 目标 2021-05-28
content = """
白日依2021/05/26山尽,黄河入2021.05.27海流。
欲穷05-28-2020千里目,更上5/29/2020一层楼。
"""
import re

content = re.sub(r"(\d{4})/(\d{2})/(\d{2})", r"\1-\2-\3", content)
print(content)
content = re.sub(r"(\d{4}).(\d{2}).(\d{2})", r"\1-\2-\3", content)
print(content)
content = re.sub(r"(\d{2})-(\d{2})-(\d{4})", r"\3-\1-\2", content)
print(content)
content = re.sub(r"(\d{1})/(\d{2})/(\d{4})", r"\3-0\1-\2", content)
print(content)
  1. 实现英文分词计算词频
import re

with open("./datas/Beginner Guide to Python.txt", "r", encoding="utf-8") as fin:
    content = fin.read()
# print(content)

words = re.split(r"[\s.()-?!]+", content)
# print(words)
import pandas as pd

print(pd.Series(words).value_counts()[:20])

Beginner Guide to Python.txt

Certainly! Here's a short English text of approximately 100 words:

37.实现中文文章分词

import re

content = """
在金色的秋季里,我独自漫步于枫叶铺就的小径上。
每一步都伴随着落叶的沙沙声,宛如自然界的低语。
微风拂过,带起一片片红黄相间的叶子,它们在空中轻盈地旋舞,
最终缓缓落回大地的怀抱。秋天的天空是那么高远,湛蓝而明净,
就像洗涤过的心灵。这一刻,我感受到了宁静与和谐,心中涌起一股深深的感激。
自然的美丽总是无言却能触动灵魂,让人忘却尘世的烦恼。
"""
import jieba
import re

content = re.sub(r"[\s,。、]", "", content)
word_list = jieba.cut(content)
print(list(word_list))
  1. 统计小说中的人名
content = "李明喜欢韩梅梅,他两早恋啦"
import jieba.posseg as posseg

for word, flag in posseg.cut(content):
    if flag == "nr":
        print(word, flag)

import pandas as pd

print(pd.Series(word).value_counts()[:10])
  1. 将数组逆序输出
a = [1, 2, 4, 5]
for i in range(0, (len(a) - 1) // 2):
    temp = a[i]
    a[i] = a[len(a) - i - 1]
    a[len(a) - i - 1] = temp
print(a)
# 核心 确定中间值 (数组)-1/2

40.统计1-100的和

sum = 0
for i in range(0, 101):
    sum += i
print(sum)

41.两个量值互换

a = 10
b = 20
# 第三方变量
# c = a
# a = b
# b = c
# print(a, b)
# 加减法
# a = a + b
# b = a - b
# a = a - b
# print(a, b)
# 语言特性 python
a, b = b, a
print(a, b)

#  核心原理
"""
a1=a0+b0
b1=a1-b0
    a0+b0-b0=a0
a2=a1-b1
a0+b0-a0=b0
    
"""

42.数字比较

i = 10
j = 20
if i > j:
    print(">")
elif i == j:
    print("==")
elif i < j:
    print("<")
else:
    print("未知")
  1. 创建匿名函数
POWER = lambda x, y: x ** y
print(POWER(2, 4))
  1. 输出一个随机数
import random

print(random.randint(10, 20))  # 随机整数
print(random.random())  # 随机0-1
print(random.uniform(10, 20))  # 随机浮点数