Python基础编程题-练习一

题目一

斐波那契数列的前两项都是1。从第三项开始,每项是前两项的和。
即: 1、1.2、3、5、8、…编写程序利用列表计算:
1)斐波那契数列的前30项并输出
2)斐波那契数列1000以内的项并输出

解题思路

斐波那契数列的前两项都是1。从第三项开始,每项是前两项的和。本题要求计算前30项和小于等于1000的斐波那契数列,可以使用列表和循环结构实现。在计算前30项时,定义一个长度为2的列表来保存前两项,随后通过循环来计算列表中剩下的项。计算小于等于1000的斐波那契数列时,同样可以定义一个数组来保存前两项,并通过while循环来计算小于等于1000的斐波那契数列。

代码实现

# 计算前30项
fibonacci_list = [1, 1]
for i in range(2, 30):
    fibonacci_list.append(fibonacci_list[i-1] + fibonacci_list[i-2])
print('前30项斐波那契数列为:', fibonacci_list)

# 计算小于等于1000的所有项
fibonacci_list = [1, 1]
a, b = 1, 1
while a + b <= 1000:
    a, b = b, a + b
    fibonacci_list.append(b)

print('小于等于1000的斐波那契数列为:', fibonacci_list)

运行截图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q1r3RvLy-1684573333432)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230519105842909.png)]

题目二

现有 priceA.txt、priceB.txt 两个文件,分别存放药房A和药房B的药品单价信息,要求将药房B的药品价格与药房A的进行合并,按药品名称长度降序输出,价格也要求对齐。如果药品名称在药房A和药房B中都存在,则以药房A的价格为准,如药房B中存在没有在药房A中出现的药品,则保持药房B中原有的价格不变。

解题思路

我们可以利用Python的字典数据结构来存储药品和单价的信息。首先读取 priceA.txt 文件,将其中的药品和单价信息存储到一个字典中。接下来再读取 priceB.txt 文件,根据题目要求进行合并:如果药品在药房A和药房B中都存在,则使用药房A的价格;如果药品只在药房B中存在,则将该药品和单价信息加入字典中;如果药品只在药房A中存在,则无需做任何处理。最后,我们按照药品名称长度降序输出字典中的药品和价格信息即可,需要注意价格的对齐。

代码实现

# 读取药房A的药品和单价信息
price_a = {
    
    }
with open('priceA.txt', encoding='utf-8') as f:
    for line in f.readlines():
        name, price = line.strip().split(',')
        price_a[name] = float(price)

# 合并药房B的药品和单价信息
price_b = {
    
    }
with open('priceB.txt', encoding='utf-8') as f:
    for line in f.readlines():
        name, price = line.strip().split(',')
        if name in price_a:
            price_b[name] = price_a[name]
        else:
            price_b[name] = float(price)

# 将两个字典合并
price = {
    
    **price_a, **price_b}

# 按药品名称长度降序排序并输出
print('{:^20} {:^10}'.format('药品名称', '单价'))
print('-' * 30)
for name, price in sorted(price.items(), key=lambda x: len(x[0]), reverse=True):
    print('{:<20} {:>10.2f}'.format(name, price))

运行截图

在这里插入图片描述

题目三

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

题目分析

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

为了实现这个程序,我们需要逐步分析每一个小问题。具体分析如下:

  1. 怎么查看Python所有保留字?
    • Python中所有的保留字都保存在keyword模块中。我们可以通过导入该模块,并调用它提供的kwlist变量来获取保留字列表。
  2. 怎么读取Python源文件的内容?
    • 我们可以使用Python内置函数open()打开Python源文件,然后使用read()方法读取文件内容。
  3. 怎么将源文件内容解析成AST树?
    • Python标准库中的ast模块提供了将Python代码解析成AST(抽象语法树)的功能,我们可以使用该模块中的parse()函数将文件解析成AST树。
  4. 怎么修改AST树中的标识符名称?
    • 在AST中,标识符通常表示成Name节点。我们可以遍历整棵AST树,找到Name节点,然后根据需要修改其id属性(即标识符名称)。
  5. 怎么处理内置方法名?
    • 一些内置方法名既是保留字,又是内置函数。我们要特殊处理这些标识符,不能将其名称全部转换成大写,否则程序会出错。
  6. 怎么将修改后的代码重新生成字符串,并写入到新的文件中?
    • 修改了AST树中的节点之后,我们需要将修改后的代码重新生成字符串形式。这可以使用ast模块中的unparse()函数,将修改后的AST树转换回Python源程序字符串。然后,我们就可以将修改后的代码写入到新的文件中。

经过以上分析,我们就可以着手编写程序了。具体的解题思路和代码实现如下。

解题思路

  1. 读取源文件的内容,并解析成AST树。
  2. 遍历AST树中的所有标识符,对非保留字的小写标识符进行大小写转换。
  3. 将修改后的AST树重新生成Python源程序字符串。
  4. 将修改后的字符串写入到新的文件中。

代码实现

import ast
import keyword


# 将标识符名称按照需要进行大小写转换
def normalize_name(name):
    if not keyword.iskeyword(name) and not hasattr(__builtins__, name):
        return name.upper()
    return name


# 将函数定义中的参数列表进行大小写转换
def normalize_arguments(args):
    for arg in args.args:
        arg.arg = normalize_name(arg.arg)


# 打开源文件并读取源代码
with open('源程序.py', 'r', encoding='utf-8') as source_file:
    source_code = source_file.read()

# 将源代码解析成AST树
root = ast.parse(source_code)

# 对AST树中的标识符进行修改
for node in ast.walk(root):
    if isinstance(node, ast.Name):
        node.id = normalize_name(node.id)
    elif isinstance(node, ast.FunctionDef):
        node.name = normalize_name(node.name)
        normalize_arguments(node.args)
    elif isinstance(node, ast.Attribute) and isinstance(node.value, ast.Name):
        if not keyword.iskeyword(node.attr) and not hasattr(__builtins__, node.attr):
            node.attr = node.attr.upper()
            node.value.id = node.value.id.upper()

# 重新生成修改后的代码
modified_code = ast.unparse(root)

# 打开目标文件并写入修改后的代码
with open('新文件.py', 'w', encoding='utf-8') as target_file:
    target_file.write(modified_code)

运行截图

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_67268191/article/details/130783529