Grundlegende Fragen zur Python-Programmierung – Übung 1

Thema eins

Die ersten beiden Terme der Fibonacci-Folge sind beide 1. Ab dem dritten Term ist jeder Term die Summe der beiden vorherigen.
Das heißt: 1, 1,2, 3, 5, 8, ... Schreiben Sie ein Programm, um anhand der Liste Folgendes zu berechnen:
1) Die ersten 30 Elemente der Fibonacci-Folge und Ausgabe
2) Die Elemente innerhalb von 1000 der Fibonacci-Folge und Ausgabe

Ideen zur Problemlösung

Die ersten beiden Terme der Fibonacci-Folge sind beide 1. Ab dem dritten Term ist jeder Term die Summe der beiden vorherigen. Diese Frage erfordert die Berechnung der ersten 30 Elemente und der Fibonacci-Folge kleiner oder gleich 1000, was durch die Verwendung einer Liste und einer Schleifenstruktur realisiert werden kann. Definieren Sie bei der Berechnung der ersten 30 Elemente eine Liste mit der Länge 2, um die ersten beiden Elemente zu speichern, und berechnen Sie dann die verbleibenden Elemente in der Liste über eine Schleife. Wenn Sie die Fibonacci-Folge kleiner oder gleich 1000 berechnen, können Sie auch ein Array definieren, um die ersten beiden Elemente zu speichern, und eine While-Schleife verwenden, um die Fibonacci-Folge kleiner oder gleich 1000 zu berechnen.

Code

# 计算前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)

Screenshot ausführen

[Externer Link-Bildtransfer fehlgeschlagen, die Quellseite verfügt möglicherweise über einen Anti-Diebstahl-Link-Mechanismus, es wird empfohlen, das Bild zu speichern und direkt hochzuladen (img-q1r3RvLy-1684573333432) (C:\Users\Administrator\AppData\Roaming\Typora \typora-user-images\ image-20230519105842909.png)]

Thema zwei

Es gibt zwei Dateien, preisA.txt und preisB.txt, in denen die Einzelpreisinformationen von Apotheke A und Apotheke B gespeichert sind. Es ist erforderlich, die Arzneimittelpreise von Apotheke B mit denen von Apotheke A zusammenzuführen und in absteigender Reihenfolge auszugeben entsprechend der Länge der Medikamentennamen, und auch die Preise müssen angeglichen werden. . Wenn der Arzneimittelname sowohl in Apotheke A als auch in Apotheke B vorhanden ist, gilt der Preis in Apotheke A. Wenn es in Apotheke B ein Arzneimittel gibt, das in Apotheke A nicht erscheint, bleibt der ursprüngliche Preis in Apotheke B unverändert.

Ideen zur Problemlösung

Wir können die Wörterbuchdatenstruktur von Python verwenden, um Informationen zu Medikamenten- und Stückpreisen zu speichern. Lesen Sie zunächst die Datei „priceA.txt“ und speichern Sie die Arzneimittel- und Stückpreisinformationen in einem Wörterbuch. Lesen Sie als Nächstes die Datei „priceB.txt“ und führen Sie sie gemäß den Titelanforderungen zusammen: Wenn das Arzneimittel sowohl in Apotheke A als auch in Apotheke B vorhanden ist, verwenden Sie den Preis von Apotheke A; wenn das Arzneimittel nur in Apotheke B vorhanden ist, kombinieren Sie das Arzneimittel mit dem Stückpreis Die Informationen werden dem Wörterbuch hinzugefügt; wenn das Medikament nur in Apotheke A vorhanden ist, muss nichts unternommen werden. Schließlich können wir die Arzneimittel- und Preisinformationen im Wörterbuch in absteigender Reihenfolge entsprechend der Länge des Arzneimittelnamens ausgeben und müssen auf die Ausrichtung der Preise achten.

Code

# 读取药房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))

Screenshot ausführen

Fügen Sie hier eine Bildbeschreibung ein

Thema drei

Schreiben Sie ein Programm, lesen Sie eine Python-Quellprogrammdatei, ersetzen Sie alle Kleinbuchstaben in der Datei mit Ausnahme reservierter Wörter durch Großbuchstaben, und die generierte Datei muss vom Python-Interpreter korrekt ausgeführt werden können.

Themenanalyse

Für diese Frage muss ein Programm geschrieben werden, das eine Python-Quellprogrammdatei liest und alle Kleinbuchstaben in der Datei mit Ausnahme reservierter Wörter durch Großbuchstaben ersetzt. Die generierte Datei muss vom Python-Interpreter korrekt ausgeführt werden können.

Um dieses Programm umzusetzen, müssen wir jedes kleine Problem Schritt für Schritt analysieren. Die spezifische Analyse lautet wie folgt:

  1. Wie kann ich alle reservierten Wörter in Python anzeigen?
    • Alle reservierten Wörter in Python werden im Schlüsselwortmodul gespeichert. Wir können die Liste der reservierten Wörter erhalten, indem wir dieses Modul importieren und die von ihm bereitgestellte Variable kwlist aufrufen.
  2. Wie lese ich den Inhalt einer Python-Quelldatei?
    • Wir können die in Python integrierte Funktion open() verwenden, um eine Python-Quelldatei zu öffnen, und dann die Methode read() verwenden, um den Dateiinhalt zu lesen.
  3. Wie kann der Inhalt der Quelldatei in einen AST-Baum analysiert werden?
    • Das ast-Modul in der Python-Standardbibliothek bietet die Funktion, Python-Code in AST (abstrakten Syntaxbaum) zu analysieren. Wir können die Funktion parse() in diesem Modul verwenden, um die Datei in einen AST-Baum zu analysieren.
  4. Wie ändere ich den Bezeichnernamen im AST-Baum?
    • In AST werden Bezeichner normalerweise als Namensknoten dargestellt. Wir können den gesamten AST-Baum durchlaufen, den Namensknoten finden und dann sein ID-Attribut (d. h. den Bezeichnernamen) nach Bedarf ändern.
  5. Was tun mit integrierten Methodennamen?
    • Einige integrierte Methodennamen sind sowohl reservierte Wörter als auch integrierte Funktionen. Wir müssen diese Bezeichner besonders behandeln und können nicht alle ihre Namen in Großbuchstaben umwandeln, sonst macht das Programm einen Fehler.
  6. Wie kann ich den geänderten Code in eine Zeichenfolge neu generieren und in eine neue Datei schreiben?
    • Nachdem wir die Knoten im AST-Baum geändert haben, müssen wir den geänderten Code in eine Zeichenfolgenform neu generieren. Dies kann mit der Funktion unparse() im ast-Modul erfolgen, die den geänderten AST-Baum zurück in eine Python-Quellprogrammzeichenfolge umwandelt. Anschließend können wir den geänderten Code in eine neue Datei schreiben.

Nach der obigen Analyse können wir mit dem Schreiben von Programmen beginnen. Die spezifischen Ideen zur Problemlösung und Codeimplementierung sind wie folgt.

Ideen zur Problemlösung

  1. Lesen Sie den Inhalt der Quelldatei und analysieren Sie ihn in einen AST-Baum.
  2. Durchlaufen Sie alle Bezeichner im AST-Baum und führen Sie eine Groß-/Kleinschreibung für Bezeichner in Kleinbuchstaben durch, bei denen es sich nicht um reservierte Wörter handelt.
  3. Generieren Sie den geänderten AST-Baum neu in eine Python-Quellprogrammzeichenfolge.
  4. Schreiben Sie die geänderte Zeichenfolge in eine neue Datei.

Code

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)

Screenshot ausführen

Fügen Sie hier eine Bildbeschreibung ein

Ich denke du magst

Origin blog.csdn.net/m0_67268191/article/details/130783529
Empfohlen
Rangfolge