Python et LaTeX avec paramètres

Bonjour à toutes et à tous,
meilleurs vœux à vous et tous vos proches !

Je souhaiterais améliorer la ligne de code suivante de mon programme Python:
Texte=r"$\int_{a}^{b}$"+ t + "$dx$ = "+str(I)
qui permet d'afficher $\int_a^bf(x)dx$ à partir de l'entrée de la fonction $f$ en tant que string (laissez tomber les vannes, je les ai toutes faites). J'ai trouvé plus élégant d'avoir une string convertie par "eval()" en une fonction qu'une entrée en "lambda x:f(x)", et c'est surtout bien plus facile pour des élèves ;)

Je cherche à ce que les paramètres $a$ et $b$ qui sont donnés dans la fonction soient modifiés dans l'affichage, merci de votre aide,
amicalement,
F.D.

Réponses

  • Bonjour,

    Si j'ai bien compris la demande, quelque chose comme ceci devrait convenir :
    texte=r"$\int_{a}^{b}{f} \mathrm{{dx}} = {rhs}$".format(a=a, b=b, f=t, rhs=I)
    
    Il y a des variantes possibles du genre :
    texte=r"$\int_{a}^{b}{f} \mathrm{{dx}} = {rhs}$".format(**d)
    
    en supposant que d est un dictionnaire (un mapping) avec les bonnes clés ('a', 'b', 'f', 'rhs'), voire en utilisant les f-strings avec Python >= 3.6 (celle-là, t'as pas dû la faire...) :
    a = 0 # ou une string
    b = 1 # idem, etc.
    f = "x^2
    rhs = r"\frac{1}{3}"
    texte = rf"$\int_{a}^{b}{f} \mathrm{{dx}} = {rhs}$"
    
  • Bonsoir,

    merci beaucoup mais je ne comprends encore la réponse, je m'y colle ce soir

    F.D.
  • Re-bonsoir,

    ok petit défaut de ta première solution: a est un caractère mais pas une string donc avec -1 ça ne fonctionne pas :)

    j'étudie la troisième :)

    merci beaucoup en tout cas

    F.D.
  • Qu'est-ce que ça veut dire ? En Python, un caractère est une string de longueur 1, rien d'autre. Il y a aussi le type bytes, mais c'est autre chose.

    Poste le code qui ne marche pas, car là, c'est difficile à comprendre, du moins pour moi...
  • Bonsoir,

    pb résolu mais je ne sais pas pourquoi il y avait un pb, j'ai regardé la doc python sur str.format et dans les exemples ils prennent coord.format(latitude='38.40N') qui aurait dû marcher,

    j'ai repris ton code et j'ai fait inf='{'+str(a)+'}' (inf pour la borne inf) et ça marche.

    Je pense que ça vient de ma distribution python ou du cacractère atroce de mon PC, récemment il refusait u_n pour écrire $u_n$ en LaTeX... 3 installations de MikTeX plus tard... lol tout marche...

    Merci beaucoup!

    Très amicalement

    F.D.
  • OK, plutôt que de mettre des choses comme '{'+str(a)+'}' en argument de str.format(), tu peux aussi mettre les '{' et '}' dont tu as besoin pour LaTeX directement dans la chaîne que j'appelerais « modèle » (celle qui devient le 'self' de str.format()) comme j'ai fait dans mes exemples, en doublant ces caractères (c'est str.format() qui remplace '{{' par '{' et '}}' par '}').
  • Bonjour,

    j'ai essayé figure-toi mais il n'a alors pas interprété le a=a dans .format()...?

    Il faudra que je me penche sur les f-string, ça a l'air cool :)

    Merci beaucoup

    F.D.
  • Si tu veux que a soit remplacé et qu'il ait des accolades autour dans la chaîne obtenue, il faut mettre trois '{' et trois '}', comme ça :
    "{{{a}}}".format(a=2)
    -> '{2}'
    
    (la deuxième ligne indique juste ce qu'on obtient de la première, on peut tester ça dans la console Python, p. ex.)

    Les f-strings, c'est à peu près pareil que str.format(), il n'y a guère que la syntaxe qui est allégée et le fait que ça pioche les variables à remplacer dans le scope courant.

    Autre précision (pour plus tard) : un des trucs chouettes avec str.format(), c'est que si tu as une classe qui implémente __str__() correctement (ne prend pas d'argument autre que 'self' et renvoie une string), alors tu peux utiliser directement les instances de cette classe avec str.format(), il n'y a pas besoin d'appeler str() dessus :
    class A:
        def __str__(self):
            return "une chaîne"
    
    a = A()
    print("Je suis {}.".format(a)) # pas besoin de faire str(a)
    

    En fait, c'est beaucoup plus puissant que ça : une classe peut implémenter son propre mini-langage de formatage, autrement dit renvoyer une représentation-chaîne qui dépend des trucs qui vont après le signe deux-points dans "{machin:...}".format(), comme quand on donne la précision pour convertir un flottant, ou la base pour convertir un entier (toujours avec str.format()). De mémoire, les objets du module 'datetime' utilisent cela.
  • Bonjour et encore merci Brian de m'avoir guidé et franchement aidé pour résoudre mon problème,

    je pense que je ne suis pas encore au point en POO, ce n'était pas du tout ma formation (en licence MAths-Info et deug MIAS, on n'allait pas sur l'Objet ;) ) mais il faut que j'apprenne à penser comme ça,

    tu m'as donné là bien du grain à moudre (après mon inspection du coup),

    très amicalement,

    F.D.
Connectez-vous ou Inscrivez-vous pour répondre.