J'ai essayé de refactoriser le code de Python débutant (lycéen)

Un programme Python écrit par un lycéen. C'était bien fait pour la première fois. Au début, vous pouvez utiliser n'importe quel style d'écriture. Je pense.

Cependant, pour pouvoir créer des programmes difficiles, il est important d'organiser votre esprit et de rendre le programme facile à comprendre. J'ai réécrit ce programme à titre d'exemple.

Programme original

J'ai pu dessiner une belle figure. C'est merveilleux de concevoir un moyen de mettre des nuances colorées. Je l'ai fait en examinant attentivement les conditions de l'instruction if et la formule de calcul.

number = int(input("Combien de cercles dessinez-vous?"))
R = 1.0
G = 0.0
B = 0.0
color = 0
from turtle import *
delay(5)
shape("turtle")
for i in range(number):
    color = int(360/number*i)
    if color <= 60:
        R = 1.0
        G = color/60
        B = 0.0
    elif color <= 120:
        R = 2.0-color/60
        G = 1.0
        B = 0.0
    elif color <= 180:
        R = 0.0
        G = 1.0
        B = color/60-2.0
    elif color <= 240:
        R = 0.0
        G = 4.0-color/60
        B = 1.0
    elif color <= 300:
        R = color/60-4.0
        G = 0.0
        B = 1.0
    elif color <= 360:
        R = 1.0
        G = 0.0
        B = 6.0-color/60

    pencolor(R,G,B)
    circle(100)
    left(360/number)
done()

Résultat d'exécution lessen_turtle.png

Commencez à cuisiner

importer les mouvements en premier La partie permettant de trouver la valeur RVB est fonctionnalisée Je ne vois pas la régularité de la formule dans l'instruction if. Je pense que cela a été fait par essais et erreurs. Changé en une expression régulière qui donne le même résultat. L'expression conditionnelle de l'instruction if contient =, mais le résultat ne change pas même si = est supprimé. Couleur Étant donné que la plage va de 0 à 359, il semble plus approprié de ne pas ajouter =.

import turtle

def color2rgb(color):
    if color < 60:
        R = 1.0
        G = color/60
        B = 0.0
    elif color < 120:
        R = 1.0-(color-60)/60
        G = 1.0
        B = 0.0
    elif color < 180:
        R = 0.0
        G = 1.0
        B = (color-120)/60
    elif color < 240:
        R = 0.0
        G = 1.0-(color-180)/60
        B = 1.0
    elif color < 300:
        R = (color-240)/60
        G = 0.0
        B = 1.0
    elif color < 360:
        R = 1.0
        G = 0.0
        B = 1.0-(color-300)/60
    return(R, G, B)

def draw(number):
    turtle.delay(5)
    turtle.shape("turtle")
    for i in range(number):
        color = int(360 / number * i)
        turtle.pencolor(color2rgb(color))
        turtle.circle(100)
        turtle.left(360 / number)
    turtle.done()

number = int(input("Combien de cercles dessinez-vous?"))
draw(number)

plus loin

Si vous regardez de près color2rgb (), les valeurs de R, V et B ont la même forme avec un déphasage de 120. Vous pouvez également arrêter l'instruction if et créer une table. Mais si vous en faites un tableau, ce sera un peu moins lisible. Faisons cela.

import turtle

def color2r(color):
    color = color % 360
    if color < 60:
        R = 1.0
    elif color < 120:
        R = 1.0-(color-60)/60
    elif color < 180:
        R = 0.0
    elif color < 240:
        R = 0.0
    elif color < 300:
        R = (color-240)/60
    elif color < 360:
        R = 1.0
    return R

def color2rgb(color):
    return color2r(color), color2r(color-120), color2r(color-240)

def draw(number):
    turtle.delay(5)
    turtle.shape("turtle")
    for i in range(number):
        color = int(360 / number * i)
        turtle.pencolor(color2rgb(color))
        turtle.circle(100)
        turtle.left(360 / number)
    turtle.done()

number = int(input("Combien de cercles dessinez-vous?"))
draw(number)

Édition supplémentaire

En regardant les commentaires que j'ai reçus, l'image a gonflé, alors j'ai fait une version de table de fonction. Je ne sais pas si c'est facile à lire, mais j'aime ça.

import turtle

convert_func_table = [lambda x: 1.0, lambda x:1.0-x/60, lambda x:0, lambda x:0, lambda x:x/60, lambda x:1.0]

def convert(i,fine):
    return convert_func_table[i%6](fine)

def color2rgb(color):
    i, fine = divmod(color, 60)
    return (
        convert(i, fine),
        convert(i+4, fine),
        convert(i+2, fine),
    )

def draw(number):
    turtle.delay(5)
    turtle.shape("turtle")
    for i in range(number):
        color = int(360/number*i)
        turtle.pencolor(color2rgb(color))
        turtle.circle(100)
        turtle.left(360/number)
    turtle.done()

number = int(input("Combien de cercles dessinez-vous?"))
draw(number)

Merci K d'avoir fourni le programme.

Recommended Posts

J'ai essayé de refactoriser le code de Python débutant (lycéen)
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé de résumer les opérations de chaîne de Python
[Python] Un lycéen a implémenté Perceptron et a essayé de classer les iris.
Programmation débutant (lycéen) Optimiser l'algorithme créé
J'ai essayé de trouver l'entropie de l'image avec python
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
J'ai écrit le code pour écrire le code Brainf * ck en python
De zéro connaissance de Python à la création d'IA en première année du collège
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
(Python) J'ai essayé d'analyser 1 million de mains ~ J'ai essayé d'estimer le nombre d'AA ~
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
J'ai essayé de rationaliser le rôle standard des nouveaux employés avec Python
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé de refactoriser le code du modèle publié dans "Obtenir des images de l'API Flickr avec Python" (Partie 2)
[Python] J'ai essayé de juger l'image du membre du groupe d'idols en utilisant Keras
J'ai essayé de visualiser facilement les tweets de JAWS DAYS 2017 avec Python + ELK
J'ai essayé d'automatiser le dépôt de 100 yens des courses de chevaux Rakuten (python / sélénium)
J'ai essayé d'envoyer automatiquement la littérature du nouveau virus corona à LINE avec Python
J'ai essayé de représenter graphiquement les packages installés en Python
J'ai essayé de résumer comment utiliser matplotlib de python
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
[Python] J'ai essayé de représenter graphiquement le top 10 des ombres à paupières
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé d'effacer la partie négative de Meros
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai senti que j'avais porté le code Python en C ++ 98.
[Python] J'ai essayé d'obtenir Json de squid ring 2
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé d'exécuter l'exemple de code du module Ansible
Python pratique 100 coups J'ai essayé de visualiser l'arbre de décision du chapitre 5 en utilisant graphviz
mong - J'ai essayé de porter le code qui génère de manière aléatoire le nom du conteneur Docker vers Python -
La génération combinée des débutants Python (lycéens) était en diagonale au-dessus (génération combinée par traitement récursif)
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
Le 15e temps réel hors ligne, j'ai essayé de résoudre le problème de l'écriture avec python
[Courses de chevaux] J'ai essayé de quantifier la force du cheval de course
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé de résumer le code souvent utilisé dans Pandas
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
J'ai essayé d'énumérer les différences entre java et python
J'ai essayé de combattre le minimum local de la fonction Goldstein-Price
J'ai essayé de changer le script python de 2.7.11 à 3.6.0 sur Windows10
J'ai essayé d'implémenter le blackjack du jeu Trump en Python
J'ai essayé de résoudre le problème de F02 comment écrire en temps réel hors ligne avec Python
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
J'ai essayé de toucher Python (installation)