Wikilivres frwikibooks https://fr.wikibooks.org/wiki/Accueil MediaWiki 1.47.0-wmf.5 first-letter Média Spécial Discussion Utilisateur Discussion utilisateur Wikilivres Discussion Wikilivres Fichier Discussion fichier MediaWiki Discussion MediaWiki Modèle Discussion modèle Aide Discussion aide Catégorie Discussion catégorie Transwiki Discussion Transwiki Wikijunior Discussion Wikijunior TimedText TimedText talk Module Discussion module Event Event talk Analyse 0 19 767330 757170 2026-06-02T15:02:34Z DavidL 1746 767330 wikitext text/x-wiki {{Page de garde|image=Nuvola apps kmplot.svg|description= Ce livre a pour but de présenter à des étudiants du niveau du baccalauréat l<nowiki>'</nowiki>'''analyse''', une branche des mathématiques constituée du calcul différentiel et intégral et des domaines associés. |avancement=Avancé |cdu= * {{CDU item|5|51}} |versions= {{Autres projets |wikt=Analyse |w=Analyse |s=Analyse}} }} == Qu'est-ce que l'analyse ? == L'analyse, c'est l'étude des fonctions, des équations, des applications et de leurs propriétés. Mais c'est principalement l’étude des fonctions. Cet ouvrage est encore en chantier, et vous êtes libre de modifier son contenu, ou d'apporter votre contribution. == Table des matières == {{/Sommaire}} == Autres livres == * [[Topologie]] {{Wikiversité|Département:Analyse}} [[Catégorie:Mathématiques]] [[Catégorie:Livres en cours de rédaction]] [[Catégorie:Analyse (livre)|*]] 1xt62rsx4czg91zja3qjrn0fbhsa5im Analyse/Introduction 0 20 767332 678093 2026-06-02T15:04:17Z DavidL 1746 767332 wikitext text/x-wiki <noinclude>{{Analyse}}</noinclude> == Qu'est-que l'analyse? == L'[[w:Analyse (mathématiques)|analyse]] est une branche des mathématiques étudiant principalement les fonctions. Prenons l'exemple d'une voiture équipée d'un chronotachygraphe. Enregistrant sur un disque, à intervalles réguliers, les positions et la vitesse de déplacement de la voiture, ce compteur est utilisé aux fins de gestion d'une entreprise de transport. Nous étudions l'enregistrement obtenu au bureau, mais cette fois l'appareil n'a pas bien fonctionné, et il manque le relevé des positions. Dans ce cas, l'analyse de la vitesse du véhicule nous sera utile. Si la voiture roulait à une vitesse constante, alors déterminer la position de la voiture à partir de la vitesse serait un simple problème algébrique. Cependant, tous les automobilistes ne roulent pas à vitesse constante, et la vitesse peut changer instantanément. L'[[algèbre]] ordinaire ne permet pas de répondre à la question, tandis que l'analyse le permet. En effet, nous pouvons utiliser une fonction qui indique la position de la voiture au cours du temps, et une fonction qui renseigne sur la vitesse de la voiture à chaque instant. Posons nous la question suivante : :Est-il possible, connaissant l'une de ces deux fonctions «&nbsp;position&nbsp;» ou «&nbsp;vitesse&nbsp;», de déterminer l'autre fonction ? Il y a deux ramifications importantes de l'analyse, le '''calcul différentiel''' et le '''calcul intégral'''. Le '''calcul différentiel''' se propose de trouver des pentes de courbes représentatives des fonctions. Il s'agit de caractériser ces pentes en calculant une fonction dite "dérivée". Notamment étudiées par Newton et Leibnitz au 18ème siècle, les fonctions dérivées ont été utilisées bien plus tôt en Asie. Dans le cas où l'enregistrement de la vitesse ait été défectueux, nous aurions pu découvrir la vitesse "instantanée" du véhicule (enregistrée à l'instant t) en étudiant l'évolution de ses positions. En revanche, schématiquement, le '''calcul intégral''' procède dans l'autre direction : de la vitesse à la position de la voiture de notre exemple. Il permet, en étudiant les variations de vitesse, de connaître l'évolution de la distance parcourue - c'est à dire de connaître les différentes positions de la voiture au cours du temps. C'est ainsi que le calcul intégral permet, et c'est un rôle fondamental, de mesurer des grandeurs indirectement (la distance parcourue, dans notre exemple). <small>''retour à l<nowiki>'</nowiki>[[analyse]]''</small> [[Catégorie:Analyse (livre)|Introduction]] k80hkoxppcyjbsmllzsjmi5x3if8zhl Analyse/Séries 0 652 767345 759199 2026-06-02T15:07:34Z DavidL 1746 767345 wikitext text/x-wiki <noinclude>{{Analyse}}</noinclude> == Définition et Sommes partielles == Soit <math> (a_n) </math> une suite réelle ou complexe. A celle-ci on peut associer la suite des sommes<math display="block">S_n = \sum_{p = 0}^{n}a_p=a_0+a_1+\cdots+a_n</math> La suite <math>(S_n)</math> ainsi définie est appelée la '''série de terme général''' <math> a_n </math>. Le terme <math> S_n </math> s'appelle la '''somme partielle''' d'ordre <math>n</math> de la série. == Convergence == On dit que la série <math> \sum a_n </math> '''converge''' lorsque la '''suite des sommes partielles''' converge. Dans ce cas, le nombre <math display="block"> S=\lim_{n\to+\infty} S_n~~~~\text{ noté encore }~~\sum_{n=0}^{+\infty}a_n </math>est appelé '''somme''' de la série. Une série qui ne converge pas est dite divergente. Etudier la '''nature''' d'une série consiste à démontrer qu'elle est convergente ou divergente. == Reste d'une série convergente == Dans le cas d'une série convergente de somme <math>S</math>, on appelle '''reste d'ordre''' <math>n</math> le réel <math display="block">R_n=S-S_n=\sum_{p=n+1}^{+\infty}a_p</math>On a toujours <math>\lim R_n=0</math> car la série <math>\sum a_p</math> est convergente. Il est utile de majorer la valeur absolue de <math>R_n</math> pour estimer l'erreur commise lorsque l'on approxime la valeur de <math>S</math> par <math>S_n</math>. == Exemples == * Série de terme général <math>a_n=\frac1{n(n+1)}</math> <math>\forall n\in\mathbb N^*,~ a_n=\frac1n-\frac1{n+1}</math>. On peut donc calculer les sommes partielles <math display="block">S_n=a_1+a_2+\cdots+a_n=\left(1-\frac12\right)+\left(\frac12-\frac13\right)+\cdots+\left(\frac1n-\frac1{n+1}\right)=1-\frac1{n+1}\underset{n\to+\infty}\longrightarrow1</math>La série est donc convergente et on peut écrire <math>\displaystyle\sum_{n=1}^{+\infty}\frac1{n(n+1)}=1</math>. * Série géométrique de terme général <math>a_n=\left(\frac 23\right)^n</math> Les sommes partielles sont données par les formules sur les suites géométriques. <math display="block">S_n=a_0+a_1+\cdots+a_n=\frac{1-\left(\frac 23\right)^{n+1}}{1-\frac 23}=3\left[1-\left(\frac 23\right)^{n+1}\right]\underset{n\to+\infty}\longrightarrow 3</math>On en déduit que la série est convergente et <math>\displaystyle\sum_{n=0}^{+\infty} \left(\frac 23 \right)^n=3</math>. * Série de terme général <math>a_n=\ln\left(1+\frac1n\right)</math> <math>\forall n\in\mathbb N^*,~ a_n=\ln\left(\frac{n+1}n\right)=\ln(n+1)-\ln n</math>. On écrit les sommes partielles qui sont télescopiques <math display="block">S_n=a_1+a_2+\cdots+a_n=(-\ln 1+\ln 2)+(-\ln 2+\ln 3)+\cdots+(-\ln n+\ln(n+1))=\ln(n+1)\underset{n\to+\infty}\longrightarrow+\infty</math>La série est divergente. == Divergence grossière == Lorsque le terme général d'une série ne tend pas vers 0, la série diverge et on dit même qu'elle est '''grossièrement divergente'''. En effet, toute série convergente a un terme général qui tend vers 0. === Démonstration === Soit <math>(S_n)</math> la suite des sommes partielles d'une série convergente vers <math>S</math>. On peut écrire <math>\forall n\in\mathbb N^*,~ a_n=S_n-S_{n-1}\underset{n\to+\infty}\longrightarrow S-S=0</math> ==== Attention. Réciproque fausse ==== On peut se reporter à l'exemple <math>a_n=\ln\left(1+\frac1n\right)</math> vu précédemment. Que le terme général de la série tende vers 0 n'est qu'une '''condition''' '''nécessaire''' de convergence. Elle n'est pas suffisante. == Série harmonique divergente == Un exemple à connaître. Il s'agit de la série de terme général <math> a_n=\frac 1n </math>. Les sommes partielles sont définies par <math display="block"> \forall n\in\mathbb N^*,~ S_n=\sum_{p=1}^n\frac 1p=\frac11+\frac12+\frac13+\cdots+\frac1n </math>On peut montrer que l'on peut minorer <math> S_{2n}-S_n </math> par un réel non nul et donc conclure à la divergence de la série. === Démonstration === <math display="block"> \forall n\in\mathbb N^*,~ S_{2n}-S_n=\sum_{p=n+1}^{2n}\frac 1p\geqslant \sum_{p=n+1}^{2n}\frac1{2n}=n\times\frac1{2n}=\frac12 </math>Si <math> S_n </math> était convergente vers <math> S </math>, alors <math> \frac12\leqslant S_{2n}-S_n\underset{n\to+\infty}\longrightarrow S-S=0 </math> ce qui est contradictoire. == Suites et séries télescopiques == Nous avons pu remarquer sur plusieurs exemples les simplifications effectuées sur les sommes partielles par télescopage. Nous généralisons ici ce phénomène. === Théorème === La suite <math>(a_n)</math> et la série <math>\sum_{n=0}^{+\infty}(a_n-a_{n+1})</math> sont de même nature. === Preuve === Soit <math>S_n</math> la somme partielle d'ordre <math>n</math> de la série <math>\sum_{n=0}^{+\infty}(a_n-a_{n+1})</math>.<math display="block">S_n=\sum_{p=0}^n(a_p-a_{p+1})=\sum_{p=0}^na_p-\sum_{p=0}^na_{p+1}=\sum_{p=0}^na_p-\sum_{p=1}^{n+1}a_p=a_0-a_{n+1}</math>La convergence de <math>(S_n)</math> et donc directement reliée à celle de <math>(a_n)</math>. == '''Etude des séries à termes positifs''' == De nombreux théorèmes sur les séries ne sont valides que lorsque tous les termes de celle-ci sont positifs, au moins à partir d'un certain rang. Voici les principaux. === Sommes partielles === Si tous les termes <math>a_n</math> de la série sont positifs, alors la suite <math>(S_n)</math> des sommes partielles est croissante. Il y a alors équivalence entre majoration et convergence. On en déduit le théorème suivant == Théorème fondamental == Tous les termes <math>a_n</math> étant positifs, la série <math>\sum a_n</math> converge si et seulement si les sommes partielles sont majorées. Tous les <math>a_n</math> étant des réels positifs, <math>\sum a_n \text{ converge }\iff \exists M\in\mathbb R,~ \forall n\in\mathbb N, \sum_{p=0}^na_n\leqslant M</math> == Théorème de comparaison == Soient <math>\sum a_n</math> et <math>\sum b_n</math> deux séries à termes positifs. On suppose qu'au moins à partir d'un certain rang, on a l'inégalité <math>a_n\leqslant b_n</math>. On peut alors affirmer * si <math>\sum b_n</math> converge, alors <math>\sum a_n</math> converge ; * si <math>\sum a_n</math> diverge, alors <math>\sum b_n</math> diverge. La preuve s'effectue immédiatement en utilisant les majorations des sommes partielles. == Théorème d'équivalence == Soient <math>\sum a_n</math> et <math>\sum b_n</math> deux séries à termes positifs. Si <math>a_n\sim b_n</math> au voisinage de <math>+\infty</math>, alors les séries sont de même nature. === Démonstration === Soient <math>\sum a_n</math> et <math>\sum b_n</math> deux séries à termes positifs avec <math>a_n\sim b_n</math> au voisinage de <math>+\infty</math>. Supposons que <math>\sum b_n</math> converge. <math>a_n\sim b_n</math> donc il existe une suite <math>(u_n)</math> de limite 1 telle que, pour tout <math>n</math> à partir d'un certain rang, on a l'égalité <math>a_n=b_n\times u_n</math>. On en déduit <math>\exist n_0\in\mathbb N,~ n\geqslant n_0\implies \frac12\leqslant u_n\leqslant \frac32 ~~~~\text{ d'où }~~~~\frac12b_n\leqslant a_n\leqslant\frac32b_n</math> Par comparaison, on en déduit que les deux séries sont de même nature. === Exemples === * <math>\sum_{n=1}^{+\infty}\ln\left(1+\frac1n\right)~\text{ diverge et est à termes positifs. }\ln\left(1+\frac 1n\right)\sim\frac 1n~~\text{ donc }~~ \sum_{n=1}^{+\infty}\frac 1n~~\text{ diverge.}</math> * <math>\sum_{n=1}^{+\infty}\frac 1{n(n+1)}~\text{ converge et est à termes positifs. }\frac 1{n(n+1)}\sim\frac 1{n^2}~~\text{ donc }~~ \sum_{n=1}^{+\infty}\frac 1{n^2}~~\text{ converge.}</math> == Séries de Riemann == Toute série de la forme <math>\sum\frac 1{n^\alpha}</math> avec <math>\alpha\in\mathbb R</math> est appelée série de Riemann. Exemple : <math>\sum\frac1{n^2}</math> dont on a déjà observé la convergence. === Théorème === <math display="block">\sum_{n=1}^{+\infty}\frac1{n^\alpha} ~~\text{ converge }\iff \alpha>1</math> === Preuves === Pour <math>\alpha=1</math>, on retrouve la série harmonique divergente. Pour <math>\alpha<1</math>, alors <math>n^\alpha \leqslant n</math> lorsque <math>n\geqslant 1</math>. On a donc <math>\frac1{n^\alpha} \geqslant \frac 1n</math> qui est lui-même le terme général d'une série divergente. Par comparaison, on en déduit que la série de Riemann diverge. Pour <math>\alpha>1</math>, on peut comparer la série à l'intégrale du même nom (tracer la courbe représentative de la fonction <math>x\longmapsto \frac 1{x^\alpha}</math> pour mieux comprendre les inégalités qui suivent). <math display="block">\forall p\geqslant 2,~\frac 1{p^\alpha}\leqslant \int_{p-1}^{p}\frac{\rm dx}{x^\alpha}</math>Et on en déduit <math display="block">\sum_{p=2}^n\frac 1{p^\alpha}\leqslant \int_1^n\frac{\rm dx}{x^\alpha}~~~~\text{ qui est convergente pour }\alpha>1</math>ce qui montre par comparaison que la série de Riemann est convergente. ==== Remarque. ==== On peut montrer également ce dernier résultat en posant <math>a_n=\frac 1{n^\beta}</math> avec <math>\beta>0</math> et en affirmant que la suite <math>(a_n)</math> et la série <math>\sum(a_n-a_{n+1})</math> sont de même nature. Comme la suite converge, on en déduit que la série converge aussi. On montre ensuite en utilisant quelques développements limités que le terme général de la série est équivalent à <math>\frac 1{n^{1+\beta}}</math>, ce qui prouve le théorème dans le cas <math>\alpha>1</math>. === Exemple. Constante d'Euler === On donne <math>u_n=\sum_{p=1}^n\frac1p-\ln n</math>. On veut montrer que la suite <math>(u_n)</math> converge, c'est-à-dire que la série harmonique diverge de manière équivalente au logarithme népérien. On s'intéresse alors à la série de terme général <math>u_n - u_{n+1}</math> et on montre qu'elle est convergente. <math>u_n-u_{n+1}=-\frac 1{n+1}+\ln\left(\frac{n+1}n\right)=-\frac 1{n+1}-\ln\left(\frac n{n+1}\right)=-\frac 1{n+1}-\ln\left(1-\frac 1{n+1}\right)</math> <math>~~~~~~~~~~~~~~~~~~=-\frac 1{n+1}-\left[-\frac 1{n+1}-\frac 1{2(n+1)^2}~+o\left(\frac1{n+1}\right)^2\right]=\frac1{2(n+1)^2}+o\left(\frac 1{n+1}\right)^2\sim\frac 1{2n^2}</math> qui est le terme général d'une série convergente d'après la règle de Riemann. On en déduit que <math>(u_n)</math> est une série convergente. Sa limite, notée <math>\gamma</math> est appelée constante d'Euler. C'est le décalage asymptotique entre la série harmonique et le logarithme népérien. Sa valeur est environ 0.577. == Règle de Cauchy == Elle repose sur la comparaison avec une série géométrique, et ne concerne que les séries à termes positifs. === Théorème === # Tous les termes <math>u_n</math> de la série étant strictement positifs, s'il existe un réel <math>a<1</math> tel que à partir d'un certain rang on ait <math>\sqrt[n]{u_n}=u_n^{\frac 1n}\leqslant a<1</math> alors <math>\sum_{n=0}^{+\infty} u_n ~~\text{ converge.}</math> # Si <math>u_n^{\frac 1n}\geqslant 1</math> à partir d'un certain rang, alors la série diverge grossièrement. === Démonstration === # <math>u_n^{\frac 1n}\leqslant a\iff u_n\leqslant a^n.~~~ \sum a^n \text{ converge donc }\sum u_n ~\text{ converge.}</math> # <math>u_n^{\frac 1n}\geqslant 1\iff u_n\geqslant 1</math> donc <math>u_n</math> ne tend pas vers 0 et la série diverge grossièrement. === Corollaire === Les termes <math>u_n</math> de la série étant strictement positifs, si <math>u_n^{\frac 1n}</math> tend vers <math>l\in[0,+\infty]</math>, alors * si <math>l<1</math>, alors la série converge ; * si <math>l>1</math>, alors la série diverge grossièrement ; * si <math>l=1</math>, alors on ne peut conclure (cas douteux de la règle de Cauchy). ==== Preuves ==== Pour <math>l<1</math>, on se ramène au théorème principal en remarquant que tous les termes <math>u_n^{\frac 1n}</math>sont supérieurs à <math>a=\frac{1+l}2\in]l,1[</math> à partir d'un certain rang. Pour <math>l>1</math>, on peut dire que tous les termes <math>u_n^{\frac 1n}</math>sont supérieurs ou égaux à 1 à partir d'un certain rang. === Exemples === <math display="block">\sum_{n=1}^{+\infty}\left(\frac n{2n+1}\right)^n ~\text{ CV } ~~~~~~\sum_{n=1}^{+\infty}\left(1 + \frac 1n\right)^n ~\text{ DV }~~~~~~\sum_{n=1}^{+\infty}\left(1-\frac 1n\right)^n ~\text{cas douteux mais DV.}</math> == Règle de d'Alembert == Elle repose également sur la comparaison avec une série géométrique, et ne concerne que les séries à termes positifs. === Lemme === Si on a <math display="block">\forall n\geqslant p,~ u_n,v_n>0~~~~\text{et}~~~~ \frac{u_{n+1}}{u_n}\leqslant\frac{v_{n+1}}{v_n}</math> alors on en déduit <math display="block">\sum v_n ~\text{CV}\implies\sum u_n ~\text{CV} ~~~~~~\text{ainsi que}~~~~~~\sum u_n ~\text{DV}\implies\sum v_n ~\text{DV}</math> Les quotients <math>\frac{u_{n+1}}{u_n}~~\text{ et }~~\frac{v_{n+1}}{v_n}</math> pourraient être qualifiés de raison instantanée des suites <math>(u_n)</math> et <math>(v_n)</math>. ==== Preuve ==== <math display="block">\forall k\geqslant p,~\frac{u_{k+1}}{u_k}\leqslant\frac{v_{k+1}}{v_k}~~~~\text{donc}~~~~\prod_{k=p}^{n-1}\frac{u_{k+1}}{u_k}\leqslant\prod_{k=p}^{n-1}\frac{v_{k+1}}{v_k}</math>On en déduit <math display="block">\forall n\geqslant p,~ \frac{u_n}{u_p}\leqslant\frac{v_n}{v_p}~~~~\text{ c'est-à-dire }~~ u_n\leqslant\left(\frac{u_p}{v_p}\right)\,v_n</math>On a donc <math>\forall n\geqslant p,~ u_n\leqslant\lambda v_n~~\text{ avec }\lambda \text{ constant.}</math> Par comparaison, si <math>\sum v_n</math> converge, alors <math>\sum\lambda v_n</math> converge, et donc <math>\sum u_n</math> converge, et si <math>\sum u_n</math> diverge, alors <math>\frac 1\lambda\sum u_n</math> diverge, et donc <math>\sum v_n</math> diverge. === Théorème === # Tous les termes <math>u_n</math> de la série étant strictement positifs, s'il existe un réel <math>a<1</math> tel que à partir d'un certain rang on ait <math>\frac{u_{n+1}}{u_n}\leqslant a<1</math>, alors la série <math>\sum_{n=0}^{+\infty}u_n</math> converge. # Si <math>\frac{u_{n+1}}{u_n}\geqslant 1</math> à partir d'un certain rang, alors la série diverge grossièrement. ==== Preuve ==== # Soit <math>v_n=a^n</math>. On a <math>\frac{v_{n+1}}{v_n}=a</math> et donc à partir d'un certain rang <math display="block">\forall n,\frac{u_{n+1}}{un}\leqslant a=\frac{v_{n+1}}{v_n}~~~~\text{ et }~~~~\sum_{n=0}^{+\infty}v_n~~\text{ converge car }a<1</math>On en déduit que <math>\sum_{n=0}^{+\infty}u_n</math> converge. # Si <math>\frac{u_{n+1}}{u_n}\geqslant 1 </math>, alors <math>u_{n+1}\geqslant u_n</math> et donc <math>u_n </math> ne tend pas vers 0 et la série diverge grossièrement. ==== Remarque ==== Le théorème ne s'applique pas avec l'hypothèse affaiblie <math>\frac{u_{n+1}}{u_n}<1 </math>. Contre-exemple : la série harmonique. === Corollaire === Les termes <math>u_n </math> de la série étant strictement positifs, si <math>\frac{u_{n+1}}{u_n} </math> tend vers <math>l\in[0,+\infty] </math>, alors * si <math>l<1</math>, alors la série converge ; * si <math>l>1</math>, alors la série diverge grossièrement ; * si <math>l=1</math>, alors on ne peut conclure (cas douteux de la règle de d'Alembert). === Exemples === <math display="block">\sum_{n=1}^{+\infty}\frac{n!}{n^n}~~\text{CV}~~~~~~\sum_{n=1}^{+\infty}\frac{n^n}{n!}~~\text{DV}~~~~~~\sum_{n=1}^{+\infty}\frac1{n^\alpha}~~\text{cas douteux.} </math> == Règle de Raabe Duhamel == Comme les règles précédentes, la règle de Raabe Duhamel ne s'applique qu'aux séries à termes positifs. Elle repose sur la comparaison de la série à étudier avec une série de Riemann. === Théorème === Les termes <math>u_n</math> étant strictement positifs, si <math>n\,\left[1-\frac{u_{n+1}}{u_n}\right]</math> tend vers <math>\beta\in[-\infty,+\infty]</math>, alors * <math>\beta>1\implies\sum_{n=0}^{+\infty}u_n~~\text{ converge} ~;</math> * <math>\beta<1\implies\sum_{n=0}^{+\infty}u_n~~\text{ diverge} ~;</math> * <math>\beta=1</math> ne permet pas de conclure (cas douteux de la règle de Raabe Duhamel). ==== Démonstration ==== On va utiliser le lemme de la règle de d'Alembert avec une série de Riemann. Soit <math>v_n=\frac 1{n^\alpha}</math> avec <math>\alpha>0</math>.<math display="block">\frac{v_{n+1}}{v_n}=\left(\frac n{n+1}\right)^\alpha=\left(\frac {n+1} n \right)^{-\alpha}=1-\frac\alpha n+o\left(\frac 1n\right) ~~\text{ donc }~~ n\left[1-\frac{v_{n+1}}{v_n}\right]\underset{n\to+\infty}\longrightarrow\alpha</math>et on peut écrire<math display="block">n\left[\frac{u_{n+1}}{u_n}-\frac{v_{n+1}}{v_n}\right]=n\left[\left(1-\frac{v_{n+1}}{v_n}\right)-\left(1-\frac{u_{n+1}}{u_n}\right)\right]=n\left[1-\frac{v_{n+1}}{v_n}\right]-n\left[1-\frac{u_{n+1}}{u_n}\right]\underset{n\to+\infty}\longrightarrow\alpha-\beta</math> # Pour <math>\beta>1</math>, il existe <math>\alpha\in]1,\beta[</math> tel que <math>\alpha-\beta<0</math>. Dans ce cas, la suite <math>\frac{u_{n+1}}{u_n}-\frac{v_{n+1}}{v_n}</math> est négative à partir d'un certain rang. Le lemme de la règle de d'Alembert permet alors d'affirmer que la série <math>\sum u_n</math> est convergente car la série <math>\sum v_n</math> est convergente d'après la règle de Riemann. # Pour <math>\beta<1</math>, il existe <math>\alpha\in]\beta,1[</math> tel que <math>\alpha-\beta>0</math>. Dans ce cas, la suite <math>\frac{u_{n+1}}{u_n}-\frac{v_{n+1}}{v_n}</math> est positive à partir d'un certain rang. Le lemme de la règle de d'Alembert permet alors d'affirmer que la série <math>\sum u_n</math> est divergente car la série <math>\sum v_n</math> est divergente d'après la règle de Riemann. ==== Remarque ==== <math display="block">n\left[1-\frac{u_{n+1}}{u_n}\right]\underset{n\to+\infty}\longrightarrow\beta\iff\frac{u_{n+1}}{u_n}=1-\frac\beta n+o\left(\frac 1n\right)~~~~\text{ lorsque }\beta\in\mathbb R</math> === Exemples === # <math>\sum_{n=1}^{+\infty}\frac{1.3.5\ldots(2n-1)}{2.4.6\ldots(2n)}</math> cas douteux pour d'Alembert, diverge d'après Raabe Duhamel ; # <math>\sum_{n=2}^{+\infty}\frac{1.3.5\ldots(2n-3)}{2.4.6\ldots(2n)}</math> cas douteux pour d'Alembert, converge d'après Raabe-Duhamel ; # <math>\sum_{n=1}^{+\infty}\frac 1n</math> cas douteux pour d'Alembert et pour Raabe-Duhamel. == Comparaison avec une intégrale impropre == Dans le cas d'une série dont les termes sont les images d'une fonction décroissante et positive, les comportements de la série et de l'intégrale de la fonction sont similaires. === Théorème === Si <math>f</math> est une fonction continue sur <math>[1,+\infty[</math> décroissante et positive, alors on peut affirmer # <math>\sum_{n=1}^{+\infty}f(n)~~~~\text{ et }~~~~\int_1^{+\infty}f(x)\,\rm dx </math> sont de même nature ; # Si la série précédente converge, alors pour tout entier naturel non nul <math>n </math>, on a l'encadrement<math display="block">\int_{n+1}^{+\infty}f(x)\,\rm dx\leqslant R_n\leqslant\int_n^{+\infty}f(x)\,\rm dx </math> ==== Preuve ==== Le lecteur aura tout intérêt à s'aider d'un graphique pour comprendre pleinement les inégalités suivantes. # <math display="block">\forall k\geqslant1,~ \forall x\in[k,k+1],~k\leqslant x\leqslant k+1\implies f(k+1)\leqslant f(x)\leqslant f(k) </math><math display="block">\implies\int_k^{k+1}f(k+1)\,\rm dx\leqslant\int_k^{k+1}f(x)\,\rm dx\leqslant\int_k^{k+1}f(k)\,\rm dx </math><math display="block">\implies f(k+1)\leqslant\int_k^{k+1}\leqslant f(k) </math>On en déduit donc <math>\sum_{k=1}^{n-1}f(k+1)\leqslant\sum_{k=1}^{n-1}\int_k^{k+1}f(x)\,\rm dx\leqslant \sum_{k=1}^{n-1}f(k) </math> <math display="block">\implies \sum_{k=2}^nf(k)\leqslant\int_1^nf(x)\,\rm dx\leqslant\sum_{k=1}^{n-1}f(k) </math>et on peut conclure '''a'''. si <math>\int_1^{+\infty}f(x)\,\rm dx </math> converge, alors <math>\left(\int_1^{n}f(x)\,\rm dx\right)_{n\geqslant 1} </math> est majorée, donc <math>\left(\sum_{k=2}^nf(k)\right)_{n\geqslant 1} </math> est croissante et majorée, donc la série <math>\sum_{k=1}^{+\infty}f(k) </math> converge ; '''b'''. si <math>\sum_{k=1}^{+\infty}f(k) </math> converge, alors <math>\left(\sum_{k=1}^{n-1}f(k)\right)_{n\geqslant 1} </math> est majorée, alors <math>F~:~x\longmapsto\int_1^xf(t)\,\rm dt </math> est croissante et majorée sur <math>[1,+\infty[ </math>, donc <math>\int_1^{+\infty}f(t)\,\rm dt </math> converge (on montre que la limite de <math>F\text{ en }+\infty </math> est la borne supérieure de <math>F(t) </math> pour <math>t\in[1,+\infty[ </math>. # <math>\forall k\geqslant 2,~ \forall x\in[k,k+1],~ f(x)\leqslant f(k)\leqslant f(x-1) </math> donc <math>\int_k^{k+1}f(x)\,\rm dx\leqslant f(k)\leqslant\int_k^{k+1}f(x-1)\,\rm dx </math> c'est-à-dire <math>\int_k^{k+1}f(x)\,\rm dx\leqslant f(k)\leqslant\int_{k-1}^{k}f(x)\,\rm dx </math> et <math>\sum_{k=n+1}^p\int_k^{k+1}f(x)\,\rm dx\leqslant \sum_{k=n+1}^p f(k)\leqslant\sum_{k=n+1}^p\int_{k-1}^{k}f(x)\,\rm dx </math> et donc <math>\int_{n+1}^{p+1}f(x)\,\rm dx\leqslant R_n\leqslant\int_n^pf(x)\,\rm dx </math> ce qui donne en passant à la limite quand <math>p </math> tend vers <math>+\infty </math><math display="block">\int_{n+1}^{+\infty}f(x)\,\rm dx\leqslant R_n\leqslant\int_n^{+\infty}f(x)\,\rm dx </math> === Applications aux séries de Bertrand === On désigne par <math>B(\alpha)=\sum_{n=2}^{+\infty}\frac1{n\,\ln^\alpha(n)} </math> un cas particulier de série de Bertrand. La comparaison série-intégrale nous permet d'affirmer que <math>B(\alpha) </math> converge si et seulement si <math>\alpha>1 </math>. == Série exponentielle == === Théorème === <math display="block">\forall x\in\mathbb R,~ \rm e^x=\sum_{n=0}^{+\infty}\frac{x^n}{n!}=1+x+\frac{x^2}{2!}+\frac{x^3}{3!}+\cdots </math> ==== Preuve ==== Il s'agit de démontrer que la fonction exponentielle est développable en série entière. Pour cela on va utiliser l'inégalité de Taylor et montrer que le reste d'ordre <math>n </math> tend vers 0. La fonction exponentielle est de classe <math>\mathcal C^\infty </math> sur <math>\mathbb R </math> donc on peut lui appliquer n'importe laquelle des formules de Taylor, et sur n'importe quel segment. Appliquons la formule de Taylor avec reste intégral à <math>f=exp </math> entre 0 et <math>x </math>. La partie régulière d'ordre <math>n </math> donne la somme partielle d'ordre <math>n </math> :<math display="block">f(0)+xf'(0)+\frac{x^2}{2!}f''(0)+\cdots+\frac{x^n}{n!}f^{(n)}(0)=1+x+\frac{x^2}{2!}+\cdots+\frac{x^n}{n!} </math>Le reste intégral de Taylor d'ordre <math>n </math> peut se majorer en posant <math>M=\sup_{t\in[0,x]}|f^{(n+1)}(t)|=\max(\rm e^x,1) </math><math display="block">|R_n|\leqslant\frac{M\,|x-0|^{n+1}}{(n+1)!}=\frac{M\,|x|^{n+1}}{(n+1)!} </math>Montrons que ce reste tend vers 0 quand <math>n </math> tend vers <math>+\infty </math>. Soit <math display="block">\alpha_n=\frac{M\,|x|^{n+1}}{(n+1)!}>0.~~\forall n\in\mathbb N,~ \frac{\alpha_{n+1}}{\alpha_n}=\frac{|x|}{n+2}\underset{n\to+\infty}\longrightarrow0<1 </math>donc <math>\sum \alpha_n </math> est convergente d'après la règle de d'Alembert, ce qui entraîne que <math>\alpha_n </math> tend vers 0. On en déduit que <math>R_n </math> tend vers 0 et donc que la fonction exponentielle est développable en série entière. === Exemples === <math display="block">\sum_{n=0}^{+\infty}\frac{3^n}{n!}=\rm e^3 </math><math display="block">\sum_{n=0}^{+\infty}\frac{n\times 3^n}{n!}=\sum_{n=1}^{+\infty}\frac{n\times 3^n}{n!}=\sum_{n=1}^{+\infty}\frac{3^n}{(n-1)!}=\sum_{n=0}^{+\infty}\frac{3^{n+1}}{n!}=3\sum_{n=0}^{+\infty}\frac{3^n}{n!}=3\rm e^3 </math> == '''Séries à termes de signes quelconques''' == == Absolue convergence == On considère la série <math>\sum_{n=0}^{+\infty}a_n</math> dans laquelle <math>(a_n)</math> est une suite à termes réels ou complexes. Si la série des valeurs absolues (ou modules) <math>\sum_{n=0}^{+\infty}|a_n|</math> converge, alors on dit que <math>\sum_{n=0}^{+\infty}a_n</math> est '''absolument convergente (ACV).''' === Théorème === Toute série de termes réels ou complexes absolument convergente est convergente. Ce résultat est la conséquence du caractère complet de <math>\mathbb R</math> ou <math>\mathbb C</math> muni de la distance euclidienne. === Démonstration === Soit <math>\sum_{n=0}^{+\infty}a_n</math> une série absolument convergente. Alors <math>\sum_{n=0}^{+\infty}|a_n|</math> est convergente. Cette deuxième série vérifie donc le critère de convergence de Cauchy :<math display="block">\forall\varepsilon>0,~ \exists n_0\in\mathbb N,~n\geqslant p\geqslant n_0\implies|a_{p+1}|+\cdots+|a_n|\leqslant\varepsilon</math>Soit <math>S_n=\sum_{p=0}^na_p</math> la somme partielle d'ordre <math>n</math> de la première série. On peut écrire<math display="block">\forall\varepsilon>0,~ \exists n_0\in\mathbb N,~n\geqslant p\geqslant n_0\implies|S_n-S_p|=|a_{p+1}+\cdots+a_n|\leqslant|a_{p+1}|+\cdots+|a_n|\leqslant\varepsilon</math>ce qui montre que <math>(S_n)</math> est de Cauchy dans <math>\mathbb R</math> ou <math>\mathbb C</math> complet, donc <math>(S_n)</math> converge. === Semi convergence === Si une série est convergente sans être absolument convergente, on dit qu'elle est semi convergente. Le paragraphe suivant constitue un exemple célèbre de la semi convergence. === Série harmonique alternée === Un exemple à connaître. La série harmonique alternée est la série <math>\sum_{n=0}^{+\infty}a_n</math> avec <math>a_n=\frac{(-1)^n}{n+1}</math>. Cette série n'est pas absolument convergente car la série harmonique diverge. En revanche, on peut démontrer que la série alternée converge, et même calculer sa somme égale à <math>\ln 2</math>. Pour démontrer la convergence, on pourra utiliser les règle de Leibniz qui suit, et la formule de Taylor pour calculer la somme en l'appliquant à la fonction <math>\ln(1+t)</math> sur l'intervalle <math>[0,1]</math>. == Règle de Leibniz == C'est une règle qui s'applique à une série alternée, c'est-à-dire dont le terme général est un réel de la forme <math>a_n=(-1)^n\alpha_n</math> avec <math>\alpha_n\geqslant0</math>. === Théorème === Soit <math>\sum_{n=0}^{+\infty}a_n</math> une série alternée. Si <math>|a_n|</math> tend vers 0 en décroissant, alors # la série <math>\sum_{n=0}^{+\infty}a_n</math> est convergente ; # le signe du reste <math>R_n</math> est celui de son premier terme <math>a_{n+1}</math>, et <math>|R_n|\leqslant|a_{n+1}|</math> ; # la somme de la série est encadrée par deux sommes partielles consécutives quelconques. ==== Preuve ==== # On démontre que les suites des sommes partielles de rangs pairs et impairs sont adjacentes, donc convergent vers la même limite, ce qui entraîne la convergence de la série. # On se place dans les hypothèses du théorème et donc que la série converge.<math display="block">R_n=\sum_{p=n+1}^{+\infty}a_p=\sum_{p=0}^{+\infty}(a_{n+1+2p}-a_{n+2+2p})=\sgn(a_{n+1})\sum_{p=0}^{\infty}(|a_{n+1+2p}|-|a_{n+2+2p}|)</math>est du signe de <math>a_{n+1}</math> car chacun des termes de la somme est positif du fait de la décroissance de <math>(|a_n|)_{n\in\mathbb N}</math>. D'autre part, <math>\forall n\in\mathbb N,~ R_n=a_{n+1}+R_{n+1} </math> et <math>R_{n+1}</math> est du signe de <math>a_{n+2}</math>, c'est-à-dire du signe contraire de <math>a_{n+1}</math>. On peut donc écrire<math display="block">\forall n\in\mathbb N,~ R_n=a_{n+1}+R_{n+1}=\sgn(a_{n+1})[|a_{n+1}|-|R_{n+1}|]</math>que l'on sait être du signe de <math>a_{n+1}</math>. On a donc <math>|a_{n+1}|-|R_{n+1}|\geqslant0</math> et on en déduit<math>|R_n|=|a_{n+1}|-|R_{n+1}|\leqslant|a_{n+1}|</math>. # L'encadrement est la conséquence de l'adjacence des sous-suites des termes pairs et impairs. == Règle d'Abel == === Théorème === On considère la série de terme général <math>u_n=a_nb_n</math> avec * <math>\sigma_n=\sum_{p=0}^nb_p=b_0+b_1+\cdots+b_n</math> bornée (indépendamment de <math>n</math> ; * <math>a_n</math> tend vers 0 en décroissant. Alors on peut affirmer que <math>\sum_{n=0}^{+\infty}u_n</math> converge. === Exemple === Etude de la convergence de la série <math>\sum_{n=1}^{+\infty}\frac{\sin n}n</math>. Il ne s'agit pas d'une série à termes positifs, ni d'une série alternée. Le terme général s'écrit comme le produit de <math>\frac1n</math> qui tend vers 0 en décroissant, et de <math>\sin n</math> dont on va démontrer que les sommes partielles sont bornées. En effet, <math>\sum_{k=1}^n\sin k</math> est la partie imaginaire de <math>\sum_{k=1}^n\rm e^{\rm i k}</math> qui est une somme géométrique égale à <math>\frac{1-\rm e^{\rm i n}}{1-\rm e^{\rm i}}</math> dont le module est majoré par <math>\frac{|1|+|-\rm e^{\rm i n}|}{|1-\rm e^{\rm i}|}=\frac2{|1-\rm e^{\rm i}|}</math>. La valeur absolue de la partie imaginaire étant inférieure au égale au module, on en déduit que <math>\left|\sum_{k=1}^n\sin k\right|</math> est majorée par le même nombre, et donc que la série <math>\sum_{n=1}^{+\infty}\frac{\sin n}n</math> est convergente d'après la règle d'Abel. === Preuve === On va utiliser le critère de Cauchy pour une série ainsi que la technique de la transformation d'Abel. Soit <math>S_n=\sum_{k=0}^na_kb_k</math> la somme partielle d'ordre <math>n</math>. Pour démontrer que <math>(S_n)</math> est de Cauchy, on va chercher à majorer <math>|S_n-S_p|</math> pour <math>n\geqslant p\geqslant1</math>. <math display="block">|S_n-S_p|=\sum{k=p+1}^na_kb_k=\sum_{k=p+1}^nak(\sigma_k-\sigma_{k-1})=\sum_{k=p+1}^na_k\sigma_k-\sum_{k=p+1}^na_k\sigma_{k-1}</math><math display="block">=\sum_{k=p+1}^na_k\sigma_k-\sum_{k=p}^{n-1}a_{k+1}\sigma_k=-a_{p+1}\sigma_p+\sum_{k=p+1}^{n-1}(a_k-a_{k+1})\sigma_k+a_n\sigma_n</math> On en déduit, en désignant par <math>M</math> un majorant de <math>|\sigma_n|</math> et en utilisant la décroissance de <math>(a_n)</math> : <math>|S_n-S_p|=\left|\sum_{k=p+1}^na_kb_k\right|\leqslant a_{p+1}|\sigma_p|+\sum_{k=p+1}^{n-1}(a_k-a_{k+1})|\sigma_k|+a_n|\sigma_n|</math><math display="block">\leqslant a_{p+1}M+\sum_{k=p+1}^{n-1}(a_k-a_{k+1})M+a_nM\leqslant M(a_{p+1}+a_{p+1}-a_n+a_n)=2Ma_{p+1}</math> On a obtenu une majoration indépendante de <math>n</math> par un terme qui tend vers 0 quand <math>p</math> tend vers <math>+\infty</math>. On en déduit que <math>(S_n)</math> est une suite de Cauchy dans <math>\mathbb R~\text{ou}~\mathbb C</math> complet, ce qui entraîne que la série converge. == Produit de Cauchy == == Formule de Stirling == 0z8ceasv64saa57k1ahw9ew3zz0g4w9 Analyse/Suites 0 2257 767334 757180 2026-06-02T15:04:35Z DavidL 1746 767334 wikitext text/x-wiki <noinclude>{{Analyse}}</noinclude> ==Définition : suite numérique== Soit l'application,<br /> <math>u : \mathbb{N} \longrightarrow \mathbb{R} : n \longmapsto u_n</math><br /><br />On dit que <math>(u_n)</math> est une suite numérique de terme général <math>u_n</math>. <u>Exemple</u> 1) <math>u : \mathbb{N} \longrightarrow \mathbb{R} : n \longmapsto u_n = n</math> {| class="wikitable" |+ !<math>n</math> !<math>0</math> !<math>1</math> !<math>2 </math> !<math>\cdots</math> |- |<math>u_n </math> |<math>0 </math> |<math>1</math> |<math>2</math> |<math>\cdots</math> |} {| class="wikitable" |} === suite extraite (ou sous-suite) === On dit que <math>(v_p)</math> est une suite extraite (ou une sous-suite) de la suite <math>(u_n)</math> si et seulement si :<br /> <math> \exists\ \phi :\N \to \N \ (\mathrm{strictement \ croissante}) : \forall p \in \mathbb N, v_p = u_{\phi(p)} </math> === suite stationnaire === Soit <math>(u_n)</math> une suite numérique de terme général <math>u_n</math><br />On dit que <math>(u_n)</math> est une suite stationnaire si et seulement si :<br /><br /><math>\exists N \in\mathbb{N}, \exists a \in\mathbb{R} : \forall n > N, u_n = a</math> === Suite Monotone === Une suite est monotone si elle est strictement croissante ou strictement décroissante. ==== Suite croissante ==== ===== Définition ===== une suite <math>(u_n)</math> est croissante à partir d'un certain rang <math> N </math> si<br /> <math>\exists N \in \mathbb N : \forall n \geq N, u_{n+1} \geq u_n </math> ==== Suite décroissante ==== ===== Définition ===== une suite <math>(u_n)</math> est décroissante à partir d'un certain rang <math>N </math> si <br /> <math>\exists N \in \mathbb N : \forall n\geq N, \ u_{n+1}\leq u_n</math> ==== Application ==== pour savoir si une suite est monotone il est souvent astucieux <ul> <li> d'étudier le signe de <math>u_{n+1}-u_n\,</math> <br /> <li> d'étudier le signe de <math>\frac{u_{n+1}}{u_n} - 1 </math><br /> <li> si la suite est de la forme <math>u_n=f(n)\,</math>, d'étudier la monotonie de f à partir du signe de sa dérivée </ul> ===== Exemple ===== <math>n+1 </math> === Suite Bornée === ==== Suite Minorée ==== Une suite <math>u_n</math> est minorée s'il existe au moins un réel inférieur à tous les termes de la suite, autrement dit si: :<math>\exists A\in\mathbb R</math> tel que <math>\forall n\in\mathbb N \ u_n>A </math> ==== Suite Majorée ==== Une suite <math>u_n</math> est majorée s'il existe au moins un réel superieur à tous les termes de la suite, autrement dit si: :<math>\exists A\in\mathbb R</math> tel que <math>\forall n\in\mathbb N \ u_n<A </math> ==== Suite Bornée ==== Une suite <math>u_n</math> est bornée si elle est majorée et minorée, c'est-à-dire s'il existe au moins un réel A tel que: :<math>|u_n|<A\,</math> ==== Exemples et applications ==== == Convergence et Limite == === Limite finie === ==== Définition ==== Une suite possédant une limite finie est dite convergente. Dans le cas contraire, elle est dite divergente. <br /><br /> On dit que la suite <math>(u_n)</math> converge vers une limite <math>l</math> si quel que soit <math>\epsilon>0</math> tous les termes de la suite <math>(u_n)</math> appartiennent à un intervalle <math>[l-\epsilon;l+\epsilon]</math> sauf un nombre fini de termes ou autrement dit: <br /><br /> <math> \forall\epsilon>0, \exists N(\epsilon) \in \mathbb N</math> <br /> :tel que <math>\forall n>N(\epsilon) \Rightarrow |u_n-l|< \epsilon </math> <br /> dans ce cas on note <math>\lim_{n \to \infty}u_n=l</math> ou <math>u_n \rightarrow l</math> ==== Unicité de la limite ==== ===== Théorème ===== Une suite convergente a une unique limite l. <br /> ===== Démonstration ===== Soit une suite <math>(u_n)</math> convergente, supposons que la suite <math>(u_n)</math> possède deux limites distinctes <math>l</math> et <math>l'</math> d'après la definition de la limite on peut affirmer que: :<math> \forall\epsilon>0 \ \exists N \in \mathbb N</math> ::tel que <math>\forall n>N \Rightarrow |u_n-l|< \epsilon </math> et :<math> \forall\epsilon>0 \ \exists N' \in \mathbb N</math> ::tel que <math>\forall n>N' \Rightarrow |u_n-l'|< \epsilon </math> donc pour <math>n>\max(N,N')</math> on a :<math>|u_n-l|< \epsilon \,</math> (1) :<math>|u_n-l'|< \epsilon \,</math> (2) en additionnant (1) et (2) on a :<math>|u_n-l'|+|u_n-l|< 2\epsilon \,</math> (3) d'après l'inégalité triangulaire :<math>|l-l'|=|l-u_n - l'+ u_n| < |l - u_n|+|-l' + u_n| = |u_n - l'|+|u_n - l|\,</math> (4) en intégrant (4) à (3) on obtient<br /> :<math>|l-l'|<2\epsilon\,</math> (5) puisque cette inégalité est vraie pour tout <math>\epsilon>0</math> et que l'on a posé au départ <math>l \ne l'</math> on peut poser <math>\epsilon = 1/4|l-l'|\,</math> en l'intégrant à (5) on obtient :<math>|l-l'|<2 \times \frac{1}{4} |l-l'|\,</math> :donc <math>1<\frac{1}{2}\,</math> Ce qui est absurde, donc on vient de démontrer par l'absurde que l = l', et donc qu’il existe une et une seule limite à une suite convergente ==== Théorème des suites monotones bornées ==== ===== Théorème ===== Une suite majorée et croissante est convergente<br /> Une suite minorée et décroissante est convergente <br /> ===== Démonstration ===== Rappelons que toute partie non vide et majorée de <math>\mathbb{R}</math> admet une borne supérieure finie. Si l'ensemble <math> \{u_n ,\;n\in\mathbb{N}\}</math> est majoré, il admet une borne supérieure finie : notons-la <math>l</math> . Puisque <math>l</math> est le plus petit des majorants, pour tout <math> \varepsilon >0</math> , <math>l-\varepsilon </math> n'est pas un majorant. Donc il existe <math>n_0</math> tel que <math> l-\varepsilon \leqslant u_{n_0}\leqslant l</math> . Mais si <math>(u_n)</math> est croissante, alors pour tout <math> n\geqslant n_0</math> , <math>\displaystyle l-\varepsilon \leqslant u_{n_0}\leqslant u_n\leqslant l\;, </math> donc <math>(u_n)</math> converge vers <math>l</math> . Si la suite n'est pas majorée, pour tout <math>A</math> , il existe <math>n_0</math> tel que <math>u_{n_0}\geqslant A</math> . Si <math>(u_n)</math> est croissante, alors pour tout <math>n\geqslant n_0</math> , <math>\displaystyle A\leqslant u_{n_0}\leqslant u_n\;,</math> donc la suite <math>(u_n)</math> tend vers l'infini. Si la suite <math>(u_n)</math> est décroissante, on applique ce qui précède à la suite croissante <math>(-u_n)</math>. ==== Théorème des suites convergentes ==== ===== Théorème ===== Une suite convergente est bornée <br /> ===== Démonstration ===== (<math>u_n</math>) converge vers l, donc d'après la définition de la convergence d'une suite : <math> \forall\epsilon>0, \exists N_0(\epsilon) \in \mathbb N</math> tel que : <math>\forall n>N_0(\epsilon), |u_n-l|< \epsilon </math> D'où pour <math>n>N_0</math>, on a : <br /> <math> \epsilon > |u_n - l|> |u_n| - |l|</math><br /> Ainsi, <math>|u_n| < \epsilon + |l|</math> <br /> D'où pour <math>n> N_0</math> : <math> |u_n| </math> ≤ <math>max(\epsilon + |l|, |u_0|, |u_1|, ....., |u_(N_0)|) = K</math> D'où (<math> u_n</math>) est bornée === Limite infinie === On dit que la suite <math>(u_n)</math> diverge vers <math>+\infty</math> (respectivement <math>-\infty</math>) si quel que soit <math>A\in \mathbb{R}</math> tous les termes de la suite <math>(u_n)</math> appartiennent à un intervalle <math>[M;+\infty[</math> (respectivement <math>]-\infty;M]</math>) sauf un nombre fini de termes ou autrement dit: <br /><br /> <math> \forall A\in \mathbb{R}, \exists N(A) \in \mathbb N</math> <br /> :tel que <math>\forall n>N(A) \Rightarrow u_n>A </math> (respectivement <math>u_n<A</math>) <br /> dans ce cas on note <math>\lim_{n \to \infty}u_n=+\infty</math> ou <math>u_n \rightarrow +\infty</math> (respectivement <math>\lim_{n \to \infty}u_n=-\infty</math> ou <math>u_n \rightarrow -\infty</math>) === Opérations sur les limites === == Adhérence == On appelle valeur d'adhérence d'une suite toute limite finie d'une sous-suite. Par exemple, soit <math> { \left(a_n \right) }_{n \in \mathbb{N} } = {\left(-1 \right) }^{n} </math>, ses valeurs d'adhérence sont évidemment 1 et -1. D'après l'unicité de la limite, l'ensemble des valeurs d'adhérence d'une suite convergente vers l est <math> \{l\} </math>. Cependant, la réciproque est fausse : la suite définie par <math> \forall n \in \mathbb{N}, u_{2n} = 0\text{ et }u_{2n+1} = n </math> a une unique valeur d'adhérence 0 mais ne converge pas. == Suites particulières == === Suites de Cauchy === Une suite de Cauchy est définie par : <math> { \forall \left(n,m \right) \in \mathbb{N}^2, \forall \epsilon > 0, \exists N \in \mathbb{N}, \left(n,m \right) > N, \left\| a_n - a_m \right\| < \epsilon } </math> == Exercices == Au cours d'une bourse aux livres, un manuel scolaire perd chaque année 12% de sa valeur. Un livre a été acheté neuf en 1985, il coûtait alors 150F. Quel est son prix à la bourse aux livres de 1990 ? de 1995 ? == Pour continuer... == [[Catégorie:Analyse (livre)|Suites]] l40pjt96utzlkp0n05028uznr0r7x9v 767335 767334 2026-06-02T15:04:47Z DavidL 1746 767335 wikitext text/x-wiki <noinclude>{{Analyse}}</noinclude> ==Définition : suite numérique== Soit l'application, <math>u : \mathbb{N} \longrightarrow \mathbb{R} : n \longmapsto u_n</math><br /><br />On dit que <math>(u_n)</math> est une suite numérique de terme général <math>u_n</math>. <u>Exemple</u> 1) <math>u : \mathbb{N} \longrightarrow \mathbb{R} : n \longmapsto u_n = n</math> {| class="wikitable" |+ !<math>n</math> !<math>0</math> !<math>1</math> !<math>2 </math> !<math>\cdots</math> |- |<math>u_n </math> |<math>0 </math> |<math>1</math> |<math>2</math> |<math>\cdots</math> |} {| class="wikitable" |} === suite extraite (ou sous-suite) === On dit que <math>(v_p)</math> est une suite extraite (ou une sous-suite) de la suite <math>(u_n)</math> si et seulement si :<br /> <math> \exists\ \phi :\N \to \N \ (\mathrm{strictement \ croissante}) : \forall p \in \mathbb N, v_p = u_{\phi(p)} </math> === suite stationnaire === Soit <math>(u_n)</math> une suite numérique de terme général <math>u_n</math><br />On dit que <math>(u_n)</math> est une suite stationnaire si et seulement si :<br /><br /><math>\exists N \in\mathbb{N}, \exists a \in\mathbb{R} : \forall n > N, u_n = a</math> === Suite Monotone === Une suite est monotone si elle est strictement croissante ou strictement décroissante. ==== Suite croissante ==== ===== Définition ===== une suite <math>(u_n)</math> est croissante à partir d'un certain rang <math> N </math> si<br /> <math>\exists N \in \mathbb N : \forall n \geq N, u_{n+1} \geq u_n </math> ==== Suite décroissante ==== ===== Définition ===== une suite <math>(u_n)</math> est décroissante à partir d'un certain rang <math>N </math> si <br /> <math>\exists N \in \mathbb N : \forall n\geq N, \ u_{n+1}\leq u_n</math> ==== Application ==== pour savoir si une suite est monotone il est souvent astucieux <ul> <li> d'étudier le signe de <math>u_{n+1}-u_n\,</math> <br /> <li> d'étudier le signe de <math>\frac{u_{n+1}}{u_n} - 1 </math><br /> <li> si la suite est de la forme <math>u_n=f(n)\,</math>, d'étudier la monotonie de f à partir du signe de sa dérivée </ul> ===== Exemple ===== <math>n+1 </math> === Suite Bornée === ==== Suite Minorée ==== Une suite <math>u_n</math> est minorée s'il existe au moins un réel inférieur à tous les termes de la suite, autrement dit si: :<math>\exists A\in\mathbb R</math> tel que <math>\forall n\in\mathbb N \ u_n>A </math> ==== Suite Majorée ==== Une suite <math>u_n</math> est majorée s'il existe au moins un réel superieur à tous les termes de la suite, autrement dit si: :<math>\exists A\in\mathbb R</math> tel que <math>\forall n\in\mathbb N \ u_n<A </math> ==== Suite Bornée ==== Une suite <math>u_n</math> est bornée si elle est majorée et minorée, c'est-à-dire s'il existe au moins un réel A tel que: :<math>|u_n|<A\,</math> ==== Exemples et applications ==== == Convergence et Limite == === Limite finie === ==== Définition ==== Une suite possédant une limite finie est dite convergente. Dans le cas contraire, elle est dite divergente. <br /><br /> On dit que la suite <math>(u_n)</math> converge vers une limite <math>l</math> si quel que soit <math>\epsilon>0</math> tous les termes de la suite <math>(u_n)</math> appartiennent à un intervalle <math>[l-\epsilon;l+\epsilon]</math> sauf un nombre fini de termes ou autrement dit: <br /><br /> <math> \forall\epsilon>0, \exists N(\epsilon) \in \mathbb N</math> <br /> :tel que <math>\forall n>N(\epsilon) \Rightarrow |u_n-l|< \epsilon </math> <br /> dans ce cas on note <math>\lim_{n \to \infty}u_n=l</math> ou <math>u_n \rightarrow l</math> ==== Unicité de la limite ==== ===== Théorème ===== Une suite convergente a une unique limite l. <br /> ===== Démonstration ===== Soit une suite <math>(u_n)</math> convergente, supposons que la suite <math>(u_n)</math> possède deux limites distinctes <math>l</math> et <math>l'</math> d'après la definition de la limite on peut affirmer que: :<math> \forall\epsilon>0 \ \exists N \in \mathbb N</math> ::tel que <math>\forall n>N \Rightarrow |u_n-l|< \epsilon </math> et :<math> \forall\epsilon>0 \ \exists N' \in \mathbb N</math> ::tel que <math>\forall n>N' \Rightarrow |u_n-l'|< \epsilon </math> donc pour <math>n>\max(N,N')</math> on a :<math>|u_n-l|< \epsilon \,</math> (1) :<math>|u_n-l'|< \epsilon \,</math> (2) en additionnant (1) et (2) on a :<math>|u_n-l'|+|u_n-l|< 2\epsilon \,</math> (3) d'après l'inégalité triangulaire :<math>|l-l'|=|l-u_n - l'+ u_n| < |l - u_n|+|-l' + u_n| = |u_n - l'|+|u_n - l|\,</math> (4) en intégrant (4) à (3) on obtient<br /> :<math>|l-l'|<2\epsilon\,</math> (5) puisque cette inégalité est vraie pour tout <math>\epsilon>0</math> et que l'on a posé au départ <math>l \ne l'</math> on peut poser <math>\epsilon = 1/4|l-l'|\,</math> en l'intégrant à (5) on obtient :<math>|l-l'|<2 \times \frac{1}{4} |l-l'|\,</math> :donc <math>1<\frac{1}{2}\,</math> Ce qui est absurde, donc on vient de démontrer par l'absurde que l = l', et donc qu’il existe une et une seule limite à une suite convergente ==== Théorème des suites monotones bornées ==== ===== Théorème ===== Une suite majorée et croissante est convergente<br /> Une suite minorée et décroissante est convergente <br /> ===== Démonstration ===== Rappelons que toute partie non vide et majorée de <math>\mathbb{R}</math> admet une borne supérieure finie. Si l'ensemble <math> \{u_n ,\;n\in\mathbb{N}\}</math> est majoré, il admet une borne supérieure finie : notons-la <math>l</math> . Puisque <math>l</math> est le plus petit des majorants, pour tout <math> \varepsilon >0</math> , <math>l-\varepsilon </math> n'est pas un majorant. Donc il existe <math>n_0</math> tel que <math> l-\varepsilon \leqslant u_{n_0}\leqslant l</math> . Mais si <math>(u_n)</math> est croissante, alors pour tout <math> n\geqslant n_0</math> , <math>\displaystyle l-\varepsilon \leqslant u_{n_0}\leqslant u_n\leqslant l\;, </math> donc <math>(u_n)</math> converge vers <math>l</math> . Si la suite n'est pas majorée, pour tout <math>A</math> , il existe <math>n_0</math> tel que <math>u_{n_0}\geqslant A</math> . Si <math>(u_n)</math> est croissante, alors pour tout <math>n\geqslant n_0</math> , <math>\displaystyle A\leqslant u_{n_0}\leqslant u_n\;,</math> donc la suite <math>(u_n)</math> tend vers l'infini. Si la suite <math>(u_n)</math> est décroissante, on applique ce qui précède à la suite croissante <math>(-u_n)</math>. ==== Théorème des suites convergentes ==== ===== Théorème ===== Une suite convergente est bornée <br /> ===== Démonstration ===== (<math>u_n</math>) converge vers l, donc d'après la définition de la convergence d'une suite : <math> \forall\epsilon>0, \exists N_0(\epsilon) \in \mathbb N</math> tel que : <math>\forall n>N_0(\epsilon), |u_n-l|< \epsilon </math> D'où pour <math>n>N_0</math>, on a : <br /> <math> \epsilon > |u_n - l|> |u_n| - |l|</math><br /> Ainsi, <math>|u_n| < \epsilon + |l|</math> <br /> D'où pour <math>n> N_0</math> : <math> |u_n| </math> ≤ <math>max(\epsilon + |l|, |u_0|, |u_1|, ....., |u_(N_0)|) = K</math> D'où (<math> u_n</math>) est bornée === Limite infinie === On dit que la suite <math>(u_n)</math> diverge vers <math>+\infty</math> (respectivement <math>-\infty</math>) si quel que soit <math>A\in \mathbb{R}</math> tous les termes de la suite <math>(u_n)</math> appartiennent à un intervalle <math>[M;+\infty[</math> (respectivement <math>]-\infty;M]</math>) sauf un nombre fini de termes ou autrement dit: <br /><br /> <math> \forall A\in \mathbb{R}, \exists N(A) \in \mathbb N</math> <br /> :tel que <math>\forall n>N(A) \Rightarrow u_n>A </math> (respectivement <math>u_n<A</math>) <br /> dans ce cas on note <math>\lim_{n \to \infty}u_n=+\infty</math> ou <math>u_n \rightarrow +\infty</math> (respectivement <math>\lim_{n \to \infty}u_n=-\infty</math> ou <math>u_n \rightarrow -\infty</math>) === Opérations sur les limites === == Adhérence == On appelle valeur d'adhérence d'une suite toute limite finie d'une sous-suite. Par exemple, soit <math> { \left(a_n \right) }_{n \in \mathbb{N} } = {\left(-1 \right) }^{n} </math>, ses valeurs d'adhérence sont évidemment 1 et -1. D'après l'unicité de la limite, l'ensemble des valeurs d'adhérence d'une suite convergente vers l est <math> \{l\} </math>. Cependant, la réciproque est fausse : la suite définie par <math> \forall n \in \mathbb{N}, u_{2n} = 0\text{ et }u_{2n+1} = n </math> a une unique valeur d'adhérence 0 mais ne converge pas. == Suites particulières == === Suites de Cauchy === Une suite de Cauchy est définie par : <math> { \forall \left(n,m \right) \in \mathbb{N}^2, \forall \epsilon > 0, \exists N \in \mathbb{N}, \left(n,m \right) > N, \left\| a_n - a_m \right\| < \epsilon } </math> == Exercices == Au cours d'une bourse aux livres, un manuel scolaire perd chaque année 12% de sa valeur. Un livre a été acheté neuf en 1985, il coûtait alors 150F. Quel est son prix à la bourse aux livres de 1990 ? de 1995 ? == Pour continuer... == [[Catégorie:Analyse (livre)|Suites]] 18fuvcadh6qc7kft9p3bpzw3tom01dv Analyse/Fonctions 0 3997 767336 268814 2026-06-02T15:05:04Z DavidL 1746 767336 wikitext text/x-wiki <noinclude>{{Analyse}}</noinclude> {{ébauche}} == Présentation == == Définitions == === Définitions de base === Soient E et F deux ensembles. On appelle '''graphe''' de E vers F toutes parties de <math>E \times F</math>. On appelle '''correspondance''' de E vers F le triplet <math>(\Gamma ,E,F)</math>, où <math>\Gamma</math> est un graphe de E vers F, E l'ensemble de départ et F l'ensemble d'arrivée. On nomme '''ensemble de définition''' de la correspondance l'ensemble : <math>\left\{ {x|x \in E\;{\rm et }\exists y,(x,y) \in \Gamma } \right\}</math> Cet ensemble est vide si, et seulement si, <math>\Gamma</math> est vide. On appelle '''graphe fonctionnel''' de E vers F, tout graphe <math>\Gamma</math> de E vers F, vérifiant la relation suivante : <math>\forall x \in E,\left\{ {y|y \in F\;{\rm et }(x,y) \in \Gamma } \right\} = \emptyset {\rm ou }\left\{ a \right\}</math> On appelle '''application''', ou '''fonction''', de E vers F, toute correspondance de E vers F dont le graphe est un graphe fonctionnel et dont E est le domaine de définition On écrira par convention : <math>f:E \to F</math>. L'ensemble <math>f(E)</math> est appelé ''image'' de f, noté également <math>Im f</math>. '''ATTENTION''' : il ne faut pas confondre <math>f(x)</math> qui est un élément de F, et <math>f</math> élément de <math>E \times F</math> === Application composée === Soit E,F,G des ensembles et <math>f:E \to F</math>, <math>g:F \to G</math>. On appelle composée des applications g et f, et on note <math>g \circ f</math>, l'application <math>h:E \to G</math>, telle que <math>h(x) = g(f(x))</math> pour tout <math>x \in E</math>. La composition est associative d'où : <math>(h \circ g) \circ f = h \circ (g \circ f)</math>. On note alors <math>h \circ g \circ f</math> === Caractéristiques === Soit <math>f:E \to F</math> une application. :1) f est injective si et seulement si <math>\forall x \in E,\forall y \in E,x \ne y \Rightarrow f(x) \ne f(y)</math> :2) f est surjective si et seulement si <math>\forall y \in F,\exists x \in E,f(x) = y</math> :3) f est bijective si 1) et 2) sont vérifié On parle éventuellement de permutation de E pour une bijection lorsque l'ensemble est ''fini''. [[Catégorie:Analyse (livre)|Fonctions]] pocai6h0a7qbn95z0s97w0y3exo22oe 767337 767336 2026-06-02T15:05:20Z DavidL 1746 767337 wikitext text/x-wiki <noinclude>{{Analyse}}</noinclude> {{ébauche|left=1}} == Présentation == == Définitions == === Définitions de base === Soient E et F deux ensembles. On appelle '''graphe''' de E vers F toutes parties de <math>E \times F</math>. On appelle '''correspondance''' de E vers F le triplet <math>(\Gamma ,E,F)</math>, où <math>\Gamma</math> est un graphe de E vers F, E l'ensemble de départ et F l'ensemble d'arrivée. On nomme '''ensemble de définition''' de la correspondance l'ensemble : <math>\left\{ {x|x \in E\;{\rm et }\exists y,(x,y) \in \Gamma } \right\}</math> Cet ensemble est vide si, et seulement si, <math>\Gamma</math> est vide. On appelle '''graphe fonctionnel''' de E vers F, tout graphe <math>\Gamma</math> de E vers F, vérifiant la relation suivante : <math>\forall x \in E,\left\{ {y|y \in F\;{\rm et }(x,y) \in \Gamma } \right\} = \emptyset {\rm ou }\left\{ a \right\}</math> On appelle '''application''', ou '''fonction''', de E vers F, toute correspondance de E vers F dont le graphe est un graphe fonctionnel et dont E est le domaine de définition On écrira par convention : <math>f:E \to F</math>. L'ensemble <math>f(E)</math> est appelé ''image'' de f, noté également <math>Im f</math>. '''ATTENTION''' : il ne faut pas confondre <math>f(x)</math> qui est un élément de F, et <math>f</math> élément de <math>E \times F</math> === Application composée === Soit E,F,G des ensembles et <math>f:E \to F</math>, <math>g:F \to G</math>. On appelle composée des applications g et f, et on note <math>g \circ f</math>, l'application <math>h:E \to G</math>, telle que <math>h(x) = g(f(x))</math> pour tout <math>x \in E</math>. La composition est associative d'où : <math>(h \circ g) \circ f = h \circ (g \circ f)</math>. On note alors <math>h \circ g \circ f</math> === Caractéristiques === Soit <math>f:E \to F</math> une application. :1) f est injective si et seulement si <math>\forall x \in E,\forall y \in E,x \ne y \Rightarrow f(x) \ne f(y)</math> :2) f est surjective si et seulement si <math>\forall y \in F,\exists x \in E,f(x) = y</math> :3) f est bijective si 1) et 2) sont vérifié On parle éventuellement de permutation de E pour une bijection lorsque l'ensemble est ''fini''. [[Catégorie:Analyse (livre)|Fonctions]] f1fbepbo2kmui6k8pgxhypydbqwmr1g Analyse/Formules de Taylor 0 4612 767344 257728 2026-06-02T15:07:19Z DavidL 1746 767344 wikitext text/x-wiki <noinclude>{{Analyse}}</noinclude> Attention: Il s'agit de la formule de Taylor-Lagrange et non celle de Taylor-Young Soit <math>f</math> une fonction définie et <math>n</math> fois dérivable sur un segment <math>\left[a,b\right]</math>, <math>(n+1)</math> fois dérivable sur l'intervalle ouvert <math>]a,b[</math>, alors il existe un réel <math>c</math> de <math>]a,b[</math> tel que : <math>f(b) = f(a) + \frac{(b-a)^{1}}{1!} f'(a) + \frac{(b-a)^{2}}{2!} f''(a) + \cdots + \frac{(b-a)^{n}}{n!} f^{(n)}(a) + \frac{(b-a)^{n+1}}{(n+1)!} f^{(n+1)}(c) </math> [[Catégorie:Analyse (livre)|Formules de Taylor]] o5kn9hfpt2i4wb2fvnapjtomzl0d68r Analyse/Équation différentielle 0 6797 767343 682609 2026-06-02T15:07:10Z DavidL 1746 767343 wikitext text/x-wiki <noinclude>{{Analyse}}</noinclude> {{Définition|Une équation différentielle est une équation où l'inconnue est la fonction y(x) et où peuvent figurer les fonctions y', y{{'}}' et la variable x.}} Exemples : * <math>y' + y = 0\,</math>. * <math>y' - 2xy = -3\,</math>. == Équation différentielle du premier ordre == {{Définition|Une équation différentielle est dite du premier ordre si elle comporte la fonction inconnue ainsi que sa dérivée première.}} Exemple : * <math>y' + 2y = 0\,</math>. === Équation différentielle linéaire du premier ordre === {{Définition|Toute équation différentielle du premier ordre qui peut se mettre sous la forme :<br />A(x)y' + B(x)y = C(x) (ici avec second membre) ou <br />A(x)y' + B(x)y = 0 (ici sans second membre)<br />est une équation linéaire.}} Exemples : * <math>4y' + 2y = 3x + 1\,</math>. * <math>y' + cos(y) = 0\,</math>. n'est pas une équation linéaire (voir [[w:Équation linéaire|Équation linéaire]]). === Résolution === ==== Équation sans second membre ==== <math>xy' - y = 0\,</math> <br /><math>xy' = y\,</math><br /><math>y'/y = 1/x\,</math><br /><math>ln|y| = ln|x| + k\,</math><br /><math>y(x) = exp(ln|x| + k)\,</math><br /><math>y(x) = Kx \,</math> (avec K = K1 si x>0 ou K = -K1 si x<0) avec <math>K=exp(k) \,</math> ==== Exercices ==== Résoudre <math>xy' + 2y = 0\,</math> {{boîte déroulante|titre = Solution| contenu = * <math>xy' + 2y = 0\,</math><br /><math>xy' = -2y\,</math><br /><math>y'/y = -2/x\,</math><br /><math>ln(y(x)) = -2ln x + k\,</math><br /><math>y(x) = exp(-2ln(x))exp(k)\,</math><br /><math>y(x) = Kx^{-2} = K/x^2 \,</math>| ... }} ==== Équation avec second membre ==== <math>(x+1)y'+2y = 1/(x+2)\,</math> (que l'on nomme (1)) * On y associe une équation sans second membre : <math>(x+1)y' + 2y = 0\,</math> (que l'on nomme (0)) * La solution générale de (1) s'obtient en ajoutant la solution générale de (0) à la solution particulière de (1). * On résoud l'équation sans second membre (0). Cela donne la solution générale de (0). <math>(x+1)y' + 2y = 0\,</math><br /><math>(x+1)y' = -2y\,</math><br /><math>y'/y = -2/(x+1)\,</math><br /><math>ln(y) = -2ln(x+1) + k\,</math><br /><math>y(x) = exp(-2ln(x+1))exp(k)\,</math><br /><math>y(x) = K \times 1/(x+1)^2\,</math> * On cherche la solution particulière de (1). Pour cela on fait varier la constante K. <math>K \Rightarrow K(x)</math>. Ainsi <math>y(x) = K(x)\times 1/(x+1)^2\,</math> et <math>y'(x) = K'(x)\times 1/(x+1)^2 + K(x)\times (-2/(x+1)^3)\,</math>. <br />On insère dans (1).<br /><math>(x+1)[K'(x)\times 1/(x+1)^2 + K(x)\times (-2/(x+1)^3)] + 2K(x)\times 1/(x+1)^2 = 1/(x+2)\,</math><br /><math>K'(x)\times 1/(x+1) = 1/(x+2)\,</math><br /><math>K'(x) = (x+1)/(x+2)\,</math><br />or <math>(x+1) = (x+2) - 1\,</math><br />ainsi <math>K'(x) = (x+2)/(x+2) - 1/(x+2)\,</math><br /><math>K(x) = x - ln(x+2) + k\,</math><br /> *La solution particulière de (1) est <math>Yp(x) = (x - ln(x+2))/(x+1)^2\,</math> et la solution générale de (1) est la somme de la solution générale de (0) et de la solution particulière de (1) soit <math>Y(x) = K/(x+1)^2 + (x-ln(x+2))/(x+1)^2\,</math> ==== Résolution ==== * On divise par <math>y^n\,</math><br /><math>A(x)y'y^{-n} + B(x)y^{1-n} = C(x)\,</math><br />On pose <math>z(x) = y^{1-n}\,</math><br />Ainsi <math>z'(x) = (1-n)y^{-n}y'\,</math><br />On obtient <math>(A(x)z'(x))/(1-n) + B(z)z(x) = C(x) \,</math>que l'on peut résoudre. On revient ensuite à la fonction <math>y(x) = (z(x))^(1/(1-n))\,</math>. Exemple : <math>xy' + y = y^3\,</math> (ici y<sub>n</sub> = y<sub>3</sub>). * On divise par y<sub>3</sub>. Ainsi <math>x \times y'/y^3 + y/y^{3} = 1\,</math> ou <math>xy'y^{-3} + y^{-2} = 1\,</math>.<br />On pose <math>z(x) = y^{-2}\,</math> et <math>z'(x) = -2y^{-3}y'\,</math> et on effectue le changement <math>x/-2 \times z'(x) + z(x) = 1\,</math> * On résout l'équation sans second membre : <math>x/-2 \times z'(x) + z(x) = 0\,</math><br /><math>z'(x) = 2/x \times z(x)\,</math><br /><math>z'(x)/z(x) = 2/x\,</math><br /><math>ln(z(x)) = 2ln(x) + k\,</math><br /><math>z(x) = exp(ln(x^2) + k)= Kexp(x^2)\,</math> avec <math>K = exp(k)\,</math> * On fait varier la constante K, <math>K \Rightarrow K(x)\,</math><br /><math>z(x) = K(x) \times x^2</math> et <math>z'(x) = K'(x)x^2 + 2K(x)\,</math><br />On insère dans (1): <math>x/-2[K'(x)x^2 +2K(x)x] + K(x)x^2 = 1\,</math><br /><math>-1/2 \times K'(x)x^3 - K(x)x^2 + K(x)x^2 = 1\,</math><br /><math>K'(x) = -2x^{-3}</math><br /><math>K(x) = x^{-2} + C\,</math><br />Ainsi <math>z(x) = (-2x^{-2} + 2)x^2\,</math><br /><math>z(x) = 1 + Cx^2\,</math><br /><math>z(x) = 1/y^2 \Rightarrow y^2 = 1/z = 1/(1 + Cx^2)\,</math><br />Si <math>1 + Cx^2 > 0\,</math>alors <math>y(x) = \pm 1/\sqrt{1 + Cx^2}\,</math> == Équation différentielle du deuxième ordre == {{Définition|Une équation différentielle du deuxième ordre est une équation différentielle contenant y" et éventuellement y', y et la variable x.}} Exemple : * <math>xy'' - y = 0\,</math> [[Catégorie:Analyse (livre)|Equation différentielle]] m32nnfc2c6wk4nrnc762ebbjwt27qdu Analyse/Limites 0 7461 767338 257732 2026-06-02T15:05:30Z DavidL 1746 767338 wikitext text/x-wiki <noinclude>{{Analyse}}</noinclude> == Limites de fonctions à valeurs réelles == === Définition : Limite en a où a un réel === Soit <math>f</math> une application d'un intervalle <math>I</math>, non vide, non réduit à un point, à valeurs dans <math>R</math>. On dit que <math>f</math> admet <math>L</math> pour limite en <math>a</math> si et seulement si : <math>\forall\epsilon>0 \ \exists\eta>0: \ \forall x \in I, |x - a| < \eta \Rightarrow |f(x) - L| < \epsilon</math> [[Catégorie:Analyse (livre)|Limites]] 77xw6mh6l13gli23dxjvrithvy619zw 767339 767338 2026-06-02T15:05:47Z DavidL 1746 767339 wikitext text/x-wiki <noinclude>{{Analyse}}</noinclude> == Limites de fonctions à valeurs réelles == === Définition : Limite en a où a un réel === Soit <math>f</math> une application d'un intervalle <math>I</math>, non vide, non réduit à un point, à valeurs dans <math>R</math>. On dit que <math>f</math> admet <math>L</math> pour limite en <math>a</math> si et seulement si : <math>\forall\epsilon>0 \ \exists\eta>0: \ \forall x \in I, |x - a| < \eta \Rightarrow |f(x) - L| < \epsilon</math> gcmaouisgbpfbsmnqx1om8mk4xop2uz Analyse/Dérivation 0 7876 767340 760610 2026-06-02T15:06:12Z DavidL 1746 767340 wikitext text/x-wiki <noinclude>{{Analyse}}</noinclude> == Définition == ; Dérivée: Soit une fonction <math>f</math>, à valeurs dans <math> \mathbb{K} </math>, définie sur un voisinage de <math>x_0</math>. On note <math> \Delta x = x - x_o </math> la variation autour du point <math>x_o</math> et <math> \Delta f = f(x) - f(x_o) </math> la variation correspondante de la fonction <math>f</math>. ; Définition 1: On dit qu'une fonction <math>f</math> est dérivable en <math>x_0</math> si la limite<br/> <div style="text-align: center;"><math>\lim_{x \to x_0}\frac{\Delta f}{\Delta x}\, = \lim_{x \to x_0}\frac{f(x) - f(x_0)}{x - x_0}\, = \lim_{h \to 0}\frac{f(x_0 + h) - f(x_0)}{h}\, </math></div> : existe. Dans ce cas, on appelle cette limite dérivée de <math> f </math> en <math> x_0 </math> et on la note <math>f^\prime(x_0)</math>. ; Définition 2: On dit que <math>f</math> est dérivable sur un intervalle <math> I </math> si elle est dérivable en tout point de <math> I </math> et on note <math>f^\prime</math> la fonction dérivée <math>x \mapsto f^\prime (x)</math>. La dérivée de <math>f^\prime</math>, si elle existe, est notée <math>f^{\prime \prime}</math>, et par récurrence, on définit la dérivée nième de <math>f</math>, notée <math>f^{(n)}</math>.<br/><br/> : Attention à ne pas confondre avec la puissance nième de <math>f</math>, notée <math>f^n</math>, avec la dérivée <math>n</math>ième notée <math>f^{(n)}</math>. <br/> La définition suivante est souvent utile: <br/> ; Définition 3: On dit que <math>f</math> est <math>n</math> fois dérivable sur un intervalle <math>I</math> si elle est <math>n</math> fois dérivable en tout point de <math>I</math>; on dit que <br/><div style="text-align: center;"><math>f \in C^n(I)</math> si <math>f, f^\prime, ... </math></div> : sont continues sur <math>I</math>.<br/> : Donc <math>f \in C^0(I)</math> signifie simplement que <math>f</math> est continue sur <math>I</math>. On peut aussi parler de la classe <math>C^\infty (\mathbb{R})</math>, avec les polynômes, l'exponentielle, le sinus, le cosinus et la gaussienne <math>x \mapsto e^{-ax^2}</math> avec <math>a \in \mathbb{R_{+}^{*}}</math>. == Interprétation == === Interprétation géométrique === : Si <math>f</math> est à valeurs réelles et si le nombre <math>f^\prime (x_0) </math> existe, il est égal à la pente de la tangente à <math>f(x)</math> au point <math>x_0</math>. L'équation cartésienne de la droite tangente à <math>f(x)</math> en <math>x_0</math> s'écrit <math> y = f(x_0) + (x - x_0)*f^\prime (x_0) </math>. À noter que si <math> f^\prime (x_0) = \pm \infty </math> la tangente à la courbe existe encore, mais elle est verticale, et d'équation <math>x = x_0</math>. === Interprétation mécanique === : Soit <math>x(t)</math> l'équation horaire d'un point matériel selon l'axe <math>Ox</math> en fonction du temps <math>t</math>. La limite <math>\lim_{t \to t_0}\frac{x(t) - x(t_0)}{t-t_0}\, </math> est notée <math>\dot x (t_o)</math> et la fonction dérivée <math> t \mapsto \dot x (t) </math> est la vitesse du point, à l'instant <math>t</math>, selon l'axe <math>Ox</math>. L'accélération à l'instant <math>t</math>, selon ce même axe, est la dérivée seconde <math>\ddot x (t)</math>. La loi fondamentale de la dynamique newtonienne s'exprime selon <br/> <div style="text-align: center;"><math>m \ddot x (t) = F_x </math>,</div> : où <math>m</math> est la masse de la particule considérée et <math>F_x</math> la composante, selon l'axe <math>Ox</math>, de la force qui s'exerce sur la particule, qui peut dépendre de <math> x, \dot x , ... </math>. On obtient des équations différentielles que l'on ne sait résoudre analytiquement que pour des forces <math>F_x</math> assez simples. === Interprétation chimique === : On considère un échantillon de matériau radio-actif qui contient <math>N(t)</math> atomes à l'instant <math>N(t)</math>. La loi fondamentale qui régit l'évolution temporelle du phénomène de désintégration est la suivante: le taux de variation instantanée du nombre d'atomes est une constante négative, dont la valeur absolue est notée <math>\lambda</math> (elle varie selon la nature de l'atome). La variation instantanée du nombre d'atomes est la dérivée <math> \dot N (t)</math> et le taux de variation est <math> \frac{\dot N}{N}\, </math>. On a donc pour loi de variation temporelle: <div style="text-align: center;"><math> \frac{\dot N}{N}\, = - \lambda \Rightarrow \dot N (t) = \lambda N(t)</math> .</div><br/> : On obtient encore une équation différentielle; le lecteur peut vérifier que si <math>N_0</math> est le nombre d'atomes initial à <math>t = 0</math>, au temps <math>t</math> il n'en restera plus que <math>N(t) = N_0 e^{-\lambda t}</math>. == Continuité et Dérivabilité == ; Théorème: '' Toute fonction'' <math>f</math> ''dérivable en ''<math>x_0</math> ''est continue en ce point.'' : Attention! La réciproque est fausse. Par exemple la fonction <math>x \mapsto \left| x \right| </math> est continue en <math>x = 0</math>, mais elle n'est pas dérivable en <math>x = 0</math>. Ici encore, prudence: il existe des fonctions continues sur <math> \mathbb{R} </math> qui ne sont dérivables en aucun point! On ne peut pas toujours "faire un dessin". == Calcul des dérivées == * [[Analyse/Exemples de calcul de dérivée|Exemples de calcul de dérivée]] * [[Exercices de mathématiques/Calculs de dérivées|Exercices de calcul de dérivées]] == Dérivées des fonctions réciproques == == Différentielle == == Utilisations == === Dérivée première et variations === === Dérivée seconde et convexité === == Les théorèmes fondamentaux == 02waj5pm51t5qflrbic7faggz7n44h2 Analyse/Intégration 0 8580 767341 529666 2026-06-02T15:06:23Z DavidL 1746 767341 wikitext text/x-wiki <noinclude>{{Analyse}}</noinclude> == Introduction == Si il existe des domaines très importants en analyse, l'intégration en fait partie sans aucun doute. L'utilisation des intégrales se retrouvent partout : biologie, physique, statistiques, résistance des matériaux... De façon intuitive, l'intégrale d'une fonction sur un intervalle [a;b] désigne l'aire de la surface délimitée par la courbe de représentation de la fonction, l'axe des abscisses et les deux tangentes verticales d'équations x1 = a et x2 = b. Cette notion est très complexe à déterminer de manière mathématiques et ne peut se faire qu'en plusieurs étapes : * Les fonction dites en "Escalier" * Utilisation des fonctions en escaliers dans le calcul intégral * Intégration - Problèmes d’Analyse I –Nombres réels, suites et séries éviter toute ambiguïté et dans un souci de cohérence, une liste de notations et de définitions est incluse dans ce livre. Nous avons emprunté librement dans plusieurs ouvrages, recueils de problèmes et sections de problèmes de journaux tels que American Mathematical Monthly, Mathematics Today (en russe) et Delta (en polonais). La liste complète des livres est donnée en bibliographie. Donner toutes les sources originales dépassait nos objectifs et nous avons pu oublier certaines contributions. Nous présentons nos excuses si cela s’est produit. Nous avons une grande dette envers nos amis et collègues du département de mathématiques de l’université Maria Curie-Skłodowska qui nous ont fait des critiques constructives. Nous avons eu de nombreuses conversations stimulantes avec M. Koter-Mórgowska, T. Kuczumow, W. Rzymowski, S. Stachura et W. Zygmunt. Nous remercions aussi sincèrement le professeur Jan Krzyż pour son aide dans la préparation de la première version du manuscrit anglais. Nous sommes ravis d’exprimer notre gratitude au professeur Kazimierz Goebel pour ses encouragements et son intérêt actif dans ce projet. Nous sommes aussi heureux de remercier le professeur Richard J. Libera de l’université du Delaware pour son aide précieuse et généreuse dans la traduction anglaise et pour toutes ses suggestions et corrections qui ont grandement amélioré la version finale de ce livre. W. J. Kaczor, M. T. Nowak kg0mfhynjjlir82vjixe5qc6ceszszy Analyse/Généralités Et Formules 0 8581 767333 757171 2026-06-02T15:04:26Z DavidL 1746 767333 wikitext text/x-wiki <noinclude>{{Analyse}}</noinclude> == Introduction == En analyse, les problèmes complexes peuvent, la plupart du temps, se ramener à des cas simples comme l'étude de suites, de limites ... De ce fait, il est souvent utile de bénéficier d'outils qui permettent de « bricoler » les calculs pour se ramener à ces cas simples. [[Catégorie:Analyse (livre)|Généralités Et Formules]] gbk2ubyywp2c325ak9o6y0g2ir3dpw0 Wikilivres:CDU/1 4 14341 767379 643362 2026-06-03T05:39:34Z PandaMystique 119061 767379 wikitext text/x-wiki {{Division CDU|1|Philosophie, psychologie}} * '''[[/10|10]]''' - Nature, domaine et méthodes de la philosophie * '''[[/11|11]]''' - Métaphysique, ontologie, cosmologie, philosophie de la nature * '''[[/12|12]]''' - Métaphysique spéciale, liberté, ordre, chaos, infini, âme, métempsychose, etc. * '''[[/13|13]]''' - Sciences occultes, art divinatoire, astrologie, spiritisme * '''[[/14|14]]''' - Systèmes philosophiques, typologie, matérialisme, idéalisme, animisme, évolutionnisme, existentialisme, théisme, athéisme, doctrines socialistes, etc. * '''[[/159.9|159.9]]''' - Psychologie, psychophysiologie, développement mental, conscience, caractérologie, aptitudes, perception sensorielle, fonctions d'exécution des actes, processus mentaux, psychopathologie * '''[[/16|16]]''' - Logique, épistémologie, théorie de la connaissance logique, raisonnement, méthodologie de la recherche scientifique * '''[[/17|17]]''' - Morale, éthique, philosophie pratique, morale familiale, vie de famille, morale professionnelle, morale sexuelle, relations humaines gxrl52v2we0lmjxgass3pu5n0pnciio Wikilivres:CDU/1/10 4 14694 767380 678183 2026-06-03T05:42:25Z PandaMystique 119061 767380 wikitext text/x-wiki {{Titre simple|10 - Nature, domaine et méthodes de la philosophie}} * [[Dictionnaire de philosophie]] * [[Pour lire Platon]] * [[Philosophie/Une brève introduction|Une brève introduction]] [[Catégorie:Recherche CDU 1 – Philosophie, psychologie]] [[Catégorie:Recherche CDU niveau 2]] abbiu5yazi4kuclmcvgjti3k8tcvsz9 Wikilivres:CDU/7/78 4 14988 767387 653489 2026-06-03T07:37:32Z DavidL 1746 767387 wikitext text/x-wiki {{Titre simple|78 - Musique}} * [[Accordéon chromatique]] * [[Apprendre la guitare]] * [[Formation musicale]] * [[Étude scientifique de la technique du piano]] * [[Guitare basse]] * [[Histoire de la musique]] * [[Introduction à LilyPond]] * [[MusiXTeX]] [[Catégorie:Recherche CDU 7 – Arts et beaux-arts, divertissements, musique, jeux, sport]] [[Catégorie:Recherche CDU niveau 2]] g8dj41w65k2p5lty3ztpci7s51u79zt Analyse/Vectorielle 0 16787 767342 481014 2026-06-02T15:06:44Z DavidL 1746 767342 wikitext text/x-wiki <noinclude>{{Analyse}}</noinclude> =Analyse Vectorielle= L'analyse vectorielle peut se concevoir comme une "généralisation" des concepts vu dans l'ensemble des réels à des des espaces de dimensions plus grandes. Avant de nous attaquer au vrai fond, il est nécessaire de redéfinir les notions de limites, de valeur absolue et d'intervalles dans un espace de dimension n > 1. == Notions de Norme == ge0pxsf84uop4zl8jpo98h1vrhfaj0t Wikilivres:Vitrine 4 19533 767365 682016 2026-06-02T17:51:08Z DavidL 1746 /* Sciences */ 767365 wikitext text/x-wiki <indicator name="qualité">[[File:Fairytale bookmark gold.png|20px|link=]]</indicator> <div style="padding: 20px; font-size: 120%; text-align: left; border: 1px solid #9f9f9f80;"> <h2 style="border-bottom: 0px; font-weight: bold; color: #222222">Bienvenue sur la vitrine de Wikilivres !</h2> [[Image:Pedia-bunch-4.jpg|right|300px]] Nous exposons ici les livres qui se distinguent par la complétude de leur contenu, leur forme ou leur originalité. Nous entendons ainsi montrer la viabilité de notre projet ainsi que la diversité des sujets abordés. <div style="margin:2em;text-align:center;"> {{Bloc|[[#Anthropologie|Anthropologie]] •}} {{Bloc|[[#Astronomie et espace|Astronomie et espace]] •}} {{Bloc|[[#Documentation|Documentation]] •}} {{Bloc|[[#Économie|Économie]] •}} {{Bloc|[[#Histoire|Histoire]] •}} {{Bloc|[[#Informatique|Informatique]] •}} {{Bloc|[[#Langues|Langues]] •}} {{Bloc|[[#Musique|Musique]] •}} {{Bloc|[[#Philosophie|Philosophie]] •}} {{Bloc|[[#Sciences|Sciences]] •}} {{Bloc|[[#Vie quotidienne et loisirs|Vie quotidienne et loisirs]] •}} [[#Wikijunior|Wikijunior]] </div> <small>Pour ajouter un livre, voir [[Wikilivres:Livres en vitrine|cette page]].</small> <div style="clear: right;"></div> </div> == Anthropologie == {{/Le mouvement Wikimédia}} {{clr}} == Astronomie et espace == {{/L'agence spatiale européenne et l'indépendance de l'Europe}} {{/Les contraintes du milieu spatial}} {{/Mini-guide du catalogue Messier}} {{/Méthodes de propulsion spatiale}} {{/Planétologie}} {{/Cosmologie}} {{/Vol balistique et missiles balistiques}} <div style="clear: left;"></div> == Documentation == {{/La documentation}} <div style="clear: left;"></div> == Économie == {{/La politique monétaire}} {{/La science de la finance}} <div style="clear: left;"></div> == Histoire == {{/La Grande Chasse aux sorcières, du Moyen Âge aux Temps modernes}} <!-- {{/Histoire de France}} {{/Histoire de l'Europe}} {{/Histoire de la musique}} --> <div style="clear: left;"></div> == Informatique == {{/Programmation C}} {{/Programmation C++}} {{/Programmation C sharp}} {{/Programmation D}} {{/Programmation Python}} {{/PyQt}} {{/Mathématiques avec Python et Ruby}} {{/Programmation PHP}} {{/Programmation Java}} {{/Programmation en Go}} {{/Git}} {{/Framework Spring}} {{/Le langage HTML}} {{/MediaWiki pour débutants}} {{/Programmation VBScript}} {{/Visual Basic .NET}} {{/Les bases de données}} {{/MySQL}} {{/Oracle Database}} {{/Microsoft SQL Server}} {{/Fonctionnement d'un ordinateur}} {{/Monter un PC}} {{/Les cartes graphiques}} {{/Les systèmes d'exploitation}} {{/Les opérations bit à bit}} {{/Les réseaux informatiques}} {{/Débutez dans IRC}} {{/Découvrir le SVG}} {{/Mathc initiation}} {{/Mathc gnuplot}} {{/Mathc matrices}} {{/Mathc complexes}} {{/Ubuntu}} {{/Pouvoir Accéder et Utiliser Writer}} {{/Pouvoir Accéder et Utiliser MATE}} {{/À la découverte d'Unicode}} {{/Apache}} <div style="clear: left;"></div> == Langues == {{/Lecture de stèles grecques}} {{/Enseignement du toki pona}} <div style="clear: left;"></div> == Musique == {{/Formation musicale}} {{/Étude scientifique de la technique du piano}} {{/Introduction à LilyPond}} <div style="clear: left;"></div> == Philosophie == {{/Les Stoïciens : Épictète Le poignard à la main}} {{/Commentaire philosophique/Discours sur l'origine et les fondements de l'inégalité parmi les hommes}} {{/Précis d'épistémologie}} <div style="clear: left;"></div> == Sciences == {{/Tribologie}} {{/Électricité}} {{/Électronique}} {{/Une histoire des transmutations biologiques}} {{/Détermination des minéraux}} {{/Soudage}} {{/Psychologie cognitive pour l'enseignant}} {{/Neurosciences}} {{/Mémoire}} {{/Le noyau atomique}} {{/Théorie quantique de l'observation}} {{/Effets des rayonnements électromagnétiques sur le vivant}} {{/Calcul différentiel et intégral pour débutants}} {{/Les suites et séries}} {{/LaTeX}} {{/S'initier au boulier en 10 leçons}} {{/Découvrir Scilab}} {{/Hélices de navires à déplacement}} <div style="clear: left;"></div> == Vie quotidienne et loisirs == {{/Livre de cuisine}} {{/Photographie}} {{/Régime et gastronomie}} {{/Écrire en cirth}} {{/Guide du vélo en ville}} {{/Préparation au certificat d'opérateur du service amateur}} {{/Culture des Cactus}} {{/Culture (simplifiée) des bonsaïs}} {{/Jardinage}} {{/Jeu de rôle sur table — Jouer, créer}} <div style="clear: left;"></div> == Wikijunior == {{/Wikijunior:Les dinosaures}} {{/Wikijunior:Alphabet des fleurs}} {{/Wikijunior:La montagne}} {{/Wikijunior:Alphabet des animaux}} {{/Wikijunior:Les couleurs}} {{/Wikijunior:Les fruits}} {{/Wikijunior:Alphabet des aliments}} {{/Wikijunior:Alphabet des pays du monde}} {{/Wikijunior:Petits nombres}} {{/Wikijunior:les cactus}} {{/Wikijunior:Nombres de 0 à 20}} {{/Wikijunior:Alphabet}} {{/Wikijunior:Le monde au travail}} {{/Wikijunior:Alphabet des transports}} {{/Wikijunior:Système solaire}} [[Catégorie:Wikilivres|{{SUBPAGENAME}}]] [[en:Wikibooks:Featured books]] [[es:Wikilibros:Libros destacados]] [[it:Wikibooks:Vetrina]] [[de:Wikibooks:Empfehlenswerte Bücher]] [[pt:Wikilivros:Melhores do Wikilivros]] __NOTOC__ jwd4aiu90qyjcsuiu8e0ctbs0u2ep76 Accueil/Vitrine 0 20362 767367 740923 2026-06-02T17:52:37Z DavidL 1746 82 livres 767367 wikitext text/x-wiki <noinclude> {{RemarqueIndex|align=middle|Veuillez utiliser le bouton au dessus de la zone d'édition pour modifier le nombre de livres.}} [[Catégorie:Accueil|Vitrine]] Aujourd'hui {{JourSemaine}} : [[Wikilivres:Vitrine/{{IndexJour|82|7|2}}]] <div style="text-align:center; margin-bottom:10px; max-width:30%; margin:auto;"> </noinclude> <div style="float:left; min-width: 350px; width: 100%; margin-left:7px; margin-bottom:7px;"> {{:Wikilivres:Vitrine/{{IndexJour|82|7|2}}|Accueil}} <div class="" style="text-align:center; margin:0.5em;">'''[[Wikilivres:Vitrine|Tous les livres en vitrine »]]'''</div> </div> <noinclude> </div>{{clr}} <!-- Copier les mêmes paramètres pour le modèle IndexJour ci-dessus et ci-dessous --> ---- Dans les prochains jours : <div style="text-align:center; margin-bottom:10px;"> <div style="float: left; min-width: 350px; margin-left: 7px; margin-bottom: 7px; width: 30%; max-width: 400px; text-align:center;"> {{ucfirst:{{JourSemaine|décalage=1}}}} </div> <div style="float: left; min-width: 350px; margin-left: 7px; margin-bottom: 7px; width: 30%; max-width: 400px; text-align:center;"> {{ucfirst:{{JourSemaine|décalage=2}}}} </div> <div style="float: left; min-width: 350px; margin-left: 7px; margin-bottom: 7px; width: 30%; max-width: 400px; text-align:center;"> {{ucfirst:{{JourSemaine|décalage=3}}}} </div> {{clr}} {{:Wikilivres:Vitrine/{{IndexJour|82|7|2|decalage=1}}}} {{:Wikilivres:Vitrine/{{IndexJour|82|7|2|decalage=2}}}} {{:Wikilivres:Vitrine/{{IndexJour|82|7|2|decalage=3}}}} </div> </noinclude> 4gdibx8gkhf6yjazcfexjheukn0pysa Discussion utilisateur:DavidL 3 26158 767328 767316 2026-06-02T14:23:21Z DavidL 1746 /* Demande de conseil sur les pages en impasse */ 767328 wikitext text/x-wiki {{/Onglets}} {| class="flexible" style="width:100%;" | style="vertical-align: top;" | <div style="padding: 20px; font-size: 120%; border: thin solid #A7D7F9;"> [[Image:Chat bubbles.svg|123px|right]] Bienvenue sur ma page de discussion. <!-- le lien "ajouter un message" --> <div class="noprint plainlinks" style="background-color: #9292924f; width: 300px; margin-top: 30px; margin-left: auto; margin-right: auto; padding: 5px 25px 5px 25px; text-align: center; border: 1px solid #9292924f; font-size:12pt; -moz-border-radius:5px; -webkit-border-radius:5px; -o-border-radius:5px; border-radius:5px; background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#00000000), to(#93939328)); background:-moz-linear-gradient(0% 90% 90deg, #93939328, #00000000);"> [{{fullurl:Discussion utilisateur:DavidL|action=edit&section=new}} Ajouter un message] </div> {{clr}} </div> | style="vertical-align: top;" | __TOC__ |} <!--{{OngFin}}--> <!-- *************************************** --> == Salut David == Ça fait un bail ! Merci pour ta correction dans le chapitre consacré à la création des projets de mon bouquin sur le Mouvement Wikimédia. J'en profite pour te dire que le livre devrait, enfin et si tout se déroule comme prévu, être publié au format de poche en début de cette nouvelle année. Raison pour laquelle je suis en train de tout relire et remettre en forme tout en corrigeant pas mal d'informations parfois fausses ou en tout cas mal formulées. Dans ce travail de relecture, j'ai découvert que l'outil de création automatique d'une référence au départ de l'URL d'une page ne fonctionne pas sur Wikilivre. Tu vois ce dont je parle ? C'est une option du menu qui apparait dans l'éditeur visuel. Quand tu cliques sur « sourcer » un encart te proposes d'introduite une référence automatiquement, manuellement, ou de dupliquer le renvoi vers une référence déjà existante. Et bien sur Wikilivres, la fonction automatique ne fonctionne pas pour l'instant, alors qu'elle fonctionne sur Wikipédia et Wikiversité, là où je crée mes références avant de les copier-coller dans Wikilivres en attendant que le problème soit résolut. As-tu du temps pour voir ce qui pose un problème ? Moi, je suis un peu à la bourre pour terminer ma relecture à temps... [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 3 janvier 2026 à 18:03 (CET) :Salut Lionel :J'ai testé : j'obtiens un message d'avertissement dans la console : : « Mapping(s) missing from citoid-template-type-map.json: dataset, preprint, standard » : « Empty template Lien web produced. Check this template has a correctly configured citoid map in the template data. » :et également une erreur de requête HTTP dans la réponse en JSON : « error "Unable to retrieve data from ..." » :Il doit y avoir une différence quelque part dans [[Module:Biblio|le module Biblio]] avec wikipédia. :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 4 janvier 2026 à 00:39 (CET) ::Je vois que tu as plus de compétence que moi en la matière. Je voudrais bien développé mes connaissances en informatique, mais dela demande du temps, de la motivation et un certaine organisation. Merci pour ton aide ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 4 janvier 2026 à 04:41 (CET) == Texte indigeste == Salut David, Je n'ai pas compris ta dernière modif sur [[Philosophie/Thalès de Milet/Textes_et_traductions_Ier_millénaire_AEC|Philosophie/Thalès de Milet/Textes_et_traductions_Ier_millénaire_AEC]], en quoi est-ce indigeste ? [[Utilisateur:Alex Mtlr|Alex Mtlr]] ([[Discussion utilisateur:Alex Mtlr|discussion]]) 17 mars 2026 à 08:51 (CET) :Salut Alex, :Il s'agit du code wiki de la page qui n'est pas du tout lisible, il y a plus de code HTML que de contenu. Alors qu'il faudrait utiliser le style commun, ne pas faire du formatage systématique, utiliser les modèles standards pour avoir un code wiki simple. :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 17 mars 2026 à 08:54 (CET) ::Salut David, ::A vrai dire, je n'ai utilisé que le strict nécessaire pour rendre la page la plus lisible possible, est-ce que tu as des exemples de structuration de code en tête pour le rendre plus clair ? [[Utilisateur:Alex Mtlr|Alex Mtlr]] ([[Discussion utilisateur:Alex Mtlr|discussion]]) 18 mars 2026 à 08:59 (CET) :::La page [[Philosophie/Thalès de Milet/Textes_et_traductions_Ier_millénaire_AEC|Philosophie/Thalès de Milet/Textes_et_traductions_Ier_millénaire_AEC]] fait 1M d'octets. :::Il faudrait la diviser en sous pages, supprimer le formatage pour utiliser une syntaxe wiki claire, éviter les boîtes déroulantes, les défilements dans des zones de hauteur limitée. :::Les autres livres ont un texte source clair, et sont de taille raisonnable : :::* [[Programmation Java/Commentaires]] 2383 octets, :::* [[Étude scientifique de la technique du piano/L’étude scientifique de la technique]] 36907 octets, :::* [[Photographie]] 7898 octets, :::* [[Photographie/Conseils aux débutants/Acheter un appareil numérique]] 27852 octets. :::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 18 mars 2026 à 19:12 (CET) :::: Bonjour David, :::: Pour les pages [[Philosophie/Thalès de Milet/Textes_et_traductions_Ier_millénaire_AEC|Textes et traductions Ier millénaire AEC]] et [[Philosophie/Thalès de Milet/Textes_et_traductions_Ier_millénaire_EC|Textes et traductions Ier millénaire EC]], je n'ai uniquement utilisé l'éditeur wikicode et jamais d'éditeur html. Par contre, pourquoi ne peut-on pas utiliser la mise en forme que l'on souhaite sur Wikibooks ? Sur les autres portails je comprends la nécessité de standardisation, mais les livres sur Wikibooks sont tous différents... [[Utilisateur:Alex Mtlr|Alex Mtlr]] ([[Discussion utilisateur:Alex Mtlr|discussion]]) 30 avril 2026 à 16:57 (CET) :::::Bonjour Alex, :::::Les livres sont tous différents en mises en forme, mais il y a des règles et recommandations à respecter, notamment [[Aide:Syntaxe#Les erreurs à éviter|ne pas abuser du HTML et privilégier la syntaxe wiki]]. Les pages doivent pouvoir être mises à jour par tous. Il faut notamment utiliser [[Wikilivres:Modèles|les modèles disponibles]] plutôt que d'inventer une mise en forme. Il faut surtout ne pas utiliser le copier-coller, mais soit utiliser un modèle existant, soit en créer de nouveaux pour les utiliser de nombreuses fois dans les pages ; par exemple, cela permet de modifier le style de tous les paragraphes en un seul endroit : dans le modèle. :::::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 30 avril 2026 à 19:14 (CEST) == Merci David == j'ai observé que tu avais mis mon livre le "miroir brisé" ...... sur l'établi MERCI et bien cordialement :-) [[Utilisateur:Clopeau|Clopeau]] ([[Discussion utilisateur:Clopeau|discussion]]) 18 mars 2026 à 07:22 (CET) == You may be an eligible candidate for the U4C election == <div lang="en" dir="ltr" class="mw-content-ltr"> Greetings, The [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee|Universal Code of Conduct Coordinating Committee (U4C)]] seeks candidates for the 2026 election. The U4C is the global committee responsible for overseeing enforcement of the [[foundation:Special:MyLanguage/Policy:Universal Code of Conduct|Universal Code of Conduct]]. Elections are held annually, if elected a committee member serves for two years. This year the U4C requires candidates to hold administrator rights on at least one wiki, which is why you are being contacted as you appear to hold this right. There are other requirements, such as candidates must be at least 18 years old and may not be employed by the Wikimedia Foundation or other related chapters and affiliates. You can find more information in the [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2026#Call_for_Candidates|call for candidates on Meta-wiki]]. Additionally, the committee's working language is English; some ability to communicate in English is required. The election opens on 18 May, if you are eligible and interested you have until 10 May to submit your candidacy. There will week between for candidates to answer questions from the community. Voting takes place privately in [[m:Special:MyLanguage/SecurePoll|SecurePoll]], successful candidates must receive at least 60% support. More information is available on [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2026|the 2026 Elections page]], including timelines and other candidacy information. If you read over the material and consider yourself qualified, please consider submitting your name to run for the committee. If you think someone else in your community might be interested and qualified, please encourage them to run. In partnership with the U4C -- [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User_talk:Keegan (WMF)|talk]]) 28 avril 2026 à 20:33 (CEST) </div> <!-- Message envoyé par User:Keegan (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=User:Keegan_(WMF)/test&oldid=30471754 --> == Demande de conseil sur les pages en impasse == Bonjour, J'avais de nombreuses pages dans cette catégorie. [[Spécial:Pages en impasse|Pages en impasse]] J'ai pu sortir ces pages en créant un lien sur une page principale. Dans cette catégorie, il y a plus de 2000 pages. Je pense qu'elles sont bien structurées, mais il manque un lien vers une page, pour qu'elles sortent de cette catégorie. Ex : La page [[Mathc initiation/Fichiers h : c30a2|x_def.h]] est appelée par tous les exemples. Tous les exemples appellent la même page. Je ne pouvais donc pas faire un retour sur une page particulière. J'ai donc sélectionné une page "Mathc initiation/a406" que j'appelle ainsi ""[[Mathc initiation/a406|.]] "" (le point est un lien internet). Le résultat est un point en fin de fichier qui permet de sortir cette page des pages en impasse. Mon idée est de sans modifier les pages en impasse, créer un lien pour les sortir de cette situation. Ex: Pour le livre [[Accordéon chromatique]] copier le lien ""[[Accordéon chromatique|.]] "" (le point est un lien internet) à la fin du fichier pour sortir ce livre des pages à impasse. Je voudrais savoir si je peux faire ce travail. Merci [[Utilisateur:Xhungab|Xhungab]] ([[Discussion utilisateur:Xhungab|discussion]]) 2 juin 2026 à 12:22 (CEST) :Bonjour Xhungab, :Les autres livres ont un modèle commun de navigation inclus dans toutes les pages, contenant des liens vers les autres chapitres ; les pages ne sont donc pas en impasse. :Il faudrait inclure une liste complète des pages, comme un sommaire (ex : [[Programmation_Java_Swing/Sommaire]]), inclus via le modèle {{m|Haut de page}} dans les pages du livre permettant d'inclure automatiquement un lien vers la page précédente et la page suivante et d'afficher le sommaire déroulant (ex : voir [[Programmation_Java_Swing/Menus]]. :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 2 juin 2026 à 16:22 (CEST) io9l1pxirmo65qe4ikpigfo0yiflkkg 767381 767328 2026-06-03T06:12:55Z Xhungab 23827 767381 wikitext text/x-wiki {{/Onglets}} {| class="flexible" style="width:100%;" | style="vertical-align: top;" | <div style="padding: 20px; font-size: 120%; border: thin solid #A7D7F9;"> [[Image:Chat bubbles.svg|123px|right]] Bienvenue sur ma page de discussion. <!-- le lien "ajouter un message" --> <div class="noprint plainlinks" style="background-color: #9292924f; width: 300px; margin-top: 30px; margin-left: auto; margin-right: auto; padding: 5px 25px 5px 25px; text-align: center; border: 1px solid #9292924f; font-size:12pt; -moz-border-radius:5px; -webkit-border-radius:5px; -o-border-radius:5px; border-radius:5px; background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#00000000), to(#93939328)); background:-moz-linear-gradient(0% 90% 90deg, #93939328, #00000000);"> [{{fullurl:Discussion utilisateur:DavidL|action=edit&section=new}} Ajouter un message] </div> {{clr}} </div> | style="vertical-align: top;" | __TOC__ |} <!--{{OngFin}}--> <!-- *************************************** --> == Salut David == Ça fait un bail ! Merci pour ta correction dans le chapitre consacré à la création des projets de mon bouquin sur le Mouvement Wikimédia. J'en profite pour te dire que le livre devrait, enfin et si tout se déroule comme prévu, être publié au format de poche en début de cette nouvelle année. Raison pour laquelle je suis en train de tout relire et remettre en forme tout en corrigeant pas mal d'informations parfois fausses ou en tout cas mal formulées. Dans ce travail de relecture, j'ai découvert que l'outil de création automatique d'une référence au départ de l'URL d'une page ne fonctionne pas sur Wikilivre. Tu vois ce dont je parle ? C'est une option du menu qui apparait dans l'éditeur visuel. Quand tu cliques sur « sourcer » un encart te proposes d'introduite une référence automatiquement, manuellement, ou de dupliquer le renvoi vers une référence déjà existante. Et bien sur Wikilivres, la fonction automatique ne fonctionne pas pour l'instant, alors qu'elle fonctionne sur Wikipédia et Wikiversité, là où je crée mes références avant de les copier-coller dans Wikilivres en attendant que le problème soit résolut. As-tu du temps pour voir ce qui pose un problème ? Moi, je suis un peu à la bourre pour terminer ma relecture à temps... [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 3 janvier 2026 à 18:03 (CET) :Salut Lionel :J'ai testé : j'obtiens un message d'avertissement dans la console : : « Mapping(s) missing from citoid-template-type-map.json: dataset, preprint, standard » : « Empty template Lien web produced. Check this template has a correctly configured citoid map in the template data. » :et également une erreur de requête HTTP dans la réponse en JSON : « error "Unable to retrieve data from ..." » :Il doit y avoir une différence quelque part dans [[Module:Biblio|le module Biblio]] avec wikipédia. :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 4 janvier 2026 à 00:39 (CET) ::Je vois que tu as plus de compétence que moi en la matière. Je voudrais bien développé mes connaissances en informatique, mais dela demande du temps, de la motivation et un certaine organisation. Merci pour ton aide ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 4 janvier 2026 à 04:41 (CET) == Texte indigeste == Salut David, Je n'ai pas compris ta dernière modif sur [[Philosophie/Thalès de Milet/Textes_et_traductions_Ier_millénaire_AEC|Philosophie/Thalès de Milet/Textes_et_traductions_Ier_millénaire_AEC]], en quoi est-ce indigeste ? [[Utilisateur:Alex Mtlr|Alex Mtlr]] ([[Discussion utilisateur:Alex Mtlr|discussion]]) 17 mars 2026 à 08:51 (CET) :Salut Alex, :Il s'agit du code wiki de la page qui n'est pas du tout lisible, il y a plus de code HTML que de contenu. Alors qu'il faudrait utiliser le style commun, ne pas faire du formatage systématique, utiliser les modèles standards pour avoir un code wiki simple. :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 17 mars 2026 à 08:54 (CET) ::Salut David, ::A vrai dire, je n'ai utilisé que le strict nécessaire pour rendre la page la plus lisible possible, est-ce que tu as des exemples de structuration de code en tête pour le rendre plus clair ? [[Utilisateur:Alex Mtlr|Alex Mtlr]] ([[Discussion utilisateur:Alex Mtlr|discussion]]) 18 mars 2026 à 08:59 (CET) :::La page [[Philosophie/Thalès de Milet/Textes_et_traductions_Ier_millénaire_AEC|Philosophie/Thalès de Milet/Textes_et_traductions_Ier_millénaire_AEC]] fait 1M d'octets. :::Il faudrait la diviser en sous pages, supprimer le formatage pour utiliser une syntaxe wiki claire, éviter les boîtes déroulantes, les défilements dans des zones de hauteur limitée. :::Les autres livres ont un texte source clair, et sont de taille raisonnable : :::* [[Programmation Java/Commentaires]] 2383 octets, :::* [[Étude scientifique de la technique du piano/L’étude scientifique de la technique]] 36907 octets, :::* [[Photographie]] 7898 octets, :::* [[Photographie/Conseils aux débutants/Acheter un appareil numérique]] 27852 octets. :::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 18 mars 2026 à 19:12 (CET) :::: Bonjour David, :::: Pour les pages [[Philosophie/Thalès de Milet/Textes_et_traductions_Ier_millénaire_AEC|Textes et traductions Ier millénaire AEC]] et [[Philosophie/Thalès de Milet/Textes_et_traductions_Ier_millénaire_EC|Textes et traductions Ier millénaire EC]], je n'ai uniquement utilisé l'éditeur wikicode et jamais d'éditeur html. Par contre, pourquoi ne peut-on pas utiliser la mise en forme que l'on souhaite sur Wikibooks ? Sur les autres portails je comprends la nécessité de standardisation, mais les livres sur Wikibooks sont tous différents... [[Utilisateur:Alex Mtlr|Alex Mtlr]] ([[Discussion utilisateur:Alex Mtlr|discussion]]) 30 avril 2026 à 16:57 (CET) :::::Bonjour Alex, :::::Les livres sont tous différents en mises en forme, mais il y a des règles et recommandations à respecter, notamment [[Aide:Syntaxe#Les erreurs à éviter|ne pas abuser du HTML et privilégier la syntaxe wiki]]. Les pages doivent pouvoir être mises à jour par tous. Il faut notamment utiliser [[Wikilivres:Modèles|les modèles disponibles]] plutôt que d'inventer une mise en forme. Il faut surtout ne pas utiliser le copier-coller, mais soit utiliser un modèle existant, soit en créer de nouveaux pour les utiliser de nombreuses fois dans les pages ; par exemple, cela permet de modifier le style de tous les paragraphes en un seul endroit : dans le modèle. :::::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 30 avril 2026 à 19:14 (CEST) == Merci David == j'ai observé que tu avais mis mon livre le "miroir brisé" ...... sur l'établi MERCI et bien cordialement :-) [[Utilisateur:Clopeau|Clopeau]] ([[Discussion utilisateur:Clopeau|discussion]]) 18 mars 2026 à 07:22 (CET) == You may be an eligible candidate for the U4C election == <div lang="en" dir="ltr" class="mw-content-ltr"> Greetings, The [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee|Universal Code of Conduct Coordinating Committee (U4C)]] seeks candidates for the 2026 election. The U4C is the global committee responsible for overseeing enforcement of the [[foundation:Special:MyLanguage/Policy:Universal Code of Conduct|Universal Code of Conduct]]. Elections are held annually, if elected a committee member serves for two years. This year the U4C requires candidates to hold administrator rights on at least one wiki, which is why you are being contacted as you appear to hold this right. There are other requirements, such as candidates must be at least 18 years old and may not be employed by the Wikimedia Foundation or other related chapters and affiliates. You can find more information in the [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2026#Call_for_Candidates|call for candidates on Meta-wiki]]. Additionally, the committee's working language is English; some ability to communicate in English is required. The election opens on 18 May, if you are eligible and interested you have until 10 May to submit your candidacy. There will week between for candidates to answer questions from the community. Voting takes place privately in [[m:Special:MyLanguage/SecurePoll|SecurePoll]], successful candidates must receive at least 60% support. More information is available on [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2026|the 2026 Elections page]], including timelines and other candidacy information. If you read over the material and consider yourself qualified, please consider submitting your name to run for the committee. If you think someone else in your community might be interested and qualified, please encourage them to run. In partnership with the U4C -- [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User_talk:Keegan (WMF)|talk]]) 28 avril 2026 à 20:33 (CEST) </div> <!-- Message envoyé par User:Keegan (WMF)@metawiki en utilisant la liste sur https://meta.wikimedia.org/w/index.php?title=User:Keegan_(WMF)/test&oldid=30471754 --> == Demande de conseil sur les pages en impasse == Bonjour, J'avais de nombreuses pages dans cette catégorie. [[Spécial:Pages en impasse|Pages en impasse]] J'ai pu sortir ces pages en créant un lien sur une page principale. Dans cette catégorie, il y a plus de 2000 pages. Je pense qu'elles sont bien structurées, mais il manque un lien vers une page, pour qu'elles sortent de cette catégorie. Ex : La page [[Mathc initiation/Fichiers h : c30a2|x_def.h]] est appelée par tous les exemples. Tous les exemples appellent la même page. Je ne pouvais donc pas faire un retour sur une page particulière. J'ai donc sélectionné une page "Mathc initiation/a406" que j'appelle ainsi ""[[Mathc initiation/a406|.]] "" (le point est un lien internet). Le résultat est un point en fin de fichier qui permet de sortir cette page des pages en impasse. Mon idée est de sans modifier les pages en impasse, créer un lien pour les sortir de cette situation. Ex: Pour le livre [[Accordéon chromatique]] copier le lien ""[[Accordéon chromatique|.]] "" (le point est un lien internet) à la fin du fichier pour sortir ce livre des pages à impasse. Je voudrais savoir si je peux faire ce travail. Merci [[Utilisateur:Xhungab|Xhungab]] ([[Discussion utilisateur:Xhungab|discussion]]) 2 juin 2026 à 12:22 (CEST) :Bonjour Xhungab, :Les autres livres ont un modèle commun de navigation inclus dans toutes les pages, contenant des liens vers les autres chapitres ; les pages ne sont donc pas en impasse. :Il faudrait inclure une liste complète des pages, comme un sommaire (ex : [[Programmation_Java_Swing/Sommaire]]), inclus via le modèle {{m|Haut de page}} dans les pages du livre permettant d'inclure automatiquement un lien vers la page précédente et la page suivante et d'afficher le sommaire déroulant (ex : voir [[Programmation_Java_Swing/Menus]]. :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 2 juin 2026 à 16:22 (CEST) Merci pour l'info [[Utilisateur:Xhungab|Xhungab]] ([[Discussion utilisateur:Xhungab|discussion]]) 3 juin 2026 à 08:12 (CEST) 3tc1y2avlsn87q1n6kq2opij3wouz0d Dictionnaire de philosophie 0 30495 767374 765018 2026-06-03T05:12:25Z PandaMystique 119061 767374 wikitext text/x-wiki {{Page de garde|image=Dictionnaire de philosophie.png|imagedesc=|titre=Index|description= <!-- Ligne 1 : A-I --> <table style="width:100%; border-collapse:separate; border-spacing:6px; margin-bottom:6px;"> <tr> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/A|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">A</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/B|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">B</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/C|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">C</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/D|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">D</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/E|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">E</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/F|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">F</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/G|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">G</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/H|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">H</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/I|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">I</span>]]</td> </tr> </table> <!-- Ligne 2 : J-R --> <table style="width:100%; border-collapse:separate; border-spacing:6px; margin-bottom:6px;"> <tr> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/J|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">J</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/K|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">K</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/L|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">L</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/M|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">M</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/N|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">N</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/O|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">O</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/P|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">P</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/Q|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">Q</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/R|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">R</span>]]</td> </tr> </table> <!-- Ligne 3 : S-Z --> <table style="width:100%; border-collapse:separate; border-spacing:6px;"> <tr> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/S|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">S</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/T|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">T</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/U|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">U</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/V|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">V</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/W|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">W</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/X|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">X</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/Y|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">Y</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/Z|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">Z</span>]]</td> <td style="width:11.1%; text-align:center;"><span style="display:block; padding:8px 0; color:#cfc4ad; font-family:Georgia,'Times New Roman',serif; font-size:1.15em;">&nbsp;</span></td> </tr> </table> |avancement=Ébauche |cdu= * {{CDU item|1/10}} |versions= {{PhiloRecherche}} {{version imprimable}} }} <!-- ═══════════════════════════════════════════════════════════════════ ENTRÉES THÉMATIQUES ═══════════════════════════════════════════════════════════════════ --> <div style="margin: 30px 0 12px 0; padding-bottom: 6px; border-bottom: 2px solid #8b7355;"> <span style="font-size: 1.1em; font-weight: 700; color: #5a4a3a; letter-spacing: 0.02em;">ENTRÉES PAR THÈME</span> <span style="font-size: 0.85em; color: #999; margin-left: 12px;">Parcourir par domaine</span> </div> <table style="width:100%; border-collapse:separate; border-spacing:12px;"> <tr> <!-- MÉTAPHYSIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f3eef4, #e9e1ec); border:1px solid #8a6f96; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#473a52; margin-bottom:6px;">🔮 Métaphysique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Être, substance, existence, essence, néant, possible, nécessaire…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Métaphysique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> <!-- ÉPISTÉMOLOGIE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #eef2f7, #e2e9f1); border:1px solid #6a86a8; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#2c456b; margin-bottom:6px;">🔬 Épistémologie</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Connaissance, vérité, science, méthode, preuve, certitude…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Épistémologie|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> <!-- ÉTHIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f6f1e6, #ece3d0); border:1px solid #b39a5e; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#5f4a1c; margin-bottom:6px;">⚖️ Éthique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Bien, mal, vertu, devoir, justice, bonheur, liberté…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Éthique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> </tr> <tr> <!-- LOGIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f1f1f3, #e6e6ea); border:1px solid #8a8a94; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#3a3a46; margin-bottom:6px;">🧮 Logique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Raisonnement, proposition, déduction, induction, syllogisme…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Logique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> <!-- ESTHÉTIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f6efe8, #ecdfd2); border:1px solid #b8845c; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#6a4326; margin-bottom:6px;">🎨 Esthétique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Beau, sublime, art, goût, imagination, création…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Esthétique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> <!-- POLITIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #eef3ea, #e2ebdc); border:1px solid #7d9a6c; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#3a5230; margin-bottom:6px;">🏛️ Politique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">État, pouvoir, droit, contrat, souveraineté, citoyenneté…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Politique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> </tr> </table> <!-- ═══════════════════════════════════════════════════════════════════ RESSOURCES : Dernières mises à jour + Voir aussi (même ligne) ═══════════════════════════════════════════════════════════════════ --> <table style="width:100%; border-collapse:separate; border-spacing:12px; margin-top:18px;"> <tr> <td class="noprint" style="width:50%; vertical-align:top;"> <div style="background:linear-gradient(180deg, #f7f4ee, #efe9df); border:1px solid #d3c8b3; border-radius:8px; overflow:hidden; height:100%;"> <div style="background:linear-gradient(180deg, #4a4238, #38322a); padding:10px 15px; text-align:center;"> <span style="font-size:0.9em; font-weight:600; color:#ffffff; letter-spacing:0.05em;">📝 Dernières mises à jour</span> </div> <div style="padding:12px 16px; font-size:0.92em; line-height:1.8; color:#444;"> <DynamicPageList> category = Dictionnaire de philosophie (livre) count = 5 order = lastedit </DynamicPageList> </div> </div> </td> <td style="width:50%; vertical-align:top;"> <div style="background:linear-gradient(180deg, #f7f4ee, #efe9df); border:1px solid #d3c8b3; border-radius:8px; overflow:hidden; height:100%;"> <div style="background:linear-gradient(180deg, #4a4238, #38322a); padding:10px 15px; text-align:center;"> <span style="font-size:0.9em; font-weight:600; color:#ffffff; letter-spacing:0.05em;">Voir aussi</span> </div> <div style="padding:12px 16px; font-size:0.92em; line-height:1.9; color:#444;"> → [[Philosophie|Portail Philosophie]]<br> → [[Manuel de terminale de philosophie|Manuel de Terminale]]<br> → [[Philosophie/Histoire de la philosophie|Histoire de la philosophie]]<br> → [[w:Portail:Philosophie|Wikipédia]]<br> → [https://github.com/PandaMystique/Dictionnaire Application libre sur GitHub] </div> </div> </td> </tr> </table> {{CDU multiple| * {{CDU item|0|}} * {{CDU item|1|10}}}} [[Catégorie:Dictionnaire de philosophie (livre)]] [[Catégorie:Philosophie]] {{DEFAULTSORT:*}} [[Catégorie:Classe 1 - Philosophie et psychologie]] o6x23r1jbe3f3qdeybhtr5nknv173m7 767375 767374 2026-06-03T05:18:18Z PandaMystique 119061 767375 wikitext text/x-wiki {{Page de garde|image=Dictionnaire de philosophie.png|imagedesc=|titre=Index|description= <!-- Ligne 1 : A-G --> <table style="width:100%; border-collapse:separate; border-spacing:6px; margin-bottom:6px;"> <tr> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/A|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">A</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/B|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">B</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/C|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">C</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/D|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">D</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/E|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">E</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/F|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">F</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/G|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">G</span>]]</td> </tr> </table> <!-- Ligne 2 : H-N --> <table style="width:100%; border-collapse:separate; border-spacing:6px; margin-bottom:6px;"> <tr> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/H|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">H</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/I|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">I</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/J|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">J</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/K|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">K</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/L|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">L</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/M|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">M</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/N|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">N</span>]]</td> </tr> </table> <!-- Ligne 3 : O-U --> <table style="width:100%; border-collapse:separate; border-spacing:6px; margin-bottom:6px;"> <tr> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/O|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">O</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/P|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">P</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/Q|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">Q</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/R|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">R</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/S|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">S</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/T|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">T</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/U|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">U</span>]]</td> </tr> </table> <!-- Ligne 4 : V-Z --> <table style="width:100%; border-collapse:separate; border-spacing:6px;"> <tr> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/V|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">V</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/W|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">W</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/X|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">X</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/Y|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">Y</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/Z|<span style="display:block; padding:12px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">Z</span>]]</td> <td style="width:14.28%; text-align:center;"><span style="display:block; padding:12px 0; color:#cfc4ad; font-family:Georgia,'Times New Roman',serif; font-size:1.15em;">&nbsp;</span></td> <td style="width:14.28%; text-align:center;"><span style="display:block; padding:12px 0; color:#cfc4ad; font-family:Georgia,'Times New Roman',serif; font-size:1.15em;">&nbsp;</span></td> </tr> </table> |avancement=Ébauche |cdu= * {{CDU item|1/10}} |versions= {{PhiloRecherche}} {{version imprimable}} }} <!-- ═══════════════════════════════════════════════════════════════════ ENTRÉES THÉMATIQUES ═══════════════════════════════════════════════════════════════════ --> <div style="margin: 30px 0 12px 0; padding-bottom: 6px; border-bottom: 2px solid #8b7355;"> <span style="font-size: 1.1em; font-weight: 700; color: #5a4a3a; letter-spacing: 0.02em;">ENTRÉES PAR THÈME</span> <span style="font-size: 0.85em; color: #999; margin-left: 12px;">Parcourir par domaine</span> </div> <table style="width:100%; border-collapse:separate; border-spacing:12px;"> <tr> <!-- MÉTAPHYSIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f3eef4, #e9e1ec); border:1px solid #8a6f96; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#473a52; margin-bottom:6px;">🔮 Métaphysique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Être, substance, existence, essence, néant, possible, nécessaire…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Métaphysique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> <!-- ÉPISTÉMOLOGIE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #eef2f7, #e2e9f1); border:1px solid #6a86a8; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#2c456b; margin-bottom:6px;">🔬 Épistémologie</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Connaissance, vérité, science, méthode, preuve, certitude…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Épistémologie|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> <!-- ÉTHIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f6f1e6, #ece3d0); border:1px solid #b39a5e; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#5f4a1c; margin-bottom:6px;">⚖️ Éthique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Bien, mal, vertu, devoir, justice, bonheur, liberté…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Éthique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> </tr> <tr> <!-- LOGIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f1f1f3, #e6e6ea); border:1px solid #8a8a94; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#3a3a46; margin-bottom:6px;">🧮 Logique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Raisonnement, proposition, déduction, induction, syllogisme…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Logique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> <!-- ESTHÉTIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f6efe8, #ecdfd2); border:1px solid #b8845c; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#6a4326; margin-bottom:6px;">🎨 Esthétique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Beau, sublime, art, goût, imagination, création…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Esthétique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> <!-- POLITIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #eef3ea, #e2ebdc); border:1px solid #7d9a6c; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#3a5230; margin-bottom:6px;">🏛️ Politique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">État, pouvoir, droit, contrat, souveraineté, citoyenneté…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Politique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> </tr> </table> <!-- ═══════════════════════════════════════════════════════════════════ RESSOURCES : Dernières mises à jour + Voir aussi (même ligne) ═══════════════════════════════════════════════════════════════════ --> <table style="width:100%; border-collapse:separate; border-spacing:12px; margin-top:18px;"> <tr> <td class="noprint" style="width:50%; vertical-align:top; background:linear-gradient(180deg, #f7f4ee, #efe9df); border:1px solid #d3c8b3; border-radius:8px; padding:0;"> <div style="background:linear-gradient(180deg, #4a4238, #38322a); padding:10px 15px; text-align:center; border-radius:8px 8px 0 0;"> <span style="font-size:0.9em; font-weight:600; color:#ffffff; letter-spacing:0.05em;">📝 Dernières mises à jour</span> </div> <div style="padding:12px 16px; font-size:0.92em; line-height:1.8; color:#444;"> <DynamicPageList> category = Dictionnaire de philosophie (livre) count = 5 order = lastedit </DynamicPageList> </div> </td> <td style="width:50%; vertical-align:top; background:linear-gradient(180deg, #f7f4ee, #efe9df); border:1px solid #d3c8b3; border-radius:8px; padding:0;"> <div style="background:linear-gradient(180deg, #4a4238, #38322a); padding:10px 15px; text-align:center; border-radius:8px 8px 0 0;"> <span style="font-size:0.9em; font-weight:600; color:#ffffff; letter-spacing:0.05em;">Voir aussi</span> </div> <div style="padding:12px 16px; font-size:0.92em; line-height:1.9; color:#444;"> → [[Philosophie|Portail Philosophie]]<br> → [[Manuel de terminale de philosophie|Manuel de Terminale]]<br> → [[Philosophie/Histoire de la philosophie|Histoire de la philosophie]]<br> → [[w:Portail:Philosophie|Wikipédia]]<br> → [https://github.com/PandaMystique/Dictionnaire Application libre sur GitHub] </div> </td> </tr> </table> {{CDU multiple| * {{CDU item|0|}} * {{CDU item|1|10}}}} [[Catégorie:Dictionnaire de philosophie (livre)]] [[Catégorie:Philosophie]] {{DEFAULTSORT:*}} [[Catégorie:Classe 1 - Philosophie et psychologie]] lchvyk20a4fz15p9na703iom5wps20g 767376 767375 2026-06-03T05:30:25Z PandaMystique 119061 767376 wikitext text/x-wiki {{Page de garde|image=Dictionnaire de philosophie.png|imagedesc=|titre=Index|description= <!-- Ligne 1 : A-G --> <table style="width:100%; border-collapse:separate; border-spacing:6px; margin-bottom:6px;"> <tr> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/A|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">A</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/B|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">B</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/C|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">C</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/D|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">D</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/E|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">E</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/F|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">F</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/G|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">G</span>]]</td> </tr> </table> <!-- Ligne 2 : H-N --> <table style="width:100%; border-collapse:separate; border-spacing:6px; margin-bottom:6px;"> <tr> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/H|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">H</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/I|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">I</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/J|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">J</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/K|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">K</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/L|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">L</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/M|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">M</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/N|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">N</span>]]</td> </tr> </table> <!-- Ligne 3 : O-U --> <table style="width:100%; border-collapse:separate; border-spacing:6px; margin-bottom:6px;"> <tr> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/O|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">O</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/P|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">P</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/Q|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">Q</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/R|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">R</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/S|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">S</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/T|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">T</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/U|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">U</span>]]</td> </tr> </table> <!-- Ligne 4 : V-Z --> <table style="width:100%; border-collapse:separate; border-spacing:6px;"> <tr> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/V|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">V</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/W|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">W</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/X|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">X</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/Y|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">Y</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/Z|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">Z</span>]]</td> <td style="width:14.28%; text-align:center;"><span style="display:block; padding:8px 0; color:#cfc4ad; font-family:Georgia,'Times New Roman',serif; font-size:1.15em;">&nbsp;</span></td> <td style="width:14.28%; text-align:center;"><span style="display:block; padding:8px 0; color:#cfc4ad; font-family:Georgia,'Times New Roman',serif; font-size:1.15em;">&nbsp;</span></td> </tr> </table> |avancement=Ébauche |cdu= * {{CDU item|1/10}} |versions= {{PhiloRecherche}} {{version imprimable}} }} <!-- ═══════════════════════════════════════════════════════════════════ ENTRÉES THÉMATIQUES ═══════════════════════════════════════════════════════════════════ --> <div style="margin: 30px 0 12px 0; padding-bottom: 6px; border-bottom: 2px solid #8b7355;"> <span style="font-size: 1.1em; font-weight: 700; color: #5a4a3a; letter-spacing: 0.02em;">ENTRÉES PAR THÈME</span> <span style="font-size: 0.85em; color: #999; margin-left: 12px;">Parcourir par domaine</span> </div> <table style="width:100%; border-collapse:separate; border-spacing:12px;"> <tr> <!-- MÉTAPHYSIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f3eef4, #e9e1ec); border:1px solid #8a6f96; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#473a52; margin-bottom:6px;">🔮 Métaphysique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Être, substance, existence, essence, néant, possible, nécessaire…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Métaphysique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> <!-- ÉPISTÉMOLOGIE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #eef2f7, #e2e9f1); border:1px solid #6a86a8; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#2c456b; margin-bottom:6px;">🔬 Épistémologie</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Connaissance, vérité, science, méthode, preuve, certitude…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Épistémologie|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> <!-- ÉTHIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f6f1e6, #ece3d0); border:1px solid #b39a5e; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#5f4a1c; margin-bottom:6px;">⚖️ Éthique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Bien, mal, vertu, devoir, justice, bonheur, liberté…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Éthique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> </tr> <tr> <!-- LOGIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f1f1f3, #e6e6ea); border:1px solid #8a8a94; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#3a3a46; margin-bottom:6px;">🧮 Logique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Raisonnement, proposition, déduction, induction, syllogisme…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Logique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> <!-- ESTHÉTIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f6efe8, #ecdfd2); border:1px solid #b8845c; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#6a4326; margin-bottom:6px;">🎨 Esthétique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Beau, sublime, art, goût, imagination, création…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Esthétique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> <!-- POLITIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #eef3ea, #e2ebdc); border:1px solid #7d9a6c; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#3a5230; margin-bottom:6px;">🏛️ Politique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">État, pouvoir, droit, contrat, souveraineté, citoyenneté…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Politique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> </tr> </table> <!-- ═══════════════════════════════════════════════════════════════════ RESSOURCES : Dernières mises à jour + Voir aussi (même ligne) ═══════════════════════════════════════════════════════════════════ --> <table style="width:100%; border-collapse:separate; border-spacing:12px; margin-top:18px;"> <tr> <td class="noprint" style="width:50%; vertical-align:top; background:linear-gradient(180deg, #f7f4ee, #efe9df); border:1px solid #d3c8b3; border-radius:8px; padding:0;"> <div style="background:linear-gradient(180deg, #4a4238, #38322a); padding:4px 15px; text-align:center; border-radius:8px 8px 0 0;"> <span style="font-size:0.9em; font-weight:600; color:#ffffff; letter-spacing:0.05em;">📝 Dernières mises à jour</span> </div> <div style="padding:12px 16px; font-size:0.92em; line-height:1.8; color:#444;"> <DynamicPageList> category = Dictionnaire de philosophie (livre) count = 5 order = lastedit </DynamicPageList> </div> </td> <td style="width:50%; vertical-align:top; background:linear-gradient(180deg, #f7f4ee, #efe9df); border:1px solid #d3c8b3; border-radius:8px; padding:0;"> <div style="background:linear-gradient(180deg, #4a4238, #38322a); padding:4px 15px; text-align:center; border-radius:8px 8px 0 0;"> <span style="font-size:0.9em; font-weight:600; color:#ffffff; letter-spacing:0.05em;">Voir aussi</span> </div> <div style="padding:12px 16px; font-size:0.92em; line-height:1.9; color:#444;"> → [[Philosophie|Portail Philosophie]]<br> → [[Manuel de terminale de philosophie|Manuel de Terminale]]<br> → [[Philosophie/Histoire de la philosophie|Histoire de la philosophie]]<br> → [[w:Portail:Philosophie|Wikipédia]]<br> → [https://github.com/PandaMystique/Dictionnaire Application libre sur GitHub] </div> </td> </tr> </table> {{CDU multiple| * {{CDU item|0|}} * {{CDU item|1|10}}}} [[Catégorie:Dictionnaire de philosophie (livre)]] [[Catégorie:Philosophie]] {{DEFAULTSORT:*}} [[Catégorie:Classe 1 - Philosophie et psychologie]] fl6bdzeyxf7t0f8xmzczk85tggcjgtn 767377 767376 2026-06-03T05:32:49Z PandaMystique 119061 767377 wikitext text/x-wiki {{Page de garde|image=Dictionnaire de philosophie.png|imagedesc=|titre=Index|description= <!-- Ligne 1 : A-G --> <table style="width:100%; border-collapse:separate; border-spacing:6px; margin-bottom:6px;"> <tr> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/A|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">A</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/B|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">B</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/C|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">C</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/D|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">D</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/E|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">E</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/F|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">F</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/G|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">G</span>]]</td> </tr> </table> <!-- Ligne 2 : H-N --> <table style="width:100%; border-collapse:separate; border-spacing:6px; margin-bottom:6px;"> <tr> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/H|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">H</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/I|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">I</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/J|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">J</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/K|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">K</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/L|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">L</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/M|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">M</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/N|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">N</span>]]</td> </tr> </table> <!-- Ligne 3 : O-U --> <table style="width:100%; border-collapse:separate; border-spacing:6px; margin-bottom:6px;"> <tr> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/O|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">O</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/P|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">P</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/Q|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">Q</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/R|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">R</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/S|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">S</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/T|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">T</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/U|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">U</span>]]</td> </tr> </table> <!-- Ligne 4 : V-Z --> <table style="width:100%; border-collapse:separate; border-spacing:6px;"> <tr> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/V|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">V</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/W|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">W</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/X|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">X</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/Y|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">Y</span>]]</td> <td style="width:14.28%; text-align:center;">[[Dictionnaire de philosophie/Z|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em;">Z</span>]]</td> <td style="width:14.28%; text-align:center;"><span style="display:block; padding:8px 0; color:#cfc4ad; font-family:Georgia,'Times New Roman',serif; font-size:1.15em;">&nbsp;</span></td> <td style="width:14.28%; text-align:center;"><span style="display:block; padding:8px 0; color:#cfc4ad; font-family:Georgia,'Times New Roman',serif; font-size:1.15em;">&nbsp;</span></td> </tr> </table> |avancement=Ébauche |cdu= * {{CDU item|1/10}} |versions= {{PhiloRecherche}} {{Version imprimable|modifier=non}} }} <!-- ═══════════════════════════════════════════════════════════════════ ENTRÉES THÉMATIQUES ═══════════════════════════════════════════════════════════════════ --> <div style="margin: 30px 0 12px 0; padding-bottom: 6px; border-bottom: 2px solid #8b7355;"> <span style="font-size: 1.1em; font-weight: 700; color: #5a4a3a; letter-spacing: 0.02em;">ENTRÉES PAR THÈME</span> <span style="font-size: 0.85em; color: #999; margin-left: 12px;">Parcourir par domaine</span> </div> <table style="width:100%; border-collapse:separate; border-spacing:12px;"> <tr> <!-- MÉTAPHYSIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f3eef4, #e9e1ec); border:1px solid #8a6f96; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#473a52; margin-bottom:6px;">🔮 Métaphysique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Être, substance, existence, essence, néant, possible, nécessaire…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Métaphysique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> <!-- ÉPISTÉMOLOGIE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #eef2f7, #e2e9f1); border:1px solid #6a86a8; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#2c456b; margin-bottom:6px;">🔬 Épistémologie</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Connaissance, vérité, science, méthode, preuve, certitude…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Épistémologie|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> <!-- ÉTHIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f6f1e6, #ece3d0); border:1px solid #b39a5e; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#5f4a1c; margin-bottom:6px;">⚖️ Éthique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Bien, mal, vertu, devoir, justice, bonheur, liberté…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Éthique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> </tr> <tr> <!-- LOGIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f1f1f3, #e6e6ea); border:1px solid #8a8a94; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#3a3a46; margin-bottom:6px;">🧮 Logique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Raisonnement, proposition, déduction, induction, syllogisme…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Logique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> <!-- ESTHÉTIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f6efe8, #ecdfd2); border:1px solid #b8845c; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#6a4326; margin-bottom:6px;">🎨 Esthétique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Beau, sublime, art, goût, imagination, création…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Esthétique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> <!-- POLITIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #eef3ea, #e2ebdc); border:1px solid #7d9a6c; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#3a5230; margin-bottom:6px;">🏛️ Politique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">État, pouvoir, droit, contrat, souveraineté, citoyenneté…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Politique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> </tr> </table> <!-- ═══════════════════════════════════════════════════════════════════ RESSOURCES : Dernières mises à jour + Voir aussi (même ligne) ═══════════════════════════════════════════════════════════════════ --> <table style="width:100%; border-collapse:separate; border-spacing:12px; margin-top:18px;"> <tr> <td class="noprint" style="width:50%; vertical-align:top; background:linear-gradient(180deg, #f7f4ee, #efe9df); border:1px solid #d3c8b3; border-radius:8px; padding:0;"> <div style="background:linear-gradient(180deg, #4a4238, #38322a); padding:4px 15px; text-align:center; border-radius:8px 8px 0 0;"> <span style="font-size:0.9em; font-weight:600; color:#ffffff; letter-spacing:0.05em;">📝 Dernières mises à jour</span> </div> <div style="padding:12px 16px; font-size:0.92em; line-height:1.8; color:#444;"> <DynamicPageList> category = Dictionnaire de philosophie (livre) count = 5 order = lastedit </DynamicPageList> </div> </td> <td style="width:50%; vertical-align:top; background:linear-gradient(180deg, #f7f4ee, #efe9df); border:1px solid #d3c8b3; border-radius:8px; padding:0;"> <div style="background:linear-gradient(180deg, #4a4238, #38322a); padding:4px 15px; text-align:center; border-radius:8px 8px 0 0;"> <span style="font-size:0.9em; font-weight:600; color:#ffffff; letter-spacing:0.05em;">Voir aussi</span> </div> <div style="padding:12px 16px; font-size:0.92em; line-height:1.9; color:#444;"> → [[Philosophie|Portail Philosophie]]<br> → [[Manuel de terminale de philosophie|Manuel de Terminale]]<br> → [[Philosophie/Histoire de la philosophie|Histoire de la philosophie]]<br> → [[w:Portail:Philosophie|Wikipédia]]<br> → [https://github.com/PandaMystique/Dictionnaire Application libre sur GitHub] </div> </td> </tr> </table> {{CDU multiple| * {{CDU item|0|}} * {{CDU item|1|10}}}} [[Catégorie:Dictionnaire de philosophie (livre)]] [[Catégorie:Philosophie]] {{DEFAULTSORT:*}} [[Catégorie:Classe 1 - Philosophie et psychologie]] 9pr5k0hkwnkx55moff1mf7k1hnbf1l4 767404 767377 2026-06-03T10:35:25Z PandaMystique 119061 767404 wikitext text/x-wiki {{Page de garde|image=Dictionnaire de philosophie.png|imagedesc=|titre=Index|description= <!-- Index alphabétique : tuiles inline-block, réagencement automatique --> <div style="text-align:center;"> [[Dictionnaire de philosophie/A|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">A</span>]] [[Dictionnaire de philosophie/B|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">B</span>]] [[Dictionnaire de philosophie/C|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">C</span>]] [[Dictionnaire de philosophie/D|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">D</span>]] [[Dictionnaire de philosophie/E|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">E</span>]] [[Dictionnaire de philosophie/F|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">F</span>]] [[Dictionnaire de philosophie/G|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">G</span>]] [[Dictionnaire de philosophie/H|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">H</span>]] [[Dictionnaire de philosophie/I|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">I</span>]] [[Dictionnaire de philosophie/J|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">J</span>]] [[Dictionnaire de philosophie/K|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">K</span>]] [[Dictionnaire de philosophie/L|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">L</span>]] [[Dictionnaire de philosophie/M|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">M</span>]] [[Dictionnaire de philosophie/N|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">N</span>]] [[Dictionnaire de philosophie/O|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">O</span>]] [[Dictionnaire de philosophie/P|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">P</span>]] [[Dictionnaire de philosophie/Q|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">Q</span>]] [[Dictionnaire de philosophie/R|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">R</span>]] [[Dictionnaire de philosophie/S|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">S</span>]] [[Dictionnaire de philosophie/T|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">T</span>]] [[Dictionnaire de philosophie/U|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">U</span>]] [[Dictionnaire de philosophie/V|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">V</span>]] [[Dictionnaire de philosophie/W|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">W</span>]] [[Dictionnaire de philosophie/X|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">X</span>]] [[Dictionnaire de philosophie/Y|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">Y</span>]] [[Dictionnaire de philosophie/Z|<span style="display:inline-block; width:48px; padding:8px 0; margin:3px; background:linear-gradient(180deg, #ffffff, #f4f1ea); border:1px solid #cfc4ad; border-radius:5px; color:#4a3f30; font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:1.15em; vertical-align:top;">Z</span>]] </div> |avancement=Ébauche |cdu= * {{CDU item|1/10}} |versions= {{PhiloRecherche}} {{version imprimable}} }} <!-- ═══════════════════════════════════════════════════════════════════ ENTRÉES THÉMATIQUES ═══════════════════════════════════════════════════════════════════ --> <div style="margin: 30px 0 12px 0; padding-bottom: 6px; border-bottom: 2px solid #8b7355;"> <span style="font-size: 1.1em; font-weight: 700; color: #5a4a3a; letter-spacing: 0.02em;">ENTRÉES PAR THÈME</span> <span style="font-size: 0.85em; color: #999; margin-left: 12px;">Parcourir par domaine</span> </div> <table style="width:100%; border-collapse:separate; border-spacing:12px;"> <tr> <!-- MÉTAPHYSIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f3eef4, #e9e1ec); border:1px solid #8a6f96; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#473a52; margin-bottom:6px;">🔮 Métaphysique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Être, substance, existence, essence, néant, possible, nécessaire…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Métaphysique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> <!-- ÉPISTÉMOLOGIE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #eef2f7, #e2e9f1); border:1px solid #6a86a8; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#2c456b; margin-bottom:6px;">🔬 Épistémologie</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Connaissance, vérité, science, méthode, preuve, certitude…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Épistémologie|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> <!-- ÉTHIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f6f1e6, #ece3d0); border:1px solid #b39a5e; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#5f4a1c; margin-bottom:6px;">⚖️ Éthique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Bien, mal, vertu, devoir, justice, bonheur, liberté…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Éthique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> </tr> <tr> <!-- LOGIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f1f1f3, #e6e6ea); border:1px solid #8a8a94; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#3a3a46; margin-bottom:6px;">🧮 Logique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Raisonnement, proposition, déduction, induction, syllogisme…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Logique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> <!-- ESTHÉTIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f6efe8, #ecdfd2); border:1px solid #b8845c; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#6a4326; margin-bottom:6px;">🎨 Esthétique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Beau, sublime, art, goût, imagination, création…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Esthétique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> <!-- POLITIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #eef3ea, #e2ebdc); border:1px solid #7d9a6c; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:600; font-size:1em; color:#3a5230; margin-bottom:6px;">🏛️ Politique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">État, pouvoir, droit, contrat, souveraineté, citoyenneté…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Politique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;">&nbsp;</span>]]</div> </td> </tr> </table> <!-- ═══════════════════════════════════════════════════════════════════ RESSOURCES : Dernières mises à jour + Voir aussi (même ligne) ═══════════════════════════════════════════════════════════════════ --> <table style="width:100%; border-collapse:separate; border-spacing:12px; margin-top:18px;"> <tr> <td class="noprint" style="width:50%; vertical-align:top; background:linear-gradient(180deg, #f7f4ee, #efe9df); border:1px solid #d3c8b3; border-radius:8px; padding:0;"> <div style="background:linear-gradient(180deg, #4a4238, #38322a); padding:6px 15px; text-align:center; border-radius:8px 8px 0 0;"> <span style="font-size:0.9em; font-weight:600; color:#ffffff; letter-spacing:0.05em;">📝 Dernières mises à jour</span> </div> <div style="padding:12px 16px; font-size:0.92em; line-height:1.8; color:#444;"> <DynamicPageList> category = Dictionnaire de philosophie (livre) count = 5 order = lastedit </DynamicPageList> </div> </td> <td style="width:50%; vertical-align:top; background:linear-gradient(180deg, #f7f4ee, #efe9df); border:1px solid #d3c8b3; border-radius:8px; padding:0;"> <div style="background:linear-gradient(180deg, #4a4238, #38322a); padding:6px 15px; text-align:center; border-radius:8px 8px 0 0;"> <span style="font-size:0.9em; font-weight:600; color:#ffffff; letter-spacing:0.05em;">Voir aussi</span> </div> <div style="padding:12px 16px; font-size:0.92em; line-height:1.9; color:#444;"> → [[Philosophie|Portail Philosophie]]<br> → [[Manuel de terminale de philosophie|Manuel de Terminale]]<br> → [[Philosophie/Histoire de la philosophie|Histoire de la philosophie]]<br> → [[w:Portail:Philosophie|Wikipédia]]<br> → [https://github.com/PandaMystique/Dictionnaire Application libre sur GitHub] </div> </td> </tr> </table> {{CDU multiple| * {{CDU item|0|}} * {{CDU item|1|10}}}} [[Catégorie:Dictionnaire de philosophie (livre)]] [[Catégorie:Philosophie]] {{DEFAULTSORT:*}} [[Catégorie:Classe 1 - Philosophie et psychologie]] 9n7z2wxd2gfxmelsagpn2w5y7qcibz8 Accordéon chromatique 0 40303 767385 721229 2026-06-03T07:23:48Z DavidL 1746 767385 wikitext text/x-wiki == Sommaire == [[Fichier:RichardGalliano Stockholm20090715.jpg|thumb|L'accordéoniste Richard Galliano à Stockholm en 2009]] [[Fichier:Lassepihlajamaa.jpg|thumb|L'accordéoniste finnois Lässe Pihlajamaa vers 1965]] [[Fichier:Luxembourg Vianden Nut-fair 13.jpg|thumb|Quand chant et accordéon se rencontrent]] [[Fichier:German button accordion.jpg|thumb|Ancien accordéon allemand]] [[Fichier:Luciano Biondini.JPG|thumb|L'accordéoniste italien Luciano Biondini]] {{/Sommaire|1}} [[Catégorie:Accordéon chromatique (livre)|{{SUBPAGENAME}}]] djqikavmt6hyf84zmd5crhqg27o59od 767386 767385 2026-06-03T07:37:15Z DavidL 1746 767386 wikitext text/x-wiki {{Page de garde|image=Akordeon guzikowy Special 87 120 IV 11 5 Piccolo firmy Weltmeister.jpg|imagedesc=Accordéon diatonique ''Special 87 120 IV 11 5 Piccolo Company Weltmeister''|description= L'accordéon chromatique est un instrument à vent fonctionnant par l'actionnement d'un soufflet. Contrairement à l'accordéon diatonique (système bi-sonore), une touche produit la même note en tirant ou en poussant le soufflet (système uni-sonore). Il est utilisé aussi bien dans les groupes de musique traditionnels (balkaniques, etc.), que par ceux de musique classique et contemporaine, et dans le jazz. |avancement=Bon début |cdu= * {{CDU item|7|78}} |versions= {{Lecture conseillée|article=du livre|[[Formation musicale]]}} }} == Sommaire == [[Fichier:RichardGalliano Stockholm20090715.jpg|thumb|L'accordéoniste Richard Galliano à Stockholm en 2009]] [[Fichier:Lassepihlajamaa.jpg|thumb|L'accordéoniste finnois Lässe Pihlajamaa vers 1965]] [[Fichier:Luxembourg Vianden Nut-fair 13.jpg|thumb|Quand chant et accordéon se rencontrent]] [[Fichier:German button accordion.jpg|thumb|Ancien accordéon allemand]] [[Fichier:Luciano Biondini.JPG|thumb|L'accordéoniste italien Luciano Biondini]] {{/Sommaire|1}} [[Catégorie:Accordéon chromatique (livre)|{{SUBPAGENAME}}]] 0bsmtlg2k12u4dnzwx40tj20rq8e1e4 767391 767386 2026-06-03T07:40:55Z DavidL 1746 767391 wikitext text/x-wiki {{Page de garde|image=Akordeon guzikowy Special 87 120 IV 11 5 Piccolo firmy Weltmeister.jpg|imagedesc=Accordéon diatonique ''Special 87 120 IV 11 5 Piccolo Company Weltmeister''|description= L'accordéon chromatique est un instrument à vent fonctionnant par l'actionnement d'un soufflet. Contrairement à l'accordéon diatonique (système bi-sonore), une touche produit la même note en tirant ou en poussant le soufflet (système uni-sonore). Il est utilisé aussi bien dans les groupes de musique traditionnels (balkaniques, etc.), que par ceux de musique classique et contemporaine, et dans le jazz. |avancement=Bon début |cdu= * {{CDU item|7|78}} |versions= {{Lecture conseillée|article=du livre|[[Formation musicale]]}} }} == Sommaire == [[Fichier:RichardGalliano Stockholm20090715.jpg|thumb|L'accordéoniste Richard Galliano à Stockholm en 2009]] [[Fichier:Lassepihlajamaa.jpg|thumb|L'accordéoniste finnois Lässe Pihlajamaa vers 1965]] [[Fichier:Luxembourg Vianden Nut-fair 13.jpg|thumb|Quand chant et accordéon se rencontrent]] [[Fichier:German button accordion.jpg|thumb|Ancien accordéon allemand]] [[Fichier:Luciano Biondini.JPG|thumb|L'accordéoniste italien Luciano Biondini]] {{/Sommaire|étendu=1}} [[Catégorie:Accordéon chromatique (livre)|{{SUBPAGENAME}}]] kr992psxnaoobtt15lecdnju7rewfhi Accordéon chromatique/Clavier main droite 0 40304 767395 598324 2026-06-03T07:42:55Z DavidL 1746 767395 wikitext text/x-wiki <noinclude>{{Accordéon chromatique}}</noinclude> [[Fichier:Clavier accordéon horizontal.svg|center|900px]] {{Clr}} == Présentation du clavier == [[Fichier:Clavier accordéon main droite demi-tons.svg|thumb|300px|Montée du clavier main droite]] Le clavier de la main droite — ou clavier ''chant'' — permet de jouer la mélodie du morceau. Les touches sont disposées en quinconce ; à chaque fois que l'on se déplace latéralement d'une touche vers le bas, on monte d'un demi-ton. Vous pouvez d'ores et déjà vous entrainer à faire cette montée ; cela constituera notre premier exercice. N'oubliez pas de respecter le doigté indiqué pour progresser. [[Fichier:Accordéon chromatique - exercice 1.png|center|1000px]] Répétez cet exercice jusqu'à parfaite maitrise. Commencez doucement, avec un métronome. Une fois que l'exercice est mieux connu, accélérez jusqu'à un rythme de 80 à la noire. Puis faites la même chose, mais à l'envers ! [[Fichier:Accordéon chromatique - Exercice 2.png|center|1000px]] {{Boîte déroulante|titre=Afficher le clavier main droite d'un accordéon|contenu=[[Fichier:clavier accordéon.svg|center|300px]]}} Un clavier d'accordéon est constitué de la même série de notes qui se répète plusieurs fois, en général deux ou trois fois. Il peut posséder quatre voire cinq rangées de notes. Plusieurs d'entre elles, placées du côté soufflet, sont dites « supplémentaires » car elles répètent respectivement la première et la deuxième rangée de notes. Elles permettent de faciliter l'exécution d'un morceau et de fluidifier le tout ; cependant, nous vous conseillons de ne pas les utiliser pour le moment. Nous y reviendrons dans un chapitre futur. Vous remarquerez également que certaines touches sont noires (ce n'est pas le cas de tous les accordéons), elles correspondent aux notes augmentées (ou diminuées, si l'on voit le verre à moitié vide !). Certaines touches sont « taillées » ou possèdent des picots, elles correspondent généralement à la note Do. Encore une fois, ce n'est pas toujours le cas. == Un premier morceau == Nous pouvons maintenant jouer une petite comptine fort connue, qu'un grand nombre de professeurs d'accordéon font jouer à leurs élèves débutants. Il est inutile de vous dire son nom, vous la reconnaitrez de vous-même ! Le rythme est de 92 à la noire. [[Fichier:Accordéon chromatique - exercice 3.png|center|900px]] [[Catégorie:Accordéon chromatique (livre)|{{SUBPAGENAME}}]] cxoi01d2hkze3cbt9icmo202aed4z2g Discussion:Accordéon chromatique 1 40306 767388 303403 2026-06-03T07:38:33Z DavidL 1746 767388 wikitext text/x-wiki == Partitions == Toutes les partitions sont générées avec MusixTex. [[Utilisateur:Savant-fou|Savant-fou©]] <small><sup>[[Discussion Utilisateur:Savant-fou|me parler]]</sup></small> 11 novembre 2010 à 13:02 (CET) :--> [[LaTeX/Écrire de la musique]] :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 3 juin 2026 à 09:38 (CEST) 3jinwlagg6aufaydr9268w8u4228pzk Accordéon chromatique/Tenue de l'instrument 0 40307 767394 368082 2026-06-03T07:42:27Z DavidL 1746 767394 wikitext text/x-wiki <noinclude>{{Accordéon chromatique}}</noinclude> [[Fichier:Accordéon chromatique - Position de la main droite.jpg|thumb|left|Bonne position de la main et du bras sur le clavier droit.]] L'accordéon se joue sur une chaise de préférence (évitez les fauteuils), assis sur le bord et non pas engoncé au fond. Il doit reposer sur la jambe gauche et calé par la jambe droite. Les courroies doivent être ajustées convenablement, ne devant ni être trop serrées (le poids de l'accordéon étant porté entièrement par le dos) ni trop lestes. Dans l'idéal, la bretelle gauche doit être plus serrée que la droite. La main droite, sur le clavier « chant », est face au clavier avec les doigts légèrement pliés. La paume de la main ne doit jamais s'appuyer sur le rebord ; en revanche, le pouce y prend place. Le coude doit être bien ouvert, l'avant-bras presque parallèle au corps. [[Catégorie:Accordéon chromatique (livre)|{{SUBPAGENAME}}]] fa4th47hzy8bw1fm1ij87ws1j89t7ui Accordéon chromatique/Objectifs 0 40308 767392 368078 2026-06-03T07:41:46Z DavidL 1746 767392 wikitext text/x-wiki <noinclude>{{Accordéon chromatique}}</noinclude> == Présentation de la méthode == Tout au long de cette méthode d'accordéon chromatique, nous vous amènerons à un niveau d'accordéon vous permettant de poursuivre seul votre progression. « ''Pour devenir un bon accordéoniste musicien, il faut se faire une discipline'' », disait Médar Ferrero, un accordéoniste du XX{{e}} siècle. Il faudra travailler régulièrement et avec soin, afin d'acquérir la « technique ». Les premières leçons, et les exercices qui y sont associés, sont cruciaux pour la suite ; ne passez d'un chapitre à l'autre que lorsque vous pensez maitriser les exercices proposés. Il faut savoir que deux types d'accordéons existent, il s'agit des accordéons ''chromatiques'' et des accordéons ''diatoniques''. Les accordéons diatoniques, plus petits, ne font pas le même son si l'on tire ou pousse le soufflet ; l'apprentissage s'avère très différent de celui de l'accordéon chromatique. Parmi les accordéons chromatiques, on distingue les accordéons à touches boutons et les accordéons à touche piano. Cette méthode a été conçue pour les accordéons chromatiques à touches boutons. Nous avons fait figurer sur chaque partition les doigtés, au-dessus des notes. Ce doigté doit être respecté '''impérativement''', faute de quoi les exercices perdront une partie de leur sens. Nous avons choisi de compter le pouce en tant que numéro 1, puis les autres doigts jusqu'à 5, ce qui n'est pas le cas de tous les accordéonistes ; en effet, le pouce peut aussi être compté comme numéro 0. Le rythme et la vitesse d'exécution doivent aussi être respectés ; il faut travailler avec un métronome. À la fin de chaque chapitre, une « pause en cours de route » vous propose quelques morceaux, pour alterner entre exercices et loisir. == Faut-t-il un professeur ? == Bien qu'il soit possible de débuter l'accordéon seul, il est préférable, au moins au début, de chercher dans votre entourage un accordéoniste suffisamment avancé pour vous guider dans l'achat ou la location d'un accordéon, et vous apprendre à porter correctement l'instrument. S'il est mal réglé ou mal construit, il sera difficilement jouable. Une position incorrecte peut ne pas être gênante au départ, mais risque de limiter votre progression au bout de quelques mois ou quelques années : il vous faudra alors réapprendre les techniques de base si vous souhaitez vraiment aller plus loin. N'hésitez pas à essayer plusieurs professeurs, amateurs ou non, jusqu'à ce que vous trouviez celui qui vous convienne, humainement et musicalement. Bon nombre d'écoles de musiques ou de MJC (parfois même des conservatoires, bien que l'accordéon reste encore un instrument considéré comme « non noble » par bon nombre d'entre eux) proposent des cours. Le temps consacré au travail de l'instrument dépend de vos objectifs. Pour l'accordéon comme pour tout instrument, rien ne remplace une pratique régulière. Il est plus efficace de travailler un peu et chaque jour que beaucoup, mais plus rarement. Pour un débutant, une vingtaine de minutes de travail par jour peut suffire à progresser régulièrement. La connaissance, au moins minime, du solfège, est '''indispensable'''. [[Catégorie:Accordéon chromatique (livre)|{{SUBPAGENAME}}]] 2rsp5cwwjl9dnl70g1f4d0yrbft7gam Accordéon chromatique/Montons la gamme de Do majeur 0 40314 767397 453498 2026-06-03T07:46:40Z DavidL 1746 767397 wikitext text/x-wiki <noinclude>{{Accordéon chromatique}}</noinclude> == La gamme de Do majeur == [[Fichier:Accordéon chromatique - gamme de Do majeur.svg|200px|right]] La gamme de Do majeur est composée de 8 notes naturelles (c'est-à-dire non augmentées ou diminuées) qui sont Do, Ré, Mi, Fa, Sol, La si et Do. Amusez-vous à monter et descendre cette gamme, en liant les notes, puis en les détachant. [[Fichier:Accordéon chromatique - Gamme de Do Majeur.png|center|700px]] == Exercices sur la gamme de Do == [[Fichier:Accordéon chromatique - gamme de Do majeur - exercice 1.png|center|800px]] == Remarques sur les gammes == À l'accordéon, comme dans de nombreux autres instruments, il n'existe qu'une seule position des doigts sur le clavier pour jouer n'importe quelle gamme. Il suffit de décaler vers le haut ou vers le bas cette position ; il peut ainsi être utile de la connaitre. Nous y reviendrons dans un chapitre futur. jildxrq9kgamr8l53atcwgc8glcm4i4 Accordéon chromatique/Rappels de solfège 0 43045 767398 368079 2026-06-03T07:46:54Z DavidL 1746 767398 wikitext text/x-wiki <noinclude>{{Accordéon chromatique}}</noinclude> == Qu'est-ce qu'une gamme ? == Une gamme est une suite de notes, par exemple ''do ré mi fa sol la si do''. Cette gamme est agréable à l'oreille mais n'a pas d'intervalles réguliers entre les notes ; en effet, les notes dites « naturelles » successives sont séparées d'un ton ou d'un demi-ton : : les notes ''mi''-''fa'' et ''si''-''do'' sont séparées d'un demi-ton, les autres notes sont séparées d'un ton. On a donc, si l'on monte la gamme constituée par les sept notes en commençant par le ''do'', la succession suivante : {| |+ Mode de do |- | || 1 ton || || 1 ton || || ½ ton || || 1 ton || || 1 ton || || 1 ton || || ½ ton |- align="center" | do || — || ré || — || mi || - || fa || — || sol || — || la || — || si || - || do |} Dans l'image ci-dessous, un ton est représenté par une « parenthèse » en dessous, alors qu'un demi-ton est représenté par un « accent circonflexe » au-dessus : : [[Image:C major scale.png]] Mais lorsque l'on joue les sept notes, on peut commencer par celle que l'on veut : * ''do'' – ''ré'' – ''mi'' - ''fa'' – ''sol'' – ''la'' – ''si'' - * ''ré'' – ''mi'' - ''fa'' – ''sol'' – ''la'' – ''si'' - ''do'' – * ''mi'' - ''fa'' – ''sol'' – ''la'' – ''si'' - ''do'' – ''ré'' – * … on a donc sept manières de jouer cette gamme, sept « modes ». On peut numéroter les notes de la gamme de I à VII (un à sept en chiffres romains), du plus grave au plus aigu ; on parle alors de degré. Changer de mode consiste donc à choisir arbitrairement le I<sup>er</sup> degré parmi les sept notes. Changer de mode revient à changer l'emplacement des demi-tons. Par exemple, dans le mode de ''ré'', on a : {| |+ Mode de ré |- | || 1 ton || || ½ ton || || 1 ton || || 1 ton || || 1 ton || || ½ ton || || 1 ton |- align="center" | ré || — || mi || - || fa || — || sol || — || la || — || si || - || do || — || ré |} Considérons l'air de ''Au clair de la Lune'' : : ''do'' - ''do'' - ''do'' - ''ré'' - ''mi'' - ''ré'' - ''do'' - ''mi'' - ''ré'' - ''ré'' - ''do''. Si l'on exprime les notes par leur degré dans le mode de do, on obtient la succession suivante : : I - I - I - II - III - II - I - III - II - II - I. Si maintenant on part de la note ''ré'' par exemple, et que l'on suit la même succession, on a : : ''ré'' - ''ré'' - ''ré'' - ''mi'' - ''fa'' - ''mi'' - ''ré'' - ''fa'' - ''mi'' - ''mi'' - ''ré''. On voit que ce nouvel air sonne différemment : alors que l'air interprété en ''do'' ne contient que des tons, l'air en ''ré'' contient des demi-tons. On peut ainsi créer sept morceaux différents, en partant de chacune des sept notes, et chaque morceau aura une sonorité différente tout en ressemblant aux autres. On dispose ainsi de sept « modes » : le mode de ''do'', le mode de ''ré'', le mode de ''mi''… le mode de ''si''. == Qu'est-ce qu'un arpège ? == Un arpège est un accord que l'on « égrène », dont les notes sont jouées successivement et non plus simultanément, mais en les laissant sonner. kjfa255m52mdktdtyqzvvyh5j2v3pua Accordéon chromatique/BWV 1007 (Bach) 0 43046 767401 449257 2026-06-03T07:47:26Z DavidL 1746 767401 wikitext text/x-wiki <noinclude>{{Accordéon chromatique}}</noinclude> == À propos de cette partition == Le « Prélude » de la Suite pour violoncelle WBV 1007 a été composé en 1720 par Jean-Sébastien Bach. Diverses interprétations sont possibles : tempo rapide ou lent, articulation détachée ou au contraire liée... Utilisez de préférence un registre grave (type basson), sans pour autant donner trop de lourdeur aux notes : souvenez-vous que la partition originale est pour violoncelle. Vous pouvez arpéger l'accord final. Ce prélude a été joué par Richard Galliano dans l'album « Richard Galliano joue Bach » en 2010. == Partition == {{...}} 77cruurqtbtzs8h782675z4qer687nh Accordéon chromatique/Suggestions de morceaux (supérieur) 0 43047 767400 368081 2026-06-03T07:47:15Z DavidL 1746 767400 wikitext text/x-wiki <noinclude>{{Accordéon chromatique}}</noinclude> Vous devriez, à présent, être capable de jouer des morceaux plus avancés. *''Tango pour Claude'' : Richard Galliano 8s5qzi3w66ru4sk3kjcidbmlr5yb4s7 Accordéon chromatique/Suggestions de morceaux (avancé) 0 43048 767399 368080 2026-06-03T07:47:05Z DavidL 1746 767399 wikitext text/x-wiki <noinclude>{{Accordéon chromatique}}</noinclude> *''Monsieur Roudoudou'' : Claude Thomain *''L'enfant démon'' : Claude Thomain *''Aria'' : Richard Galliano *''La java bleue'' : Géo Koger et Noël Renard 81vkiqmx2b8rnoeprwdbdfqk53oxmdd Hélices de navires à déplacement 0 56829 767357 759404 2026-06-02T15:20:32Z DavidL 1746 767357 wikitext text/x-wiki {{Entête livre|titre=Application de la théorie thermodynamique à l'hélice marine.|1= ''Ce livre doit être rangé sur l'étagère [[Accueil|Wikilivres]] Science Appliquée Technologie''<br/> ''Généralités sur les sciences appliquées et les techniques, section ''[[Wikilivres:CDU/6/60|CDU/6/60]] }} {{#ifeq:{{PAGENAME}}|Hélices de navires à déplacement| ---- {{orange|[[Hélices de navires à déplacement|L'entête du Contenu]] est de deux pages et n'est pas destiné à être imprimé.}}<br /> {{orange|Les [[Hélices de navires à déplacement/Version imprimable|Version imprimable]] et [[Hélices de navires à déplacement/Version collection|Version collection]] sont configurée pour être imprimées en livret A5 à l'échelle d'impression de 120% et marges de 15 mm.}}<br /> {{orange|La [[Hélices de navires à déplacement/Couverture|Couverture complète du livret]] « Hélices de navires à déplacement » doit être imprimée séparément à l'échelle 120% et marges de 15 mm.}} ---- |}} <noinclude>{{NavDébut|book={{PAGENAME}}|page=Rappels|pageText=Démarrer}}</noinclude> {{Page de garde|image=Screw-Konpira.jpg|description= {{/Résumé introductif}} |avancement=Terminé |cdu= * {{CDU item|6|60}} |versions= {{Moteur}} {{Version imprimable}} {{version PDF}} {{Version compilée |lien=Wikilivres:Compilations/Calcul des hélices de navires à déplacement |titre=Calcul des hélices de navires à déplacement |sous-titre= |couleur-texte=blue }} }} {{Sommaire|large}} {{Autres projets |w=Hélice (homonymie) |wikt=hélice }} {{#ifeq:{{PAGENAME}}|Hélices de navires à déplacement| {{Nouvelle page imprimée}} &nbsp; |}} [[Catégorie:Livres terminés]] [[Catégorie:Physique]] [[Catégorie:Techniques et technologie marine]] rnjwzdv6zwb8d70bsildyv2l3m9qnt7 Hélices de navires à déplacement/Comprendre 0 56839 767348 682541 2026-06-02T15:18:24Z DavidL 1746 767348 wikitext text/x-wiki <noinclude>{{Hélices de navires à déplacement}}</noinclude> [[File:Hélice-moteur-Resistance-f(S)-0.jpg|thumb|480px|center|Courbe de résistance à la composition des vagues avant et arrière en fonction de la vitesse divisée par la racine de la longueur de coque à la flottaison.]] ; Il s'agit là de comprendre ce que l'on cherche à déterminer avec la feuille de calcul à l'aide des données qui sont à notre disposition : la longueur de la coque, son poids, sa forme, sa surface de carène, etc. ; Ce que l'on veut déterminer : c'est la puissance du moteur, la vitesse de croisière la plus économique, la vitesse maximale que peut avoir un tel navire et finalement le diamètre de l'hélice et son pas. * La résistance à ce que l'on appelle communément ''résistance à la vague d'étrave'' dépend de la longueur de la coque à la flottaison de la vitesse de déplacement du navire, de son poids (son déplacement), de la forme de son étrave. * La vitesse la plus économique en carburant est obtenue lorsque le creux de la vague d'étrave se trouve approximativement au milieu de la coque. * On détermine la vitesse maximale d'une coque à déplacement en fonction de la longueur à la flottaison. La puissance pour passer cette vague d'étrave devient vite très importante au delà de R=V/√L = 1,15 (Courbe de résistance ci-contre). V en mètres par seconde et L en mètres. :; Note : : La vitesse maximale. selon les constructeurs, peut avoir des valeurs différentes. : Valeur moyenne pour R=V<sub>max</sub>/√L ≅ 1,28. Cette valeur est sans doute exagérée, elle permet de ne pas sous évaluer la puissance du moteur, elle ne devrait pas dépasser 1,18 pour un voilier. : Par commodité on adopte souvent V<sub>max</sub> = C√L où C se situe entre 2,43 et 2,53, L en mètres et V en nœuds.<br /> : ''Par exemple, Pour une longueur de coque de 9 mètres : '' : (V<sub>max</sub>/√L) = 7,44±0,15 nœuds selon les constructeurs; <br /> : (V<sub>max</sub>/√L) = 6,88 nœuds pour R=1,18. * La puissance nécessaire pour atteindre la vitesse limite de carène ne dépend pas que de la vague d'étrave, elle dépend aussi de la surface de carène et de la forme de la coque. Pour un navire standard on estime à '''5 chevaux par tonne''', la puissance nécessaire pour atteindre la vitesse maximale. <gallery> <!--Image:Hélice-moteur-Resistance-f(S)-0.jpg |Courbe de résistance à la composition des vagues avant et arrière en fonction de la vitesse sur la racine de la longueur de coque à la flottaison. R=f(V/√L) --> </gallery> [[Catégorie:Hélices de navires à déplacement (livre)|{{SUBPAGENAME}}]] jau00bo8dgilbsqioe7pbramimq9o75 Hélices de navires à déplacement/Feuille de calculs 0 56840 767349 592280 2026-06-02T15:18:31Z DavidL 1746 767349 wikitext text/x-wiki <noinclude>{{Hélices de navires à déplacement}}</noinclude> <div class="noprint">{{Remarqueampoule|Les cinq pages suivantes sont à imprimer de préférence en mode paysage.}}</div> ==== Examen du fichier original ==== <br> [[File:Hélice-moteur-Pas&Diamètre-0.png|700px|center]] <div style="text-align: center;">La feuille de calculs Pas_&_Diamètre originale se présente au téléchargement comme sur l'image ci-dessus.</div> {{Nouvelle page imprimée}} ; Description : : '''Longueur et largeur à la flottaison :''' Les valeurs sont données par le constructeur du navire. : '''Puissance nominale en chevaux :''' Puissance du moteur donné par le fabricant du moteur. : '''Puissance du moteur :''' Cette valeur est calculée en tenant compte des pertes de transmission évalués à 5% de la puissance nominale. Il est possible de modifier cette valeur manuellement. : '''Puissance du moteur en kW :''' Puissance en kilowatt. Cette valeur se substitue à la puissance du moteur si une valeur est précisée. : '''Poids en charge, en tonnes :''' Poids total du navire armé avec réservoirs pleins. : '''Forcer la vitesse maximale estimée :''' Cette case doit être effacée, elle permettra d'ajuster les paramètres de l'hélice (voir les sections suivantes). : '''Réducteur:réduction en marche avant (RH) :''' Cette valeur est donnée par le fabricant du réducteur. : '''Rapport de réduction :''' Cette valeur est calculée si la ligne précédente est remplie sinon il faut entrer la valeur fournie par le constructeur de l'inverseur. : '''Nombre de tours moteur à la puissance maximale :''' Cette valeur est fournie par le constructeur du moteur. : '''Recul estimé à la puissance optimale :''' La puissance optimale est ici la puissance maximale du moteur par vent contraire ramenant la vitesse du navire à la vitesse optimale. Cette valeur peut être difficile à évaluer. Pour une hélice standard 2, 3, ou 4 pales, cette valeur est voisine de 0,275 ± 0,005. : '''Hauteur de la cage d'hélice :''' Elle est mesurable ou donnée par le constructeur du navire. {{Nouvelle page imprimée}} ==== Cases à remplir ou à modifier et résultats intermédiaires ==== <br> [[File:Hélice-moteur-Pas&Diamètre-1.png|720px|center]] <div style="text-align: center;">''Image de la feuille de calculs en cours de traitement. Les cases jaunes sont à remplir ou à modifier.''</div> {{Nouvelle page imprimée}} ; Remplir les cases surlignées en jaune comme sur l'image. Vous obtenez un aperçu avec des remarques : # Recul estimé de l'hélice : {{rouge|ok}} # Contrôle : {{rouge|ok}} Ce contrôle vérifie que le recul s'effectue à une valeur supérieure à 0,25. Le recul est conseillé entre 0,27 et 0,33. # Degré de vitesse R = {{rouge|1,296. une valeur inférieure à 1,18 est recommandée}}. # Pas optimal estimé = {{rouge|17,98 pouces supérieur au diamètre}} optimal estimé; ce genre d'hélice n'existe pas ! {{rouge|Agir sur la case B13}} pour forcer la vitesse maximale à une valeur inférieure. # Pas réel = {{rouge|17,98 pouces}} même message que précédemment, mais {{rouge|agir sur la case B21}} après avoir agi sur la case B13 pour adapter le pas réel. # Hauteur minimal de dégagement de la cage d'hélice : {{rouge|ok}}. Vérifie si le diamètre de l'hélice est compatible avec la cage. {{Nouvelle page imprimée}} ==== Ajustement des données et résultat final ==== <br> [[File:Hélice-moteur-Pas&Diamètre-2.png|710px|center]] <div style="text-align: center;">''Résultat final après modification des cellules B13 et B21.<br>B13 : {{rouge|Forcer la vitesse maximale estimée}}<br>et B21 : {{vert|Ajuster pour adapter au pas réel}}''</div> {{Nouvelle page imprimée}} ; Agir sur la cellule B13 pour corriger le diamètre puis sur la cellule B21 pour corriger le pas : # Modifier la ligne ''Forcer la vitesse maximale estimée'' (B13) jusqu'à obtenir un degré de vitesse acceptable. ''(Se référer à la courbe de la première section)''. Cette action agit aussi sur les diamètres et pas d'hélice; Rechercher le diamètre d'hélice souhaité et compatible avec la cage d'hélice. # Modifier la ligne ''Ajuster pour adapter au pas réel'' (B21) jusqu'à obtenir le pas d'hélice souhaité. # Des remarques peuvent être compatibles ou incompatibles Sur la feuille de calcul.<br />Après ces modifications de la feuille de calculs vous noterez la remarque ''{{rouge|Hélice trop grande}}''. En effet, la cage d'hélice devrait avoir une hauteur suffisante pour ne pas perturber le fonctionnement. Dans le cas exposé l'hélice de 19 pouces a une marge un peu juste pour la cage de 21,3 pouces (une différence de 3 cm). Il reste cependant 1,5 cm entre les pales d'hélice et la cage. À l'expérience il n'y a pas eu de problème lié à cette remarque. [[Catégorie:Hélices de navires à déplacement (livre)|{{SUBPAGENAME}}]] de11lw3odg8upbjodchmj5pfjn069b9 Hélices de navires à déplacement/Examen des résultats 0 56854 767350 607886 2026-06-02T15:18:38Z DavidL 1746 767350 wikitext text/x-wiki <noinclude>{{Hélices de navires à déplacement}}</noinclude> [[Image:Th-helice-application2.gif|thumb|775px|center|Hélice 19x17 pouces]] {{Nouvelle page imprimée}} L'entête reprend, en vert, les données de la feuille de calculs PAS & DIAMETRE. Les cellules en noir : # H4 : Densité de l'eau, 1000 pour l'eau douce, en grammes par litre. # H7 : Surface de l'hélice par rapport à un disque de même diamètre, elle est donnée par le constructeur de l'hélice. # H8 : Profondeur de l'axe de l'hélice, en mètre. # M60 : Vitesse du navire en nœuds. Le tableau donne les valeurs estimées en fonction de : ## La vitesse de rotation du moteur (Colonne B) ## Puissance disponible sur l'arbre (Colonne C) ## Le [[Hélice#Caractéristiques_des_hélices_marines|recul]] estimé (Colonne L) ## La force de propulsion (Colonne P) en [[w:Newton_(unité)|Newton]]. Diviser par 9,81 ''(ou par 10)'' pour avoir la force en [[w:Kilogramme-force|Kg<sub>f</sub>]]. ## La puissance à l'hélice en Watt. (Colonne Q) ## Le rendement estimé de l'hélice (Colonne R) ## La pression exercée sur la transmission. (Colonne T) ## La pression exercée sur les pales, en kg/cm² ''Système CGS pour une lecture plus perceptible''. (Colonne W) # Fichier Helice-application-VOLVO-D2-75.xls) : Complément d'information sur la consommation de gasoil. ## La consommation estimée en litre par heure (Colonne Y) ## La consommation estimée en litre par mille nautique (Colonne Z) L'examen de la feuille de calcul Th-helice-application2 permet de visualiser toutes les informations nécessaires pour maintenir la vitesse de croisière à 7 nœuds. 1700 tours moteur correspond à une croisière sans vent avec une force de poussée de 250 kg<sub>f</sub> environ, alors qu'il sera nécessaire de tourner à 2400 tours pour une poussée de 620 kg<sub>f</sub>; au delà de 620 kg<sub>f</sub> la vitesse du navire sera plus faible. <div class="noprint"> ''Tout cela est bien théorique et valable par temps calme. Par mauvais temps la houle et les vagues en décident autrement !'' </div> [[Catégorie:Hélices de navires à déplacement (livre)|{{SUBPAGENAME}}]] l30jktwwnjuwqi8qsppng7vkr191llr Hélices de navires à déplacement/Résultats à des vitesses caractéristiques 0 56855 767351 674221 2026-06-02T15:18:47Z DavidL 1746 767351 wikitext text/x-wiki <noinclude>{{Hélices de navires à déplacement}}</noinclude> Certaines valeurs sont intéressantes à observer; en statique, à la vitesse optimale pour l'hélice, à la vitesse optimale pour la carène, à la vitesse maximale. [[File:Helice-application-VOLVO-D2-75-Estimation des efforts-DataV000.png|thumb|680px|center|Navire en statique]] {{Nouvelle page imprimée}} [[File:Helice-application-VOLVO-D2-75-Estimation des efforts-DataV642.png|thumb|680px|center|V = 6,42 Nds, vitesse optimale d'hélice.''Notez le rendement de l'hélice à la puissance maximale (autour de 50%) alors que le rendement se situe entre 0,62 et 0,66 en navigation par tempes calme.'']] <div style="text-align: center;"> [[File:Wake.avon.gorge.arp.750pix.jpg|450px|Sillage d'un navire à faible vitesse]] Sillage d'un navire à faible vitesse dans les gorges d'Avon, Bristol, Angleterre.</div> {{Nouvelle page imprimée}} [[File:Helice-application-VOLVO-D2-75-Estimation des efforts-DataV722.png|thumb|680px|center|V = 7,22 Nds vitesse optimale de carène]] <div style="text-align: center;"> [[File:Effet bulbe etrave.ogv|450px|center|'''Effet du bulbe d'étrave''']] '''Cardabela''' Le bulbe casse la vague d'étrave à 7 nœuds.</div> {{Nouvelle page imprimée}} [[File:Helice-application-VOLVO-D2-75-Estimation des efforts-DataV800.png|thumb|680px|center|V = 8 Nds. Vitesse maximale, vitesse limite de carène.]] [[File:Arunspeed.jpg|450px|center|'''Arunspeed''']] <div style="text-align: center;">'''Arunspeed''' atteint sa vitesse maximale de carène</div> [[Catégorie:Hélices de navires à déplacement (livre)|{{SUBPAGENAME}}]] n2vbpzoapakifrl6hx6nt1njts5f7hw Hélices de navires à déplacement/Graphiques des puissances aux vitesses caractéristiques 0 56856 767352 541898 2026-06-02T15:19:00Z DavidL 1746 767352 wikitext text/x-wiki <noinclude>{{Hélices de navires à déplacement}}</noinclude> ; Graphes de puissance d'une hélice marine pour un navire de 13 mètres, 15 tonnes, avec un moteur de 75 chevaux: On voit dans ces exemples que le régime moteur recommandé est de 2100 tours par minutes. Par temps calme la puissance nécessaire pour un avancement du bateau entre 6,5 nœuds et 7,2 nœuds est de 26 kW environ et correspond, à peu près, à la moitié de la puissance maximale du moteur. [[File:Helice-application-VOLVO-D2-75-Estimation des efforts-GrapheP-V000.png|thumb|530px|center|<small>'''Navire en statique.''' Avec cette hélice on voit que le moteur peut atteindre, au mieux, 2350 tours par minute pour 48 kW sur l'arbre d'hélice. (Croisement des courbes bleu-clair et mauve.)</small>]] [[File:Helice-application-VOLVO-D2-75-Estimation des efforts-GrapheP-V642.png|thumb|530px|center|<small>'''V = 6,42 Nds. Vitesse optimale d'hélice.''' Avec cette hélice le moteur peut atteindre, au mieux, 2650 tours par minute pour une puissance de 50 kW sur l'arbre d'hélice.</small>]] [[File:Helice-application-VOLVO-D2-75-Estimation des efforts-GrapheP-V722.png|thumb|530px|center|<small>'''V = 7,22 Nds.vitesse optimale de carène.''' Avec cette hélice le moteur peut atteindre, au mieux, 2700 tours par minute pour une puissance de 51 kW sur l'arbre d'hélice.</small>]] [[File:Helice-application-VOLVO-D2-75-Estimation des efforts-GrapheP-V800.png|thumb|530px|center|<small>'''V = 8 Nds. Vitesse maximale, vitesse limite de carène.''' Avec cette hélice le moteur peut atteindre, au mieux, 2750 tours par minute pour une puissance de 51 kW sur l'arbre d'hélice.</small>]] 68lm6w4byb3fzqufnqcbzirpcb8rrke Hélices de navires à déplacement/Graphiques des forces aux vitesses caractéristiques 0 56857 767353 569162 2026-06-02T15:19:11Z DavidL 1746 767353 wikitext text/x-wiki <noinclude>{{Hélices de navires à déplacement}}</noinclude> [[File:Helice-application-VOLVO-D2-75-Estimation des efforts-GrapheF-V000.png|thumb|530px|center|'''Navire en statique.''' La force exercée sur l'arbre d'hélice est de <math>9200 N</math> ('''≅'''<math>920 kg_f</math>) à 2350 tours par minute du moteur.]] {{clr}} <div style="text-align: center;"> [[File:Dynamomètre avec palan démultiplicateur.jpg|150px|centre|Mesure d'une force de traction avec un palan démultiplicateur]]Mesure d'une force de traction avec un dynamomètre de 200 Kg<sub>f</sub> et un palan démultiplicateur à six brins.<br> (1000&nbsp;N&nbsp;≅&nbsp;100&nbsp;Kg<sub>f</sub> au dynamomètre égale 6000&nbsp;N ou ≅&nbsp;600&nbsp;Kg<sub>f</sub> en traction) </div> {{clr}} [[File:Helice-application-VOLVO-D2-75-Estimation des efforts-GrapheF-V642.png|thumb|530px|center|'''V= 6,42 nd, vitesse optimale d'hélice.''' À 2100 tr/min <math>4965 N</math> et <math>7750 N</math> à 2650 tr/min]] [[File:Helice-application-VOLVO-D2-75-Estimation des efforts-GrapheF-V722.png|thumb|530px|center|'''V = 7,22 nd, vitesse optimale de carène.''' À 2100 tr/min <math>4450 N</math> et <math>7530 N</math> à 2700 tr/min]] [[File:Helice-application-VOLVO-D2-75-Estimation des efforts-GrapheF-V800.png|thumb|530px|center|'''V = 8 nd vitesse maximale, vitesse limite de carène.''' À 2100 tr/min <math>3920 N</math> et <math>7750 N</math> à 2750 tr/min. À 2100 tours l'effort complémentaire est fourni par les voiles ou simplement le vent arrière: <math>7750 N - 3932 N = 3818 N</math> ]] 80axw8uxpl5o5ipp8mmhmgpkaxcelsz Hélices de navires à déplacement/Expérimentation en mer 0 56858 767354 624643 2026-06-02T15:19:20Z DavidL 1746 767354 wikitext text/x-wiki <noinclude>{{Hélices de navires à déplacement}}</noinclude> <!--;Remarques faites le 10/02/2008 :--> '''En statique : Nombre de tours max : 2350''' manette des gaz à fond en marche avant; laisse présumer un recul de 0,27 ! {| border="1" ! tr/min ! vitesse (nds) ! Conditions |- | 1200 | 4,2 |Pas de vent ou très peu, un peu de houle hélice et coque pas parfaitement propre. |- |1480 |5,4 |- |1800 |7 - 6,4 |- |1950 |7 |Conso : 4,3 litres par heure ; 0,614 litre par mille marin. |- |2000 |7,1 - 7,2 |- |2700 |8,4 - 8,5 |Vitesse maximale atteinte. |} 09/06/08 Feuille Application (du classeur ''Helice-moteur.xls'')<!--: Ont été ajoutés 4 graphes d'estimations V(N); et consommations estimées.--> {| border="1" |+ Prévisions ''par mer d'huile'' !N !V !F !P !Conso l/h !Conso l/mn |- align="center" |1200 |4,2 |1775 |6271 |1,2 |0,29 |- align="center" |1400 |5,1 |2194 |8967 |1,8 |0,35 |- align="center" |1600 |5,8 |2751 |12684 |2,6 |0,45 |- align="center" |1800 |6,5 |3332 |17060 |3,5 |0,54 |- align="center" |2000 |7,1 |3994 |22361 |4,8 |0,68 |- align="center" |2200 |7,6 |4729 |28583 |6,3 |0,83 |- align="center" |2400 |8,0 |5526 |35651 |8,0 |1,00 |- align="center" |2600 |8,3 |6367 |43406 |10,2 |1,23 |- align="center" |2800 |8,6 |7168 |51303 |13,5 |1,57 |} N en tours par minute, V en nœuds, F en newtons, P en watts. hcorfb40elvqknzjd8fq5odqz096a2o Hélices de navires à déplacement/Commentaires sur l'expérimentation et prospectives 0 56859 767355 569164 2026-06-02T15:19:29Z DavidL 1746 767355 wikitext text/x-wiki <noinclude>{{Hélices de navires à déplacement}}</noinclude> ; Conclusions de 2008 : Dans la ''Feuille de calcul conso'' les valeurs ont été lissées. <br /> On a obtenu la courbe empirique suivante avec une stagnation de la puissance et de la consommation en carburant, entre les abscisses R=0,95 à 1950 tr/min et R=1,05 à 2200 tr/min correspondants 6,54 et 7,22 nd. La consommation chute rapidement en deçà de R=0,95. [[File:Helice-application-VOLVO-D2-75-PdeR.png|thumb|530px|center|<small>Graphe de la Puissance de propulsion estimée en fonction de la vitesse en tenant compte de la résistance à la vague.<br /> * En bleu:Influence estimée de la vague d'étrave<br /> * En jaune:Indication de puissance calculée à rendement=0,62 sans influence de vague d'étrave<br /> * En violet:Indication de puissance calculée à rendement=0,66 sans influence de vague d'étrave<br /> * En mauve:Puissance estimée plus conforme à l'expérience en tenant compte de la vague d'étrave. Laisse présumer un rendement d'hélice entre 0,64 et 0,65</small>]] <!-- --> [[File:Helice-application-VOLVO-D2-75-ConsoMn.png|thumb|530px|center|<small>Courbe de consommation évaluée en litres par mile nautique. La graduation en abscisse graduée nœuds, 6,54 nd correspond à R=0,95 et 7,22 nd correspond à R=1,05. Selon le graphe de résistance à la vague d'étrave.<br />Dans la pratique avec la goélette Cardabela on n'observe pas de creux de puissance ni de diminution de consommation importantes entre 6,5 et 7 nd</small>]] higffb2kanmt2us8cospb92dio99iow Hélices de navires à déplacement/Conclusions 0 56860 767356 684404 2026-06-02T15:19:40Z DavidL 1746 767356 wikitext text/x-wiki <noinclude>{{Hélices de navires à déplacement}}</noinclude> '''Téléchargez les feuilles de calcul, expérimentez, ajoutez votre expérience et vos conclusions.''' <!--# Les rares retours d'expériences sont concordants. L'étude de l'hélice marine par la thermodynamique donne bien des résultats représentatifs de l'expérience en mer. Le calcul de l'hélice marine par cette méthode donne de très bons résultats pour les navires à déplacement (Voiliers, pêche-promenade, pêche) # La théorie thermodynamique de l'hélice reste bien sûr valable pour d'autres types de navires et reste à démontrer. # En mer il y a aussi les vagues du vent qui perturbent ce joli calcul des vitesses et des puissances; pour la même vitesse de rotation du moteur on a des variations de vitesse importantes.--> == Retour d'expérience == '''Remarque :''' {{rouge|Quels que soient les moteurs et hélices, pour un même bateau on doit obtenir la même vitesse du bateau pour une même puissance fournie à l'hélice.}} Curieusement nous devons utiliser le même recul théorique dans deux expériences suivantes sur le même bateau pour avoir des résultats cohérents avec les essais (recul = 0,27 ou 0,28) :<br>{{rouge|''Attention ; le recul défini ici s'entend lorsque le moteur est à sa puissance maximale pour une vitesse de bateau égale à la vitesse optimale (tableaux ci dessous)''}} Dans les calculs d'hélices pour des moteurs de 50 et 75 chevaux le rendement à la vitesse optimale par temps calme se situe dans les deux cas aux environs de 0,62.<br>La perte d'énergie est alors égale à environ un tiers de la puissance fournie à l'hélice. {{Nouvelle page imprimée}} <div class="noprint">{{Remarqueampoule|Les trois pages suivantes sont à imprimer de préférence en mode paysage.}}</div> ; Avec un moteur de 50CV : Hélice 3 pales hélicoïdale 18x12 [[File:Hélice-moteur-Pas&Diamètre-0.png|center|710px|'''Vitesse optimale d'hélice : 5,80 nd''']] <div style="text-align: center;">'''Vitesse optimale d'hélice : 5,80 nd'''</div> {{Nouvelle page imprimée}} ; Avec un moteur de 75CV : Hélice 3 pales hélicoïdale 19x17 [[File:Th-helice-application1.gif|center|710px|'''Vitesse optimale d'hélice : 6,42 nd''']] <div style="text-align: center;">'''Vitesse optimale d'hélice : 6,42 nd'''</div> {{Nouvelle page imprimée}} ;Exemple de rendement d'hélice dans le tableau ci-dessous : À la ligne non surlignée, 1900 tr/min du moteur le rendement d'hélice est de 0,62 à la vitesse optimale par temps calme.[[File:Helice-application-VOLVO-D2-75-Estimation des efforts-DataV642.png|center|760px]] <!--[[File:Helice-application-VOLVO-D2-75-Estimation des efforts-GrapheP-V642.png|740px]]--> :On peut maintenir cette vitesse de 6,42 nœuds jusqu'à 2600 tr/min du moteur qui atteint sa puissance maximale. L'effort sur l'hélice passe de 3900 à 7500 newtons et le rendement de l'hélice passe à 0,51 avec une perte d'énergie de 50%. 4cj34ntd7rneu0k4nsf8a8tflxof7gy Hélices de navires à déplacement/Rappels 0 56863 767347 624404 2026-06-02T15:18:16Z DavidL 1746 767347 wikitext text/x-wiki <noinclude>{{Hélices de navires à déplacement}}</noinclude> [[File:Helice-moteur.jpg|center|470px|Abaque pour déterminer le diamètre des hélices marines]] Grâce aux travaux de Daniel Bernoulli<ref><small>[[w:Théorème_de_Bernoulli|Théorème de Bernoulli]]</small></ref>, des formules mathématiques ont été établies dès le 18e siècle sur la percussion des fluides.<br /> Ces travaux ont été poursuivis par Morosi et Bidone <ref><small>[http://books.google.com/books?id=ZtUAAAAAYAAJ&pg=RA3-PA33&lpg=RA3-PA33&dq=Morosi+Bidone&source=bl&ots=yFVM2l2isC&sig=JNZuce2VlB7drXiheb_htyIrWtI&hl=fr&ei=dwEkSuLnBtOZjAedv-zKBg&sa=X&oi=book_result&ct=result&resnum=2 Memorie della Reale accademia delle scienze di Torino : Morosi et Bidone] Pages 1 à 191 notamment §4 (Pages sur la percussion des fluides sous différents angles de réflexion)</small></ref>, et à partir de là, de la seconde moitié du 19e siècle, des formules mathématiques avec des exposants fractionnaires ont été utilisées pour le calcul des hélices marines. Ces formules sont encore utilisées aujourd'hui, le plus souvent pour créer des abaques plus faciles à utiliser. [[w:Sadi_Carnot_(physicien)|Sadi Carnot]], [[w:Rudolf Clausius|Rudolf Clausius]], puis [[w:Ludwig Boltzmann|Ludwig Boltzmann]] ont développé les théories thermodynamiques et la notion d'entropie<ref><small>[[w:Entropie (thermodynamique)|Entropie (thermodynamique)]]</small></ref> La transformation irréversible (deuxième principe de la thermodynamique) engendre le recul des hélices marines. Le recul n'est pas calculable, ce sont les expériences qui nous permettent de déterminer une valeur. Dans les feuilles de calculs cette valeur est choisie dans une fourchette autour de 0,28 (de 0,25 à 0,33) que l'on peut corriger après les essais en mer. <references /> == Caractéristiques des hélices marines == '''Définitions :''' * '''Le diamètre''', donné en pouces par le fabricant. ''Il est transformé en mètres pour les calculs.'' * '''Le pas de construction''' est une caractéristique géométrique de l'hélice. C'est la longueur d'avance théorique pour un tour, sans glissement (recul = 0). Le pas de l'hélice pourrait ainsi être comparé au pas d'une vis à métaux, mais ceci conduirait à des erreurs d'interprétation sur le fonctionnement de l'hélice. Le pas est exprimé en pouces ou en mètres, il peut être à gauche ou à droite. * '''Le coefficient de remplissage''' (0,xx ou xx %), ce coefficient caractérise la surface relative des pales par rapport à la surface d'un disque de même diamètre. Ce coefficient est important pour estimer la limite de l'effort d'aspiration applicable sur la surface des pales afin d'éviter la [[cavitation]]. ''Ce coefficient n'intervient pas dans nos calculs ci-après''. * '''Le calage''' est l'angle que fait la corde d'un profil de pale avec le plan de rotation de l'hélice * '''Le recul''' : d'un point de vue thermodynamique, le recul correspond à une perte d'énergie dans l'impact de l'eau avec l'hélice. On parle d'[[w:Entropie | entropie]] ou d'augmentation du désordre. La vitesse de propulsion de l'eau est inférieure d'un certain pourcentage à celle attendue. Ce pourcentage est communément appelé le recul. Ainsi, pour résoudre les problèmes de calcul on pourrait dire que '''le pas effectif''' de l'hélice est inférieur au '''pas de construction'''. On définit la notion de recul par la relation suivante : *: '''recul = 1 - (pas effectif / pas de construction)''' dans des conditions de vitesse d'avancement du navire et de rotation de l'hélice. *: Le coefficient de recul s'exprime souvent en pourcentage, par exemple 28 % au lieu de 0.28 dans telles conditions d'avancement et de rotation. *: Le recul est important à faible vitesse et forte poussée, il augmente avec la force de poussée sur l'hélice : ''avec le débit et la vitesse de rotation''. * '''La cavitation.''' La dépression à l'extrados du profil de pale dépend de la vitesse de rotation de l'hélice, de son pas et du profil. La dépression est limitée par la pression atmosphérique ; elle ne peut pas descendre en dessous d'environ 1 bar en surface (la vitesse d'aspiration ne doit pas dépasser 14 m/s) ; au-delà de cette valeur l'eau se transforme en vapeur (phénomène de [[cavitation]]). À un mètre de profondeur cette vitesse limite serait d'environ 14,7 mètres/seconde. *: Cette notion est très importante pour les navires rapides mais intervient rarement pour un voilier monocoque dont on s'arrange pour que la vitesse d'aspiration de l'eau soit largement inférieure à 14 mètres/seconde, ''les héliciers choisissent toujours le plus grand diamètre compatible''.<br/> *: Depuis quelques années sont apparues les hélices de surface qui permettent de diminuer les risques de cavitation ; le passage des pales en surface nettoie l'hélice des bulles de vapeur d'eau. == Formules utilisées dans nos feuilles calculs == Ce sont les formules démontrées dans la l'article [[Hélice]] de wikibooks. <poem> ''Force propulsive, puissances et rendement :'' '''Force propulsive = 2 ρ S Vp (Vp - V1)''' '''Putile = 2 ρ S Vp (Vp-V1) V1''' '''Pmoteur = 2 ρ S Vp² (Vp-V1)''' '''Rendement = V1/Vp''' '''''[[w:Système international d'unités|Système métrique]] utilisé :''''' '''ρ = 1000 kg/mètre cube ; pour l'eau douce''' (une tonne par mètre cube). '''S = 3,14 * D²/4 ; en mètre carré.''' '''V1 ; vitesse d'entrée de l'eau dans l'hélice en mètres par seconde.''' '''Vp = Vh (1-Recul) ; vitesse de propulsion dans l'hélice, en mètres par seconde''',<br/> où Vh = Pas (en mètres) * tours/seconde (de l'hélice),<br/> et Recul selon les conditions de navigation. </poem> {{AutoCat}} pqkichqdhhqpdgzsrjmdxbljmggdl7h Accordéon chromatique/Entretien 0 58838 767402 444413 2026-06-03T07:48:21Z DavidL 1746 767402 wikitext text/x-wiki <noinclude>{{Accordéon chromatique}}</noinclude> Pour éviter que l'accordéon ne se désaccorde, il faut éviter l'humidité et les variations thermiques. Ne pas laisser l'instrument dans sa boîte. Le stocker dans les pièces de vie et non dans le grenier ou la cave... 3lnnwqoorvfqvvoccz4e9mywz1ee96b Accordéon chromatique/Historique 0 59199 767393 677639 2026-06-03T07:42:02Z DavidL 1746 767393 wikitext text/x-wiki <noinclude>{{Accordéon chromatique}}</noinclude> {{ébauche|left=1}} À noter qu'une partie de ce chapitre pourra être construite du chapitre ci-après : [[Histoire du clavier alphabétique/Clavier pour instrument à vent]] {{AutoCat}} i7zdulxmd8xz08u9ywt54mcopoza2x6 Planétologie/Les orbites des planètes et satellites 0 72754 767371 734112 2026-06-02T19:36:21Z ~2026-32879-51 123919 /* Les trois lois de Kepler */ 767371 wikitext text/x-wiki Les planètes tournent autour du Soleil en suivant une trajectoire bien précise, appelée l''''orbite''' de la planète. Cette orbite est une courbe fermée périodique, ce qui signifie que la planète revient à sa position initiale après un certain temps. En clair, elle parcourt cette trajectoire à l'identique de manière cyclique, chaque passage ayant la même durée que les autres. Décrire les orbites et les calculer est du domaine de la mécanique céleste, une branche de la physique dédiée au mouvement des planètes, satellites, petits corps et autres objets astronomiques. C'est elle qui se cache derrière le calendrier, derrière les saisons, les heures de lever et de coucher du Soleil, et bien d'autres choses du quotidien. Bien que le domaine soit très vaste et que les développements mathématiques soient légion, nous n'allons pas le voir en détail dans ce chapitre et allons simplement voir les bases du domaine, celles nécessaires dans un cours de planétologie. ==Les trois lois de Kepler== [[File:Copernican heliocentrism theory diagram.svg|vignette|Illustration du modèle héliocentrique de Copernic.]] Sans rentrer dans les détails de l'histoire, la mécanique céleste a beaucoup progressé lors de la renaissance. Durant l'antiquité, les savants pensaient que la Terre était au centre du monde et que le Soleil et autres corps tournaient tout autour. Ce modèle géocentrique était assez intuitif et correspond bien aux observations naïves du quotidien. Après tout, le Soleil semble tourner autour de la Terre : il se lève à l'est et se coucher à l'ouest. Même chose pour les étoiles, qui se déplacent dans le ciel dans la même direction. Certes, ce n'est pas parfait et certaines planètes avaient des mouvements légèrement différents d'un mouvement circulaire, mais la théorie géocentrique tenait assez bien la route pour l'époque. Ses prédictions mathématiques permettaient de prédire le mouvement des astres avec une précision assez appréciable dans la plupart des cas. Cependant, les astronomes finirent par se rallier au modèle dit héliocentrique, où le Soleil est au centre du système solaire et où les planètes tournent autour de lui. À la suite de cette révolution scientifique, les astronomes purent décrire plus précisément les orbites des planètes. Au 16ème siècle, Kepler établit ses fameuses lois du mouvement des planètes, sur la base de nombreuses observations astronomiques. Comme tout grand astronome de son temps, Kepler avait effectué des années d'observations et accumulé des quantités de données astronomiques assez importantes sur le mouvement des planètes. À partir de ces données, il établit trois lois qui servent encore aujourd'hui à décrire les orbites : la loi des orbites, la loi des aires et la loi des périodes. ===La première loi de Kepler=== Rappelons rapidement ce qu'est une ellipse, afin de bien comprendre de quoi il retourne. Intuitivement, une ellipse est une sorte de cercle aplati. Dans les faits, les cercles sont des cas particuliers d'ellipses, ces dernières étant une sorte de cercle à deux centres. Une ellipse demande, pour être tracée, de préciser deux points A et B, qui sont appelés les ''foyers''. Chaque point de l'ellipse est situé à une distance <math>d_A</math> du point A et à une distance <math>d_B</math> du point B. Pour tout point de l'ellipse, la somme <math>d_A + d_B</math> est la même. [[File:Constructie ellips tuinmanier.gif|centre|vignette|upright=1.5|Ellipse : définition.]] La première loi dit que les orbites planétaires sont des ellipses, dont le Soleil occupe un des foyers. [[File:First law of Kepler.svg|centre|vignette|upright=1.5|Première loi de Kepler.]] Lorsqu'une planète se déplace sur son orbite, il y a un point où elle est la plus proche du Soleil et un autre où elle en est la plus éloignée. Ces deux points sont appelés respectivement la périapside et la apoapside. L''''apoapside''' est la distance maximale entre l'objet en orbite et le foyer où se trouve le Soleil, alors que la '''périapside''' est la distance minimale. Dans le cas où l'on parle de l'orbite d'un corps qui tourne autour du Soleil (une planète, par exemple), on parle aussi de périhélie et d'aphélie. [[File:Plan ecliptique.png|centre|vignette|upright=2.0|Plan ecliptique]] ===La seconde loi de Kepler=== La seconde loi porte sur la vitesse de la planète sur son orbite. Si l'on prend une durée T (peu importe sa valeur), la planète va parcourir une petite portion de l'ellipse, un arc d'ellipse (si on peut faire l'analogie avec un arc de cercle). Il est possible de rejoindre les extrémités de cet arc d'ellipse avec le foyer occupé par le Soleil. Ce faisant, on décrit une surface qui ressemble approximativement à un triangle, dont la base serait en réalité un arc d'ellipse. La seconde loi dit que pour une durée fixée, l'aire de cette surface reste la même, quelle que soit la position de l'arc d'ellipse. [[File:Deuxième loi de Kepler.svg|centre|vignette|upright=1.5|Ici, l'aire bleue et l'aire rouge décrivent les aires balayées par la planète durant une durée T identique. La seconde loi de Kepler nous dit que les deux aires sont de même surface.]] ===La troisième loi de Kepler=== La troisième loi de Kepler donne une relation entre la '''période orbitale''', à savoir le temps que met la planète à faire un tour complet de son orbite, et le demi-grand axe de l'orbite. La troisième loi de Kepler dit que le carré de celle-ci est proportionnel au cube du demi-grand axe de l'orbite. Mathématiquement, elle vaut : : <math>\frac{2 \pi}{T}^2 \propto a^3</math>, avec <math>T</math> la période orbitale et <math>a</math> le demi-grand axe de l’orbite. [[File:Solar system orbital period vs semimajor axis.svg|centre|vignette|Relation entre demi-grand axe et période orbitale pour les planètes du système solaire.]] ==Les paramètres orbitaux== Décrire l'orbite d'une planète dans le système solaire demande de fournir plusieurs paramètres, au moins six. Les paramètres en question sont appelés les '''paramètres orbitaux'''. Ils portent respectivement les noms de demi-grand axe, d'excentricité, d'inclinaison, de longitude du nœud ascendant, d'argument du périastre et de position de l'objet sur son orbite. Les deux premiers décrivent la forme de l'orbite, la forme de l'ellipse, les deux suivants indiquent la position du plan de l'orbite, l'avant-dernier donne la position de l'ellipse sur le plan de l'orbite et le dernier donne la position de la planète ou du satellite sur l'orbite. Le schéma ci-dessous illustre les paramètres orbitaux, mais ne suffira pas à lui seul pour les comprendre. Aussi, dans cette section, nous allons voir en détail à quoi correspondent ces paramètres orbitaux. [[File:Orbit1 fr.svg|centre|vignette|upright=2.0|Résumé des paramètres orbitaux.]] ===La description de l'ellipse orbitale=== Les premiers paramètres décrivent la forme de l'ellipse qui constitue l'orbite. On peut décrire cette ellipse de plusieurs manières, mais la plus simple fait appel à deux paramètres appelés le '''petit axe''' et le '''grand axe'''. Il s'agit de deux distances qui passent par le centre de l'ellipse, le petit axe étant la plus grande distance et le grand axe la plus grande. Le grand axe est aligné avec les deux foyers, alors que le petit axe passe au milieu de ceux-ci (c'est la médiatrice du segment formé par les deux foyers). On peut aussi utiliser non pas le petit axe et le grand axe, mais leur moitié. En mathématique, ces deux grandeurs sont appelées le demi-petit axe et le demi-grand axe. [[File:An ellipse with auxiliary circle.svg|centre|vignette|upright=1.5|a : grand axe de l'ellipse, b : petit axe de l'ellipse.]] Mais les astronomes n'utilisent pas le demi-grande axe et le demi-petit axe. À la place, ils utilisent deux paramètres appelés le demi-grand axe et l’excentricité. Le demi-grand axe n'est autre que la moitié du grand axe vu précédemment. Par contre, le petit axe est remplacé par un paramètre appelé l''''excentricité''', qui décrit l’aplatissement de l'ellipse, l'écart entre l'ellipse et un cercle parfait. L'excentricité est comprise entre 0 et 1 : elle vaut 0 pour un cercle, 1 pour une ellipse totalement aplatie (un segment). [[File:Eccentricityellipse.svg|centre|vignette|upright=1.5|Excentricité d'une ellipse.]] L'excentricité peut se calculer à partir de la distance entre les deux foyers, notée <math>F</math>, et la longueur du grand-axe. : <math>e = \frac{F}{2 \cdot a}</math>, avec <math>a</math> le demi-grand axe. L'excentricité peut se calculer à partir du demi-petit axe et du demi-grand axe, avec la formule suivante : : <math>e = \frac{a - b}{a + b}</math> Enfin, on peut aussi utiliser la formule suivante : : <math>e = \frac{c}{a}</math>, avec c la distance entre le centre de l'ellipse et un foyer, qui vaut <math>c = \sqrt{a^2 - b^2}</math>. Une autre définition équivalente est donnée par la formule suivante : : <math>e = \sqrt{1 - \frac{b^2}{a^2}}</math> On peut relier l'excentricité avec périapside et apoapside. Dans ce qui suit, on note <math>r_{p}</math> la périapside et <math>r_{a}</math> l'apoapside, alors que l'excentricité est notée <math>e</math>. On a, par définition de l'excentricité : : <math>r_{p} = a (1 - e)</math> : <math>r_{a} = a (1 + e)</math> ===La description du plan orbital=== L'ellipse qui forme l'orbite est orientée d'une certaine manière dans l'espace. Elle est comprise dans un plan que nous allons appeler '''plan orbital'''. Le plan orbital est repéré par rapport à un '''plan de référence''', choisi de manière adéquate. Le plan de référence varie fortement suivant la situation, mais le corps situé au foyer de l'ellipse est forcément situé sur ce plan. Par exemple, si on veut décrire l'orbite de la Terre autour du Soleil, le plan de référence doit contenir le Soleil en un de ses points. Même chose si on étudie l'orbite de la Lune autour de la Terre : la Terre doit être dans le plan de référence. Pour les planètes du système solaire, le plan utilisé est l'''écliptique'', le plan qui contient l'orbite de la Terre. [[File:Is-plane-plane-s.svg|vignette|Intersection de deux plans non-parallèles.]] Il est rare que le plan de référence se confonde avec le plan orbital : un tel cas n'aurait aucun intérêt. Dans les faits, les astronomes n'étudient que des situations où le plan de référence est différent du plan orbital, et où les deux plans ne sont pas parallèles. Les deux plans vont donc se couper, ils s'interpénètrent sur une droite. L'orbite coupe le plan de référence en deux points : le nœud ascendant et le nœud descendant. Leur nom est lié au mouvement du corps sur l'orbite : la planète monte par rapport au plan de référence quand elle passe le nœud ascendant, alors qu'elle descend quand elle passe au nœud descendant. Les deux nœuds sont reliés par une ligne, qui est la '''ligne des nœuds''', sur laquelle le plan de l’orbite et le plan de référence se coupent l'un l'autre, s'interpénètrent. Le plan orbital est incliné par rapport au plan de référence, sans compter qu'il est légèrement tourné. En tout, cela fait deux paramètres : l'angle d'inclinaison et l'angle de rotation entre les deux plans. Pour l'inclinaison, on suppose que le plan de référence définit l'horizontale. Le plan orbital est penché par rapport à cette horizontale, avec un certain angle, qui n'est autre que l'inclinaison. L'angle d'inclinaison est assez facile à mesurer, l'angle en question étant une mesure absolue. Par contre, l'angle de rotation entre les deux plans est lui relatif. C'est à dire qu'il faut préciser une direction bien précise pour dire que les deux plans sont tournés par rapport à cette direction. En plus du plan de référence, il faut donc préciser une '''direction de référence''' sur le plan de référence. La direction pointe vers un point de la sphère céleste qui s'appelle le '''point vernal'''. Pour résumer, on doit définir deux paramètres pour décrire le plan orbital et la manière dont il est orienté par rapport au plan de référence. * Le premier est l''''inclinaison''', l'angle entre les deux plans. * Le second est la '''longitude du nœud ascendant/descendant''', à savoir l'angle entre la ligne des nœuds et la direction de référence. Enfin, on peut ajouter l''''argument du périapside''', l'angle formé entre le périapside et la ligne des nœuds. Formellement, ce paramètre n'aide pas à décrire l'orientation du plan orbital. Mais il est souvent regroupé avec les deux paramètres précédents. Nous en reparlerons dans la section suivante, par souci de cohérence. [[File:Coordonnees satellite.svg|centre|vignette|upright=2.0|Coordonnées d'un satellite en orbite autour de la Terre.]] ===La description de la position du corps sur l'orbite=== Pour terminer la description de l'orbite d'une planète, il faut indiquer comment l'ellipse est orientée sur le plan orbital, et où se trouve le corps sur l'orbite. L'orientation de l'ellipse sur le plan orbital est décrit par un angle, l''''argument du périapside''' dont nous avons parlé plus haut. Il s'agit de l'angle formé entre le périapside et la ligne des nœuds. La position de la planète à un instant t peut se décrire de plusieurs manières différentes, mais la plus utilisée est l''''anomalie vraie''', à savoir l'angle entre la planète et la périapside. [[File:Vue orbite satellite parallèle au plan équatorial.svg|centre|vignette|upright=2.0|Vue de l'orbite d'un satellite parallèle au plan équatorial.]] ==Le mouvement de la planète sur l'orbite== On peut décrire le mouvement de la planète sur l'orbite avec divers paramètres. Le premier est le temps mis pour faire un tour complet de l'orbite, le second est la vitesse de déplacement de la planète sur l'orbite et le troisième est le sens de déplacement. ===Le sens de déplacement orbital=== [[File:Retrogradeorbit.gif|thumb|La planète bleue va en sens prograde (sens normal), alors que la planète sur l'orbite rouge va en sens rétrograde (cas rare).]] Une planète peut parcourir son orbite dans deux sens différents, appelés '''sens rétrograde''' et '''sens prograde'''. Si l'on regarde le Soleil par-dessus, par le pôle nord, la majorité des planètes vont dans le sens inverse des aiguilles d'une montre. Le mouvement de ces planètes est dit prograde, ou encore dans le sens prograde. Mais une minorité de planètes et de petits corps va dans l'autre sens, dans le sens des aiguilles d'une montre. On dit qu'elles vont en sens rétrograde. ===La période de révolution=== La '''période de révolution''' est le temps que met la planète pour faire une révolution (un tour complet), c’est-à-dire pour revernir à sa position initiale sur l'orbite. La troisième loi de Kepler nous dit qu'elle dépend de la longueur du demi-grand axe. La mécanique céleste et les lois de Newton nous permettent d'obtenir une relation plus fine. Si on considère que la planète a une masse très petite devant celle du Soleil, on a : : <math>P = 2 \pi \sqrt{\frac{a^3}{G M}}</math>, avec <math>a</math> la longueur du demi-grand axe, <math>G</math> est la constante de gravitation et <math>M</math> la masse du Soleil. ===La vitesse orbitale=== La vitesse de la planète est plus grande près du Soleil que quand elle est loin. La vitesse de la planète est maximale au périhélie (la position de l'orbite la plus proche du Soleil) et minimale à l'aphélie (la position la plus éloignée du Soleil sur l'orbite). Quand la planète s'approche du périhélie, elle accélère. Quand elle s'en éloigne et s'approche du périhélie, elle ralentit. D'ailleurs, ce n'est ni plus ni moins que ce que traduit la seconde loi de Kepler. La vitesse en un point quelconque, situé à une distance d du corps central (ici, le Soleil) se calcule avec la formule suivante : : <math>v(d) = \sqrt{GM \left( \frac{2}{d} - \frac{1}{a} \right)}</math> La vitesse au périapside se calcule avec la formule suivante : : <math>v_p = \sqrt{(1+e) \frac{GM}{r_p}} = \sqrt{\frac{(1+e) \mu}{(1-e)a}}</math>, avec <math>\mu = GM</math>. La vitesse à l'apoapside se calcule avec la formule suivante : : <math>v_a = \sqrt{(1-e) \frac{GM}{r_a}} = \sqrt{\frac{(1-e) \mu}{(1+e)a}}</math>, avec <math>\mu = GM</math>. ==L'évolution des orbites au cours du temps== [[File:Enckes method-vector.svg|vignette|Effet des perturbations des autres planètes sur la forme d'une orbite.]] Tout ce qu'on a dit plus haut est valable pour un corps qui orbite autour d'un autre, cette situation portant le doux nom de ''problème à deux corps''. Sous ces conditions, les orbites sont parfaitement elliptiques et ne changent pas de place une fois qu'elles sont installées. Mais dans la réalité, le système solaire comprend bien plus que deux objets et tous s'influencent mutuellement. Si on prend en compte toutes les influences gravitationnelles, les orbites des planètes sont perturbées. Sur un temps très court (quelques millénaires), l'orbite est stable et correspond aux orbites elliptiques idéales des lois de Kepler. L'orbite mesurée ainsi est appelée l''''orbite osculatrice'''. Mais sur un temps plus long, les interactions gravitationnelles modifient la forme et le tracé des orbites, ce qui fait dériver les planètes progressivement. Après un certain temps, assez long, l’orbite réelle est une orbite perturbée qui ne correspond pas à l'orbite osculatrice initiale. Les interactions gravitaires à l'origine de ce mouvement des orbites sont assez diverses, mais elles impliquent le plus souvent le disque protoplanétaire ou des interactions entre planètes. On peut globalement les classer dans les types suivants : * Premièrement, les forces de marée influencent la forme des orbites. C'est ce qui explique que la Lune s'éloigne de nous de quelques centimètres chaque année, par exemple. * Deuxièmement, les planètes s’attirent entre elles, ce qui rend leurs trajectoires assez chaotiques sur le long terme. * Troisièmement, les planètes vont « frotter » contre le disque interplanétaire, ce qui tend à les ralentir. D'autres phénomènes peuvent survenir sur les petits corps, en lien avec la luminosité solaire. ===Le ''tidal locking'' et la rotation synchrone=== [[File:Synchronous rotation.svg|thumb|Synchronous rotation]] Les forces de marées, couplées à la rotation d'une planète et/ou de son satellite sont à l'origine d'un phénomène appelé la '''synchronisation de la rotation''' (''tidal locking'' en anglais). Pour faire simple, c'est ce qui fait que la Lune nous présente toujours une face cachée et une face visible. Il en est de même pour de nombreux satellites du système solaire, qui font toujours face à leur planète. Et c'est pareil pour certaines planètes, qui font toujours face au Soleil : Mercure, par exemple, présente toujours la même face au Soleil. Dans tous les cas, cela vient du fait que les satellites tournent autour de leur planète à la même vitesse qu'ils tournent sur eux-mêmes : vitesse angulaire de rotation et de révolution sont égales. Pourtant, lors de la formation du système solaire, rien de tout cela n'était en place : la Lune tournait sur elle-même plus vite qu'aujourd'hui. Mais la Lune a fini par synchroniser sa vitesse de rotation avec sa vitesse de révolution (pareil pour les autres satellites ou planètes). La raison vient justement de l'interaction entre marées et rotation des planètes/satellites. ====Les mécanismes du ''tidal locking''==== [[File:Accélération par effet de marée.svg|vignette|Accélération par effet de marée]] Pour comprendre pourquoi, rappelons que les forces de marées déforment la planète et/ou le satellite, leur donnant une forme ovoïde. Dit autrement, un bourrelet de manière rocheuse se forme en face et à l'opposé de la planète et/ou du satellite attracteur. Mais vu que la planète tourne sur elle-même, ce bourrelet va être entraîné par la rotation de la planète, plus vite que le satellite. Ce faisant, la rotation tend à faire tourner ce bourrelet autour de l'axe de la planète à une certaine vitesse. Mais le satellite va aussi attirer ce bourrelet à lui. Vu l'angle formé entre le bourrelet et le satellite, cette attraction va attirer le bourrelet dans un sens légèrement différent de celui de la rotation. Cela va quelque peu freiner le bourrelet, qui entraînera a planète avec elle : elle tournera moins vite. La même chose se produit sur le satellite. Ainsi, les deux finissent par ralentir jusqu'à ce que le bourrelet (et donc la planète), tourne à la même vitesse que le satellite autour de la planète. Dans ces conditions, le déplacement du bourrelet sera exactement compensé par le déplacement du satellite, qui restera à la verticale du bourrelet. La rotation synchrone est alors atteinte. [[File:Marée et vitesse de rotation.svg|centre|vignette|upright=2.0|Accélération par effet de marée]] L'effet se visualise bien si on regarde le champ de marée, c’est-à-dire les forces de marées en chaque point de la planète. On voit qu'il est asymétrique, ce qui signifie que la force de marée impose un couple (une différence de force entre deux points dont la résultante est nulle, mais qui force l'objet soumis à tourner). Ce couple est dans le sens opposé à a rotation de la planète, ce qui fait que la planète ralentit progressivement du fait de ce couple. Du fait de ce phénomène, la rotation de la planète et du satellite sont quelque peu ralentie à chaque marée. [[File:Árapály forgatónyomaték.png|centre|vignette|Champ de marée pour un corps en rotation soumis au ''tidal locking''.]] ====La conservation du moment cinétique et le ''tidal locking''==== [[File:Lunar libration with phase2.gif|vignette|Libration lunaire.]] Notons que la planète et le satellite tournent tous deux de moins en moins vite avec le temps. Cependant, cela a des conséquences sur la forme de leurs orbites, qui augmentent de rayon avec le temps. Le ''tidal locking'' ne fait pas que ralentir la rotation des planètes/satellites, mais elle les éloigne aussi les uns des autres. C'est ce phénomène qui explique que la Lune s'éloigne de nous à une vitesse moyenne de 3,8 cm par an. En effet, la Lune et la Terre n'ont pas des orbites totalement verrouillées. La lune a encore un petit mouvement de rotation dit de libration , qui fait qu'elle ne nous présente pas tout à fait la même face d'un jour sur l'autre. Et ce phénomène fait que les forces de marées peuvent causer un phénomène de ''tidal locking'' assez faible, mais suffisant pour perturber l'orbite de la Lune. Et le résultat est qu'elle s'éloigne de nous. Dans le passé, la Lune était beaucoup plus proche de la Terre qu'actuellement, mais elle s'est éloignée au cours des temps géologiques, en même temps que sa révolution devenait de plus en plus synchrone avec la rotation de la Terre. Pour comprendre pourquoi le ralentissement de la rotation force les planètes/satellites à s'éloigner, il faut faire un petit peu de physique assez basique. Un théorème de mécanique classique nous dit que le moment cinétique total se conserve. Pour rappel, le moment cinétique est un vecteur qui encode les informations sur la rotation d'un objet : sa direction est l'axe de rotation et sa norme dépend de la vitesse de rotation. Pour une planète ou un satellite, ce moment angulaire est la somme de deux moments : celui de sa rotation sur lui-même et celui de sa révolution sur son orbite. Le moment angulaire associé à la rotation est appelé le ''moment cinétique intrinsèque'', alors que celui lié à la rotation est appelé le ''moment cinétique orbital''. Le moment cinétique orbital se calcule à partir de la formule suivante : : <math>L_\text{orbital} = \vec{r} \times m\vec{v}</math>, avec r le rayon de l'orbite, m la masse de l'astre et v sa vitesse. Le moment cinétique intrinsèque se calcule quant à lui à partir de la formule suivante : : <math>L_\text{spin} = I \times w</math>, avec w la vitesse de rotation angulaire (le nombre de tours par seconde) et I une quantité appelée le moment d'inertie (un équivalent de la masse pour la rotation). [[File:Angular momentum conservation.svg|centre|vignette|upright=1.5|Conservation du moment cinétique angulaire.]] L'effet de ''tidal locking'' entraîne une réduction de la vitesse de rotation, c'est-à-dire une diminution du moment cinétique intrinsèque. Vu que le moment cinétique total se conserve, le moment cinétique orbital doit augmenter pour compenser. En conséquence, la planète doit se déplacer plus vite sur son orbite et finit donc par s'éloigner. L'augmentation du moment cinétique orbital peut se traduire de deux manières : soit une augmentation de la vitesse de révolution de la planète, soit une augmentation du rayon de l'orbite. Dans les faits, l'astre va d'abord commencer par accélérer, ce qui va le forcer à s'éloigner de la planète. En s'éloignant, une partie de son énergie cinétique va alors se transformer en énergie potentielle de gravitation et l'astre ralentit. Au final, l'astre s'est éloigné, dans le sens où le rayon de son orbite a augmenté, et la vitesse de révolution s'ajuste alors à la nouvelle orbite. ===Les résonances orbitales=== Le phénomène de '''résonance orbitale''' se manifeste quand deux planètes/satellites ont des périodes de révolution qui sont commensurables, c’est-à-dire que leur rapport est un nombre fractionnaire. Pour le dire autrement, prenons deux planètes qui tournent autour du Soleil avec respectivement comme période de révolution <math>T_A</math> et <math>T_B</math>. La résonance a lieu si : : <math>\frac{T_A}{T_B} = \frac{n}{p}</math>, avec n et p deux nombres entiers. La résonance précédente est souvent notée n:p. Cette notation indique que la planète A fait n tours, pendant que la planète B en fait p. [[File:Galilean moon Laplace resonance animation 2.gif|vignette|Résonances des lunes de Jupiter.]] Dans le système solaire, peu de planètes sont en résonance. On peut citer le cas de Pluton (on va dire que c'est une planète...) qui est en résonance 3:2 avec Neptune, ce qui signifie qu'elle fait 3 révolutions pendant que Neptune en fait 2. Mais les résonances sont beaucoup plus nombreuses quand on regarde ce qu'il en est pour les satellites. Le cas le plus connu est celui des lunes de Jupiter, qui sont toutes en résonance les unes avec les autres. Dans le détail, Ganymède, Europe et Io sont dans une résonance 1:2:4. C'est-à-dire que pendant que Ganymède fait une révolution complète sur son orbite, Europe en fait deux et Io en fait quatre. Les résonances orbitales ont un effet assez franc sur la stabilité des orbites. L'existence d'une résonance entre deux corps peut tout aussi bien stabiliser leurs orbites respectives que les déstabiliser, suivant divers paramètres orbitaux. Dans le système solaire, on a de nombreux exemples. En plusieurs endroits de la ceinture d'astéroïdes, on devrait trouver des corps en résonance avec Jupiter. Mais à l'endroit où devrait se trouver ces résonances, on s’aperçoit qu'il y a un trou dans la ceinture d'astéroïde. Les orbites en question sont vides, ce qui laisse une sorte d'anneau vide dans la ceinture d'astéroïde. De telles vides sont appelées les '''lacunes de Kirkwood''', du nom de leur découvreur. Leur origine tient au fait que les corps présents originellement à cet endroit ont été expulsé par la résonance avec Jupiter. On observe la même chose dans les anneaux de Saturne, où des lacunes semblables ont été creusées par des résonances avec la planète Saturne. [[File:Kirkwood Gaps.svg|centre|vignette|upright=2.0|Lacunes de Kirkwood.]] ===Les résonances orbitales séculaires=== Outre le phénomène précédent, le terme ''résonance orbitale'' recouvre aussi d'autres formes de résonances qui n'ont rien à voir avec la précédente. Pour éviter les confusions, on distingue donc la résonance décrite précédemment, appelée aussi ''résonance orbitale de mouvement moyen'' (''mean-motion orbital resonance''), les phénomènes de résonance séculaire et quelques autres encore. [[File:Perihelion precession.svg|vignette|Précession de l'orbite d'une planète.]] Les résonances séculaires proviennent du fait que les ellipses orbitales ne sont pas fixes dans le temps : elles peuvent tourner progressivement sur elles-mêmes. Ce phénomène fait que les périapses se déplacent dans le temps, leur mouvement décrivant paradoxalement une sorte d'ellipse (non-confondue avec l'orbite). Ce mouvement est illustré dans le schéma ci-contre. Ce phénomène est appelé la '''précession des apsides''' et on dit que le périapse précesse. Formellement, cette précession des apsides modifie l'argument du périapse. D'ailleurs, la précession apsidale est définie par la dérivée temporelle de l'argument du périapse. Notons que le périapse précesse en formant une trajectoire fermée, ellipsoïdale (dans un cas idéal). Et naturellement, le périapse met un certain temps pour faire un tour complet de cette trajectoire : ce temps est appelé la ''période apsidale''. En raison de ce phénomène, deux orbites peuvent avoir des périapses qui précessent à la même vitesse, ce qui induit des interactions gravitationnelles entre orbites commensurables. Le résultat de cette interaction est une modification de l'inclinaison et de l'excentricité de l'orbite. Si on se limite au cas avec trois corps (un corps central, deux planètes/satellites qui tournent autour), alors les résonances séculaires peuvent modifier l'excentricité et l'inclinaison, mais la quantité <math>\sqrt{1 - e^2} \cdot \cos i</math> reste constante. Dit autrement ce mécanisme permet d'échanger de l'excentricité contre de l'inclinaison et réciproquement. ===Les interactions avec le disque protoplanétaire=== Outre les forces de marées, d'autres interactions peuvent modifier l'orbite des planètes et satellites. Comme dit plus haut, il faut aussi tenir compte du fait que les planètes frottent sur le disque protoplanétaire, peu après leur formation. Ce phénomène peut prendre des formes très différentes selon la masse de la planète. Pour les planètes peu massives, ce frottement est dû à des ondes de densité que la planète va former lors de son parcours du disque. Lors de chaque passage, la planète attire vers elle les astéroïdes, qui s'éloigneront une fois la planète éloignée. Sion suit les astéroïdes, on voit que ceux-ci s'éloignent puis s'approchent de l'orbite de la planète, dans un mouvement ondulatoire. Si on fait la somme de tous les mouvements astéroïdaux, on voit que la densité du disque augmente quand la planète passe et diminue quand elle s'éloigne. L'onde de densité qui en résulte attire la planète à chaque passage, réduisant sa vitesse. À cause de ce phénomène, la planète ralentit et se rapproche de son étoile. On parle de '''migration de type 1'''. Pour les grosses planètes, comme Jupiter, ce phénomène ne dure qu'un temps. La planète fait le vide autour d'elle en quelque passage, tous les petits corps s'écrasant sur sa surface. Elle fait un véritable trou circulaire dans le disque, réduisant à néant le phénomène de migration de type 1. Mais divers phénomènes annexes prennent la relève et permettent une '''migration de type 2'''. ===Les orbites des petits corps=== Maintenant, intéressons-nous aux orbites des petits corps. Par petits corps, on veut parler des astéroïdes et des comètes, mais aussi de la poussière qu'on retrouve dans les anneaux planétaires ou dans l'espace inter-planétaire. Les petits corps orbitent autour du Soleil ou autour d'une planète, voire d'un satellite, en suivant une orbite elliptique. Pour ces petits corps, la lumière du Soleil agit sur les orbites des petits corps. Divers phénomènes physiques et thermiques liés à la lumière solaire et au vent solaire, comme la pression de radiation, l'effet Yarkovsky et l’entraînement de Poynting-Robertson, influencent l'orbite des petits corps. En toute généralité, ces phénomènes touchent tout corps gravitant autour d'une étoile, ici le Soleil. Ils agissent sur la surface des corps, seule à recevoir la lumière et le vent solaire, et non sur leur volume comme le fait la gravité. En conséquence, ces forces se manifestent quand le rapport surface/volume est assez important, ce qui n'est possible que pour les petits corps. Ils sont négligeables pour les planètes, planètes naines et autres corps relativement sphériques. Seuls les astéroïdes et les poussières sont significativement influencés par ces phénomènes. Nous ne détaillerons pas les effets du vent solaire et du gaz interplanétaire. Tout au plus peut-on dire que le vent solaire souffle sur les petits corps et les éloigne lentement du Soleil. Pour ce qui est des gaz interplanétaires, on va se borner à dire que les petits corps vont frotter sur les gaz du disque interplanétaire, ce qui a tendance à les ralentir. Ce mécanisme est analogue à la friction de l'air qui ralentit les astéroïdes qui rentrent dans l’atmosphère, mais avec une intensité nettement moindre. Ce ralentissement dépend naturellement de la densité du gaz, ce qui explique sa faiblesse comparée à l'entrée dans l'atmosphère. ====L'effet de la pression de radiation==== La '''pression de radiation''' est la pression que la lumière exerce sur les corps qu'elle illumine. Toute onde électromagnétique (ou tout photon) transporte une certaine impulsion, une certaine "quantité de mouvement". Dans ce qui suit, nous la désignerons sous le terme d'''impulsion lumineuse''. Les lois de la physique nous disent que l'impulsion de la lumière est égale à son énergie divisée par la vitesse de la lumière, en vertu de l'équation : : <math>p = \frac{E}{c}</math>, avec E l'énergie et p l'impulsion. La force liée à la pression de radiation n'est autre que la quantité d'impulsion lumineuse qu'un corps absorbe durant une unité de temps. Elle est donc égale à : : <math>F_r = \frac{d p}{dt} = \frac{d}{dt} \frac{E}{c} = \frac{1}{c} \frac{d E}{dt}</math> On utilise alors la définition de la luminosité L, à savoir <math>L = \frac{\Delta E}{\Delta t}</math>. : <math>F_r = \frac{L}{c}</math> Mais sur l'impulsion lumineuse incidente, seule une partie est absorbée. Lorsque la lumière interagit avec un objet, elle peut lui céder tout ou partie de son impulsion, qui sera convertie en quantité de mouvement. Si la lumière est absorbée, toute son impulsion sera transformée en quantité de mouvement. Si elle est réfléchie, une partie de son impulsion peut être transmise, mais la lumière changera alors de longueur d'onde : on est dans un cas de diffusion inélastique. Dans ce qui va suivre, nous allons supposer qu'une portion <math>Q</math> de l'impulsion du rayonnement incident est absorbée. Pour le dire autrement, seule une portion <math>Q</math> de l'impulsion passe de la lumière au corps solide considéré. Le coefficient <math>Q</math> vaut 1 pour un corps totalement absorbant et diminue en même temps que l'albédo augmente. Il faut donc ajouter ce coefficient dans l'équation précédente : : <math>F_r = Q \cdot \frac{L}{c}</math> La luminosité reçue par le petit corps est, comme on l'a vu dans le chapitre sur la température de surface, égale à : : <math>L(R) = S \cdot \frac{L_{soleil}}{4 \pi R^2}</math>, avec R la distance au Soleil et S la surface du petit corps. En combinant les deux équations précédentes, on trouve que la force induite par la pression de radiation dans le cas du Soleil est donnée par l'équation suivante. : <math>F_{radiation} = Q \cdot S \cdot \frac{L_{soleil}}{4 \pi c \cdot R^2}</math> Vu que la pression de radiation et la force de gravité ont toutes deux une dépendance en <math>1 \over R^2</math>, on peut reformuler la gravité vue par l’astéroïde comme suit : : <math>F_{totale} = - (1 - \beta) \frac{G M m}{R^2}</math>, avec <math>\beta = \frac{F_{radiation}}{F_{gravite}}</math> ====L'effet Poynting-Robertson==== L''''effet Poynting-Robertson''' fait que les petits corps éclairés par le Soleil acquièrent une trajectoire en spirale. Il apparaît quand de la poussière se déplace par rapport au Soleil. Il est dû au fait que la lumière absorbée par le petit corps est réémise avec un angle différent de l'angle d'absorption. Pour les besoins de l’explication, supposons que la lumière est absorbée perpendiculairement à la trajectoire de la particule. Du point de vue du petit corps, qui avance à une vitesse non-négligeable, la lumière semblera arriver avec un angle non-perpendiculaire mais sera réémise à la perpendiculaire. Du point de vue d'un observateur extérieur, la lumière du Soleil arrivera à la perpendiculaire, mais sera réémise avec un léger angle qui augmente avec la vitesse. Dans les deux cas, la lumière absorbée n'est pas réémise dans la même direction, ce qui fait que le bilan en quantité de mouvement est déséquilibré. En conséquence, le petit corps absorbe un peu de quantité de mouvement, ce qui le déplace de sa trajectoire originelle. [[File:Poynting-Robertson effect.svg|centre|vignette|upright=2.0|Effet Poynting-Robertson.]] La force liée à cet effet se calcule avec la formule suivante : : <math>F_P = W \cdot \frac{v}{c^2}</math>, où <math>W</math> est la puissance irradiée par la particule (égale au rayonnement incident), <math>v</math> est la vitesse de la particule, <math>c</math> est la vitesse de la lumière. Une autre formule, équivalente, est la suivante : : <math>F_P = \frac{r^2}{4 c^2}\sqrt{\frac{G M_s L_s^2}{R^5}}</math>, où <math>r</math> est le rayon de l'objet, <math>G</math> la constante de gravitation universelle, <math>M_s</math> est la masse du Soleil, <math>L_s</math> est la luminosité solaire et <math>R</math> est le rayon orbital de l'objet. ====L'effet Yarkovsky==== [[File:YarkovskyEffect.svg|vignette|upright=1.0|Effet Yarkovsky.]] L''''effet Yarkovsky''', du nom de son découvreur, agit sur des petits corps d'un diamètre de maximum 30 à 40 kilomètres de diamètre. Il s'agit d'un effet extrêmement faible, bine plus que l'effet de la gravitation. En conséquence, il n'agit que sur des durées très longues, de plusieurs millions d'années. Il apparaît quand un astéroïde est éclairé par le Soleil et provient de la rotation de l'astéroïde et de son inertie thermique. Dans les grandes lignes, l'astéroïde absorbe le rayonnement solaire et le réémet un peu plus tard sous la forme d'un rayonnement de corps noir. Vu que le rayonnement transporte de l'impulsion, de la quantité de mouvement, qui dit émission de lumière dit émission de quantité de mouvement. En réémettant de la lumière, l'astéroïde réémet de la quantité de mouvement et subit donc un léger recul. Cette fuite de quantité de mouvement n'est pas censée engendrer de force si l'émission est isotrope, mais ce n'est pas le cas si l'astéroïde tourne sur lui-même. Le petit corps est chauffé par le Soleil, durant la journée. La portion éclairée du satellite devient ainsi plus chaude que la portion non-éclairée. Mais le sol de l'astéroïde a une certaine inertie thermique : il met du temps à refroidir quand la nuit tombe. Ce faisant, la portion de l’astéroïde qui est en soirée et s’apprête à passer dans la nuit sera encore assez chaude. Par contre, la portion matinale de l’astéroïde sera totalement refroidie. Il existe donc une différence de température entre les deux côtés soirée-matinée de l'astéroïde. Les deux portions de l’astéroïde émettront de la lumière, mais la partie en soirée émettra plus de lumière. Du fait des différences de température entre matinée et soirée, ce n'est pas le cas : les fuites ne sont pas isotropes. Ce faisant, la différence de fuite de quantité de mouvement entre la soirée et le matin engendrera un couple, et une force de Yarkovsky qui dévieront l’astéroïde de sa trajectoire. Cela pousse l’astéroïde dans le sens opposé de la portion en soirée, soit dans le sens de rotation de l'objet. ==Les migrations planétaires et le modèle de Nice== Le modèle qui explique au mieux la mise en place des orbites du système solaire à l'heure actuelle est le Grand Tack. Mais celui-ci est assez compliqué, aussi je vais vous parler d'un modèle antérieur, sur lequel se base le Grand Tack : le modèle de Nice. Pour simplifier, ce modèle commence juste après que la poussière du disque protoplanétaire se soit dissipée, avec des planètes bien formées. Dans cette situation initiale les planètes telluriques avaient des orbites proches de leurs orbites actuelles, mais que les orbites des planètes géantes étaient totalement différentes. En premier lieu, leurs orbites étaient quasiment circulaires, tant leur excentricité était faible. De plus, Jupiter était plus éloigné qu'actuellement alors que les autres planètes géantes étaient beaucoup plus proches du Soleil. À la suite d'interactions gravitaires avec les planétésimaux, la trajectoire des planètes s'est modifiée et leurs orbites ont évolué. Saturne, Neptune et Uranus ont été éjectées vers l'extérieur à la suite d'interactions avec des planétésimaux, alors que Jupiter s'est rapprochée du Soleil. De plus, les orbites des planètes géantes sont devenus plus excentriques et les planètes se sont rapprochées ou éloignées du Soleil. Dans le détail, les planètes géantes se sont éloignées du Soleil, à l'exception de Jupiter. Au début, cette migration fût lente et progressive et les orbites sont restées quasi-circulaires. Mais, à force de se rapprocher, Jupiter et Saturne sont entrés dans un phénomène gravitationnel dit de "résonance orbitale". Leur orbite s'est alors subitement modifiée, devenant nettement plus courbe et elliptique. Saturne s'est alors déplacée sur son orbite actuelle, de même que Jupiter. L'arrivée de Saturne sur son orbite déstabilise les orbites d'Uranus et de Neptune, qui deviennent plus elliptiques et les éloigne du Soleil. Pour résumer, les planètes géantes ont été éjectées vers l'extérieur du système solaire sur des orbites elliptiques, à l'exception de Jupiter qui a été projeté vers l'intérieur du système solaire. Ces modifications d'orbite ont eu de nombreuses conséquences sur l'organisation du système solaire. Par exemple, le rapprochement de Jupiter a perturbé la ceinture d’astéroïdes proche. Des astéroïdes de la ceinture ont été déstabilisés par la gravité de Jupiter et ont vu leurs orbites devenir elliptiques, voire paraboliques. Le bilan est que de nombreux astéroïdes ont été éjectés vers le système solaire interne, et se sont écrasés sur les planètes telluriques et leurs satellites. Cela explique que, aux alentours de 600 millions d'années d'existence, le taux de chute d’astéroïdes a fortement augmenté. À cette période, les planètes ont reçu un véritable bombardement d’astéroïdes, qui était nettement plus violent qu'auparavant : ce phénomène a été appelé le '''grand bombardement tardif'''. Cela provient du fait que les astéroïdes déplacés par Neptune et Uranus sont retombés vers l'intérieur, sur les planètes telluriques. Une autre conséquence est que Uranus et Neptune ont fait leur entrée dans le disque externe, faisant le ménage dans celui-ci. De nombreux corps transneptuniens se sont alors écrasés sur Uranus et Neptune, sans compter ceux dont les orbites ont été déstabilisées et qui ont été envoyés au-delà de Neptune. Pour résumer, ces deux planètes ont fait le ménage dans le disque externe, le privant de plus de 90% de sa masse et le repoussant au-delà de Neptune. Ces interactions ont aussi permis aux planètes de se placer sur leurs orbites actuelles, en rendant celles-ci plus circulaires, moins elliptiques. [[File:Lhborbits.png|centre|vignette|upright=3.0|Modèle de Nice]] <noinclude> {{NavChapitre | book=Planétologie | prev=Les influences gravitationnelles | prevText=Les influences gravitationnelles | next=La planète Mercure | nextText=La planète Mercure }}{{autoCat}} </noinclude> j23bf78baai4at71thi47jeww03aifu Python pour le calcul scientifique/Éléments de programmation 0 72883 767317 766573 2026-06-02T12:41:46Z Cdang 1202 commentaire 767317 wikitext text/x-wiki Rappel : les programmes commencent par : <syntaxhighlight lang="python"> #!/usr/bin/python3 import numpy as np import matplotlib.pyplot as plt </syntaxhighlight> == Entrées et sorties == Pour permettre à l'utilisateur ou à l'utilisatrice d'entrer une valeur, nous utilisons la fonction <code lang="python">input()</code> comme évoqué précédemment (chapitre ''[[../Premiers programmes|Premiers programmes]]''), avec la syntaxe <code lang="python">''variable'' = input(''texte'')</code>. Notez que la valeur renvoyée par <code lang="python">input()</code> est une chaîne de caractères. Si vous voulez autre chose, typiquement un nombre, il faut convertir cette chaîne. Par exemple, nous demandons ici d'entrer une longueur sous la forme d'une valeur numérique : <syntaxhighlight lang="python"> longueurDefaut = 10.0 texteDemandeLongueur = f"Veuillez entrer la longueur en millimètres (valeur par défaut {longueurDefaut} mm) : " longueur = input(texteDemandeLongueur) if longueur=="": longueur=longueurDefaut else: longueur=float(longueur) print(longueur) </syntaxhighlight> Pour afficher un texte, on utilise la fonction <code lang="python">print()</code>, également présentée dans le chapitre ''[[../Premiers programmes|Premiers programmes]]'', avec la syntaxe <code lang="python">print(''texte'')</code>. Le texte à afficher peut être de n'importe quel type (entier, réel en virgule flottante, booléen, chaîne de caractères…) mais si l'on veut « mélanger » les types, il faut tout convertir en chaînes de caractères, avec la fonction <code lang="python">str()</code>, et concaténer les chaînes avec <code lang="python">+</code>. Par exemple : <syntaxhighlight lang="python"> print("La longueur vaut : "+str(longueur)+" mm.") </syntaxhighlight> Nous pouvons aussi utiliser une « chaîne “f” » ''({{lang|en|f-string}})'' : on met un le <code lang="python">f</code> devant le guillemet ouvrant et dans la chaîne, on met un champ sous la forme <code lang="python">{''nomDeVariable''}</code>. L'exemple ci-dessus devient alors : <syntaxhighlight lang="python"> print(f"La longueur vaut : {longueur} mm.") </syntaxhighlight> Les chaînes « f » sont détaillées dans la section ''[[#Chaînes de caractères|Chaînes de caractères]]'' ci-dessous. Si l'on veut introduire un retour à la ligne dans la chaîne, on utilise les caractères <code lang="python">\n</code> (contre-oblique suivie de la lettre N minuscule). Par exemple <syntaxhighlight lang="python"> print("Ceci est un texte\navec un retour à la ligne.") </syntaxhighlight> == Types de variables == === Généralités === Python définit « tout seul » le type de la variable : « <code>3</code> » sera un entier ''({{lang|en|integer}})'', « <code>3.0</code> » sera un réel à virgule flottante ''({{lang|en|float}})'', « <code>"3"</code> » sera une chaîne de caractères ''({{lang|en|string}})''. On peut connaître le type d'une variable avec la fonction <code>type()</code>. On peut tester certaines valeurs, avec le module <code>NumPy</code> : * <code>np.isnan(x)</code> indique si les valeurs de ''x'' sont des NaN ''({{lang|en|not a number}})'' ; si ''x'' est une matrice, le résultat est une matrice de booléens, l'élément [''i'', ''j''] est <code>True</code> si <code>x[i, j]</code> est un NaN ; * <code>np.isinf(x)</code> indique si les valeurs de ''x'' sont ±∞ ; si ''x'' est une matrice, le résultat est une matrice booléenne de même dimension. On peut forcer un type : * <code>int(x)</code> : transforme la valeur ''x'' en nombre entier ; * <code>long(x)</code> : " en entier long (précision illimitée) ; * <code>float(x)</code> : " en nombre réel à virgule flottante ; * <code>str(x)</code> : " en chaîne de caractères ; * <code>complex(Re, Im)</code> : crée le nombre complexe ''Re'' + ''Im''·j, j désignant la racine carrée de –1 ; * <code>list()</code> : crée une liste ; * <code>tuple()</code> : crée un n-uplet. Par exemple <syntaxhighlight lang="python"> type(3) # <class 'int'> type(float(3)) # <class 'float'> complex(1, 1) == 1 + 1j # True list("blabla") # ['b', 'l', 'a', 'b', 'l', 'a'] </syntaxhighlight> Python distingue plusieurs genres de types : * Un itérable est un objet dont on peut extraire les éléments un par un ; ce sont les objets pour lesquels on peut écrire <code> for i in ''iterable'':</code>. Il s'agit essentiellement des listes, n-uplets, chaînes de caractères, ensembles, dictionnaires et fichiers. * Un modifiable ''({{lang|en|mutable}})'' est un objet que l'on peut modifier ; par exemple une liste est modifiable — on peut changer la valeur d'un élément, en ajouter ou en enlever un — mais les n-uplets non, pas plus qu'une chaîne de caractères ou un nombre. * Un identifiable (''{{lang|en|hashable}}'', le ''{{lang|en|hashage}}'' étant une signature caractéristique d'un objet) : objet possédant un identifiant unique. Un objet identifiable est toujours non-modifiable ''({{lang|en|unmutable}})''. === Types numériques === ==== Entiers ==== Nous pouvons définir les entiers au format octal ou hexadécimal : il faut débuter le nombre par respectivement <code>0o</code> (le chiffre zéro et la lettre o) et <code>0x</code> (le chiffre zéro et la lettre x). À l'inverse, la fonction <code>hex()</code> renvoie une chaîne correspondant à l'écriture d'un entier au format hexadécimal, et <code>oct()</code> renvoie la chaîne correspondant à l'éciture en octal. Par exemple : <syntaxhighlight lang="python"> print(0o10, ";", 0x10) # 8 ; 16 print(hex(20)) # 0x14 </syntaxhighlight> ==== Réels ==== Les réels disposent de fonctions spécifiques appelées « méthodes ». Une méthode est une fonction spécifique à un type d'objets. Étant conçue ''ad hoc'', elle est souvent plus économe en ressource et en temps qu'une fonction générique. Pour appliquer la méthode <code>meth()</code> à la variable <code>x</code>, on écrit : <code>x.meth()</code>. Nous avons déjà présenté la méthode <code>''float''.as_integer_ration()</code> qui donne la fraction réduite égale à la valeur du nombre. Les réels disposent de plusieurs autres méthodes : * <code>''float''.trunc()</code> : tronque le nombre réel ; * <code>''float''.floor()</code>, <code>''float''.ceil()</code> : renvoie l'entier le plus proche, respectivement inférieur ou supérieur ; * <code>''float''.hex()</code> : renvoie une chaîne de caractères correspondant à l'écriture du nombre en hexadécimal. Par exemple : <syntaxhighlight lang="python"> a = 20. print(a.hex()) # 0x1.4000000000000p+4 print(10..hex()) # 0x1.4000000000000p+3 </syntaxhighlight> Dans le deuxième exemple, nous appliquons la méthode <code>''float''.hex()</code> directement au nombre <code>10.</code> ; le point est obligatoire car sinon, c'est un entier, pour lequel la méthode n'est pas définie. Notez que la ''méthode'' <code>''float''.hex()</code> est différentes de la ''fonction'' <code>hex()</code> : la première concerne les réels, la seconde les entiers. ==== Complexes ==== Nous avons déjà mentionné la méthode <code>''complex''.conjugate()</code> qui donne le conjugué du nombre. Un nombre complexe dispose de deux attributs : * <code>''complex''.real</code> : sa partie réelle ; * <code> ''complex''.imag</code> : sa partie imaginaire. Par exemple : <syntaxhighlight lang = "python"> a = 5+2j print(a.conjugate(), ";", a.real, ";", a.imag) # (5-2j) ; 5.0 ; 2.0 </syntaxhighlight> === Chaînes de caractères === ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/inputoutput.html | titre = 7. Input and Output | site = Python Documentation | consulté le = 2019-04-06 }} ==== Généralités ==== Il existe en fait trois manières de définir une chaîne de caractères : * avec des guillemets simples ou doubles comme vu précédemment : <code>"…"</code> ou bien <code>'…'</code> ; * avec trois guillemets doubles : <code>"""…"""</code> : cela permet d'avoir une chaîne de caractères s'étendant sur plusieurs lignes, les retours de ligne étant pris en compte ; c'est utilisé en particulier pour la description des fonctions (''{{lang|en|docstrings}}'', voir ci-après) ; * avec des guillemets précédés d'un « r », <code>r"…"</code> ou <code>r'…'</code> : cela permet d'interpréter les barres de fraction inverses « \ » comme un caractère « normal » et non comme un caractère d'échappement (voir ci-après) ; cela est utile lorsque l'on utilise les possibilités LaTeX dans le tracé de graphiques (voir plus loin) ; * avec des guillemets précédés d'un « f », <code>f"…"</code> ou <code>f'…'</code> : cela permet d'utiliser des variables formatées (voir ci-après). Une chaîne de caractères n'est pas modifiable. Si l'on veut remplacer un caractère, l'insérer ou le supprimer, il faut transformer la chaîne en liste, avec la commande <code>list()</code>, puis rassembler la liste en la joignant ''({{lang|en|join}})'' à une chaîne vide : <syntaxhighlight lang="python"> chaine = "blabla" chaineList = list(chaine) chaineList[2] = "c" chaine = "".join(chaineList) print(chaine) # blcbla </syntaxhighlight> Dans une chaîne simple <code>"…"</code> ou <code>'…'</code>, on peut introduire un retour à la ligne avec <code>\n</code>. ==== Substitution de variables ==== Lorsque l'on veut utiliser des variables, on fait précéder les guillemets d'un « f » et l'on écrit les noms de vrariables entre accolades. Par exemple : <syntaxhighlight lang="python"> monde = "world" chaine = f"Hello {monde}!" print(chaine) # Hello world! </syntaxhighlight> On peut indiquer la taille de la chaîne générée à partir de la variable sous la forme <code>{nomVariable:taille}</code>, la taille étant un entier. Par exemple : <syntaxhighlight lang="python"> chiffre1 = 1 nom1 = "un" chiffre2 = 2 nom2 = "deux" chaine = f"{nom1:5} : {chiffre1:5d}\n{nom2:5} : {chiffre2:5d}" print(chaine) # un : 1 # deux : 2 </syntaxhighlight> Vous remarquez que l'on ajoute un « d » pour les entiers décimaux, et que les nombres sont alignés à droite. Si le nombre est un nombre réal à virgule flottante ''({{lang|en|float}})'', on peut indiquer le nombre de décimales sous la forme <code>.''n''f</code> : <syntaxhighlight lang="python"> chaine = f"{np.pi:.5f}" print(chaine) # 3.15169 </syntaxhighlight> Avec la syntaxe <code>''m''.''n''f</code>, on indique également que la totalité du nombre doit occuper ''m'' caractères. Pour convertir un nombre en caractère Unicode correspondant, on utilise la lettre c : <syntaxhighlight lang="python"> nompi = 0x03c0 # Caractère Unicode π : U+03C0 chaine = f"{nompi:c} = {np.pi:.5f}" print(chaine) # π = 3.14159 </syntaxhighlight> La classe ''str'' dispose également de la méthode <code>.format()</code>. On indique un n-uplet de chaînes (ou de nombres) à la méthode et l'on met des accolades dans la chaîne principale ; les accolades sont remplacées dans l'ordre des chaînes de la méthode. On peut changer l'ordre en indiquant quelle valeur utiliser dans quelle accolade. Par exemple : <syntaxhighlight lang="python"> chaine1 = "On compte {} puis {}".format(1, 2) chaine2 = "On compte {0} puis {1}. Mais à rebours, on compte {1} puis {0}.".format("un", "deux") print(chaine1, "\n", chaine2) # On compte 1 puis 2 # On compte un puis deux. Mais à rebours, on compte deux puis un. </syntaxhighlight> L'utilisation du caractère pourcent « % » permet d'utiliser la mise en forme <code>sprintf()</code> du langage C : <syntaxhighlight lang="python"> chaine = "π = %.5f" % np.pi print(chaine) # π = 3.14159 </syntaxhighlight> ==== Méthodes des chaînes ==== Le type ''str'' dispose d'un certain nombre de méthodes. Nous avons déjà vu les méthodes <code>''str''.join()</code> et <code>''str''.format()</code>, en voici quelques autres : * <code>''str''.capitalize()</code> : met le premier caractère en capitale (majuscule) et les autres en minuscule ; * <code>''str''.lower()</code> : met tout en minuscules ''({{lang|en|lowercase}})'' ; * <code>''str''.upper()</code> : met tout en capitales ''({{lang|en|lowercase}})'' ; * <code>''str''.center(''n'')</code> : met la chaîne au centre d'une chaîne de longueur ''n'', en complétant avec des espaces ; on peut compléter avec d'autres caractères avec <code>''str''.center(''n'', ''c'')</code>, par exemple <code>"a".center(7, ".")</code> donne <code>"....a...."</code> ; * <code>''str''.ljust(''n'', ''c'')</code> et <code>''str''.rjust(''n'', ''c'')</code> : comme <code>.center()</code> mais la chaîne est respectivement alignée au fer à gauche ''({{lang|en|left}})'' et à droite ''({{lang|en|right}})'' ; * <code>''str''.isdigit()</code> : booléen vrai si tous les caractères sont des nombres ; * <code>''str''.find(''sous-chaine'')</code>, <code>''str''.rfind(''sous-chaine'')</code> : indique respectivement le premier emplacement et le dernier emplacement de la sous-chaîne dans la chaîne ; * <code>''str''.partition(''séparateur'')</code> : retourne un triplet avec la portion de chaîne avant le séparateur, le séparateur puis la portion de chaîne après le séparateur ; * <code>''str''.replace(''ancien'', ''nouveau'')</code> : remplace la chaîne ''ancien'' par la chaîne ''nouveau'' dans la chaîne ; * <code>''str''.split(''séparateur'')</code> : découpe la chaîne au niveau des séparateurs et renvoie une liste. ==== Autres fonctions ==== La fonction <code>chr()</code> transforme un code Unicode en caractère. Par exemple, <code>chr(97)</code> donne <code>"a"</code> et <code>chr(0x03c0)</code> donne <code>"π"</code>. Si on veut créer une liste de caractères qui se suivent, on peut par exemple utiliser : <syntaxhighlight lang="python"> [chr(x) for x in range(97, 102)] # ['a', 'b', 'c', 'd', 'e'] </syntaxhighlight> Si on veut créer une liste de nombres sous la forme de chaînes de caractères, on peut utiliser la commande <code>str()</code> vue ci-dessus. Par exemple : <syntaxhighlight lang="python"> [str(x) for x in range(1, 6)] # ['1', '2', '3', '4', '5'] </syntaxhighlight> Pour la syntaxe, voir ci-dessous la section [[#Définition en compréhension|''Définition en compréhension'']]. == Manipulation de listes == Les listes sont une structure de données fondamentale en Python. ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/datastructures.html | langue = en | titre = 5. Data structures | site = Python documentation | consulté le = 2019-03-16 }} === Copie d'une liste === Contrairement à d'autres types, lorsque vos écrivez <code>b = a</code> avec des listes, vous ne créez pas une copie de la variable <code>a</code>, vous créez un ''alias'' : l'objet <code>b</code> est un autre nom de l'objet <code>a</code>. En particulier, si vous modifiez <code>b</code>, vous modifiez en fait <code>a</code>. Par exemple : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a b[2] = 5 print(a, b) # [1, 2, 5, 4] [1, 2, 5, 4] </syntaxhighlight> Si l'on veut créer une copie de <code>a</code>, il faut utiliser <code>a[:]</code> ou bien <code>a.copy()</code> : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a[:] c = a.copy() b[2] = 5 c[2] = 6 print(a, b, c) # [1, 2, 3, 4] [1, 2, 5, 4] [1, 2, 6, 4] </syntaxhighlight> === Méthodes de listes === Pour modifier une liste, vous disposez des méthodes suivantes : * <code>a.append(x)</code> : ajoute l'élément <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.extend(x)</code> : ajoute la liste <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.append(i, x)</code> : aoute l'élément <code>x</code> ''avant'' l'interstice ''i'' de la liste <code>a</code> ; * <code> x = a.pop(i)</code> : enlève l'élément ''i'' de la liste <code>a</code> et le met dans la variable <code>x</code> ; <code> x = a.pop()</code> enlève le dernier élément de la liste ; * <code>a.clear()</code> : vide la liste <code>a</code> ; * <code>a.sort()</code> : trie la liste par ordre croissant ; * <code>a.sort(reverse = True)</code> : trie par ordre décroissant ; * <code>a.reverse()</code> : inverse l'ordre de <code>a</code>. Pour supprimer l'élément à l'indice ''i'', au lieu d'utiliser <code>a.pop(i)</code>, on peut aussi utiliser <syntaxhighlight lang="python"> del(a[i]) </syntaxhighlight> Pour trier une liste, on peut aussi utiliser la fonction <code>sorted()</code>, ce qui permet par exemple de conserver la liste originale, non triée : <code>b = sorted(a)</code>. La fonction <code>sorted()</code> fonctionne avec tous les objets « itérables » comme par exemple une chaîne de caractères : <syntaxhighlight lang="python"> a = "ahjbfk" print(sorted(a)) # ['a', 'b', 'f', 'h', 'j', 'k'] </syntaxhighlight> Pour mettre en évidence la performance de la méthode <code>''list''.sort()</code> par rapport à la fonction générique <code>sorted()</code> : <syntaxhighlight lang="python"> import numpy as np import time a = np.random.rand(int(1e7)) t1 = time.perf_counter() b = sorted(a) # Fonction générique t2 = time.perf_counter() a.sort() # Méthode spécifique t3 = time.perf_counter() print("Sorted :", t2-t1, " s ; .sort :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # Sorted : 14.2... s ; .sort : 1.1... s ; rapport : 12.6... </syntaxhighlight> Par rapport à une valeur donnée : * <code>a.remove(x)</code> : retire la première occurrence de la valeur <code>x</code> de la liste <code>a</code> ; * <code>a.index(x)</code> : indique l'indice où se trouve la première occurrence de la valeur <code>x</code> ; * <code>a.count(x)</code> : indique le nombre de fois que l'on trouve la valeur <code>x</code> dans la liste <code>a</code>. === Définition en compréhension === La [[w:fr:Liste en compréhension|définition en compréhension]] ''({{lang|en|list comprehension}})'' est une méthode permettant de construire des listes en indiquant simplement des axiomes, des consignes de filtrage. Cette méthode est élégante car proche de la notation mathématique et compacte, mais c'est une méthode itérative donc lente par rapport à une méthode vectorisée fournie par le module NumPy. Par exemple, pour créer la liste des carrés des nombres entiers entre 0 et 9, il suffit d'écrire <syntaxhighlight lang="python"> carre = [x**2 for x in range(10)] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x^2 | x \in [0 ; 9] \}</math>. Si l'on veut la liste des nombres strictement inférieurs à 20 dont le carré est supérieur à 10, on peut écrire : <syntaxhighlight lang="python"> X = [x for x in range(20) if x**2 > 10] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x | x \in [0 ; 19], x^2 > 10 \}</math>. Pour mettre en évidence la performance du calcul vectorisé par rapport à la méthode itérative : <syntaxhighlight lang="python"> import time import numpy as np n = int(1e7) # taille de la liste t1 = time.perf_counter() carre = [x**2 for x in range(n)] # Définition en compréhension t2 = time.perf_counter() carre2 = np.arange(n)**2 # Calcul vectorisé t3 = time.perf_counter() print("En compréhension : ", t2-t1, "s ; vectorisé :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # En compréhension : 4.515... s ; vectorisé : 0.156... s ; rapport : 28.982... </syntaxhighlight> == Structure d'un programme == Un programme est simplement une suite d'instructions. Dans les environnements Unix BSD, un programme Python peut être considéré comme un script c'est-à-dire qu'il suffit de taper son nom dans l'invite de commande ''({{lang|en|shell}})'' sans avoir à invoquer <code>python</code>. Le programme doit alors commencer par un en-tête normalisé surnommé ''{{lang|en|[[wikt:shebang|shebang]]}}'' : <syntaxhighlight lang="python"> #!/usr/bin/env python3 </syntaxhighlight> Ce ''{{lang|en|shebang}}'' est inutile avec Jupyter. L'en-tête peut également contenir la description de l'encodage du fichier texte, typiquement : <syntaxhighlight lang="python"> # coding: utf-8 </syntaxhighlight> Le codage UTF-8 est le codage par défaut pour Python 3, il est donc inutile de l'indiquer. Les commentaires sont introduits par le croisillon <code>#</code>. On peut grouper une suite d'instructions dans un bloc. Un bloc d'instructions commence par deux-points « <code>:</code> » et est identé, c'est-à-dire qu'il a une marge constituée de quatre espaces — on peut aussi utiliser une tabulation mais il ne faut pas mélanger les deux méthodes ; les tabulations sont déconseillées, il vaut mieux utiliser quatre espaces<ref>{{lien web | url = https://www.python.org/dev/peps/pep-0008/#tabs-or-spaces | titre = Tabs or Spaces? | site = Python documentation | consulté le = 2019-03-14 }}</ref>. Pour terminer le bloc, il suffit simplement de revenir en début de ligne ; contrairement à d'autres langages, il n'y a pas de commende de fin ''({{lang|en|end}})'', c'est l'indentation qui définit le bloc. : # début du bloc ''instruction 1'' ''instruction 2'' … ''dernière instruction du bloc'' ''instruction hors bloc'' Par exemple, une exécution conditionnelle <code>if</code> ou une boucle <code>for</code> exécute un bloc d'instruction. Si l'on a besoin d'un bloc d'instruction qui « ne fait rien », on utilise l'instruction <code>pass</code>. == Structures de contrôle == '''Boucle itérative''' La boucle itérative s'écrit : <syntaxhighlight lang="python"> for <variable> in <itérable>: <bloc d’instructions> </syntaxhighlight> Si l'on veut que la variable prenne ''n'' valeurs de 0 à ''n'' – 1, on utilise l'instruction <code>range()</code> : <syntaxhighlight lang="python"> for i in range(5): print(i) print("Fin de la boucle") </syntaxhighlight> <code>[▶]</code> 0 1 2 3 4 Fin de la boucle En fait, la commande <code>range()</code> extrait des valeurs de l'ensemble des nombres entiers ; on peut ainsi utiliser le découpage en tranches, par exemple <code>range(2, 5)</code>pour avoir la « liste » <code>[2, 3, 4]</code>. Notez que <code>range()</code> ne crée pas à proprement parler une liste, cela crée un objet de type ''« {{lang|en|range}} »'' (plage, intervalle) ; pour avoir une liste, il faut écrire <code>list(range(n))</code>. Dans une boucle, la commande <code>continue()</code> saute la fin du bloc d'instruction et passe à la valeur suivante de la boucle. La commande <code>break()</code> interrompt la boucle et passe à la suite. '''Exécution conditionnelle''' L'exécution conditionnelle s'écrit : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> </syntaxhighlight> On peut utiliser les commandes <code>elif</code> ''(else if'') et <code>else</code> : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> elif <booléen>: <bloc d’instructions> else: <bloc d’instructions> </syntaxhighlight> Notez que le test d'une condition est gourmand en ressources. S'il s'agit de savoir si l'on effectue une opération mathématique simple ou pas, on peut remplacer le test par une multiplication par un booléen (<code>True</code> vaut 1, <code>False</code> vaut 0). Par exemple, plutôt que d'écrire <syntaxhighlight lang="python"> if a > 0: b = b - c </syntaxhighlight> mieux vaut écrire : <syntaxhighlight lang="python"> b = b - (a > 0)*c </syntaxhighlight> '''Boucle antéconditionnée''' La boucle antéconditionnée s'écrit : <syntaxhighlight lang="python"> while <booléen>: <bloc d’instructions> </syntaxhighlight> Cette boucle peut contenir des instructions <code>continue()</code> et <code>break()</code>. == Fonction == La déclaration d'une fonction utilise la commande <code>def</code>. La fonction est un bloc d'instructions. Si elle doit renvoyer des valeurs, on utilise la commande <code>return</code>. Par exemple <syntaxhighlight lang="python"> def nombres(n): """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo a = nombres(3) print(a) </syntaxhighlight> La fonction commence par une chaîne de caractères qui la décrit. Cette chaîne peut être récupérée automatiquement par certains logiciels pour faire une documentation automatique. Si la description prend plusieurs lignes, elle commence et finit par trois double-guillemets <code>"""…"""</code> ; en fait, par convention, même si cela n'est pas obligatoire, les descriptions sont toutes encadrées de trois double-guillemets. Cette description est appelée ''{{lang|en|docstring (documentation string)}}''. Pour récupérer les ''{{lang|en|docstrings}}'' : <syntaxhighlight lang="python"> def foo(): """Cette fonction ne fait rien""" pass print(foo.__doc__) # Cette fonction ne fait rien </syntaxhighlight> L'instruction <code>input()</code> permet à l'utilisateur de saisir une valeur. La valeur est retournée sous la forme d'une chaîne de caractères qui est ensuite convertie en nombre réel avec l'instruction <code>float()</code>. On peut définir une valeur par défaut en l'indiquant dans l'en-tête de la définition de la fonction, de la manière suivante : <syntaxhighlight lang="python"> def nombres(n=1): # valeur par défaut : 1 """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo </syntaxhighlight> Si le paramètre à initialiser est de type modifiable ''({{lang|en|mutable}})'', comme par exemple une liste, il faut procéder comme suit : <syntaxhighlight lang="python"> def fooFonction(fooListe=None): # valeur par défaut : n'existe pas """Description""" if fooListe = None: fooListe = [] # initialisation <suite des instructions> </syntaxhighlight> Par défaut, les variables sont locales. On peut rendre une variable globale avec l'instruction <code>global</code> ''à l'intérieur de la fonction'', avant l'utilisation de la variable. Par exemple : <syntaxhighlight lang="python"> a = 1 b = 1 def toto(): """Test de variable globale. Entrée : aucune. Sortie : aucune.""" global a a = 2 b = 2 toto() print("a =", a, "; b =", b) # a = 2 ; b = 1 </syntaxhighlight> Pour être plus précis : si une variable n'est pas assignée dans une fonction, alors Python va chercher une variable du même nom à l'extérieur de la fonction. Mais à partir du moment où la variable est assignée dans la fonction, elle devient locale ''sauf'' si l'on a utilisé l'instruction <code>global</code>. Si l'on s'attend à un nombre indéfini d'arguments, on utilise la notion d'empaquetage/dépaquetage ''({{lang|en|packing/unpacking}})''<ref>{{lien web | url = https://deusyss.developpez.com/tutoriels/Python/args_kwargs/ | titre = Introduction à *args et **kwargs | consulté le = 2019-03-09 | site = Developpez.com }}.</ref>. L'empaquetage consiste à mettre les arguments dans un n-uplet, le dépaquetage consiste à développer un n-uplet en plusieurs variables. Cela se fait en mettant un astérisque ''({{lang|en|splat}})'' « <code>*</code> » devant le nom de la variable. Par convention, on utilise le nom de variable <code>*args</code> mais cela n'est pas obligatoire. <syntaxhighlight lang="python"> def concatenation(*args): """Concatène des chaînes de caractères Entrée : *args, n-uplet de chaînes de caractères. Sortie : resultat, chaîne de caractères.""" resultat = "" for i in args: resultat = resultat + i return resultat concatenation("a", "foo", "toto") # 'afoototo' </syntaxhighlight> À l'inverse, si une fonction doit recevoir plusieurs paramètres, on peut à la place lui transmettre une liste à dépaqueter : <syntaxhighlight lang="python"> def addition(a, b): """Ajoute deux nombres Entrées : — a : réel ; — b : réel. Sortie : a+b, réel""" return a+b arg = (1, 2) addition(*arg) # 3 </syntaxhighlight> On peut aussi empaqueter/dépaqueter un dictionnaire, on utilise pour cela deux astérisques « <code>**</code> ». Par convention, on utilise le nom <code>**kwargs</code> sans que cela soit obligatoire. L'instruction <code>lambda</code> permet de créer de petites fonctions ne contenant pas de boucle ni de branchement conditionnel. Cependant, si la déclaration est courte et compacte, le code n'est pas toujours facilement lisible ; l'utilisation de cette instruction n'est pas recommandée. Par exemple l'expression <syntaxhighlight lang="python"> f = lambda x: 2*x </syntaxhighlight> est la même chose que <syntaxhighlight lang="python"> def f(x): """Calcule le double. Entrée : x, réel. Sortie : 2*x, réel.""" return 2*x </syntaxhighlight> {{note|L'instruction <code>eval()</code> exécute une chaîne de caractères, c'est-à-dire traite une chaîne de caractères comme si c'étaient des instructions données à Python. Cette instruction est à éviter pour deux raisons : # Un utilisateur malveillant pourrait entrer du code malveillant dans la chaîne de caractères. # L'exécution est lente puisque Python doit compiler la chaîne à la volée. Cette instruction peut en général être remplacée par une autre instruction. }} == Gestion des erreurs == Dans un bloc d'instructions, on peut utiliser la structure <code>try:… except:</code>. Le bloc après <code>try</code> est exécuté ; si une erreur se déclare dans ce bloc, alors le bloc <code>except</code> s'exécute. Par exemple <syntaxhighlight lang="python"> try: 1/0 # Génère une erreur except: print("Division par zéro") # Cette instruction est donc exécutée </syntaxhighlight> On peut compléter avec <code>else:</code> et <code>finally:</code> : <syntaxhighlight lang="python"> try: <code à exécuter> except: <s’exécute en cas d’erreur> else: <s’exécute s’il n’y a pas d’erreur> finally: <s’exécute dans tous les cas> </syntaxhighlight> On peut séparer les différents types d'erreur : <syntaxhighlight lang="python"> try: <code à exécuter> except ValueError: print("Valeur erronée") except TypeError: print("Type erroné") </syntaxhighlight> Les types d'erreur les plus courants sont : * <code>NameError</code> : le nom de variable n'existe pas ; * <code>TypeError</code> : la valeur n'est pas du bon type ; * <code>ValueError</code> : la valeur n'est pas compatible avec ce qui est attendu ; * <code>RuntimeError</code> : type d'erreur général. On peut aussi créer ses propres erreurs : si une situation erronée survient, on peut « lever » une exception avec <code>raise</code>. Par exemple <syntaxhighlight lang="python"> if a < 0: raise ValueError("La valeur doit être positive") </syntaxhighlight> ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/errors.html | titre = Errors and exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} * {{lien web | url = https://docs.python.org/3/library/exceptions.html | titre = Built-in Exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} == Exercices == === Calcul du PGCD et du PPCM par l'algorithme d'Euclide === {{loupe|w:Algorithme d'Euclide}} Écrire un programme Python qui demande deux nombres entiers et affiche leurs PGCD et PPCM. Le programme utilisera l'algorithme d'Euclide. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """Programme : euclide.py Auteur : User:cdang date : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : calcule le PGCD et le PPCM de deux nombres entiers. Entrée ------ au clavier, saisie de deux nombres entiers. Sorties ------- à l'écran, affichage du PGCD et du PPCM. """ # *************** # *************** # ** Fonctions ** # *************** # *************** def euclide(): """Calcule le PGCD et le PPCM avec l'algorithme d'Elclide Entrée ------ Aucune, la saisie des paramètres fait partie de la fonction Sortie ------ affichage du PGCD et du PPCM """ print("***** Algorithme d'Euclide *****\n") a0 = int(input("Premier nombre entier : a = ")) b0 = int(input("Second nombre entier : b = ")) a = a0 b = b0 r = a%b # initialisation while (r != 0) : # algorithme d'Euclide a = b b = r r = a%b # affichage des résultats print("PGCD(", a0, ", ", b0, ") = ", b) print("PPCM(", a0, ", ", b0, ") = ", a0*b0//b) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* euclide() </syntaxhighlight> On peut simplifier la boucle centrale : <syntaxhighlight lang="python"> while b: # s'exécute tant que b n'est pas 0 a, b = b, a % b # affectation de liste à liste return a </syntaxhighlight> {{boîte déroulante fin}} Notez que le module NumPy propose l'instruction <code>gcd()</code> : <syntaxhighlight lang="python"> import numpy … print(numpy.gcd(a, b)) </syntaxhighlight> === Tours de Hanoï === {{loupe|w:Tours de Hanoï}} Écrire un programme Python qui demande le nombre ''n'' de plateaux et affiche les manipulations nécessaires pour déplacer la pile d'un emplacement à un autre. Le programme utilisera l'algorithme récursif. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """nom : hanoi.py auteur : User:cdang date de création : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : résout le problème des tours de Hanoï Entrées ------- trois chaînes de caractères (nom des piliers) Sorties ------- une chaîne de caractères (liste des opérations) """ # *************** # *************** # ** Fonctions ** # *************** # *************** def hanoi(a, b, c, n): """Résout le problème des tours de Hanoï de manière récursive But : déplace la pile de n disques du piler a au pilier b Entrées ------- a, b c : chaînes de 1 caractère, référence des emplacements ; n : entier, nombre de disques sur l'emplacement a Sorties ------- operations : chaînes de caractères décrivant les opérations """" if n>1: operations = hanoi(a, c, b, n-1) operations = operations+a+"→"+b+" ; " operations = operations+hanoi(c, b, a, n-1) else: operations = a+"→"+b+" ; " return operations # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* resultat = hanoi("1", "2", "3", 3) print(resultat) </syntaxhighlight> {{boîte déroulante fin}} === Lancer de rayons === [[Fichier:Lentille hemispherique perspective.svg|vignette|Lentille hémisphérique.]] Considérons une lentille hémisphérique de rayon R faite d’un verre d’indice de réfraction ''n''. Nous plaçons une source ponctuelle à une distance ''d'' du dioptre plan, sur l’axe optique. Tracer des rayons partant de la source et traversant la lentille. {{clear}} {{Boîte déroulante/début |titre=Analyse d’optique géométrique}} [[Fichier:Lentille hemispherique analyse geometrique.svg|vignette|Analyse géométrique du problème.]] Il s’agit d’un problème ayant une symétrie de révolution par rapport à l’axe optique. Nous pouvons nous réduire à un problème plan en nous plaçant dans un plan contenant l’axe optique ; l’axe optique est encore un axe de symétrie orthogonale, nous pouvons donc nous contenter d'étudier un demi-plan. Pour simplifier, nous plaçons le centre du dioptre sphérique à l’origine O du repère. L’axe optique est l’axe ''x'' et l'axe perpendiculaire, vertical sur la figure, c’est l’axe ''y''. Les coordonnées de la source sont donc (-''d'' ; 0). Le rayon issu de la source et faisant un angle θ avec l’axe ''x'' frappe le dioptre plan à l’altitude ''h''. Nous avons : : ''h'' = ''d'' ⋅ tan θ. L’angle d’incidence vaut θ. D’après la loi de Snell-Descartes, l'angle de réfraction θ<sub>2</sub> vaut : : θ<sub>2</sub> = arcsin((sin θ) / ''n''). Le rayon réfracté passe par le points de coordonnées (0, ''h''). L’équation de la droite est donc : : ''y'' = a ⋅ ''x'' + ''h'' avec : ''a'' = tan θ<sub>2</sub>. L’équation du cercle de centre O et de rayon R est : : ''x''<sup>2</sup> + ''y''<sup>2</sup> = R<sup>2</sup>. Les coordonnées (''x''<sub>M</sub>, ''y''<sub>M</sub>) de l’intersection M du rayon avec le dioptre sphérique vérifient les deux équations. Par substitution, nous obtenons une équation du second degré en ''x'' que nous savons résoudre : : ''x''<sub>M</sub><sup>2</sup> + (''a'' ⋅ ''x''<sub>M</sub> + ''h'')<sup>2</sup> = R<sup>2</sup> : ⇔ (1 + ''a''<sup>2</sup>) ⋅ ''x''<sub>M</sub><sup>2</sup> + 2 ⋅ ''a'' ⋅ ''h'' ⋅ ''x''<sub>M</sub> + ''h''<sup>2</sup> – R<sup>2</sup> = 0. D’après les propriétés du cercle, le rayon est perpendiculaire à la tangente. Le rayon [OM] est donc normal au dioptre en M. Nous pouvons déterminer l’angle d’incidence θ<sub>i</sub> par le produit scalaire : : <math>\begin{pmatrix} 1 \\ a \end{pmatrix} \cdot \begin{pmatrix} x_\mathrm{M} \\ y_\mathrm{M} \end{pmatrix} = \sqrt{1^2 + a^2} \cdot \mathrm{R} \cdot \cos(\theta_\mathrm{i})</math> ce qui nous permet de calculer cet angle : : <math>\theta_\mathrm{i} = \operatorname{arcos} \left ( \frac{x_\mathrm{M} + a \cdot y_\mathrm{M}}{\mathrm{R} \cdot \sqrt{1^2 + a^2} } \right )</math> Comme nous passons vers un milieu d’indice plus faible, il y a un risque de réflexion totale. L’angle limite est : : θ<sub>max</sub> = arcsin(1/''n''). Si l’on a θ<sub>i</sub> &gt; θ<sub>max</sub>, le rayon repart vers l’intérieur. Nous ne traçons pas le rayon car cela nous emmènerait trop loin dans l’analyse. En revanche, si θ<sub>i</sub> ≤ θ<sub>max</sub>, alors nous pouvons appliquer la loi de Snell-Descartes pour avoir l’angle de réfraction θ<sub>e</sub> : : θ<sub>e</sub> = arcsin(''n'' ⋅ sin θ<sub>i</sub>). Pour tracer le rayon sortant, il nous faut l’angle θ<sub>3</sub> par rapport à l’horizontale. L’angle du rayon [OM] par rapport à l’horizontal vaut arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>), nous avons donc : θ<sub>3</sub> = arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>) + θ<sub>e</sub>. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Analyse algorithmique}} '''Structure des données''' Le problème est décrit par trois paramètres : # Le rayon <code>R1</code> de la lentille, en milliètres (réel en virgule flottante). # L’indice du verre, <code>n</code> sans dimension (réel en virgule flottante). L’indice de l’air vaut 1. # La distance de la source au dioptre d’entrée plan, <code>d</code> en millimètres (réel en virgule flottante). Un rayon est caractérisé par quatre paramètres : # L’angle d’émission <code>theta1</code> en radians (réel en virgule flottante). # L’angle de réfraction dans la lentille <code>theta2</code> en radians (réel en virgule flottante). # Les cordonnées <code>M</code> en millimètre (vecteur de dimension 2 <code>([x, y])</code> de réels en virgule flottante) du point d’intersection du rayon avec le dioptre sphérique. # L’angle de réfraction dans l’air après la lentille <code>theta3</code> en radians (réel en virgule flottante). Pour le calcul et le tracé, nous avons besoin des paramètres intermédiaires suivants : * l’altitude ''y'' = <code>h</code> en millimètres (réel en virgule flottante) à laquelle le rayon frappe le dioptre plan d’entrée ; * l’angle d’incidence du rayon avec le dioptre sphérique <code>thetaint</code> en radians (réel en virgule flottante). Les angles sont stockés en radians car c’est l’unité naturelle pour le calcul mais nous affichons les valeurs en degrés. Comme le calcul de conversion est récurrent, nous conservons les facteurs <code>degversrad</code> (conversion des degrés vers les radians, facteur valant π/180, réel en virgule flottante) et <code>radversdeg</code> (conversion des radians vers les degrés, facteur valant 180/π, réel en virgule flottante). '''Fonctions''' Nous avons besoin d’une fonction qui calcule les trois paramètres du rayon <code>(theta2, M, theta3)</code> à partir de l’angle d’émission <code>theta1</code>. Nous appelons cette fonction <code>lanceRayon()</code>. Cette fonction fait appelle à une fonction qui calcule l’angle du rayon réfracté à partir de l’angle du rayon incident <code>theta1</code>, les deux angles étant par rapport à la normale au dioptre au point considéré. Nous appelons cette fonction <code>refrac()</code>. La recherche de l’intersection <code>M</code> du rayon avec le dioptre sphérique nécessite de résoudre une équation du second degré. Nous utilisons pour cela la recherche des racines du polynôme en <code>x</code> avec la fonction <code lang="python">numpy.polynomial.polynomial.polyroots()</code>. D’après la configuration du problème géométrique, si l’on s’assure que le rayon frappe bien la lentille (0 ≤ <code>h</code> ≤ <code>R1</code>) alors nous sommes sûrs que le problème a deux solutions réelles (une positive et une négative) ou, dans le cas dégénéré où <code>h == R1</code>, une valeur unique <code>x == 0</code>. Comme nous recherchons la valeur positive, nous sélectionons la plus grande des deux racines. Pour la gestion de la réflexion interne : dans la fonction <code>refrac()</code>, nous vérifions les conditions de réflexion totale et si elles sont remplies, alors nous générons une erreur (commandes <code lang="python">try… except</code> et <code lang="python">raise ValueError</code>). Cette erreur est propagée à la fonction <code>lanceRayon()</code> : <code>lanceRayon()</code> appelle la fonction <code>refrac()</code> et si cette fonction renvoie une erreur, alors <code>lanceRayon()</code> renvoie également une erreur. Pour trouver l’angle d’émission <code>thetaLimite</code> provoquant la réflexion totale (en radians, réel en virgule flottante), nous effectuons une recherche par dichotomie : * nous partons de l’angle maximum possible, lorsque le rayon frappe le sommet de la lentille, et nous appelons la fonction <code>lanceRayon()</code> ; si cela ne génère pas d’erreur, alors nous pouvons aller jusqu’à cette valeur, la recherche est terminée ; si cela génère une erreur, alors nous divisons la valeur par deux ; * à une étape de la recherche donnée, si <code>lanceRayon()</code> ne génère pas d’erreur avec l’angle testé, alors nous savons que l’angle limite est supérieur à cette valeur ; cette valeur minore donc la valeur recherchée ; si au contraire <code>lanceRayon()</code> génère une erreur, alors c’est que l’angle est trop important, cette valeur majore donc la valeur recherchée ; nous pouvons ainsi resserer l’intervalle de recherche ; * nous nous arrêtons lorsque les valeurs haute et basse sont suffisamment proche. Concrètement : # Nous définissons une variable <code>angleHaut</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus bas connu provoquant la réflexion totale. # Nous définissons une variable <code>angleBas</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus haut connu ne provoquant pas de réflexion totale. Sa valeur initiale est 0. L’angle limite recherché est donc entre <code>angleBas</code> et <code>angleHaut</code>. # Nous définissons l’angle <code>angleTest</code> comme étant la moyenne entre <code>angleBas</code> et <code>angleHaut</code>. Si <code>lanceRayon(angleTest)</code> génère une erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleHaut</code> (puisque c’est une valeur provoquant la réflexion totale et qu’elle est plus basse que la valeur actuelle d’<code>angleHaut</code>). À l’inverse, si <code>lanceRayon(angleTest)</code> ne génère pas d’erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleBas</code> (puisque c’est une valeur ne provoquant pas la réflexion totale et qu’elle est plus haute que la valeur actuelle d’<code>angleBas</code>). # Nous arrêtons la procédure lorsque l’écart entre <code>angleBas</code> et <code>angleHaut</code> est inférieur à {{unité|10|échelle=<sup>–3</sup>|rad}} (valeur arbitraire). La valeur retenue est la valeur finale d’<code>angleBas</code> (puisque l’on veut être sûr qu’il n’y ait pas de réflexion totale). La valeur affichée est la valeur en degrés arrondie au dixième. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Solution}} Nous demandons à l’utilisateur ou à l’utilisatrice les valeurs des paramètres du problème : rayon de la lentille, distance de la source, indice de réfraction du verre. Nous vérifions que les valeurs entrées sont bien des nombres ; si c’est une chaîne vide, alors nous utilisons une valeur par défaut. Nous créons une fonction <code>refrac()</code> qui permet de calculer l’angle réfracté à partir de l’angle d’incidence et des indices de réfraction. S’il y a rélexion totale, alors nous générons une erreur. La fonction <code>lanceRayon()</code> calcule les différents points de passage du rayon. Elle appelle pour cela la fonction <code>refrac()</code>. Si un appel de la commande <code>refrac()</code> génère une erreur, alors nous générons également une erreur. Nous déterminons l’angle d’émision du rayon <code>thetaLimite</code> qui provoque une réflecxion totale. Pour cela, nous créons une fonction <code>rechercheLimite()</code> qui cherche par dichotomie. Nous traçons un rayon tous les 5° jusqu’à la valeur limite. <syntaxhighlight lang="python"> #!/usr/bin/env python3 # coding: utf-8 """nom : lancerRayons.py auteur : User:cdang date de création : 2022-05-06 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : NumPy, matplotlib ---------------------------------------------------------------------------- Objectif : trace des trajets optique avec une lentille hémisphérique Entrées ------- Le rayon de la lentille, la distance de la source, l’indice de réfraction du verre, trois chaînes de caractères saisies par l’utilisateur·rice et qui sont converties en réels. Sorties ------- La valeur limite de l’angle (réel) et le tracé de plusieurs rayons. """ # ****************************************************** # ****************************************************** # ** Lancer de rayons pour une lentille hémisphérique ** # ****************************************************** # ****************************************************** import numpy as np import matplotlib.pyplot as plt import numpy.polynomial.polynomial as nppol # ************** # * Constantes * # ************** # Pour la conversion degrés ↔ radians radversdeg = 180/np.pi degversrad = 1/radversdeg # ************* # * Fonctions * # ************* def boucleEntreeNombre(messageSaisie, valeurDefaut): """Permet de s’assurer que l’utilisateur·rice a bien entré un nombre. Entrée : — message à afficher (chaîne de caractères) ; — valeur par défaut (réel à virgule flottante). Sortie : nombre (réel à virgule flottante).""" messageErreur = "Veuillez entrer une valeur numérique (ou vide pour accepter la valeur par défaut).\n" execute = True while execute: strNombre = input(messageSaisie+f" (valeur par défaut {valeurDefaut}) : ") if strNombre == "": nombre = valeurDefaut execute = False else: try: nombre = float(strNombre) except: print(messageErreur) else: execute = False return nombre def initialisation(): """L’utilisateur·rice entre les variables du problème. Entrées : aucune. Sorties : — R1 (mm) : rayon de la lentille ; — d (mm) : distance de la source au dioptre plan ; — n (sans dimension) : indice de réfraction du verre.""" R1 = boucleEntreeNombre("Rayon de la lentille en mm", 20.0) d = boucleEntreeNombre("Distance de la source au dioptre plan en mm", 20.0) n = boucleEntreeNombre("Indice de réfraction (sans dimension)", 1.5) return (R1, d, n) def refrac(n1, n2, theta1): """Calcule l’angle de réfraction theta2 (radians) en fonction — de l’angle d’incidence theta1 (radians); — de l’indice de réfraction n1 du premier milieu ; — de l’indice de réfraction n2 du second milieu.""" reflexionTotale=False rapport=n2/n1 rapportinv=np.reciprocal(rapport) if n1 > n2: thetal = np.arcsin(rapport) # angle limite pour la réflexion totale if theta1 >= thetal: reflexionTotale=True if reflexionTotale: print("Réflexion totale") raise ValueError else: return np.arcsin(rapportinv*np.sin(theta1)) def lanceRayon(n1, n2, d, R, theta1): """Détermine le rayon issu de la source située à une distance d (mm) du bareau et avec une élévation de theta1 (radians), en fonction des indices de réfraction n1 et n2. Les éléments retournés sont : — la hauteur h (mm) à laquelle le rayon frappe le barreau ; — l’angle de réfraction theta2 (radians)) dans le barreau ; — l’angle de réfraction theta3 (radians) à la sortie du barreau — le point M(x, y) (mm) auquel le rayon sort du barreau.""" h = d*np.tan(theta1) if h >= R: print("Le rayon est au-dessus du barreau") raise ValueError else: theta2 = refrac(n1, n2, theta1) a = np.tan(theta2) x = max(nppol.polyroots([h*h - R*R, 2*a*h, 1+a*a])) # recherche de l’intersection du rayon avec le cercle y = a*x + h M = np.array([x, y]) thetaint = np.arccos((x + a*y)/(R*np.sqrt(1 + a*a))) theta3 = np.arctan(y/x) - refrac(n2, n1, thetaint) return (h, theta2, theta3, M) def rechercheLimite(n1, n2, d, R): """Recherche l’angle limite pour la réflexion totale. Entrée : — indice de réfraction des milieux 1 et 2, n1 et n2 ; — distance au barreau, d(mm). Sortie : angle limite theta (radians)""" angleHaut = np.arctan(R/d) angleBas = 0 angleTest = angleHaut try: lanceRayon(n1, n2, d, angleTest, R) except: condition = True # il y a réflexion total en haut de la lentille else: condition = False # il n’y a jamais réflexion totale dans la lentille while condition: #dichotomie angleTest = np.mean([angleHaut, angleBas]) # on ajuste la valeur de test try: lanceRayon(n1, n2, d, R, angleTest) except: angleHaut = angleTest # réflexion totale : on abaisse la valeur maximale else: angleBas = angleTest # pas de réflexion totale : on monte la valeur minimale condition = ((angleHaut - angleBas) >= 0.001) # on a cerné la limite à 0,001 rad près if not condition: angleTest = angleBas return angleTest # *********************** # * Programme principal * # *********************** (R1, d, n) = initialisation() xmax = round(R1 + d) thetaLimite = rechercheLimite(1, n, d, R1) thetaLimiteDeg = thetaLimite*radversdeg print(f"Angle limite pour la réflexion totale : {thetaLimiteDeg:.1f}°.\n") anglesDeg = np.arange(0, thetaLimiteDeg, 5)[1:] # trace un rayon tous les 5° anglesRad = anglesDeg*degversrad nb = len(anglesDeg) h = np.zeros(nb) # initialisation des vecteurs de valeurs theta2 = np.zeros(nb) theta3 = np.zeros(nb) M = np.zeros((nb, 2)) for i in range(nb): (h[i], theta2[i], theta3[i], M[i, :]) = lanceRayon(1, n, d, R1, anglesRad[i]) (h_lim, theta2_lim, theta3_lim, M_lim) = lanceRayon(1, n, d, R1, thetaLimite) # tracé anglesCercle = 0.5*np.pi*(np.linspace(1, 0, 20)) x_cercle = R1*np.cos(anglesCercle) # coordonnées des pints du cercle y_cercle = R1*np.sin(anglesCercle) fig = plt.plot([-d,xmax], [0, 0], "k-.", linewidth="0.5") # tracé de l’axe optique for i in range(nb): plt.plot([-d, 0, M[i, 0], xmax], [0, h[i], M[i, 1], M[i, 1] + (xmax - M[i, 0])*np.tan(theta3[i])], label=f"{anglesDeg[i]:.0f}°") plt.plot([-d, 0, M_lim[0], xmax], [0, h_lim, M_lim[1], M_lim[1] + (xmax - M_lim[0])*np.tan(theta3_lim)], label=f"{0.1*int(np.trunc(10*thetaLimite*radversdeg)):.1f}°") plt.plot(x_cercle, y_cercle, "k", linewidth="0.5") # tracé du cercle plt.plot([0,0], [0, R1], "k", linewidth="0.5") # tracé du premier dioptre #plt.axis("square") plt.gca().set_aspect("equal", adjustable="box") plt.xlabel("x (mm)") plt.ylabel("y (mm)") plt.title("Lentille hémisphérique, lancer de rayons") plt.legend() plt.savefig("lentille_hemispherique_lancer_rayon.svg", format="svg") plt.show() </syntaxhighlight> {{Boîte déroulante/fin}} == Mesurer le temps == Le module <code>time</code> fournit les fonctions suivantes : * <code>time.gmtime()</code> : renvoie la date et l'heure du méridien de Greenwich (''{{lang|en|Greenwich mean time}}'', GMT), sous la forme d'un dictionnaire (année, mois, jour du mois, heure, minute, seconde, jour de la semaine, jour de l'année, heure d'été/hiver), ** jour de la semaine est un entier entre 0 (lundi) et 6 (dimanche), ** jour du mois est un entier entre 1 et 366 ; * <code>time.localtime()</code> : comme le précédent, mais l'heure est l'heure locale ; * <code>time.time()</code> : donne le nombre de seconde qui se sont écoulées depuis le 1er janvier 1970 ; * <code>time.gmtime(n)</code> et <code>time.localtime(n)</code> transforment un nombre de secondes (écoulées depuis le 1er janvier 1970) en une date au format (année, mois, jour, etc.), n-uplet de neuf valeurs ; <code>time.mktime()</code> fait le contraire, il transforme un n-uplet de neuf valeurs (années, mois, jour, etc.) en un nombre de secondes (écoulées depuis le 1er janvier 1970) ; * <code>time.sleep(n)</code> : provoque une pause dans le déroulement du programme de ''n'' secondes ; * <code>time.perf_counter()</code> : indique une date en seconde ; s'utilise pour mesurer la durée d'exécution d'une partie du code, en faisant la différence entre deux relevés. Concernant la date et l'heure sous la forme d'un n-uplet, on peut extraire l'heure de la manière suivante : <syntaxhighlight lang="python"> import time a = time.localtime() print("Il est ", a[3], "h", a[4]) # ou bien print("Il est ", a.tm_hour, "h", a.tm_min) </syntaxhighlight> Pour mesurer la performance d'une portion de code : <syntaxhighlight lang="python"> import time t1 = time.perf_counter() <suite d’instructions> t2 = time.perf_counter() print("Durée d'exécution :", t2-t1 </syntaxhighlight> == Programmation orientée objet == Nous n'allons pas ici faire un cours de programmation orientée objet (POO), nous allons aborder le sujet de manière pragmatique. De manière schématique, un « objet » est une « super-variable ». Cette super-variable peut contenir plusieurs variables, appelées « attributs » ; elle contient en fait un dictionnaire (paires « nom d'attribut : valeur d'attribut »). Elle peut aussi contenir des fonctions spécifiques appelées « méthodes ». De même qu'une variable a un type, un objet fait partie d'une « classe ». La classe est le modèle de l'objet ; en franglais informatique, on dit que l'objet est une instance de la classe. La POO est donc un formalisme : lorsque l'on définit des variables et des fonctions concernant un même type d'objet (au sens commun du terme), on les empaquette dans une classe. Il faut donc d'abord définir la classe, puis attribuer cette classe à un objet (« instancier » la classe). Considérons par exemple que nous voulons travailler sur des [[w:Engrenage|engrenages]] ; pour simplifier, nous nous contentons d'engrenages à dentures droites. Une roue dentée, un pignon, est essentiellement définie par son nombre de dents Z et par son module ''m'' qui correspond à la largeur de dents<ref>ainsi que par son épaisseur ''e'' et le matériau dont elle est faite mais nous allons négliger ces paramètres pour la simplicité de l'étude.</ref>. Nous allons définir trois méthodes : la méthode <code>.diametrePrimitif()</code> qui calcule le diamètre primitif de la roue dentée, <code>.pas()</code> qui calcule la largeur des dents au niveau du cercle primitif et <code>.rapport()</code> qui calcule le rapport de transmission de deux roues engrenées Z<sub>1</sub>/Z<sub>2</sub>. La méthode <code>.rapport()</code> vérifie par ailleurs que les roues ont le même module, condition indispensable pour former un engrenage. Nous définissons la classe ainsi : <syntaxhighlight lang="python"> class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): # instructions lancées lors de la déclaration """Valeurs des attributs""" self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z </syntaxhighlight> Nous remarquons que lorsque nous déclarons les méthodes, le paramètre <code>self</code> correspond à l'objet lui-même. Ainsi, dans la méthode <code>.rapport()</code>, la variable <code>self.Z</code> est le nombre de dents de la roue elle-même et <code>roueDentee.Z</code> est le nombre de dents de la roue passée en paramètre. Pour déclarer les roues, nous écrivons : <syntaxhighlight lang="python"> roue1 = pignon() # attribution de la classe, « instanciation » roue1.Z = 13 # définition des caractéristiques du pignon « roue1 » roue1.m = 2 roue2 = pignon(16, 2) # manière alternative </syntaxhighlight> Nous pouvons alors utiliser les objets de la manière suivante : <syntaxhighlight lang="python"> print(roue1.Z) # 13 print(roue1.diametrePrimitif()) # 26 R = roue1.rapport(roue2) # 0.8125 </syntaxhighlight> La commande <code>dir(a)</code> affiche tous les attributs et méthodes de l'objet <code>a</code>. ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/classes.html | titre = Classes | site = Python documentation | consulté le = 2019-03-08 }} == Interface graphique avec Tk == Une interface graphique utilisateur (GUI, ''{{lang|en|graphic user interface}}'') est un ensemble de boîtes permettant d'interagir avec l'utilisateur c'est-à-dire permettre la saisie d'informations, l'exécution d'actions et afficher des informations. Elle se compose d'éléments appelés ''{{lang|en|widgets}}''. Les éléments ''({{lang|en|widgets}})'' classiques sont : * boîte de dialogue ''({{lang|en|dialog box}})'' : fenêtre contenant d'autres éléments ; * étiquette ''({{lang|en|label}})'' : texte affiché ; * liste déroulante ''({{lang|en|drop-down list}})'' : zone permettant le choix d'une option, la liste se déployant lorsque l'on clique sur la zone ; * zone de texte, champ de saisie ''({{lang|en|text box}})'' : zone permettant de taper du texte ; * boîte combinée ''({{lang|en|combo box}})'' : zone de saisie de texte contenant une liste déroulante qui permet de choisir des éléments prédéfinis ; * bouton ''({{lang|en|button}})'' : objet effectuant une action lorsque l'on clique dessus ; * case à cocher ''({{lang|en|checkbox, tickbox}})'' : objet permettant d'activer ou de désactiver une option lorsque l'on clique dessus ; * bouton radio, case d'option ''({{lang|en|radio button}})'' : objet permettant d'activer une option en désactivant les autres options ; une seule option peut être activée à la fois. Plusieurs modules permettent de gérer les interfaces graphiques. Nous choisissons ici le module développé sur la bibliothèque Tk qui est une bibliothèque multiplateforme. Pour cela, nous importons le module <code>tkinter</code> ainsi que le module <code>ttk</code>, ce dernier proposant des options plus « modernes » : <syntaxhighlight lang="python"> import tkinter as tk from tkinter import ttk </syntaxhighlight> Voici un programme permettant comme précédemment de calculer le rapport de transmission d'un engrenage. Nous détaillons sa construction ci-après. <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: IUrapport.set(valeurZ2/valeurZ1) except: IUrapport.set("erreur") # ************************* # ************************* # ** Interface graphique ** # ************************* # ************************* # fenetre principale fenetre = tk.Tk() fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> '''Explications''' Nous commençons par définir la boîte de dialogue que nous appelons <code>fenetre</code> ; c'est un objet <code>Tk</code> et nous lui donnons un titre « » : <syntaxhighlight lang="python"> fenetre = tk.Tk() fenetre.title("Rapport de réduction") </syntaxhighlight> Puis, nous définissons un cadre attaché à cette fenêtre et qui va nous permettre « d'accrocher » les autres éléments, ce qui permet de garder une apparence satisfaisante lorsque l'on retaille la fenêtre : <syntaxhighlight lang="python"> cadre = ttk.Frame(fenetre) </syntaxhighlight> Le cadre va comporter six lignes ''({{lang|en|row}})'' et deux colonnes ''({{lang|en|column}})''. Nous allons placer une étiquette ''({{lang|en|label}})'' « z1 » : <code>text="z1"</code>. Cette étiquette se trouve dans une case du cadre, celle de la première colonne et la première ligne : <code>grid(column=1, row=1)</code>. Par rapport à cette case, elle est collée à « l'ouest » (W, ''{{lang|en|west}}'', gauche) de la case : <code>sticky=tk.W</code>. <syntaxhighlight lang="python"> z1_label = ttk.Label(cadre, text="z1") # Création de l'étiquette z1_label.grid(column=1, row=1, sticky=tk.W) # Placement de l'étiquette </syntaxhighlight> Notez que l'on aurait pu écrire directement : <syntaxhighlight lang="python"> ttk.Label(cadre, text="z1").grid(column=1, row=1, sticky=tk.W) </syntaxhighlight> mais le fait de séparer la création de l'élément et son placement facilite la maintenance (recherche d'erreur, évolution du code). Pour tout ce qui est dynamique, c'est-à-dire les zone de saisie des valeurs et l'affichage du résultat, il faut définir des « chaînes variables » ''({{lang|variable strings}})'' : <syntaxhighlight lang="python"> IUz1 = tk.StringVar() </syntaxhighlight> Cette variable est une variable globale à la création. Nous pouvons alors placer la zone de saisie ''({{lang|en|entry}})'' à côté de l'étiquette lui correspondant. Nous nommons la zone de saisie <code>z1_entry</code> : <syntaxhighlight lang="python"> z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) </syntaxhighlight> Nous faisons de même pour les trois autres paramètres de l'engrenage, ''m''<sub>1</sub>, ''z''<sub>2</sub> et ''m''<sub>2</sub>. Le résultat est également une chaîne variable globale. Par rapport à notre mise en page, elle se situe dans la case colonne 2 ligne 5, centrée sur cette case (collé à l'est et à l'ouest) : <syntaxhighlight lang="python"> rapport = tk.StringVar() rapport_dynamique = ttk.Label(cadre, textvariable=rapport) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) </syntaxhighlight> Il nous faut encore définir une fonction de manière classique, nous l'appelons « calcule ». Les variables étant globales, on les utilise directement. On récupère les valeurs avec la méthode <code>get()</code> et nous modifions la valeur avec la méthode <code>set()</code> : <syntaxhighlight lang="python"> def calcule(): valeurZ1 = float(IUz1.get()) valeurZ2 = float(IUz2.get()) IUrapport.set(valeurZ2/valeurZ1) </syntaxhighlight> Cette fonction est déclenchée lorsque l'on clique sur le bouton « Calcul » situé dans la case du cadre ligne 6 colonne 2 : <syntaxhighlight lang="python"> bouton = ttk.Button(cadre, text="Calcul", command=calcule) bouton.grid(column=2, row=6, sticky=tk.W) </syntaxhighlight> ou bien si l'on appuie sur la touche <code>[entrée]</code> du clavier : <syntaxhighlight lang="python"> fenetre.bind("<Return>", calcule) </syntaxhighlight> À tout ceci, nous ajoutons des « gouttières » (marges, ''{{lang|en|paddings}}'') afin d'espacer les éléments. Il faut ensuite « activer » la fenêtre pour qu'elle s'affiche. La méthode est <code>mainloop()</code> (boucle principale) : « boucle » (elle est active en permanence et attend des actions sur ses éléments), <syntaxhighlight lang="python"> fenetre.mainloop() </syntaxhighlight> Nous avons ci-dessus mis la plupart du code en programme principal. Nous pouvons aussi programmer de manière fonctionnelle, en mettant la plupart du code dans des fonctions ; cependant, pour que la fenêtre et les variables dynamiques soient globales à tout le programme, elles doivent être déclarées dans le programme principal. Nous pouvons aussi mêler la programmation orientée objet. {{boîte déroulante début|Calcul du rapport de transmission en programmation fonctionnelle et orientée objet}} <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # ************* # ************* # ** Classes ** # ************* # ************* class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): """Valeurs des attributs""" # instructions lancées lors de la déclaration self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z # ************************ # ************************ # ** Variables globales ** # ************************ # ************************ # fenetre principale fenetre = tk.Tk() # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: roue1 = pignon(valeurZ1, valeurM1) roue2 = pignon(valeurZ2, valeurM2) IUrapport.set(roue1.rapport(roue2)) except: IUrapport.set("Erreur") # *********************** # * Interface graphique * # *********************** def configureFenetre(): """Configuration de la fenêtre principale""" fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* configureFenetre() # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> {{boîte déroulante fin}} == Annotations == Une annotation est un commentaire qui sert à expliciter un type de variable. La syntaxe est différente des commentaires « classiques » : cela permet d'avoir un affichage différent avec les éditeurs de texte ayant une coloration syntaxique, et ces informations peuvent être récupérées par des logiciels extérieurs pour effectuer une documentation automatique ou bien des vérifications de type. Cependant : * comme les commentaires normaux, ils n'ont aucune influence lors de l'exécution du texte ; en particulier : * rien n'oblige à annoter les variables ; * il est possible d'avoir une variable ayant un type différent de son annotation ; le fait de pouvoir définir et changer le type de variable à la volée est une fonctionnalité fondamentale de Python. La syntaxe pour une annotation est : : nom_de_variable + deux-points + espace + type par exemple : <syntaxhighlight lang="python"> a: int </syntaxhighlight> Notez qu'ici, la variable n'est ''pas'' créée. Pour la créer, il faut lui affecter une valeur. Il est possible de l'affecter après ou bien sur la même ligne avec la syntaxe : : nom_de_variable + deux-points + espace + type + espace + égal + espace + valeur par exemple : <syntaxhighlight lang="python"> a: int a = 5 # est équivalent à a: int = 5 </syntaxhighlight> Même si l'annotation n'a pas d'impact sur l'exécution, le type doit être un type existant sinon cela génère une erreur de syntaxe. Les types classiques sont : : <code>int</code> — <code>float</code> — <code>str</code> — <code>bool</code> — <code>list</code> — <code>tuple</code> — <code>dict</code> Il est également possible de mettre une chaîne de caractères : <syntaxhighlight lang="python"> a: "ce que je veux" = 3.1516 </syntaxhighlight> On peut annoter une fonction. Il est possible d'annoter les variables déclarées au sein de la fonction, mais pas les variables globales (puisqu'elle ne sont pas définie au sein de la fonction). On peut aussi annoter : * les variables passées en paramètre, avec la même syntaxe dans les parenthèses ; * annoter le type de la variable de sortie (retournée) en la faisant précéder de <code>-&gt;</code> : <syntaxhighlight lang="python"> def plusCinq(a: float = 0) -> float: return a + 5 </syntaxhighlight> ; Ressources * {{lien web | url = https://www.python.org/dev/peps/pep-0526/ | titre = PEP 526 -- Syntax for Variable Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} * {{lien web | url = https://www.python.org/dev/peps/pep-3107/ | titre = PEP 3107 -- Function Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} == Décorateur == Un décorateur est une fonction qui s'applique à une fonction, à la manière de la composition mathématique ''g'' ∘ ƒ = ''g''(ƒ). Mais cette composition affecte la fonction elle-même ; l'utilisateur appelle la fonction ƒ mais c'est la fonction ''g'' ∘ ƒ qui s'exécute. Cette fonction ''g'' est appelée le décorateur. L'intérêt est de pouvoir modifier une fonction sans modifier le code de la fonction elle-même. Pour appliquer une décoration, il faut : # Déclarer le décorateur : une fonction qui s'applique à une autre fonction. # Affecter le décorateur à la fonction visée : en mettant <code>@''décoration''</code> juste avant la définition de la fonction. Par exemple : <syntaxhighlight lang="python"> def decorateur(f): print("Avant la fonction") f() print("après la fonction") @decorateur def afficheFoo(): print("Foo.") afficheFoo # Avant la fonction # Foo. # Après la fonction </syntaxhighlight> Lorsque l'on appelle <code>afficheFoo</code>, on appelle en fait <code>decorateur(afficheFoo)</code>. Si la fonction à modifier admet des paramètres, il faut définir une fonction enveloppante dans le décorateur. Par exemple, nous définissons ci-dessous un décorateur <code>deuxFois()</code> qui fait s'exécuter deux fois de suite la fonction : <syntaxhighlight lang="python"> def deuxFois(f): def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # conteneurFonction </syntaxhighlight> Nous voyons que l'application du décorateur a modifié le nom de la fonction — pas le nom de la variable qui contient la fonction mais bien son nom « intime ». Pour éviter cela, on utilise la méthode <code>wraps()</code> du module <code>functools</code> : <syntaxhighlight lang="python"> import functools def deuxFois(f): @functools.wraps(f) def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # plusCinq </syntaxhighlight> On peut par exemple utiliser un décorateur pour la mémoïsation. La mémoïsation est une méthode consistant à mémoriser les valeurs d'une fonction au fur et à mesure de son utilisation ; ainsi, si l'on veut évaluer la fonction avec les mêmes entrées, on se contente d'aller chercher la valeur enregistrée ce qui est plus rapide. On sacrifie donc la place mémoire au profit de la rapidité. On peut trouver des décorateurs de mémoïsation aux adresses suivantes : * https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize * https://gist.github.com/robcowie/1357800 ; Ressources : {{lien web | url = https://www.python.org/dev/peps/pep-0318/ | titre = PEP 318 -- Decorators for Functions and Methods | site = Python.org | lang = en | consulté le = 2019-04-05 }} == Manipulation de fichiers == === Importer le contenu d'un fichier === Python possède la fonction <code lang="python">open()</code> qui permet d'ouvrir un fichier. Ouvrir signifie qu'il crée un objet de type <code>file</code> qui possède notamment les méthodes <code lang="python">read()</code> et <code lang="python">write()</code>. Il peut s'agir d'un objet de type « fichier binaire » ''({{lang|en|binary file}})'' ou « fichier texte » ''({{lang|en|text file}})''. Si par exemple on veut utiliser (et donc lire) le contenu du fichier texte <code>monfichier.txt</code>, on écrit : <syntaxhighlight lang="python"> fichier = open("monfichier.txt", "rt") … fichier.close() </syntaxhighlight> Le paramètre <code>"rt"</code> signifie que nous ouvrons le fichier en lecture ''({{lang|en|read}})'' et qu'il s'agit d'un objet de type fichier texte. Notons deux choses : * en faisant cela, nous ne faisons qu'associer le fichier à un objet Python, nous n'avons pas encore importé les données ; * si nous ouvrons le fichier, il faut le fermer par la suite ; c'est pourquoi nous utilisons la méthode <code lang="python">.close()</code>. Pour éviter d'avoir à fermer le fichier, nous pouvons l'ouvrir au sein d'un contexte : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: … </syntaxhighlight> Notons aussi que la chaîne de caractères indiquant le nom du fichier peut contenir le chemin d'accès au répertoire (dossier), mais sous Microsoft Windows, il faut utiliser des barres de fractions <code>/</code> pour séparer les sous-répertoires au lieu de la barre inversée habituelle, par exemple : <syntaxhighlight lang="python"> chemin = "C:/Temp/monfichier.txt" with open(chemin, "rt") as fichier: … </syntaxhighlight> Pour mettre les données du fichier dans la variable <code>contenu</code>, nous écrivons donc : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() print(contenu) </syntaxhighlight> et si nous ne voulons lire que les <code>n</code> premiers caractères (<code>n</code> étant un entier), nous utilisons <code lang="python">contenu = fichier.read(n)</code>. Cette lecture est séquentielle, c'est-à-dire que si nous appliquons la méthode plusieurs fois, nous reprenons la lecture là où nous l'avons laissée. Si nous voulons lire une ligne, nous utilisons la méthode <code lang="python">.readline()</code>. La lecture ligne par ligne est également séquentielle. Nous pouvons aussi créer une liste dont chaque élément est une ligne du fichier ; nous utilisons alors la méthode <code lang="python">.readlines()</code> (notez le pluriel). Chaque élément de la liste se termine par le caractère de fin de ligne <code lang="python">\n</code>. Pour l'enlever, nous pouvons utiliser la méthode <code lang="python">.rstrip()</code> pour chaque élément de la liste, par exemple. L'exemple complet est alors : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.readlines() contenu = [item.rstrip() for item in contenu] print(contenu) </syntaxhighlight> === Exporter du contenu vers un fichier === Si nous voulons créer un fichier texte pour y mettre le contenu de la variable <code>texte</code>, alors nous utilisons : <syntaxhighlight lang="python"> with open("monfichier.txt", "wt") as fichier: contenu = fichier.write(texte) </syntaxhighlight> Le module principal important pour la manipulation de fichiers est est <code lang="python">os</code>. === Exploiter le contenu d'un fichier texte === Avec un fichier texte, la méthode <code lang="python">.read()</code> crée une variable de type texte. Nous pouvons séparer cette variable en différentes lignes avec la méthode <code lang="python">.splitlines()</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une ligne. Si maintenant une ligne contient plusieurs données séparées par un séparateur commun, par exemple un espace, nous pouvons séparer les données par la méthode <code lang="python">.split(''séparateur'')</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une donnée. Si par exemple le fichier est du type CSV ''({{lang|en|comma separated values}}'', valeurs séparées par une virgule), l'exploitation du fichier est : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(",") for item in contenu] </syntaxhighlight> La variable <code>contenu</code> est une liste de listes. Pour avoir la ''n''<sup>e</sup> valeurs de la ''m''<sup>e</sup> ligne, on utilise : <syntaxhighlight lang="python"> contenu[m-1][n-1] </syntaxhighlight> Si l'on veut extraire la ligne ''m'' il suffit d'écrire : <syntaxhighlight lang="python"> contenu[m-1] </syntaxhighlight> mais si l'on veut la colonne ''n'', le plus simple est d'utiliser une définitipon en compréhension : <syntaxhighlight lang="python"> [ligne[n-1] for ligne in contenu] </syntaxhighlight> Dans certains fichiers CSV, les séparateurs de valeurs ne sont pas des virgules, on peut donc utiliser un autre caractère pour le séparateur. Si le séparateur est une tabulation, on utilise <code lang="python">\t</code> : <code lang="python">contenu = [item.split("\t") for item in contenu]</code> Si la première ligne contient les en-têtes des colonnes, on peut l'enlever avec la fonction <code lang="python">del()</code> : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() del(contenu[0]) contenu = [item.split(",") for item in contenu] </syntaxhighlight> Certains logiciels créent des fichiers en utilisant le séparateur décimal régional, qui en France est la virgule. Pour remplacer les virgules par des points, on peut utiliser la méthode <code lang="python">.replace()</code>, de préférence ''avant'' de séparer les valeurs : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.replace(",", ".") for item in contenu] # remplace les virgules par des points contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule </syntaxhighlight> en effet, lorsque l'on a séparé les valeurs, on a une liste de liste, il faut alors balayer les sous-listes ce qui prend plus de temps : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule contenu = [[subitem.replace(",", ".") for subitem in item] for item in contenu] # remplace les virgules par des points </syntaxhighlight> '''Exemple complet''' Supposons que l'on ait un fichier texte de la forme : <syntaxhighlight lang="text"> x y z V 0.0 1.5 3.2 8.657 0.4 1.5 3.2 8.392 0.2 1.5 3.2 8.485 ... </syntaxhighlight> C'est un fichier valeurs V associées à des points de coordonnées ''(x, y, z)'' (un champ V sur l'espace, donc). Nous remarquons que seule la coordonnée ''x'' change : les données concernent la droite (''y'' = 1,5 ; ''z'' = 3,2). Nous remarquons aussi que les valeurs de ''x'' ne sont pas classées par ordre croissant ni décroissant. Nous voulons au final avoir une matrice [[''x''], [V]] triée par ''x'' croissant. Pour cela, nous pouvons faire : <syntaxhighlight lang="python"> with open(nomdefichier, "rt") ad fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(" ") for item in contenu contenu = contenu[1:] # élimine la première ligne x = np.array([float(ligne[0]) for ligne in contenu]) V = np.array([float(ligne[3]) for ligne in contenu]) donnees = np.concatenate((x.reshape(-1, 1), V.reshape(-1, 1)), axis=1) # matrice [[x], [V]] ind = np.argsort(donnees[:, 0]) donnees = donnees[ind, :] # matrice triée plt.plot(donnees[:, 0], donnees[:, 1]) </syntaxhighlight> {{note|Pour le tri, voir [[../Manipulation_de_matrices#Fonctions_et_méthodes_de_base|''Manipulation de matrices'' &gt; ''Fonctions et méthodes de base'']].}} === Cas d'un fichier CSV === Si le fichier CSV ne contient que des valeurs numériques, on peut utiliser : <syntaxhighlight lang="python"> valeurs = np.loadtxt(chemin+nomfic, delimiter=",") # si le séparateur est une virgule </syntaxhighlight> Il existe un module <code lang="python">csv</code> dédié aux fichiers CSV. La manipulation du fichier se fait comme suit : <syntaxhighlight lang="python"> import csv with open(chemin+nomfic, "rt") as fichier: lecteur = csv.reader(fichier, delimiter=",") contenu = [ligne for ligne in lecteur] print(contenu) </syntaxhighlight> === Utilisation de Pandas === Pandas<ref>https://pandas.pydata.org/</ref> est un module gérant les tableaux de données, appelés <em lang="en">data frames</em>. Voici quelques commandes utiles : <syntaxhighlight lang="python"> import numpy as np import pandas as pd M = np.random.rand(10, 10) # crée une matrice NumPy aléatoire de dimension 10 × 10 tableau = pd.DataFrame(M) # transforme la matrice en tableau DataFrame tableau.to_csv("tableau.csv") # enregistre le tableau dans un fichier CSV donnees = pd.read_csv("tableau.csv").to_numpy() # lit le fichier et transforme le tableau DataFrame en matrice NumPy </syntaxhighlight> == Exporter un programme Python == Vous pouvez créer un fichier « Python pur » <code>.py</code>. Pour cela, dans le menu <code>fichier/file</code> de Jupyter, choisir <code>télécharger/download</code> au format <code>.py</code> ; le fichier se trouve alors dans le répertoire de téléchargement du navigateur. == Ressources == * {{lien web | url = https://www.python.org/dev/peps/pep-0008/ | titre = PEP 8 -- Style Guide for Python Code | site = Python documentation | consulté le = 2019-03-14 }} == Notes et références == {{références}} ---- [[../Fonctions mathématiques générales|Fonctions mathématiques générales]] &lt; [[../|↑]] &gt; [[../Graphiques|Graphiques]] {{DEFAULTSORT:Elements de programmation}} [[Catégorie:Python pour le calcul scientifique (livre)]] kzbjjrqzngmgb5mhquu7gryii44p8lt 767318 767317 2026-06-02T13:00:29Z Cdang 1202 /* Substitution de variables */ exemple de mise en oeuvre 767318 wikitext text/x-wiki Rappel : les programmes commencent par : <syntaxhighlight lang="python"> #!/usr/bin/python3 import numpy as np import matplotlib.pyplot as plt </syntaxhighlight> == Entrées et sorties == Pour permettre à l'utilisateur ou à l'utilisatrice d'entrer une valeur, nous utilisons la fonction <code lang="python">input()</code> comme évoqué précédemment (chapitre ''[[../Premiers programmes|Premiers programmes]]''), avec la syntaxe <code lang="python">''variable'' = input(''texte'')</code>. Notez que la valeur renvoyée par <code lang="python">input()</code> est une chaîne de caractères. Si vous voulez autre chose, typiquement un nombre, il faut convertir cette chaîne. Par exemple, nous demandons ici d'entrer une longueur sous la forme d'une valeur numérique : <syntaxhighlight lang="python"> longueurDefaut = 10.0 texteDemandeLongueur = f"Veuillez entrer la longueur en millimètres (valeur par défaut {longueurDefaut} mm) : " longueur = input(texteDemandeLongueur) if longueur=="": longueur=longueurDefaut else: longueur=float(longueur) print(longueur) </syntaxhighlight> Pour afficher un texte, on utilise la fonction <code lang="python">print()</code>, également présentée dans le chapitre ''[[../Premiers programmes|Premiers programmes]]'', avec la syntaxe <code lang="python">print(''texte'')</code>. Le texte à afficher peut être de n'importe quel type (entier, réel en virgule flottante, booléen, chaîne de caractères…) mais si l'on veut « mélanger » les types, il faut tout convertir en chaînes de caractères, avec la fonction <code lang="python">str()</code>, et concaténer les chaînes avec <code lang="python">+</code>. Par exemple : <syntaxhighlight lang="python"> print("La longueur vaut : "+str(longueur)+" mm.") </syntaxhighlight> Nous pouvons aussi utiliser une « chaîne “f” » ''({{lang|en|f-string}})'' : on met un le <code lang="python">f</code> devant le guillemet ouvrant et dans la chaîne, on met un champ sous la forme <code lang="python">{''nomDeVariable''}</code>. L'exemple ci-dessus devient alors : <syntaxhighlight lang="python"> print(f"La longueur vaut : {longueur} mm.") </syntaxhighlight> Les chaînes « f » sont détaillées dans la section ''[[#Chaînes de caractères|Chaînes de caractères]]'' ci-dessous. Si l'on veut introduire un retour à la ligne dans la chaîne, on utilise les caractères <code lang="python">\n</code> (contre-oblique suivie de la lettre N minuscule). Par exemple <syntaxhighlight lang="python"> print("Ceci est un texte\navec un retour à la ligne.") </syntaxhighlight> == Types de variables == === Généralités === Python définit « tout seul » le type de la variable : « <code>3</code> » sera un entier ''({{lang|en|integer}})'', « <code>3.0</code> » sera un réel à virgule flottante ''({{lang|en|float}})'', « <code>"3"</code> » sera une chaîne de caractères ''({{lang|en|string}})''. On peut connaître le type d'une variable avec la fonction <code>type()</code>. On peut tester certaines valeurs, avec le module <code>NumPy</code> : * <code>np.isnan(x)</code> indique si les valeurs de ''x'' sont des NaN ''({{lang|en|not a number}})'' ; si ''x'' est une matrice, le résultat est une matrice de booléens, l'élément [''i'', ''j''] est <code>True</code> si <code>x[i, j]</code> est un NaN ; * <code>np.isinf(x)</code> indique si les valeurs de ''x'' sont ±∞ ; si ''x'' est une matrice, le résultat est une matrice booléenne de même dimension. On peut forcer un type : * <code>int(x)</code> : transforme la valeur ''x'' en nombre entier ; * <code>long(x)</code> : " en entier long (précision illimitée) ; * <code>float(x)</code> : " en nombre réel à virgule flottante ; * <code>str(x)</code> : " en chaîne de caractères ; * <code>complex(Re, Im)</code> : crée le nombre complexe ''Re'' + ''Im''·j, j désignant la racine carrée de –1 ; * <code>list()</code> : crée une liste ; * <code>tuple()</code> : crée un n-uplet. Par exemple <syntaxhighlight lang="python"> type(3) # <class 'int'> type(float(3)) # <class 'float'> complex(1, 1) == 1 + 1j # True list("blabla") # ['b', 'l', 'a', 'b', 'l', 'a'] </syntaxhighlight> Python distingue plusieurs genres de types : * Un itérable est un objet dont on peut extraire les éléments un par un ; ce sont les objets pour lesquels on peut écrire <code> for i in ''iterable'':</code>. Il s'agit essentiellement des listes, n-uplets, chaînes de caractères, ensembles, dictionnaires et fichiers. * Un modifiable ''({{lang|en|mutable}})'' est un objet que l'on peut modifier ; par exemple une liste est modifiable — on peut changer la valeur d'un élément, en ajouter ou en enlever un — mais les n-uplets non, pas plus qu'une chaîne de caractères ou un nombre. * Un identifiable (''{{lang|en|hashable}}'', le ''{{lang|en|hashage}}'' étant une signature caractéristique d'un objet) : objet possédant un identifiant unique. Un objet identifiable est toujours non-modifiable ''({{lang|en|unmutable}})''. === Types numériques === ==== Entiers ==== Nous pouvons définir les entiers au format octal ou hexadécimal : il faut débuter le nombre par respectivement <code>0o</code> (le chiffre zéro et la lettre o) et <code>0x</code> (le chiffre zéro et la lettre x). À l'inverse, la fonction <code>hex()</code> renvoie une chaîne correspondant à l'écriture d'un entier au format hexadécimal, et <code>oct()</code> renvoie la chaîne correspondant à l'éciture en octal. Par exemple : <syntaxhighlight lang="python"> print(0o10, ";", 0x10) # 8 ; 16 print(hex(20)) # 0x14 </syntaxhighlight> ==== Réels ==== Les réels disposent de fonctions spécifiques appelées « méthodes ». Une méthode est une fonction spécifique à un type d'objets. Étant conçue ''ad hoc'', elle est souvent plus économe en ressource et en temps qu'une fonction générique. Pour appliquer la méthode <code>meth()</code> à la variable <code>x</code>, on écrit : <code>x.meth()</code>. Nous avons déjà présenté la méthode <code>''float''.as_integer_ration()</code> qui donne la fraction réduite égale à la valeur du nombre. Les réels disposent de plusieurs autres méthodes : * <code>''float''.trunc()</code> : tronque le nombre réel ; * <code>''float''.floor()</code>, <code>''float''.ceil()</code> : renvoie l'entier le plus proche, respectivement inférieur ou supérieur ; * <code>''float''.hex()</code> : renvoie une chaîne de caractères correspondant à l'écriture du nombre en hexadécimal. Par exemple : <syntaxhighlight lang="python"> a = 20. print(a.hex()) # 0x1.4000000000000p+4 print(10..hex()) # 0x1.4000000000000p+3 </syntaxhighlight> Dans le deuxième exemple, nous appliquons la méthode <code>''float''.hex()</code> directement au nombre <code>10.</code> ; le point est obligatoire car sinon, c'est un entier, pour lequel la méthode n'est pas définie. Notez que la ''méthode'' <code>''float''.hex()</code> est différentes de la ''fonction'' <code>hex()</code> : la première concerne les réels, la seconde les entiers. ==== Complexes ==== Nous avons déjà mentionné la méthode <code>''complex''.conjugate()</code> qui donne le conjugué du nombre. Un nombre complexe dispose de deux attributs : * <code>''complex''.real</code> : sa partie réelle ; * <code> ''complex''.imag</code> : sa partie imaginaire. Par exemple : <syntaxhighlight lang = "python"> a = 5+2j print(a.conjugate(), ";", a.real, ";", a.imag) # (5-2j) ; 5.0 ; 2.0 </syntaxhighlight> === Chaînes de caractères === ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/inputoutput.html | titre = 7. Input and Output | site = Python Documentation | consulté le = 2019-04-06 }} ==== Généralités ==== Il existe en fait trois manières de définir une chaîne de caractères : * avec des guillemets simples ou doubles comme vu précédemment : <code>"…"</code> ou bien <code>'…'</code> ; * avec trois guillemets doubles : <code>"""…"""</code> : cela permet d'avoir une chaîne de caractères s'étendant sur plusieurs lignes, les retours de ligne étant pris en compte ; c'est utilisé en particulier pour la description des fonctions (''{{lang|en|docstrings}}'', voir ci-après) ; * avec des guillemets précédés d'un « r », <code>r"…"</code> ou <code>r'…'</code> : cela permet d'interpréter les barres de fraction inverses « \ » comme un caractère « normal » et non comme un caractère d'échappement (voir ci-après) ; cela est utile lorsque l'on utilise les possibilités LaTeX dans le tracé de graphiques (voir plus loin) ; * avec des guillemets précédés d'un « f », <code>f"…"</code> ou <code>f'…'</code> : cela permet d'utiliser des variables formatées (voir ci-après). Une chaîne de caractères n'est pas modifiable. Si l'on veut remplacer un caractère, l'insérer ou le supprimer, il faut transformer la chaîne en liste, avec la commande <code>list()</code>, puis rassembler la liste en la joignant ''({{lang|en|join}})'' à une chaîne vide : <syntaxhighlight lang="python"> chaine = "blabla" chaineList = list(chaine) chaineList[2] = "c" chaine = "".join(chaineList) print(chaine) # blcbla </syntaxhighlight> Dans une chaîne simple <code>"…"</code> ou <code>'…'</code>, on peut introduire un retour à la ligne avec <code>\n</code>. ==== Substitution de variables ==== Lorsque l'on veut utiliser des variables, on fait précéder les guillemets d'un « f » et l'on écrit les noms de vrariables entre accolades. Par exemple : <syntaxhighlight lang="python"> monde = "world" chaine = f"Hello {monde}!" print(chaine) # Hello world! </syntaxhighlight> On peut indiquer la taille de la chaîne générée à partir de la variable sous la forme <code>{nomVariable:taille}</code>, la taille étant un entier. Par exemple : <syntaxhighlight lang="python"> chiffre1 = 1 nom1 = "un" chiffre2 = 2 nom2 = "deux" chaine = f"{nom1:5} : {chiffre1:5d}\n{nom2:5} : {chiffre2:5d}" print(chaine) # un : 1 # deux : 2 </syntaxhighlight> Vous remarquez que l'on ajoute un « d » pour les entiers décimaux, et que les nombres sont alignés à droite. Si le nombre est un nombre réal à virgule flottante ''({{lang|en|float}})'', on peut indiquer le nombre de décimales sous la forme <code>.''n''f</code> : <syntaxhighlight lang="python"> chaine = f"{np.pi:.5f}" print(chaine) # 3.15169 </syntaxhighlight> Avec la syntaxe <code>''m''.''n''f</code>, on indique également que la totalité du nombre doit occuper ''m'' caractères. Pour convertir un nombre en caractère Unicode correspondant, on utilise la lettre c : <syntaxhighlight lang="python"> nompi = 0x03c0 # Caractère Unicode π : U+03C0 chaine = f"{nompi:c} = {np.pi:.5f}" print(chaine) # π = 3.14159 </syntaxhighlight> La classe ''str'' dispose également de la méthode <code>.format()</code>. On indique un n-uplet de chaînes (ou de nombres) à la méthode et l'on met des accolades dans la chaîne principale ; les accolades sont remplacées dans l'ordre des chaînes de la méthode. On peut changer l'ordre en indiquant quelle valeur utiliser dans quelle accolade. Par exemple : <syntaxhighlight lang="python"> chaine1 = "On compte {} puis {}".format(1, 2) chaine2 = "On compte {0} puis {1}. Mais à rebours, on compte {1} puis {0}.".format("un", "deux") print(chaine1, "\n", chaine2) # On compte 1 puis 2 # On compte un puis deux. Mais à rebours, on compte deux puis un. </syntaxhighlight> L'utilisation du caractère pourcent « % » permet d'utiliser la mise en forme <code>sprintf()</code> du langage C : <syntaxhighlight lang="python"> chaine = "π = %.5f" % np.pi print(chaine) # π = 3.14159 </syntaxhighlight> ; Exemple <nowiki>:</nowikI> barre de progression : Voici une fonction affichant une barre de progression, pour la ''i''-ème étape d'un processus ayant ''n'' étapes (pour la notion de fonction, voir la section ci-après ''[[#Fonction|Fonction]''). <syntaxhighlight lang="Python"> def barre_progression(i, n, largeur=40): """ Affiche une barre de progression Entrées : — i : étape en cours, entier ; — n : nombre d'étapes à réaliser, entier ; — largeur : nombre de caractères total de la barre, entier. Sortie : affichage de la barre de progression. """ taux = i/n fait = int(largeur * taux) barre = f"{0x2588:c}"*fait + f"{0x00b7:c}" * (largeur - fait) # U+2588 : bloc "█" ; U+00B7 : point médian "·" print(f"Progression | {barre} | {100*taux:3.1f} %") barre_progression(25, 100) # Progression | ██████████······························ | 25.0 % </syntaxhighlight> ==== Méthodes des chaînes ==== Le type ''str'' dispose d'un certain nombre de méthodes. Nous avons déjà vu les méthodes <code>''str''.join()</code> et <code>''str''.format()</code>, en voici quelques autres : * <code>''str''.capitalize()</code> : met le premier caractère en capitale (majuscule) et les autres en minuscule ; * <code>''str''.lower()</code> : met tout en minuscules ''({{lang|en|lowercase}})'' ; * <code>''str''.upper()</code> : met tout en capitales ''({{lang|en|lowercase}})'' ; * <code>''str''.center(''n'')</code> : met la chaîne au centre d'une chaîne de longueur ''n'', en complétant avec des espaces ; on peut compléter avec d'autres caractères avec <code>''str''.center(''n'', ''c'')</code>, par exemple <code>"a".center(7, ".")</code> donne <code>"....a...."</code> ; * <code>''str''.ljust(''n'', ''c'')</code> et <code>''str''.rjust(''n'', ''c'')</code> : comme <code>.center()</code> mais la chaîne est respectivement alignée au fer à gauche ''({{lang|en|left}})'' et à droite ''({{lang|en|right}})'' ; * <code>''str''.isdigit()</code> : booléen vrai si tous les caractères sont des nombres ; * <code>''str''.find(''sous-chaine'')</code>, <code>''str''.rfind(''sous-chaine'')</code> : indique respectivement le premier emplacement et le dernier emplacement de la sous-chaîne dans la chaîne ; * <code>''str''.partition(''séparateur'')</code> : retourne un triplet avec la portion de chaîne avant le séparateur, le séparateur puis la portion de chaîne après le séparateur ; * <code>''str''.replace(''ancien'', ''nouveau'')</code> : remplace la chaîne ''ancien'' par la chaîne ''nouveau'' dans la chaîne ; * <code>''str''.split(''séparateur'')</code> : découpe la chaîne au niveau des séparateurs et renvoie une liste. ==== Autres fonctions ==== La fonction <code>chr()</code> transforme un code Unicode en caractère. Par exemple, <code>chr(97)</code> donne <code>"a"</code> et <code>chr(0x03c0)</code> donne <code>"π"</code>. Si on veut créer une liste de caractères qui se suivent, on peut par exemple utiliser : <syntaxhighlight lang="python"> [chr(x) for x in range(97, 102)] # ['a', 'b', 'c', 'd', 'e'] </syntaxhighlight> Si on veut créer une liste de nombres sous la forme de chaînes de caractères, on peut utiliser la commande <code>str()</code> vue ci-dessus. Par exemple : <syntaxhighlight lang="python"> [str(x) for x in range(1, 6)] # ['1', '2', '3', '4', '5'] </syntaxhighlight> Pour la syntaxe, voir ci-dessous la section [[#Définition en compréhension|''Définition en compréhension'']]. == Manipulation de listes == Les listes sont une structure de données fondamentale en Python. ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/datastructures.html | langue = en | titre = 5. Data structures | site = Python documentation | consulté le = 2019-03-16 }} === Copie d'une liste === Contrairement à d'autres types, lorsque vos écrivez <code>b = a</code> avec des listes, vous ne créez pas une copie de la variable <code>a</code>, vous créez un ''alias'' : l'objet <code>b</code> est un autre nom de l'objet <code>a</code>. En particulier, si vous modifiez <code>b</code>, vous modifiez en fait <code>a</code>. Par exemple : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a b[2] = 5 print(a, b) # [1, 2, 5, 4] [1, 2, 5, 4] </syntaxhighlight> Si l'on veut créer une copie de <code>a</code>, il faut utiliser <code>a[:]</code> ou bien <code>a.copy()</code> : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a[:] c = a.copy() b[2] = 5 c[2] = 6 print(a, b, c) # [1, 2, 3, 4] [1, 2, 5, 4] [1, 2, 6, 4] </syntaxhighlight> === Méthodes de listes === Pour modifier une liste, vous disposez des méthodes suivantes : * <code>a.append(x)</code> : ajoute l'élément <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.extend(x)</code> : ajoute la liste <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.append(i, x)</code> : aoute l'élément <code>x</code> ''avant'' l'interstice ''i'' de la liste <code>a</code> ; * <code> x = a.pop(i)</code> : enlève l'élément ''i'' de la liste <code>a</code> et le met dans la variable <code>x</code> ; <code> x = a.pop()</code> enlève le dernier élément de la liste ; * <code>a.clear()</code> : vide la liste <code>a</code> ; * <code>a.sort()</code> : trie la liste par ordre croissant ; * <code>a.sort(reverse = True)</code> : trie par ordre décroissant ; * <code>a.reverse()</code> : inverse l'ordre de <code>a</code>. Pour supprimer l'élément à l'indice ''i'', au lieu d'utiliser <code>a.pop(i)</code>, on peut aussi utiliser <syntaxhighlight lang="python"> del(a[i]) </syntaxhighlight> Pour trier une liste, on peut aussi utiliser la fonction <code>sorted()</code>, ce qui permet par exemple de conserver la liste originale, non triée : <code>b = sorted(a)</code>. La fonction <code>sorted()</code> fonctionne avec tous les objets « itérables » comme par exemple une chaîne de caractères : <syntaxhighlight lang="python"> a = "ahjbfk" print(sorted(a)) # ['a', 'b', 'f', 'h', 'j', 'k'] </syntaxhighlight> Pour mettre en évidence la performance de la méthode <code>''list''.sort()</code> par rapport à la fonction générique <code>sorted()</code> : <syntaxhighlight lang="python"> import numpy as np import time a = np.random.rand(int(1e7)) t1 = time.perf_counter() b = sorted(a) # Fonction générique t2 = time.perf_counter() a.sort() # Méthode spécifique t3 = time.perf_counter() print("Sorted :", t2-t1, " s ; .sort :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # Sorted : 14.2... s ; .sort : 1.1... s ; rapport : 12.6... </syntaxhighlight> Par rapport à une valeur donnée : * <code>a.remove(x)</code> : retire la première occurrence de la valeur <code>x</code> de la liste <code>a</code> ; * <code>a.index(x)</code> : indique l'indice où se trouve la première occurrence de la valeur <code>x</code> ; * <code>a.count(x)</code> : indique le nombre de fois que l'on trouve la valeur <code>x</code> dans la liste <code>a</code>. === Définition en compréhension === La [[w:fr:Liste en compréhension|définition en compréhension]] ''({{lang|en|list comprehension}})'' est une méthode permettant de construire des listes en indiquant simplement des axiomes, des consignes de filtrage. Cette méthode est élégante car proche de la notation mathématique et compacte, mais c'est une méthode itérative donc lente par rapport à une méthode vectorisée fournie par le module NumPy. Par exemple, pour créer la liste des carrés des nombres entiers entre 0 et 9, il suffit d'écrire <syntaxhighlight lang="python"> carre = [x**2 for x in range(10)] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x^2 | x \in [0 ; 9] \}</math>. Si l'on veut la liste des nombres strictement inférieurs à 20 dont le carré est supérieur à 10, on peut écrire : <syntaxhighlight lang="python"> X = [x for x in range(20) if x**2 > 10] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x | x \in [0 ; 19], x^2 > 10 \}</math>. Pour mettre en évidence la performance du calcul vectorisé par rapport à la méthode itérative : <syntaxhighlight lang="python"> import time import numpy as np n = int(1e7) # taille de la liste t1 = time.perf_counter() carre = [x**2 for x in range(n)] # Définition en compréhension t2 = time.perf_counter() carre2 = np.arange(n)**2 # Calcul vectorisé t3 = time.perf_counter() print("En compréhension : ", t2-t1, "s ; vectorisé :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # En compréhension : 4.515... s ; vectorisé : 0.156... s ; rapport : 28.982... </syntaxhighlight> == Structure d'un programme == Un programme est simplement une suite d'instructions. Dans les environnements Unix BSD, un programme Python peut être considéré comme un script c'est-à-dire qu'il suffit de taper son nom dans l'invite de commande ''({{lang|en|shell}})'' sans avoir à invoquer <code>python</code>. Le programme doit alors commencer par un en-tête normalisé surnommé ''{{lang|en|[[wikt:shebang|shebang]]}}'' : <syntaxhighlight lang="python"> #!/usr/bin/env python3 </syntaxhighlight> Ce ''{{lang|en|shebang}}'' est inutile avec Jupyter. L'en-tête peut également contenir la description de l'encodage du fichier texte, typiquement : <syntaxhighlight lang="python"> # coding: utf-8 </syntaxhighlight> Le codage UTF-8 est le codage par défaut pour Python 3, il est donc inutile de l'indiquer. Les commentaires sont introduits par le croisillon <code>#</code>. On peut grouper une suite d'instructions dans un bloc. Un bloc d'instructions commence par deux-points « <code>:</code> » et est identé, c'est-à-dire qu'il a une marge constituée de quatre espaces — on peut aussi utiliser une tabulation mais il ne faut pas mélanger les deux méthodes ; les tabulations sont déconseillées, il vaut mieux utiliser quatre espaces<ref>{{lien web | url = https://www.python.org/dev/peps/pep-0008/#tabs-or-spaces | titre = Tabs or Spaces? | site = Python documentation | consulté le = 2019-03-14 }}</ref>. Pour terminer le bloc, il suffit simplement de revenir en début de ligne ; contrairement à d'autres langages, il n'y a pas de commende de fin ''({{lang|en|end}})'', c'est l'indentation qui définit le bloc. : # début du bloc ''instruction 1'' ''instruction 2'' … ''dernière instruction du bloc'' ''instruction hors bloc'' Par exemple, une exécution conditionnelle <code>if</code> ou une boucle <code>for</code> exécute un bloc d'instruction. Si l'on a besoin d'un bloc d'instruction qui « ne fait rien », on utilise l'instruction <code>pass</code>. == Structures de contrôle == '''Boucle itérative''' La boucle itérative s'écrit : <syntaxhighlight lang="python"> for <variable> in <itérable>: <bloc d’instructions> </syntaxhighlight> Si l'on veut que la variable prenne ''n'' valeurs de 0 à ''n'' – 1, on utilise l'instruction <code>range()</code> : <syntaxhighlight lang="python"> for i in range(5): print(i) print("Fin de la boucle") </syntaxhighlight> <code>[▶]</code> 0 1 2 3 4 Fin de la boucle En fait, la commande <code>range()</code> extrait des valeurs de l'ensemble des nombres entiers ; on peut ainsi utiliser le découpage en tranches, par exemple <code>range(2, 5)</code>pour avoir la « liste » <code>[2, 3, 4]</code>. Notez que <code>range()</code> ne crée pas à proprement parler une liste, cela crée un objet de type ''« {{lang|en|range}} »'' (plage, intervalle) ; pour avoir une liste, il faut écrire <code>list(range(n))</code>. Dans une boucle, la commande <code>continue()</code> saute la fin du bloc d'instruction et passe à la valeur suivante de la boucle. La commande <code>break()</code> interrompt la boucle et passe à la suite. '''Exécution conditionnelle''' L'exécution conditionnelle s'écrit : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> </syntaxhighlight> On peut utiliser les commandes <code>elif</code> ''(else if'') et <code>else</code> : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> elif <booléen>: <bloc d’instructions> else: <bloc d’instructions> </syntaxhighlight> Notez que le test d'une condition est gourmand en ressources. S'il s'agit de savoir si l'on effectue une opération mathématique simple ou pas, on peut remplacer le test par une multiplication par un booléen (<code>True</code> vaut 1, <code>False</code> vaut 0). Par exemple, plutôt que d'écrire <syntaxhighlight lang="python"> if a > 0: b = b - c </syntaxhighlight> mieux vaut écrire : <syntaxhighlight lang="python"> b = b - (a > 0)*c </syntaxhighlight> '''Boucle antéconditionnée''' La boucle antéconditionnée s'écrit : <syntaxhighlight lang="python"> while <booléen>: <bloc d’instructions> </syntaxhighlight> Cette boucle peut contenir des instructions <code>continue()</code> et <code>break()</code>. == Fonction == La déclaration d'une fonction utilise la commande <code>def</code>. La fonction est un bloc d'instructions. Si elle doit renvoyer des valeurs, on utilise la commande <code>return</code>. Par exemple <syntaxhighlight lang="python"> def nombres(n): """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo a = nombres(3) print(a) </syntaxhighlight> La fonction commence par une chaîne de caractères qui la décrit. Cette chaîne peut être récupérée automatiquement par certains logiciels pour faire une documentation automatique. Si la description prend plusieurs lignes, elle commence et finit par trois double-guillemets <code>"""…"""</code> ; en fait, par convention, même si cela n'est pas obligatoire, les descriptions sont toutes encadrées de trois double-guillemets. Cette description est appelée ''{{lang|en|docstring (documentation string)}}''. Pour récupérer les ''{{lang|en|docstrings}}'' : <syntaxhighlight lang="python"> def foo(): """Cette fonction ne fait rien""" pass print(foo.__doc__) # Cette fonction ne fait rien </syntaxhighlight> L'instruction <code>input()</code> permet à l'utilisateur de saisir une valeur. La valeur est retournée sous la forme d'une chaîne de caractères qui est ensuite convertie en nombre réel avec l'instruction <code>float()</code>. On peut définir une valeur par défaut en l'indiquant dans l'en-tête de la définition de la fonction, de la manière suivante : <syntaxhighlight lang="python"> def nombres(n=1): # valeur par défaut : 1 """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo </syntaxhighlight> Si le paramètre à initialiser est de type modifiable ''({{lang|en|mutable}})'', comme par exemple une liste, il faut procéder comme suit : <syntaxhighlight lang="python"> def fooFonction(fooListe=None): # valeur par défaut : n'existe pas """Description""" if fooListe = None: fooListe = [] # initialisation <suite des instructions> </syntaxhighlight> Par défaut, les variables sont locales. On peut rendre une variable globale avec l'instruction <code>global</code> ''à l'intérieur de la fonction'', avant l'utilisation de la variable. Par exemple : <syntaxhighlight lang="python"> a = 1 b = 1 def toto(): """Test de variable globale. Entrée : aucune. Sortie : aucune.""" global a a = 2 b = 2 toto() print("a =", a, "; b =", b) # a = 2 ; b = 1 </syntaxhighlight> Pour être plus précis : si une variable n'est pas assignée dans une fonction, alors Python va chercher une variable du même nom à l'extérieur de la fonction. Mais à partir du moment où la variable est assignée dans la fonction, elle devient locale ''sauf'' si l'on a utilisé l'instruction <code>global</code>. Si l'on s'attend à un nombre indéfini d'arguments, on utilise la notion d'empaquetage/dépaquetage ''({{lang|en|packing/unpacking}})''<ref>{{lien web | url = https://deusyss.developpez.com/tutoriels/Python/args_kwargs/ | titre = Introduction à *args et **kwargs | consulté le = 2019-03-09 | site = Developpez.com }}.</ref>. L'empaquetage consiste à mettre les arguments dans un n-uplet, le dépaquetage consiste à développer un n-uplet en plusieurs variables. Cela se fait en mettant un astérisque ''({{lang|en|splat}})'' « <code>*</code> » devant le nom de la variable. Par convention, on utilise le nom de variable <code>*args</code> mais cela n'est pas obligatoire. <syntaxhighlight lang="python"> def concatenation(*args): """Concatène des chaînes de caractères Entrée : *args, n-uplet de chaînes de caractères. Sortie : resultat, chaîne de caractères.""" resultat = "" for i in args: resultat = resultat + i return resultat concatenation("a", "foo", "toto") # 'afoototo' </syntaxhighlight> À l'inverse, si une fonction doit recevoir plusieurs paramètres, on peut à la place lui transmettre une liste à dépaqueter : <syntaxhighlight lang="python"> def addition(a, b): """Ajoute deux nombres Entrées : — a : réel ; — b : réel. Sortie : a+b, réel""" return a+b arg = (1, 2) addition(*arg) # 3 </syntaxhighlight> On peut aussi empaqueter/dépaqueter un dictionnaire, on utilise pour cela deux astérisques « <code>**</code> ». Par convention, on utilise le nom <code>**kwargs</code> sans que cela soit obligatoire. L'instruction <code>lambda</code> permet de créer de petites fonctions ne contenant pas de boucle ni de branchement conditionnel. Cependant, si la déclaration est courte et compacte, le code n'est pas toujours facilement lisible ; l'utilisation de cette instruction n'est pas recommandée. Par exemple l'expression <syntaxhighlight lang="python"> f = lambda x: 2*x </syntaxhighlight> est la même chose que <syntaxhighlight lang="python"> def f(x): """Calcule le double. Entrée : x, réel. Sortie : 2*x, réel.""" return 2*x </syntaxhighlight> {{note|L'instruction <code>eval()</code> exécute une chaîne de caractères, c'est-à-dire traite une chaîne de caractères comme si c'étaient des instructions données à Python. Cette instruction est à éviter pour deux raisons : # Un utilisateur malveillant pourrait entrer du code malveillant dans la chaîne de caractères. # L'exécution est lente puisque Python doit compiler la chaîne à la volée. Cette instruction peut en général être remplacée par une autre instruction. }} == Gestion des erreurs == Dans un bloc d'instructions, on peut utiliser la structure <code>try:… except:</code>. Le bloc après <code>try</code> est exécuté ; si une erreur se déclare dans ce bloc, alors le bloc <code>except</code> s'exécute. Par exemple <syntaxhighlight lang="python"> try: 1/0 # Génère une erreur except: print("Division par zéro") # Cette instruction est donc exécutée </syntaxhighlight> On peut compléter avec <code>else:</code> et <code>finally:</code> : <syntaxhighlight lang="python"> try: <code à exécuter> except: <s’exécute en cas d’erreur> else: <s’exécute s’il n’y a pas d’erreur> finally: <s’exécute dans tous les cas> </syntaxhighlight> On peut séparer les différents types d'erreur : <syntaxhighlight lang="python"> try: <code à exécuter> except ValueError: print("Valeur erronée") except TypeError: print("Type erroné") </syntaxhighlight> Les types d'erreur les plus courants sont : * <code>NameError</code> : le nom de variable n'existe pas ; * <code>TypeError</code> : la valeur n'est pas du bon type ; * <code>ValueError</code> : la valeur n'est pas compatible avec ce qui est attendu ; * <code>RuntimeError</code> : type d'erreur général. On peut aussi créer ses propres erreurs : si une situation erronée survient, on peut « lever » une exception avec <code>raise</code>. Par exemple <syntaxhighlight lang="python"> if a < 0: raise ValueError("La valeur doit être positive") </syntaxhighlight> ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/errors.html | titre = Errors and exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} * {{lien web | url = https://docs.python.org/3/library/exceptions.html | titre = Built-in Exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} == Exercices == === Calcul du PGCD et du PPCM par l'algorithme d'Euclide === {{loupe|w:Algorithme d'Euclide}} Écrire un programme Python qui demande deux nombres entiers et affiche leurs PGCD et PPCM. Le programme utilisera l'algorithme d'Euclide. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """Programme : euclide.py Auteur : User:cdang date : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : calcule le PGCD et le PPCM de deux nombres entiers. Entrée ------ au clavier, saisie de deux nombres entiers. Sorties ------- à l'écran, affichage du PGCD et du PPCM. """ # *************** # *************** # ** Fonctions ** # *************** # *************** def euclide(): """Calcule le PGCD et le PPCM avec l'algorithme d'Elclide Entrée ------ Aucune, la saisie des paramètres fait partie de la fonction Sortie ------ affichage du PGCD et du PPCM """ print("***** Algorithme d'Euclide *****\n") a0 = int(input("Premier nombre entier : a = ")) b0 = int(input("Second nombre entier : b = ")) a = a0 b = b0 r = a%b # initialisation while (r != 0) : # algorithme d'Euclide a = b b = r r = a%b # affichage des résultats print("PGCD(", a0, ", ", b0, ") = ", b) print("PPCM(", a0, ", ", b0, ") = ", a0*b0//b) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* euclide() </syntaxhighlight> On peut simplifier la boucle centrale : <syntaxhighlight lang="python"> while b: # s'exécute tant que b n'est pas 0 a, b = b, a % b # affectation de liste à liste return a </syntaxhighlight> {{boîte déroulante fin}} Notez que le module NumPy propose l'instruction <code>gcd()</code> : <syntaxhighlight lang="python"> import numpy … print(numpy.gcd(a, b)) </syntaxhighlight> === Tours de Hanoï === {{loupe|w:Tours de Hanoï}} Écrire un programme Python qui demande le nombre ''n'' de plateaux et affiche les manipulations nécessaires pour déplacer la pile d'un emplacement à un autre. Le programme utilisera l'algorithme récursif. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """nom : hanoi.py auteur : User:cdang date de création : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : résout le problème des tours de Hanoï Entrées ------- trois chaînes de caractères (nom des piliers) Sorties ------- une chaîne de caractères (liste des opérations) """ # *************** # *************** # ** Fonctions ** # *************** # *************** def hanoi(a, b, c, n): """Résout le problème des tours de Hanoï de manière récursive But : déplace la pile de n disques du piler a au pilier b Entrées ------- a, b c : chaînes de 1 caractère, référence des emplacements ; n : entier, nombre de disques sur l'emplacement a Sorties ------- operations : chaînes de caractères décrivant les opérations """" if n>1: operations = hanoi(a, c, b, n-1) operations = operations+a+"→"+b+" ; " operations = operations+hanoi(c, b, a, n-1) else: operations = a+"→"+b+" ; " return operations # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* resultat = hanoi("1", "2", "3", 3) print(resultat) </syntaxhighlight> {{boîte déroulante fin}} === Lancer de rayons === [[Fichier:Lentille hemispherique perspective.svg|vignette|Lentille hémisphérique.]] Considérons une lentille hémisphérique de rayon R faite d’un verre d’indice de réfraction ''n''. Nous plaçons une source ponctuelle à une distance ''d'' du dioptre plan, sur l’axe optique. Tracer des rayons partant de la source et traversant la lentille. {{clear}} {{Boîte déroulante/début |titre=Analyse d’optique géométrique}} [[Fichier:Lentille hemispherique analyse geometrique.svg|vignette|Analyse géométrique du problème.]] Il s’agit d’un problème ayant une symétrie de révolution par rapport à l’axe optique. Nous pouvons nous réduire à un problème plan en nous plaçant dans un plan contenant l’axe optique ; l’axe optique est encore un axe de symétrie orthogonale, nous pouvons donc nous contenter d'étudier un demi-plan. Pour simplifier, nous plaçons le centre du dioptre sphérique à l’origine O du repère. L’axe optique est l’axe ''x'' et l'axe perpendiculaire, vertical sur la figure, c’est l’axe ''y''. Les coordonnées de la source sont donc (-''d'' ; 0). Le rayon issu de la source et faisant un angle θ avec l’axe ''x'' frappe le dioptre plan à l’altitude ''h''. Nous avons : : ''h'' = ''d'' ⋅ tan θ. L’angle d’incidence vaut θ. D’après la loi de Snell-Descartes, l'angle de réfraction θ<sub>2</sub> vaut : : θ<sub>2</sub> = arcsin((sin θ) / ''n''). Le rayon réfracté passe par le points de coordonnées (0, ''h''). L’équation de la droite est donc : : ''y'' = a ⋅ ''x'' + ''h'' avec : ''a'' = tan θ<sub>2</sub>. L’équation du cercle de centre O et de rayon R est : : ''x''<sup>2</sup> + ''y''<sup>2</sup> = R<sup>2</sup>. Les coordonnées (''x''<sub>M</sub>, ''y''<sub>M</sub>) de l’intersection M du rayon avec le dioptre sphérique vérifient les deux équations. Par substitution, nous obtenons une équation du second degré en ''x'' que nous savons résoudre : : ''x''<sub>M</sub><sup>2</sup> + (''a'' ⋅ ''x''<sub>M</sub> + ''h'')<sup>2</sup> = R<sup>2</sup> : ⇔ (1 + ''a''<sup>2</sup>) ⋅ ''x''<sub>M</sub><sup>2</sup> + 2 ⋅ ''a'' ⋅ ''h'' ⋅ ''x''<sub>M</sub> + ''h''<sup>2</sup> – R<sup>2</sup> = 0. D’après les propriétés du cercle, le rayon est perpendiculaire à la tangente. Le rayon [OM] est donc normal au dioptre en M. Nous pouvons déterminer l’angle d’incidence θ<sub>i</sub> par le produit scalaire : : <math>\begin{pmatrix} 1 \\ a \end{pmatrix} \cdot \begin{pmatrix} x_\mathrm{M} \\ y_\mathrm{M} \end{pmatrix} = \sqrt{1^2 + a^2} \cdot \mathrm{R} \cdot \cos(\theta_\mathrm{i})</math> ce qui nous permet de calculer cet angle : : <math>\theta_\mathrm{i} = \operatorname{arcos} \left ( \frac{x_\mathrm{M} + a \cdot y_\mathrm{M}}{\mathrm{R} \cdot \sqrt{1^2 + a^2} } \right )</math> Comme nous passons vers un milieu d’indice plus faible, il y a un risque de réflexion totale. L’angle limite est : : θ<sub>max</sub> = arcsin(1/''n''). Si l’on a θ<sub>i</sub> &gt; θ<sub>max</sub>, le rayon repart vers l’intérieur. Nous ne traçons pas le rayon car cela nous emmènerait trop loin dans l’analyse. En revanche, si θ<sub>i</sub> ≤ θ<sub>max</sub>, alors nous pouvons appliquer la loi de Snell-Descartes pour avoir l’angle de réfraction θ<sub>e</sub> : : θ<sub>e</sub> = arcsin(''n'' ⋅ sin θ<sub>i</sub>). Pour tracer le rayon sortant, il nous faut l’angle θ<sub>3</sub> par rapport à l’horizontale. L’angle du rayon [OM] par rapport à l’horizontal vaut arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>), nous avons donc : θ<sub>3</sub> = arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>) + θ<sub>e</sub>. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Analyse algorithmique}} '''Structure des données''' Le problème est décrit par trois paramètres : # Le rayon <code>R1</code> de la lentille, en milliètres (réel en virgule flottante). # L’indice du verre, <code>n</code> sans dimension (réel en virgule flottante). L’indice de l’air vaut 1. # La distance de la source au dioptre d’entrée plan, <code>d</code> en millimètres (réel en virgule flottante). Un rayon est caractérisé par quatre paramètres : # L’angle d’émission <code>theta1</code> en radians (réel en virgule flottante). # L’angle de réfraction dans la lentille <code>theta2</code> en radians (réel en virgule flottante). # Les cordonnées <code>M</code> en millimètre (vecteur de dimension 2 <code>([x, y])</code> de réels en virgule flottante) du point d’intersection du rayon avec le dioptre sphérique. # L’angle de réfraction dans l’air après la lentille <code>theta3</code> en radians (réel en virgule flottante). Pour le calcul et le tracé, nous avons besoin des paramètres intermédiaires suivants : * l’altitude ''y'' = <code>h</code> en millimètres (réel en virgule flottante) à laquelle le rayon frappe le dioptre plan d’entrée ; * l’angle d’incidence du rayon avec le dioptre sphérique <code>thetaint</code> en radians (réel en virgule flottante). Les angles sont stockés en radians car c’est l’unité naturelle pour le calcul mais nous affichons les valeurs en degrés. Comme le calcul de conversion est récurrent, nous conservons les facteurs <code>degversrad</code> (conversion des degrés vers les radians, facteur valant π/180, réel en virgule flottante) et <code>radversdeg</code> (conversion des radians vers les degrés, facteur valant 180/π, réel en virgule flottante). '''Fonctions''' Nous avons besoin d’une fonction qui calcule les trois paramètres du rayon <code>(theta2, M, theta3)</code> à partir de l’angle d’émission <code>theta1</code>. Nous appelons cette fonction <code>lanceRayon()</code>. Cette fonction fait appelle à une fonction qui calcule l’angle du rayon réfracté à partir de l’angle du rayon incident <code>theta1</code>, les deux angles étant par rapport à la normale au dioptre au point considéré. Nous appelons cette fonction <code>refrac()</code>. La recherche de l’intersection <code>M</code> du rayon avec le dioptre sphérique nécessite de résoudre une équation du second degré. Nous utilisons pour cela la recherche des racines du polynôme en <code>x</code> avec la fonction <code lang="python">numpy.polynomial.polynomial.polyroots()</code>. D’après la configuration du problème géométrique, si l’on s’assure que le rayon frappe bien la lentille (0 ≤ <code>h</code> ≤ <code>R1</code>) alors nous sommes sûrs que le problème a deux solutions réelles (une positive et une négative) ou, dans le cas dégénéré où <code>h == R1</code>, une valeur unique <code>x == 0</code>. Comme nous recherchons la valeur positive, nous sélectionons la plus grande des deux racines. Pour la gestion de la réflexion interne : dans la fonction <code>refrac()</code>, nous vérifions les conditions de réflexion totale et si elles sont remplies, alors nous générons une erreur (commandes <code lang="python">try… except</code> et <code lang="python">raise ValueError</code>). Cette erreur est propagée à la fonction <code>lanceRayon()</code> : <code>lanceRayon()</code> appelle la fonction <code>refrac()</code> et si cette fonction renvoie une erreur, alors <code>lanceRayon()</code> renvoie également une erreur. Pour trouver l’angle d’émission <code>thetaLimite</code> provoquant la réflexion totale (en radians, réel en virgule flottante), nous effectuons une recherche par dichotomie : * nous partons de l’angle maximum possible, lorsque le rayon frappe le sommet de la lentille, et nous appelons la fonction <code>lanceRayon()</code> ; si cela ne génère pas d’erreur, alors nous pouvons aller jusqu’à cette valeur, la recherche est terminée ; si cela génère une erreur, alors nous divisons la valeur par deux ; * à une étape de la recherche donnée, si <code>lanceRayon()</code> ne génère pas d’erreur avec l’angle testé, alors nous savons que l’angle limite est supérieur à cette valeur ; cette valeur minore donc la valeur recherchée ; si au contraire <code>lanceRayon()</code> génère une erreur, alors c’est que l’angle est trop important, cette valeur majore donc la valeur recherchée ; nous pouvons ainsi resserer l’intervalle de recherche ; * nous nous arrêtons lorsque les valeurs haute et basse sont suffisamment proche. Concrètement : # Nous définissons une variable <code>angleHaut</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus bas connu provoquant la réflexion totale. # Nous définissons une variable <code>angleBas</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus haut connu ne provoquant pas de réflexion totale. Sa valeur initiale est 0. L’angle limite recherché est donc entre <code>angleBas</code> et <code>angleHaut</code>. # Nous définissons l’angle <code>angleTest</code> comme étant la moyenne entre <code>angleBas</code> et <code>angleHaut</code>. Si <code>lanceRayon(angleTest)</code> génère une erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleHaut</code> (puisque c’est une valeur provoquant la réflexion totale et qu’elle est plus basse que la valeur actuelle d’<code>angleHaut</code>). À l’inverse, si <code>lanceRayon(angleTest)</code> ne génère pas d’erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleBas</code> (puisque c’est une valeur ne provoquant pas la réflexion totale et qu’elle est plus haute que la valeur actuelle d’<code>angleBas</code>). # Nous arrêtons la procédure lorsque l’écart entre <code>angleBas</code> et <code>angleHaut</code> est inférieur à {{unité|10|échelle=<sup>–3</sup>|rad}} (valeur arbitraire). La valeur retenue est la valeur finale d’<code>angleBas</code> (puisque l’on veut être sûr qu’il n’y ait pas de réflexion totale). La valeur affichée est la valeur en degrés arrondie au dixième. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Solution}} Nous demandons à l’utilisateur ou à l’utilisatrice les valeurs des paramètres du problème : rayon de la lentille, distance de la source, indice de réfraction du verre. Nous vérifions que les valeurs entrées sont bien des nombres ; si c’est une chaîne vide, alors nous utilisons une valeur par défaut. Nous créons une fonction <code>refrac()</code> qui permet de calculer l’angle réfracté à partir de l’angle d’incidence et des indices de réfraction. S’il y a rélexion totale, alors nous générons une erreur. La fonction <code>lanceRayon()</code> calcule les différents points de passage du rayon. Elle appelle pour cela la fonction <code>refrac()</code>. Si un appel de la commande <code>refrac()</code> génère une erreur, alors nous générons également une erreur. Nous déterminons l’angle d’émision du rayon <code>thetaLimite</code> qui provoque une réflecxion totale. Pour cela, nous créons une fonction <code>rechercheLimite()</code> qui cherche par dichotomie. Nous traçons un rayon tous les 5° jusqu’à la valeur limite. <syntaxhighlight lang="python"> #!/usr/bin/env python3 # coding: utf-8 """nom : lancerRayons.py auteur : User:cdang date de création : 2022-05-06 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : NumPy, matplotlib ---------------------------------------------------------------------------- Objectif : trace des trajets optique avec une lentille hémisphérique Entrées ------- Le rayon de la lentille, la distance de la source, l’indice de réfraction du verre, trois chaînes de caractères saisies par l’utilisateur·rice et qui sont converties en réels. Sorties ------- La valeur limite de l’angle (réel) et le tracé de plusieurs rayons. """ # ****************************************************** # ****************************************************** # ** Lancer de rayons pour une lentille hémisphérique ** # ****************************************************** # ****************************************************** import numpy as np import matplotlib.pyplot as plt import numpy.polynomial.polynomial as nppol # ************** # * Constantes * # ************** # Pour la conversion degrés ↔ radians radversdeg = 180/np.pi degversrad = 1/radversdeg # ************* # * Fonctions * # ************* def boucleEntreeNombre(messageSaisie, valeurDefaut): """Permet de s’assurer que l’utilisateur·rice a bien entré un nombre. Entrée : — message à afficher (chaîne de caractères) ; — valeur par défaut (réel à virgule flottante). Sortie : nombre (réel à virgule flottante).""" messageErreur = "Veuillez entrer une valeur numérique (ou vide pour accepter la valeur par défaut).\n" execute = True while execute: strNombre = input(messageSaisie+f" (valeur par défaut {valeurDefaut}) : ") if strNombre == "": nombre = valeurDefaut execute = False else: try: nombre = float(strNombre) except: print(messageErreur) else: execute = False return nombre def initialisation(): """L’utilisateur·rice entre les variables du problème. Entrées : aucune. Sorties : — R1 (mm) : rayon de la lentille ; — d (mm) : distance de la source au dioptre plan ; — n (sans dimension) : indice de réfraction du verre.""" R1 = boucleEntreeNombre("Rayon de la lentille en mm", 20.0) d = boucleEntreeNombre("Distance de la source au dioptre plan en mm", 20.0) n = boucleEntreeNombre("Indice de réfraction (sans dimension)", 1.5) return (R1, d, n) def refrac(n1, n2, theta1): """Calcule l’angle de réfraction theta2 (radians) en fonction — de l’angle d’incidence theta1 (radians); — de l’indice de réfraction n1 du premier milieu ; — de l’indice de réfraction n2 du second milieu.""" reflexionTotale=False rapport=n2/n1 rapportinv=np.reciprocal(rapport) if n1 > n2: thetal = np.arcsin(rapport) # angle limite pour la réflexion totale if theta1 >= thetal: reflexionTotale=True if reflexionTotale: print("Réflexion totale") raise ValueError else: return np.arcsin(rapportinv*np.sin(theta1)) def lanceRayon(n1, n2, d, R, theta1): """Détermine le rayon issu de la source située à une distance d (mm) du bareau et avec une élévation de theta1 (radians), en fonction des indices de réfraction n1 et n2. Les éléments retournés sont : — la hauteur h (mm) à laquelle le rayon frappe le barreau ; — l’angle de réfraction theta2 (radians)) dans le barreau ; — l’angle de réfraction theta3 (radians) à la sortie du barreau — le point M(x, y) (mm) auquel le rayon sort du barreau.""" h = d*np.tan(theta1) if h >= R: print("Le rayon est au-dessus du barreau") raise ValueError else: theta2 = refrac(n1, n2, theta1) a = np.tan(theta2) x = max(nppol.polyroots([h*h - R*R, 2*a*h, 1+a*a])) # recherche de l’intersection du rayon avec le cercle y = a*x + h M = np.array([x, y]) thetaint = np.arccos((x + a*y)/(R*np.sqrt(1 + a*a))) theta3 = np.arctan(y/x) - refrac(n2, n1, thetaint) return (h, theta2, theta3, M) def rechercheLimite(n1, n2, d, R): """Recherche l’angle limite pour la réflexion totale. Entrée : — indice de réfraction des milieux 1 et 2, n1 et n2 ; — distance au barreau, d(mm). Sortie : angle limite theta (radians)""" angleHaut = np.arctan(R/d) angleBas = 0 angleTest = angleHaut try: lanceRayon(n1, n2, d, angleTest, R) except: condition = True # il y a réflexion total en haut de la lentille else: condition = False # il n’y a jamais réflexion totale dans la lentille while condition: #dichotomie angleTest = np.mean([angleHaut, angleBas]) # on ajuste la valeur de test try: lanceRayon(n1, n2, d, R, angleTest) except: angleHaut = angleTest # réflexion totale : on abaisse la valeur maximale else: angleBas = angleTest # pas de réflexion totale : on monte la valeur minimale condition = ((angleHaut - angleBas) >= 0.001) # on a cerné la limite à 0,001 rad près if not condition: angleTest = angleBas return angleTest # *********************** # * Programme principal * # *********************** (R1, d, n) = initialisation() xmax = round(R1 + d) thetaLimite = rechercheLimite(1, n, d, R1) thetaLimiteDeg = thetaLimite*radversdeg print(f"Angle limite pour la réflexion totale : {thetaLimiteDeg:.1f}°.\n") anglesDeg = np.arange(0, thetaLimiteDeg, 5)[1:] # trace un rayon tous les 5° anglesRad = anglesDeg*degversrad nb = len(anglesDeg) h = np.zeros(nb) # initialisation des vecteurs de valeurs theta2 = np.zeros(nb) theta3 = np.zeros(nb) M = np.zeros((nb, 2)) for i in range(nb): (h[i], theta2[i], theta3[i], M[i, :]) = lanceRayon(1, n, d, R1, anglesRad[i]) (h_lim, theta2_lim, theta3_lim, M_lim) = lanceRayon(1, n, d, R1, thetaLimite) # tracé anglesCercle = 0.5*np.pi*(np.linspace(1, 0, 20)) x_cercle = R1*np.cos(anglesCercle) # coordonnées des pints du cercle y_cercle = R1*np.sin(anglesCercle) fig = plt.plot([-d,xmax], [0, 0], "k-.", linewidth="0.5") # tracé de l’axe optique for i in range(nb): plt.plot([-d, 0, M[i, 0], xmax], [0, h[i], M[i, 1], M[i, 1] + (xmax - M[i, 0])*np.tan(theta3[i])], label=f"{anglesDeg[i]:.0f}°") plt.plot([-d, 0, M_lim[0], xmax], [0, h_lim, M_lim[1], M_lim[1] + (xmax - M_lim[0])*np.tan(theta3_lim)], label=f"{0.1*int(np.trunc(10*thetaLimite*radversdeg)):.1f}°") plt.plot(x_cercle, y_cercle, "k", linewidth="0.5") # tracé du cercle plt.plot([0,0], [0, R1], "k", linewidth="0.5") # tracé du premier dioptre #plt.axis("square") plt.gca().set_aspect("equal", adjustable="box") plt.xlabel("x (mm)") plt.ylabel("y (mm)") plt.title("Lentille hémisphérique, lancer de rayons") plt.legend() plt.savefig("lentille_hemispherique_lancer_rayon.svg", format="svg") plt.show() </syntaxhighlight> {{Boîte déroulante/fin}} == Mesurer le temps == Le module <code>time</code> fournit les fonctions suivantes : * <code>time.gmtime()</code> : renvoie la date et l'heure du méridien de Greenwich (''{{lang|en|Greenwich mean time}}'', GMT), sous la forme d'un dictionnaire (année, mois, jour du mois, heure, minute, seconde, jour de la semaine, jour de l'année, heure d'été/hiver), ** jour de la semaine est un entier entre 0 (lundi) et 6 (dimanche), ** jour du mois est un entier entre 1 et 366 ; * <code>time.localtime()</code> : comme le précédent, mais l'heure est l'heure locale ; * <code>time.time()</code> : donne le nombre de seconde qui se sont écoulées depuis le 1er janvier 1970 ; * <code>time.gmtime(n)</code> et <code>time.localtime(n)</code> transforment un nombre de secondes (écoulées depuis le 1er janvier 1970) en une date au format (année, mois, jour, etc.), n-uplet de neuf valeurs ; <code>time.mktime()</code> fait le contraire, il transforme un n-uplet de neuf valeurs (années, mois, jour, etc.) en un nombre de secondes (écoulées depuis le 1er janvier 1970) ; * <code>time.sleep(n)</code> : provoque une pause dans le déroulement du programme de ''n'' secondes ; * <code>time.perf_counter()</code> : indique une date en seconde ; s'utilise pour mesurer la durée d'exécution d'une partie du code, en faisant la différence entre deux relevés. Concernant la date et l'heure sous la forme d'un n-uplet, on peut extraire l'heure de la manière suivante : <syntaxhighlight lang="python"> import time a = time.localtime() print("Il est ", a[3], "h", a[4]) # ou bien print("Il est ", a.tm_hour, "h", a.tm_min) </syntaxhighlight> Pour mesurer la performance d'une portion de code : <syntaxhighlight lang="python"> import time t1 = time.perf_counter() <suite d’instructions> t2 = time.perf_counter() print("Durée d'exécution :", t2-t1 </syntaxhighlight> == Programmation orientée objet == Nous n'allons pas ici faire un cours de programmation orientée objet (POO), nous allons aborder le sujet de manière pragmatique. De manière schématique, un « objet » est une « super-variable ». Cette super-variable peut contenir plusieurs variables, appelées « attributs » ; elle contient en fait un dictionnaire (paires « nom d'attribut : valeur d'attribut »). Elle peut aussi contenir des fonctions spécifiques appelées « méthodes ». De même qu'une variable a un type, un objet fait partie d'une « classe ». La classe est le modèle de l'objet ; en franglais informatique, on dit que l'objet est une instance de la classe. La POO est donc un formalisme : lorsque l'on définit des variables et des fonctions concernant un même type d'objet (au sens commun du terme), on les empaquette dans une classe. Il faut donc d'abord définir la classe, puis attribuer cette classe à un objet (« instancier » la classe). Considérons par exemple que nous voulons travailler sur des [[w:Engrenage|engrenages]] ; pour simplifier, nous nous contentons d'engrenages à dentures droites. Une roue dentée, un pignon, est essentiellement définie par son nombre de dents Z et par son module ''m'' qui correspond à la largeur de dents<ref>ainsi que par son épaisseur ''e'' et le matériau dont elle est faite mais nous allons négliger ces paramètres pour la simplicité de l'étude.</ref>. Nous allons définir trois méthodes : la méthode <code>.diametrePrimitif()</code> qui calcule le diamètre primitif de la roue dentée, <code>.pas()</code> qui calcule la largeur des dents au niveau du cercle primitif et <code>.rapport()</code> qui calcule le rapport de transmission de deux roues engrenées Z<sub>1</sub>/Z<sub>2</sub>. La méthode <code>.rapport()</code> vérifie par ailleurs que les roues ont le même module, condition indispensable pour former un engrenage. Nous définissons la classe ainsi : <syntaxhighlight lang="python"> class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): # instructions lancées lors de la déclaration """Valeurs des attributs""" self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z </syntaxhighlight> Nous remarquons que lorsque nous déclarons les méthodes, le paramètre <code>self</code> correspond à l'objet lui-même. Ainsi, dans la méthode <code>.rapport()</code>, la variable <code>self.Z</code> est le nombre de dents de la roue elle-même et <code>roueDentee.Z</code> est le nombre de dents de la roue passée en paramètre. Pour déclarer les roues, nous écrivons : <syntaxhighlight lang="python"> roue1 = pignon() # attribution de la classe, « instanciation » roue1.Z = 13 # définition des caractéristiques du pignon « roue1 » roue1.m = 2 roue2 = pignon(16, 2) # manière alternative </syntaxhighlight> Nous pouvons alors utiliser les objets de la manière suivante : <syntaxhighlight lang="python"> print(roue1.Z) # 13 print(roue1.diametrePrimitif()) # 26 R = roue1.rapport(roue2) # 0.8125 </syntaxhighlight> La commande <code>dir(a)</code> affiche tous les attributs et méthodes de l'objet <code>a</code>. ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/classes.html | titre = Classes | site = Python documentation | consulté le = 2019-03-08 }} == Interface graphique avec Tk == Une interface graphique utilisateur (GUI, ''{{lang|en|graphic user interface}}'') est un ensemble de boîtes permettant d'interagir avec l'utilisateur c'est-à-dire permettre la saisie d'informations, l'exécution d'actions et afficher des informations. Elle se compose d'éléments appelés ''{{lang|en|widgets}}''. Les éléments ''({{lang|en|widgets}})'' classiques sont : * boîte de dialogue ''({{lang|en|dialog box}})'' : fenêtre contenant d'autres éléments ; * étiquette ''({{lang|en|label}})'' : texte affiché ; * liste déroulante ''({{lang|en|drop-down list}})'' : zone permettant le choix d'une option, la liste se déployant lorsque l'on clique sur la zone ; * zone de texte, champ de saisie ''({{lang|en|text box}})'' : zone permettant de taper du texte ; * boîte combinée ''({{lang|en|combo box}})'' : zone de saisie de texte contenant une liste déroulante qui permet de choisir des éléments prédéfinis ; * bouton ''({{lang|en|button}})'' : objet effectuant une action lorsque l'on clique dessus ; * case à cocher ''({{lang|en|checkbox, tickbox}})'' : objet permettant d'activer ou de désactiver une option lorsque l'on clique dessus ; * bouton radio, case d'option ''({{lang|en|radio button}})'' : objet permettant d'activer une option en désactivant les autres options ; une seule option peut être activée à la fois. Plusieurs modules permettent de gérer les interfaces graphiques. Nous choisissons ici le module développé sur la bibliothèque Tk qui est une bibliothèque multiplateforme. Pour cela, nous importons le module <code>tkinter</code> ainsi que le module <code>ttk</code>, ce dernier proposant des options plus « modernes » : <syntaxhighlight lang="python"> import tkinter as tk from tkinter import ttk </syntaxhighlight> Voici un programme permettant comme précédemment de calculer le rapport de transmission d'un engrenage. Nous détaillons sa construction ci-après. <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: IUrapport.set(valeurZ2/valeurZ1) except: IUrapport.set("erreur") # ************************* # ************************* # ** Interface graphique ** # ************************* # ************************* # fenetre principale fenetre = tk.Tk() fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> '''Explications''' Nous commençons par définir la boîte de dialogue que nous appelons <code>fenetre</code> ; c'est un objet <code>Tk</code> et nous lui donnons un titre « » : <syntaxhighlight lang="python"> fenetre = tk.Tk() fenetre.title("Rapport de réduction") </syntaxhighlight> Puis, nous définissons un cadre attaché à cette fenêtre et qui va nous permettre « d'accrocher » les autres éléments, ce qui permet de garder une apparence satisfaisante lorsque l'on retaille la fenêtre : <syntaxhighlight lang="python"> cadre = ttk.Frame(fenetre) </syntaxhighlight> Le cadre va comporter six lignes ''({{lang|en|row}})'' et deux colonnes ''({{lang|en|column}})''. Nous allons placer une étiquette ''({{lang|en|label}})'' « z1 » : <code>text="z1"</code>. Cette étiquette se trouve dans une case du cadre, celle de la première colonne et la première ligne : <code>grid(column=1, row=1)</code>. Par rapport à cette case, elle est collée à « l'ouest » (W, ''{{lang|en|west}}'', gauche) de la case : <code>sticky=tk.W</code>. <syntaxhighlight lang="python"> z1_label = ttk.Label(cadre, text="z1") # Création de l'étiquette z1_label.grid(column=1, row=1, sticky=tk.W) # Placement de l'étiquette </syntaxhighlight> Notez que l'on aurait pu écrire directement : <syntaxhighlight lang="python"> ttk.Label(cadre, text="z1").grid(column=1, row=1, sticky=tk.W) </syntaxhighlight> mais le fait de séparer la création de l'élément et son placement facilite la maintenance (recherche d'erreur, évolution du code). Pour tout ce qui est dynamique, c'est-à-dire les zone de saisie des valeurs et l'affichage du résultat, il faut définir des « chaînes variables » ''({{lang|variable strings}})'' : <syntaxhighlight lang="python"> IUz1 = tk.StringVar() </syntaxhighlight> Cette variable est une variable globale à la création. Nous pouvons alors placer la zone de saisie ''({{lang|en|entry}})'' à côté de l'étiquette lui correspondant. Nous nommons la zone de saisie <code>z1_entry</code> : <syntaxhighlight lang="python"> z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) </syntaxhighlight> Nous faisons de même pour les trois autres paramètres de l'engrenage, ''m''<sub>1</sub>, ''z''<sub>2</sub> et ''m''<sub>2</sub>. Le résultat est également une chaîne variable globale. Par rapport à notre mise en page, elle se situe dans la case colonne 2 ligne 5, centrée sur cette case (collé à l'est et à l'ouest) : <syntaxhighlight lang="python"> rapport = tk.StringVar() rapport_dynamique = ttk.Label(cadre, textvariable=rapport) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) </syntaxhighlight> Il nous faut encore définir une fonction de manière classique, nous l'appelons « calcule ». Les variables étant globales, on les utilise directement. On récupère les valeurs avec la méthode <code>get()</code> et nous modifions la valeur avec la méthode <code>set()</code> : <syntaxhighlight lang="python"> def calcule(): valeurZ1 = float(IUz1.get()) valeurZ2 = float(IUz2.get()) IUrapport.set(valeurZ2/valeurZ1) </syntaxhighlight> Cette fonction est déclenchée lorsque l'on clique sur le bouton « Calcul » situé dans la case du cadre ligne 6 colonne 2 : <syntaxhighlight lang="python"> bouton = ttk.Button(cadre, text="Calcul", command=calcule) bouton.grid(column=2, row=6, sticky=tk.W) </syntaxhighlight> ou bien si l'on appuie sur la touche <code>[entrée]</code> du clavier : <syntaxhighlight lang="python"> fenetre.bind("<Return>", calcule) </syntaxhighlight> À tout ceci, nous ajoutons des « gouttières » (marges, ''{{lang|en|paddings}}'') afin d'espacer les éléments. Il faut ensuite « activer » la fenêtre pour qu'elle s'affiche. La méthode est <code>mainloop()</code> (boucle principale) : « boucle » (elle est active en permanence et attend des actions sur ses éléments), <syntaxhighlight lang="python"> fenetre.mainloop() </syntaxhighlight> Nous avons ci-dessus mis la plupart du code en programme principal. Nous pouvons aussi programmer de manière fonctionnelle, en mettant la plupart du code dans des fonctions ; cependant, pour que la fenêtre et les variables dynamiques soient globales à tout le programme, elles doivent être déclarées dans le programme principal. Nous pouvons aussi mêler la programmation orientée objet. {{boîte déroulante début|Calcul du rapport de transmission en programmation fonctionnelle et orientée objet}} <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # ************* # ************* # ** Classes ** # ************* # ************* class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): """Valeurs des attributs""" # instructions lancées lors de la déclaration self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z # ************************ # ************************ # ** Variables globales ** # ************************ # ************************ # fenetre principale fenetre = tk.Tk() # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: roue1 = pignon(valeurZ1, valeurM1) roue2 = pignon(valeurZ2, valeurM2) IUrapport.set(roue1.rapport(roue2)) except: IUrapport.set("Erreur") # *********************** # * Interface graphique * # *********************** def configureFenetre(): """Configuration de la fenêtre principale""" fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* configureFenetre() # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> {{boîte déroulante fin}} == Annotations == Une annotation est un commentaire qui sert à expliciter un type de variable. La syntaxe est différente des commentaires « classiques » : cela permet d'avoir un affichage différent avec les éditeurs de texte ayant une coloration syntaxique, et ces informations peuvent être récupérées par des logiciels extérieurs pour effectuer une documentation automatique ou bien des vérifications de type. Cependant : * comme les commentaires normaux, ils n'ont aucune influence lors de l'exécution du texte ; en particulier : * rien n'oblige à annoter les variables ; * il est possible d'avoir une variable ayant un type différent de son annotation ; le fait de pouvoir définir et changer le type de variable à la volée est une fonctionnalité fondamentale de Python. La syntaxe pour une annotation est : : nom_de_variable + deux-points + espace + type par exemple : <syntaxhighlight lang="python"> a: int </syntaxhighlight> Notez qu'ici, la variable n'est ''pas'' créée. Pour la créer, il faut lui affecter une valeur. Il est possible de l'affecter après ou bien sur la même ligne avec la syntaxe : : nom_de_variable + deux-points + espace + type + espace + égal + espace + valeur par exemple : <syntaxhighlight lang="python"> a: int a = 5 # est équivalent à a: int = 5 </syntaxhighlight> Même si l'annotation n'a pas d'impact sur l'exécution, le type doit être un type existant sinon cela génère une erreur de syntaxe. Les types classiques sont : : <code>int</code> — <code>float</code> — <code>str</code> — <code>bool</code> — <code>list</code> — <code>tuple</code> — <code>dict</code> Il est également possible de mettre une chaîne de caractères : <syntaxhighlight lang="python"> a: "ce que je veux" = 3.1516 </syntaxhighlight> On peut annoter une fonction. Il est possible d'annoter les variables déclarées au sein de la fonction, mais pas les variables globales (puisqu'elle ne sont pas définie au sein de la fonction). On peut aussi annoter : * les variables passées en paramètre, avec la même syntaxe dans les parenthèses ; * annoter le type de la variable de sortie (retournée) en la faisant précéder de <code>-&gt;</code> : <syntaxhighlight lang="python"> def plusCinq(a: float = 0) -> float: return a + 5 </syntaxhighlight> ; Ressources * {{lien web | url = https://www.python.org/dev/peps/pep-0526/ | titre = PEP 526 -- Syntax for Variable Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} * {{lien web | url = https://www.python.org/dev/peps/pep-3107/ | titre = PEP 3107 -- Function Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} == Décorateur == Un décorateur est une fonction qui s'applique à une fonction, à la manière de la composition mathématique ''g'' ∘ ƒ = ''g''(ƒ). Mais cette composition affecte la fonction elle-même ; l'utilisateur appelle la fonction ƒ mais c'est la fonction ''g'' ∘ ƒ qui s'exécute. Cette fonction ''g'' est appelée le décorateur. L'intérêt est de pouvoir modifier une fonction sans modifier le code de la fonction elle-même. Pour appliquer une décoration, il faut : # Déclarer le décorateur : une fonction qui s'applique à une autre fonction. # Affecter le décorateur à la fonction visée : en mettant <code>@''décoration''</code> juste avant la définition de la fonction. Par exemple : <syntaxhighlight lang="python"> def decorateur(f): print("Avant la fonction") f() print("après la fonction") @decorateur def afficheFoo(): print("Foo.") afficheFoo # Avant la fonction # Foo. # Après la fonction </syntaxhighlight> Lorsque l'on appelle <code>afficheFoo</code>, on appelle en fait <code>decorateur(afficheFoo)</code>. Si la fonction à modifier admet des paramètres, il faut définir une fonction enveloppante dans le décorateur. Par exemple, nous définissons ci-dessous un décorateur <code>deuxFois()</code> qui fait s'exécuter deux fois de suite la fonction : <syntaxhighlight lang="python"> def deuxFois(f): def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # conteneurFonction </syntaxhighlight> Nous voyons que l'application du décorateur a modifié le nom de la fonction — pas le nom de la variable qui contient la fonction mais bien son nom « intime ». Pour éviter cela, on utilise la méthode <code>wraps()</code> du module <code>functools</code> : <syntaxhighlight lang="python"> import functools def deuxFois(f): @functools.wraps(f) def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # plusCinq </syntaxhighlight> On peut par exemple utiliser un décorateur pour la mémoïsation. La mémoïsation est une méthode consistant à mémoriser les valeurs d'une fonction au fur et à mesure de son utilisation ; ainsi, si l'on veut évaluer la fonction avec les mêmes entrées, on se contente d'aller chercher la valeur enregistrée ce qui est plus rapide. On sacrifie donc la place mémoire au profit de la rapidité. On peut trouver des décorateurs de mémoïsation aux adresses suivantes : * https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize * https://gist.github.com/robcowie/1357800 ; Ressources : {{lien web | url = https://www.python.org/dev/peps/pep-0318/ | titre = PEP 318 -- Decorators for Functions and Methods | site = Python.org | lang = en | consulté le = 2019-04-05 }} == Manipulation de fichiers == === Importer le contenu d'un fichier === Python possède la fonction <code lang="python">open()</code> qui permet d'ouvrir un fichier. Ouvrir signifie qu'il crée un objet de type <code>file</code> qui possède notamment les méthodes <code lang="python">read()</code> et <code lang="python">write()</code>. Il peut s'agir d'un objet de type « fichier binaire » ''({{lang|en|binary file}})'' ou « fichier texte » ''({{lang|en|text file}})''. Si par exemple on veut utiliser (et donc lire) le contenu du fichier texte <code>monfichier.txt</code>, on écrit : <syntaxhighlight lang="python"> fichier = open("monfichier.txt", "rt") … fichier.close() </syntaxhighlight> Le paramètre <code>"rt"</code> signifie que nous ouvrons le fichier en lecture ''({{lang|en|read}})'' et qu'il s'agit d'un objet de type fichier texte. Notons deux choses : * en faisant cela, nous ne faisons qu'associer le fichier à un objet Python, nous n'avons pas encore importé les données ; * si nous ouvrons le fichier, il faut le fermer par la suite ; c'est pourquoi nous utilisons la méthode <code lang="python">.close()</code>. Pour éviter d'avoir à fermer le fichier, nous pouvons l'ouvrir au sein d'un contexte : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: … </syntaxhighlight> Notons aussi que la chaîne de caractères indiquant le nom du fichier peut contenir le chemin d'accès au répertoire (dossier), mais sous Microsoft Windows, il faut utiliser des barres de fractions <code>/</code> pour séparer les sous-répertoires au lieu de la barre inversée habituelle, par exemple : <syntaxhighlight lang="python"> chemin = "C:/Temp/monfichier.txt" with open(chemin, "rt") as fichier: … </syntaxhighlight> Pour mettre les données du fichier dans la variable <code>contenu</code>, nous écrivons donc : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() print(contenu) </syntaxhighlight> et si nous ne voulons lire que les <code>n</code> premiers caractères (<code>n</code> étant un entier), nous utilisons <code lang="python">contenu = fichier.read(n)</code>. Cette lecture est séquentielle, c'est-à-dire que si nous appliquons la méthode plusieurs fois, nous reprenons la lecture là où nous l'avons laissée. Si nous voulons lire une ligne, nous utilisons la méthode <code lang="python">.readline()</code>. La lecture ligne par ligne est également séquentielle. Nous pouvons aussi créer une liste dont chaque élément est une ligne du fichier ; nous utilisons alors la méthode <code lang="python">.readlines()</code> (notez le pluriel). Chaque élément de la liste se termine par le caractère de fin de ligne <code lang="python">\n</code>. Pour l'enlever, nous pouvons utiliser la méthode <code lang="python">.rstrip()</code> pour chaque élément de la liste, par exemple. L'exemple complet est alors : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.readlines() contenu = [item.rstrip() for item in contenu] print(contenu) </syntaxhighlight> === Exporter du contenu vers un fichier === Si nous voulons créer un fichier texte pour y mettre le contenu de la variable <code>texte</code>, alors nous utilisons : <syntaxhighlight lang="python"> with open("monfichier.txt", "wt") as fichier: contenu = fichier.write(texte) </syntaxhighlight> Le module principal important pour la manipulation de fichiers est est <code lang="python">os</code>. === Exploiter le contenu d'un fichier texte === Avec un fichier texte, la méthode <code lang="python">.read()</code> crée une variable de type texte. Nous pouvons séparer cette variable en différentes lignes avec la méthode <code lang="python">.splitlines()</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une ligne. Si maintenant une ligne contient plusieurs données séparées par un séparateur commun, par exemple un espace, nous pouvons séparer les données par la méthode <code lang="python">.split(''séparateur'')</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une donnée. Si par exemple le fichier est du type CSV ''({{lang|en|comma separated values}}'', valeurs séparées par une virgule), l'exploitation du fichier est : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(",") for item in contenu] </syntaxhighlight> La variable <code>contenu</code> est une liste de listes. Pour avoir la ''n''<sup>e</sup> valeurs de la ''m''<sup>e</sup> ligne, on utilise : <syntaxhighlight lang="python"> contenu[m-1][n-1] </syntaxhighlight> Si l'on veut extraire la ligne ''m'' il suffit d'écrire : <syntaxhighlight lang="python"> contenu[m-1] </syntaxhighlight> mais si l'on veut la colonne ''n'', le plus simple est d'utiliser une définitipon en compréhension : <syntaxhighlight lang="python"> [ligne[n-1] for ligne in contenu] </syntaxhighlight> Dans certains fichiers CSV, les séparateurs de valeurs ne sont pas des virgules, on peut donc utiliser un autre caractère pour le séparateur. Si le séparateur est une tabulation, on utilise <code lang="python">\t</code> : <code lang="python">contenu = [item.split("\t") for item in contenu]</code> Si la première ligne contient les en-têtes des colonnes, on peut l'enlever avec la fonction <code lang="python">del()</code> : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() del(contenu[0]) contenu = [item.split(",") for item in contenu] </syntaxhighlight> Certains logiciels créent des fichiers en utilisant le séparateur décimal régional, qui en France est la virgule. Pour remplacer les virgules par des points, on peut utiliser la méthode <code lang="python">.replace()</code>, de préférence ''avant'' de séparer les valeurs : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.replace(",", ".") for item in contenu] # remplace les virgules par des points contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule </syntaxhighlight> en effet, lorsque l'on a séparé les valeurs, on a une liste de liste, il faut alors balayer les sous-listes ce qui prend plus de temps : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule contenu = [[subitem.replace(",", ".") for subitem in item] for item in contenu] # remplace les virgules par des points </syntaxhighlight> '''Exemple complet''' Supposons que l'on ait un fichier texte de la forme : <syntaxhighlight lang="text"> x y z V 0.0 1.5 3.2 8.657 0.4 1.5 3.2 8.392 0.2 1.5 3.2 8.485 ... </syntaxhighlight> C'est un fichier valeurs V associées à des points de coordonnées ''(x, y, z)'' (un champ V sur l'espace, donc). Nous remarquons que seule la coordonnée ''x'' change : les données concernent la droite (''y'' = 1,5 ; ''z'' = 3,2). Nous remarquons aussi que les valeurs de ''x'' ne sont pas classées par ordre croissant ni décroissant. Nous voulons au final avoir une matrice [[''x''], [V]] triée par ''x'' croissant. Pour cela, nous pouvons faire : <syntaxhighlight lang="python"> with open(nomdefichier, "rt") ad fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(" ") for item in contenu contenu = contenu[1:] # élimine la première ligne x = np.array([float(ligne[0]) for ligne in contenu]) V = np.array([float(ligne[3]) for ligne in contenu]) donnees = np.concatenate((x.reshape(-1, 1), V.reshape(-1, 1)), axis=1) # matrice [[x], [V]] ind = np.argsort(donnees[:, 0]) donnees = donnees[ind, :] # matrice triée plt.plot(donnees[:, 0], donnees[:, 1]) </syntaxhighlight> {{note|Pour le tri, voir [[../Manipulation_de_matrices#Fonctions_et_méthodes_de_base|''Manipulation de matrices'' &gt; ''Fonctions et méthodes de base'']].}} === Cas d'un fichier CSV === Si le fichier CSV ne contient que des valeurs numériques, on peut utiliser : <syntaxhighlight lang="python"> valeurs = np.loadtxt(chemin+nomfic, delimiter=",") # si le séparateur est une virgule </syntaxhighlight> Il existe un module <code lang="python">csv</code> dédié aux fichiers CSV. La manipulation du fichier se fait comme suit : <syntaxhighlight lang="python"> import csv with open(chemin+nomfic, "rt") as fichier: lecteur = csv.reader(fichier, delimiter=",") contenu = [ligne for ligne in lecteur] print(contenu) </syntaxhighlight> === Utilisation de Pandas === Pandas<ref>https://pandas.pydata.org/</ref> est un module gérant les tableaux de données, appelés <em lang="en">data frames</em>. Voici quelques commandes utiles : <syntaxhighlight lang="python"> import numpy as np import pandas as pd M = np.random.rand(10, 10) # crée une matrice NumPy aléatoire de dimension 10 × 10 tableau = pd.DataFrame(M) # transforme la matrice en tableau DataFrame tableau.to_csv("tableau.csv") # enregistre le tableau dans un fichier CSV donnees = pd.read_csv("tableau.csv").to_numpy() # lit le fichier et transforme le tableau DataFrame en matrice NumPy </syntaxhighlight> == Exporter un programme Python == Vous pouvez créer un fichier « Python pur » <code>.py</code>. Pour cela, dans le menu <code>fichier/file</code> de Jupyter, choisir <code>télécharger/download</code> au format <code>.py</code> ; le fichier se trouve alors dans le répertoire de téléchargement du navigateur. == Ressources == * {{lien web | url = https://www.python.org/dev/peps/pep-0008/ | titre = PEP 8 -- Style Guide for Python Code | site = Python documentation | consulté le = 2019-03-14 }} == Notes et références == {{références}} ---- [[../Fonctions mathématiques générales|Fonctions mathématiques générales]] &lt; [[../|↑]] &gt; [[../Graphiques|Graphiques]] {{DEFAULTSORT:Elements de programmation}} [[Catégorie:Python pour le calcul scientifique (livre)]] szx4ku6852cxjaf71wgp7w898fuiahc 767319 767318 2026-06-02T13:06:50Z Cdang 1202 /* Substitution de variables */ note 767319 wikitext text/x-wiki Rappel : les programmes commencent par : <syntaxhighlight lang="python"> #!/usr/bin/python3 import numpy as np import matplotlib.pyplot as plt </syntaxhighlight> == Entrées et sorties == Pour permettre à l'utilisateur ou à l'utilisatrice d'entrer une valeur, nous utilisons la fonction <code lang="python">input()</code> comme évoqué précédemment (chapitre ''[[../Premiers programmes|Premiers programmes]]''), avec la syntaxe <code lang="python">''variable'' = input(''texte'')</code>. Notez que la valeur renvoyée par <code lang="python">input()</code> est une chaîne de caractères. Si vous voulez autre chose, typiquement un nombre, il faut convertir cette chaîne. Par exemple, nous demandons ici d'entrer une longueur sous la forme d'une valeur numérique : <syntaxhighlight lang="python"> longueurDefaut = 10.0 texteDemandeLongueur = f"Veuillez entrer la longueur en millimètres (valeur par défaut {longueurDefaut} mm) : " longueur = input(texteDemandeLongueur) if longueur=="": longueur=longueurDefaut else: longueur=float(longueur) print(longueur) </syntaxhighlight> Pour afficher un texte, on utilise la fonction <code lang="python">print()</code>, également présentée dans le chapitre ''[[../Premiers programmes|Premiers programmes]]'', avec la syntaxe <code lang="python">print(''texte'')</code>. Le texte à afficher peut être de n'importe quel type (entier, réel en virgule flottante, booléen, chaîne de caractères…) mais si l'on veut « mélanger » les types, il faut tout convertir en chaînes de caractères, avec la fonction <code lang="python">str()</code>, et concaténer les chaînes avec <code lang="python">+</code>. Par exemple : <syntaxhighlight lang="python"> print("La longueur vaut : "+str(longueur)+" mm.") </syntaxhighlight> Nous pouvons aussi utiliser une « chaîne “f” » ''({{lang|en|f-string}})'' : on met un le <code lang="python">f</code> devant le guillemet ouvrant et dans la chaîne, on met un champ sous la forme <code lang="python">{''nomDeVariable''}</code>. L'exemple ci-dessus devient alors : <syntaxhighlight lang="python"> print(f"La longueur vaut : {longueur} mm.") </syntaxhighlight> Les chaînes « f » sont détaillées dans la section ''[[#Chaînes de caractères|Chaînes de caractères]]'' ci-dessous. Si l'on veut introduire un retour à la ligne dans la chaîne, on utilise les caractères <code lang="python">\n</code> (contre-oblique suivie de la lettre N minuscule). Par exemple <syntaxhighlight lang="python"> print("Ceci est un texte\navec un retour à la ligne.") </syntaxhighlight> == Types de variables == === Généralités === Python définit « tout seul » le type de la variable : « <code>3</code> » sera un entier ''({{lang|en|integer}})'', « <code>3.0</code> » sera un réel à virgule flottante ''({{lang|en|float}})'', « <code>"3"</code> » sera une chaîne de caractères ''({{lang|en|string}})''. On peut connaître le type d'une variable avec la fonction <code>type()</code>. On peut tester certaines valeurs, avec le module <code>NumPy</code> : * <code>np.isnan(x)</code> indique si les valeurs de ''x'' sont des NaN ''({{lang|en|not a number}})'' ; si ''x'' est une matrice, le résultat est une matrice de booléens, l'élément [''i'', ''j''] est <code>True</code> si <code>x[i, j]</code> est un NaN ; * <code>np.isinf(x)</code> indique si les valeurs de ''x'' sont ±∞ ; si ''x'' est une matrice, le résultat est une matrice booléenne de même dimension. On peut forcer un type : * <code>int(x)</code> : transforme la valeur ''x'' en nombre entier ; * <code>long(x)</code> : " en entier long (précision illimitée) ; * <code>float(x)</code> : " en nombre réel à virgule flottante ; * <code>str(x)</code> : " en chaîne de caractères ; * <code>complex(Re, Im)</code> : crée le nombre complexe ''Re'' + ''Im''·j, j désignant la racine carrée de –1 ; * <code>list()</code> : crée une liste ; * <code>tuple()</code> : crée un n-uplet. Par exemple <syntaxhighlight lang="python"> type(3) # <class 'int'> type(float(3)) # <class 'float'> complex(1, 1) == 1 + 1j # True list("blabla") # ['b', 'l', 'a', 'b', 'l', 'a'] </syntaxhighlight> Python distingue plusieurs genres de types : * Un itérable est un objet dont on peut extraire les éléments un par un ; ce sont les objets pour lesquels on peut écrire <code> for i in ''iterable'':</code>. Il s'agit essentiellement des listes, n-uplets, chaînes de caractères, ensembles, dictionnaires et fichiers. * Un modifiable ''({{lang|en|mutable}})'' est un objet que l'on peut modifier ; par exemple une liste est modifiable — on peut changer la valeur d'un élément, en ajouter ou en enlever un — mais les n-uplets non, pas plus qu'une chaîne de caractères ou un nombre. * Un identifiable (''{{lang|en|hashable}}'', le ''{{lang|en|hashage}}'' étant une signature caractéristique d'un objet) : objet possédant un identifiant unique. Un objet identifiable est toujours non-modifiable ''({{lang|en|unmutable}})''. === Types numériques === ==== Entiers ==== Nous pouvons définir les entiers au format octal ou hexadécimal : il faut débuter le nombre par respectivement <code>0o</code> (le chiffre zéro et la lettre o) et <code>0x</code> (le chiffre zéro et la lettre x). À l'inverse, la fonction <code>hex()</code> renvoie une chaîne correspondant à l'écriture d'un entier au format hexadécimal, et <code>oct()</code> renvoie la chaîne correspondant à l'éciture en octal. Par exemple : <syntaxhighlight lang="python"> print(0o10, ";", 0x10) # 8 ; 16 print(hex(20)) # 0x14 </syntaxhighlight> ==== Réels ==== Les réels disposent de fonctions spécifiques appelées « méthodes ». Une méthode est une fonction spécifique à un type d'objets. Étant conçue ''ad hoc'', elle est souvent plus économe en ressource et en temps qu'une fonction générique. Pour appliquer la méthode <code>meth()</code> à la variable <code>x</code>, on écrit : <code>x.meth()</code>. Nous avons déjà présenté la méthode <code>''float''.as_integer_ration()</code> qui donne la fraction réduite égale à la valeur du nombre. Les réels disposent de plusieurs autres méthodes : * <code>''float''.trunc()</code> : tronque le nombre réel ; * <code>''float''.floor()</code>, <code>''float''.ceil()</code> : renvoie l'entier le plus proche, respectivement inférieur ou supérieur ; * <code>''float''.hex()</code> : renvoie une chaîne de caractères correspondant à l'écriture du nombre en hexadécimal. Par exemple : <syntaxhighlight lang="python"> a = 20. print(a.hex()) # 0x1.4000000000000p+4 print(10..hex()) # 0x1.4000000000000p+3 </syntaxhighlight> Dans le deuxième exemple, nous appliquons la méthode <code>''float''.hex()</code> directement au nombre <code>10.</code> ; le point est obligatoire car sinon, c'est un entier, pour lequel la méthode n'est pas définie. Notez que la ''méthode'' <code>''float''.hex()</code> est différentes de la ''fonction'' <code>hex()</code> : la première concerne les réels, la seconde les entiers. ==== Complexes ==== Nous avons déjà mentionné la méthode <code>''complex''.conjugate()</code> qui donne le conjugué du nombre. Un nombre complexe dispose de deux attributs : * <code>''complex''.real</code> : sa partie réelle ; * <code> ''complex''.imag</code> : sa partie imaginaire. Par exemple : <syntaxhighlight lang = "python"> a = 5+2j print(a.conjugate(), ";", a.real, ";", a.imag) # (5-2j) ; 5.0 ; 2.0 </syntaxhighlight> === Chaînes de caractères === ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/inputoutput.html | titre = 7. Input and Output | site = Python Documentation | consulté le = 2019-04-06 }} ==== Généralités ==== Il existe en fait trois manières de définir une chaîne de caractères : * avec des guillemets simples ou doubles comme vu précédemment : <code>"…"</code> ou bien <code>'…'</code> ; * avec trois guillemets doubles : <code>"""…"""</code> : cela permet d'avoir une chaîne de caractères s'étendant sur plusieurs lignes, les retours de ligne étant pris en compte ; c'est utilisé en particulier pour la description des fonctions (''{{lang|en|docstrings}}'', voir ci-après) ; * avec des guillemets précédés d'un « r », <code>r"…"</code> ou <code>r'…'</code> : cela permet d'interpréter les barres de fraction inverses « \ » comme un caractère « normal » et non comme un caractère d'échappement (voir ci-après) ; cela est utile lorsque l'on utilise les possibilités LaTeX dans le tracé de graphiques (voir plus loin) ; * avec des guillemets précédés d'un « f », <code>f"…"</code> ou <code>f'…'</code> : cela permet d'utiliser des variables formatées (voir ci-après). Une chaîne de caractères n'est pas modifiable. Si l'on veut remplacer un caractère, l'insérer ou le supprimer, il faut transformer la chaîne en liste, avec la commande <code>list()</code>, puis rassembler la liste en la joignant ''({{lang|en|join}})'' à une chaîne vide : <syntaxhighlight lang="python"> chaine = "blabla" chaineList = list(chaine) chaineList[2] = "c" chaine = "".join(chaineList) print(chaine) # blcbla </syntaxhighlight> Dans une chaîne simple <code>"…"</code> ou <code>'…'</code>, on peut introduire un retour à la ligne avec <code>\n</code>. ==== Substitution de variables ==== Lorsque l'on veut utiliser des variables, on fait précéder les guillemets d'un « f » et l'on écrit les noms de vrariables entre accolades. Par exemple : <syntaxhighlight lang="python"> monde = "world" chaine = f"Hello {monde}!" print(chaine) # Hello world! </syntaxhighlight> On peut indiquer la taille de la chaîne générée à partir de la variable sous la forme <code>{nomVariable:taille}</code>, la taille étant un entier. Par exemple : <syntaxhighlight lang="python"> chiffre1 = 1 nom1 = "un" chiffre2 = 2 nom2 = "deux" chaine = f"{nom1:5} : {chiffre1:5d}\n{nom2:5} : {chiffre2:5d}" print(chaine) # un : 1 # deux : 2 </syntaxhighlight> Vous remarquez que l'on ajoute un « d » pour les entiers décimaux, et que les nombres sont alignés à droite. Si le nombre est un nombre réal à virgule flottante ''({{lang|en|float}})'', on peut indiquer le nombre de décimales sous la forme <code>.''n''f</code> : <syntaxhighlight lang="python"> chaine = f"{np.pi:.5f}" print(chaine) # 3.15169 </syntaxhighlight> Avec la syntaxe <code>''m''.''n''f</code>, on indique également que la totalité du nombre doit occuper ''m'' caractères. Pour convertir un nombre en caractère Unicode correspondant, on utilise la lettre c : <syntaxhighlight lang="python"> nompi = 0x03c0 # Caractère Unicode π : U+03C0 chaine = f"{nompi:c} = {np.pi:.5f}" print(chaine) # π = 3.14159 </syntaxhighlight> La classe ''str'' dispose également de la méthode <code>.format()</code>. On indique un n-uplet de chaînes (ou de nombres) à la méthode et l'on met des accolades dans la chaîne principale ; les accolades sont remplacées dans l'ordre des chaînes de la méthode. On peut changer l'ordre en indiquant quelle valeur utiliser dans quelle accolade. Par exemple : <syntaxhighlight lang="python"> chaine1 = "On compte {} puis {}".format(1, 2) chaine2 = "On compte {0} puis {1}. Mais à rebours, on compte {1} puis {0}.".format("un", "deux") print(chaine1, "\n", chaine2) # On compte 1 puis 2 # On compte un puis deux. Mais à rebours, on compte deux puis un. </syntaxhighlight> L'utilisation du caractère pourcent « % » permet d'utiliser la mise en forme <code>sprintf()</code> du langage C : <syntaxhighlight lang="python"> chaine = "π = %.5f" % np.pi print(chaine) # π = 3.14159 </syntaxhighlight> ; Exemple <nowiki>:</nowikI> barre de progression : Voici une fonction affichant une barre de progression, pour la ''i''-ème étape d'un processus ayant ''n'' étapes (pour la notion de fonction, voir la section ci-après ''[[#Fonction|Fonction]]''). : NB : nous avons utilisé les codes Unicode pour l'exemple, mais on peut évidemment copier le caractère, par exemple depuis une table Unicode ou une page Web<ref>Pour le point médian : ''{{W|Table des caractères Unicode/U0080}}'' ou ''{{W|Point médian}}''. Pour le bloc : ''{{W|Table des caractères Unicode/U2580}}''.</ref>, et le coller dans le code. <syntaxhighlight lang="Python"> def barre_progression(i, n, largeur=40): """ Affiche une barre de progression Entrées : — i : étape en cours, entier ; — n : nombre d'étapes à réaliser, entier ; — largeur : nombre de caractères total de la barre, entier. Sortie : affichage de la barre de progression. """ taux = i/n fait = int(largeur * taux) barre = f"{0x2588:c}"*fait + f"{0x00b7:c}" * (largeur - fait) # U+2588 : bloc "█" ; U+00B7 : point médian "·" print(f"Progression | {barre} | {100*taux:3.1f} %") barre_progression(25, 100) # Progression | ██████████······························ | 25.0 % </syntaxhighlight> ==== Méthodes des chaînes ==== Le type ''str'' dispose d'un certain nombre de méthodes. Nous avons déjà vu les méthodes <code>''str''.join()</code> et <code>''str''.format()</code>, en voici quelques autres : * <code>''str''.capitalize()</code> : met le premier caractère en capitale (majuscule) et les autres en minuscule ; * <code>''str''.lower()</code> : met tout en minuscules ''({{lang|en|lowercase}})'' ; * <code>''str''.upper()</code> : met tout en capitales ''({{lang|en|lowercase}})'' ; * <code>''str''.center(''n'')</code> : met la chaîne au centre d'une chaîne de longueur ''n'', en complétant avec des espaces ; on peut compléter avec d'autres caractères avec <code>''str''.center(''n'', ''c'')</code>, par exemple <code>"a".center(7, ".")</code> donne <code>"....a...."</code> ; * <code>''str''.ljust(''n'', ''c'')</code> et <code>''str''.rjust(''n'', ''c'')</code> : comme <code>.center()</code> mais la chaîne est respectivement alignée au fer à gauche ''({{lang|en|left}})'' et à droite ''({{lang|en|right}})'' ; * <code>''str''.isdigit()</code> : booléen vrai si tous les caractères sont des nombres ; * <code>''str''.find(''sous-chaine'')</code>, <code>''str''.rfind(''sous-chaine'')</code> : indique respectivement le premier emplacement et le dernier emplacement de la sous-chaîne dans la chaîne ; * <code>''str''.partition(''séparateur'')</code> : retourne un triplet avec la portion de chaîne avant le séparateur, le séparateur puis la portion de chaîne après le séparateur ; * <code>''str''.replace(''ancien'', ''nouveau'')</code> : remplace la chaîne ''ancien'' par la chaîne ''nouveau'' dans la chaîne ; * <code>''str''.split(''séparateur'')</code> : découpe la chaîne au niveau des séparateurs et renvoie une liste. ==== Autres fonctions ==== La fonction <code>chr()</code> transforme un code Unicode en caractère. Par exemple, <code>chr(97)</code> donne <code>"a"</code> et <code>chr(0x03c0)</code> donne <code>"π"</code>. Si on veut créer une liste de caractères qui se suivent, on peut par exemple utiliser : <syntaxhighlight lang="python"> [chr(x) for x in range(97, 102)] # ['a', 'b', 'c', 'd', 'e'] </syntaxhighlight> Si on veut créer une liste de nombres sous la forme de chaînes de caractères, on peut utiliser la commande <code>str()</code> vue ci-dessus. Par exemple : <syntaxhighlight lang="python"> [str(x) for x in range(1, 6)] # ['1', '2', '3', '4', '5'] </syntaxhighlight> Pour la syntaxe, voir ci-dessous la section [[#Définition en compréhension|''Définition en compréhension'']]. == Manipulation de listes == Les listes sont une structure de données fondamentale en Python. ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/datastructures.html | langue = en | titre = 5. Data structures | site = Python documentation | consulté le = 2019-03-16 }} === Copie d'une liste === Contrairement à d'autres types, lorsque vos écrivez <code>b = a</code> avec des listes, vous ne créez pas une copie de la variable <code>a</code>, vous créez un ''alias'' : l'objet <code>b</code> est un autre nom de l'objet <code>a</code>. En particulier, si vous modifiez <code>b</code>, vous modifiez en fait <code>a</code>. Par exemple : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a b[2] = 5 print(a, b) # [1, 2, 5, 4] [1, 2, 5, 4] </syntaxhighlight> Si l'on veut créer une copie de <code>a</code>, il faut utiliser <code>a[:]</code> ou bien <code>a.copy()</code> : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a[:] c = a.copy() b[2] = 5 c[2] = 6 print(a, b, c) # [1, 2, 3, 4] [1, 2, 5, 4] [1, 2, 6, 4] </syntaxhighlight> === Méthodes de listes === Pour modifier une liste, vous disposez des méthodes suivantes : * <code>a.append(x)</code> : ajoute l'élément <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.extend(x)</code> : ajoute la liste <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.append(i, x)</code> : aoute l'élément <code>x</code> ''avant'' l'interstice ''i'' de la liste <code>a</code> ; * <code> x = a.pop(i)</code> : enlève l'élément ''i'' de la liste <code>a</code> et le met dans la variable <code>x</code> ; <code> x = a.pop()</code> enlève le dernier élément de la liste ; * <code>a.clear()</code> : vide la liste <code>a</code> ; * <code>a.sort()</code> : trie la liste par ordre croissant ; * <code>a.sort(reverse = True)</code> : trie par ordre décroissant ; * <code>a.reverse()</code> : inverse l'ordre de <code>a</code>. Pour supprimer l'élément à l'indice ''i'', au lieu d'utiliser <code>a.pop(i)</code>, on peut aussi utiliser <syntaxhighlight lang="python"> del(a[i]) </syntaxhighlight> Pour trier une liste, on peut aussi utiliser la fonction <code>sorted()</code>, ce qui permet par exemple de conserver la liste originale, non triée : <code>b = sorted(a)</code>. La fonction <code>sorted()</code> fonctionne avec tous les objets « itérables » comme par exemple une chaîne de caractères : <syntaxhighlight lang="python"> a = "ahjbfk" print(sorted(a)) # ['a', 'b', 'f', 'h', 'j', 'k'] </syntaxhighlight> Pour mettre en évidence la performance de la méthode <code>''list''.sort()</code> par rapport à la fonction générique <code>sorted()</code> : <syntaxhighlight lang="python"> import numpy as np import time a = np.random.rand(int(1e7)) t1 = time.perf_counter() b = sorted(a) # Fonction générique t2 = time.perf_counter() a.sort() # Méthode spécifique t3 = time.perf_counter() print("Sorted :", t2-t1, " s ; .sort :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # Sorted : 14.2... s ; .sort : 1.1... s ; rapport : 12.6... </syntaxhighlight> Par rapport à une valeur donnée : * <code>a.remove(x)</code> : retire la première occurrence de la valeur <code>x</code> de la liste <code>a</code> ; * <code>a.index(x)</code> : indique l'indice où se trouve la première occurrence de la valeur <code>x</code> ; * <code>a.count(x)</code> : indique le nombre de fois que l'on trouve la valeur <code>x</code> dans la liste <code>a</code>. === Définition en compréhension === La [[w:fr:Liste en compréhension|définition en compréhension]] ''({{lang|en|list comprehension}})'' est une méthode permettant de construire des listes en indiquant simplement des axiomes, des consignes de filtrage. Cette méthode est élégante car proche de la notation mathématique et compacte, mais c'est une méthode itérative donc lente par rapport à une méthode vectorisée fournie par le module NumPy. Par exemple, pour créer la liste des carrés des nombres entiers entre 0 et 9, il suffit d'écrire <syntaxhighlight lang="python"> carre = [x**2 for x in range(10)] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x^2 | x \in [0 ; 9] \}</math>. Si l'on veut la liste des nombres strictement inférieurs à 20 dont le carré est supérieur à 10, on peut écrire : <syntaxhighlight lang="python"> X = [x for x in range(20) if x**2 > 10] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x | x \in [0 ; 19], x^2 > 10 \}</math>. Pour mettre en évidence la performance du calcul vectorisé par rapport à la méthode itérative : <syntaxhighlight lang="python"> import time import numpy as np n = int(1e7) # taille de la liste t1 = time.perf_counter() carre = [x**2 for x in range(n)] # Définition en compréhension t2 = time.perf_counter() carre2 = np.arange(n)**2 # Calcul vectorisé t3 = time.perf_counter() print("En compréhension : ", t2-t1, "s ; vectorisé :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # En compréhension : 4.515... s ; vectorisé : 0.156... s ; rapport : 28.982... </syntaxhighlight> == Structure d'un programme == Un programme est simplement une suite d'instructions. Dans les environnements Unix BSD, un programme Python peut être considéré comme un script c'est-à-dire qu'il suffit de taper son nom dans l'invite de commande ''({{lang|en|shell}})'' sans avoir à invoquer <code>python</code>. Le programme doit alors commencer par un en-tête normalisé surnommé ''{{lang|en|[[wikt:shebang|shebang]]}}'' : <syntaxhighlight lang="python"> #!/usr/bin/env python3 </syntaxhighlight> Ce ''{{lang|en|shebang}}'' est inutile avec Jupyter. L'en-tête peut également contenir la description de l'encodage du fichier texte, typiquement : <syntaxhighlight lang="python"> # coding: utf-8 </syntaxhighlight> Le codage UTF-8 est le codage par défaut pour Python 3, il est donc inutile de l'indiquer. Les commentaires sont introduits par le croisillon <code>#</code>. On peut grouper une suite d'instructions dans un bloc. Un bloc d'instructions commence par deux-points « <code>:</code> » et est identé, c'est-à-dire qu'il a une marge constituée de quatre espaces — on peut aussi utiliser une tabulation mais il ne faut pas mélanger les deux méthodes ; les tabulations sont déconseillées, il vaut mieux utiliser quatre espaces<ref>{{lien web | url = https://www.python.org/dev/peps/pep-0008/#tabs-or-spaces | titre = Tabs or Spaces? | site = Python documentation | consulté le = 2019-03-14 }}</ref>. Pour terminer le bloc, il suffit simplement de revenir en début de ligne ; contrairement à d'autres langages, il n'y a pas de commende de fin ''({{lang|en|end}})'', c'est l'indentation qui définit le bloc. : # début du bloc ''instruction 1'' ''instruction 2'' … ''dernière instruction du bloc'' ''instruction hors bloc'' Par exemple, une exécution conditionnelle <code>if</code> ou une boucle <code>for</code> exécute un bloc d'instruction. Si l'on a besoin d'un bloc d'instruction qui « ne fait rien », on utilise l'instruction <code>pass</code>. == Structures de contrôle == '''Boucle itérative''' La boucle itérative s'écrit : <syntaxhighlight lang="python"> for <variable> in <itérable>: <bloc d’instructions> </syntaxhighlight> Si l'on veut que la variable prenne ''n'' valeurs de 0 à ''n'' – 1, on utilise l'instruction <code>range()</code> : <syntaxhighlight lang="python"> for i in range(5): print(i) print("Fin de la boucle") </syntaxhighlight> <code>[▶]</code> 0 1 2 3 4 Fin de la boucle En fait, la commande <code>range()</code> extrait des valeurs de l'ensemble des nombres entiers ; on peut ainsi utiliser le découpage en tranches, par exemple <code>range(2, 5)</code>pour avoir la « liste » <code>[2, 3, 4]</code>. Notez que <code>range()</code> ne crée pas à proprement parler une liste, cela crée un objet de type ''« {{lang|en|range}} »'' (plage, intervalle) ; pour avoir une liste, il faut écrire <code>list(range(n))</code>. Dans une boucle, la commande <code>continue()</code> saute la fin du bloc d'instruction et passe à la valeur suivante de la boucle. La commande <code>break()</code> interrompt la boucle et passe à la suite. '''Exécution conditionnelle''' L'exécution conditionnelle s'écrit : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> </syntaxhighlight> On peut utiliser les commandes <code>elif</code> ''(else if'') et <code>else</code> : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> elif <booléen>: <bloc d’instructions> else: <bloc d’instructions> </syntaxhighlight> Notez que le test d'une condition est gourmand en ressources. S'il s'agit de savoir si l'on effectue une opération mathématique simple ou pas, on peut remplacer le test par une multiplication par un booléen (<code>True</code> vaut 1, <code>False</code> vaut 0). Par exemple, plutôt que d'écrire <syntaxhighlight lang="python"> if a > 0: b = b - c </syntaxhighlight> mieux vaut écrire : <syntaxhighlight lang="python"> b = b - (a > 0)*c </syntaxhighlight> '''Boucle antéconditionnée''' La boucle antéconditionnée s'écrit : <syntaxhighlight lang="python"> while <booléen>: <bloc d’instructions> </syntaxhighlight> Cette boucle peut contenir des instructions <code>continue()</code> et <code>break()</code>. == Fonction == La déclaration d'une fonction utilise la commande <code>def</code>. La fonction est un bloc d'instructions. Si elle doit renvoyer des valeurs, on utilise la commande <code>return</code>. Par exemple <syntaxhighlight lang="python"> def nombres(n): """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo a = nombres(3) print(a) </syntaxhighlight> La fonction commence par une chaîne de caractères qui la décrit. Cette chaîne peut être récupérée automatiquement par certains logiciels pour faire une documentation automatique. Si la description prend plusieurs lignes, elle commence et finit par trois double-guillemets <code>"""…"""</code> ; en fait, par convention, même si cela n'est pas obligatoire, les descriptions sont toutes encadrées de trois double-guillemets. Cette description est appelée ''{{lang|en|docstring (documentation string)}}''. Pour récupérer les ''{{lang|en|docstrings}}'' : <syntaxhighlight lang="python"> def foo(): """Cette fonction ne fait rien""" pass print(foo.__doc__) # Cette fonction ne fait rien </syntaxhighlight> L'instruction <code>input()</code> permet à l'utilisateur de saisir une valeur. La valeur est retournée sous la forme d'une chaîne de caractères qui est ensuite convertie en nombre réel avec l'instruction <code>float()</code>. On peut définir une valeur par défaut en l'indiquant dans l'en-tête de la définition de la fonction, de la manière suivante : <syntaxhighlight lang="python"> def nombres(n=1): # valeur par défaut : 1 """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo </syntaxhighlight> Si le paramètre à initialiser est de type modifiable ''({{lang|en|mutable}})'', comme par exemple une liste, il faut procéder comme suit : <syntaxhighlight lang="python"> def fooFonction(fooListe=None): # valeur par défaut : n'existe pas """Description""" if fooListe = None: fooListe = [] # initialisation <suite des instructions> </syntaxhighlight> Par défaut, les variables sont locales. On peut rendre une variable globale avec l'instruction <code>global</code> ''à l'intérieur de la fonction'', avant l'utilisation de la variable. Par exemple : <syntaxhighlight lang="python"> a = 1 b = 1 def toto(): """Test de variable globale. Entrée : aucune. Sortie : aucune.""" global a a = 2 b = 2 toto() print("a =", a, "; b =", b) # a = 2 ; b = 1 </syntaxhighlight> Pour être plus précis : si une variable n'est pas assignée dans une fonction, alors Python va chercher une variable du même nom à l'extérieur de la fonction. Mais à partir du moment où la variable est assignée dans la fonction, elle devient locale ''sauf'' si l'on a utilisé l'instruction <code>global</code>. Si l'on s'attend à un nombre indéfini d'arguments, on utilise la notion d'empaquetage/dépaquetage ''({{lang|en|packing/unpacking}})''<ref>{{lien web | url = https://deusyss.developpez.com/tutoriels/Python/args_kwargs/ | titre = Introduction à *args et **kwargs | consulté le = 2019-03-09 | site = Developpez.com }}.</ref>. L'empaquetage consiste à mettre les arguments dans un n-uplet, le dépaquetage consiste à développer un n-uplet en plusieurs variables. Cela se fait en mettant un astérisque ''({{lang|en|splat}})'' « <code>*</code> » devant le nom de la variable. Par convention, on utilise le nom de variable <code>*args</code> mais cela n'est pas obligatoire. <syntaxhighlight lang="python"> def concatenation(*args): """Concatène des chaînes de caractères Entrée : *args, n-uplet de chaînes de caractères. Sortie : resultat, chaîne de caractères.""" resultat = "" for i in args: resultat = resultat + i return resultat concatenation("a", "foo", "toto") # 'afoototo' </syntaxhighlight> À l'inverse, si une fonction doit recevoir plusieurs paramètres, on peut à la place lui transmettre une liste à dépaqueter : <syntaxhighlight lang="python"> def addition(a, b): """Ajoute deux nombres Entrées : — a : réel ; — b : réel. Sortie : a+b, réel""" return a+b arg = (1, 2) addition(*arg) # 3 </syntaxhighlight> On peut aussi empaqueter/dépaqueter un dictionnaire, on utilise pour cela deux astérisques « <code>**</code> ». Par convention, on utilise le nom <code>**kwargs</code> sans que cela soit obligatoire. L'instruction <code>lambda</code> permet de créer de petites fonctions ne contenant pas de boucle ni de branchement conditionnel. Cependant, si la déclaration est courte et compacte, le code n'est pas toujours facilement lisible ; l'utilisation de cette instruction n'est pas recommandée. Par exemple l'expression <syntaxhighlight lang="python"> f = lambda x: 2*x </syntaxhighlight> est la même chose que <syntaxhighlight lang="python"> def f(x): """Calcule le double. Entrée : x, réel. Sortie : 2*x, réel.""" return 2*x </syntaxhighlight> {{note|L'instruction <code>eval()</code> exécute une chaîne de caractères, c'est-à-dire traite une chaîne de caractères comme si c'étaient des instructions données à Python. Cette instruction est à éviter pour deux raisons : # Un utilisateur malveillant pourrait entrer du code malveillant dans la chaîne de caractères. # L'exécution est lente puisque Python doit compiler la chaîne à la volée. Cette instruction peut en général être remplacée par une autre instruction. }} == Gestion des erreurs == Dans un bloc d'instructions, on peut utiliser la structure <code>try:… except:</code>. Le bloc après <code>try</code> est exécuté ; si une erreur se déclare dans ce bloc, alors le bloc <code>except</code> s'exécute. Par exemple <syntaxhighlight lang="python"> try: 1/0 # Génère une erreur except: print("Division par zéro") # Cette instruction est donc exécutée </syntaxhighlight> On peut compléter avec <code>else:</code> et <code>finally:</code> : <syntaxhighlight lang="python"> try: <code à exécuter> except: <s’exécute en cas d’erreur> else: <s’exécute s’il n’y a pas d’erreur> finally: <s’exécute dans tous les cas> </syntaxhighlight> On peut séparer les différents types d'erreur : <syntaxhighlight lang="python"> try: <code à exécuter> except ValueError: print("Valeur erronée") except TypeError: print("Type erroné") </syntaxhighlight> Les types d'erreur les plus courants sont : * <code>NameError</code> : le nom de variable n'existe pas ; * <code>TypeError</code> : la valeur n'est pas du bon type ; * <code>ValueError</code> : la valeur n'est pas compatible avec ce qui est attendu ; * <code>RuntimeError</code> : type d'erreur général. On peut aussi créer ses propres erreurs : si une situation erronée survient, on peut « lever » une exception avec <code>raise</code>. Par exemple <syntaxhighlight lang="python"> if a < 0: raise ValueError("La valeur doit être positive") </syntaxhighlight> ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/errors.html | titre = Errors and exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} * {{lien web | url = https://docs.python.org/3/library/exceptions.html | titre = Built-in Exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} == Exercices == === Calcul du PGCD et du PPCM par l'algorithme d'Euclide === {{loupe|w:Algorithme d'Euclide}} Écrire un programme Python qui demande deux nombres entiers et affiche leurs PGCD et PPCM. Le programme utilisera l'algorithme d'Euclide. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """Programme : euclide.py Auteur : User:cdang date : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : calcule le PGCD et le PPCM de deux nombres entiers. Entrée ------ au clavier, saisie de deux nombres entiers. Sorties ------- à l'écran, affichage du PGCD et du PPCM. """ # *************** # *************** # ** Fonctions ** # *************** # *************** def euclide(): """Calcule le PGCD et le PPCM avec l'algorithme d'Elclide Entrée ------ Aucune, la saisie des paramètres fait partie de la fonction Sortie ------ affichage du PGCD et du PPCM """ print("***** Algorithme d'Euclide *****\n") a0 = int(input("Premier nombre entier : a = ")) b0 = int(input("Second nombre entier : b = ")) a = a0 b = b0 r = a%b # initialisation while (r != 0) : # algorithme d'Euclide a = b b = r r = a%b # affichage des résultats print("PGCD(", a0, ", ", b0, ") = ", b) print("PPCM(", a0, ", ", b0, ") = ", a0*b0//b) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* euclide() </syntaxhighlight> On peut simplifier la boucle centrale : <syntaxhighlight lang="python"> while b: # s'exécute tant que b n'est pas 0 a, b = b, a % b # affectation de liste à liste return a </syntaxhighlight> {{boîte déroulante fin}} Notez que le module NumPy propose l'instruction <code>gcd()</code> : <syntaxhighlight lang="python"> import numpy … print(numpy.gcd(a, b)) </syntaxhighlight> === Tours de Hanoï === {{loupe|w:Tours de Hanoï}} Écrire un programme Python qui demande le nombre ''n'' de plateaux et affiche les manipulations nécessaires pour déplacer la pile d'un emplacement à un autre. Le programme utilisera l'algorithme récursif. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """nom : hanoi.py auteur : User:cdang date de création : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : résout le problème des tours de Hanoï Entrées ------- trois chaînes de caractères (nom des piliers) Sorties ------- une chaîne de caractères (liste des opérations) """ # *************** # *************** # ** Fonctions ** # *************** # *************** def hanoi(a, b, c, n): """Résout le problème des tours de Hanoï de manière récursive But : déplace la pile de n disques du piler a au pilier b Entrées ------- a, b c : chaînes de 1 caractère, référence des emplacements ; n : entier, nombre de disques sur l'emplacement a Sorties ------- operations : chaînes de caractères décrivant les opérations """" if n>1: operations = hanoi(a, c, b, n-1) operations = operations+a+"→"+b+" ; " operations = operations+hanoi(c, b, a, n-1) else: operations = a+"→"+b+" ; " return operations # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* resultat = hanoi("1", "2", "3", 3) print(resultat) </syntaxhighlight> {{boîte déroulante fin}} === Lancer de rayons === [[Fichier:Lentille hemispherique perspective.svg|vignette|Lentille hémisphérique.]] Considérons une lentille hémisphérique de rayon R faite d’un verre d’indice de réfraction ''n''. Nous plaçons une source ponctuelle à une distance ''d'' du dioptre plan, sur l’axe optique. Tracer des rayons partant de la source et traversant la lentille. {{clear}} {{Boîte déroulante/début |titre=Analyse d’optique géométrique}} [[Fichier:Lentille hemispherique analyse geometrique.svg|vignette|Analyse géométrique du problème.]] Il s’agit d’un problème ayant une symétrie de révolution par rapport à l’axe optique. Nous pouvons nous réduire à un problème plan en nous plaçant dans un plan contenant l’axe optique ; l’axe optique est encore un axe de symétrie orthogonale, nous pouvons donc nous contenter d'étudier un demi-plan. Pour simplifier, nous plaçons le centre du dioptre sphérique à l’origine O du repère. L’axe optique est l’axe ''x'' et l'axe perpendiculaire, vertical sur la figure, c’est l’axe ''y''. Les coordonnées de la source sont donc (-''d'' ; 0). Le rayon issu de la source et faisant un angle θ avec l’axe ''x'' frappe le dioptre plan à l’altitude ''h''. Nous avons : : ''h'' = ''d'' ⋅ tan θ. L’angle d’incidence vaut θ. D’après la loi de Snell-Descartes, l'angle de réfraction θ<sub>2</sub> vaut : : θ<sub>2</sub> = arcsin((sin θ) / ''n''). Le rayon réfracté passe par le points de coordonnées (0, ''h''). L’équation de la droite est donc : : ''y'' = a ⋅ ''x'' + ''h'' avec : ''a'' = tan θ<sub>2</sub>. L’équation du cercle de centre O et de rayon R est : : ''x''<sup>2</sup> + ''y''<sup>2</sup> = R<sup>2</sup>. Les coordonnées (''x''<sub>M</sub>, ''y''<sub>M</sub>) de l’intersection M du rayon avec le dioptre sphérique vérifient les deux équations. Par substitution, nous obtenons une équation du second degré en ''x'' que nous savons résoudre : : ''x''<sub>M</sub><sup>2</sup> + (''a'' ⋅ ''x''<sub>M</sub> + ''h'')<sup>2</sup> = R<sup>2</sup> : ⇔ (1 + ''a''<sup>2</sup>) ⋅ ''x''<sub>M</sub><sup>2</sup> + 2 ⋅ ''a'' ⋅ ''h'' ⋅ ''x''<sub>M</sub> + ''h''<sup>2</sup> – R<sup>2</sup> = 0. D’après les propriétés du cercle, le rayon est perpendiculaire à la tangente. Le rayon [OM] est donc normal au dioptre en M. Nous pouvons déterminer l’angle d’incidence θ<sub>i</sub> par le produit scalaire : : <math>\begin{pmatrix} 1 \\ a \end{pmatrix} \cdot \begin{pmatrix} x_\mathrm{M} \\ y_\mathrm{M} \end{pmatrix} = \sqrt{1^2 + a^2} \cdot \mathrm{R} \cdot \cos(\theta_\mathrm{i})</math> ce qui nous permet de calculer cet angle : : <math>\theta_\mathrm{i} = \operatorname{arcos} \left ( \frac{x_\mathrm{M} + a \cdot y_\mathrm{M}}{\mathrm{R} \cdot \sqrt{1^2 + a^2} } \right )</math> Comme nous passons vers un milieu d’indice plus faible, il y a un risque de réflexion totale. L’angle limite est : : θ<sub>max</sub> = arcsin(1/''n''). Si l’on a θ<sub>i</sub> &gt; θ<sub>max</sub>, le rayon repart vers l’intérieur. Nous ne traçons pas le rayon car cela nous emmènerait trop loin dans l’analyse. En revanche, si θ<sub>i</sub> ≤ θ<sub>max</sub>, alors nous pouvons appliquer la loi de Snell-Descartes pour avoir l’angle de réfraction θ<sub>e</sub> : : θ<sub>e</sub> = arcsin(''n'' ⋅ sin θ<sub>i</sub>). Pour tracer le rayon sortant, il nous faut l’angle θ<sub>3</sub> par rapport à l’horizontale. L’angle du rayon [OM] par rapport à l’horizontal vaut arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>), nous avons donc : θ<sub>3</sub> = arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>) + θ<sub>e</sub>. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Analyse algorithmique}} '''Structure des données''' Le problème est décrit par trois paramètres : # Le rayon <code>R1</code> de la lentille, en milliètres (réel en virgule flottante). # L’indice du verre, <code>n</code> sans dimension (réel en virgule flottante). L’indice de l’air vaut 1. # La distance de la source au dioptre d’entrée plan, <code>d</code> en millimètres (réel en virgule flottante). Un rayon est caractérisé par quatre paramètres : # L’angle d’émission <code>theta1</code> en radians (réel en virgule flottante). # L’angle de réfraction dans la lentille <code>theta2</code> en radians (réel en virgule flottante). # Les cordonnées <code>M</code> en millimètre (vecteur de dimension 2 <code>([x, y])</code> de réels en virgule flottante) du point d’intersection du rayon avec le dioptre sphérique. # L’angle de réfraction dans l’air après la lentille <code>theta3</code> en radians (réel en virgule flottante). Pour le calcul et le tracé, nous avons besoin des paramètres intermédiaires suivants : * l’altitude ''y'' = <code>h</code> en millimètres (réel en virgule flottante) à laquelle le rayon frappe le dioptre plan d’entrée ; * l’angle d’incidence du rayon avec le dioptre sphérique <code>thetaint</code> en radians (réel en virgule flottante). Les angles sont stockés en radians car c’est l’unité naturelle pour le calcul mais nous affichons les valeurs en degrés. Comme le calcul de conversion est récurrent, nous conservons les facteurs <code>degversrad</code> (conversion des degrés vers les radians, facteur valant π/180, réel en virgule flottante) et <code>radversdeg</code> (conversion des radians vers les degrés, facteur valant 180/π, réel en virgule flottante). '''Fonctions''' Nous avons besoin d’une fonction qui calcule les trois paramètres du rayon <code>(theta2, M, theta3)</code> à partir de l’angle d’émission <code>theta1</code>. Nous appelons cette fonction <code>lanceRayon()</code>. Cette fonction fait appelle à une fonction qui calcule l’angle du rayon réfracté à partir de l’angle du rayon incident <code>theta1</code>, les deux angles étant par rapport à la normale au dioptre au point considéré. Nous appelons cette fonction <code>refrac()</code>. La recherche de l’intersection <code>M</code> du rayon avec le dioptre sphérique nécessite de résoudre une équation du second degré. Nous utilisons pour cela la recherche des racines du polynôme en <code>x</code> avec la fonction <code lang="python">numpy.polynomial.polynomial.polyroots()</code>. D’après la configuration du problème géométrique, si l’on s’assure que le rayon frappe bien la lentille (0 ≤ <code>h</code> ≤ <code>R1</code>) alors nous sommes sûrs que le problème a deux solutions réelles (une positive et une négative) ou, dans le cas dégénéré où <code>h == R1</code>, une valeur unique <code>x == 0</code>. Comme nous recherchons la valeur positive, nous sélectionons la plus grande des deux racines. Pour la gestion de la réflexion interne : dans la fonction <code>refrac()</code>, nous vérifions les conditions de réflexion totale et si elles sont remplies, alors nous générons une erreur (commandes <code lang="python">try… except</code> et <code lang="python">raise ValueError</code>). Cette erreur est propagée à la fonction <code>lanceRayon()</code> : <code>lanceRayon()</code> appelle la fonction <code>refrac()</code> et si cette fonction renvoie une erreur, alors <code>lanceRayon()</code> renvoie également une erreur. Pour trouver l’angle d’émission <code>thetaLimite</code> provoquant la réflexion totale (en radians, réel en virgule flottante), nous effectuons une recherche par dichotomie : * nous partons de l’angle maximum possible, lorsque le rayon frappe le sommet de la lentille, et nous appelons la fonction <code>lanceRayon()</code> ; si cela ne génère pas d’erreur, alors nous pouvons aller jusqu’à cette valeur, la recherche est terminée ; si cela génère une erreur, alors nous divisons la valeur par deux ; * à une étape de la recherche donnée, si <code>lanceRayon()</code> ne génère pas d’erreur avec l’angle testé, alors nous savons que l’angle limite est supérieur à cette valeur ; cette valeur minore donc la valeur recherchée ; si au contraire <code>lanceRayon()</code> génère une erreur, alors c’est que l’angle est trop important, cette valeur majore donc la valeur recherchée ; nous pouvons ainsi resserer l’intervalle de recherche ; * nous nous arrêtons lorsque les valeurs haute et basse sont suffisamment proche. Concrètement : # Nous définissons une variable <code>angleHaut</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus bas connu provoquant la réflexion totale. # Nous définissons une variable <code>angleBas</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus haut connu ne provoquant pas de réflexion totale. Sa valeur initiale est 0. L’angle limite recherché est donc entre <code>angleBas</code> et <code>angleHaut</code>. # Nous définissons l’angle <code>angleTest</code> comme étant la moyenne entre <code>angleBas</code> et <code>angleHaut</code>. Si <code>lanceRayon(angleTest)</code> génère une erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleHaut</code> (puisque c’est une valeur provoquant la réflexion totale et qu’elle est plus basse que la valeur actuelle d’<code>angleHaut</code>). À l’inverse, si <code>lanceRayon(angleTest)</code> ne génère pas d’erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleBas</code> (puisque c’est une valeur ne provoquant pas la réflexion totale et qu’elle est plus haute que la valeur actuelle d’<code>angleBas</code>). # Nous arrêtons la procédure lorsque l’écart entre <code>angleBas</code> et <code>angleHaut</code> est inférieur à {{unité|10|échelle=<sup>–3</sup>|rad}} (valeur arbitraire). La valeur retenue est la valeur finale d’<code>angleBas</code> (puisque l’on veut être sûr qu’il n’y ait pas de réflexion totale). La valeur affichée est la valeur en degrés arrondie au dixième. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Solution}} Nous demandons à l’utilisateur ou à l’utilisatrice les valeurs des paramètres du problème : rayon de la lentille, distance de la source, indice de réfraction du verre. Nous vérifions que les valeurs entrées sont bien des nombres ; si c’est une chaîne vide, alors nous utilisons une valeur par défaut. Nous créons une fonction <code>refrac()</code> qui permet de calculer l’angle réfracté à partir de l’angle d’incidence et des indices de réfraction. S’il y a rélexion totale, alors nous générons une erreur. La fonction <code>lanceRayon()</code> calcule les différents points de passage du rayon. Elle appelle pour cela la fonction <code>refrac()</code>. Si un appel de la commande <code>refrac()</code> génère une erreur, alors nous générons également une erreur. Nous déterminons l’angle d’émision du rayon <code>thetaLimite</code> qui provoque une réflecxion totale. Pour cela, nous créons une fonction <code>rechercheLimite()</code> qui cherche par dichotomie. Nous traçons un rayon tous les 5° jusqu’à la valeur limite. <syntaxhighlight lang="python"> #!/usr/bin/env python3 # coding: utf-8 """nom : lancerRayons.py auteur : User:cdang date de création : 2022-05-06 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : NumPy, matplotlib ---------------------------------------------------------------------------- Objectif : trace des trajets optique avec une lentille hémisphérique Entrées ------- Le rayon de la lentille, la distance de la source, l’indice de réfraction du verre, trois chaînes de caractères saisies par l’utilisateur·rice et qui sont converties en réels. Sorties ------- La valeur limite de l’angle (réel) et le tracé de plusieurs rayons. """ # ****************************************************** # ****************************************************** # ** Lancer de rayons pour une lentille hémisphérique ** # ****************************************************** # ****************************************************** import numpy as np import matplotlib.pyplot as plt import numpy.polynomial.polynomial as nppol # ************** # * Constantes * # ************** # Pour la conversion degrés ↔ radians radversdeg = 180/np.pi degversrad = 1/radversdeg # ************* # * Fonctions * # ************* def boucleEntreeNombre(messageSaisie, valeurDefaut): """Permet de s’assurer que l’utilisateur·rice a bien entré un nombre. Entrée : — message à afficher (chaîne de caractères) ; — valeur par défaut (réel à virgule flottante). Sortie : nombre (réel à virgule flottante).""" messageErreur = "Veuillez entrer une valeur numérique (ou vide pour accepter la valeur par défaut).\n" execute = True while execute: strNombre = input(messageSaisie+f" (valeur par défaut {valeurDefaut}) : ") if strNombre == "": nombre = valeurDefaut execute = False else: try: nombre = float(strNombre) except: print(messageErreur) else: execute = False return nombre def initialisation(): """L’utilisateur·rice entre les variables du problème. Entrées : aucune. Sorties : — R1 (mm) : rayon de la lentille ; — d (mm) : distance de la source au dioptre plan ; — n (sans dimension) : indice de réfraction du verre.""" R1 = boucleEntreeNombre("Rayon de la lentille en mm", 20.0) d = boucleEntreeNombre("Distance de la source au dioptre plan en mm", 20.0) n = boucleEntreeNombre("Indice de réfraction (sans dimension)", 1.5) return (R1, d, n) def refrac(n1, n2, theta1): """Calcule l’angle de réfraction theta2 (radians) en fonction — de l’angle d’incidence theta1 (radians); — de l’indice de réfraction n1 du premier milieu ; — de l’indice de réfraction n2 du second milieu.""" reflexionTotale=False rapport=n2/n1 rapportinv=np.reciprocal(rapport) if n1 > n2: thetal = np.arcsin(rapport) # angle limite pour la réflexion totale if theta1 >= thetal: reflexionTotale=True if reflexionTotale: print("Réflexion totale") raise ValueError else: return np.arcsin(rapportinv*np.sin(theta1)) def lanceRayon(n1, n2, d, R, theta1): """Détermine le rayon issu de la source située à une distance d (mm) du bareau et avec une élévation de theta1 (radians), en fonction des indices de réfraction n1 et n2. Les éléments retournés sont : — la hauteur h (mm) à laquelle le rayon frappe le barreau ; — l’angle de réfraction theta2 (radians)) dans le barreau ; — l’angle de réfraction theta3 (radians) à la sortie du barreau — le point M(x, y) (mm) auquel le rayon sort du barreau.""" h = d*np.tan(theta1) if h >= R: print("Le rayon est au-dessus du barreau") raise ValueError else: theta2 = refrac(n1, n2, theta1) a = np.tan(theta2) x = max(nppol.polyroots([h*h - R*R, 2*a*h, 1+a*a])) # recherche de l’intersection du rayon avec le cercle y = a*x + h M = np.array([x, y]) thetaint = np.arccos((x + a*y)/(R*np.sqrt(1 + a*a))) theta3 = np.arctan(y/x) - refrac(n2, n1, thetaint) return (h, theta2, theta3, M) def rechercheLimite(n1, n2, d, R): """Recherche l’angle limite pour la réflexion totale. Entrée : — indice de réfraction des milieux 1 et 2, n1 et n2 ; — distance au barreau, d(mm). Sortie : angle limite theta (radians)""" angleHaut = np.arctan(R/d) angleBas = 0 angleTest = angleHaut try: lanceRayon(n1, n2, d, angleTest, R) except: condition = True # il y a réflexion total en haut de la lentille else: condition = False # il n’y a jamais réflexion totale dans la lentille while condition: #dichotomie angleTest = np.mean([angleHaut, angleBas]) # on ajuste la valeur de test try: lanceRayon(n1, n2, d, R, angleTest) except: angleHaut = angleTest # réflexion totale : on abaisse la valeur maximale else: angleBas = angleTest # pas de réflexion totale : on monte la valeur minimale condition = ((angleHaut - angleBas) >= 0.001) # on a cerné la limite à 0,001 rad près if not condition: angleTest = angleBas return angleTest # *********************** # * Programme principal * # *********************** (R1, d, n) = initialisation() xmax = round(R1 + d) thetaLimite = rechercheLimite(1, n, d, R1) thetaLimiteDeg = thetaLimite*radversdeg print(f"Angle limite pour la réflexion totale : {thetaLimiteDeg:.1f}°.\n") anglesDeg = np.arange(0, thetaLimiteDeg, 5)[1:] # trace un rayon tous les 5° anglesRad = anglesDeg*degversrad nb = len(anglesDeg) h = np.zeros(nb) # initialisation des vecteurs de valeurs theta2 = np.zeros(nb) theta3 = np.zeros(nb) M = np.zeros((nb, 2)) for i in range(nb): (h[i], theta2[i], theta3[i], M[i, :]) = lanceRayon(1, n, d, R1, anglesRad[i]) (h_lim, theta2_lim, theta3_lim, M_lim) = lanceRayon(1, n, d, R1, thetaLimite) # tracé anglesCercle = 0.5*np.pi*(np.linspace(1, 0, 20)) x_cercle = R1*np.cos(anglesCercle) # coordonnées des pints du cercle y_cercle = R1*np.sin(anglesCercle) fig = plt.plot([-d,xmax], [0, 0], "k-.", linewidth="0.5") # tracé de l’axe optique for i in range(nb): plt.plot([-d, 0, M[i, 0], xmax], [0, h[i], M[i, 1], M[i, 1] + (xmax - M[i, 0])*np.tan(theta3[i])], label=f"{anglesDeg[i]:.0f}°") plt.plot([-d, 0, M_lim[0], xmax], [0, h_lim, M_lim[1], M_lim[1] + (xmax - M_lim[0])*np.tan(theta3_lim)], label=f"{0.1*int(np.trunc(10*thetaLimite*radversdeg)):.1f}°") plt.plot(x_cercle, y_cercle, "k", linewidth="0.5") # tracé du cercle plt.plot([0,0], [0, R1], "k", linewidth="0.5") # tracé du premier dioptre #plt.axis("square") plt.gca().set_aspect("equal", adjustable="box") plt.xlabel("x (mm)") plt.ylabel("y (mm)") plt.title("Lentille hémisphérique, lancer de rayons") plt.legend() plt.savefig("lentille_hemispherique_lancer_rayon.svg", format="svg") plt.show() </syntaxhighlight> {{Boîte déroulante/fin}} == Mesurer le temps == Le module <code>time</code> fournit les fonctions suivantes : * <code>time.gmtime()</code> : renvoie la date et l'heure du méridien de Greenwich (''{{lang|en|Greenwich mean time}}'', GMT), sous la forme d'un dictionnaire (année, mois, jour du mois, heure, minute, seconde, jour de la semaine, jour de l'année, heure d'été/hiver), ** jour de la semaine est un entier entre 0 (lundi) et 6 (dimanche), ** jour du mois est un entier entre 1 et 366 ; * <code>time.localtime()</code> : comme le précédent, mais l'heure est l'heure locale ; * <code>time.time()</code> : donne le nombre de seconde qui se sont écoulées depuis le 1er janvier 1970 ; * <code>time.gmtime(n)</code> et <code>time.localtime(n)</code> transforment un nombre de secondes (écoulées depuis le 1er janvier 1970) en une date au format (année, mois, jour, etc.), n-uplet de neuf valeurs ; <code>time.mktime()</code> fait le contraire, il transforme un n-uplet de neuf valeurs (années, mois, jour, etc.) en un nombre de secondes (écoulées depuis le 1er janvier 1970) ; * <code>time.sleep(n)</code> : provoque une pause dans le déroulement du programme de ''n'' secondes ; * <code>time.perf_counter()</code> : indique une date en seconde ; s'utilise pour mesurer la durée d'exécution d'une partie du code, en faisant la différence entre deux relevés. Concernant la date et l'heure sous la forme d'un n-uplet, on peut extraire l'heure de la manière suivante : <syntaxhighlight lang="python"> import time a = time.localtime() print("Il est ", a[3], "h", a[4]) # ou bien print("Il est ", a.tm_hour, "h", a.tm_min) </syntaxhighlight> Pour mesurer la performance d'une portion de code : <syntaxhighlight lang="python"> import time t1 = time.perf_counter() <suite d’instructions> t2 = time.perf_counter() print("Durée d'exécution :", t2-t1 </syntaxhighlight> == Programmation orientée objet == Nous n'allons pas ici faire un cours de programmation orientée objet (POO), nous allons aborder le sujet de manière pragmatique. De manière schématique, un « objet » est une « super-variable ». Cette super-variable peut contenir plusieurs variables, appelées « attributs » ; elle contient en fait un dictionnaire (paires « nom d'attribut : valeur d'attribut »). Elle peut aussi contenir des fonctions spécifiques appelées « méthodes ». De même qu'une variable a un type, un objet fait partie d'une « classe ». La classe est le modèle de l'objet ; en franglais informatique, on dit que l'objet est une instance de la classe. La POO est donc un formalisme : lorsque l'on définit des variables et des fonctions concernant un même type d'objet (au sens commun du terme), on les empaquette dans une classe. Il faut donc d'abord définir la classe, puis attribuer cette classe à un objet (« instancier » la classe). Considérons par exemple que nous voulons travailler sur des [[w:Engrenage|engrenages]] ; pour simplifier, nous nous contentons d'engrenages à dentures droites. Une roue dentée, un pignon, est essentiellement définie par son nombre de dents Z et par son module ''m'' qui correspond à la largeur de dents<ref>ainsi que par son épaisseur ''e'' et le matériau dont elle est faite mais nous allons négliger ces paramètres pour la simplicité de l'étude.</ref>. Nous allons définir trois méthodes : la méthode <code>.diametrePrimitif()</code> qui calcule le diamètre primitif de la roue dentée, <code>.pas()</code> qui calcule la largeur des dents au niveau du cercle primitif et <code>.rapport()</code> qui calcule le rapport de transmission de deux roues engrenées Z<sub>1</sub>/Z<sub>2</sub>. La méthode <code>.rapport()</code> vérifie par ailleurs que les roues ont le même module, condition indispensable pour former un engrenage. Nous définissons la classe ainsi : <syntaxhighlight lang="python"> class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): # instructions lancées lors de la déclaration """Valeurs des attributs""" self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z </syntaxhighlight> Nous remarquons que lorsque nous déclarons les méthodes, le paramètre <code>self</code> correspond à l'objet lui-même. Ainsi, dans la méthode <code>.rapport()</code>, la variable <code>self.Z</code> est le nombre de dents de la roue elle-même et <code>roueDentee.Z</code> est le nombre de dents de la roue passée en paramètre. Pour déclarer les roues, nous écrivons : <syntaxhighlight lang="python"> roue1 = pignon() # attribution de la classe, « instanciation » roue1.Z = 13 # définition des caractéristiques du pignon « roue1 » roue1.m = 2 roue2 = pignon(16, 2) # manière alternative </syntaxhighlight> Nous pouvons alors utiliser les objets de la manière suivante : <syntaxhighlight lang="python"> print(roue1.Z) # 13 print(roue1.diametrePrimitif()) # 26 R = roue1.rapport(roue2) # 0.8125 </syntaxhighlight> La commande <code>dir(a)</code> affiche tous les attributs et méthodes de l'objet <code>a</code>. ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/classes.html | titre = Classes | site = Python documentation | consulté le = 2019-03-08 }} == Interface graphique avec Tk == Une interface graphique utilisateur (GUI, ''{{lang|en|graphic user interface}}'') est un ensemble de boîtes permettant d'interagir avec l'utilisateur c'est-à-dire permettre la saisie d'informations, l'exécution d'actions et afficher des informations. Elle se compose d'éléments appelés ''{{lang|en|widgets}}''. Les éléments ''({{lang|en|widgets}})'' classiques sont : * boîte de dialogue ''({{lang|en|dialog box}})'' : fenêtre contenant d'autres éléments ; * étiquette ''({{lang|en|label}})'' : texte affiché ; * liste déroulante ''({{lang|en|drop-down list}})'' : zone permettant le choix d'une option, la liste se déployant lorsque l'on clique sur la zone ; * zone de texte, champ de saisie ''({{lang|en|text box}})'' : zone permettant de taper du texte ; * boîte combinée ''({{lang|en|combo box}})'' : zone de saisie de texte contenant une liste déroulante qui permet de choisir des éléments prédéfinis ; * bouton ''({{lang|en|button}})'' : objet effectuant une action lorsque l'on clique dessus ; * case à cocher ''({{lang|en|checkbox, tickbox}})'' : objet permettant d'activer ou de désactiver une option lorsque l'on clique dessus ; * bouton radio, case d'option ''({{lang|en|radio button}})'' : objet permettant d'activer une option en désactivant les autres options ; une seule option peut être activée à la fois. Plusieurs modules permettent de gérer les interfaces graphiques. Nous choisissons ici le module développé sur la bibliothèque Tk qui est une bibliothèque multiplateforme. Pour cela, nous importons le module <code>tkinter</code> ainsi que le module <code>ttk</code>, ce dernier proposant des options plus « modernes » : <syntaxhighlight lang="python"> import tkinter as tk from tkinter import ttk </syntaxhighlight> Voici un programme permettant comme précédemment de calculer le rapport de transmission d'un engrenage. Nous détaillons sa construction ci-après. <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: IUrapport.set(valeurZ2/valeurZ1) except: IUrapport.set("erreur") # ************************* # ************************* # ** Interface graphique ** # ************************* # ************************* # fenetre principale fenetre = tk.Tk() fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> '''Explications''' Nous commençons par définir la boîte de dialogue que nous appelons <code>fenetre</code> ; c'est un objet <code>Tk</code> et nous lui donnons un titre « » : <syntaxhighlight lang="python"> fenetre = tk.Tk() fenetre.title("Rapport de réduction") </syntaxhighlight> Puis, nous définissons un cadre attaché à cette fenêtre et qui va nous permettre « d'accrocher » les autres éléments, ce qui permet de garder une apparence satisfaisante lorsque l'on retaille la fenêtre : <syntaxhighlight lang="python"> cadre = ttk.Frame(fenetre) </syntaxhighlight> Le cadre va comporter six lignes ''({{lang|en|row}})'' et deux colonnes ''({{lang|en|column}})''. Nous allons placer une étiquette ''({{lang|en|label}})'' « z1 » : <code>text="z1"</code>. Cette étiquette se trouve dans une case du cadre, celle de la première colonne et la première ligne : <code>grid(column=1, row=1)</code>. Par rapport à cette case, elle est collée à « l'ouest » (W, ''{{lang|en|west}}'', gauche) de la case : <code>sticky=tk.W</code>. <syntaxhighlight lang="python"> z1_label = ttk.Label(cadre, text="z1") # Création de l'étiquette z1_label.grid(column=1, row=1, sticky=tk.W) # Placement de l'étiquette </syntaxhighlight> Notez que l'on aurait pu écrire directement : <syntaxhighlight lang="python"> ttk.Label(cadre, text="z1").grid(column=1, row=1, sticky=tk.W) </syntaxhighlight> mais le fait de séparer la création de l'élément et son placement facilite la maintenance (recherche d'erreur, évolution du code). Pour tout ce qui est dynamique, c'est-à-dire les zone de saisie des valeurs et l'affichage du résultat, il faut définir des « chaînes variables » ''({{lang|variable strings}})'' : <syntaxhighlight lang="python"> IUz1 = tk.StringVar() </syntaxhighlight> Cette variable est une variable globale à la création. Nous pouvons alors placer la zone de saisie ''({{lang|en|entry}})'' à côté de l'étiquette lui correspondant. Nous nommons la zone de saisie <code>z1_entry</code> : <syntaxhighlight lang="python"> z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) </syntaxhighlight> Nous faisons de même pour les trois autres paramètres de l'engrenage, ''m''<sub>1</sub>, ''z''<sub>2</sub> et ''m''<sub>2</sub>. Le résultat est également une chaîne variable globale. Par rapport à notre mise en page, elle se situe dans la case colonne 2 ligne 5, centrée sur cette case (collé à l'est et à l'ouest) : <syntaxhighlight lang="python"> rapport = tk.StringVar() rapport_dynamique = ttk.Label(cadre, textvariable=rapport) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) </syntaxhighlight> Il nous faut encore définir une fonction de manière classique, nous l'appelons « calcule ». Les variables étant globales, on les utilise directement. On récupère les valeurs avec la méthode <code>get()</code> et nous modifions la valeur avec la méthode <code>set()</code> : <syntaxhighlight lang="python"> def calcule(): valeurZ1 = float(IUz1.get()) valeurZ2 = float(IUz2.get()) IUrapport.set(valeurZ2/valeurZ1) </syntaxhighlight> Cette fonction est déclenchée lorsque l'on clique sur le bouton « Calcul » situé dans la case du cadre ligne 6 colonne 2 : <syntaxhighlight lang="python"> bouton = ttk.Button(cadre, text="Calcul", command=calcule) bouton.grid(column=2, row=6, sticky=tk.W) </syntaxhighlight> ou bien si l'on appuie sur la touche <code>[entrée]</code> du clavier : <syntaxhighlight lang="python"> fenetre.bind("<Return>", calcule) </syntaxhighlight> À tout ceci, nous ajoutons des « gouttières » (marges, ''{{lang|en|paddings}}'') afin d'espacer les éléments. Il faut ensuite « activer » la fenêtre pour qu'elle s'affiche. La méthode est <code>mainloop()</code> (boucle principale) : « boucle » (elle est active en permanence et attend des actions sur ses éléments), <syntaxhighlight lang="python"> fenetre.mainloop() </syntaxhighlight> Nous avons ci-dessus mis la plupart du code en programme principal. Nous pouvons aussi programmer de manière fonctionnelle, en mettant la plupart du code dans des fonctions ; cependant, pour que la fenêtre et les variables dynamiques soient globales à tout le programme, elles doivent être déclarées dans le programme principal. Nous pouvons aussi mêler la programmation orientée objet. {{boîte déroulante début|Calcul du rapport de transmission en programmation fonctionnelle et orientée objet}} <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # ************* # ************* # ** Classes ** # ************* # ************* class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): """Valeurs des attributs""" # instructions lancées lors de la déclaration self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z # ************************ # ************************ # ** Variables globales ** # ************************ # ************************ # fenetre principale fenetre = tk.Tk() # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: roue1 = pignon(valeurZ1, valeurM1) roue2 = pignon(valeurZ2, valeurM2) IUrapport.set(roue1.rapport(roue2)) except: IUrapport.set("Erreur") # *********************** # * Interface graphique * # *********************** def configureFenetre(): """Configuration de la fenêtre principale""" fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* configureFenetre() # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> {{boîte déroulante fin}} == Annotations == Une annotation est un commentaire qui sert à expliciter un type de variable. La syntaxe est différente des commentaires « classiques » : cela permet d'avoir un affichage différent avec les éditeurs de texte ayant une coloration syntaxique, et ces informations peuvent être récupérées par des logiciels extérieurs pour effectuer une documentation automatique ou bien des vérifications de type. Cependant : * comme les commentaires normaux, ils n'ont aucune influence lors de l'exécution du texte ; en particulier : * rien n'oblige à annoter les variables ; * il est possible d'avoir une variable ayant un type différent de son annotation ; le fait de pouvoir définir et changer le type de variable à la volée est une fonctionnalité fondamentale de Python. La syntaxe pour une annotation est : : nom_de_variable + deux-points + espace + type par exemple : <syntaxhighlight lang="python"> a: int </syntaxhighlight> Notez qu'ici, la variable n'est ''pas'' créée. Pour la créer, il faut lui affecter une valeur. Il est possible de l'affecter après ou bien sur la même ligne avec la syntaxe : : nom_de_variable + deux-points + espace + type + espace + égal + espace + valeur par exemple : <syntaxhighlight lang="python"> a: int a = 5 # est équivalent à a: int = 5 </syntaxhighlight> Même si l'annotation n'a pas d'impact sur l'exécution, le type doit être un type existant sinon cela génère une erreur de syntaxe. Les types classiques sont : : <code>int</code> — <code>float</code> — <code>str</code> — <code>bool</code> — <code>list</code> — <code>tuple</code> — <code>dict</code> Il est également possible de mettre une chaîne de caractères : <syntaxhighlight lang="python"> a: "ce que je veux" = 3.1516 </syntaxhighlight> On peut annoter une fonction. Il est possible d'annoter les variables déclarées au sein de la fonction, mais pas les variables globales (puisqu'elle ne sont pas définie au sein de la fonction). On peut aussi annoter : * les variables passées en paramètre, avec la même syntaxe dans les parenthèses ; * annoter le type de la variable de sortie (retournée) en la faisant précéder de <code>-&gt;</code> : <syntaxhighlight lang="python"> def plusCinq(a: float = 0) -> float: return a + 5 </syntaxhighlight> ; Ressources * {{lien web | url = https://www.python.org/dev/peps/pep-0526/ | titre = PEP 526 -- Syntax for Variable Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} * {{lien web | url = https://www.python.org/dev/peps/pep-3107/ | titre = PEP 3107 -- Function Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} == Décorateur == Un décorateur est une fonction qui s'applique à une fonction, à la manière de la composition mathématique ''g'' ∘ ƒ = ''g''(ƒ). Mais cette composition affecte la fonction elle-même ; l'utilisateur appelle la fonction ƒ mais c'est la fonction ''g'' ∘ ƒ qui s'exécute. Cette fonction ''g'' est appelée le décorateur. L'intérêt est de pouvoir modifier une fonction sans modifier le code de la fonction elle-même. Pour appliquer une décoration, il faut : # Déclarer le décorateur : une fonction qui s'applique à une autre fonction. # Affecter le décorateur à la fonction visée : en mettant <code>@''décoration''</code> juste avant la définition de la fonction. Par exemple : <syntaxhighlight lang="python"> def decorateur(f): print("Avant la fonction") f() print("après la fonction") @decorateur def afficheFoo(): print("Foo.") afficheFoo # Avant la fonction # Foo. # Après la fonction </syntaxhighlight> Lorsque l'on appelle <code>afficheFoo</code>, on appelle en fait <code>decorateur(afficheFoo)</code>. Si la fonction à modifier admet des paramètres, il faut définir une fonction enveloppante dans le décorateur. Par exemple, nous définissons ci-dessous un décorateur <code>deuxFois()</code> qui fait s'exécuter deux fois de suite la fonction : <syntaxhighlight lang="python"> def deuxFois(f): def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # conteneurFonction </syntaxhighlight> Nous voyons que l'application du décorateur a modifié le nom de la fonction — pas le nom de la variable qui contient la fonction mais bien son nom « intime ». Pour éviter cela, on utilise la méthode <code>wraps()</code> du module <code>functools</code> : <syntaxhighlight lang="python"> import functools def deuxFois(f): @functools.wraps(f) def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # plusCinq </syntaxhighlight> On peut par exemple utiliser un décorateur pour la mémoïsation. La mémoïsation est une méthode consistant à mémoriser les valeurs d'une fonction au fur et à mesure de son utilisation ; ainsi, si l'on veut évaluer la fonction avec les mêmes entrées, on se contente d'aller chercher la valeur enregistrée ce qui est plus rapide. On sacrifie donc la place mémoire au profit de la rapidité. On peut trouver des décorateurs de mémoïsation aux adresses suivantes : * https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize * https://gist.github.com/robcowie/1357800 ; Ressources : {{lien web | url = https://www.python.org/dev/peps/pep-0318/ | titre = PEP 318 -- Decorators for Functions and Methods | site = Python.org | lang = en | consulté le = 2019-04-05 }} == Manipulation de fichiers == === Importer le contenu d'un fichier === Python possède la fonction <code lang="python">open()</code> qui permet d'ouvrir un fichier. Ouvrir signifie qu'il crée un objet de type <code>file</code> qui possède notamment les méthodes <code lang="python">read()</code> et <code lang="python">write()</code>. Il peut s'agir d'un objet de type « fichier binaire » ''({{lang|en|binary file}})'' ou « fichier texte » ''({{lang|en|text file}})''. Si par exemple on veut utiliser (et donc lire) le contenu du fichier texte <code>monfichier.txt</code>, on écrit : <syntaxhighlight lang="python"> fichier = open("monfichier.txt", "rt") … fichier.close() </syntaxhighlight> Le paramètre <code>"rt"</code> signifie que nous ouvrons le fichier en lecture ''({{lang|en|read}})'' et qu'il s'agit d'un objet de type fichier texte. Notons deux choses : * en faisant cela, nous ne faisons qu'associer le fichier à un objet Python, nous n'avons pas encore importé les données ; * si nous ouvrons le fichier, il faut le fermer par la suite ; c'est pourquoi nous utilisons la méthode <code lang="python">.close()</code>. Pour éviter d'avoir à fermer le fichier, nous pouvons l'ouvrir au sein d'un contexte : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: … </syntaxhighlight> Notons aussi que la chaîne de caractères indiquant le nom du fichier peut contenir le chemin d'accès au répertoire (dossier), mais sous Microsoft Windows, il faut utiliser des barres de fractions <code>/</code> pour séparer les sous-répertoires au lieu de la barre inversée habituelle, par exemple : <syntaxhighlight lang="python"> chemin = "C:/Temp/monfichier.txt" with open(chemin, "rt") as fichier: … </syntaxhighlight> Pour mettre les données du fichier dans la variable <code>contenu</code>, nous écrivons donc : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() print(contenu) </syntaxhighlight> et si nous ne voulons lire que les <code>n</code> premiers caractères (<code>n</code> étant un entier), nous utilisons <code lang="python">contenu = fichier.read(n)</code>. Cette lecture est séquentielle, c'est-à-dire que si nous appliquons la méthode plusieurs fois, nous reprenons la lecture là où nous l'avons laissée. Si nous voulons lire une ligne, nous utilisons la méthode <code lang="python">.readline()</code>. La lecture ligne par ligne est également séquentielle. Nous pouvons aussi créer une liste dont chaque élément est une ligne du fichier ; nous utilisons alors la méthode <code lang="python">.readlines()</code> (notez le pluriel). Chaque élément de la liste se termine par le caractère de fin de ligne <code lang="python">\n</code>. Pour l'enlever, nous pouvons utiliser la méthode <code lang="python">.rstrip()</code> pour chaque élément de la liste, par exemple. L'exemple complet est alors : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.readlines() contenu = [item.rstrip() for item in contenu] print(contenu) </syntaxhighlight> === Exporter du contenu vers un fichier === Si nous voulons créer un fichier texte pour y mettre le contenu de la variable <code>texte</code>, alors nous utilisons : <syntaxhighlight lang="python"> with open("monfichier.txt", "wt") as fichier: contenu = fichier.write(texte) </syntaxhighlight> Le module principal important pour la manipulation de fichiers est est <code lang="python">os</code>. === Exploiter le contenu d'un fichier texte === Avec un fichier texte, la méthode <code lang="python">.read()</code> crée une variable de type texte. Nous pouvons séparer cette variable en différentes lignes avec la méthode <code lang="python">.splitlines()</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une ligne. Si maintenant une ligne contient plusieurs données séparées par un séparateur commun, par exemple un espace, nous pouvons séparer les données par la méthode <code lang="python">.split(''séparateur'')</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une donnée. Si par exemple le fichier est du type CSV ''({{lang|en|comma separated values}}'', valeurs séparées par une virgule), l'exploitation du fichier est : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(",") for item in contenu] </syntaxhighlight> La variable <code>contenu</code> est une liste de listes. Pour avoir la ''n''<sup>e</sup> valeurs de la ''m''<sup>e</sup> ligne, on utilise : <syntaxhighlight lang="python"> contenu[m-1][n-1] </syntaxhighlight> Si l'on veut extraire la ligne ''m'' il suffit d'écrire : <syntaxhighlight lang="python"> contenu[m-1] </syntaxhighlight> mais si l'on veut la colonne ''n'', le plus simple est d'utiliser une définitipon en compréhension : <syntaxhighlight lang="python"> [ligne[n-1] for ligne in contenu] </syntaxhighlight> Dans certains fichiers CSV, les séparateurs de valeurs ne sont pas des virgules, on peut donc utiliser un autre caractère pour le séparateur. Si le séparateur est une tabulation, on utilise <code lang="python">\t</code> : <code lang="python">contenu = [item.split("\t") for item in contenu]</code> Si la première ligne contient les en-têtes des colonnes, on peut l'enlever avec la fonction <code lang="python">del()</code> : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() del(contenu[0]) contenu = [item.split(",") for item in contenu] </syntaxhighlight> Certains logiciels créent des fichiers en utilisant le séparateur décimal régional, qui en France est la virgule. Pour remplacer les virgules par des points, on peut utiliser la méthode <code lang="python">.replace()</code>, de préférence ''avant'' de séparer les valeurs : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.replace(",", ".") for item in contenu] # remplace les virgules par des points contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule </syntaxhighlight> en effet, lorsque l'on a séparé les valeurs, on a une liste de liste, il faut alors balayer les sous-listes ce qui prend plus de temps : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule contenu = [[subitem.replace(",", ".") for subitem in item] for item in contenu] # remplace les virgules par des points </syntaxhighlight> '''Exemple complet''' Supposons que l'on ait un fichier texte de la forme : <syntaxhighlight lang="text"> x y z V 0.0 1.5 3.2 8.657 0.4 1.5 3.2 8.392 0.2 1.5 3.2 8.485 ... </syntaxhighlight> C'est un fichier valeurs V associées à des points de coordonnées ''(x, y, z)'' (un champ V sur l'espace, donc). Nous remarquons que seule la coordonnée ''x'' change : les données concernent la droite (''y'' = 1,5 ; ''z'' = 3,2). Nous remarquons aussi que les valeurs de ''x'' ne sont pas classées par ordre croissant ni décroissant. Nous voulons au final avoir une matrice [[''x''], [V]] triée par ''x'' croissant. Pour cela, nous pouvons faire : <syntaxhighlight lang="python"> with open(nomdefichier, "rt") ad fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(" ") for item in contenu contenu = contenu[1:] # élimine la première ligne x = np.array([float(ligne[0]) for ligne in contenu]) V = np.array([float(ligne[3]) for ligne in contenu]) donnees = np.concatenate((x.reshape(-1, 1), V.reshape(-1, 1)), axis=1) # matrice [[x], [V]] ind = np.argsort(donnees[:, 0]) donnees = donnees[ind, :] # matrice triée plt.plot(donnees[:, 0], donnees[:, 1]) </syntaxhighlight> {{note|Pour le tri, voir [[../Manipulation_de_matrices#Fonctions_et_méthodes_de_base|''Manipulation de matrices'' &gt; ''Fonctions et méthodes de base'']].}} === Cas d'un fichier CSV === Si le fichier CSV ne contient que des valeurs numériques, on peut utiliser : <syntaxhighlight lang="python"> valeurs = np.loadtxt(chemin+nomfic, delimiter=",") # si le séparateur est une virgule </syntaxhighlight> Il existe un module <code lang="python">csv</code> dédié aux fichiers CSV. La manipulation du fichier se fait comme suit : <syntaxhighlight lang="python"> import csv with open(chemin+nomfic, "rt") as fichier: lecteur = csv.reader(fichier, delimiter=",") contenu = [ligne for ligne in lecteur] print(contenu) </syntaxhighlight> === Utilisation de Pandas === Pandas<ref>https://pandas.pydata.org/</ref> est un module gérant les tableaux de données, appelés <em lang="en">data frames</em>. Voici quelques commandes utiles : <syntaxhighlight lang="python"> import numpy as np import pandas as pd M = np.random.rand(10, 10) # crée une matrice NumPy aléatoire de dimension 10 × 10 tableau = pd.DataFrame(M) # transforme la matrice en tableau DataFrame tableau.to_csv("tableau.csv") # enregistre le tableau dans un fichier CSV donnees = pd.read_csv("tableau.csv").to_numpy() # lit le fichier et transforme le tableau DataFrame en matrice NumPy </syntaxhighlight> == Exporter un programme Python == Vous pouvez créer un fichier « Python pur » <code>.py</code>. Pour cela, dans le menu <code>fichier/file</code> de Jupyter, choisir <code>télécharger/download</code> au format <code>.py</code> ; le fichier se trouve alors dans le répertoire de téléchargement du navigateur. == Ressources == * {{lien web | url = https://www.python.org/dev/peps/pep-0008/ | titre = PEP 8 -- Style Guide for Python Code | site = Python documentation | consulté le = 2019-03-14 }} == Notes et références == {{références}} ---- [[../Fonctions mathématiques générales|Fonctions mathématiques générales]] &lt; [[../|↑]] &gt; [[../Graphiques|Graphiques]] {{DEFAULTSORT:Elements de programmation}} [[Catégorie:Python pour le calcul scientifique (livre)]] 158mqnxu8d10vldo39cygag3bbvcqmn 767320 767319 2026-06-02T13:08:01Z Cdang 1202 /* Substitution de variables */ 767320 wikitext text/x-wiki Rappel : les programmes commencent par : <syntaxhighlight lang="python"> #!/usr/bin/python3 import numpy as np import matplotlib.pyplot as plt </syntaxhighlight> == Entrées et sorties == Pour permettre à l'utilisateur ou à l'utilisatrice d'entrer une valeur, nous utilisons la fonction <code lang="python">input()</code> comme évoqué précédemment (chapitre ''[[../Premiers programmes|Premiers programmes]]''), avec la syntaxe <code lang="python">''variable'' = input(''texte'')</code>. Notez que la valeur renvoyée par <code lang="python">input()</code> est une chaîne de caractères. Si vous voulez autre chose, typiquement un nombre, il faut convertir cette chaîne. Par exemple, nous demandons ici d'entrer une longueur sous la forme d'une valeur numérique : <syntaxhighlight lang="python"> longueurDefaut = 10.0 texteDemandeLongueur = f"Veuillez entrer la longueur en millimètres (valeur par défaut {longueurDefaut} mm) : " longueur = input(texteDemandeLongueur) if longueur=="": longueur=longueurDefaut else: longueur=float(longueur) print(longueur) </syntaxhighlight> Pour afficher un texte, on utilise la fonction <code lang="python">print()</code>, également présentée dans le chapitre ''[[../Premiers programmes|Premiers programmes]]'', avec la syntaxe <code lang="python">print(''texte'')</code>. Le texte à afficher peut être de n'importe quel type (entier, réel en virgule flottante, booléen, chaîne de caractères…) mais si l'on veut « mélanger » les types, il faut tout convertir en chaînes de caractères, avec la fonction <code lang="python">str()</code>, et concaténer les chaînes avec <code lang="python">+</code>. Par exemple : <syntaxhighlight lang="python"> print("La longueur vaut : "+str(longueur)+" mm.") </syntaxhighlight> Nous pouvons aussi utiliser une « chaîne “f” » ''({{lang|en|f-string}})'' : on met un le <code lang="python">f</code> devant le guillemet ouvrant et dans la chaîne, on met un champ sous la forme <code lang="python">{''nomDeVariable''}</code>. L'exemple ci-dessus devient alors : <syntaxhighlight lang="python"> print(f"La longueur vaut : {longueur} mm.") </syntaxhighlight> Les chaînes « f » sont détaillées dans la section ''[[#Chaînes de caractères|Chaînes de caractères]]'' ci-dessous. Si l'on veut introduire un retour à la ligne dans la chaîne, on utilise les caractères <code lang="python">\n</code> (contre-oblique suivie de la lettre N minuscule). Par exemple <syntaxhighlight lang="python"> print("Ceci est un texte\navec un retour à la ligne.") </syntaxhighlight> == Types de variables == === Généralités === Python définit « tout seul » le type de la variable : « <code>3</code> » sera un entier ''({{lang|en|integer}})'', « <code>3.0</code> » sera un réel à virgule flottante ''({{lang|en|float}})'', « <code>"3"</code> » sera une chaîne de caractères ''({{lang|en|string}})''. On peut connaître le type d'une variable avec la fonction <code>type()</code>. On peut tester certaines valeurs, avec le module <code>NumPy</code> : * <code>np.isnan(x)</code> indique si les valeurs de ''x'' sont des NaN ''({{lang|en|not a number}})'' ; si ''x'' est une matrice, le résultat est une matrice de booléens, l'élément [''i'', ''j''] est <code>True</code> si <code>x[i, j]</code> est un NaN ; * <code>np.isinf(x)</code> indique si les valeurs de ''x'' sont ±∞ ; si ''x'' est une matrice, le résultat est une matrice booléenne de même dimension. On peut forcer un type : * <code>int(x)</code> : transforme la valeur ''x'' en nombre entier ; * <code>long(x)</code> : " en entier long (précision illimitée) ; * <code>float(x)</code> : " en nombre réel à virgule flottante ; * <code>str(x)</code> : " en chaîne de caractères ; * <code>complex(Re, Im)</code> : crée le nombre complexe ''Re'' + ''Im''·j, j désignant la racine carrée de –1 ; * <code>list()</code> : crée une liste ; * <code>tuple()</code> : crée un n-uplet. Par exemple <syntaxhighlight lang="python"> type(3) # <class 'int'> type(float(3)) # <class 'float'> complex(1, 1) == 1 + 1j # True list("blabla") # ['b', 'l', 'a', 'b', 'l', 'a'] </syntaxhighlight> Python distingue plusieurs genres de types : * Un itérable est un objet dont on peut extraire les éléments un par un ; ce sont les objets pour lesquels on peut écrire <code> for i in ''iterable'':</code>. Il s'agit essentiellement des listes, n-uplets, chaînes de caractères, ensembles, dictionnaires et fichiers. * Un modifiable ''({{lang|en|mutable}})'' est un objet que l'on peut modifier ; par exemple une liste est modifiable — on peut changer la valeur d'un élément, en ajouter ou en enlever un — mais les n-uplets non, pas plus qu'une chaîne de caractères ou un nombre. * Un identifiable (''{{lang|en|hashable}}'', le ''{{lang|en|hashage}}'' étant une signature caractéristique d'un objet) : objet possédant un identifiant unique. Un objet identifiable est toujours non-modifiable ''({{lang|en|unmutable}})''. === Types numériques === ==== Entiers ==== Nous pouvons définir les entiers au format octal ou hexadécimal : il faut débuter le nombre par respectivement <code>0o</code> (le chiffre zéro et la lettre o) et <code>0x</code> (le chiffre zéro et la lettre x). À l'inverse, la fonction <code>hex()</code> renvoie une chaîne correspondant à l'écriture d'un entier au format hexadécimal, et <code>oct()</code> renvoie la chaîne correspondant à l'éciture en octal. Par exemple : <syntaxhighlight lang="python"> print(0o10, ";", 0x10) # 8 ; 16 print(hex(20)) # 0x14 </syntaxhighlight> ==== Réels ==== Les réels disposent de fonctions spécifiques appelées « méthodes ». Une méthode est une fonction spécifique à un type d'objets. Étant conçue ''ad hoc'', elle est souvent plus économe en ressource et en temps qu'une fonction générique. Pour appliquer la méthode <code>meth()</code> à la variable <code>x</code>, on écrit : <code>x.meth()</code>. Nous avons déjà présenté la méthode <code>''float''.as_integer_ration()</code> qui donne la fraction réduite égale à la valeur du nombre. Les réels disposent de plusieurs autres méthodes : * <code>''float''.trunc()</code> : tronque le nombre réel ; * <code>''float''.floor()</code>, <code>''float''.ceil()</code> : renvoie l'entier le plus proche, respectivement inférieur ou supérieur ; * <code>''float''.hex()</code> : renvoie une chaîne de caractères correspondant à l'écriture du nombre en hexadécimal. Par exemple : <syntaxhighlight lang="python"> a = 20. print(a.hex()) # 0x1.4000000000000p+4 print(10..hex()) # 0x1.4000000000000p+3 </syntaxhighlight> Dans le deuxième exemple, nous appliquons la méthode <code>''float''.hex()</code> directement au nombre <code>10.</code> ; le point est obligatoire car sinon, c'est un entier, pour lequel la méthode n'est pas définie. Notez que la ''méthode'' <code>''float''.hex()</code> est différentes de la ''fonction'' <code>hex()</code> : la première concerne les réels, la seconde les entiers. ==== Complexes ==== Nous avons déjà mentionné la méthode <code>''complex''.conjugate()</code> qui donne le conjugué du nombre. Un nombre complexe dispose de deux attributs : * <code>''complex''.real</code> : sa partie réelle ; * <code> ''complex''.imag</code> : sa partie imaginaire. Par exemple : <syntaxhighlight lang = "python"> a = 5+2j print(a.conjugate(), ";", a.real, ";", a.imag) # (5-2j) ; 5.0 ; 2.0 </syntaxhighlight> === Chaînes de caractères === ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/inputoutput.html | titre = 7. Input and Output | site = Python Documentation | consulté le = 2019-04-06 }} ==== Généralités ==== Il existe en fait trois manières de définir une chaîne de caractères : * avec des guillemets simples ou doubles comme vu précédemment : <code>"…"</code> ou bien <code>'…'</code> ; * avec trois guillemets doubles : <code>"""…"""</code> : cela permet d'avoir une chaîne de caractères s'étendant sur plusieurs lignes, les retours de ligne étant pris en compte ; c'est utilisé en particulier pour la description des fonctions (''{{lang|en|docstrings}}'', voir ci-après) ; * avec des guillemets précédés d'un « r », <code>r"…"</code> ou <code>r'…'</code> : cela permet d'interpréter les barres de fraction inverses « \ » comme un caractère « normal » et non comme un caractère d'échappement (voir ci-après) ; cela est utile lorsque l'on utilise les possibilités LaTeX dans le tracé de graphiques (voir plus loin) ; * avec des guillemets précédés d'un « f », <code>f"…"</code> ou <code>f'…'</code> : cela permet d'utiliser des variables formatées (voir ci-après). Une chaîne de caractères n'est pas modifiable. Si l'on veut remplacer un caractère, l'insérer ou le supprimer, il faut transformer la chaîne en liste, avec la commande <code>list()</code>, puis rassembler la liste en la joignant ''({{lang|en|join}})'' à une chaîne vide : <syntaxhighlight lang="python"> chaine = "blabla" chaineList = list(chaine) chaineList[2] = "c" chaine = "".join(chaineList) print(chaine) # blcbla </syntaxhighlight> Dans une chaîne simple <code>"…"</code> ou <code>'…'</code>, on peut introduire un retour à la ligne avec <code>\n</code>. ==== Substitution de variables ==== Lorsque l'on veut utiliser des variables, on fait précéder les guillemets d'un « f » et l'on écrit les noms de vrariables entre accolades. Par exemple : <syntaxhighlight lang="python"> monde = "world" chaine = f"Hello {monde}!" print(chaine) # Hello world! </syntaxhighlight> On peut indiquer la taille de la chaîne générée à partir de la variable sous la forme <code>{nomVariable:taille}</code>, la taille étant un entier. Par exemple : <syntaxhighlight lang="python"> chiffre1 = 1 nom1 = "un" chiffre2 = 2 nom2 = "deux" chaine = f"{nom1:5} : {chiffre1:5d}\n{nom2:5} : {chiffre2:5d}" print(chaine) # un : 1 # deux : 2 </syntaxhighlight> Vous remarquez que l'on ajoute un « d » pour les entiers décimaux, et que les nombres sont alignés à droite. Si le nombre est un nombre réal à virgule flottante ''({{lang|en|float}})'', on peut indiquer le nombre de décimales sous la forme <code>.''n''f</code> : <syntaxhighlight lang="python"> chaine = f"{np.pi:.5f}" print(chaine) # 3.15169 </syntaxhighlight> Avec la syntaxe <code>''m''.''n''f</code>, on indique également que la totalité du nombre doit occuper ''m'' caractères. Pour convertir un nombre en caractère Unicode correspondant, on utilise la lettre c : <syntaxhighlight lang="python"> nompi = 0x03c0 # Caractère Unicode π : U+03C0 chaine = f"{nompi:c} = {np.pi:.5f}" print(chaine) # π = 3.14159 </syntaxhighlight> La classe ''str'' dispose également de la méthode <code>.format()</code>. On indique un n-uplet de chaînes (ou de nombres) à la méthode et l'on met des accolades dans la chaîne principale ; les accolades sont remplacées dans l'ordre des chaînes de la méthode. On peut changer l'ordre en indiquant quelle valeur utiliser dans quelle accolade. Par exemple : <syntaxhighlight lang="python"> chaine1 = "On compte {} puis {}".format(1, 2) chaine2 = "On compte {0} puis {1}. Mais à rebours, on compte {1} puis {0}.".format("un", "deux") print(chaine1, "\n", chaine2) # On compte 1 puis 2 # On compte un puis deux. Mais à rebours, on compte deux puis un. </syntaxhighlight> L'utilisation du caractère pourcent « % » permet d'utiliser la mise en forme <code>sprintf()</code> du langage C : <syntaxhighlight lang="python"> chaine = "π = %.5f" % np.pi print(chaine) # π = 3.14159 </syntaxhighlight> ; Exemple <nowiki>:</nowikI> barre de progression : Voici une fonction affichant une barre de progression, pour la ''i''-ème étape d'un processus ayant ''n'' étapes (pour la notion de fonction, voir la section ci-après ''[[#Fonction|Fonction]]''). : NB : nous avons utilisé les codes Unicode pour l'exemple, mais on peut évidemment copier le caractère, par exemple depuis une table Unicode ou une page Web<ref>Pour le point médian : ''{{W|Table des caractères Unicode/U0080}}'' ou ''{{W|Point médian}}''. Pour le pavé : ''{{W|Table des caractères Unicode/U2580}}''.</ref>, et le coller dans le code, comme nous l'avons fait dans le commentaire. <syntaxhighlight lang="Python"> def barre_progression(i, n, largeur=40): """ Affiche une barre de progression Entrées : — i : étape en cours, entier ; — n : nombre d'étapes à réaliser, entier ; — largeur : nombre de caractères total de la barre, entier. Sortie : affichage de la barre de progression. """ taux = i/n fait = int(largeur * taux) barre = f"{0x2588:c}"*fait + f"{0x00b7:c}" * (largeur - fait) # U+2588 : pavé "█" ; U+00B7 : point médian "·" print(f"Progression | {barre} | {100*taux:3.1f} %") barre_progression(25, 100) # Progression | ██████████······························ | 25.0 % </syntaxhighlight> ==== Méthodes des chaînes ==== Le type ''str'' dispose d'un certain nombre de méthodes. Nous avons déjà vu les méthodes <code>''str''.join()</code> et <code>''str''.format()</code>, en voici quelques autres : * <code>''str''.capitalize()</code> : met le premier caractère en capitale (majuscule) et les autres en minuscule ; * <code>''str''.lower()</code> : met tout en minuscules ''({{lang|en|lowercase}})'' ; * <code>''str''.upper()</code> : met tout en capitales ''({{lang|en|lowercase}})'' ; * <code>''str''.center(''n'')</code> : met la chaîne au centre d'une chaîne de longueur ''n'', en complétant avec des espaces ; on peut compléter avec d'autres caractères avec <code>''str''.center(''n'', ''c'')</code>, par exemple <code>"a".center(7, ".")</code> donne <code>"....a...."</code> ; * <code>''str''.ljust(''n'', ''c'')</code> et <code>''str''.rjust(''n'', ''c'')</code> : comme <code>.center()</code> mais la chaîne est respectivement alignée au fer à gauche ''({{lang|en|left}})'' et à droite ''({{lang|en|right}})'' ; * <code>''str''.isdigit()</code> : booléen vrai si tous les caractères sont des nombres ; * <code>''str''.find(''sous-chaine'')</code>, <code>''str''.rfind(''sous-chaine'')</code> : indique respectivement le premier emplacement et le dernier emplacement de la sous-chaîne dans la chaîne ; * <code>''str''.partition(''séparateur'')</code> : retourne un triplet avec la portion de chaîne avant le séparateur, le séparateur puis la portion de chaîne après le séparateur ; * <code>''str''.replace(''ancien'', ''nouveau'')</code> : remplace la chaîne ''ancien'' par la chaîne ''nouveau'' dans la chaîne ; * <code>''str''.split(''séparateur'')</code> : découpe la chaîne au niveau des séparateurs et renvoie une liste. ==== Autres fonctions ==== La fonction <code>chr()</code> transforme un code Unicode en caractère. Par exemple, <code>chr(97)</code> donne <code>"a"</code> et <code>chr(0x03c0)</code> donne <code>"π"</code>. Si on veut créer une liste de caractères qui se suivent, on peut par exemple utiliser : <syntaxhighlight lang="python"> [chr(x) for x in range(97, 102)] # ['a', 'b', 'c', 'd', 'e'] </syntaxhighlight> Si on veut créer une liste de nombres sous la forme de chaînes de caractères, on peut utiliser la commande <code>str()</code> vue ci-dessus. Par exemple : <syntaxhighlight lang="python"> [str(x) for x in range(1, 6)] # ['1', '2', '3', '4', '5'] </syntaxhighlight> Pour la syntaxe, voir ci-dessous la section [[#Définition en compréhension|''Définition en compréhension'']]. == Manipulation de listes == Les listes sont une structure de données fondamentale en Python. ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/datastructures.html | langue = en | titre = 5. Data structures | site = Python documentation | consulté le = 2019-03-16 }} === Copie d'une liste === Contrairement à d'autres types, lorsque vos écrivez <code>b = a</code> avec des listes, vous ne créez pas une copie de la variable <code>a</code>, vous créez un ''alias'' : l'objet <code>b</code> est un autre nom de l'objet <code>a</code>. En particulier, si vous modifiez <code>b</code>, vous modifiez en fait <code>a</code>. Par exemple : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a b[2] = 5 print(a, b) # [1, 2, 5, 4] [1, 2, 5, 4] </syntaxhighlight> Si l'on veut créer une copie de <code>a</code>, il faut utiliser <code>a[:]</code> ou bien <code>a.copy()</code> : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a[:] c = a.copy() b[2] = 5 c[2] = 6 print(a, b, c) # [1, 2, 3, 4] [1, 2, 5, 4] [1, 2, 6, 4] </syntaxhighlight> === Méthodes de listes === Pour modifier une liste, vous disposez des méthodes suivantes : * <code>a.append(x)</code> : ajoute l'élément <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.extend(x)</code> : ajoute la liste <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.append(i, x)</code> : aoute l'élément <code>x</code> ''avant'' l'interstice ''i'' de la liste <code>a</code> ; * <code> x = a.pop(i)</code> : enlève l'élément ''i'' de la liste <code>a</code> et le met dans la variable <code>x</code> ; <code> x = a.pop()</code> enlève le dernier élément de la liste ; * <code>a.clear()</code> : vide la liste <code>a</code> ; * <code>a.sort()</code> : trie la liste par ordre croissant ; * <code>a.sort(reverse = True)</code> : trie par ordre décroissant ; * <code>a.reverse()</code> : inverse l'ordre de <code>a</code>. Pour supprimer l'élément à l'indice ''i'', au lieu d'utiliser <code>a.pop(i)</code>, on peut aussi utiliser <syntaxhighlight lang="python"> del(a[i]) </syntaxhighlight> Pour trier une liste, on peut aussi utiliser la fonction <code>sorted()</code>, ce qui permet par exemple de conserver la liste originale, non triée : <code>b = sorted(a)</code>. La fonction <code>sorted()</code> fonctionne avec tous les objets « itérables » comme par exemple une chaîne de caractères : <syntaxhighlight lang="python"> a = "ahjbfk" print(sorted(a)) # ['a', 'b', 'f', 'h', 'j', 'k'] </syntaxhighlight> Pour mettre en évidence la performance de la méthode <code>''list''.sort()</code> par rapport à la fonction générique <code>sorted()</code> : <syntaxhighlight lang="python"> import numpy as np import time a = np.random.rand(int(1e7)) t1 = time.perf_counter() b = sorted(a) # Fonction générique t2 = time.perf_counter() a.sort() # Méthode spécifique t3 = time.perf_counter() print("Sorted :", t2-t1, " s ; .sort :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # Sorted : 14.2... s ; .sort : 1.1... s ; rapport : 12.6... </syntaxhighlight> Par rapport à une valeur donnée : * <code>a.remove(x)</code> : retire la première occurrence de la valeur <code>x</code> de la liste <code>a</code> ; * <code>a.index(x)</code> : indique l'indice où se trouve la première occurrence de la valeur <code>x</code> ; * <code>a.count(x)</code> : indique le nombre de fois que l'on trouve la valeur <code>x</code> dans la liste <code>a</code>. === Définition en compréhension === La [[w:fr:Liste en compréhension|définition en compréhension]] ''({{lang|en|list comprehension}})'' est une méthode permettant de construire des listes en indiquant simplement des axiomes, des consignes de filtrage. Cette méthode est élégante car proche de la notation mathématique et compacte, mais c'est une méthode itérative donc lente par rapport à une méthode vectorisée fournie par le module NumPy. Par exemple, pour créer la liste des carrés des nombres entiers entre 0 et 9, il suffit d'écrire <syntaxhighlight lang="python"> carre = [x**2 for x in range(10)] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x^2 | x \in [0 ; 9] \}</math>. Si l'on veut la liste des nombres strictement inférieurs à 20 dont le carré est supérieur à 10, on peut écrire : <syntaxhighlight lang="python"> X = [x for x in range(20) if x**2 > 10] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x | x \in [0 ; 19], x^2 > 10 \}</math>. Pour mettre en évidence la performance du calcul vectorisé par rapport à la méthode itérative : <syntaxhighlight lang="python"> import time import numpy as np n = int(1e7) # taille de la liste t1 = time.perf_counter() carre = [x**2 for x in range(n)] # Définition en compréhension t2 = time.perf_counter() carre2 = np.arange(n)**2 # Calcul vectorisé t3 = time.perf_counter() print("En compréhension : ", t2-t1, "s ; vectorisé :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # En compréhension : 4.515... s ; vectorisé : 0.156... s ; rapport : 28.982... </syntaxhighlight> == Structure d'un programme == Un programme est simplement une suite d'instructions. Dans les environnements Unix BSD, un programme Python peut être considéré comme un script c'est-à-dire qu'il suffit de taper son nom dans l'invite de commande ''({{lang|en|shell}})'' sans avoir à invoquer <code>python</code>. Le programme doit alors commencer par un en-tête normalisé surnommé ''{{lang|en|[[wikt:shebang|shebang]]}}'' : <syntaxhighlight lang="python"> #!/usr/bin/env python3 </syntaxhighlight> Ce ''{{lang|en|shebang}}'' est inutile avec Jupyter. L'en-tête peut également contenir la description de l'encodage du fichier texte, typiquement : <syntaxhighlight lang="python"> # coding: utf-8 </syntaxhighlight> Le codage UTF-8 est le codage par défaut pour Python 3, il est donc inutile de l'indiquer. Les commentaires sont introduits par le croisillon <code>#</code>. On peut grouper une suite d'instructions dans un bloc. Un bloc d'instructions commence par deux-points « <code>:</code> » et est identé, c'est-à-dire qu'il a une marge constituée de quatre espaces — on peut aussi utiliser une tabulation mais il ne faut pas mélanger les deux méthodes ; les tabulations sont déconseillées, il vaut mieux utiliser quatre espaces<ref>{{lien web | url = https://www.python.org/dev/peps/pep-0008/#tabs-or-spaces | titre = Tabs or Spaces? | site = Python documentation | consulté le = 2019-03-14 }}</ref>. Pour terminer le bloc, il suffit simplement de revenir en début de ligne ; contrairement à d'autres langages, il n'y a pas de commende de fin ''({{lang|en|end}})'', c'est l'indentation qui définit le bloc. : # début du bloc ''instruction 1'' ''instruction 2'' … ''dernière instruction du bloc'' ''instruction hors bloc'' Par exemple, une exécution conditionnelle <code>if</code> ou une boucle <code>for</code> exécute un bloc d'instruction. Si l'on a besoin d'un bloc d'instruction qui « ne fait rien », on utilise l'instruction <code>pass</code>. == Structures de contrôle == '''Boucle itérative''' La boucle itérative s'écrit : <syntaxhighlight lang="python"> for <variable> in <itérable>: <bloc d’instructions> </syntaxhighlight> Si l'on veut que la variable prenne ''n'' valeurs de 0 à ''n'' – 1, on utilise l'instruction <code>range()</code> : <syntaxhighlight lang="python"> for i in range(5): print(i) print("Fin de la boucle") </syntaxhighlight> <code>[▶]</code> 0 1 2 3 4 Fin de la boucle En fait, la commande <code>range()</code> extrait des valeurs de l'ensemble des nombres entiers ; on peut ainsi utiliser le découpage en tranches, par exemple <code>range(2, 5)</code>pour avoir la « liste » <code>[2, 3, 4]</code>. Notez que <code>range()</code> ne crée pas à proprement parler une liste, cela crée un objet de type ''« {{lang|en|range}} »'' (plage, intervalle) ; pour avoir une liste, il faut écrire <code>list(range(n))</code>. Dans une boucle, la commande <code>continue()</code> saute la fin du bloc d'instruction et passe à la valeur suivante de la boucle. La commande <code>break()</code> interrompt la boucle et passe à la suite. '''Exécution conditionnelle''' L'exécution conditionnelle s'écrit : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> </syntaxhighlight> On peut utiliser les commandes <code>elif</code> ''(else if'') et <code>else</code> : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> elif <booléen>: <bloc d’instructions> else: <bloc d’instructions> </syntaxhighlight> Notez que le test d'une condition est gourmand en ressources. S'il s'agit de savoir si l'on effectue une opération mathématique simple ou pas, on peut remplacer le test par une multiplication par un booléen (<code>True</code> vaut 1, <code>False</code> vaut 0). Par exemple, plutôt que d'écrire <syntaxhighlight lang="python"> if a > 0: b = b - c </syntaxhighlight> mieux vaut écrire : <syntaxhighlight lang="python"> b = b - (a > 0)*c </syntaxhighlight> '''Boucle antéconditionnée''' La boucle antéconditionnée s'écrit : <syntaxhighlight lang="python"> while <booléen>: <bloc d’instructions> </syntaxhighlight> Cette boucle peut contenir des instructions <code>continue()</code> et <code>break()</code>. == Fonction == La déclaration d'une fonction utilise la commande <code>def</code>. La fonction est un bloc d'instructions. Si elle doit renvoyer des valeurs, on utilise la commande <code>return</code>. Par exemple <syntaxhighlight lang="python"> def nombres(n): """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo a = nombres(3) print(a) </syntaxhighlight> La fonction commence par une chaîne de caractères qui la décrit. Cette chaîne peut être récupérée automatiquement par certains logiciels pour faire une documentation automatique. Si la description prend plusieurs lignes, elle commence et finit par trois double-guillemets <code>"""…"""</code> ; en fait, par convention, même si cela n'est pas obligatoire, les descriptions sont toutes encadrées de trois double-guillemets. Cette description est appelée ''{{lang|en|docstring (documentation string)}}''. Pour récupérer les ''{{lang|en|docstrings}}'' : <syntaxhighlight lang="python"> def foo(): """Cette fonction ne fait rien""" pass print(foo.__doc__) # Cette fonction ne fait rien </syntaxhighlight> L'instruction <code>input()</code> permet à l'utilisateur de saisir une valeur. La valeur est retournée sous la forme d'une chaîne de caractères qui est ensuite convertie en nombre réel avec l'instruction <code>float()</code>. On peut définir une valeur par défaut en l'indiquant dans l'en-tête de la définition de la fonction, de la manière suivante : <syntaxhighlight lang="python"> def nombres(n=1): # valeur par défaut : 1 """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo </syntaxhighlight> Si le paramètre à initialiser est de type modifiable ''({{lang|en|mutable}})'', comme par exemple une liste, il faut procéder comme suit : <syntaxhighlight lang="python"> def fooFonction(fooListe=None): # valeur par défaut : n'existe pas """Description""" if fooListe = None: fooListe = [] # initialisation <suite des instructions> </syntaxhighlight> Par défaut, les variables sont locales. On peut rendre une variable globale avec l'instruction <code>global</code> ''à l'intérieur de la fonction'', avant l'utilisation de la variable. Par exemple : <syntaxhighlight lang="python"> a = 1 b = 1 def toto(): """Test de variable globale. Entrée : aucune. Sortie : aucune.""" global a a = 2 b = 2 toto() print("a =", a, "; b =", b) # a = 2 ; b = 1 </syntaxhighlight> Pour être plus précis : si une variable n'est pas assignée dans une fonction, alors Python va chercher une variable du même nom à l'extérieur de la fonction. Mais à partir du moment où la variable est assignée dans la fonction, elle devient locale ''sauf'' si l'on a utilisé l'instruction <code>global</code>. Si l'on s'attend à un nombre indéfini d'arguments, on utilise la notion d'empaquetage/dépaquetage ''({{lang|en|packing/unpacking}})''<ref>{{lien web | url = https://deusyss.developpez.com/tutoriels/Python/args_kwargs/ | titre = Introduction à *args et **kwargs | consulté le = 2019-03-09 | site = Developpez.com }}.</ref>. L'empaquetage consiste à mettre les arguments dans un n-uplet, le dépaquetage consiste à développer un n-uplet en plusieurs variables. Cela se fait en mettant un astérisque ''({{lang|en|splat}})'' « <code>*</code> » devant le nom de la variable. Par convention, on utilise le nom de variable <code>*args</code> mais cela n'est pas obligatoire. <syntaxhighlight lang="python"> def concatenation(*args): """Concatène des chaînes de caractères Entrée : *args, n-uplet de chaînes de caractères. Sortie : resultat, chaîne de caractères.""" resultat = "" for i in args: resultat = resultat + i return resultat concatenation("a", "foo", "toto") # 'afoototo' </syntaxhighlight> À l'inverse, si une fonction doit recevoir plusieurs paramètres, on peut à la place lui transmettre une liste à dépaqueter : <syntaxhighlight lang="python"> def addition(a, b): """Ajoute deux nombres Entrées : — a : réel ; — b : réel. Sortie : a+b, réel""" return a+b arg = (1, 2) addition(*arg) # 3 </syntaxhighlight> On peut aussi empaqueter/dépaqueter un dictionnaire, on utilise pour cela deux astérisques « <code>**</code> ». Par convention, on utilise le nom <code>**kwargs</code> sans que cela soit obligatoire. L'instruction <code>lambda</code> permet de créer de petites fonctions ne contenant pas de boucle ni de branchement conditionnel. Cependant, si la déclaration est courte et compacte, le code n'est pas toujours facilement lisible ; l'utilisation de cette instruction n'est pas recommandée. Par exemple l'expression <syntaxhighlight lang="python"> f = lambda x: 2*x </syntaxhighlight> est la même chose que <syntaxhighlight lang="python"> def f(x): """Calcule le double. Entrée : x, réel. Sortie : 2*x, réel.""" return 2*x </syntaxhighlight> {{note|L'instruction <code>eval()</code> exécute une chaîne de caractères, c'est-à-dire traite une chaîne de caractères comme si c'étaient des instructions données à Python. Cette instruction est à éviter pour deux raisons : # Un utilisateur malveillant pourrait entrer du code malveillant dans la chaîne de caractères. # L'exécution est lente puisque Python doit compiler la chaîne à la volée. Cette instruction peut en général être remplacée par une autre instruction. }} == Gestion des erreurs == Dans un bloc d'instructions, on peut utiliser la structure <code>try:… except:</code>. Le bloc après <code>try</code> est exécuté ; si une erreur se déclare dans ce bloc, alors le bloc <code>except</code> s'exécute. Par exemple <syntaxhighlight lang="python"> try: 1/0 # Génère une erreur except: print("Division par zéro") # Cette instruction est donc exécutée </syntaxhighlight> On peut compléter avec <code>else:</code> et <code>finally:</code> : <syntaxhighlight lang="python"> try: <code à exécuter> except: <s’exécute en cas d’erreur> else: <s’exécute s’il n’y a pas d’erreur> finally: <s’exécute dans tous les cas> </syntaxhighlight> On peut séparer les différents types d'erreur : <syntaxhighlight lang="python"> try: <code à exécuter> except ValueError: print("Valeur erronée") except TypeError: print("Type erroné") </syntaxhighlight> Les types d'erreur les plus courants sont : * <code>NameError</code> : le nom de variable n'existe pas ; * <code>TypeError</code> : la valeur n'est pas du bon type ; * <code>ValueError</code> : la valeur n'est pas compatible avec ce qui est attendu ; * <code>RuntimeError</code> : type d'erreur général. On peut aussi créer ses propres erreurs : si une situation erronée survient, on peut « lever » une exception avec <code>raise</code>. Par exemple <syntaxhighlight lang="python"> if a < 0: raise ValueError("La valeur doit être positive") </syntaxhighlight> ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/errors.html | titre = Errors and exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} * {{lien web | url = https://docs.python.org/3/library/exceptions.html | titre = Built-in Exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} == Exercices == === Calcul du PGCD et du PPCM par l'algorithme d'Euclide === {{loupe|w:Algorithme d'Euclide}} Écrire un programme Python qui demande deux nombres entiers et affiche leurs PGCD et PPCM. Le programme utilisera l'algorithme d'Euclide. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """Programme : euclide.py Auteur : User:cdang date : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : calcule le PGCD et le PPCM de deux nombres entiers. Entrée ------ au clavier, saisie de deux nombres entiers. Sorties ------- à l'écran, affichage du PGCD et du PPCM. """ # *************** # *************** # ** Fonctions ** # *************** # *************** def euclide(): """Calcule le PGCD et le PPCM avec l'algorithme d'Elclide Entrée ------ Aucune, la saisie des paramètres fait partie de la fonction Sortie ------ affichage du PGCD et du PPCM """ print("***** Algorithme d'Euclide *****\n") a0 = int(input("Premier nombre entier : a = ")) b0 = int(input("Second nombre entier : b = ")) a = a0 b = b0 r = a%b # initialisation while (r != 0) : # algorithme d'Euclide a = b b = r r = a%b # affichage des résultats print("PGCD(", a0, ", ", b0, ") = ", b) print("PPCM(", a0, ", ", b0, ") = ", a0*b0//b) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* euclide() </syntaxhighlight> On peut simplifier la boucle centrale : <syntaxhighlight lang="python"> while b: # s'exécute tant que b n'est pas 0 a, b = b, a % b # affectation de liste à liste return a </syntaxhighlight> {{boîte déroulante fin}} Notez que le module NumPy propose l'instruction <code>gcd()</code> : <syntaxhighlight lang="python"> import numpy … print(numpy.gcd(a, b)) </syntaxhighlight> === Tours de Hanoï === {{loupe|w:Tours de Hanoï}} Écrire un programme Python qui demande le nombre ''n'' de plateaux et affiche les manipulations nécessaires pour déplacer la pile d'un emplacement à un autre. Le programme utilisera l'algorithme récursif. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """nom : hanoi.py auteur : User:cdang date de création : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : résout le problème des tours de Hanoï Entrées ------- trois chaînes de caractères (nom des piliers) Sorties ------- une chaîne de caractères (liste des opérations) """ # *************** # *************** # ** Fonctions ** # *************** # *************** def hanoi(a, b, c, n): """Résout le problème des tours de Hanoï de manière récursive But : déplace la pile de n disques du piler a au pilier b Entrées ------- a, b c : chaînes de 1 caractère, référence des emplacements ; n : entier, nombre de disques sur l'emplacement a Sorties ------- operations : chaînes de caractères décrivant les opérations """" if n>1: operations = hanoi(a, c, b, n-1) operations = operations+a+"→"+b+" ; " operations = operations+hanoi(c, b, a, n-1) else: operations = a+"→"+b+" ; " return operations # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* resultat = hanoi("1", "2", "3", 3) print(resultat) </syntaxhighlight> {{boîte déroulante fin}} === Lancer de rayons === [[Fichier:Lentille hemispherique perspective.svg|vignette|Lentille hémisphérique.]] Considérons une lentille hémisphérique de rayon R faite d’un verre d’indice de réfraction ''n''. Nous plaçons une source ponctuelle à une distance ''d'' du dioptre plan, sur l’axe optique. Tracer des rayons partant de la source et traversant la lentille. {{clear}} {{Boîte déroulante/début |titre=Analyse d’optique géométrique}} [[Fichier:Lentille hemispherique analyse geometrique.svg|vignette|Analyse géométrique du problème.]] Il s’agit d’un problème ayant une symétrie de révolution par rapport à l’axe optique. Nous pouvons nous réduire à un problème plan en nous plaçant dans un plan contenant l’axe optique ; l’axe optique est encore un axe de symétrie orthogonale, nous pouvons donc nous contenter d'étudier un demi-plan. Pour simplifier, nous plaçons le centre du dioptre sphérique à l’origine O du repère. L’axe optique est l’axe ''x'' et l'axe perpendiculaire, vertical sur la figure, c’est l’axe ''y''. Les coordonnées de la source sont donc (-''d'' ; 0). Le rayon issu de la source et faisant un angle θ avec l’axe ''x'' frappe le dioptre plan à l’altitude ''h''. Nous avons : : ''h'' = ''d'' ⋅ tan θ. L’angle d’incidence vaut θ. D’après la loi de Snell-Descartes, l'angle de réfraction θ<sub>2</sub> vaut : : θ<sub>2</sub> = arcsin((sin θ) / ''n''). Le rayon réfracté passe par le points de coordonnées (0, ''h''). L’équation de la droite est donc : : ''y'' = a ⋅ ''x'' + ''h'' avec : ''a'' = tan θ<sub>2</sub>. L’équation du cercle de centre O et de rayon R est : : ''x''<sup>2</sup> + ''y''<sup>2</sup> = R<sup>2</sup>. Les coordonnées (''x''<sub>M</sub>, ''y''<sub>M</sub>) de l’intersection M du rayon avec le dioptre sphérique vérifient les deux équations. Par substitution, nous obtenons une équation du second degré en ''x'' que nous savons résoudre : : ''x''<sub>M</sub><sup>2</sup> + (''a'' ⋅ ''x''<sub>M</sub> + ''h'')<sup>2</sup> = R<sup>2</sup> : ⇔ (1 + ''a''<sup>2</sup>) ⋅ ''x''<sub>M</sub><sup>2</sup> + 2 ⋅ ''a'' ⋅ ''h'' ⋅ ''x''<sub>M</sub> + ''h''<sup>2</sup> – R<sup>2</sup> = 0. D’après les propriétés du cercle, le rayon est perpendiculaire à la tangente. Le rayon [OM] est donc normal au dioptre en M. Nous pouvons déterminer l’angle d’incidence θ<sub>i</sub> par le produit scalaire : : <math>\begin{pmatrix} 1 \\ a \end{pmatrix} \cdot \begin{pmatrix} x_\mathrm{M} \\ y_\mathrm{M} \end{pmatrix} = \sqrt{1^2 + a^2} \cdot \mathrm{R} \cdot \cos(\theta_\mathrm{i})</math> ce qui nous permet de calculer cet angle : : <math>\theta_\mathrm{i} = \operatorname{arcos} \left ( \frac{x_\mathrm{M} + a \cdot y_\mathrm{M}}{\mathrm{R} \cdot \sqrt{1^2 + a^2} } \right )</math> Comme nous passons vers un milieu d’indice plus faible, il y a un risque de réflexion totale. L’angle limite est : : θ<sub>max</sub> = arcsin(1/''n''). Si l’on a θ<sub>i</sub> &gt; θ<sub>max</sub>, le rayon repart vers l’intérieur. Nous ne traçons pas le rayon car cela nous emmènerait trop loin dans l’analyse. En revanche, si θ<sub>i</sub> ≤ θ<sub>max</sub>, alors nous pouvons appliquer la loi de Snell-Descartes pour avoir l’angle de réfraction θ<sub>e</sub> : : θ<sub>e</sub> = arcsin(''n'' ⋅ sin θ<sub>i</sub>). Pour tracer le rayon sortant, il nous faut l’angle θ<sub>3</sub> par rapport à l’horizontale. L’angle du rayon [OM] par rapport à l’horizontal vaut arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>), nous avons donc : θ<sub>3</sub> = arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>) + θ<sub>e</sub>. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Analyse algorithmique}} '''Structure des données''' Le problème est décrit par trois paramètres : # Le rayon <code>R1</code> de la lentille, en milliètres (réel en virgule flottante). # L’indice du verre, <code>n</code> sans dimension (réel en virgule flottante). L’indice de l’air vaut 1. # La distance de la source au dioptre d’entrée plan, <code>d</code> en millimètres (réel en virgule flottante). Un rayon est caractérisé par quatre paramètres : # L’angle d’émission <code>theta1</code> en radians (réel en virgule flottante). # L’angle de réfraction dans la lentille <code>theta2</code> en radians (réel en virgule flottante). # Les cordonnées <code>M</code> en millimètre (vecteur de dimension 2 <code>([x, y])</code> de réels en virgule flottante) du point d’intersection du rayon avec le dioptre sphérique. # L’angle de réfraction dans l’air après la lentille <code>theta3</code> en radians (réel en virgule flottante). Pour le calcul et le tracé, nous avons besoin des paramètres intermédiaires suivants : * l’altitude ''y'' = <code>h</code> en millimètres (réel en virgule flottante) à laquelle le rayon frappe le dioptre plan d’entrée ; * l’angle d’incidence du rayon avec le dioptre sphérique <code>thetaint</code> en radians (réel en virgule flottante). Les angles sont stockés en radians car c’est l’unité naturelle pour le calcul mais nous affichons les valeurs en degrés. Comme le calcul de conversion est récurrent, nous conservons les facteurs <code>degversrad</code> (conversion des degrés vers les radians, facteur valant π/180, réel en virgule flottante) et <code>radversdeg</code> (conversion des radians vers les degrés, facteur valant 180/π, réel en virgule flottante). '''Fonctions''' Nous avons besoin d’une fonction qui calcule les trois paramètres du rayon <code>(theta2, M, theta3)</code> à partir de l’angle d’émission <code>theta1</code>. Nous appelons cette fonction <code>lanceRayon()</code>. Cette fonction fait appelle à une fonction qui calcule l’angle du rayon réfracté à partir de l’angle du rayon incident <code>theta1</code>, les deux angles étant par rapport à la normale au dioptre au point considéré. Nous appelons cette fonction <code>refrac()</code>. La recherche de l’intersection <code>M</code> du rayon avec le dioptre sphérique nécessite de résoudre une équation du second degré. Nous utilisons pour cela la recherche des racines du polynôme en <code>x</code> avec la fonction <code lang="python">numpy.polynomial.polynomial.polyroots()</code>. D’après la configuration du problème géométrique, si l’on s’assure que le rayon frappe bien la lentille (0 ≤ <code>h</code> ≤ <code>R1</code>) alors nous sommes sûrs que le problème a deux solutions réelles (une positive et une négative) ou, dans le cas dégénéré où <code>h == R1</code>, une valeur unique <code>x == 0</code>. Comme nous recherchons la valeur positive, nous sélectionons la plus grande des deux racines. Pour la gestion de la réflexion interne : dans la fonction <code>refrac()</code>, nous vérifions les conditions de réflexion totale et si elles sont remplies, alors nous générons une erreur (commandes <code lang="python">try… except</code> et <code lang="python">raise ValueError</code>). Cette erreur est propagée à la fonction <code>lanceRayon()</code> : <code>lanceRayon()</code> appelle la fonction <code>refrac()</code> et si cette fonction renvoie une erreur, alors <code>lanceRayon()</code> renvoie également une erreur. Pour trouver l’angle d’émission <code>thetaLimite</code> provoquant la réflexion totale (en radians, réel en virgule flottante), nous effectuons une recherche par dichotomie : * nous partons de l’angle maximum possible, lorsque le rayon frappe le sommet de la lentille, et nous appelons la fonction <code>lanceRayon()</code> ; si cela ne génère pas d’erreur, alors nous pouvons aller jusqu’à cette valeur, la recherche est terminée ; si cela génère une erreur, alors nous divisons la valeur par deux ; * à une étape de la recherche donnée, si <code>lanceRayon()</code> ne génère pas d’erreur avec l’angle testé, alors nous savons que l’angle limite est supérieur à cette valeur ; cette valeur minore donc la valeur recherchée ; si au contraire <code>lanceRayon()</code> génère une erreur, alors c’est que l’angle est trop important, cette valeur majore donc la valeur recherchée ; nous pouvons ainsi resserer l’intervalle de recherche ; * nous nous arrêtons lorsque les valeurs haute et basse sont suffisamment proche. Concrètement : # Nous définissons une variable <code>angleHaut</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus bas connu provoquant la réflexion totale. # Nous définissons une variable <code>angleBas</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus haut connu ne provoquant pas de réflexion totale. Sa valeur initiale est 0. L’angle limite recherché est donc entre <code>angleBas</code> et <code>angleHaut</code>. # Nous définissons l’angle <code>angleTest</code> comme étant la moyenne entre <code>angleBas</code> et <code>angleHaut</code>. Si <code>lanceRayon(angleTest)</code> génère une erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleHaut</code> (puisque c’est une valeur provoquant la réflexion totale et qu’elle est plus basse que la valeur actuelle d’<code>angleHaut</code>). À l’inverse, si <code>lanceRayon(angleTest)</code> ne génère pas d’erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleBas</code> (puisque c’est une valeur ne provoquant pas la réflexion totale et qu’elle est plus haute que la valeur actuelle d’<code>angleBas</code>). # Nous arrêtons la procédure lorsque l’écart entre <code>angleBas</code> et <code>angleHaut</code> est inférieur à {{unité|10|échelle=<sup>–3</sup>|rad}} (valeur arbitraire). La valeur retenue est la valeur finale d’<code>angleBas</code> (puisque l’on veut être sûr qu’il n’y ait pas de réflexion totale). La valeur affichée est la valeur en degrés arrondie au dixième. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Solution}} Nous demandons à l’utilisateur ou à l’utilisatrice les valeurs des paramètres du problème : rayon de la lentille, distance de la source, indice de réfraction du verre. Nous vérifions que les valeurs entrées sont bien des nombres ; si c’est une chaîne vide, alors nous utilisons une valeur par défaut. Nous créons une fonction <code>refrac()</code> qui permet de calculer l’angle réfracté à partir de l’angle d’incidence et des indices de réfraction. S’il y a rélexion totale, alors nous générons une erreur. La fonction <code>lanceRayon()</code> calcule les différents points de passage du rayon. Elle appelle pour cela la fonction <code>refrac()</code>. Si un appel de la commande <code>refrac()</code> génère une erreur, alors nous générons également une erreur. Nous déterminons l’angle d’émision du rayon <code>thetaLimite</code> qui provoque une réflecxion totale. Pour cela, nous créons une fonction <code>rechercheLimite()</code> qui cherche par dichotomie. Nous traçons un rayon tous les 5° jusqu’à la valeur limite. <syntaxhighlight lang="python"> #!/usr/bin/env python3 # coding: utf-8 """nom : lancerRayons.py auteur : User:cdang date de création : 2022-05-06 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : NumPy, matplotlib ---------------------------------------------------------------------------- Objectif : trace des trajets optique avec une lentille hémisphérique Entrées ------- Le rayon de la lentille, la distance de la source, l’indice de réfraction du verre, trois chaînes de caractères saisies par l’utilisateur·rice et qui sont converties en réels. Sorties ------- La valeur limite de l’angle (réel) et le tracé de plusieurs rayons. """ # ****************************************************** # ****************************************************** # ** Lancer de rayons pour une lentille hémisphérique ** # ****************************************************** # ****************************************************** import numpy as np import matplotlib.pyplot as plt import numpy.polynomial.polynomial as nppol # ************** # * Constantes * # ************** # Pour la conversion degrés ↔ radians radversdeg = 180/np.pi degversrad = 1/radversdeg # ************* # * Fonctions * # ************* def boucleEntreeNombre(messageSaisie, valeurDefaut): """Permet de s’assurer que l’utilisateur·rice a bien entré un nombre. Entrée : — message à afficher (chaîne de caractères) ; — valeur par défaut (réel à virgule flottante). Sortie : nombre (réel à virgule flottante).""" messageErreur = "Veuillez entrer une valeur numérique (ou vide pour accepter la valeur par défaut).\n" execute = True while execute: strNombre = input(messageSaisie+f" (valeur par défaut {valeurDefaut}) : ") if strNombre == "": nombre = valeurDefaut execute = False else: try: nombre = float(strNombre) except: print(messageErreur) else: execute = False return nombre def initialisation(): """L’utilisateur·rice entre les variables du problème. Entrées : aucune. Sorties : — R1 (mm) : rayon de la lentille ; — d (mm) : distance de la source au dioptre plan ; — n (sans dimension) : indice de réfraction du verre.""" R1 = boucleEntreeNombre("Rayon de la lentille en mm", 20.0) d = boucleEntreeNombre("Distance de la source au dioptre plan en mm", 20.0) n = boucleEntreeNombre("Indice de réfraction (sans dimension)", 1.5) return (R1, d, n) def refrac(n1, n2, theta1): """Calcule l’angle de réfraction theta2 (radians) en fonction — de l’angle d’incidence theta1 (radians); — de l’indice de réfraction n1 du premier milieu ; — de l’indice de réfraction n2 du second milieu.""" reflexionTotale=False rapport=n2/n1 rapportinv=np.reciprocal(rapport) if n1 > n2: thetal = np.arcsin(rapport) # angle limite pour la réflexion totale if theta1 >= thetal: reflexionTotale=True if reflexionTotale: print("Réflexion totale") raise ValueError else: return np.arcsin(rapportinv*np.sin(theta1)) def lanceRayon(n1, n2, d, R, theta1): """Détermine le rayon issu de la source située à une distance d (mm) du bareau et avec une élévation de theta1 (radians), en fonction des indices de réfraction n1 et n2. Les éléments retournés sont : — la hauteur h (mm) à laquelle le rayon frappe le barreau ; — l’angle de réfraction theta2 (radians)) dans le barreau ; — l’angle de réfraction theta3 (radians) à la sortie du barreau — le point M(x, y) (mm) auquel le rayon sort du barreau.""" h = d*np.tan(theta1) if h >= R: print("Le rayon est au-dessus du barreau") raise ValueError else: theta2 = refrac(n1, n2, theta1) a = np.tan(theta2) x = max(nppol.polyroots([h*h - R*R, 2*a*h, 1+a*a])) # recherche de l’intersection du rayon avec le cercle y = a*x + h M = np.array([x, y]) thetaint = np.arccos((x + a*y)/(R*np.sqrt(1 + a*a))) theta3 = np.arctan(y/x) - refrac(n2, n1, thetaint) return (h, theta2, theta3, M) def rechercheLimite(n1, n2, d, R): """Recherche l’angle limite pour la réflexion totale. Entrée : — indice de réfraction des milieux 1 et 2, n1 et n2 ; — distance au barreau, d(mm). Sortie : angle limite theta (radians)""" angleHaut = np.arctan(R/d) angleBas = 0 angleTest = angleHaut try: lanceRayon(n1, n2, d, angleTest, R) except: condition = True # il y a réflexion total en haut de la lentille else: condition = False # il n’y a jamais réflexion totale dans la lentille while condition: #dichotomie angleTest = np.mean([angleHaut, angleBas]) # on ajuste la valeur de test try: lanceRayon(n1, n2, d, R, angleTest) except: angleHaut = angleTest # réflexion totale : on abaisse la valeur maximale else: angleBas = angleTest # pas de réflexion totale : on monte la valeur minimale condition = ((angleHaut - angleBas) >= 0.001) # on a cerné la limite à 0,001 rad près if not condition: angleTest = angleBas return angleTest # *********************** # * Programme principal * # *********************** (R1, d, n) = initialisation() xmax = round(R1 + d) thetaLimite = rechercheLimite(1, n, d, R1) thetaLimiteDeg = thetaLimite*radversdeg print(f"Angle limite pour la réflexion totale : {thetaLimiteDeg:.1f}°.\n") anglesDeg = np.arange(0, thetaLimiteDeg, 5)[1:] # trace un rayon tous les 5° anglesRad = anglesDeg*degversrad nb = len(anglesDeg) h = np.zeros(nb) # initialisation des vecteurs de valeurs theta2 = np.zeros(nb) theta3 = np.zeros(nb) M = np.zeros((nb, 2)) for i in range(nb): (h[i], theta2[i], theta3[i], M[i, :]) = lanceRayon(1, n, d, R1, anglesRad[i]) (h_lim, theta2_lim, theta3_lim, M_lim) = lanceRayon(1, n, d, R1, thetaLimite) # tracé anglesCercle = 0.5*np.pi*(np.linspace(1, 0, 20)) x_cercle = R1*np.cos(anglesCercle) # coordonnées des pints du cercle y_cercle = R1*np.sin(anglesCercle) fig = plt.plot([-d,xmax], [0, 0], "k-.", linewidth="0.5") # tracé de l’axe optique for i in range(nb): plt.plot([-d, 0, M[i, 0], xmax], [0, h[i], M[i, 1], M[i, 1] + (xmax - M[i, 0])*np.tan(theta3[i])], label=f"{anglesDeg[i]:.0f}°") plt.plot([-d, 0, M_lim[0], xmax], [0, h_lim, M_lim[1], M_lim[1] + (xmax - M_lim[0])*np.tan(theta3_lim)], label=f"{0.1*int(np.trunc(10*thetaLimite*radversdeg)):.1f}°") plt.plot(x_cercle, y_cercle, "k", linewidth="0.5") # tracé du cercle plt.plot([0,0], [0, R1], "k", linewidth="0.5") # tracé du premier dioptre #plt.axis("square") plt.gca().set_aspect("equal", adjustable="box") plt.xlabel("x (mm)") plt.ylabel("y (mm)") plt.title("Lentille hémisphérique, lancer de rayons") plt.legend() plt.savefig("lentille_hemispherique_lancer_rayon.svg", format="svg") plt.show() </syntaxhighlight> {{Boîte déroulante/fin}} == Mesurer le temps == Le module <code>time</code> fournit les fonctions suivantes : * <code>time.gmtime()</code> : renvoie la date et l'heure du méridien de Greenwich (''{{lang|en|Greenwich mean time}}'', GMT), sous la forme d'un dictionnaire (année, mois, jour du mois, heure, minute, seconde, jour de la semaine, jour de l'année, heure d'été/hiver), ** jour de la semaine est un entier entre 0 (lundi) et 6 (dimanche), ** jour du mois est un entier entre 1 et 366 ; * <code>time.localtime()</code> : comme le précédent, mais l'heure est l'heure locale ; * <code>time.time()</code> : donne le nombre de seconde qui se sont écoulées depuis le 1er janvier 1970 ; * <code>time.gmtime(n)</code> et <code>time.localtime(n)</code> transforment un nombre de secondes (écoulées depuis le 1er janvier 1970) en une date au format (année, mois, jour, etc.), n-uplet de neuf valeurs ; <code>time.mktime()</code> fait le contraire, il transforme un n-uplet de neuf valeurs (années, mois, jour, etc.) en un nombre de secondes (écoulées depuis le 1er janvier 1970) ; * <code>time.sleep(n)</code> : provoque une pause dans le déroulement du programme de ''n'' secondes ; * <code>time.perf_counter()</code> : indique une date en seconde ; s'utilise pour mesurer la durée d'exécution d'une partie du code, en faisant la différence entre deux relevés. Concernant la date et l'heure sous la forme d'un n-uplet, on peut extraire l'heure de la manière suivante : <syntaxhighlight lang="python"> import time a = time.localtime() print("Il est ", a[3], "h", a[4]) # ou bien print("Il est ", a.tm_hour, "h", a.tm_min) </syntaxhighlight> Pour mesurer la performance d'une portion de code : <syntaxhighlight lang="python"> import time t1 = time.perf_counter() <suite d’instructions> t2 = time.perf_counter() print("Durée d'exécution :", t2-t1 </syntaxhighlight> == Programmation orientée objet == Nous n'allons pas ici faire un cours de programmation orientée objet (POO), nous allons aborder le sujet de manière pragmatique. De manière schématique, un « objet » est une « super-variable ». Cette super-variable peut contenir plusieurs variables, appelées « attributs » ; elle contient en fait un dictionnaire (paires « nom d'attribut : valeur d'attribut »). Elle peut aussi contenir des fonctions spécifiques appelées « méthodes ». De même qu'une variable a un type, un objet fait partie d'une « classe ». La classe est le modèle de l'objet ; en franglais informatique, on dit que l'objet est une instance de la classe. La POO est donc un formalisme : lorsque l'on définit des variables et des fonctions concernant un même type d'objet (au sens commun du terme), on les empaquette dans une classe. Il faut donc d'abord définir la classe, puis attribuer cette classe à un objet (« instancier » la classe). Considérons par exemple que nous voulons travailler sur des [[w:Engrenage|engrenages]] ; pour simplifier, nous nous contentons d'engrenages à dentures droites. Une roue dentée, un pignon, est essentiellement définie par son nombre de dents Z et par son module ''m'' qui correspond à la largeur de dents<ref>ainsi que par son épaisseur ''e'' et le matériau dont elle est faite mais nous allons négliger ces paramètres pour la simplicité de l'étude.</ref>. Nous allons définir trois méthodes : la méthode <code>.diametrePrimitif()</code> qui calcule le diamètre primitif de la roue dentée, <code>.pas()</code> qui calcule la largeur des dents au niveau du cercle primitif et <code>.rapport()</code> qui calcule le rapport de transmission de deux roues engrenées Z<sub>1</sub>/Z<sub>2</sub>. La méthode <code>.rapport()</code> vérifie par ailleurs que les roues ont le même module, condition indispensable pour former un engrenage. Nous définissons la classe ainsi : <syntaxhighlight lang="python"> class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): # instructions lancées lors de la déclaration """Valeurs des attributs""" self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z </syntaxhighlight> Nous remarquons que lorsque nous déclarons les méthodes, le paramètre <code>self</code> correspond à l'objet lui-même. Ainsi, dans la méthode <code>.rapport()</code>, la variable <code>self.Z</code> est le nombre de dents de la roue elle-même et <code>roueDentee.Z</code> est le nombre de dents de la roue passée en paramètre. Pour déclarer les roues, nous écrivons : <syntaxhighlight lang="python"> roue1 = pignon() # attribution de la classe, « instanciation » roue1.Z = 13 # définition des caractéristiques du pignon « roue1 » roue1.m = 2 roue2 = pignon(16, 2) # manière alternative </syntaxhighlight> Nous pouvons alors utiliser les objets de la manière suivante : <syntaxhighlight lang="python"> print(roue1.Z) # 13 print(roue1.diametrePrimitif()) # 26 R = roue1.rapport(roue2) # 0.8125 </syntaxhighlight> La commande <code>dir(a)</code> affiche tous les attributs et méthodes de l'objet <code>a</code>. ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/classes.html | titre = Classes | site = Python documentation | consulté le = 2019-03-08 }} == Interface graphique avec Tk == Une interface graphique utilisateur (GUI, ''{{lang|en|graphic user interface}}'') est un ensemble de boîtes permettant d'interagir avec l'utilisateur c'est-à-dire permettre la saisie d'informations, l'exécution d'actions et afficher des informations. Elle se compose d'éléments appelés ''{{lang|en|widgets}}''. Les éléments ''({{lang|en|widgets}})'' classiques sont : * boîte de dialogue ''({{lang|en|dialog box}})'' : fenêtre contenant d'autres éléments ; * étiquette ''({{lang|en|label}})'' : texte affiché ; * liste déroulante ''({{lang|en|drop-down list}})'' : zone permettant le choix d'une option, la liste se déployant lorsque l'on clique sur la zone ; * zone de texte, champ de saisie ''({{lang|en|text box}})'' : zone permettant de taper du texte ; * boîte combinée ''({{lang|en|combo box}})'' : zone de saisie de texte contenant une liste déroulante qui permet de choisir des éléments prédéfinis ; * bouton ''({{lang|en|button}})'' : objet effectuant une action lorsque l'on clique dessus ; * case à cocher ''({{lang|en|checkbox, tickbox}})'' : objet permettant d'activer ou de désactiver une option lorsque l'on clique dessus ; * bouton radio, case d'option ''({{lang|en|radio button}})'' : objet permettant d'activer une option en désactivant les autres options ; une seule option peut être activée à la fois. Plusieurs modules permettent de gérer les interfaces graphiques. Nous choisissons ici le module développé sur la bibliothèque Tk qui est une bibliothèque multiplateforme. Pour cela, nous importons le module <code>tkinter</code> ainsi que le module <code>ttk</code>, ce dernier proposant des options plus « modernes » : <syntaxhighlight lang="python"> import tkinter as tk from tkinter import ttk </syntaxhighlight> Voici un programme permettant comme précédemment de calculer le rapport de transmission d'un engrenage. Nous détaillons sa construction ci-après. <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: IUrapport.set(valeurZ2/valeurZ1) except: IUrapport.set("erreur") # ************************* # ************************* # ** Interface graphique ** # ************************* # ************************* # fenetre principale fenetre = tk.Tk() fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> '''Explications''' Nous commençons par définir la boîte de dialogue que nous appelons <code>fenetre</code> ; c'est un objet <code>Tk</code> et nous lui donnons un titre « » : <syntaxhighlight lang="python"> fenetre = tk.Tk() fenetre.title("Rapport de réduction") </syntaxhighlight> Puis, nous définissons un cadre attaché à cette fenêtre et qui va nous permettre « d'accrocher » les autres éléments, ce qui permet de garder une apparence satisfaisante lorsque l'on retaille la fenêtre : <syntaxhighlight lang="python"> cadre = ttk.Frame(fenetre) </syntaxhighlight> Le cadre va comporter six lignes ''({{lang|en|row}})'' et deux colonnes ''({{lang|en|column}})''. Nous allons placer une étiquette ''({{lang|en|label}})'' « z1 » : <code>text="z1"</code>. Cette étiquette se trouve dans une case du cadre, celle de la première colonne et la première ligne : <code>grid(column=1, row=1)</code>. Par rapport à cette case, elle est collée à « l'ouest » (W, ''{{lang|en|west}}'', gauche) de la case : <code>sticky=tk.W</code>. <syntaxhighlight lang="python"> z1_label = ttk.Label(cadre, text="z1") # Création de l'étiquette z1_label.grid(column=1, row=1, sticky=tk.W) # Placement de l'étiquette </syntaxhighlight> Notez que l'on aurait pu écrire directement : <syntaxhighlight lang="python"> ttk.Label(cadre, text="z1").grid(column=1, row=1, sticky=tk.W) </syntaxhighlight> mais le fait de séparer la création de l'élément et son placement facilite la maintenance (recherche d'erreur, évolution du code). Pour tout ce qui est dynamique, c'est-à-dire les zone de saisie des valeurs et l'affichage du résultat, il faut définir des « chaînes variables » ''({{lang|variable strings}})'' : <syntaxhighlight lang="python"> IUz1 = tk.StringVar() </syntaxhighlight> Cette variable est une variable globale à la création. Nous pouvons alors placer la zone de saisie ''({{lang|en|entry}})'' à côté de l'étiquette lui correspondant. Nous nommons la zone de saisie <code>z1_entry</code> : <syntaxhighlight lang="python"> z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) </syntaxhighlight> Nous faisons de même pour les trois autres paramètres de l'engrenage, ''m''<sub>1</sub>, ''z''<sub>2</sub> et ''m''<sub>2</sub>. Le résultat est également une chaîne variable globale. Par rapport à notre mise en page, elle se situe dans la case colonne 2 ligne 5, centrée sur cette case (collé à l'est et à l'ouest) : <syntaxhighlight lang="python"> rapport = tk.StringVar() rapport_dynamique = ttk.Label(cadre, textvariable=rapport) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) </syntaxhighlight> Il nous faut encore définir une fonction de manière classique, nous l'appelons « calcule ». Les variables étant globales, on les utilise directement. On récupère les valeurs avec la méthode <code>get()</code> et nous modifions la valeur avec la méthode <code>set()</code> : <syntaxhighlight lang="python"> def calcule(): valeurZ1 = float(IUz1.get()) valeurZ2 = float(IUz2.get()) IUrapport.set(valeurZ2/valeurZ1) </syntaxhighlight> Cette fonction est déclenchée lorsque l'on clique sur le bouton « Calcul » situé dans la case du cadre ligne 6 colonne 2 : <syntaxhighlight lang="python"> bouton = ttk.Button(cadre, text="Calcul", command=calcule) bouton.grid(column=2, row=6, sticky=tk.W) </syntaxhighlight> ou bien si l'on appuie sur la touche <code>[entrée]</code> du clavier : <syntaxhighlight lang="python"> fenetre.bind("<Return>", calcule) </syntaxhighlight> À tout ceci, nous ajoutons des « gouttières » (marges, ''{{lang|en|paddings}}'') afin d'espacer les éléments. Il faut ensuite « activer » la fenêtre pour qu'elle s'affiche. La méthode est <code>mainloop()</code> (boucle principale) : « boucle » (elle est active en permanence et attend des actions sur ses éléments), <syntaxhighlight lang="python"> fenetre.mainloop() </syntaxhighlight> Nous avons ci-dessus mis la plupart du code en programme principal. Nous pouvons aussi programmer de manière fonctionnelle, en mettant la plupart du code dans des fonctions ; cependant, pour que la fenêtre et les variables dynamiques soient globales à tout le programme, elles doivent être déclarées dans le programme principal. Nous pouvons aussi mêler la programmation orientée objet. {{boîte déroulante début|Calcul du rapport de transmission en programmation fonctionnelle et orientée objet}} <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # ************* # ************* # ** Classes ** # ************* # ************* class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): """Valeurs des attributs""" # instructions lancées lors de la déclaration self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z # ************************ # ************************ # ** Variables globales ** # ************************ # ************************ # fenetre principale fenetre = tk.Tk() # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: roue1 = pignon(valeurZ1, valeurM1) roue2 = pignon(valeurZ2, valeurM2) IUrapport.set(roue1.rapport(roue2)) except: IUrapport.set("Erreur") # *********************** # * Interface graphique * # *********************** def configureFenetre(): """Configuration de la fenêtre principale""" fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* configureFenetre() # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> {{boîte déroulante fin}} == Annotations == Une annotation est un commentaire qui sert à expliciter un type de variable. La syntaxe est différente des commentaires « classiques » : cela permet d'avoir un affichage différent avec les éditeurs de texte ayant une coloration syntaxique, et ces informations peuvent être récupérées par des logiciels extérieurs pour effectuer une documentation automatique ou bien des vérifications de type. Cependant : * comme les commentaires normaux, ils n'ont aucune influence lors de l'exécution du texte ; en particulier : * rien n'oblige à annoter les variables ; * il est possible d'avoir une variable ayant un type différent de son annotation ; le fait de pouvoir définir et changer le type de variable à la volée est une fonctionnalité fondamentale de Python. La syntaxe pour une annotation est : : nom_de_variable + deux-points + espace + type par exemple : <syntaxhighlight lang="python"> a: int </syntaxhighlight> Notez qu'ici, la variable n'est ''pas'' créée. Pour la créer, il faut lui affecter une valeur. Il est possible de l'affecter après ou bien sur la même ligne avec la syntaxe : : nom_de_variable + deux-points + espace + type + espace + égal + espace + valeur par exemple : <syntaxhighlight lang="python"> a: int a = 5 # est équivalent à a: int = 5 </syntaxhighlight> Même si l'annotation n'a pas d'impact sur l'exécution, le type doit être un type existant sinon cela génère une erreur de syntaxe. Les types classiques sont : : <code>int</code> — <code>float</code> — <code>str</code> — <code>bool</code> — <code>list</code> — <code>tuple</code> — <code>dict</code> Il est également possible de mettre une chaîne de caractères : <syntaxhighlight lang="python"> a: "ce que je veux" = 3.1516 </syntaxhighlight> On peut annoter une fonction. Il est possible d'annoter les variables déclarées au sein de la fonction, mais pas les variables globales (puisqu'elle ne sont pas définie au sein de la fonction). On peut aussi annoter : * les variables passées en paramètre, avec la même syntaxe dans les parenthèses ; * annoter le type de la variable de sortie (retournée) en la faisant précéder de <code>-&gt;</code> : <syntaxhighlight lang="python"> def plusCinq(a: float = 0) -> float: return a + 5 </syntaxhighlight> ; Ressources * {{lien web | url = https://www.python.org/dev/peps/pep-0526/ | titre = PEP 526 -- Syntax for Variable Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} * {{lien web | url = https://www.python.org/dev/peps/pep-3107/ | titre = PEP 3107 -- Function Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} == Décorateur == Un décorateur est une fonction qui s'applique à une fonction, à la manière de la composition mathématique ''g'' ∘ ƒ = ''g''(ƒ). Mais cette composition affecte la fonction elle-même ; l'utilisateur appelle la fonction ƒ mais c'est la fonction ''g'' ∘ ƒ qui s'exécute. Cette fonction ''g'' est appelée le décorateur. L'intérêt est de pouvoir modifier une fonction sans modifier le code de la fonction elle-même. Pour appliquer une décoration, il faut : # Déclarer le décorateur : une fonction qui s'applique à une autre fonction. # Affecter le décorateur à la fonction visée : en mettant <code>@''décoration''</code> juste avant la définition de la fonction. Par exemple : <syntaxhighlight lang="python"> def decorateur(f): print("Avant la fonction") f() print("après la fonction") @decorateur def afficheFoo(): print("Foo.") afficheFoo # Avant la fonction # Foo. # Après la fonction </syntaxhighlight> Lorsque l'on appelle <code>afficheFoo</code>, on appelle en fait <code>decorateur(afficheFoo)</code>. Si la fonction à modifier admet des paramètres, il faut définir une fonction enveloppante dans le décorateur. Par exemple, nous définissons ci-dessous un décorateur <code>deuxFois()</code> qui fait s'exécuter deux fois de suite la fonction : <syntaxhighlight lang="python"> def deuxFois(f): def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # conteneurFonction </syntaxhighlight> Nous voyons que l'application du décorateur a modifié le nom de la fonction — pas le nom de la variable qui contient la fonction mais bien son nom « intime ». Pour éviter cela, on utilise la méthode <code>wraps()</code> du module <code>functools</code> : <syntaxhighlight lang="python"> import functools def deuxFois(f): @functools.wraps(f) def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # plusCinq </syntaxhighlight> On peut par exemple utiliser un décorateur pour la mémoïsation. La mémoïsation est une méthode consistant à mémoriser les valeurs d'une fonction au fur et à mesure de son utilisation ; ainsi, si l'on veut évaluer la fonction avec les mêmes entrées, on se contente d'aller chercher la valeur enregistrée ce qui est plus rapide. On sacrifie donc la place mémoire au profit de la rapidité. On peut trouver des décorateurs de mémoïsation aux adresses suivantes : * https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize * https://gist.github.com/robcowie/1357800 ; Ressources : {{lien web | url = https://www.python.org/dev/peps/pep-0318/ | titre = PEP 318 -- Decorators for Functions and Methods | site = Python.org | lang = en | consulté le = 2019-04-05 }} == Manipulation de fichiers == === Importer le contenu d'un fichier === Python possède la fonction <code lang="python">open()</code> qui permet d'ouvrir un fichier. Ouvrir signifie qu'il crée un objet de type <code>file</code> qui possède notamment les méthodes <code lang="python">read()</code> et <code lang="python">write()</code>. Il peut s'agir d'un objet de type « fichier binaire » ''({{lang|en|binary file}})'' ou « fichier texte » ''({{lang|en|text file}})''. Si par exemple on veut utiliser (et donc lire) le contenu du fichier texte <code>monfichier.txt</code>, on écrit : <syntaxhighlight lang="python"> fichier = open("monfichier.txt", "rt") … fichier.close() </syntaxhighlight> Le paramètre <code>"rt"</code> signifie que nous ouvrons le fichier en lecture ''({{lang|en|read}})'' et qu'il s'agit d'un objet de type fichier texte. Notons deux choses : * en faisant cela, nous ne faisons qu'associer le fichier à un objet Python, nous n'avons pas encore importé les données ; * si nous ouvrons le fichier, il faut le fermer par la suite ; c'est pourquoi nous utilisons la méthode <code lang="python">.close()</code>. Pour éviter d'avoir à fermer le fichier, nous pouvons l'ouvrir au sein d'un contexte : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: … </syntaxhighlight> Notons aussi que la chaîne de caractères indiquant le nom du fichier peut contenir le chemin d'accès au répertoire (dossier), mais sous Microsoft Windows, il faut utiliser des barres de fractions <code>/</code> pour séparer les sous-répertoires au lieu de la barre inversée habituelle, par exemple : <syntaxhighlight lang="python"> chemin = "C:/Temp/monfichier.txt" with open(chemin, "rt") as fichier: … </syntaxhighlight> Pour mettre les données du fichier dans la variable <code>contenu</code>, nous écrivons donc : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() print(contenu) </syntaxhighlight> et si nous ne voulons lire que les <code>n</code> premiers caractères (<code>n</code> étant un entier), nous utilisons <code lang="python">contenu = fichier.read(n)</code>. Cette lecture est séquentielle, c'est-à-dire que si nous appliquons la méthode plusieurs fois, nous reprenons la lecture là où nous l'avons laissée. Si nous voulons lire une ligne, nous utilisons la méthode <code lang="python">.readline()</code>. La lecture ligne par ligne est également séquentielle. Nous pouvons aussi créer une liste dont chaque élément est une ligne du fichier ; nous utilisons alors la méthode <code lang="python">.readlines()</code> (notez le pluriel). Chaque élément de la liste se termine par le caractère de fin de ligne <code lang="python">\n</code>. Pour l'enlever, nous pouvons utiliser la méthode <code lang="python">.rstrip()</code> pour chaque élément de la liste, par exemple. L'exemple complet est alors : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.readlines() contenu = [item.rstrip() for item in contenu] print(contenu) </syntaxhighlight> === Exporter du contenu vers un fichier === Si nous voulons créer un fichier texte pour y mettre le contenu de la variable <code>texte</code>, alors nous utilisons : <syntaxhighlight lang="python"> with open("monfichier.txt", "wt") as fichier: contenu = fichier.write(texte) </syntaxhighlight> Le module principal important pour la manipulation de fichiers est est <code lang="python">os</code>. === Exploiter le contenu d'un fichier texte === Avec un fichier texte, la méthode <code lang="python">.read()</code> crée une variable de type texte. Nous pouvons séparer cette variable en différentes lignes avec la méthode <code lang="python">.splitlines()</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une ligne. Si maintenant une ligne contient plusieurs données séparées par un séparateur commun, par exemple un espace, nous pouvons séparer les données par la méthode <code lang="python">.split(''séparateur'')</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une donnée. Si par exemple le fichier est du type CSV ''({{lang|en|comma separated values}}'', valeurs séparées par une virgule), l'exploitation du fichier est : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(",") for item in contenu] </syntaxhighlight> La variable <code>contenu</code> est une liste de listes. Pour avoir la ''n''<sup>e</sup> valeurs de la ''m''<sup>e</sup> ligne, on utilise : <syntaxhighlight lang="python"> contenu[m-1][n-1] </syntaxhighlight> Si l'on veut extraire la ligne ''m'' il suffit d'écrire : <syntaxhighlight lang="python"> contenu[m-1] </syntaxhighlight> mais si l'on veut la colonne ''n'', le plus simple est d'utiliser une définitipon en compréhension : <syntaxhighlight lang="python"> [ligne[n-1] for ligne in contenu] </syntaxhighlight> Dans certains fichiers CSV, les séparateurs de valeurs ne sont pas des virgules, on peut donc utiliser un autre caractère pour le séparateur. Si le séparateur est une tabulation, on utilise <code lang="python">\t</code> : <code lang="python">contenu = [item.split("\t") for item in contenu]</code> Si la première ligne contient les en-têtes des colonnes, on peut l'enlever avec la fonction <code lang="python">del()</code> : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() del(contenu[0]) contenu = [item.split(",") for item in contenu] </syntaxhighlight> Certains logiciels créent des fichiers en utilisant le séparateur décimal régional, qui en France est la virgule. Pour remplacer les virgules par des points, on peut utiliser la méthode <code lang="python">.replace()</code>, de préférence ''avant'' de séparer les valeurs : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.replace(",", ".") for item in contenu] # remplace les virgules par des points contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule </syntaxhighlight> en effet, lorsque l'on a séparé les valeurs, on a une liste de liste, il faut alors balayer les sous-listes ce qui prend plus de temps : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule contenu = [[subitem.replace(",", ".") for subitem in item] for item in contenu] # remplace les virgules par des points </syntaxhighlight> '''Exemple complet''' Supposons que l'on ait un fichier texte de la forme : <syntaxhighlight lang="text"> x y z V 0.0 1.5 3.2 8.657 0.4 1.5 3.2 8.392 0.2 1.5 3.2 8.485 ... </syntaxhighlight> C'est un fichier valeurs V associées à des points de coordonnées ''(x, y, z)'' (un champ V sur l'espace, donc). Nous remarquons que seule la coordonnée ''x'' change : les données concernent la droite (''y'' = 1,5 ; ''z'' = 3,2). Nous remarquons aussi que les valeurs de ''x'' ne sont pas classées par ordre croissant ni décroissant. Nous voulons au final avoir une matrice [[''x''], [V]] triée par ''x'' croissant. Pour cela, nous pouvons faire : <syntaxhighlight lang="python"> with open(nomdefichier, "rt") ad fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(" ") for item in contenu contenu = contenu[1:] # élimine la première ligne x = np.array([float(ligne[0]) for ligne in contenu]) V = np.array([float(ligne[3]) for ligne in contenu]) donnees = np.concatenate((x.reshape(-1, 1), V.reshape(-1, 1)), axis=1) # matrice [[x], [V]] ind = np.argsort(donnees[:, 0]) donnees = donnees[ind, :] # matrice triée plt.plot(donnees[:, 0], donnees[:, 1]) </syntaxhighlight> {{note|Pour le tri, voir [[../Manipulation_de_matrices#Fonctions_et_méthodes_de_base|''Manipulation de matrices'' &gt; ''Fonctions et méthodes de base'']].}} === Cas d'un fichier CSV === Si le fichier CSV ne contient que des valeurs numériques, on peut utiliser : <syntaxhighlight lang="python"> valeurs = np.loadtxt(chemin+nomfic, delimiter=",") # si le séparateur est une virgule </syntaxhighlight> Il existe un module <code lang="python">csv</code> dédié aux fichiers CSV. La manipulation du fichier se fait comme suit : <syntaxhighlight lang="python"> import csv with open(chemin+nomfic, "rt") as fichier: lecteur = csv.reader(fichier, delimiter=",") contenu = [ligne for ligne in lecteur] print(contenu) </syntaxhighlight> === Utilisation de Pandas === Pandas<ref>https://pandas.pydata.org/</ref> est un module gérant les tableaux de données, appelés <em lang="en">data frames</em>. Voici quelques commandes utiles : <syntaxhighlight lang="python"> import numpy as np import pandas as pd M = np.random.rand(10, 10) # crée une matrice NumPy aléatoire de dimension 10 × 10 tableau = pd.DataFrame(M) # transforme la matrice en tableau DataFrame tableau.to_csv("tableau.csv") # enregistre le tableau dans un fichier CSV donnees = pd.read_csv("tableau.csv").to_numpy() # lit le fichier et transforme le tableau DataFrame en matrice NumPy </syntaxhighlight> == Exporter un programme Python == Vous pouvez créer un fichier « Python pur » <code>.py</code>. Pour cela, dans le menu <code>fichier/file</code> de Jupyter, choisir <code>télécharger/download</code> au format <code>.py</code> ; le fichier se trouve alors dans le répertoire de téléchargement du navigateur. == Ressources == * {{lien web | url = https://www.python.org/dev/peps/pep-0008/ | titre = PEP 8 -- Style Guide for Python Code | site = Python documentation | consulté le = 2019-03-14 }} == Notes et références == {{références}} ---- [[../Fonctions mathématiques générales|Fonctions mathématiques générales]] &lt; [[../|↑]] &gt; [[../Graphiques|Graphiques]] {{DEFAULTSORT:Elements de programmation}} [[Catégorie:Python pour le calcul scientifique (livre)]] 5oixb2axt6roxvt6drd6fww7217qd5e 767321 767320 2026-06-02T13:11:45Z Cdang 1202 /* Autres fonctions */ exemple 767321 wikitext text/x-wiki Rappel : les programmes commencent par : <syntaxhighlight lang="python"> #!/usr/bin/python3 import numpy as np import matplotlib.pyplot as plt </syntaxhighlight> == Entrées et sorties == Pour permettre à l'utilisateur ou à l'utilisatrice d'entrer une valeur, nous utilisons la fonction <code lang="python">input()</code> comme évoqué précédemment (chapitre ''[[../Premiers programmes|Premiers programmes]]''), avec la syntaxe <code lang="python">''variable'' = input(''texte'')</code>. Notez que la valeur renvoyée par <code lang="python">input()</code> est une chaîne de caractères. Si vous voulez autre chose, typiquement un nombre, il faut convertir cette chaîne. Par exemple, nous demandons ici d'entrer une longueur sous la forme d'une valeur numérique : <syntaxhighlight lang="python"> longueurDefaut = 10.0 texteDemandeLongueur = f"Veuillez entrer la longueur en millimètres (valeur par défaut {longueurDefaut} mm) : " longueur = input(texteDemandeLongueur) if longueur=="": longueur=longueurDefaut else: longueur=float(longueur) print(longueur) </syntaxhighlight> Pour afficher un texte, on utilise la fonction <code lang="python">print()</code>, également présentée dans le chapitre ''[[../Premiers programmes|Premiers programmes]]'', avec la syntaxe <code lang="python">print(''texte'')</code>. Le texte à afficher peut être de n'importe quel type (entier, réel en virgule flottante, booléen, chaîne de caractères…) mais si l'on veut « mélanger » les types, il faut tout convertir en chaînes de caractères, avec la fonction <code lang="python">str()</code>, et concaténer les chaînes avec <code lang="python">+</code>. Par exemple : <syntaxhighlight lang="python"> print("La longueur vaut : "+str(longueur)+" mm.") </syntaxhighlight> Nous pouvons aussi utiliser une « chaîne “f” » ''({{lang|en|f-string}})'' : on met un le <code lang="python">f</code> devant le guillemet ouvrant et dans la chaîne, on met un champ sous la forme <code lang="python">{''nomDeVariable''}</code>. L'exemple ci-dessus devient alors : <syntaxhighlight lang="python"> print(f"La longueur vaut : {longueur} mm.") </syntaxhighlight> Les chaînes « f » sont détaillées dans la section ''[[#Chaînes de caractères|Chaînes de caractères]]'' ci-dessous. Si l'on veut introduire un retour à la ligne dans la chaîne, on utilise les caractères <code lang="python">\n</code> (contre-oblique suivie de la lettre N minuscule). Par exemple <syntaxhighlight lang="python"> print("Ceci est un texte\navec un retour à la ligne.") </syntaxhighlight> == Types de variables == === Généralités === Python définit « tout seul » le type de la variable : « <code>3</code> » sera un entier ''({{lang|en|integer}})'', « <code>3.0</code> » sera un réel à virgule flottante ''({{lang|en|float}})'', « <code>"3"</code> » sera une chaîne de caractères ''({{lang|en|string}})''. On peut connaître le type d'une variable avec la fonction <code>type()</code>. On peut tester certaines valeurs, avec le module <code>NumPy</code> : * <code>np.isnan(x)</code> indique si les valeurs de ''x'' sont des NaN ''({{lang|en|not a number}})'' ; si ''x'' est une matrice, le résultat est une matrice de booléens, l'élément [''i'', ''j''] est <code>True</code> si <code>x[i, j]</code> est un NaN ; * <code>np.isinf(x)</code> indique si les valeurs de ''x'' sont ±∞ ; si ''x'' est une matrice, le résultat est une matrice booléenne de même dimension. On peut forcer un type : * <code>int(x)</code> : transforme la valeur ''x'' en nombre entier ; * <code>long(x)</code> : " en entier long (précision illimitée) ; * <code>float(x)</code> : " en nombre réel à virgule flottante ; * <code>str(x)</code> : " en chaîne de caractères ; * <code>complex(Re, Im)</code> : crée le nombre complexe ''Re'' + ''Im''·j, j désignant la racine carrée de –1 ; * <code>list()</code> : crée une liste ; * <code>tuple()</code> : crée un n-uplet. Par exemple <syntaxhighlight lang="python"> type(3) # <class 'int'> type(float(3)) # <class 'float'> complex(1, 1) == 1 + 1j # True list("blabla") # ['b', 'l', 'a', 'b', 'l', 'a'] </syntaxhighlight> Python distingue plusieurs genres de types : * Un itérable est un objet dont on peut extraire les éléments un par un ; ce sont les objets pour lesquels on peut écrire <code> for i in ''iterable'':</code>. Il s'agit essentiellement des listes, n-uplets, chaînes de caractères, ensembles, dictionnaires et fichiers. * Un modifiable ''({{lang|en|mutable}})'' est un objet que l'on peut modifier ; par exemple une liste est modifiable — on peut changer la valeur d'un élément, en ajouter ou en enlever un — mais les n-uplets non, pas plus qu'une chaîne de caractères ou un nombre. * Un identifiable (''{{lang|en|hashable}}'', le ''{{lang|en|hashage}}'' étant une signature caractéristique d'un objet) : objet possédant un identifiant unique. Un objet identifiable est toujours non-modifiable ''({{lang|en|unmutable}})''. === Types numériques === ==== Entiers ==== Nous pouvons définir les entiers au format octal ou hexadécimal : il faut débuter le nombre par respectivement <code>0o</code> (le chiffre zéro et la lettre o) et <code>0x</code> (le chiffre zéro et la lettre x). À l'inverse, la fonction <code>hex()</code> renvoie une chaîne correspondant à l'écriture d'un entier au format hexadécimal, et <code>oct()</code> renvoie la chaîne correspondant à l'éciture en octal. Par exemple : <syntaxhighlight lang="python"> print(0o10, ";", 0x10) # 8 ; 16 print(hex(20)) # 0x14 </syntaxhighlight> ==== Réels ==== Les réels disposent de fonctions spécifiques appelées « méthodes ». Une méthode est une fonction spécifique à un type d'objets. Étant conçue ''ad hoc'', elle est souvent plus économe en ressource et en temps qu'une fonction générique. Pour appliquer la méthode <code>meth()</code> à la variable <code>x</code>, on écrit : <code>x.meth()</code>. Nous avons déjà présenté la méthode <code>''float''.as_integer_ration()</code> qui donne la fraction réduite égale à la valeur du nombre. Les réels disposent de plusieurs autres méthodes : * <code>''float''.trunc()</code> : tronque le nombre réel ; * <code>''float''.floor()</code>, <code>''float''.ceil()</code> : renvoie l'entier le plus proche, respectivement inférieur ou supérieur ; * <code>''float''.hex()</code> : renvoie une chaîne de caractères correspondant à l'écriture du nombre en hexadécimal. Par exemple : <syntaxhighlight lang="python"> a = 20. print(a.hex()) # 0x1.4000000000000p+4 print(10..hex()) # 0x1.4000000000000p+3 </syntaxhighlight> Dans le deuxième exemple, nous appliquons la méthode <code>''float''.hex()</code> directement au nombre <code>10.</code> ; le point est obligatoire car sinon, c'est un entier, pour lequel la méthode n'est pas définie. Notez que la ''méthode'' <code>''float''.hex()</code> est différentes de la ''fonction'' <code>hex()</code> : la première concerne les réels, la seconde les entiers. ==== Complexes ==== Nous avons déjà mentionné la méthode <code>''complex''.conjugate()</code> qui donne le conjugué du nombre. Un nombre complexe dispose de deux attributs : * <code>''complex''.real</code> : sa partie réelle ; * <code> ''complex''.imag</code> : sa partie imaginaire. Par exemple : <syntaxhighlight lang = "python"> a = 5+2j print(a.conjugate(), ";", a.real, ";", a.imag) # (5-2j) ; 5.0 ; 2.0 </syntaxhighlight> === Chaînes de caractères === ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/inputoutput.html | titre = 7. Input and Output | site = Python Documentation | consulté le = 2019-04-06 }} ==== Généralités ==== Il existe en fait trois manières de définir une chaîne de caractères : * avec des guillemets simples ou doubles comme vu précédemment : <code>"…"</code> ou bien <code>'…'</code> ; * avec trois guillemets doubles : <code>"""…"""</code> : cela permet d'avoir une chaîne de caractères s'étendant sur plusieurs lignes, les retours de ligne étant pris en compte ; c'est utilisé en particulier pour la description des fonctions (''{{lang|en|docstrings}}'', voir ci-après) ; * avec des guillemets précédés d'un « r », <code>r"…"</code> ou <code>r'…'</code> : cela permet d'interpréter les barres de fraction inverses « \ » comme un caractère « normal » et non comme un caractère d'échappement (voir ci-après) ; cela est utile lorsque l'on utilise les possibilités LaTeX dans le tracé de graphiques (voir plus loin) ; * avec des guillemets précédés d'un « f », <code>f"…"</code> ou <code>f'…'</code> : cela permet d'utiliser des variables formatées (voir ci-après). Une chaîne de caractères n'est pas modifiable. Si l'on veut remplacer un caractère, l'insérer ou le supprimer, il faut transformer la chaîne en liste, avec la commande <code>list()</code>, puis rassembler la liste en la joignant ''({{lang|en|join}})'' à une chaîne vide : <syntaxhighlight lang="python"> chaine = "blabla" chaineList = list(chaine) chaineList[2] = "c" chaine = "".join(chaineList) print(chaine) # blcbla </syntaxhighlight> Dans une chaîne simple <code>"…"</code> ou <code>'…'</code>, on peut introduire un retour à la ligne avec <code>\n</code>. ==== Substitution de variables ==== Lorsque l'on veut utiliser des variables, on fait précéder les guillemets d'un « f » et l'on écrit les noms de vrariables entre accolades. Par exemple : <syntaxhighlight lang="python"> monde = "world" chaine = f"Hello {monde}!" print(chaine) # Hello world! </syntaxhighlight> On peut indiquer la taille de la chaîne générée à partir de la variable sous la forme <code>{nomVariable:taille}</code>, la taille étant un entier. Par exemple : <syntaxhighlight lang="python"> chiffre1 = 1 nom1 = "un" chiffre2 = 2 nom2 = "deux" chaine = f"{nom1:5} : {chiffre1:5d}\n{nom2:5} : {chiffre2:5d}" print(chaine) # un : 1 # deux : 2 </syntaxhighlight> Vous remarquez que l'on ajoute un « d » pour les entiers décimaux, et que les nombres sont alignés à droite. Si le nombre est un nombre réal à virgule flottante ''({{lang|en|float}})'', on peut indiquer le nombre de décimales sous la forme <code>.''n''f</code> : <syntaxhighlight lang="python"> chaine = f"{np.pi:.5f}" print(chaine) # 3.15169 </syntaxhighlight> Avec la syntaxe <code>''m''.''n''f</code>, on indique également que la totalité du nombre doit occuper ''m'' caractères. Pour convertir un nombre en caractère Unicode correspondant, on utilise la lettre c : <syntaxhighlight lang="python"> nompi = 0x03c0 # Caractère Unicode π : U+03C0 chaine = f"{nompi:c} = {np.pi:.5f}" print(chaine) # π = 3.14159 </syntaxhighlight> La classe ''str'' dispose également de la méthode <code>.format()</code>. On indique un n-uplet de chaînes (ou de nombres) à la méthode et l'on met des accolades dans la chaîne principale ; les accolades sont remplacées dans l'ordre des chaînes de la méthode. On peut changer l'ordre en indiquant quelle valeur utiliser dans quelle accolade. Par exemple : <syntaxhighlight lang="python"> chaine1 = "On compte {} puis {}".format(1, 2) chaine2 = "On compte {0} puis {1}. Mais à rebours, on compte {1} puis {0}.".format("un", "deux") print(chaine1, "\n", chaine2) # On compte 1 puis 2 # On compte un puis deux. Mais à rebours, on compte deux puis un. </syntaxhighlight> L'utilisation du caractère pourcent « % » permet d'utiliser la mise en forme <code>sprintf()</code> du langage C : <syntaxhighlight lang="python"> chaine = "π = %.5f" % np.pi print(chaine) # π = 3.14159 </syntaxhighlight> ; Exemple <nowiki>:</nowikI> barre de progression : Voici une fonction affichant une barre de progression, pour la ''i''-ème étape d'un processus ayant ''n'' étapes (pour la notion de fonction, voir la section ci-après ''[[#Fonction|Fonction]]''). : NB : nous avons utilisé les codes Unicode pour l'exemple, mais on peut évidemment copier le caractère, par exemple depuis une table Unicode ou une page Web<ref>Pour le point médian : ''{{W|Table des caractères Unicode/U0080}}'' ou ''{{W|Point médian}}''. Pour le pavé : ''{{W|Table des caractères Unicode/U2580}}''.</ref>, et le coller dans le code, comme nous l'avons fait dans le commentaire. <syntaxhighlight lang="Python"> def barre_progression(i, n, largeur=40): """ Affiche une barre de progression Entrées : — i : étape en cours, entier ; — n : nombre d'étapes à réaliser, entier ; — largeur : nombre de caractères total de la barre, entier. Sortie : affichage de la barre de progression. """ taux = i/n fait = int(largeur * taux) barre = f"{0x2588:c}"*fait + f"{0x00b7:c}" * (largeur - fait) # U+2588 : pavé "█" ; U+00B7 : point médian "·" print(f"Progression | {barre} | {100*taux:3.1f} %") barre_progression(25, 100) # Progression | ██████████······························ | 25.0 % </syntaxhighlight> ==== Méthodes des chaînes ==== Le type ''str'' dispose d'un certain nombre de méthodes. Nous avons déjà vu les méthodes <code>''str''.join()</code> et <code>''str''.format()</code>, en voici quelques autres : * <code>''str''.capitalize()</code> : met le premier caractère en capitale (majuscule) et les autres en minuscule ; * <code>''str''.lower()</code> : met tout en minuscules ''({{lang|en|lowercase}})'' ; * <code>''str''.upper()</code> : met tout en capitales ''({{lang|en|lowercase}})'' ; * <code>''str''.center(''n'')</code> : met la chaîne au centre d'une chaîne de longueur ''n'', en complétant avec des espaces ; on peut compléter avec d'autres caractères avec <code>''str''.center(''n'', ''c'')</code>, par exemple <code>"a".center(7, ".")</code> donne <code>"....a...."</code> ; * <code>''str''.ljust(''n'', ''c'')</code> et <code>''str''.rjust(''n'', ''c'')</code> : comme <code>.center()</code> mais la chaîne est respectivement alignée au fer à gauche ''({{lang|en|left}})'' et à droite ''({{lang|en|right}})'' ; * <code>''str''.isdigit()</code> : booléen vrai si tous les caractères sont des nombres ; * <code>''str''.find(''sous-chaine'')</code>, <code>''str''.rfind(''sous-chaine'')</code> : indique respectivement le premier emplacement et le dernier emplacement de la sous-chaîne dans la chaîne ; * <code>''str''.partition(''séparateur'')</code> : retourne un triplet avec la portion de chaîne avant le séparateur, le séparateur puis la portion de chaîne après le séparateur ; * <code>''str''.replace(''ancien'', ''nouveau'')</code> : remplace la chaîne ''ancien'' par la chaîne ''nouveau'' dans la chaîne ; * <code>''str''.split(''séparateur'')</code> : découpe la chaîne au niveau des séparateurs et renvoie une liste. ==== Autres fonctions ==== La fonction <code>chr()</code> transforme un code Unicode en caractère. Par exemple, <code>chr(97)</code> donne <code>"a"</code> et <code>chr(0x03c0)</code> donne <code>"π"</code>. Si on veut créer une liste de caractères qui se suivent, on peut par exemple utiliser : <syntaxhighlight lang="python"> [chr(x) for x in range(97, 102)] # ['a', 'b', 'c', 'd', 'e'] </syntaxhighlight> Si on veut créer une liste de nombres sous la forme de chaînes de caractères, on peut utiliser la commande <code>str()</code> vue ci-dessus. Par exemple : <syntaxhighlight lang="python"> [str(x) for x in range(1, 6)] # ['1', '2', '3', '4', '5'] </syntaxhighlight> Pour la syntaxe, voir ci-dessous la section [[#Définition en compréhension|''Définition en compréhension'']]. Ainsi, dans l'exemple de la barre de progression ci-dessus, on peut utiliser la solution suivante pour constituer la nbarre : <syntaxhighlight lang="python"> barre = chr(0x2588)*fait + chr(0x00b7) * (largeur - fait) # U+2588 : bloc ; U+00B7 : point médian </syntaxhighlight> == Manipulation de listes == Les listes sont une structure de données fondamentale en Python. ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/datastructures.html | langue = en | titre = 5. Data structures | site = Python documentation | consulté le = 2019-03-16 }} === Copie d'une liste === Contrairement à d'autres types, lorsque vos écrivez <code>b = a</code> avec des listes, vous ne créez pas une copie de la variable <code>a</code>, vous créez un ''alias'' : l'objet <code>b</code> est un autre nom de l'objet <code>a</code>. En particulier, si vous modifiez <code>b</code>, vous modifiez en fait <code>a</code>. Par exemple : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a b[2] = 5 print(a, b) # [1, 2, 5, 4] [1, 2, 5, 4] </syntaxhighlight> Si l'on veut créer une copie de <code>a</code>, il faut utiliser <code>a[:]</code> ou bien <code>a.copy()</code> : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a[:] c = a.copy() b[2] = 5 c[2] = 6 print(a, b, c) # [1, 2, 3, 4] [1, 2, 5, 4] [1, 2, 6, 4] </syntaxhighlight> === Méthodes de listes === Pour modifier une liste, vous disposez des méthodes suivantes : * <code>a.append(x)</code> : ajoute l'élément <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.extend(x)</code> : ajoute la liste <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.append(i, x)</code> : aoute l'élément <code>x</code> ''avant'' l'interstice ''i'' de la liste <code>a</code> ; * <code> x = a.pop(i)</code> : enlève l'élément ''i'' de la liste <code>a</code> et le met dans la variable <code>x</code> ; <code> x = a.pop()</code> enlève le dernier élément de la liste ; * <code>a.clear()</code> : vide la liste <code>a</code> ; * <code>a.sort()</code> : trie la liste par ordre croissant ; * <code>a.sort(reverse = True)</code> : trie par ordre décroissant ; * <code>a.reverse()</code> : inverse l'ordre de <code>a</code>. Pour supprimer l'élément à l'indice ''i'', au lieu d'utiliser <code>a.pop(i)</code>, on peut aussi utiliser <syntaxhighlight lang="python"> del(a[i]) </syntaxhighlight> Pour trier une liste, on peut aussi utiliser la fonction <code>sorted()</code>, ce qui permet par exemple de conserver la liste originale, non triée : <code>b = sorted(a)</code>. La fonction <code>sorted()</code> fonctionne avec tous les objets « itérables » comme par exemple une chaîne de caractères : <syntaxhighlight lang="python"> a = "ahjbfk" print(sorted(a)) # ['a', 'b', 'f', 'h', 'j', 'k'] </syntaxhighlight> Pour mettre en évidence la performance de la méthode <code>''list''.sort()</code> par rapport à la fonction générique <code>sorted()</code> : <syntaxhighlight lang="python"> import numpy as np import time a = np.random.rand(int(1e7)) t1 = time.perf_counter() b = sorted(a) # Fonction générique t2 = time.perf_counter() a.sort() # Méthode spécifique t3 = time.perf_counter() print("Sorted :", t2-t1, " s ; .sort :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # Sorted : 14.2... s ; .sort : 1.1... s ; rapport : 12.6... </syntaxhighlight> Par rapport à une valeur donnée : * <code>a.remove(x)</code> : retire la première occurrence de la valeur <code>x</code> de la liste <code>a</code> ; * <code>a.index(x)</code> : indique l'indice où se trouve la première occurrence de la valeur <code>x</code> ; * <code>a.count(x)</code> : indique le nombre de fois que l'on trouve la valeur <code>x</code> dans la liste <code>a</code>. === Définition en compréhension === La [[w:fr:Liste en compréhension|définition en compréhension]] ''({{lang|en|list comprehension}})'' est une méthode permettant de construire des listes en indiquant simplement des axiomes, des consignes de filtrage. Cette méthode est élégante car proche de la notation mathématique et compacte, mais c'est une méthode itérative donc lente par rapport à une méthode vectorisée fournie par le module NumPy. Par exemple, pour créer la liste des carrés des nombres entiers entre 0 et 9, il suffit d'écrire <syntaxhighlight lang="python"> carre = [x**2 for x in range(10)] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x^2 | x \in [0 ; 9] \}</math>. Si l'on veut la liste des nombres strictement inférieurs à 20 dont le carré est supérieur à 10, on peut écrire : <syntaxhighlight lang="python"> X = [x for x in range(20) if x**2 > 10] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x | x \in [0 ; 19], x^2 > 10 \}</math>. Pour mettre en évidence la performance du calcul vectorisé par rapport à la méthode itérative : <syntaxhighlight lang="python"> import time import numpy as np n = int(1e7) # taille de la liste t1 = time.perf_counter() carre = [x**2 for x in range(n)] # Définition en compréhension t2 = time.perf_counter() carre2 = np.arange(n)**2 # Calcul vectorisé t3 = time.perf_counter() print("En compréhension : ", t2-t1, "s ; vectorisé :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # En compréhension : 4.515... s ; vectorisé : 0.156... s ; rapport : 28.982... </syntaxhighlight> == Structure d'un programme == Un programme est simplement une suite d'instructions. Dans les environnements Unix BSD, un programme Python peut être considéré comme un script c'est-à-dire qu'il suffit de taper son nom dans l'invite de commande ''({{lang|en|shell}})'' sans avoir à invoquer <code>python</code>. Le programme doit alors commencer par un en-tête normalisé surnommé ''{{lang|en|[[wikt:shebang|shebang]]}}'' : <syntaxhighlight lang="python"> #!/usr/bin/env python3 </syntaxhighlight> Ce ''{{lang|en|shebang}}'' est inutile avec Jupyter. L'en-tête peut également contenir la description de l'encodage du fichier texte, typiquement : <syntaxhighlight lang="python"> # coding: utf-8 </syntaxhighlight> Le codage UTF-8 est le codage par défaut pour Python 3, il est donc inutile de l'indiquer. Les commentaires sont introduits par le croisillon <code>#</code>. On peut grouper une suite d'instructions dans un bloc. Un bloc d'instructions commence par deux-points « <code>:</code> » et est identé, c'est-à-dire qu'il a une marge constituée de quatre espaces — on peut aussi utiliser une tabulation mais il ne faut pas mélanger les deux méthodes ; les tabulations sont déconseillées, il vaut mieux utiliser quatre espaces<ref>{{lien web | url = https://www.python.org/dev/peps/pep-0008/#tabs-or-spaces | titre = Tabs or Spaces? | site = Python documentation | consulté le = 2019-03-14 }}</ref>. Pour terminer le bloc, il suffit simplement de revenir en début de ligne ; contrairement à d'autres langages, il n'y a pas de commende de fin ''({{lang|en|end}})'', c'est l'indentation qui définit le bloc. : # début du bloc ''instruction 1'' ''instruction 2'' … ''dernière instruction du bloc'' ''instruction hors bloc'' Par exemple, une exécution conditionnelle <code>if</code> ou une boucle <code>for</code> exécute un bloc d'instruction. Si l'on a besoin d'un bloc d'instruction qui « ne fait rien », on utilise l'instruction <code>pass</code>. == Structures de contrôle == '''Boucle itérative''' La boucle itérative s'écrit : <syntaxhighlight lang="python"> for <variable> in <itérable>: <bloc d’instructions> </syntaxhighlight> Si l'on veut que la variable prenne ''n'' valeurs de 0 à ''n'' – 1, on utilise l'instruction <code>range()</code> : <syntaxhighlight lang="python"> for i in range(5): print(i) print("Fin de la boucle") </syntaxhighlight> <code>[▶]</code> 0 1 2 3 4 Fin de la boucle En fait, la commande <code>range()</code> extrait des valeurs de l'ensemble des nombres entiers ; on peut ainsi utiliser le découpage en tranches, par exemple <code>range(2, 5)</code>pour avoir la « liste » <code>[2, 3, 4]</code>. Notez que <code>range()</code> ne crée pas à proprement parler une liste, cela crée un objet de type ''« {{lang|en|range}} »'' (plage, intervalle) ; pour avoir une liste, il faut écrire <code>list(range(n))</code>. Dans une boucle, la commande <code>continue()</code> saute la fin du bloc d'instruction et passe à la valeur suivante de la boucle. La commande <code>break()</code> interrompt la boucle et passe à la suite. '''Exécution conditionnelle''' L'exécution conditionnelle s'écrit : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> </syntaxhighlight> On peut utiliser les commandes <code>elif</code> ''(else if'') et <code>else</code> : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> elif <booléen>: <bloc d’instructions> else: <bloc d’instructions> </syntaxhighlight> Notez que le test d'une condition est gourmand en ressources. S'il s'agit de savoir si l'on effectue une opération mathématique simple ou pas, on peut remplacer le test par une multiplication par un booléen (<code>True</code> vaut 1, <code>False</code> vaut 0). Par exemple, plutôt que d'écrire <syntaxhighlight lang="python"> if a > 0: b = b - c </syntaxhighlight> mieux vaut écrire : <syntaxhighlight lang="python"> b = b - (a > 0)*c </syntaxhighlight> '''Boucle antéconditionnée''' La boucle antéconditionnée s'écrit : <syntaxhighlight lang="python"> while <booléen>: <bloc d’instructions> </syntaxhighlight> Cette boucle peut contenir des instructions <code>continue()</code> et <code>break()</code>. == Fonction == La déclaration d'une fonction utilise la commande <code>def</code>. La fonction est un bloc d'instructions. Si elle doit renvoyer des valeurs, on utilise la commande <code>return</code>. Par exemple <syntaxhighlight lang="python"> def nombres(n): """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo a = nombres(3) print(a) </syntaxhighlight> La fonction commence par une chaîne de caractères qui la décrit. Cette chaîne peut être récupérée automatiquement par certains logiciels pour faire une documentation automatique. Si la description prend plusieurs lignes, elle commence et finit par trois double-guillemets <code>"""…"""</code> ; en fait, par convention, même si cela n'est pas obligatoire, les descriptions sont toutes encadrées de trois double-guillemets. Cette description est appelée ''{{lang|en|docstring (documentation string)}}''. Pour récupérer les ''{{lang|en|docstrings}}'' : <syntaxhighlight lang="python"> def foo(): """Cette fonction ne fait rien""" pass print(foo.__doc__) # Cette fonction ne fait rien </syntaxhighlight> L'instruction <code>input()</code> permet à l'utilisateur de saisir une valeur. La valeur est retournée sous la forme d'une chaîne de caractères qui est ensuite convertie en nombre réel avec l'instruction <code>float()</code>. On peut définir une valeur par défaut en l'indiquant dans l'en-tête de la définition de la fonction, de la manière suivante : <syntaxhighlight lang="python"> def nombres(n=1): # valeur par défaut : 1 """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo </syntaxhighlight> Si le paramètre à initialiser est de type modifiable ''({{lang|en|mutable}})'', comme par exemple une liste, il faut procéder comme suit : <syntaxhighlight lang="python"> def fooFonction(fooListe=None): # valeur par défaut : n'existe pas """Description""" if fooListe = None: fooListe = [] # initialisation <suite des instructions> </syntaxhighlight> Par défaut, les variables sont locales. On peut rendre une variable globale avec l'instruction <code>global</code> ''à l'intérieur de la fonction'', avant l'utilisation de la variable. Par exemple : <syntaxhighlight lang="python"> a = 1 b = 1 def toto(): """Test de variable globale. Entrée : aucune. Sortie : aucune.""" global a a = 2 b = 2 toto() print("a =", a, "; b =", b) # a = 2 ; b = 1 </syntaxhighlight> Pour être plus précis : si une variable n'est pas assignée dans une fonction, alors Python va chercher une variable du même nom à l'extérieur de la fonction. Mais à partir du moment où la variable est assignée dans la fonction, elle devient locale ''sauf'' si l'on a utilisé l'instruction <code>global</code>. Si l'on s'attend à un nombre indéfini d'arguments, on utilise la notion d'empaquetage/dépaquetage ''({{lang|en|packing/unpacking}})''<ref>{{lien web | url = https://deusyss.developpez.com/tutoriels/Python/args_kwargs/ | titre = Introduction à *args et **kwargs | consulté le = 2019-03-09 | site = Developpez.com }}.</ref>. L'empaquetage consiste à mettre les arguments dans un n-uplet, le dépaquetage consiste à développer un n-uplet en plusieurs variables. Cela se fait en mettant un astérisque ''({{lang|en|splat}})'' « <code>*</code> » devant le nom de la variable. Par convention, on utilise le nom de variable <code>*args</code> mais cela n'est pas obligatoire. <syntaxhighlight lang="python"> def concatenation(*args): """Concatène des chaînes de caractères Entrée : *args, n-uplet de chaînes de caractères. Sortie : resultat, chaîne de caractères.""" resultat = "" for i in args: resultat = resultat + i return resultat concatenation("a", "foo", "toto") # 'afoototo' </syntaxhighlight> À l'inverse, si une fonction doit recevoir plusieurs paramètres, on peut à la place lui transmettre une liste à dépaqueter : <syntaxhighlight lang="python"> def addition(a, b): """Ajoute deux nombres Entrées : — a : réel ; — b : réel. Sortie : a+b, réel""" return a+b arg = (1, 2) addition(*arg) # 3 </syntaxhighlight> On peut aussi empaqueter/dépaqueter un dictionnaire, on utilise pour cela deux astérisques « <code>**</code> ». Par convention, on utilise le nom <code>**kwargs</code> sans que cela soit obligatoire. L'instruction <code>lambda</code> permet de créer de petites fonctions ne contenant pas de boucle ni de branchement conditionnel. Cependant, si la déclaration est courte et compacte, le code n'est pas toujours facilement lisible ; l'utilisation de cette instruction n'est pas recommandée. Par exemple l'expression <syntaxhighlight lang="python"> f = lambda x: 2*x </syntaxhighlight> est la même chose que <syntaxhighlight lang="python"> def f(x): """Calcule le double. Entrée : x, réel. Sortie : 2*x, réel.""" return 2*x </syntaxhighlight> {{note|L'instruction <code>eval()</code> exécute une chaîne de caractères, c'est-à-dire traite une chaîne de caractères comme si c'étaient des instructions données à Python. Cette instruction est à éviter pour deux raisons : # Un utilisateur malveillant pourrait entrer du code malveillant dans la chaîne de caractères. # L'exécution est lente puisque Python doit compiler la chaîne à la volée. Cette instruction peut en général être remplacée par une autre instruction. }} == Gestion des erreurs == Dans un bloc d'instructions, on peut utiliser la structure <code>try:… except:</code>. Le bloc après <code>try</code> est exécuté ; si une erreur se déclare dans ce bloc, alors le bloc <code>except</code> s'exécute. Par exemple <syntaxhighlight lang="python"> try: 1/0 # Génère une erreur except: print("Division par zéro") # Cette instruction est donc exécutée </syntaxhighlight> On peut compléter avec <code>else:</code> et <code>finally:</code> : <syntaxhighlight lang="python"> try: <code à exécuter> except: <s’exécute en cas d’erreur> else: <s’exécute s’il n’y a pas d’erreur> finally: <s’exécute dans tous les cas> </syntaxhighlight> On peut séparer les différents types d'erreur : <syntaxhighlight lang="python"> try: <code à exécuter> except ValueError: print("Valeur erronée") except TypeError: print("Type erroné") </syntaxhighlight> Les types d'erreur les plus courants sont : * <code>NameError</code> : le nom de variable n'existe pas ; * <code>TypeError</code> : la valeur n'est pas du bon type ; * <code>ValueError</code> : la valeur n'est pas compatible avec ce qui est attendu ; * <code>RuntimeError</code> : type d'erreur général. On peut aussi créer ses propres erreurs : si une situation erronée survient, on peut « lever » une exception avec <code>raise</code>. Par exemple <syntaxhighlight lang="python"> if a < 0: raise ValueError("La valeur doit être positive") </syntaxhighlight> ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/errors.html | titre = Errors and exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} * {{lien web | url = https://docs.python.org/3/library/exceptions.html | titre = Built-in Exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} == Exercices == === Calcul du PGCD et du PPCM par l'algorithme d'Euclide === {{loupe|w:Algorithme d'Euclide}} Écrire un programme Python qui demande deux nombres entiers et affiche leurs PGCD et PPCM. Le programme utilisera l'algorithme d'Euclide. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """Programme : euclide.py Auteur : User:cdang date : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : calcule le PGCD et le PPCM de deux nombres entiers. Entrée ------ au clavier, saisie de deux nombres entiers. Sorties ------- à l'écran, affichage du PGCD et du PPCM. """ # *************** # *************** # ** Fonctions ** # *************** # *************** def euclide(): """Calcule le PGCD et le PPCM avec l'algorithme d'Elclide Entrée ------ Aucune, la saisie des paramètres fait partie de la fonction Sortie ------ affichage du PGCD et du PPCM """ print("***** Algorithme d'Euclide *****\n") a0 = int(input("Premier nombre entier : a = ")) b0 = int(input("Second nombre entier : b = ")) a = a0 b = b0 r = a%b # initialisation while (r != 0) : # algorithme d'Euclide a = b b = r r = a%b # affichage des résultats print("PGCD(", a0, ", ", b0, ") = ", b) print("PPCM(", a0, ", ", b0, ") = ", a0*b0//b) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* euclide() </syntaxhighlight> On peut simplifier la boucle centrale : <syntaxhighlight lang="python"> while b: # s'exécute tant que b n'est pas 0 a, b = b, a % b # affectation de liste à liste return a </syntaxhighlight> {{boîte déroulante fin}} Notez que le module NumPy propose l'instruction <code>gcd()</code> : <syntaxhighlight lang="python"> import numpy … print(numpy.gcd(a, b)) </syntaxhighlight> === Tours de Hanoï === {{loupe|w:Tours de Hanoï}} Écrire un programme Python qui demande le nombre ''n'' de plateaux et affiche les manipulations nécessaires pour déplacer la pile d'un emplacement à un autre. Le programme utilisera l'algorithme récursif. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """nom : hanoi.py auteur : User:cdang date de création : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : résout le problème des tours de Hanoï Entrées ------- trois chaînes de caractères (nom des piliers) Sorties ------- une chaîne de caractères (liste des opérations) """ # *************** # *************** # ** Fonctions ** # *************** # *************** def hanoi(a, b, c, n): """Résout le problème des tours de Hanoï de manière récursive But : déplace la pile de n disques du piler a au pilier b Entrées ------- a, b c : chaînes de 1 caractère, référence des emplacements ; n : entier, nombre de disques sur l'emplacement a Sorties ------- operations : chaînes de caractères décrivant les opérations """" if n>1: operations = hanoi(a, c, b, n-1) operations = operations+a+"→"+b+" ; " operations = operations+hanoi(c, b, a, n-1) else: operations = a+"→"+b+" ; " return operations # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* resultat = hanoi("1", "2", "3", 3) print(resultat) </syntaxhighlight> {{boîte déroulante fin}} === Lancer de rayons === [[Fichier:Lentille hemispherique perspective.svg|vignette|Lentille hémisphérique.]] Considérons une lentille hémisphérique de rayon R faite d’un verre d’indice de réfraction ''n''. Nous plaçons une source ponctuelle à une distance ''d'' du dioptre plan, sur l’axe optique. Tracer des rayons partant de la source et traversant la lentille. {{clear}} {{Boîte déroulante/début |titre=Analyse d’optique géométrique}} [[Fichier:Lentille hemispherique analyse geometrique.svg|vignette|Analyse géométrique du problème.]] Il s’agit d’un problème ayant une symétrie de révolution par rapport à l’axe optique. Nous pouvons nous réduire à un problème plan en nous plaçant dans un plan contenant l’axe optique ; l’axe optique est encore un axe de symétrie orthogonale, nous pouvons donc nous contenter d'étudier un demi-plan. Pour simplifier, nous plaçons le centre du dioptre sphérique à l’origine O du repère. L’axe optique est l’axe ''x'' et l'axe perpendiculaire, vertical sur la figure, c’est l’axe ''y''. Les coordonnées de la source sont donc (-''d'' ; 0). Le rayon issu de la source et faisant un angle θ avec l’axe ''x'' frappe le dioptre plan à l’altitude ''h''. Nous avons : : ''h'' = ''d'' ⋅ tan θ. L’angle d’incidence vaut θ. D’après la loi de Snell-Descartes, l'angle de réfraction θ<sub>2</sub> vaut : : θ<sub>2</sub> = arcsin((sin θ) / ''n''). Le rayon réfracté passe par le points de coordonnées (0, ''h''). L’équation de la droite est donc : : ''y'' = a ⋅ ''x'' + ''h'' avec : ''a'' = tan θ<sub>2</sub>. L’équation du cercle de centre O et de rayon R est : : ''x''<sup>2</sup> + ''y''<sup>2</sup> = R<sup>2</sup>. Les coordonnées (''x''<sub>M</sub>, ''y''<sub>M</sub>) de l’intersection M du rayon avec le dioptre sphérique vérifient les deux équations. Par substitution, nous obtenons une équation du second degré en ''x'' que nous savons résoudre : : ''x''<sub>M</sub><sup>2</sup> + (''a'' ⋅ ''x''<sub>M</sub> + ''h'')<sup>2</sup> = R<sup>2</sup> : ⇔ (1 + ''a''<sup>2</sup>) ⋅ ''x''<sub>M</sub><sup>2</sup> + 2 ⋅ ''a'' ⋅ ''h'' ⋅ ''x''<sub>M</sub> + ''h''<sup>2</sup> – R<sup>2</sup> = 0. D’après les propriétés du cercle, le rayon est perpendiculaire à la tangente. Le rayon [OM] est donc normal au dioptre en M. Nous pouvons déterminer l’angle d’incidence θ<sub>i</sub> par le produit scalaire : : <math>\begin{pmatrix} 1 \\ a \end{pmatrix} \cdot \begin{pmatrix} x_\mathrm{M} \\ y_\mathrm{M} \end{pmatrix} = \sqrt{1^2 + a^2} \cdot \mathrm{R} \cdot \cos(\theta_\mathrm{i})</math> ce qui nous permet de calculer cet angle : : <math>\theta_\mathrm{i} = \operatorname{arcos} \left ( \frac{x_\mathrm{M} + a \cdot y_\mathrm{M}}{\mathrm{R} \cdot \sqrt{1^2 + a^2} } \right )</math> Comme nous passons vers un milieu d’indice plus faible, il y a un risque de réflexion totale. L’angle limite est : : θ<sub>max</sub> = arcsin(1/''n''). Si l’on a θ<sub>i</sub> &gt; θ<sub>max</sub>, le rayon repart vers l’intérieur. Nous ne traçons pas le rayon car cela nous emmènerait trop loin dans l’analyse. En revanche, si θ<sub>i</sub> ≤ θ<sub>max</sub>, alors nous pouvons appliquer la loi de Snell-Descartes pour avoir l’angle de réfraction θ<sub>e</sub> : : θ<sub>e</sub> = arcsin(''n'' ⋅ sin θ<sub>i</sub>). Pour tracer le rayon sortant, il nous faut l’angle θ<sub>3</sub> par rapport à l’horizontale. L’angle du rayon [OM] par rapport à l’horizontal vaut arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>), nous avons donc : θ<sub>3</sub> = arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>) + θ<sub>e</sub>. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Analyse algorithmique}} '''Structure des données''' Le problème est décrit par trois paramètres : # Le rayon <code>R1</code> de la lentille, en milliètres (réel en virgule flottante). # L’indice du verre, <code>n</code> sans dimension (réel en virgule flottante). L’indice de l’air vaut 1. # La distance de la source au dioptre d’entrée plan, <code>d</code> en millimètres (réel en virgule flottante). Un rayon est caractérisé par quatre paramètres : # L’angle d’émission <code>theta1</code> en radians (réel en virgule flottante). # L’angle de réfraction dans la lentille <code>theta2</code> en radians (réel en virgule flottante). # Les cordonnées <code>M</code> en millimètre (vecteur de dimension 2 <code>([x, y])</code> de réels en virgule flottante) du point d’intersection du rayon avec le dioptre sphérique. # L’angle de réfraction dans l’air après la lentille <code>theta3</code> en radians (réel en virgule flottante). Pour le calcul et le tracé, nous avons besoin des paramètres intermédiaires suivants : * l’altitude ''y'' = <code>h</code> en millimètres (réel en virgule flottante) à laquelle le rayon frappe le dioptre plan d’entrée ; * l’angle d’incidence du rayon avec le dioptre sphérique <code>thetaint</code> en radians (réel en virgule flottante). Les angles sont stockés en radians car c’est l’unité naturelle pour le calcul mais nous affichons les valeurs en degrés. Comme le calcul de conversion est récurrent, nous conservons les facteurs <code>degversrad</code> (conversion des degrés vers les radians, facteur valant π/180, réel en virgule flottante) et <code>radversdeg</code> (conversion des radians vers les degrés, facteur valant 180/π, réel en virgule flottante). '''Fonctions''' Nous avons besoin d’une fonction qui calcule les trois paramètres du rayon <code>(theta2, M, theta3)</code> à partir de l’angle d’émission <code>theta1</code>. Nous appelons cette fonction <code>lanceRayon()</code>. Cette fonction fait appelle à une fonction qui calcule l’angle du rayon réfracté à partir de l’angle du rayon incident <code>theta1</code>, les deux angles étant par rapport à la normale au dioptre au point considéré. Nous appelons cette fonction <code>refrac()</code>. La recherche de l’intersection <code>M</code> du rayon avec le dioptre sphérique nécessite de résoudre une équation du second degré. Nous utilisons pour cela la recherche des racines du polynôme en <code>x</code> avec la fonction <code lang="python">numpy.polynomial.polynomial.polyroots()</code>. D’après la configuration du problème géométrique, si l’on s’assure que le rayon frappe bien la lentille (0 ≤ <code>h</code> ≤ <code>R1</code>) alors nous sommes sûrs que le problème a deux solutions réelles (une positive et une négative) ou, dans le cas dégénéré où <code>h == R1</code>, une valeur unique <code>x == 0</code>. Comme nous recherchons la valeur positive, nous sélectionons la plus grande des deux racines. Pour la gestion de la réflexion interne : dans la fonction <code>refrac()</code>, nous vérifions les conditions de réflexion totale et si elles sont remplies, alors nous générons une erreur (commandes <code lang="python">try… except</code> et <code lang="python">raise ValueError</code>). Cette erreur est propagée à la fonction <code>lanceRayon()</code> : <code>lanceRayon()</code> appelle la fonction <code>refrac()</code> et si cette fonction renvoie une erreur, alors <code>lanceRayon()</code> renvoie également une erreur. Pour trouver l’angle d’émission <code>thetaLimite</code> provoquant la réflexion totale (en radians, réel en virgule flottante), nous effectuons une recherche par dichotomie : * nous partons de l’angle maximum possible, lorsque le rayon frappe le sommet de la lentille, et nous appelons la fonction <code>lanceRayon()</code> ; si cela ne génère pas d’erreur, alors nous pouvons aller jusqu’à cette valeur, la recherche est terminée ; si cela génère une erreur, alors nous divisons la valeur par deux ; * à une étape de la recherche donnée, si <code>lanceRayon()</code> ne génère pas d’erreur avec l’angle testé, alors nous savons que l’angle limite est supérieur à cette valeur ; cette valeur minore donc la valeur recherchée ; si au contraire <code>lanceRayon()</code> génère une erreur, alors c’est que l’angle est trop important, cette valeur majore donc la valeur recherchée ; nous pouvons ainsi resserer l’intervalle de recherche ; * nous nous arrêtons lorsque les valeurs haute et basse sont suffisamment proche. Concrètement : # Nous définissons une variable <code>angleHaut</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus bas connu provoquant la réflexion totale. # Nous définissons une variable <code>angleBas</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus haut connu ne provoquant pas de réflexion totale. Sa valeur initiale est 0. L’angle limite recherché est donc entre <code>angleBas</code> et <code>angleHaut</code>. # Nous définissons l’angle <code>angleTest</code> comme étant la moyenne entre <code>angleBas</code> et <code>angleHaut</code>. Si <code>lanceRayon(angleTest)</code> génère une erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleHaut</code> (puisque c’est une valeur provoquant la réflexion totale et qu’elle est plus basse que la valeur actuelle d’<code>angleHaut</code>). À l’inverse, si <code>lanceRayon(angleTest)</code> ne génère pas d’erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleBas</code> (puisque c’est une valeur ne provoquant pas la réflexion totale et qu’elle est plus haute que la valeur actuelle d’<code>angleBas</code>). # Nous arrêtons la procédure lorsque l’écart entre <code>angleBas</code> et <code>angleHaut</code> est inférieur à {{unité|10|échelle=<sup>–3</sup>|rad}} (valeur arbitraire). La valeur retenue est la valeur finale d’<code>angleBas</code> (puisque l’on veut être sûr qu’il n’y ait pas de réflexion totale). La valeur affichée est la valeur en degrés arrondie au dixième. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Solution}} Nous demandons à l’utilisateur ou à l’utilisatrice les valeurs des paramètres du problème : rayon de la lentille, distance de la source, indice de réfraction du verre. Nous vérifions que les valeurs entrées sont bien des nombres ; si c’est une chaîne vide, alors nous utilisons une valeur par défaut. Nous créons une fonction <code>refrac()</code> qui permet de calculer l’angle réfracté à partir de l’angle d’incidence et des indices de réfraction. S’il y a rélexion totale, alors nous générons une erreur. La fonction <code>lanceRayon()</code> calcule les différents points de passage du rayon. Elle appelle pour cela la fonction <code>refrac()</code>. Si un appel de la commande <code>refrac()</code> génère une erreur, alors nous générons également une erreur. Nous déterminons l’angle d’émision du rayon <code>thetaLimite</code> qui provoque une réflecxion totale. Pour cela, nous créons une fonction <code>rechercheLimite()</code> qui cherche par dichotomie. Nous traçons un rayon tous les 5° jusqu’à la valeur limite. <syntaxhighlight lang="python"> #!/usr/bin/env python3 # coding: utf-8 """nom : lancerRayons.py auteur : User:cdang date de création : 2022-05-06 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : NumPy, matplotlib ---------------------------------------------------------------------------- Objectif : trace des trajets optique avec une lentille hémisphérique Entrées ------- Le rayon de la lentille, la distance de la source, l’indice de réfraction du verre, trois chaînes de caractères saisies par l’utilisateur·rice et qui sont converties en réels. Sorties ------- La valeur limite de l’angle (réel) et le tracé de plusieurs rayons. """ # ****************************************************** # ****************************************************** # ** Lancer de rayons pour une lentille hémisphérique ** # ****************************************************** # ****************************************************** import numpy as np import matplotlib.pyplot as plt import numpy.polynomial.polynomial as nppol # ************** # * Constantes * # ************** # Pour la conversion degrés ↔ radians radversdeg = 180/np.pi degversrad = 1/radversdeg # ************* # * Fonctions * # ************* def boucleEntreeNombre(messageSaisie, valeurDefaut): """Permet de s’assurer que l’utilisateur·rice a bien entré un nombre. Entrée : — message à afficher (chaîne de caractères) ; — valeur par défaut (réel à virgule flottante). Sortie : nombre (réel à virgule flottante).""" messageErreur = "Veuillez entrer une valeur numérique (ou vide pour accepter la valeur par défaut).\n" execute = True while execute: strNombre = input(messageSaisie+f" (valeur par défaut {valeurDefaut}) : ") if strNombre == "": nombre = valeurDefaut execute = False else: try: nombre = float(strNombre) except: print(messageErreur) else: execute = False return nombre def initialisation(): """L’utilisateur·rice entre les variables du problème. Entrées : aucune. Sorties : — R1 (mm) : rayon de la lentille ; — d (mm) : distance de la source au dioptre plan ; — n (sans dimension) : indice de réfraction du verre.""" R1 = boucleEntreeNombre("Rayon de la lentille en mm", 20.0) d = boucleEntreeNombre("Distance de la source au dioptre plan en mm", 20.0) n = boucleEntreeNombre("Indice de réfraction (sans dimension)", 1.5) return (R1, d, n) def refrac(n1, n2, theta1): """Calcule l’angle de réfraction theta2 (radians) en fonction — de l’angle d’incidence theta1 (radians); — de l’indice de réfraction n1 du premier milieu ; — de l’indice de réfraction n2 du second milieu.""" reflexionTotale=False rapport=n2/n1 rapportinv=np.reciprocal(rapport) if n1 > n2: thetal = np.arcsin(rapport) # angle limite pour la réflexion totale if theta1 >= thetal: reflexionTotale=True if reflexionTotale: print("Réflexion totale") raise ValueError else: return np.arcsin(rapportinv*np.sin(theta1)) def lanceRayon(n1, n2, d, R, theta1): """Détermine le rayon issu de la source située à une distance d (mm) du bareau et avec une élévation de theta1 (radians), en fonction des indices de réfraction n1 et n2. Les éléments retournés sont : — la hauteur h (mm) à laquelle le rayon frappe le barreau ; — l’angle de réfraction theta2 (radians)) dans le barreau ; — l’angle de réfraction theta3 (radians) à la sortie du barreau — le point M(x, y) (mm) auquel le rayon sort du barreau.""" h = d*np.tan(theta1) if h >= R: print("Le rayon est au-dessus du barreau") raise ValueError else: theta2 = refrac(n1, n2, theta1) a = np.tan(theta2) x = max(nppol.polyroots([h*h - R*R, 2*a*h, 1+a*a])) # recherche de l’intersection du rayon avec le cercle y = a*x + h M = np.array([x, y]) thetaint = np.arccos((x + a*y)/(R*np.sqrt(1 + a*a))) theta3 = np.arctan(y/x) - refrac(n2, n1, thetaint) return (h, theta2, theta3, M) def rechercheLimite(n1, n2, d, R): """Recherche l’angle limite pour la réflexion totale. Entrée : — indice de réfraction des milieux 1 et 2, n1 et n2 ; — distance au barreau, d(mm). Sortie : angle limite theta (radians)""" angleHaut = np.arctan(R/d) angleBas = 0 angleTest = angleHaut try: lanceRayon(n1, n2, d, angleTest, R) except: condition = True # il y a réflexion total en haut de la lentille else: condition = False # il n’y a jamais réflexion totale dans la lentille while condition: #dichotomie angleTest = np.mean([angleHaut, angleBas]) # on ajuste la valeur de test try: lanceRayon(n1, n2, d, R, angleTest) except: angleHaut = angleTest # réflexion totale : on abaisse la valeur maximale else: angleBas = angleTest # pas de réflexion totale : on monte la valeur minimale condition = ((angleHaut - angleBas) >= 0.001) # on a cerné la limite à 0,001 rad près if not condition: angleTest = angleBas return angleTest # *********************** # * Programme principal * # *********************** (R1, d, n) = initialisation() xmax = round(R1 + d) thetaLimite = rechercheLimite(1, n, d, R1) thetaLimiteDeg = thetaLimite*radversdeg print(f"Angle limite pour la réflexion totale : {thetaLimiteDeg:.1f}°.\n") anglesDeg = np.arange(0, thetaLimiteDeg, 5)[1:] # trace un rayon tous les 5° anglesRad = anglesDeg*degversrad nb = len(anglesDeg) h = np.zeros(nb) # initialisation des vecteurs de valeurs theta2 = np.zeros(nb) theta3 = np.zeros(nb) M = np.zeros((nb, 2)) for i in range(nb): (h[i], theta2[i], theta3[i], M[i, :]) = lanceRayon(1, n, d, R1, anglesRad[i]) (h_lim, theta2_lim, theta3_lim, M_lim) = lanceRayon(1, n, d, R1, thetaLimite) # tracé anglesCercle = 0.5*np.pi*(np.linspace(1, 0, 20)) x_cercle = R1*np.cos(anglesCercle) # coordonnées des pints du cercle y_cercle = R1*np.sin(anglesCercle) fig = plt.plot([-d,xmax], [0, 0], "k-.", linewidth="0.5") # tracé de l’axe optique for i in range(nb): plt.plot([-d, 0, M[i, 0], xmax], [0, h[i], M[i, 1], M[i, 1] + (xmax - M[i, 0])*np.tan(theta3[i])], label=f"{anglesDeg[i]:.0f}°") plt.plot([-d, 0, M_lim[0], xmax], [0, h_lim, M_lim[1], M_lim[1] + (xmax - M_lim[0])*np.tan(theta3_lim)], label=f"{0.1*int(np.trunc(10*thetaLimite*radversdeg)):.1f}°") plt.plot(x_cercle, y_cercle, "k", linewidth="0.5") # tracé du cercle plt.plot([0,0], [0, R1], "k", linewidth="0.5") # tracé du premier dioptre #plt.axis("square") plt.gca().set_aspect("equal", adjustable="box") plt.xlabel("x (mm)") plt.ylabel("y (mm)") plt.title("Lentille hémisphérique, lancer de rayons") plt.legend() plt.savefig("lentille_hemispherique_lancer_rayon.svg", format="svg") plt.show() </syntaxhighlight> {{Boîte déroulante/fin}} == Mesurer le temps == Le module <code>time</code> fournit les fonctions suivantes : * <code>time.gmtime()</code> : renvoie la date et l'heure du méridien de Greenwich (''{{lang|en|Greenwich mean time}}'', GMT), sous la forme d'un dictionnaire (année, mois, jour du mois, heure, minute, seconde, jour de la semaine, jour de l'année, heure d'été/hiver), ** jour de la semaine est un entier entre 0 (lundi) et 6 (dimanche), ** jour du mois est un entier entre 1 et 366 ; * <code>time.localtime()</code> : comme le précédent, mais l'heure est l'heure locale ; * <code>time.time()</code> : donne le nombre de seconde qui se sont écoulées depuis le 1er janvier 1970 ; * <code>time.gmtime(n)</code> et <code>time.localtime(n)</code> transforment un nombre de secondes (écoulées depuis le 1er janvier 1970) en une date au format (année, mois, jour, etc.), n-uplet de neuf valeurs ; <code>time.mktime()</code> fait le contraire, il transforme un n-uplet de neuf valeurs (années, mois, jour, etc.) en un nombre de secondes (écoulées depuis le 1er janvier 1970) ; * <code>time.sleep(n)</code> : provoque une pause dans le déroulement du programme de ''n'' secondes ; * <code>time.perf_counter()</code> : indique une date en seconde ; s'utilise pour mesurer la durée d'exécution d'une partie du code, en faisant la différence entre deux relevés. Concernant la date et l'heure sous la forme d'un n-uplet, on peut extraire l'heure de la manière suivante : <syntaxhighlight lang="python"> import time a = time.localtime() print("Il est ", a[3], "h", a[4]) # ou bien print("Il est ", a.tm_hour, "h", a.tm_min) </syntaxhighlight> Pour mesurer la performance d'une portion de code : <syntaxhighlight lang="python"> import time t1 = time.perf_counter() <suite d’instructions> t2 = time.perf_counter() print("Durée d'exécution :", t2-t1 </syntaxhighlight> == Programmation orientée objet == Nous n'allons pas ici faire un cours de programmation orientée objet (POO), nous allons aborder le sujet de manière pragmatique. De manière schématique, un « objet » est une « super-variable ». Cette super-variable peut contenir plusieurs variables, appelées « attributs » ; elle contient en fait un dictionnaire (paires « nom d'attribut : valeur d'attribut »). Elle peut aussi contenir des fonctions spécifiques appelées « méthodes ». De même qu'une variable a un type, un objet fait partie d'une « classe ». La classe est le modèle de l'objet ; en franglais informatique, on dit que l'objet est une instance de la classe. La POO est donc un formalisme : lorsque l'on définit des variables et des fonctions concernant un même type d'objet (au sens commun du terme), on les empaquette dans une classe. Il faut donc d'abord définir la classe, puis attribuer cette classe à un objet (« instancier » la classe). Considérons par exemple que nous voulons travailler sur des [[w:Engrenage|engrenages]] ; pour simplifier, nous nous contentons d'engrenages à dentures droites. Une roue dentée, un pignon, est essentiellement définie par son nombre de dents Z et par son module ''m'' qui correspond à la largeur de dents<ref>ainsi que par son épaisseur ''e'' et le matériau dont elle est faite mais nous allons négliger ces paramètres pour la simplicité de l'étude.</ref>. Nous allons définir trois méthodes : la méthode <code>.diametrePrimitif()</code> qui calcule le diamètre primitif de la roue dentée, <code>.pas()</code> qui calcule la largeur des dents au niveau du cercle primitif et <code>.rapport()</code> qui calcule le rapport de transmission de deux roues engrenées Z<sub>1</sub>/Z<sub>2</sub>. La méthode <code>.rapport()</code> vérifie par ailleurs que les roues ont le même module, condition indispensable pour former un engrenage. Nous définissons la classe ainsi : <syntaxhighlight lang="python"> class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): # instructions lancées lors de la déclaration """Valeurs des attributs""" self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z </syntaxhighlight> Nous remarquons que lorsque nous déclarons les méthodes, le paramètre <code>self</code> correspond à l'objet lui-même. Ainsi, dans la méthode <code>.rapport()</code>, la variable <code>self.Z</code> est le nombre de dents de la roue elle-même et <code>roueDentee.Z</code> est le nombre de dents de la roue passée en paramètre. Pour déclarer les roues, nous écrivons : <syntaxhighlight lang="python"> roue1 = pignon() # attribution de la classe, « instanciation » roue1.Z = 13 # définition des caractéristiques du pignon « roue1 » roue1.m = 2 roue2 = pignon(16, 2) # manière alternative </syntaxhighlight> Nous pouvons alors utiliser les objets de la manière suivante : <syntaxhighlight lang="python"> print(roue1.Z) # 13 print(roue1.diametrePrimitif()) # 26 R = roue1.rapport(roue2) # 0.8125 </syntaxhighlight> La commande <code>dir(a)</code> affiche tous les attributs et méthodes de l'objet <code>a</code>. ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/classes.html | titre = Classes | site = Python documentation | consulté le = 2019-03-08 }} == Interface graphique avec Tk == Une interface graphique utilisateur (GUI, ''{{lang|en|graphic user interface}}'') est un ensemble de boîtes permettant d'interagir avec l'utilisateur c'est-à-dire permettre la saisie d'informations, l'exécution d'actions et afficher des informations. Elle se compose d'éléments appelés ''{{lang|en|widgets}}''. Les éléments ''({{lang|en|widgets}})'' classiques sont : * boîte de dialogue ''({{lang|en|dialog box}})'' : fenêtre contenant d'autres éléments ; * étiquette ''({{lang|en|label}})'' : texte affiché ; * liste déroulante ''({{lang|en|drop-down list}})'' : zone permettant le choix d'une option, la liste se déployant lorsque l'on clique sur la zone ; * zone de texte, champ de saisie ''({{lang|en|text box}})'' : zone permettant de taper du texte ; * boîte combinée ''({{lang|en|combo box}})'' : zone de saisie de texte contenant une liste déroulante qui permet de choisir des éléments prédéfinis ; * bouton ''({{lang|en|button}})'' : objet effectuant une action lorsque l'on clique dessus ; * case à cocher ''({{lang|en|checkbox, tickbox}})'' : objet permettant d'activer ou de désactiver une option lorsque l'on clique dessus ; * bouton radio, case d'option ''({{lang|en|radio button}})'' : objet permettant d'activer une option en désactivant les autres options ; une seule option peut être activée à la fois. Plusieurs modules permettent de gérer les interfaces graphiques. Nous choisissons ici le module développé sur la bibliothèque Tk qui est une bibliothèque multiplateforme. Pour cela, nous importons le module <code>tkinter</code> ainsi que le module <code>ttk</code>, ce dernier proposant des options plus « modernes » : <syntaxhighlight lang="python"> import tkinter as tk from tkinter import ttk </syntaxhighlight> Voici un programme permettant comme précédemment de calculer le rapport de transmission d'un engrenage. Nous détaillons sa construction ci-après. <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: IUrapport.set(valeurZ2/valeurZ1) except: IUrapport.set("erreur") # ************************* # ************************* # ** Interface graphique ** # ************************* # ************************* # fenetre principale fenetre = tk.Tk() fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> '''Explications''' Nous commençons par définir la boîte de dialogue que nous appelons <code>fenetre</code> ; c'est un objet <code>Tk</code> et nous lui donnons un titre « » : <syntaxhighlight lang="python"> fenetre = tk.Tk() fenetre.title("Rapport de réduction") </syntaxhighlight> Puis, nous définissons un cadre attaché à cette fenêtre et qui va nous permettre « d'accrocher » les autres éléments, ce qui permet de garder une apparence satisfaisante lorsque l'on retaille la fenêtre : <syntaxhighlight lang="python"> cadre = ttk.Frame(fenetre) </syntaxhighlight> Le cadre va comporter six lignes ''({{lang|en|row}})'' et deux colonnes ''({{lang|en|column}})''. Nous allons placer une étiquette ''({{lang|en|label}})'' « z1 » : <code>text="z1"</code>. Cette étiquette se trouve dans une case du cadre, celle de la première colonne et la première ligne : <code>grid(column=1, row=1)</code>. Par rapport à cette case, elle est collée à « l'ouest » (W, ''{{lang|en|west}}'', gauche) de la case : <code>sticky=tk.W</code>. <syntaxhighlight lang="python"> z1_label = ttk.Label(cadre, text="z1") # Création de l'étiquette z1_label.grid(column=1, row=1, sticky=tk.W) # Placement de l'étiquette </syntaxhighlight> Notez que l'on aurait pu écrire directement : <syntaxhighlight lang="python"> ttk.Label(cadre, text="z1").grid(column=1, row=1, sticky=tk.W) </syntaxhighlight> mais le fait de séparer la création de l'élément et son placement facilite la maintenance (recherche d'erreur, évolution du code). Pour tout ce qui est dynamique, c'est-à-dire les zone de saisie des valeurs et l'affichage du résultat, il faut définir des « chaînes variables » ''({{lang|variable strings}})'' : <syntaxhighlight lang="python"> IUz1 = tk.StringVar() </syntaxhighlight> Cette variable est une variable globale à la création. Nous pouvons alors placer la zone de saisie ''({{lang|en|entry}})'' à côté de l'étiquette lui correspondant. Nous nommons la zone de saisie <code>z1_entry</code> : <syntaxhighlight lang="python"> z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) </syntaxhighlight> Nous faisons de même pour les trois autres paramètres de l'engrenage, ''m''<sub>1</sub>, ''z''<sub>2</sub> et ''m''<sub>2</sub>. Le résultat est également une chaîne variable globale. Par rapport à notre mise en page, elle se situe dans la case colonne 2 ligne 5, centrée sur cette case (collé à l'est et à l'ouest) : <syntaxhighlight lang="python"> rapport = tk.StringVar() rapport_dynamique = ttk.Label(cadre, textvariable=rapport) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) </syntaxhighlight> Il nous faut encore définir une fonction de manière classique, nous l'appelons « calcule ». Les variables étant globales, on les utilise directement. On récupère les valeurs avec la méthode <code>get()</code> et nous modifions la valeur avec la méthode <code>set()</code> : <syntaxhighlight lang="python"> def calcule(): valeurZ1 = float(IUz1.get()) valeurZ2 = float(IUz2.get()) IUrapport.set(valeurZ2/valeurZ1) </syntaxhighlight> Cette fonction est déclenchée lorsque l'on clique sur le bouton « Calcul » situé dans la case du cadre ligne 6 colonne 2 : <syntaxhighlight lang="python"> bouton = ttk.Button(cadre, text="Calcul", command=calcule) bouton.grid(column=2, row=6, sticky=tk.W) </syntaxhighlight> ou bien si l'on appuie sur la touche <code>[entrée]</code> du clavier : <syntaxhighlight lang="python"> fenetre.bind("<Return>", calcule) </syntaxhighlight> À tout ceci, nous ajoutons des « gouttières » (marges, ''{{lang|en|paddings}}'') afin d'espacer les éléments. Il faut ensuite « activer » la fenêtre pour qu'elle s'affiche. La méthode est <code>mainloop()</code> (boucle principale) : « boucle » (elle est active en permanence et attend des actions sur ses éléments), <syntaxhighlight lang="python"> fenetre.mainloop() </syntaxhighlight> Nous avons ci-dessus mis la plupart du code en programme principal. Nous pouvons aussi programmer de manière fonctionnelle, en mettant la plupart du code dans des fonctions ; cependant, pour que la fenêtre et les variables dynamiques soient globales à tout le programme, elles doivent être déclarées dans le programme principal. Nous pouvons aussi mêler la programmation orientée objet. {{boîte déroulante début|Calcul du rapport de transmission en programmation fonctionnelle et orientée objet}} <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # ************* # ************* # ** Classes ** # ************* # ************* class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): """Valeurs des attributs""" # instructions lancées lors de la déclaration self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z # ************************ # ************************ # ** Variables globales ** # ************************ # ************************ # fenetre principale fenetre = tk.Tk() # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: roue1 = pignon(valeurZ1, valeurM1) roue2 = pignon(valeurZ2, valeurM2) IUrapport.set(roue1.rapport(roue2)) except: IUrapport.set("Erreur") # *********************** # * Interface graphique * # *********************** def configureFenetre(): """Configuration de la fenêtre principale""" fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* configureFenetre() # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> {{boîte déroulante fin}} == Annotations == Une annotation est un commentaire qui sert à expliciter un type de variable. La syntaxe est différente des commentaires « classiques » : cela permet d'avoir un affichage différent avec les éditeurs de texte ayant une coloration syntaxique, et ces informations peuvent être récupérées par des logiciels extérieurs pour effectuer une documentation automatique ou bien des vérifications de type. Cependant : * comme les commentaires normaux, ils n'ont aucune influence lors de l'exécution du texte ; en particulier : * rien n'oblige à annoter les variables ; * il est possible d'avoir une variable ayant un type différent de son annotation ; le fait de pouvoir définir et changer le type de variable à la volée est une fonctionnalité fondamentale de Python. La syntaxe pour une annotation est : : nom_de_variable + deux-points + espace + type par exemple : <syntaxhighlight lang="python"> a: int </syntaxhighlight> Notez qu'ici, la variable n'est ''pas'' créée. Pour la créer, il faut lui affecter une valeur. Il est possible de l'affecter après ou bien sur la même ligne avec la syntaxe : : nom_de_variable + deux-points + espace + type + espace + égal + espace + valeur par exemple : <syntaxhighlight lang="python"> a: int a = 5 # est équivalent à a: int = 5 </syntaxhighlight> Même si l'annotation n'a pas d'impact sur l'exécution, le type doit être un type existant sinon cela génère une erreur de syntaxe. Les types classiques sont : : <code>int</code> — <code>float</code> — <code>str</code> — <code>bool</code> — <code>list</code> — <code>tuple</code> — <code>dict</code> Il est également possible de mettre une chaîne de caractères : <syntaxhighlight lang="python"> a: "ce que je veux" = 3.1516 </syntaxhighlight> On peut annoter une fonction. Il est possible d'annoter les variables déclarées au sein de la fonction, mais pas les variables globales (puisqu'elle ne sont pas définie au sein de la fonction). On peut aussi annoter : * les variables passées en paramètre, avec la même syntaxe dans les parenthèses ; * annoter le type de la variable de sortie (retournée) en la faisant précéder de <code>-&gt;</code> : <syntaxhighlight lang="python"> def plusCinq(a: float = 0) -> float: return a + 5 </syntaxhighlight> ; Ressources * {{lien web | url = https://www.python.org/dev/peps/pep-0526/ | titre = PEP 526 -- Syntax for Variable Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} * {{lien web | url = https://www.python.org/dev/peps/pep-3107/ | titre = PEP 3107 -- Function Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} == Décorateur == Un décorateur est une fonction qui s'applique à une fonction, à la manière de la composition mathématique ''g'' ∘ ƒ = ''g''(ƒ). Mais cette composition affecte la fonction elle-même ; l'utilisateur appelle la fonction ƒ mais c'est la fonction ''g'' ∘ ƒ qui s'exécute. Cette fonction ''g'' est appelée le décorateur. L'intérêt est de pouvoir modifier une fonction sans modifier le code de la fonction elle-même. Pour appliquer une décoration, il faut : # Déclarer le décorateur : une fonction qui s'applique à une autre fonction. # Affecter le décorateur à la fonction visée : en mettant <code>@''décoration''</code> juste avant la définition de la fonction. Par exemple : <syntaxhighlight lang="python"> def decorateur(f): print("Avant la fonction") f() print("après la fonction") @decorateur def afficheFoo(): print("Foo.") afficheFoo # Avant la fonction # Foo. # Après la fonction </syntaxhighlight> Lorsque l'on appelle <code>afficheFoo</code>, on appelle en fait <code>decorateur(afficheFoo)</code>. Si la fonction à modifier admet des paramètres, il faut définir une fonction enveloppante dans le décorateur. Par exemple, nous définissons ci-dessous un décorateur <code>deuxFois()</code> qui fait s'exécuter deux fois de suite la fonction : <syntaxhighlight lang="python"> def deuxFois(f): def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # conteneurFonction </syntaxhighlight> Nous voyons que l'application du décorateur a modifié le nom de la fonction — pas le nom de la variable qui contient la fonction mais bien son nom « intime ». Pour éviter cela, on utilise la méthode <code>wraps()</code> du module <code>functools</code> : <syntaxhighlight lang="python"> import functools def deuxFois(f): @functools.wraps(f) def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # plusCinq </syntaxhighlight> On peut par exemple utiliser un décorateur pour la mémoïsation. La mémoïsation est une méthode consistant à mémoriser les valeurs d'une fonction au fur et à mesure de son utilisation ; ainsi, si l'on veut évaluer la fonction avec les mêmes entrées, on se contente d'aller chercher la valeur enregistrée ce qui est plus rapide. On sacrifie donc la place mémoire au profit de la rapidité. On peut trouver des décorateurs de mémoïsation aux adresses suivantes : * https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize * https://gist.github.com/robcowie/1357800 ; Ressources : {{lien web | url = https://www.python.org/dev/peps/pep-0318/ | titre = PEP 318 -- Decorators for Functions and Methods | site = Python.org | lang = en | consulté le = 2019-04-05 }} == Manipulation de fichiers == === Importer le contenu d'un fichier === Python possède la fonction <code lang="python">open()</code> qui permet d'ouvrir un fichier. Ouvrir signifie qu'il crée un objet de type <code>file</code> qui possède notamment les méthodes <code lang="python">read()</code> et <code lang="python">write()</code>. Il peut s'agir d'un objet de type « fichier binaire » ''({{lang|en|binary file}})'' ou « fichier texte » ''({{lang|en|text file}})''. Si par exemple on veut utiliser (et donc lire) le contenu du fichier texte <code>monfichier.txt</code>, on écrit : <syntaxhighlight lang="python"> fichier = open("monfichier.txt", "rt") … fichier.close() </syntaxhighlight> Le paramètre <code>"rt"</code> signifie que nous ouvrons le fichier en lecture ''({{lang|en|read}})'' et qu'il s'agit d'un objet de type fichier texte. Notons deux choses : * en faisant cela, nous ne faisons qu'associer le fichier à un objet Python, nous n'avons pas encore importé les données ; * si nous ouvrons le fichier, il faut le fermer par la suite ; c'est pourquoi nous utilisons la méthode <code lang="python">.close()</code>. Pour éviter d'avoir à fermer le fichier, nous pouvons l'ouvrir au sein d'un contexte : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: … </syntaxhighlight> Notons aussi que la chaîne de caractères indiquant le nom du fichier peut contenir le chemin d'accès au répertoire (dossier), mais sous Microsoft Windows, il faut utiliser des barres de fractions <code>/</code> pour séparer les sous-répertoires au lieu de la barre inversée habituelle, par exemple : <syntaxhighlight lang="python"> chemin = "C:/Temp/monfichier.txt" with open(chemin, "rt") as fichier: … </syntaxhighlight> Pour mettre les données du fichier dans la variable <code>contenu</code>, nous écrivons donc : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() print(contenu) </syntaxhighlight> et si nous ne voulons lire que les <code>n</code> premiers caractères (<code>n</code> étant un entier), nous utilisons <code lang="python">contenu = fichier.read(n)</code>. Cette lecture est séquentielle, c'est-à-dire que si nous appliquons la méthode plusieurs fois, nous reprenons la lecture là où nous l'avons laissée. Si nous voulons lire une ligne, nous utilisons la méthode <code lang="python">.readline()</code>. La lecture ligne par ligne est également séquentielle. Nous pouvons aussi créer une liste dont chaque élément est une ligne du fichier ; nous utilisons alors la méthode <code lang="python">.readlines()</code> (notez le pluriel). Chaque élément de la liste se termine par le caractère de fin de ligne <code lang="python">\n</code>. Pour l'enlever, nous pouvons utiliser la méthode <code lang="python">.rstrip()</code> pour chaque élément de la liste, par exemple. L'exemple complet est alors : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.readlines() contenu = [item.rstrip() for item in contenu] print(contenu) </syntaxhighlight> === Exporter du contenu vers un fichier === Si nous voulons créer un fichier texte pour y mettre le contenu de la variable <code>texte</code>, alors nous utilisons : <syntaxhighlight lang="python"> with open("monfichier.txt", "wt") as fichier: contenu = fichier.write(texte) </syntaxhighlight> Le module principal important pour la manipulation de fichiers est est <code lang="python">os</code>. === Exploiter le contenu d'un fichier texte === Avec un fichier texte, la méthode <code lang="python">.read()</code> crée une variable de type texte. Nous pouvons séparer cette variable en différentes lignes avec la méthode <code lang="python">.splitlines()</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une ligne. Si maintenant une ligne contient plusieurs données séparées par un séparateur commun, par exemple un espace, nous pouvons séparer les données par la méthode <code lang="python">.split(''séparateur'')</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une donnée. Si par exemple le fichier est du type CSV ''({{lang|en|comma separated values}}'', valeurs séparées par une virgule), l'exploitation du fichier est : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(",") for item in contenu] </syntaxhighlight> La variable <code>contenu</code> est une liste de listes. Pour avoir la ''n''<sup>e</sup> valeurs de la ''m''<sup>e</sup> ligne, on utilise : <syntaxhighlight lang="python"> contenu[m-1][n-1] </syntaxhighlight> Si l'on veut extraire la ligne ''m'' il suffit d'écrire : <syntaxhighlight lang="python"> contenu[m-1] </syntaxhighlight> mais si l'on veut la colonne ''n'', le plus simple est d'utiliser une définitipon en compréhension : <syntaxhighlight lang="python"> [ligne[n-1] for ligne in contenu] </syntaxhighlight> Dans certains fichiers CSV, les séparateurs de valeurs ne sont pas des virgules, on peut donc utiliser un autre caractère pour le séparateur. Si le séparateur est une tabulation, on utilise <code lang="python">\t</code> : <code lang="python">contenu = [item.split("\t") for item in contenu]</code> Si la première ligne contient les en-têtes des colonnes, on peut l'enlever avec la fonction <code lang="python">del()</code> : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() del(contenu[0]) contenu = [item.split(",") for item in contenu] </syntaxhighlight> Certains logiciels créent des fichiers en utilisant le séparateur décimal régional, qui en France est la virgule. Pour remplacer les virgules par des points, on peut utiliser la méthode <code lang="python">.replace()</code>, de préférence ''avant'' de séparer les valeurs : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.replace(",", ".") for item in contenu] # remplace les virgules par des points contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule </syntaxhighlight> en effet, lorsque l'on a séparé les valeurs, on a une liste de liste, il faut alors balayer les sous-listes ce qui prend plus de temps : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule contenu = [[subitem.replace(",", ".") for subitem in item] for item in contenu] # remplace les virgules par des points </syntaxhighlight> '''Exemple complet''' Supposons que l'on ait un fichier texte de la forme : <syntaxhighlight lang="text"> x y z V 0.0 1.5 3.2 8.657 0.4 1.5 3.2 8.392 0.2 1.5 3.2 8.485 ... </syntaxhighlight> C'est un fichier valeurs V associées à des points de coordonnées ''(x, y, z)'' (un champ V sur l'espace, donc). Nous remarquons que seule la coordonnée ''x'' change : les données concernent la droite (''y'' = 1,5 ; ''z'' = 3,2). Nous remarquons aussi que les valeurs de ''x'' ne sont pas classées par ordre croissant ni décroissant. Nous voulons au final avoir une matrice [[''x''], [V]] triée par ''x'' croissant. Pour cela, nous pouvons faire : <syntaxhighlight lang="python"> with open(nomdefichier, "rt") ad fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(" ") for item in contenu contenu = contenu[1:] # élimine la première ligne x = np.array([float(ligne[0]) for ligne in contenu]) V = np.array([float(ligne[3]) for ligne in contenu]) donnees = np.concatenate((x.reshape(-1, 1), V.reshape(-1, 1)), axis=1) # matrice [[x], [V]] ind = np.argsort(donnees[:, 0]) donnees = donnees[ind, :] # matrice triée plt.plot(donnees[:, 0], donnees[:, 1]) </syntaxhighlight> {{note|Pour le tri, voir [[../Manipulation_de_matrices#Fonctions_et_méthodes_de_base|''Manipulation de matrices'' &gt; ''Fonctions et méthodes de base'']].}} === Cas d'un fichier CSV === Si le fichier CSV ne contient que des valeurs numériques, on peut utiliser : <syntaxhighlight lang="python"> valeurs = np.loadtxt(chemin+nomfic, delimiter=",") # si le séparateur est une virgule </syntaxhighlight> Il existe un module <code lang="python">csv</code> dédié aux fichiers CSV. La manipulation du fichier se fait comme suit : <syntaxhighlight lang="python"> import csv with open(chemin+nomfic, "rt") as fichier: lecteur = csv.reader(fichier, delimiter=",") contenu = [ligne for ligne in lecteur] print(contenu) </syntaxhighlight> === Utilisation de Pandas === Pandas<ref>https://pandas.pydata.org/</ref> est un module gérant les tableaux de données, appelés <em lang="en">data frames</em>. Voici quelques commandes utiles : <syntaxhighlight lang="python"> import numpy as np import pandas as pd M = np.random.rand(10, 10) # crée une matrice NumPy aléatoire de dimension 10 × 10 tableau = pd.DataFrame(M) # transforme la matrice en tableau DataFrame tableau.to_csv("tableau.csv") # enregistre le tableau dans un fichier CSV donnees = pd.read_csv("tableau.csv").to_numpy() # lit le fichier et transforme le tableau DataFrame en matrice NumPy </syntaxhighlight> == Exporter un programme Python == Vous pouvez créer un fichier « Python pur » <code>.py</code>. Pour cela, dans le menu <code>fichier/file</code> de Jupyter, choisir <code>télécharger/download</code> au format <code>.py</code> ; le fichier se trouve alors dans le répertoire de téléchargement du navigateur. == Ressources == * {{lien web | url = https://www.python.org/dev/peps/pep-0008/ | titre = PEP 8 -- Style Guide for Python Code | site = Python documentation | consulté le = 2019-03-14 }} == Notes et références == {{références}} ---- [[../Fonctions mathématiques générales|Fonctions mathématiques générales]] &lt; [[../|↑]] &gt; [[../Graphiques|Graphiques]] {{DEFAULTSORT:Elements de programmation}} [[Catégorie:Python pour le calcul scientifique (livre)]] 6uag3brb7e5t4ywahalgp57mf23uy5t 767322 767321 2026-06-02T13:12:23Z Cdang 1202 /* Substitution de variables */ harmonisation 767322 wikitext text/x-wiki Rappel : les programmes commencent par : <syntaxhighlight lang="python"> #!/usr/bin/python3 import numpy as np import matplotlib.pyplot as plt </syntaxhighlight> == Entrées et sorties == Pour permettre à l'utilisateur ou à l'utilisatrice d'entrer une valeur, nous utilisons la fonction <code lang="python">input()</code> comme évoqué précédemment (chapitre ''[[../Premiers programmes|Premiers programmes]]''), avec la syntaxe <code lang="python">''variable'' = input(''texte'')</code>. Notez que la valeur renvoyée par <code lang="python">input()</code> est une chaîne de caractères. Si vous voulez autre chose, typiquement un nombre, il faut convertir cette chaîne. Par exemple, nous demandons ici d'entrer une longueur sous la forme d'une valeur numérique : <syntaxhighlight lang="python"> longueurDefaut = 10.0 texteDemandeLongueur = f"Veuillez entrer la longueur en millimètres (valeur par défaut {longueurDefaut} mm) : " longueur = input(texteDemandeLongueur) if longueur=="": longueur=longueurDefaut else: longueur=float(longueur) print(longueur) </syntaxhighlight> Pour afficher un texte, on utilise la fonction <code lang="python">print()</code>, également présentée dans le chapitre ''[[../Premiers programmes|Premiers programmes]]'', avec la syntaxe <code lang="python">print(''texte'')</code>. Le texte à afficher peut être de n'importe quel type (entier, réel en virgule flottante, booléen, chaîne de caractères…) mais si l'on veut « mélanger » les types, il faut tout convertir en chaînes de caractères, avec la fonction <code lang="python">str()</code>, et concaténer les chaînes avec <code lang="python">+</code>. Par exemple : <syntaxhighlight lang="python"> print("La longueur vaut : "+str(longueur)+" mm.") </syntaxhighlight> Nous pouvons aussi utiliser une « chaîne “f” » ''({{lang|en|f-string}})'' : on met un le <code lang="python">f</code> devant le guillemet ouvrant et dans la chaîne, on met un champ sous la forme <code lang="python">{''nomDeVariable''}</code>. L'exemple ci-dessus devient alors : <syntaxhighlight lang="python"> print(f"La longueur vaut : {longueur} mm.") </syntaxhighlight> Les chaînes « f » sont détaillées dans la section ''[[#Chaînes de caractères|Chaînes de caractères]]'' ci-dessous. Si l'on veut introduire un retour à la ligne dans la chaîne, on utilise les caractères <code lang="python">\n</code> (contre-oblique suivie de la lettre N minuscule). Par exemple <syntaxhighlight lang="python"> print("Ceci est un texte\navec un retour à la ligne.") </syntaxhighlight> == Types de variables == === Généralités === Python définit « tout seul » le type de la variable : « <code>3</code> » sera un entier ''({{lang|en|integer}})'', « <code>3.0</code> » sera un réel à virgule flottante ''({{lang|en|float}})'', « <code>"3"</code> » sera une chaîne de caractères ''({{lang|en|string}})''. On peut connaître le type d'une variable avec la fonction <code>type()</code>. On peut tester certaines valeurs, avec le module <code>NumPy</code> : * <code>np.isnan(x)</code> indique si les valeurs de ''x'' sont des NaN ''({{lang|en|not a number}})'' ; si ''x'' est une matrice, le résultat est une matrice de booléens, l'élément [''i'', ''j''] est <code>True</code> si <code>x[i, j]</code> est un NaN ; * <code>np.isinf(x)</code> indique si les valeurs de ''x'' sont ±∞ ; si ''x'' est une matrice, le résultat est une matrice booléenne de même dimension. On peut forcer un type : * <code>int(x)</code> : transforme la valeur ''x'' en nombre entier ; * <code>long(x)</code> : " en entier long (précision illimitée) ; * <code>float(x)</code> : " en nombre réel à virgule flottante ; * <code>str(x)</code> : " en chaîne de caractères ; * <code>complex(Re, Im)</code> : crée le nombre complexe ''Re'' + ''Im''·j, j désignant la racine carrée de –1 ; * <code>list()</code> : crée une liste ; * <code>tuple()</code> : crée un n-uplet. Par exemple <syntaxhighlight lang="python"> type(3) # <class 'int'> type(float(3)) # <class 'float'> complex(1, 1) == 1 + 1j # True list("blabla") # ['b', 'l', 'a', 'b', 'l', 'a'] </syntaxhighlight> Python distingue plusieurs genres de types : * Un itérable est un objet dont on peut extraire les éléments un par un ; ce sont les objets pour lesquels on peut écrire <code> for i in ''iterable'':</code>. Il s'agit essentiellement des listes, n-uplets, chaînes de caractères, ensembles, dictionnaires et fichiers. * Un modifiable ''({{lang|en|mutable}})'' est un objet que l'on peut modifier ; par exemple une liste est modifiable — on peut changer la valeur d'un élément, en ajouter ou en enlever un — mais les n-uplets non, pas plus qu'une chaîne de caractères ou un nombre. * Un identifiable (''{{lang|en|hashable}}'', le ''{{lang|en|hashage}}'' étant une signature caractéristique d'un objet) : objet possédant un identifiant unique. Un objet identifiable est toujours non-modifiable ''({{lang|en|unmutable}})''. === Types numériques === ==== Entiers ==== Nous pouvons définir les entiers au format octal ou hexadécimal : il faut débuter le nombre par respectivement <code>0o</code> (le chiffre zéro et la lettre o) et <code>0x</code> (le chiffre zéro et la lettre x). À l'inverse, la fonction <code>hex()</code> renvoie une chaîne correspondant à l'écriture d'un entier au format hexadécimal, et <code>oct()</code> renvoie la chaîne correspondant à l'éciture en octal. Par exemple : <syntaxhighlight lang="python"> print(0o10, ";", 0x10) # 8 ; 16 print(hex(20)) # 0x14 </syntaxhighlight> ==== Réels ==== Les réels disposent de fonctions spécifiques appelées « méthodes ». Une méthode est une fonction spécifique à un type d'objets. Étant conçue ''ad hoc'', elle est souvent plus économe en ressource et en temps qu'une fonction générique. Pour appliquer la méthode <code>meth()</code> à la variable <code>x</code>, on écrit : <code>x.meth()</code>. Nous avons déjà présenté la méthode <code>''float''.as_integer_ration()</code> qui donne la fraction réduite égale à la valeur du nombre. Les réels disposent de plusieurs autres méthodes : * <code>''float''.trunc()</code> : tronque le nombre réel ; * <code>''float''.floor()</code>, <code>''float''.ceil()</code> : renvoie l'entier le plus proche, respectivement inférieur ou supérieur ; * <code>''float''.hex()</code> : renvoie une chaîne de caractères correspondant à l'écriture du nombre en hexadécimal. Par exemple : <syntaxhighlight lang="python"> a = 20. print(a.hex()) # 0x1.4000000000000p+4 print(10..hex()) # 0x1.4000000000000p+3 </syntaxhighlight> Dans le deuxième exemple, nous appliquons la méthode <code>''float''.hex()</code> directement au nombre <code>10.</code> ; le point est obligatoire car sinon, c'est un entier, pour lequel la méthode n'est pas définie. Notez que la ''méthode'' <code>''float''.hex()</code> est différentes de la ''fonction'' <code>hex()</code> : la première concerne les réels, la seconde les entiers. ==== Complexes ==== Nous avons déjà mentionné la méthode <code>''complex''.conjugate()</code> qui donne le conjugué du nombre. Un nombre complexe dispose de deux attributs : * <code>''complex''.real</code> : sa partie réelle ; * <code> ''complex''.imag</code> : sa partie imaginaire. Par exemple : <syntaxhighlight lang = "python"> a = 5+2j print(a.conjugate(), ";", a.real, ";", a.imag) # (5-2j) ; 5.0 ; 2.0 </syntaxhighlight> === Chaînes de caractères === ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/inputoutput.html | titre = 7. Input and Output | site = Python Documentation | consulté le = 2019-04-06 }} ==== Généralités ==== Il existe en fait trois manières de définir une chaîne de caractères : * avec des guillemets simples ou doubles comme vu précédemment : <code>"…"</code> ou bien <code>'…'</code> ; * avec trois guillemets doubles : <code>"""…"""</code> : cela permet d'avoir une chaîne de caractères s'étendant sur plusieurs lignes, les retours de ligne étant pris en compte ; c'est utilisé en particulier pour la description des fonctions (''{{lang|en|docstrings}}'', voir ci-après) ; * avec des guillemets précédés d'un « r », <code>r"…"</code> ou <code>r'…'</code> : cela permet d'interpréter les barres de fraction inverses « \ » comme un caractère « normal » et non comme un caractère d'échappement (voir ci-après) ; cela est utile lorsque l'on utilise les possibilités LaTeX dans le tracé de graphiques (voir plus loin) ; * avec des guillemets précédés d'un « f », <code>f"…"</code> ou <code>f'…'</code> : cela permet d'utiliser des variables formatées (voir ci-après). Une chaîne de caractères n'est pas modifiable. Si l'on veut remplacer un caractère, l'insérer ou le supprimer, il faut transformer la chaîne en liste, avec la commande <code>list()</code>, puis rassembler la liste en la joignant ''({{lang|en|join}})'' à une chaîne vide : <syntaxhighlight lang="python"> chaine = "blabla" chaineList = list(chaine) chaineList[2] = "c" chaine = "".join(chaineList) print(chaine) # blcbla </syntaxhighlight> Dans une chaîne simple <code>"…"</code> ou <code>'…'</code>, on peut introduire un retour à la ligne avec <code>\n</code>. ==== Substitution de variables ==== Lorsque l'on veut utiliser des variables, on fait précéder les guillemets d'un « f » et l'on écrit les noms de vrariables entre accolades. Par exemple : <syntaxhighlight lang="python"> monde = "world" chaine = f"Hello {monde}!" print(chaine) # Hello world! </syntaxhighlight> On peut indiquer la taille de la chaîne générée à partir de la variable sous la forme <code>{nomVariable:taille}</code>, la taille étant un entier. Par exemple : <syntaxhighlight lang="python"> chiffre1 = 1 nom1 = "un" chiffre2 = 2 nom2 = "deux" chaine = f"{nom1:5} : {chiffre1:5d}\n{nom2:5} : {chiffre2:5d}" print(chaine) # un : 1 # deux : 2 </syntaxhighlight> Vous remarquez que l'on ajoute un « d » pour les entiers décimaux, et que les nombres sont alignés à droite. Si le nombre est un nombre réal à virgule flottante ''({{lang|en|float}})'', on peut indiquer le nombre de décimales sous la forme <code>.''n''f</code> : <syntaxhighlight lang="python"> chaine = f"{np.pi:.5f}" print(chaine) # 3.15169 </syntaxhighlight> Avec la syntaxe <code>''m''.''n''f</code>, on indique également que la totalité du nombre doit occuper ''m'' caractères. Pour convertir un nombre en caractère Unicode correspondant, on utilise la lettre c : <syntaxhighlight lang="python"> nompi = 0x03c0 # Caractère Unicode π : U+03C0 chaine = f"{nompi:c} = {np.pi:.5f}" print(chaine) # π = 3.14159 </syntaxhighlight> La classe ''str'' dispose également de la méthode <code>.format()</code>. On indique un n-uplet de chaînes (ou de nombres) à la méthode et l'on met des accolades dans la chaîne principale ; les accolades sont remplacées dans l'ordre des chaînes de la méthode. On peut changer l'ordre en indiquant quelle valeur utiliser dans quelle accolade. Par exemple : <syntaxhighlight lang="python"> chaine1 = "On compte {} puis {}".format(1, 2) chaine2 = "On compte {0} puis {1}. Mais à rebours, on compte {1} puis {0}.".format("un", "deux") print(chaine1, "\n", chaine2) # On compte 1 puis 2 # On compte un puis deux. Mais à rebours, on compte deux puis un. </syntaxhighlight> L'utilisation du caractère pourcent « % » permet d'utiliser la mise en forme <code>sprintf()</code> du langage C : <syntaxhighlight lang="python"> chaine = "π = %.5f" % np.pi print(chaine) # π = 3.14159 </syntaxhighlight> ; Exemple <nowiki>:</nowikI> barre de progression : Voici une fonction affichant une barre de progression, pour la ''i''-ème étape d'un processus ayant ''n'' étapes (pour la notion de fonction, voir la section ci-après ''[[#Fonction|Fonction]]''). : NB : nous avons utilisé les codes Unicode pour l'exemple, mais on peut évidemment copier le caractère, par exemple depuis une table Unicode ou une page Web<ref>Pour le point médian : ''{{W|Table des caractères Unicode/U0080}}'' ou ''{{W|Point médian}}''. Pour le pavé : ''{{W|Table des caractères Unicode/U2580}}''.</ref>, et le coller dans le code, comme nous l'avons fait dans le commentaire. <syntaxhighlight lang="Python"> def barre_progression(i, n, largeur=40): """ Affiche une barre de progression Entrées : — i : étape en cours, entier ; — n : nombre d'étapes à réaliser, entier ; — largeur : nombre de caractères total de la barre, entier. Sortie : affichage de la barre de progression. """ taux = i/n fait = int(largeur * taux) barre = f"{0x2588:c}" * fait + f"{0x00b7:c}" * (largeur - fait) # U+2588 : pavé "█" ; U+00B7 : point médian "·" print(f"Progression | {barre} | {100*taux:3.1f} %") barre_progression(25, 100) # Progression | ██████████······························ | 25.0 % </syntaxhighlight> ==== Méthodes des chaînes ==== Le type ''str'' dispose d'un certain nombre de méthodes. Nous avons déjà vu les méthodes <code>''str''.join()</code> et <code>''str''.format()</code>, en voici quelques autres : * <code>''str''.capitalize()</code> : met le premier caractère en capitale (majuscule) et les autres en minuscule ; * <code>''str''.lower()</code> : met tout en minuscules ''({{lang|en|lowercase}})'' ; * <code>''str''.upper()</code> : met tout en capitales ''({{lang|en|lowercase}})'' ; * <code>''str''.center(''n'')</code> : met la chaîne au centre d'une chaîne de longueur ''n'', en complétant avec des espaces ; on peut compléter avec d'autres caractères avec <code>''str''.center(''n'', ''c'')</code>, par exemple <code>"a".center(7, ".")</code> donne <code>"....a...."</code> ; * <code>''str''.ljust(''n'', ''c'')</code> et <code>''str''.rjust(''n'', ''c'')</code> : comme <code>.center()</code> mais la chaîne est respectivement alignée au fer à gauche ''({{lang|en|left}})'' et à droite ''({{lang|en|right}})'' ; * <code>''str''.isdigit()</code> : booléen vrai si tous les caractères sont des nombres ; * <code>''str''.find(''sous-chaine'')</code>, <code>''str''.rfind(''sous-chaine'')</code> : indique respectivement le premier emplacement et le dernier emplacement de la sous-chaîne dans la chaîne ; * <code>''str''.partition(''séparateur'')</code> : retourne un triplet avec la portion de chaîne avant le séparateur, le séparateur puis la portion de chaîne après le séparateur ; * <code>''str''.replace(''ancien'', ''nouveau'')</code> : remplace la chaîne ''ancien'' par la chaîne ''nouveau'' dans la chaîne ; * <code>''str''.split(''séparateur'')</code> : découpe la chaîne au niveau des séparateurs et renvoie une liste. ==== Autres fonctions ==== La fonction <code>chr()</code> transforme un code Unicode en caractère. Par exemple, <code>chr(97)</code> donne <code>"a"</code> et <code>chr(0x03c0)</code> donne <code>"π"</code>. Si on veut créer une liste de caractères qui se suivent, on peut par exemple utiliser : <syntaxhighlight lang="python"> [chr(x) for x in range(97, 102)] # ['a', 'b', 'c', 'd', 'e'] </syntaxhighlight> Si on veut créer une liste de nombres sous la forme de chaînes de caractères, on peut utiliser la commande <code>str()</code> vue ci-dessus. Par exemple : <syntaxhighlight lang="python"> [str(x) for x in range(1, 6)] # ['1', '2', '3', '4', '5'] </syntaxhighlight> Pour la syntaxe, voir ci-dessous la section [[#Définition en compréhension|''Définition en compréhension'']]. Ainsi, dans l'exemple de la barre de progression ci-dessus, on peut utiliser la solution suivante pour constituer la nbarre : <syntaxhighlight lang="python"> barre = chr(0x2588)*fait + chr(0x00b7) * (largeur - fait) # U+2588 : bloc ; U+00B7 : point médian </syntaxhighlight> == Manipulation de listes == Les listes sont une structure de données fondamentale en Python. ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/datastructures.html | langue = en | titre = 5. Data structures | site = Python documentation | consulté le = 2019-03-16 }} === Copie d'une liste === Contrairement à d'autres types, lorsque vos écrivez <code>b = a</code> avec des listes, vous ne créez pas une copie de la variable <code>a</code>, vous créez un ''alias'' : l'objet <code>b</code> est un autre nom de l'objet <code>a</code>. En particulier, si vous modifiez <code>b</code>, vous modifiez en fait <code>a</code>. Par exemple : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a b[2] = 5 print(a, b) # [1, 2, 5, 4] [1, 2, 5, 4] </syntaxhighlight> Si l'on veut créer une copie de <code>a</code>, il faut utiliser <code>a[:]</code> ou bien <code>a.copy()</code> : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a[:] c = a.copy() b[2] = 5 c[2] = 6 print(a, b, c) # [1, 2, 3, 4] [1, 2, 5, 4] [1, 2, 6, 4] </syntaxhighlight> === Méthodes de listes === Pour modifier une liste, vous disposez des méthodes suivantes : * <code>a.append(x)</code> : ajoute l'élément <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.extend(x)</code> : ajoute la liste <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.append(i, x)</code> : aoute l'élément <code>x</code> ''avant'' l'interstice ''i'' de la liste <code>a</code> ; * <code> x = a.pop(i)</code> : enlève l'élément ''i'' de la liste <code>a</code> et le met dans la variable <code>x</code> ; <code> x = a.pop()</code> enlève le dernier élément de la liste ; * <code>a.clear()</code> : vide la liste <code>a</code> ; * <code>a.sort()</code> : trie la liste par ordre croissant ; * <code>a.sort(reverse = True)</code> : trie par ordre décroissant ; * <code>a.reverse()</code> : inverse l'ordre de <code>a</code>. Pour supprimer l'élément à l'indice ''i'', au lieu d'utiliser <code>a.pop(i)</code>, on peut aussi utiliser <syntaxhighlight lang="python"> del(a[i]) </syntaxhighlight> Pour trier une liste, on peut aussi utiliser la fonction <code>sorted()</code>, ce qui permet par exemple de conserver la liste originale, non triée : <code>b = sorted(a)</code>. La fonction <code>sorted()</code> fonctionne avec tous les objets « itérables » comme par exemple une chaîne de caractères : <syntaxhighlight lang="python"> a = "ahjbfk" print(sorted(a)) # ['a', 'b', 'f', 'h', 'j', 'k'] </syntaxhighlight> Pour mettre en évidence la performance de la méthode <code>''list''.sort()</code> par rapport à la fonction générique <code>sorted()</code> : <syntaxhighlight lang="python"> import numpy as np import time a = np.random.rand(int(1e7)) t1 = time.perf_counter() b = sorted(a) # Fonction générique t2 = time.perf_counter() a.sort() # Méthode spécifique t3 = time.perf_counter() print("Sorted :", t2-t1, " s ; .sort :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # Sorted : 14.2... s ; .sort : 1.1... s ; rapport : 12.6... </syntaxhighlight> Par rapport à une valeur donnée : * <code>a.remove(x)</code> : retire la première occurrence de la valeur <code>x</code> de la liste <code>a</code> ; * <code>a.index(x)</code> : indique l'indice où se trouve la première occurrence de la valeur <code>x</code> ; * <code>a.count(x)</code> : indique le nombre de fois que l'on trouve la valeur <code>x</code> dans la liste <code>a</code>. === Définition en compréhension === La [[w:fr:Liste en compréhension|définition en compréhension]] ''({{lang|en|list comprehension}})'' est une méthode permettant de construire des listes en indiquant simplement des axiomes, des consignes de filtrage. Cette méthode est élégante car proche de la notation mathématique et compacte, mais c'est une méthode itérative donc lente par rapport à une méthode vectorisée fournie par le module NumPy. Par exemple, pour créer la liste des carrés des nombres entiers entre 0 et 9, il suffit d'écrire <syntaxhighlight lang="python"> carre = [x**2 for x in range(10)] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x^2 | x \in [0 ; 9] \}</math>. Si l'on veut la liste des nombres strictement inférieurs à 20 dont le carré est supérieur à 10, on peut écrire : <syntaxhighlight lang="python"> X = [x for x in range(20) if x**2 > 10] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x | x \in [0 ; 19], x^2 > 10 \}</math>. Pour mettre en évidence la performance du calcul vectorisé par rapport à la méthode itérative : <syntaxhighlight lang="python"> import time import numpy as np n = int(1e7) # taille de la liste t1 = time.perf_counter() carre = [x**2 for x in range(n)] # Définition en compréhension t2 = time.perf_counter() carre2 = np.arange(n)**2 # Calcul vectorisé t3 = time.perf_counter() print("En compréhension : ", t2-t1, "s ; vectorisé :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # En compréhension : 4.515... s ; vectorisé : 0.156... s ; rapport : 28.982... </syntaxhighlight> == Structure d'un programme == Un programme est simplement une suite d'instructions. Dans les environnements Unix BSD, un programme Python peut être considéré comme un script c'est-à-dire qu'il suffit de taper son nom dans l'invite de commande ''({{lang|en|shell}})'' sans avoir à invoquer <code>python</code>. Le programme doit alors commencer par un en-tête normalisé surnommé ''{{lang|en|[[wikt:shebang|shebang]]}}'' : <syntaxhighlight lang="python"> #!/usr/bin/env python3 </syntaxhighlight> Ce ''{{lang|en|shebang}}'' est inutile avec Jupyter. L'en-tête peut également contenir la description de l'encodage du fichier texte, typiquement : <syntaxhighlight lang="python"> # coding: utf-8 </syntaxhighlight> Le codage UTF-8 est le codage par défaut pour Python 3, il est donc inutile de l'indiquer. Les commentaires sont introduits par le croisillon <code>#</code>. On peut grouper une suite d'instructions dans un bloc. Un bloc d'instructions commence par deux-points « <code>:</code> » et est identé, c'est-à-dire qu'il a une marge constituée de quatre espaces — on peut aussi utiliser une tabulation mais il ne faut pas mélanger les deux méthodes ; les tabulations sont déconseillées, il vaut mieux utiliser quatre espaces<ref>{{lien web | url = https://www.python.org/dev/peps/pep-0008/#tabs-or-spaces | titre = Tabs or Spaces? | site = Python documentation | consulté le = 2019-03-14 }}</ref>. Pour terminer le bloc, il suffit simplement de revenir en début de ligne ; contrairement à d'autres langages, il n'y a pas de commende de fin ''({{lang|en|end}})'', c'est l'indentation qui définit le bloc. : # début du bloc ''instruction 1'' ''instruction 2'' … ''dernière instruction du bloc'' ''instruction hors bloc'' Par exemple, une exécution conditionnelle <code>if</code> ou une boucle <code>for</code> exécute un bloc d'instruction. Si l'on a besoin d'un bloc d'instruction qui « ne fait rien », on utilise l'instruction <code>pass</code>. == Structures de contrôle == '''Boucle itérative''' La boucle itérative s'écrit : <syntaxhighlight lang="python"> for <variable> in <itérable>: <bloc d’instructions> </syntaxhighlight> Si l'on veut que la variable prenne ''n'' valeurs de 0 à ''n'' – 1, on utilise l'instruction <code>range()</code> : <syntaxhighlight lang="python"> for i in range(5): print(i) print("Fin de la boucle") </syntaxhighlight> <code>[▶]</code> 0 1 2 3 4 Fin de la boucle En fait, la commande <code>range()</code> extrait des valeurs de l'ensemble des nombres entiers ; on peut ainsi utiliser le découpage en tranches, par exemple <code>range(2, 5)</code>pour avoir la « liste » <code>[2, 3, 4]</code>. Notez que <code>range()</code> ne crée pas à proprement parler une liste, cela crée un objet de type ''« {{lang|en|range}} »'' (plage, intervalle) ; pour avoir une liste, il faut écrire <code>list(range(n))</code>. Dans une boucle, la commande <code>continue()</code> saute la fin du bloc d'instruction et passe à la valeur suivante de la boucle. La commande <code>break()</code> interrompt la boucle et passe à la suite. '''Exécution conditionnelle''' L'exécution conditionnelle s'écrit : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> </syntaxhighlight> On peut utiliser les commandes <code>elif</code> ''(else if'') et <code>else</code> : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> elif <booléen>: <bloc d’instructions> else: <bloc d’instructions> </syntaxhighlight> Notez que le test d'une condition est gourmand en ressources. S'il s'agit de savoir si l'on effectue une opération mathématique simple ou pas, on peut remplacer le test par une multiplication par un booléen (<code>True</code> vaut 1, <code>False</code> vaut 0). Par exemple, plutôt que d'écrire <syntaxhighlight lang="python"> if a > 0: b = b - c </syntaxhighlight> mieux vaut écrire : <syntaxhighlight lang="python"> b = b - (a > 0)*c </syntaxhighlight> '''Boucle antéconditionnée''' La boucle antéconditionnée s'écrit : <syntaxhighlight lang="python"> while <booléen>: <bloc d’instructions> </syntaxhighlight> Cette boucle peut contenir des instructions <code>continue()</code> et <code>break()</code>. == Fonction == La déclaration d'une fonction utilise la commande <code>def</code>. La fonction est un bloc d'instructions. Si elle doit renvoyer des valeurs, on utilise la commande <code>return</code>. Par exemple <syntaxhighlight lang="python"> def nombres(n): """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo a = nombres(3) print(a) </syntaxhighlight> La fonction commence par une chaîne de caractères qui la décrit. Cette chaîne peut être récupérée automatiquement par certains logiciels pour faire une documentation automatique. Si la description prend plusieurs lignes, elle commence et finit par trois double-guillemets <code>"""…"""</code> ; en fait, par convention, même si cela n'est pas obligatoire, les descriptions sont toutes encadrées de trois double-guillemets. Cette description est appelée ''{{lang|en|docstring (documentation string)}}''. Pour récupérer les ''{{lang|en|docstrings}}'' : <syntaxhighlight lang="python"> def foo(): """Cette fonction ne fait rien""" pass print(foo.__doc__) # Cette fonction ne fait rien </syntaxhighlight> L'instruction <code>input()</code> permet à l'utilisateur de saisir une valeur. La valeur est retournée sous la forme d'une chaîne de caractères qui est ensuite convertie en nombre réel avec l'instruction <code>float()</code>. On peut définir une valeur par défaut en l'indiquant dans l'en-tête de la définition de la fonction, de la manière suivante : <syntaxhighlight lang="python"> def nombres(n=1): # valeur par défaut : 1 """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo </syntaxhighlight> Si le paramètre à initialiser est de type modifiable ''({{lang|en|mutable}})'', comme par exemple une liste, il faut procéder comme suit : <syntaxhighlight lang="python"> def fooFonction(fooListe=None): # valeur par défaut : n'existe pas """Description""" if fooListe = None: fooListe = [] # initialisation <suite des instructions> </syntaxhighlight> Par défaut, les variables sont locales. On peut rendre une variable globale avec l'instruction <code>global</code> ''à l'intérieur de la fonction'', avant l'utilisation de la variable. Par exemple : <syntaxhighlight lang="python"> a = 1 b = 1 def toto(): """Test de variable globale. Entrée : aucune. Sortie : aucune.""" global a a = 2 b = 2 toto() print("a =", a, "; b =", b) # a = 2 ; b = 1 </syntaxhighlight> Pour être plus précis : si une variable n'est pas assignée dans une fonction, alors Python va chercher une variable du même nom à l'extérieur de la fonction. Mais à partir du moment où la variable est assignée dans la fonction, elle devient locale ''sauf'' si l'on a utilisé l'instruction <code>global</code>. Si l'on s'attend à un nombre indéfini d'arguments, on utilise la notion d'empaquetage/dépaquetage ''({{lang|en|packing/unpacking}})''<ref>{{lien web | url = https://deusyss.developpez.com/tutoriels/Python/args_kwargs/ | titre = Introduction à *args et **kwargs | consulté le = 2019-03-09 | site = Developpez.com }}.</ref>. L'empaquetage consiste à mettre les arguments dans un n-uplet, le dépaquetage consiste à développer un n-uplet en plusieurs variables. Cela se fait en mettant un astérisque ''({{lang|en|splat}})'' « <code>*</code> » devant le nom de la variable. Par convention, on utilise le nom de variable <code>*args</code> mais cela n'est pas obligatoire. <syntaxhighlight lang="python"> def concatenation(*args): """Concatène des chaînes de caractères Entrée : *args, n-uplet de chaînes de caractères. Sortie : resultat, chaîne de caractères.""" resultat = "" for i in args: resultat = resultat + i return resultat concatenation("a", "foo", "toto") # 'afoototo' </syntaxhighlight> À l'inverse, si une fonction doit recevoir plusieurs paramètres, on peut à la place lui transmettre une liste à dépaqueter : <syntaxhighlight lang="python"> def addition(a, b): """Ajoute deux nombres Entrées : — a : réel ; — b : réel. Sortie : a+b, réel""" return a+b arg = (1, 2) addition(*arg) # 3 </syntaxhighlight> On peut aussi empaqueter/dépaqueter un dictionnaire, on utilise pour cela deux astérisques « <code>**</code> ». Par convention, on utilise le nom <code>**kwargs</code> sans que cela soit obligatoire. L'instruction <code>lambda</code> permet de créer de petites fonctions ne contenant pas de boucle ni de branchement conditionnel. Cependant, si la déclaration est courte et compacte, le code n'est pas toujours facilement lisible ; l'utilisation de cette instruction n'est pas recommandée. Par exemple l'expression <syntaxhighlight lang="python"> f = lambda x: 2*x </syntaxhighlight> est la même chose que <syntaxhighlight lang="python"> def f(x): """Calcule le double. Entrée : x, réel. Sortie : 2*x, réel.""" return 2*x </syntaxhighlight> {{note|L'instruction <code>eval()</code> exécute une chaîne de caractères, c'est-à-dire traite une chaîne de caractères comme si c'étaient des instructions données à Python. Cette instruction est à éviter pour deux raisons : # Un utilisateur malveillant pourrait entrer du code malveillant dans la chaîne de caractères. # L'exécution est lente puisque Python doit compiler la chaîne à la volée. Cette instruction peut en général être remplacée par une autre instruction. }} == Gestion des erreurs == Dans un bloc d'instructions, on peut utiliser la structure <code>try:… except:</code>. Le bloc après <code>try</code> est exécuté ; si une erreur se déclare dans ce bloc, alors le bloc <code>except</code> s'exécute. Par exemple <syntaxhighlight lang="python"> try: 1/0 # Génère une erreur except: print("Division par zéro") # Cette instruction est donc exécutée </syntaxhighlight> On peut compléter avec <code>else:</code> et <code>finally:</code> : <syntaxhighlight lang="python"> try: <code à exécuter> except: <s’exécute en cas d’erreur> else: <s’exécute s’il n’y a pas d’erreur> finally: <s’exécute dans tous les cas> </syntaxhighlight> On peut séparer les différents types d'erreur : <syntaxhighlight lang="python"> try: <code à exécuter> except ValueError: print("Valeur erronée") except TypeError: print("Type erroné") </syntaxhighlight> Les types d'erreur les plus courants sont : * <code>NameError</code> : le nom de variable n'existe pas ; * <code>TypeError</code> : la valeur n'est pas du bon type ; * <code>ValueError</code> : la valeur n'est pas compatible avec ce qui est attendu ; * <code>RuntimeError</code> : type d'erreur général. On peut aussi créer ses propres erreurs : si une situation erronée survient, on peut « lever » une exception avec <code>raise</code>. Par exemple <syntaxhighlight lang="python"> if a < 0: raise ValueError("La valeur doit être positive") </syntaxhighlight> ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/errors.html | titre = Errors and exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} * {{lien web | url = https://docs.python.org/3/library/exceptions.html | titre = Built-in Exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} == Exercices == === Calcul du PGCD et du PPCM par l'algorithme d'Euclide === {{loupe|w:Algorithme d'Euclide}} Écrire un programme Python qui demande deux nombres entiers et affiche leurs PGCD et PPCM. Le programme utilisera l'algorithme d'Euclide. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """Programme : euclide.py Auteur : User:cdang date : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : calcule le PGCD et le PPCM de deux nombres entiers. Entrée ------ au clavier, saisie de deux nombres entiers. Sorties ------- à l'écran, affichage du PGCD et du PPCM. """ # *************** # *************** # ** Fonctions ** # *************** # *************** def euclide(): """Calcule le PGCD et le PPCM avec l'algorithme d'Elclide Entrée ------ Aucune, la saisie des paramètres fait partie de la fonction Sortie ------ affichage du PGCD et du PPCM """ print("***** Algorithme d'Euclide *****\n") a0 = int(input("Premier nombre entier : a = ")) b0 = int(input("Second nombre entier : b = ")) a = a0 b = b0 r = a%b # initialisation while (r != 0) : # algorithme d'Euclide a = b b = r r = a%b # affichage des résultats print("PGCD(", a0, ", ", b0, ") = ", b) print("PPCM(", a0, ", ", b0, ") = ", a0*b0//b) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* euclide() </syntaxhighlight> On peut simplifier la boucle centrale : <syntaxhighlight lang="python"> while b: # s'exécute tant que b n'est pas 0 a, b = b, a % b # affectation de liste à liste return a </syntaxhighlight> {{boîte déroulante fin}} Notez que le module NumPy propose l'instruction <code>gcd()</code> : <syntaxhighlight lang="python"> import numpy … print(numpy.gcd(a, b)) </syntaxhighlight> === Tours de Hanoï === {{loupe|w:Tours de Hanoï}} Écrire un programme Python qui demande le nombre ''n'' de plateaux et affiche les manipulations nécessaires pour déplacer la pile d'un emplacement à un autre. Le programme utilisera l'algorithme récursif. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """nom : hanoi.py auteur : User:cdang date de création : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : résout le problème des tours de Hanoï Entrées ------- trois chaînes de caractères (nom des piliers) Sorties ------- une chaîne de caractères (liste des opérations) """ # *************** # *************** # ** Fonctions ** # *************** # *************** def hanoi(a, b, c, n): """Résout le problème des tours de Hanoï de manière récursive But : déplace la pile de n disques du piler a au pilier b Entrées ------- a, b c : chaînes de 1 caractère, référence des emplacements ; n : entier, nombre de disques sur l'emplacement a Sorties ------- operations : chaînes de caractères décrivant les opérations """" if n>1: operations = hanoi(a, c, b, n-1) operations = operations+a+"→"+b+" ; " operations = operations+hanoi(c, b, a, n-1) else: operations = a+"→"+b+" ; " return operations # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* resultat = hanoi("1", "2", "3", 3) print(resultat) </syntaxhighlight> {{boîte déroulante fin}} === Lancer de rayons === [[Fichier:Lentille hemispherique perspective.svg|vignette|Lentille hémisphérique.]] Considérons une lentille hémisphérique de rayon R faite d’un verre d’indice de réfraction ''n''. Nous plaçons une source ponctuelle à une distance ''d'' du dioptre plan, sur l’axe optique. Tracer des rayons partant de la source et traversant la lentille. {{clear}} {{Boîte déroulante/début |titre=Analyse d’optique géométrique}} [[Fichier:Lentille hemispherique analyse geometrique.svg|vignette|Analyse géométrique du problème.]] Il s’agit d’un problème ayant une symétrie de révolution par rapport à l’axe optique. Nous pouvons nous réduire à un problème plan en nous plaçant dans un plan contenant l’axe optique ; l’axe optique est encore un axe de symétrie orthogonale, nous pouvons donc nous contenter d'étudier un demi-plan. Pour simplifier, nous plaçons le centre du dioptre sphérique à l’origine O du repère. L’axe optique est l’axe ''x'' et l'axe perpendiculaire, vertical sur la figure, c’est l’axe ''y''. Les coordonnées de la source sont donc (-''d'' ; 0). Le rayon issu de la source et faisant un angle θ avec l’axe ''x'' frappe le dioptre plan à l’altitude ''h''. Nous avons : : ''h'' = ''d'' ⋅ tan θ. L’angle d’incidence vaut θ. D’après la loi de Snell-Descartes, l'angle de réfraction θ<sub>2</sub> vaut : : θ<sub>2</sub> = arcsin((sin θ) / ''n''). Le rayon réfracté passe par le points de coordonnées (0, ''h''). L’équation de la droite est donc : : ''y'' = a ⋅ ''x'' + ''h'' avec : ''a'' = tan θ<sub>2</sub>. L’équation du cercle de centre O et de rayon R est : : ''x''<sup>2</sup> + ''y''<sup>2</sup> = R<sup>2</sup>. Les coordonnées (''x''<sub>M</sub>, ''y''<sub>M</sub>) de l’intersection M du rayon avec le dioptre sphérique vérifient les deux équations. Par substitution, nous obtenons une équation du second degré en ''x'' que nous savons résoudre : : ''x''<sub>M</sub><sup>2</sup> + (''a'' ⋅ ''x''<sub>M</sub> + ''h'')<sup>2</sup> = R<sup>2</sup> : ⇔ (1 + ''a''<sup>2</sup>) ⋅ ''x''<sub>M</sub><sup>2</sup> + 2 ⋅ ''a'' ⋅ ''h'' ⋅ ''x''<sub>M</sub> + ''h''<sup>2</sup> – R<sup>2</sup> = 0. D’après les propriétés du cercle, le rayon est perpendiculaire à la tangente. Le rayon [OM] est donc normal au dioptre en M. Nous pouvons déterminer l’angle d’incidence θ<sub>i</sub> par le produit scalaire : : <math>\begin{pmatrix} 1 \\ a \end{pmatrix} \cdot \begin{pmatrix} x_\mathrm{M} \\ y_\mathrm{M} \end{pmatrix} = \sqrt{1^2 + a^2} \cdot \mathrm{R} \cdot \cos(\theta_\mathrm{i})</math> ce qui nous permet de calculer cet angle : : <math>\theta_\mathrm{i} = \operatorname{arcos} \left ( \frac{x_\mathrm{M} + a \cdot y_\mathrm{M}}{\mathrm{R} \cdot \sqrt{1^2 + a^2} } \right )</math> Comme nous passons vers un milieu d’indice plus faible, il y a un risque de réflexion totale. L’angle limite est : : θ<sub>max</sub> = arcsin(1/''n''). Si l’on a θ<sub>i</sub> &gt; θ<sub>max</sub>, le rayon repart vers l’intérieur. Nous ne traçons pas le rayon car cela nous emmènerait trop loin dans l’analyse. En revanche, si θ<sub>i</sub> ≤ θ<sub>max</sub>, alors nous pouvons appliquer la loi de Snell-Descartes pour avoir l’angle de réfraction θ<sub>e</sub> : : θ<sub>e</sub> = arcsin(''n'' ⋅ sin θ<sub>i</sub>). Pour tracer le rayon sortant, il nous faut l’angle θ<sub>3</sub> par rapport à l’horizontale. L’angle du rayon [OM] par rapport à l’horizontal vaut arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>), nous avons donc : θ<sub>3</sub> = arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>) + θ<sub>e</sub>. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Analyse algorithmique}} '''Structure des données''' Le problème est décrit par trois paramètres : # Le rayon <code>R1</code> de la lentille, en milliètres (réel en virgule flottante). # L’indice du verre, <code>n</code> sans dimension (réel en virgule flottante). L’indice de l’air vaut 1. # La distance de la source au dioptre d’entrée plan, <code>d</code> en millimètres (réel en virgule flottante). Un rayon est caractérisé par quatre paramètres : # L’angle d’émission <code>theta1</code> en radians (réel en virgule flottante). # L’angle de réfraction dans la lentille <code>theta2</code> en radians (réel en virgule flottante). # Les cordonnées <code>M</code> en millimètre (vecteur de dimension 2 <code>([x, y])</code> de réels en virgule flottante) du point d’intersection du rayon avec le dioptre sphérique. # L’angle de réfraction dans l’air après la lentille <code>theta3</code> en radians (réel en virgule flottante). Pour le calcul et le tracé, nous avons besoin des paramètres intermédiaires suivants : * l’altitude ''y'' = <code>h</code> en millimètres (réel en virgule flottante) à laquelle le rayon frappe le dioptre plan d’entrée ; * l’angle d’incidence du rayon avec le dioptre sphérique <code>thetaint</code> en radians (réel en virgule flottante). Les angles sont stockés en radians car c’est l’unité naturelle pour le calcul mais nous affichons les valeurs en degrés. Comme le calcul de conversion est récurrent, nous conservons les facteurs <code>degversrad</code> (conversion des degrés vers les radians, facteur valant π/180, réel en virgule flottante) et <code>radversdeg</code> (conversion des radians vers les degrés, facteur valant 180/π, réel en virgule flottante). '''Fonctions''' Nous avons besoin d’une fonction qui calcule les trois paramètres du rayon <code>(theta2, M, theta3)</code> à partir de l’angle d’émission <code>theta1</code>. Nous appelons cette fonction <code>lanceRayon()</code>. Cette fonction fait appelle à une fonction qui calcule l’angle du rayon réfracté à partir de l’angle du rayon incident <code>theta1</code>, les deux angles étant par rapport à la normale au dioptre au point considéré. Nous appelons cette fonction <code>refrac()</code>. La recherche de l’intersection <code>M</code> du rayon avec le dioptre sphérique nécessite de résoudre une équation du second degré. Nous utilisons pour cela la recherche des racines du polynôme en <code>x</code> avec la fonction <code lang="python">numpy.polynomial.polynomial.polyroots()</code>. D’après la configuration du problème géométrique, si l’on s’assure que le rayon frappe bien la lentille (0 ≤ <code>h</code> ≤ <code>R1</code>) alors nous sommes sûrs que le problème a deux solutions réelles (une positive et une négative) ou, dans le cas dégénéré où <code>h == R1</code>, une valeur unique <code>x == 0</code>. Comme nous recherchons la valeur positive, nous sélectionons la plus grande des deux racines. Pour la gestion de la réflexion interne : dans la fonction <code>refrac()</code>, nous vérifions les conditions de réflexion totale et si elles sont remplies, alors nous générons une erreur (commandes <code lang="python">try… except</code> et <code lang="python">raise ValueError</code>). Cette erreur est propagée à la fonction <code>lanceRayon()</code> : <code>lanceRayon()</code> appelle la fonction <code>refrac()</code> et si cette fonction renvoie une erreur, alors <code>lanceRayon()</code> renvoie également une erreur. Pour trouver l’angle d’émission <code>thetaLimite</code> provoquant la réflexion totale (en radians, réel en virgule flottante), nous effectuons une recherche par dichotomie : * nous partons de l’angle maximum possible, lorsque le rayon frappe le sommet de la lentille, et nous appelons la fonction <code>lanceRayon()</code> ; si cela ne génère pas d’erreur, alors nous pouvons aller jusqu’à cette valeur, la recherche est terminée ; si cela génère une erreur, alors nous divisons la valeur par deux ; * à une étape de la recherche donnée, si <code>lanceRayon()</code> ne génère pas d’erreur avec l’angle testé, alors nous savons que l’angle limite est supérieur à cette valeur ; cette valeur minore donc la valeur recherchée ; si au contraire <code>lanceRayon()</code> génère une erreur, alors c’est que l’angle est trop important, cette valeur majore donc la valeur recherchée ; nous pouvons ainsi resserer l’intervalle de recherche ; * nous nous arrêtons lorsque les valeurs haute et basse sont suffisamment proche. Concrètement : # Nous définissons une variable <code>angleHaut</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus bas connu provoquant la réflexion totale. # Nous définissons une variable <code>angleBas</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus haut connu ne provoquant pas de réflexion totale. Sa valeur initiale est 0. L’angle limite recherché est donc entre <code>angleBas</code> et <code>angleHaut</code>. # Nous définissons l’angle <code>angleTest</code> comme étant la moyenne entre <code>angleBas</code> et <code>angleHaut</code>. Si <code>lanceRayon(angleTest)</code> génère une erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleHaut</code> (puisque c’est une valeur provoquant la réflexion totale et qu’elle est plus basse que la valeur actuelle d’<code>angleHaut</code>). À l’inverse, si <code>lanceRayon(angleTest)</code> ne génère pas d’erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleBas</code> (puisque c’est une valeur ne provoquant pas la réflexion totale et qu’elle est plus haute que la valeur actuelle d’<code>angleBas</code>). # Nous arrêtons la procédure lorsque l’écart entre <code>angleBas</code> et <code>angleHaut</code> est inférieur à {{unité|10|échelle=<sup>–3</sup>|rad}} (valeur arbitraire). La valeur retenue est la valeur finale d’<code>angleBas</code> (puisque l’on veut être sûr qu’il n’y ait pas de réflexion totale). La valeur affichée est la valeur en degrés arrondie au dixième. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Solution}} Nous demandons à l’utilisateur ou à l’utilisatrice les valeurs des paramètres du problème : rayon de la lentille, distance de la source, indice de réfraction du verre. Nous vérifions que les valeurs entrées sont bien des nombres ; si c’est une chaîne vide, alors nous utilisons une valeur par défaut. Nous créons une fonction <code>refrac()</code> qui permet de calculer l’angle réfracté à partir de l’angle d’incidence et des indices de réfraction. S’il y a rélexion totale, alors nous générons une erreur. La fonction <code>lanceRayon()</code> calcule les différents points de passage du rayon. Elle appelle pour cela la fonction <code>refrac()</code>. Si un appel de la commande <code>refrac()</code> génère une erreur, alors nous générons également une erreur. Nous déterminons l’angle d’émision du rayon <code>thetaLimite</code> qui provoque une réflecxion totale. Pour cela, nous créons une fonction <code>rechercheLimite()</code> qui cherche par dichotomie. Nous traçons un rayon tous les 5° jusqu’à la valeur limite. <syntaxhighlight lang="python"> #!/usr/bin/env python3 # coding: utf-8 """nom : lancerRayons.py auteur : User:cdang date de création : 2022-05-06 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : NumPy, matplotlib ---------------------------------------------------------------------------- Objectif : trace des trajets optique avec une lentille hémisphérique Entrées ------- Le rayon de la lentille, la distance de la source, l’indice de réfraction du verre, trois chaînes de caractères saisies par l’utilisateur·rice et qui sont converties en réels. Sorties ------- La valeur limite de l’angle (réel) et le tracé de plusieurs rayons. """ # ****************************************************** # ****************************************************** # ** Lancer de rayons pour une lentille hémisphérique ** # ****************************************************** # ****************************************************** import numpy as np import matplotlib.pyplot as plt import numpy.polynomial.polynomial as nppol # ************** # * Constantes * # ************** # Pour la conversion degrés ↔ radians radversdeg = 180/np.pi degversrad = 1/radversdeg # ************* # * Fonctions * # ************* def boucleEntreeNombre(messageSaisie, valeurDefaut): """Permet de s’assurer que l’utilisateur·rice a bien entré un nombre. Entrée : — message à afficher (chaîne de caractères) ; — valeur par défaut (réel à virgule flottante). Sortie : nombre (réel à virgule flottante).""" messageErreur = "Veuillez entrer une valeur numérique (ou vide pour accepter la valeur par défaut).\n" execute = True while execute: strNombre = input(messageSaisie+f" (valeur par défaut {valeurDefaut}) : ") if strNombre == "": nombre = valeurDefaut execute = False else: try: nombre = float(strNombre) except: print(messageErreur) else: execute = False return nombre def initialisation(): """L’utilisateur·rice entre les variables du problème. Entrées : aucune. Sorties : — R1 (mm) : rayon de la lentille ; — d (mm) : distance de la source au dioptre plan ; — n (sans dimension) : indice de réfraction du verre.""" R1 = boucleEntreeNombre("Rayon de la lentille en mm", 20.0) d = boucleEntreeNombre("Distance de la source au dioptre plan en mm", 20.0) n = boucleEntreeNombre("Indice de réfraction (sans dimension)", 1.5) return (R1, d, n) def refrac(n1, n2, theta1): """Calcule l’angle de réfraction theta2 (radians) en fonction — de l’angle d’incidence theta1 (radians); — de l’indice de réfraction n1 du premier milieu ; — de l’indice de réfraction n2 du second milieu.""" reflexionTotale=False rapport=n2/n1 rapportinv=np.reciprocal(rapport) if n1 > n2: thetal = np.arcsin(rapport) # angle limite pour la réflexion totale if theta1 >= thetal: reflexionTotale=True if reflexionTotale: print("Réflexion totale") raise ValueError else: return np.arcsin(rapportinv*np.sin(theta1)) def lanceRayon(n1, n2, d, R, theta1): """Détermine le rayon issu de la source située à une distance d (mm) du bareau et avec une élévation de theta1 (radians), en fonction des indices de réfraction n1 et n2. Les éléments retournés sont : — la hauteur h (mm) à laquelle le rayon frappe le barreau ; — l’angle de réfraction theta2 (radians)) dans le barreau ; — l’angle de réfraction theta3 (radians) à la sortie du barreau — le point M(x, y) (mm) auquel le rayon sort du barreau.""" h = d*np.tan(theta1) if h >= R: print("Le rayon est au-dessus du barreau") raise ValueError else: theta2 = refrac(n1, n2, theta1) a = np.tan(theta2) x = max(nppol.polyroots([h*h - R*R, 2*a*h, 1+a*a])) # recherche de l’intersection du rayon avec le cercle y = a*x + h M = np.array([x, y]) thetaint = np.arccos((x + a*y)/(R*np.sqrt(1 + a*a))) theta3 = np.arctan(y/x) - refrac(n2, n1, thetaint) return (h, theta2, theta3, M) def rechercheLimite(n1, n2, d, R): """Recherche l’angle limite pour la réflexion totale. Entrée : — indice de réfraction des milieux 1 et 2, n1 et n2 ; — distance au barreau, d(mm). Sortie : angle limite theta (radians)""" angleHaut = np.arctan(R/d) angleBas = 0 angleTest = angleHaut try: lanceRayon(n1, n2, d, angleTest, R) except: condition = True # il y a réflexion total en haut de la lentille else: condition = False # il n’y a jamais réflexion totale dans la lentille while condition: #dichotomie angleTest = np.mean([angleHaut, angleBas]) # on ajuste la valeur de test try: lanceRayon(n1, n2, d, R, angleTest) except: angleHaut = angleTest # réflexion totale : on abaisse la valeur maximale else: angleBas = angleTest # pas de réflexion totale : on monte la valeur minimale condition = ((angleHaut - angleBas) >= 0.001) # on a cerné la limite à 0,001 rad près if not condition: angleTest = angleBas return angleTest # *********************** # * Programme principal * # *********************** (R1, d, n) = initialisation() xmax = round(R1 + d) thetaLimite = rechercheLimite(1, n, d, R1) thetaLimiteDeg = thetaLimite*radversdeg print(f"Angle limite pour la réflexion totale : {thetaLimiteDeg:.1f}°.\n") anglesDeg = np.arange(0, thetaLimiteDeg, 5)[1:] # trace un rayon tous les 5° anglesRad = anglesDeg*degversrad nb = len(anglesDeg) h = np.zeros(nb) # initialisation des vecteurs de valeurs theta2 = np.zeros(nb) theta3 = np.zeros(nb) M = np.zeros((nb, 2)) for i in range(nb): (h[i], theta2[i], theta3[i], M[i, :]) = lanceRayon(1, n, d, R1, anglesRad[i]) (h_lim, theta2_lim, theta3_lim, M_lim) = lanceRayon(1, n, d, R1, thetaLimite) # tracé anglesCercle = 0.5*np.pi*(np.linspace(1, 0, 20)) x_cercle = R1*np.cos(anglesCercle) # coordonnées des pints du cercle y_cercle = R1*np.sin(anglesCercle) fig = plt.plot([-d,xmax], [0, 0], "k-.", linewidth="0.5") # tracé de l’axe optique for i in range(nb): plt.plot([-d, 0, M[i, 0], xmax], [0, h[i], M[i, 1], M[i, 1] + (xmax - M[i, 0])*np.tan(theta3[i])], label=f"{anglesDeg[i]:.0f}°") plt.plot([-d, 0, M_lim[0], xmax], [0, h_lim, M_lim[1], M_lim[1] + (xmax - M_lim[0])*np.tan(theta3_lim)], label=f"{0.1*int(np.trunc(10*thetaLimite*radversdeg)):.1f}°") plt.plot(x_cercle, y_cercle, "k", linewidth="0.5") # tracé du cercle plt.plot([0,0], [0, R1], "k", linewidth="0.5") # tracé du premier dioptre #plt.axis("square") plt.gca().set_aspect("equal", adjustable="box") plt.xlabel("x (mm)") plt.ylabel("y (mm)") plt.title("Lentille hémisphérique, lancer de rayons") plt.legend() plt.savefig("lentille_hemispherique_lancer_rayon.svg", format="svg") plt.show() </syntaxhighlight> {{Boîte déroulante/fin}} == Mesurer le temps == Le module <code>time</code> fournit les fonctions suivantes : * <code>time.gmtime()</code> : renvoie la date et l'heure du méridien de Greenwich (''{{lang|en|Greenwich mean time}}'', GMT), sous la forme d'un dictionnaire (année, mois, jour du mois, heure, minute, seconde, jour de la semaine, jour de l'année, heure d'été/hiver), ** jour de la semaine est un entier entre 0 (lundi) et 6 (dimanche), ** jour du mois est un entier entre 1 et 366 ; * <code>time.localtime()</code> : comme le précédent, mais l'heure est l'heure locale ; * <code>time.time()</code> : donne le nombre de seconde qui se sont écoulées depuis le 1er janvier 1970 ; * <code>time.gmtime(n)</code> et <code>time.localtime(n)</code> transforment un nombre de secondes (écoulées depuis le 1er janvier 1970) en une date au format (année, mois, jour, etc.), n-uplet de neuf valeurs ; <code>time.mktime()</code> fait le contraire, il transforme un n-uplet de neuf valeurs (années, mois, jour, etc.) en un nombre de secondes (écoulées depuis le 1er janvier 1970) ; * <code>time.sleep(n)</code> : provoque une pause dans le déroulement du programme de ''n'' secondes ; * <code>time.perf_counter()</code> : indique une date en seconde ; s'utilise pour mesurer la durée d'exécution d'une partie du code, en faisant la différence entre deux relevés. Concernant la date et l'heure sous la forme d'un n-uplet, on peut extraire l'heure de la manière suivante : <syntaxhighlight lang="python"> import time a = time.localtime() print("Il est ", a[3], "h", a[4]) # ou bien print("Il est ", a.tm_hour, "h", a.tm_min) </syntaxhighlight> Pour mesurer la performance d'une portion de code : <syntaxhighlight lang="python"> import time t1 = time.perf_counter() <suite d’instructions> t2 = time.perf_counter() print("Durée d'exécution :", t2-t1 </syntaxhighlight> == Programmation orientée objet == Nous n'allons pas ici faire un cours de programmation orientée objet (POO), nous allons aborder le sujet de manière pragmatique. De manière schématique, un « objet » est une « super-variable ». Cette super-variable peut contenir plusieurs variables, appelées « attributs » ; elle contient en fait un dictionnaire (paires « nom d'attribut : valeur d'attribut »). Elle peut aussi contenir des fonctions spécifiques appelées « méthodes ». De même qu'une variable a un type, un objet fait partie d'une « classe ». La classe est le modèle de l'objet ; en franglais informatique, on dit que l'objet est une instance de la classe. La POO est donc un formalisme : lorsque l'on définit des variables et des fonctions concernant un même type d'objet (au sens commun du terme), on les empaquette dans une classe. Il faut donc d'abord définir la classe, puis attribuer cette classe à un objet (« instancier » la classe). Considérons par exemple que nous voulons travailler sur des [[w:Engrenage|engrenages]] ; pour simplifier, nous nous contentons d'engrenages à dentures droites. Une roue dentée, un pignon, est essentiellement définie par son nombre de dents Z et par son module ''m'' qui correspond à la largeur de dents<ref>ainsi que par son épaisseur ''e'' et le matériau dont elle est faite mais nous allons négliger ces paramètres pour la simplicité de l'étude.</ref>. Nous allons définir trois méthodes : la méthode <code>.diametrePrimitif()</code> qui calcule le diamètre primitif de la roue dentée, <code>.pas()</code> qui calcule la largeur des dents au niveau du cercle primitif et <code>.rapport()</code> qui calcule le rapport de transmission de deux roues engrenées Z<sub>1</sub>/Z<sub>2</sub>. La méthode <code>.rapport()</code> vérifie par ailleurs que les roues ont le même module, condition indispensable pour former un engrenage. Nous définissons la classe ainsi : <syntaxhighlight lang="python"> class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): # instructions lancées lors de la déclaration """Valeurs des attributs""" self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z </syntaxhighlight> Nous remarquons que lorsque nous déclarons les méthodes, le paramètre <code>self</code> correspond à l'objet lui-même. Ainsi, dans la méthode <code>.rapport()</code>, la variable <code>self.Z</code> est le nombre de dents de la roue elle-même et <code>roueDentee.Z</code> est le nombre de dents de la roue passée en paramètre. Pour déclarer les roues, nous écrivons : <syntaxhighlight lang="python"> roue1 = pignon() # attribution de la classe, « instanciation » roue1.Z = 13 # définition des caractéristiques du pignon « roue1 » roue1.m = 2 roue2 = pignon(16, 2) # manière alternative </syntaxhighlight> Nous pouvons alors utiliser les objets de la manière suivante : <syntaxhighlight lang="python"> print(roue1.Z) # 13 print(roue1.diametrePrimitif()) # 26 R = roue1.rapport(roue2) # 0.8125 </syntaxhighlight> La commande <code>dir(a)</code> affiche tous les attributs et méthodes de l'objet <code>a</code>. ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/classes.html | titre = Classes | site = Python documentation | consulté le = 2019-03-08 }} == Interface graphique avec Tk == Une interface graphique utilisateur (GUI, ''{{lang|en|graphic user interface}}'') est un ensemble de boîtes permettant d'interagir avec l'utilisateur c'est-à-dire permettre la saisie d'informations, l'exécution d'actions et afficher des informations. Elle se compose d'éléments appelés ''{{lang|en|widgets}}''. Les éléments ''({{lang|en|widgets}})'' classiques sont : * boîte de dialogue ''({{lang|en|dialog box}})'' : fenêtre contenant d'autres éléments ; * étiquette ''({{lang|en|label}})'' : texte affiché ; * liste déroulante ''({{lang|en|drop-down list}})'' : zone permettant le choix d'une option, la liste se déployant lorsque l'on clique sur la zone ; * zone de texte, champ de saisie ''({{lang|en|text box}})'' : zone permettant de taper du texte ; * boîte combinée ''({{lang|en|combo box}})'' : zone de saisie de texte contenant une liste déroulante qui permet de choisir des éléments prédéfinis ; * bouton ''({{lang|en|button}})'' : objet effectuant une action lorsque l'on clique dessus ; * case à cocher ''({{lang|en|checkbox, tickbox}})'' : objet permettant d'activer ou de désactiver une option lorsque l'on clique dessus ; * bouton radio, case d'option ''({{lang|en|radio button}})'' : objet permettant d'activer une option en désactivant les autres options ; une seule option peut être activée à la fois. Plusieurs modules permettent de gérer les interfaces graphiques. Nous choisissons ici le module développé sur la bibliothèque Tk qui est une bibliothèque multiplateforme. Pour cela, nous importons le module <code>tkinter</code> ainsi que le module <code>ttk</code>, ce dernier proposant des options plus « modernes » : <syntaxhighlight lang="python"> import tkinter as tk from tkinter import ttk </syntaxhighlight> Voici un programme permettant comme précédemment de calculer le rapport de transmission d'un engrenage. Nous détaillons sa construction ci-après. <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: IUrapport.set(valeurZ2/valeurZ1) except: IUrapport.set("erreur") # ************************* # ************************* # ** Interface graphique ** # ************************* # ************************* # fenetre principale fenetre = tk.Tk() fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> '''Explications''' Nous commençons par définir la boîte de dialogue que nous appelons <code>fenetre</code> ; c'est un objet <code>Tk</code> et nous lui donnons un titre « » : <syntaxhighlight lang="python"> fenetre = tk.Tk() fenetre.title("Rapport de réduction") </syntaxhighlight> Puis, nous définissons un cadre attaché à cette fenêtre et qui va nous permettre « d'accrocher » les autres éléments, ce qui permet de garder une apparence satisfaisante lorsque l'on retaille la fenêtre : <syntaxhighlight lang="python"> cadre = ttk.Frame(fenetre) </syntaxhighlight> Le cadre va comporter six lignes ''({{lang|en|row}})'' et deux colonnes ''({{lang|en|column}})''. Nous allons placer une étiquette ''({{lang|en|label}})'' « z1 » : <code>text="z1"</code>. Cette étiquette se trouve dans une case du cadre, celle de la première colonne et la première ligne : <code>grid(column=1, row=1)</code>. Par rapport à cette case, elle est collée à « l'ouest » (W, ''{{lang|en|west}}'', gauche) de la case : <code>sticky=tk.W</code>. <syntaxhighlight lang="python"> z1_label = ttk.Label(cadre, text="z1") # Création de l'étiquette z1_label.grid(column=1, row=1, sticky=tk.W) # Placement de l'étiquette </syntaxhighlight> Notez que l'on aurait pu écrire directement : <syntaxhighlight lang="python"> ttk.Label(cadre, text="z1").grid(column=1, row=1, sticky=tk.W) </syntaxhighlight> mais le fait de séparer la création de l'élément et son placement facilite la maintenance (recherche d'erreur, évolution du code). Pour tout ce qui est dynamique, c'est-à-dire les zone de saisie des valeurs et l'affichage du résultat, il faut définir des « chaînes variables » ''({{lang|variable strings}})'' : <syntaxhighlight lang="python"> IUz1 = tk.StringVar() </syntaxhighlight> Cette variable est une variable globale à la création. Nous pouvons alors placer la zone de saisie ''({{lang|en|entry}})'' à côté de l'étiquette lui correspondant. Nous nommons la zone de saisie <code>z1_entry</code> : <syntaxhighlight lang="python"> z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) </syntaxhighlight> Nous faisons de même pour les trois autres paramètres de l'engrenage, ''m''<sub>1</sub>, ''z''<sub>2</sub> et ''m''<sub>2</sub>. Le résultat est également une chaîne variable globale. Par rapport à notre mise en page, elle se situe dans la case colonne 2 ligne 5, centrée sur cette case (collé à l'est et à l'ouest) : <syntaxhighlight lang="python"> rapport = tk.StringVar() rapport_dynamique = ttk.Label(cadre, textvariable=rapport) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) </syntaxhighlight> Il nous faut encore définir une fonction de manière classique, nous l'appelons « calcule ». Les variables étant globales, on les utilise directement. On récupère les valeurs avec la méthode <code>get()</code> et nous modifions la valeur avec la méthode <code>set()</code> : <syntaxhighlight lang="python"> def calcule(): valeurZ1 = float(IUz1.get()) valeurZ2 = float(IUz2.get()) IUrapport.set(valeurZ2/valeurZ1) </syntaxhighlight> Cette fonction est déclenchée lorsque l'on clique sur le bouton « Calcul » situé dans la case du cadre ligne 6 colonne 2 : <syntaxhighlight lang="python"> bouton = ttk.Button(cadre, text="Calcul", command=calcule) bouton.grid(column=2, row=6, sticky=tk.W) </syntaxhighlight> ou bien si l'on appuie sur la touche <code>[entrée]</code> du clavier : <syntaxhighlight lang="python"> fenetre.bind("<Return>", calcule) </syntaxhighlight> À tout ceci, nous ajoutons des « gouttières » (marges, ''{{lang|en|paddings}}'') afin d'espacer les éléments. Il faut ensuite « activer » la fenêtre pour qu'elle s'affiche. La méthode est <code>mainloop()</code> (boucle principale) : « boucle » (elle est active en permanence et attend des actions sur ses éléments), <syntaxhighlight lang="python"> fenetre.mainloop() </syntaxhighlight> Nous avons ci-dessus mis la plupart du code en programme principal. Nous pouvons aussi programmer de manière fonctionnelle, en mettant la plupart du code dans des fonctions ; cependant, pour que la fenêtre et les variables dynamiques soient globales à tout le programme, elles doivent être déclarées dans le programme principal. Nous pouvons aussi mêler la programmation orientée objet. {{boîte déroulante début|Calcul du rapport de transmission en programmation fonctionnelle et orientée objet}} <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # ************* # ************* # ** Classes ** # ************* # ************* class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): """Valeurs des attributs""" # instructions lancées lors de la déclaration self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z # ************************ # ************************ # ** Variables globales ** # ************************ # ************************ # fenetre principale fenetre = tk.Tk() # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: roue1 = pignon(valeurZ1, valeurM1) roue2 = pignon(valeurZ2, valeurM2) IUrapport.set(roue1.rapport(roue2)) except: IUrapport.set("Erreur") # *********************** # * Interface graphique * # *********************** def configureFenetre(): """Configuration de la fenêtre principale""" fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* configureFenetre() # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> {{boîte déroulante fin}} == Annotations == Une annotation est un commentaire qui sert à expliciter un type de variable. La syntaxe est différente des commentaires « classiques » : cela permet d'avoir un affichage différent avec les éditeurs de texte ayant une coloration syntaxique, et ces informations peuvent être récupérées par des logiciels extérieurs pour effectuer une documentation automatique ou bien des vérifications de type. Cependant : * comme les commentaires normaux, ils n'ont aucune influence lors de l'exécution du texte ; en particulier : * rien n'oblige à annoter les variables ; * il est possible d'avoir une variable ayant un type différent de son annotation ; le fait de pouvoir définir et changer le type de variable à la volée est une fonctionnalité fondamentale de Python. La syntaxe pour une annotation est : : nom_de_variable + deux-points + espace + type par exemple : <syntaxhighlight lang="python"> a: int </syntaxhighlight> Notez qu'ici, la variable n'est ''pas'' créée. Pour la créer, il faut lui affecter une valeur. Il est possible de l'affecter après ou bien sur la même ligne avec la syntaxe : : nom_de_variable + deux-points + espace + type + espace + égal + espace + valeur par exemple : <syntaxhighlight lang="python"> a: int a = 5 # est équivalent à a: int = 5 </syntaxhighlight> Même si l'annotation n'a pas d'impact sur l'exécution, le type doit être un type existant sinon cela génère une erreur de syntaxe. Les types classiques sont : : <code>int</code> — <code>float</code> — <code>str</code> — <code>bool</code> — <code>list</code> — <code>tuple</code> — <code>dict</code> Il est également possible de mettre une chaîne de caractères : <syntaxhighlight lang="python"> a: "ce que je veux" = 3.1516 </syntaxhighlight> On peut annoter une fonction. Il est possible d'annoter les variables déclarées au sein de la fonction, mais pas les variables globales (puisqu'elle ne sont pas définie au sein de la fonction). On peut aussi annoter : * les variables passées en paramètre, avec la même syntaxe dans les parenthèses ; * annoter le type de la variable de sortie (retournée) en la faisant précéder de <code>-&gt;</code> : <syntaxhighlight lang="python"> def plusCinq(a: float = 0) -> float: return a + 5 </syntaxhighlight> ; Ressources * {{lien web | url = https://www.python.org/dev/peps/pep-0526/ | titre = PEP 526 -- Syntax for Variable Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} * {{lien web | url = https://www.python.org/dev/peps/pep-3107/ | titre = PEP 3107 -- Function Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} == Décorateur == Un décorateur est une fonction qui s'applique à une fonction, à la manière de la composition mathématique ''g'' ∘ ƒ = ''g''(ƒ). Mais cette composition affecte la fonction elle-même ; l'utilisateur appelle la fonction ƒ mais c'est la fonction ''g'' ∘ ƒ qui s'exécute. Cette fonction ''g'' est appelée le décorateur. L'intérêt est de pouvoir modifier une fonction sans modifier le code de la fonction elle-même. Pour appliquer une décoration, il faut : # Déclarer le décorateur : une fonction qui s'applique à une autre fonction. # Affecter le décorateur à la fonction visée : en mettant <code>@''décoration''</code> juste avant la définition de la fonction. Par exemple : <syntaxhighlight lang="python"> def decorateur(f): print("Avant la fonction") f() print("après la fonction") @decorateur def afficheFoo(): print("Foo.") afficheFoo # Avant la fonction # Foo. # Après la fonction </syntaxhighlight> Lorsque l'on appelle <code>afficheFoo</code>, on appelle en fait <code>decorateur(afficheFoo)</code>. Si la fonction à modifier admet des paramètres, il faut définir une fonction enveloppante dans le décorateur. Par exemple, nous définissons ci-dessous un décorateur <code>deuxFois()</code> qui fait s'exécuter deux fois de suite la fonction : <syntaxhighlight lang="python"> def deuxFois(f): def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # conteneurFonction </syntaxhighlight> Nous voyons que l'application du décorateur a modifié le nom de la fonction — pas le nom de la variable qui contient la fonction mais bien son nom « intime ». Pour éviter cela, on utilise la méthode <code>wraps()</code> du module <code>functools</code> : <syntaxhighlight lang="python"> import functools def deuxFois(f): @functools.wraps(f) def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # plusCinq </syntaxhighlight> On peut par exemple utiliser un décorateur pour la mémoïsation. La mémoïsation est une méthode consistant à mémoriser les valeurs d'une fonction au fur et à mesure de son utilisation ; ainsi, si l'on veut évaluer la fonction avec les mêmes entrées, on se contente d'aller chercher la valeur enregistrée ce qui est plus rapide. On sacrifie donc la place mémoire au profit de la rapidité. On peut trouver des décorateurs de mémoïsation aux adresses suivantes : * https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize * https://gist.github.com/robcowie/1357800 ; Ressources : {{lien web | url = https://www.python.org/dev/peps/pep-0318/ | titre = PEP 318 -- Decorators for Functions and Methods | site = Python.org | lang = en | consulté le = 2019-04-05 }} == Manipulation de fichiers == === Importer le contenu d'un fichier === Python possède la fonction <code lang="python">open()</code> qui permet d'ouvrir un fichier. Ouvrir signifie qu'il crée un objet de type <code>file</code> qui possède notamment les méthodes <code lang="python">read()</code> et <code lang="python">write()</code>. Il peut s'agir d'un objet de type « fichier binaire » ''({{lang|en|binary file}})'' ou « fichier texte » ''({{lang|en|text file}})''. Si par exemple on veut utiliser (et donc lire) le contenu du fichier texte <code>monfichier.txt</code>, on écrit : <syntaxhighlight lang="python"> fichier = open("monfichier.txt", "rt") … fichier.close() </syntaxhighlight> Le paramètre <code>"rt"</code> signifie que nous ouvrons le fichier en lecture ''({{lang|en|read}})'' et qu'il s'agit d'un objet de type fichier texte. Notons deux choses : * en faisant cela, nous ne faisons qu'associer le fichier à un objet Python, nous n'avons pas encore importé les données ; * si nous ouvrons le fichier, il faut le fermer par la suite ; c'est pourquoi nous utilisons la méthode <code lang="python">.close()</code>. Pour éviter d'avoir à fermer le fichier, nous pouvons l'ouvrir au sein d'un contexte : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: … </syntaxhighlight> Notons aussi que la chaîne de caractères indiquant le nom du fichier peut contenir le chemin d'accès au répertoire (dossier), mais sous Microsoft Windows, il faut utiliser des barres de fractions <code>/</code> pour séparer les sous-répertoires au lieu de la barre inversée habituelle, par exemple : <syntaxhighlight lang="python"> chemin = "C:/Temp/monfichier.txt" with open(chemin, "rt") as fichier: … </syntaxhighlight> Pour mettre les données du fichier dans la variable <code>contenu</code>, nous écrivons donc : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() print(contenu) </syntaxhighlight> et si nous ne voulons lire que les <code>n</code> premiers caractères (<code>n</code> étant un entier), nous utilisons <code lang="python">contenu = fichier.read(n)</code>. Cette lecture est séquentielle, c'est-à-dire que si nous appliquons la méthode plusieurs fois, nous reprenons la lecture là où nous l'avons laissée. Si nous voulons lire une ligne, nous utilisons la méthode <code lang="python">.readline()</code>. La lecture ligne par ligne est également séquentielle. Nous pouvons aussi créer une liste dont chaque élément est une ligne du fichier ; nous utilisons alors la méthode <code lang="python">.readlines()</code> (notez le pluriel). Chaque élément de la liste se termine par le caractère de fin de ligne <code lang="python">\n</code>. Pour l'enlever, nous pouvons utiliser la méthode <code lang="python">.rstrip()</code> pour chaque élément de la liste, par exemple. L'exemple complet est alors : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.readlines() contenu = [item.rstrip() for item in contenu] print(contenu) </syntaxhighlight> === Exporter du contenu vers un fichier === Si nous voulons créer un fichier texte pour y mettre le contenu de la variable <code>texte</code>, alors nous utilisons : <syntaxhighlight lang="python"> with open("monfichier.txt", "wt") as fichier: contenu = fichier.write(texte) </syntaxhighlight> Le module principal important pour la manipulation de fichiers est est <code lang="python">os</code>. === Exploiter le contenu d'un fichier texte === Avec un fichier texte, la méthode <code lang="python">.read()</code> crée une variable de type texte. Nous pouvons séparer cette variable en différentes lignes avec la méthode <code lang="python">.splitlines()</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une ligne. Si maintenant une ligne contient plusieurs données séparées par un séparateur commun, par exemple un espace, nous pouvons séparer les données par la méthode <code lang="python">.split(''séparateur'')</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une donnée. Si par exemple le fichier est du type CSV ''({{lang|en|comma separated values}}'', valeurs séparées par une virgule), l'exploitation du fichier est : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(",") for item in contenu] </syntaxhighlight> La variable <code>contenu</code> est une liste de listes. Pour avoir la ''n''<sup>e</sup> valeurs de la ''m''<sup>e</sup> ligne, on utilise : <syntaxhighlight lang="python"> contenu[m-1][n-1] </syntaxhighlight> Si l'on veut extraire la ligne ''m'' il suffit d'écrire : <syntaxhighlight lang="python"> contenu[m-1] </syntaxhighlight> mais si l'on veut la colonne ''n'', le plus simple est d'utiliser une définitipon en compréhension : <syntaxhighlight lang="python"> [ligne[n-1] for ligne in contenu] </syntaxhighlight> Dans certains fichiers CSV, les séparateurs de valeurs ne sont pas des virgules, on peut donc utiliser un autre caractère pour le séparateur. Si le séparateur est une tabulation, on utilise <code lang="python">\t</code> : <code lang="python">contenu = [item.split("\t") for item in contenu]</code> Si la première ligne contient les en-têtes des colonnes, on peut l'enlever avec la fonction <code lang="python">del()</code> : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() del(contenu[0]) contenu = [item.split(",") for item in contenu] </syntaxhighlight> Certains logiciels créent des fichiers en utilisant le séparateur décimal régional, qui en France est la virgule. Pour remplacer les virgules par des points, on peut utiliser la méthode <code lang="python">.replace()</code>, de préférence ''avant'' de séparer les valeurs : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.replace(",", ".") for item in contenu] # remplace les virgules par des points contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule </syntaxhighlight> en effet, lorsque l'on a séparé les valeurs, on a une liste de liste, il faut alors balayer les sous-listes ce qui prend plus de temps : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule contenu = [[subitem.replace(",", ".") for subitem in item] for item in contenu] # remplace les virgules par des points </syntaxhighlight> '''Exemple complet''' Supposons que l'on ait un fichier texte de la forme : <syntaxhighlight lang="text"> x y z V 0.0 1.5 3.2 8.657 0.4 1.5 3.2 8.392 0.2 1.5 3.2 8.485 ... </syntaxhighlight> C'est un fichier valeurs V associées à des points de coordonnées ''(x, y, z)'' (un champ V sur l'espace, donc). Nous remarquons que seule la coordonnée ''x'' change : les données concernent la droite (''y'' = 1,5 ; ''z'' = 3,2). Nous remarquons aussi que les valeurs de ''x'' ne sont pas classées par ordre croissant ni décroissant. Nous voulons au final avoir une matrice [[''x''], [V]] triée par ''x'' croissant. Pour cela, nous pouvons faire : <syntaxhighlight lang="python"> with open(nomdefichier, "rt") ad fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(" ") for item in contenu contenu = contenu[1:] # élimine la première ligne x = np.array([float(ligne[0]) for ligne in contenu]) V = np.array([float(ligne[3]) for ligne in contenu]) donnees = np.concatenate((x.reshape(-1, 1), V.reshape(-1, 1)), axis=1) # matrice [[x], [V]] ind = np.argsort(donnees[:, 0]) donnees = donnees[ind, :] # matrice triée plt.plot(donnees[:, 0], donnees[:, 1]) </syntaxhighlight> {{note|Pour le tri, voir [[../Manipulation_de_matrices#Fonctions_et_méthodes_de_base|''Manipulation de matrices'' &gt; ''Fonctions et méthodes de base'']].}} === Cas d'un fichier CSV === Si le fichier CSV ne contient que des valeurs numériques, on peut utiliser : <syntaxhighlight lang="python"> valeurs = np.loadtxt(chemin+nomfic, delimiter=",") # si le séparateur est une virgule </syntaxhighlight> Il existe un module <code lang="python">csv</code> dédié aux fichiers CSV. La manipulation du fichier se fait comme suit : <syntaxhighlight lang="python"> import csv with open(chemin+nomfic, "rt") as fichier: lecteur = csv.reader(fichier, delimiter=",") contenu = [ligne for ligne in lecteur] print(contenu) </syntaxhighlight> === Utilisation de Pandas === Pandas<ref>https://pandas.pydata.org/</ref> est un module gérant les tableaux de données, appelés <em lang="en">data frames</em>. Voici quelques commandes utiles : <syntaxhighlight lang="python"> import numpy as np import pandas as pd M = np.random.rand(10, 10) # crée une matrice NumPy aléatoire de dimension 10 × 10 tableau = pd.DataFrame(M) # transforme la matrice en tableau DataFrame tableau.to_csv("tableau.csv") # enregistre le tableau dans un fichier CSV donnees = pd.read_csv("tableau.csv").to_numpy() # lit le fichier et transforme le tableau DataFrame en matrice NumPy </syntaxhighlight> == Exporter un programme Python == Vous pouvez créer un fichier « Python pur » <code>.py</code>. Pour cela, dans le menu <code>fichier/file</code> de Jupyter, choisir <code>télécharger/download</code> au format <code>.py</code> ; le fichier se trouve alors dans le répertoire de téléchargement du navigateur. == Ressources == * {{lien web | url = https://www.python.org/dev/peps/pep-0008/ | titre = PEP 8 -- Style Guide for Python Code | site = Python documentation | consulté le = 2019-03-14 }} == Notes et références == {{références}} ---- [[../Fonctions mathématiques générales|Fonctions mathématiques générales]] &lt; [[../|↑]] &gt; [[../Graphiques|Graphiques]] {{DEFAULTSORT:Elements de programmation}} [[Catégorie:Python pour le calcul scientifique (livre)]] tku9h33r5whg32qu8eqg25hjgg85gsz 767323 767322 2026-06-02T13:33:33Z Cdang 1202 /* Autres fonctions */ unescape ; harmonisation 767323 wikitext text/x-wiki Rappel : les programmes commencent par : <syntaxhighlight lang="python"> #!/usr/bin/python3 import numpy as np import matplotlib.pyplot as plt </syntaxhighlight> == Entrées et sorties == Pour permettre à l'utilisateur ou à l'utilisatrice d'entrer une valeur, nous utilisons la fonction <code lang="python">input()</code> comme évoqué précédemment (chapitre ''[[../Premiers programmes|Premiers programmes]]''), avec la syntaxe <code lang="python">''variable'' = input(''texte'')</code>. Notez que la valeur renvoyée par <code lang="python">input()</code> est une chaîne de caractères. Si vous voulez autre chose, typiquement un nombre, il faut convertir cette chaîne. Par exemple, nous demandons ici d'entrer une longueur sous la forme d'une valeur numérique : <syntaxhighlight lang="python"> longueurDefaut = 10.0 texteDemandeLongueur = f"Veuillez entrer la longueur en millimètres (valeur par défaut {longueurDefaut} mm) : " longueur = input(texteDemandeLongueur) if longueur=="": longueur=longueurDefaut else: longueur=float(longueur) print(longueur) </syntaxhighlight> Pour afficher un texte, on utilise la fonction <code lang="python">print()</code>, également présentée dans le chapitre ''[[../Premiers programmes|Premiers programmes]]'', avec la syntaxe <code lang="python">print(''texte'')</code>. Le texte à afficher peut être de n'importe quel type (entier, réel en virgule flottante, booléen, chaîne de caractères…) mais si l'on veut « mélanger » les types, il faut tout convertir en chaînes de caractères, avec la fonction <code lang="python">str()</code>, et concaténer les chaînes avec <code lang="python">+</code>. Par exemple : <syntaxhighlight lang="python"> print("La longueur vaut : "+str(longueur)+" mm.") </syntaxhighlight> Nous pouvons aussi utiliser une « chaîne “f” » ''({{lang|en|f-string}})'' : on met un le <code lang="python">f</code> devant le guillemet ouvrant et dans la chaîne, on met un champ sous la forme <code lang="python">{''nomDeVariable''}</code>. L'exemple ci-dessus devient alors : <syntaxhighlight lang="python"> print(f"La longueur vaut : {longueur} mm.") </syntaxhighlight> Les chaînes « f » sont détaillées dans la section ''[[#Chaînes de caractères|Chaînes de caractères]]'' ci-dessous. Si l'on veut introduire un retour à la ligne dans la chaîne, on utilise les caractères <code lang="python">\n</code> (contre-oblique suivie de la lettre N minuscule). Par exemple <syntaxhighlight lang="python"> print("Ceci est un texte\navec un retour à la ligne.") </syntaxhighlight> == Types de variables == === Généralités === Python définit « tout seul » le type de la variable : « <code>3</code> » sera un entier ''({{lang|en|integer}})'', « <code>3.0</code> » sera un réel à virgule flottante ''({{lang|en|float}})'', « <code>"3"</code> » sera une chaîne de caractères ''({{lang|en|string}})''. On peut connaître le type d'une variable avec la fonction <code>type()</code>. On peut tester certaines valeurs, avec le module <code>NumPy</code> : * <code>np.isnan(x)</code> indique si les valeurs de ''x'' sont des NaN ''({{lang|en|not a number}})'' ; si ''x'' est une matrice, le résultat est une matrice de booléens, l'élément [''i'', ''j''] est <code>True</code> si <code>x[i, j]</code> est un NaN ; * <code>np.isinf(x)</code> indique si les valeurs de ''x'' sont ±∞ ; si ''x'' est une matrice, le résultat est une matrice booléenne de même dimension. On peut forcer un type : * <code>int(x)</code> : transforme la valeur ''x'' en nombre entier ; * <code>long(x)</code> : " en entier long (précision illimitée) ; * <code>float(x)</code> : " en nombre réel à virgule flottante ; * <code>str(x)</code> : " en chaîne de caractères ; * <code>complex(Re, Im)</code> : crée le nombre complexe ''Re'' + ''Im''·j, j désignant la racine carrée de –1 ; * <code>list()</code> : crée une liste ; * <code>tuple()</code> : crée un n-uplet. Par exemple <syntaxhighlight lang="python"> type(3) # <class 'int'> type(float(3)) # <class 'float'> complex(1, 1) == 1 + 1j # True list("blabla") # ['b', 'l', 'a', 'b', 'l', 'a'] </syntaxhighlight> Python distingue plusieurs genres de types : * Un itérable est un objet dont on peut extraire les éléments un par un ; ce sont les objets pour lesquels on peut écrire <code> for i in ''iterable'':</code>. Il s'agit essentiellement des listes, n-uplets, chaînes de caractères, ensembles, dictionnaires et fichiers. * Un modifiable ''({{lang|en|mutable}})'' est un objet que l'on peut modifier ; par exemple une liste est modifiable — on peut changer la valeur d'un élément, en ajouter ou en enlever un — mais les n-uplets non, pas plus qu'une chaîne de caractères ou un nombre. * Un identifiable (''{{lang|en|hashable}}'', le ''{{lang|en|hashage}}'' étant une signature caractéristique d'un objet) : objet possédant un identifiant unique. Un objet identifiable est toujours non-modifiable ''({{lang|en|unmutable}})''. === Types numériques === ==== Entiers ==== Nous pouvons définir les entiers au format octal ou hexadécimal : il faut débuter le nombre par respectivement <code>0o</code> (le chiffre zéro et la lettre o) et <code>0x</code> (le chiffre zéro et la lettre x). À l'inverse, la fonction <code>hex()</code> renvoie une chaîne correspondant à l'écriture d'un entier au format hexadécimal, et <code>oct()</code> renvoie la chaîne correspondant à l'éciture en octal. Par exemple : <syntaxhighlight lang="python"> print(0o10, ";", 0x10) # 8 ; 16 print(hex(20)) # 0x14 </syntaxhighlight> ==== Réels ==== Les réels disposent de fonctions spécifiques appelées « méthodes ». Une méthode est une fonction spécifique à un type d'objets. Étant conçue ''ad hoc'', elle est souvent plus économe en ressource et en temps qu'une fonction générique. Pour appliquer la méthode <code>meth()</code> à la variable <code>x</code>, on écrit : <code>x.meth()</code>. Nous avons déjà présenté la méthode <code>''float''.as_integer_ration()</code> qui donne la fraction réduite égale à la valeur du nombre. Les réels disposent de plusieurs autres méthodes : * <code>''float''.trunc()</code> : tronque le nombre réel ; * <code>''float''.floor()</code>, <code>''float''.ceil()</code> : renvoie l'entier le plus proche, respectivement inférieur ou supérieur ; * <code>''float''.hex()</code> : renvoie une chaîne de caractères correspondant à l'écriture du nombre en hexadécimal. Par exemple : <syntaxhighlight lang="python"> a = 20. print(a.hex()) # 0x1.4000000000000p+4 print(10..hex()) # 0x1.4000000000000p+3 </syntaxhighlight> Dans le deuxième exemple, nous appliquons la méthode <code>''float''.hex()</code> directement au nombre <code>10.</code> ; le point est obligatoire car sinon, c'est un entier, pour lequel la méthode n'est pas définie. Notez que la ''méthode'' <code>''float''.hex()</code> est différentes de la ''fonction'' <code>hex()</code> : la première concerne les réels, la seconde les entiers. ==== Complexes ==== Nous avons déjà mentionné la méthode <code>''complex''.conjugate()</code> qui donne le conjugué du nombre. Un nombre complexe dispose de deux attributs : * <code>''complex''.real</code> : sa partie réelle ; * <code> ''complex''.imag</code> : sa partie imaginaire. Par exemple : <syntaxhighlight lang = "python"> a = 5+2j print(a.conjugate(), ";", a.real, ";", a.imag) # (5-2j) ; 5.0 ; 2.0 </syntaxhighlight> === Chaînes de caractères === ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/inputoutput.html | titre = 7. Input and Output | site = Python Documentation | consulté le = 2019-04-06 }} ==== Généralités ==== Il existe en fait trois manières de définir une chaîne de caractères : * avec des guillemets simples ou doubles comme vu précédemment : <code>"…"</code> ou bien <code>'…'</code> ; * avec trois guillemets doubles : <code>"""…"""</code> : cela permet d'avoir une chaîne de caractères s'étendant sur plusieurs lignes, les retours de ligne étant pris en compte ; c'est utilisé en particulier pour la description des fonctions (''{{lang|en|docstrings}}'', voir ci-après) ; * avec des guillemets précédés d'un « r », <code>r"…"</code> ou <code>r'…'</code> : cela permet d'interpréter les barres de fraction inverses « \ » comme un caractère « normal » et non comme un caractère d'échappement (voir ci-après) ; cela est utile lorsque l'on utilise les possibilités LaTeX dans le tracé de graphiques (voir plus loin) ; * avec des guillemets précédés d'un « f », <code>f"…"</code> ou <code>f'…'</code> : cela permet d'utiliser des variables formatées (voir ci-après). Une chaîne de caractères n'est pas modifiable. Si l'on veut remplacer un caractère, l'insérer ou le supprimer, il faut transformer la chaîne en liste, avec la commande <code>list()</code>, puis rassembler la liste en la joignant ''({{lang|en|join}})'' à une chaîne vide : <syntaxhighlight lang="python"> chaine = "blabla" chaineList = list(chaine) chaineList[2] = "c" chaine = "".join(chaineList) print(chaine) # blcbla </syntaxhighlight> Dans une chaîne simple <code>"…"</code> ou <code>'…'</code>, on peut introduire un retour à la ligne avec <code>\n</code>. ==== Substitution de variables ==== Lorsque l'on veut utiliser des variables, on fait précéder les guillemets d'un « f » et l'on écrit les noms de vrariables entre accolades. Par exemple : <syntaxhighlight lang="python"> monde = "world" chaine = f"Hello {monde}!" print(chaine) # Hello world! </syntaxhighlight> On peut indiquer la taille de la chaîne générée à partir de la variable sous la forme <code>{nomVariable:taille}</code>, la taille étant un entier. Par exemple : <syntaxhighlight lang="python"> chiffre1 = 1 nom1 = "un" chiffre2 = 2 nom2 = "deux" chaine = f"{nom1:5} : {chiffre1:5d}\n{nom2:5} : {chiffre2:5d}" print(chaine) # un : 1 # deux : 2 </syntaxhighlight> Vous remarquez que l'on ajoute un « d » pour les entiers décimaux, et que les nombres sont alignés à droite. Si le nombre est un nombre réal à virgule flottante ''({{lang|en|float}})'', on peut indiquer le nombre de décimales sous la forme <code>.''n''f</code> : <syntaxhighlight lang="python"> chaine = f"{np.pi:.5f}" print(chaine) # 3.15169 </syntaxhighlight> Avec la syntaxe <code>''m''.''n''f</code>, on indique également que la totalité du nombre doit occuper ''m'' caractères. Pour convertir un nombre en caractère Unicode correspondant, on utilise la lettre c : <syntaxhighlight lang="python"> nompi = 0x03c0 # Caractère Unicode π : U+03C0 chaine = f"{nompi:c} = {np.pi:.5f}" print(chaine) # π = 3.14159 </syntaxhighlight> La classe ''str'' dispose également de la méthode <code>.format()</code>. On indique un n-uplet de chaînes (ou de nombres) à la méthode et l'on met des accolades dans la chaîne principale ; les accolades sont remplacées dans l'ordre des chaînes de la méthode. On peut changer l'ordre en indiquant quelle valeur utiliser dans quelle accolade. Par exemple : <syntaxhighlight lang="python"> chaine1 = "On compte {} puis {}".format(1, 2) chaine2 = "On compte {0} puis {1}. Mais à rebours, on compte {1} puis {0}.".format("un", "deux") print(chaine1, "\n", chaine2) # On compte 1 puis 2 # On compte un puis deux. Mais à rebours, on compte deux puis un. </syntaxhighlight> L'utilisation du caractère pourcent « % » permet d'utiliser la mise en forme <code>sprintf()</code> du langage C : <syntaxhighlight lang="python"> chaine = "π = %.5f" % np.pi print(chaine) # π = 3.14159 </syntaxhighlight> ; Exemple <nowiki>:</nowikI> barre de progression : Voici une fonction affichant une barre de progression, pour la ''i''-ème étape d'un processus ayant ''n'' étapes (pour la notion de fonction, voir la section ci-après ''[[#Fonction|Fonction]]''). : NB : nous avons utilisé les codes Unicode pour l'exemple, mais on peut évidemment copier le caractère, par exemple depuis une table Unicode ou une page Web<ref>Pour le point médian : ''{{W|Table des caractères Unicode/U0080}}'' ou ''{{W|Point médian}}''. Pour le pavé : ''{{W|Table des caractères Unicode/U2580}}''.</ref>, et le coller dans le code, comme nous l'avons fait dans le commentaire. <syntaxhighlight lang="Python"> def barre_progression(i, n, largeur=40): """ Affiche une barre de progression Entrées : — i : étape en cours, entier ; — n : nombre d'étapes à réaliser, entier ; — largeur : nombre de caractères total de la barre, entier. Sortie : affichage de la barre de progression. """ taux = i/n fait = int(largeur * taux) barre = f"{0x2588:c}" * fait + f"{0x00b7:c}" * (largeur - fait) # U+2588 : pavé "█" ; U+00B7 : point médian "·" print(f"Progression | {barre} | {100*taux:3.1f} %") barre_progression(25, 100) # Progression | ██████████······························ | 25.0 % </syntaxhighlight> ==== Méthodes des chaînes ==== Le type ''str'' dispose d'un certain nombre de méthodes. Nous avons déjà vu les méthodes <code>''str''.join()</code> et <code>''str''.format()</code>, en voici quelques autres : * <code>''str''.capitalize()</code> : met le premier caractère en capitale (majuscule) et les autres en minuscule ; * <code>''str''.lower()</code> : met tout en minuscules ''({{lang|en|lowercase}})'' ; * <code>''str''.upper()</code> : met tout en capitales ''({{lang|en|lowercase}})'' ; * <code>''str''.center(''n'')</code> : met la chaîne au centre d'une chaîne de longueur ''n'', en complétant avec des espaces ; on peut compléter avec d'autres caractères avec <code>''str''.center(''n'', ''c'')</code>, par exemple <code>"a".center(7, ".")</code> donne <code>"....a...."</code> ; * <code>''str''.ljust(''n'', ''c'')</code> et <code>''str''.rjust(''n'', ''c'')</code> : comme <code>.center()</code> mais la chaîne est respectivement alignée au fer à gauche ''({{lang|en|left}})'' et à droite ''({{lang|en|right}})'' ; * <code>''str''.isdigit()</code> : booléen vrai si tous les caractères sont des nombres ; * <code>''str''.find(''sous-chaine'')</code>, <code>''str''.rfind(''sous-chaine'')</code> : indique respectivement le premier emplacement et le dernier emplacement de la sous-chaîne dans la chaîne ; * <code>''str''.partition(''séparateur'')</code> : retourne un triplet avec la portion de chaîne avant le séparateur, le séparateur puis la portion de chaîne après le séparateur ; * <code>''str''.replace(''ancien'', ''nouveau'')</code> : remplace la chaîne ''ancien'' par la chaîne ''nouveau'' dans la chaîne ; * <code>''str''.split(''séparateur'')</code> : découpe la chaîne au niveau des séparateurs et renvoie une liste. ==== Autres fonctions ==== La fonction <code>chr()</code> transforme un code Unicode en caractère. Par exemple, <code>chr(97)</code> donne <code>"a"</code> et <code>chr(0x03c0)</code> donne <code>"π"</code>. Si on veut créer une liste de caractères qui se suivent, on peut par exemple utiliser : <syntaxhighlight lang="python"> [chr(x) for x in range(97, 102)] # ['a', 'b', 'c', 'd', 'e'] </syntaxhighlight> Si on veut créer une liste de nombres sous la forme de chaînes de caractères, on peut utiliser la commande <code>str()</code> vue ci-dessus. Par exemple : <syntaxhighlight lang="python"> [str(x) for x in range(1, 6)] # ['1', '2', '3', '4', '5'] </syntaxhighlight> Pour la syntaxe, voir ci-dessous la section [[#Définition en compréhension|''Définition en compréhension'']]. Ainsi, dans l'exemple de la barre de progression ci-dessus, on peut utiliser la solution suivante pour constituer la barre : <syntaxhighlight lang="python"> barre = chr(0x2588) * fait + chr(0x00b7) * (largeur - fait) # U+2588 : bloc ; U+00B7 : point médian </syntaxhighlight> Rappel : le module <code>html</code> permet d'utiliser les entités HTML : <syntaxhighlight lang="python"> import html … print(html.entities.html5["alpha;"]+html.entities.html5["middot;"]) # α· </syntaxhighlight> L'entité HTML <code>&xxx;</code> s'obtient par <code>html.entities.html5["xxx;"]</code>, donc en enlevant la perluète ; mais cela ne fonctionne pas avec les codes Unicode. Pour cela, on peut utiliser la commande <code>html.unescape()</code>. Ainsi, dans l'exemple de la barre de progression ci-dessus, on peut utiliser la solution suivante pour constituer la barre : <syntaxhighlight lang="python"> barre = html.unescape("&#x2588;") * fait + html.entities.html5["middot;"] * (largeur - fait) # U+2588 : bloc ; U+00B7 : point médian </syntaxhighlight> La commande <code>html.unescape()</code> interprète une chaîne complète, par exemple <syntaxhighlight lang="python"> print(html.unescape("L'esperluette est le caractère &amp;")) # L'esperluette est le caractère & </syntaxhighlight> == Manipulation de listes == Les listes sont une structure de données fondamentale en Python. ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/datastructures.html | langue = en | titre = 5. Data structures | site = Python documentation | consulté le = 2019-03-16 }} === Copie d'une liste === Contrairement à d'autres types, lorsque vos écrivez <code>b = a</code> avec des listes, vous ne créez pas une copie de la variable <code>a</code>, vous créez un ''alias'' : l'objet <code>b</code> est un autre nom de l'objet <code>a</code>. En particulier, si vous modifiez <code>b</code>, vous modifiez en fait <code>a</code>. Par exemple : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a b[2] = 5 print(a, b) # [1, 2, 5, 4] [1, 2, 5, 4] </syntaxhighlight> Si l'on veut créer une copie de <code>a</code>, il faut utiliser <code>a[:]</code> ou bien <code>a.copy()</code> : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a[:] c = a.copy() b[2] = 5 c[2] = 6 print(a, b, c) # [1, 2, 3, 4] [1, 2, 5, 4] [1, 2, 6, 4] </syntaxhighlight> === Méthodes de listes === Pour modifier une liste, vous disposez des méthodes suivantes : * <code>a.append(x)</code> : ajoute l'élément <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.extend(x)</code> : ajoute la liste <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.append(i, x)</code> : aoute l'élément <code>x</code> ''avant'' l'interstice ''i'' de la liste <code>a</code> ; * <code> x = a.pop(i)</code> : enlève l'élément ''i'' de la liste <code>a</code> et le met dans la variable <code>x</code> ; <code> x = a.pop()</code> enlève le dernier élément de la liste ; * <code>a.clear()</code> : vide la liste <code>a</code> ; * <code>a.sort()</code> : trie la liste par ordre croissant ; * <code>a.sort(reverse = True)</code> : trie par ordre décroissant ; * <code>a.reverse()</code> : inverse l'ordre de <code>a</code>. Pour supprimer l'élément à l'indice ''i'', au lieu d'utiliser <code>a.pop(i)</code>, on peut aussi utiliser <syntaxhighlight lang="python"> del(a[i]) </syntaxhighlight> Pour trier une liste, on peut aussi utiliser la fonction <code>sorted()</code>, ce qui permet par exemple de conserver la liste originale, non triée : <code>b = sorted(a)</code>. La fonction <code>sorted()</code> fonctionne avec tous les objets « itérables » comme par exemple une chaîne de caractères : <syntaxhighlight lang="python"> a = "ahjbfk" print(sorted(a)) # ['a', 'b', 'f', 'h', 'j', 'k'] </syntaxhighlight> Pour mettre en évidence la performance de la méthode <code>''list''.sort()</code> par rapport à la fonction générique <code>sorted()</code> : <syntaxhighlight lang="python"> import numpy as np import time a = np.random.rand(int(1e7)) t1 = time.perf_counter() b = sorted(a) # Fonction générique t2 = time.perf_counter() a.sort() # Méthode spécifique t3 = time.perf_counter() print("Sorted :", t2-t1, " s ; .sort :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # Sorted : 14.2... s ; .sort : 1.1... s ; rapport : 12.6... </syntaxhighlight> Par rapport à une valeur donnée : * <code>a.remove(x)</code> : retire la première occurrence de la valeur <code>x</code> de la liste <code>a</code> ; * <code>a.index(x)</code> : indique l'indice où se trouve la première occurrence de la valeur <code>x</code> ; * <code>a.count(x)</code> : indique le nombre de fois que l'on trouve la valeur <code>x</code> dans la liste <code>a</code>. === Définition en compréhension === La [[w:fr:Liste en compréhension|définition en compréhension]] ''({{lang|en|list comprehension}})'' est une méthode permettant de construire des listes en indiquant simplement des axiomes, des consignes de filtrage. Cette méthode est élégante car proche de la notation mathématique et compacte, mais c'est une méthode itérative donc lente par rapport à une méthode vectorisée fournie par le module NumPy. Par exemple, pour créer la liste des carrés des nombres entiers entre 0 et 9, il suffit d'écrire <syntaxhighlight lang="python"> carre = [x**2 for x in range(10)] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x^2 | x \in [0 ; 9] \}</math>. Si l'on veut la liste des nombres strictement inférieurs à 20 dont le carré est supérieur à 10, on peut écrire : <syntaxhighlight lang="python"> X = [x for x in range(20) if x**2 > 10] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x | x \in [0 ; 19], x^2 > 10 \}</math>. Pour mettre en évidence la performance du calcul vectorisé par rapport à la méthode itérative : <syntaxhighlight lang="python"> import time import numpy as np n = int(1e7) # taille de la liste t1 = time.perf_counter() carre = [x**2 for x in range(n)] # Définition en compréhension t2 = time.perf_counter() carre2 = np.arange(n)**2 # Calcul vectorisé t3 = time.perf_counter() print("En compréhension : ", t2-t1, "s ; vectorisé :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # En compréhension : 4.515... s ; vectorisé : 0.156... s ; rapport : 28.982... </syntaxhighlight> == Structure d'un programme == Un programme est simplement une suite d'instructions. Dans les environnements Unix BSD, un programme Python peut être considéré comme un script c'est-à-dire qu'il suffit de taper son nom dans l'invite de commande ''({{lang|en|shell}})'' sans avoir à invoquer <code>python</code>. Le programme doit alors commencer par un en-tête normalisé surnommé ''{{lang|en|[[wikt:shebang|shebang]]}}'' : <syntaxhighlight lang="python"> #!/usr/bin/env python3 </syntaxhighlight> Ce ''{{lang|en|shebang}}'' est inutile avec Jupyter. L'en-tête peut également contenir la description de l'encodage du fichier texte, typiquement : <syntaxhighlight lang="python"> # coding: utf-8 </syntaxhighlight> Le codage UTF-8 est le codage par défaut pour Python 3, il est donc inutile de l'indiquer. Les commentaires sont introduits par le croisillon <code>#</code>. On peut grouper une suite d'instructions dans un bloc. Un bloc d'instructions commence par deux-points « <code>:</code> » et est identé, c'est-à-dire qu'il a une marge constituée de quatre espaces — on peut aussi utiliser une tabulation mais il ne faut pas mélanger les deux méthodes ; les tabulations sont déconseillées, il vaut mieux utiliser quatre espaces<ref>{{lien web | url = https://www.python.org/dev/peps/pep-0008/#tabs-or-spaces | titre = Tabs or Spaces? | site = Python documentation | consulté le = 2019-03-14 }}</ref>. Pour terminer le bloc, il suffit simplement de revenir en début de ligne ; contrairement à d'autres langages, il n'y a pas de commende de fin ''({{lang|en|end}})'', c'est l'indentation qui définit le bloc. : # début du bloc ''instruction 1'' ''instruction 2'' … ''dernière instruction du bloc'' ''instruction hors bloc'' Par exemple, une exécution conditionnelle <code>if</code> ou une boucle <code>for</code> exécute un bloc d'instruction. Si l'on a besoin d'un bloc d'instruction qui « ne fait rien », on utilise l'instruction <code>pass</code>. == Structures de contrôle == '''Boucle itérative''' La boucle itérative s'écrit : <syntaxhighlight lang="python"> for <variable> in <itérable>: <bloc d’instructions> </syntaxhighlight> Si l'on veut que la variable prenne ''n'' valeurs de 0 à ''n'' – 1, on utilise l'instruction <code>range()</code> : <syntaxhighlight lang="python"> for i in range(5): print(i) print("Fin de la boucle") </syntaxhighlight> <code>[▶]</code> 0 1 2 3 4 Fin de la boucle En fait, la commande <code>range()</code> extrait des valeurs de l'ensemble des nombres entiers ; on peut ainsi utiliser le découpage en tranches, par exemple <code>range(2, 5)</code>pour avoir la « liste » <code>[2, 3, 4]</code>. Notez que <code>range()</code> ne crée pas à proprement parler une liste, cela crée un objet de type ''« {{lang|en|range}} »'' (plage, intervalle) ; pour avoir une liste, il faut écrire <code>list(range(n))</code>. Dans une boucle, la commande <code>continue()</code> saute la fin du bloc d'instruction et passe à la valeur suivante de la boucle. La commande <code>break()</code> interrompt la boucle et passe à la suite. '''Exécution conditionnelle''' L'exécution conditionnelle s'écrit : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> </syntaxhighlight> On peut utiliser les commandes <code>elif</code> ''(else if'') et <code>else</code> : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> elif <booléen>: <bloc d’instructions> else: <bloc d’instructions> </syntaxhighlight> Notez que le test d'une condition est gourmand en ressources. S'il s'agit de savoir si l'on effectue une opération mathématique simple ou pas, on peut remplacer le test par une multiplication par un booléen (<code>True</code> vaut 1, <code>False</code> vaut 0). Par exemple, plutôt que d'écrire <syntaxhighlight lang="python"> if a > 0: b = b - c </syntaxhighlight> mieux vaut écrire : <syntaxhighlight lang="python"> b = b - (a > 0)*c </syntaxhighlight> '''Boucle antéconditionnée''' La boucle antéconditionnée s'écrit : <syntaxhighlight lang="python"> while <booléen>: <bloc d’instructions> </syntaxhighlight> Cette boucle peut contenir des instructions <code>continue()</code> et <code>break()</code>. == Fonction == La déclaration d'une fonction utilise la commande <code>def</code>. La fonction est un bloc d'instructions. Si elle doit renvoyer des valeurs, on utilise la commande <code>return</code>. Par exemple <syntaxhighlight lang="python"> def nombres(n): """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo a = nombres(3) print(a) </syntaxhighlight> La fonction commence par une chaîne de caractères qui la décrit. Cette chaîne peut être récupérée automatiquement par certains logiciels pour faire une documentation automatique. Si la description prend plusieurs lignes, elle commence et finit par trois double-guillemets <code>"""…"""</code> ; en fait, par convention, même si cela n'est pas obligatoire, les descriptions sont toutes encadrées de trois double-guillemets. Cette description est appelée ''{{lang|en|docstring (documentation string)}}''. Pour récupérer les ''{{lang|en|docstrings}}'' : <syntaxhighlight lang="python"> def foo(): """Cette fonction ne fait rien""" pass print(foo.__doc__) # Cette fonction ne fait rien </syntaxhighlight> L'instruction <code>input()</code> permet à l'utilisateur de saisir une valeur. La valeur est retournée sous la forme d'une chaîne de caractères qui est ensuite convertie en nombre réel avec l'instruction <code>float()</code>. On peut définir une valeur par défaut en l'indiquant dans l'en-tête de la définition de la fonction, de la manière suivante : <syntaxhighlight lang="python"> def nombres(n=1): # valeur par défaut : 1 """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo </syntaxhighlight> Si le paramètre à initialiser est de type modifiable ''({{lang|en|mutable}})'', comme par exemple une liste, il faut procéder comme suit : <syntaxhighlight lang="python"> def fooFonction(fooListe=None): # valeur par défaut : n'existe pas """Description""" if fooListe = None: fooListe = [] # initialisation <suite des instructions> </syntaxhighlight> Par défaut, les variables sont locales. On peut rendre une variable globale avec l'instruction <code>global</code> ''à l'intérieur de la fonction'', avant l'utilisation de la variable. Par exemple : <syntaxhighlight lang="python"> a = 1 b = 1 def toto(): """Test de variable globale. Entrée : aucune. Sortie : aucune.""" global a a = 2 b = 2 toto() print("a =", a, "; b =", b) # a = 2 ; b = 1 </syntaxhighlight> Pour être plus précis : si une variable n'est pas assignée dans une fonction, alors Python va chercher une variable du même nom à l'extérieur de la fonction. Mais à partir du moment où la variable est assignée dans la fonction, elle devient locale ''sauf'' si l'on a utilisé l'instruction <code>global</code>. Si l'on s'attend à un nombre indéfini d'arguments, on utilise la notion d'empaquetage/dépaquetage ''({{lang|en|packing/unpacking}})''<ref>{{lien web | url = https://deusyss.developpez.com/tutoriels/Python/args_kwargs/ | titre = Introduction à *args et **kwargs | consulté le = 2019-03-09 | site = Developpez.com }}.</ref>. L'empaquetage consiste à mettre les arguments dans un n-uplet, le dépaquetage consiste à développer un n-uplet en plusieurs variables. Cela se fait en mettant un astérisque ''({{lang|en|splat}})'' « <code>*</code> » devant le nom de la variable. Par convention, on utilise le nom de variable <code>*args</code> mais cela n'est pas obligatoire. <syntaxhighlight lang="python"> def concatenation(*args): """Concatène des chaînes de caractères Entrée : *args, n-uplet de chaînes de caractères. Sortie : resultat, chaîne de caractères.""" resultat = "" for i in args: resultat = resultat + i return resultat concatenation("a", "foo", "toto") # 'afoototo' </syntaxhighlight> À l'inverse, si une fonction doit recevoir plusieurs paramètres, on peut à la place lui transmettre une liste à dépaqueter : <syntaxhighlight lang="python"> def addition(a, b): """Ajoute deux nombres Entrées : — a : réel ; — b : réel. Sortie : a+b, réel""" return a+b arg = (1, 2) addition(*arg) # 3 </syntaxhighlight> On peut aussi empaqueter/dépaqueter un dictionnaire, on utilise pour cela deux astérisques « <code>**</code> ». Par convention, on utilise le nom <code>**kwargs</code> sans que cela soit obligatoire. L'instruction <code>lambda</code> permet de créer de petites fonctions ne contenant pas de boucle ni de branchement conditionnel. Cependant, si la déclaration est courte et compacte, le code n'est pas toujours facilement lisible ; l'utilisation de cette instruction n'est pas recommandée. Par exemple l'expression <syntaxhighlight lang="python"> f = lambda x: 2*x </syntaxhighlight> est la même chose que <syntaxhighlight lang="python"> def f(x): """Calcule le double. Entrée : x, réel. Sortie : 2*x, réel.""" return 2*x </syntaxhighlight> {{note|L'instruction <code>eval()</code> exécute une chaîne de caractères, c'est-à-dire traite une chaîne de caractères comme si c'étaient des instructions données à Python. Cette instruction est à éviter pour deux raisons : # Un utilisateur malveillant pourrait entrer du code malveillant dans la chaîne de caractères. # L'exécution est lente puisque Python doit compiler la chaîne à la volée. Cette instruction peut en général être remplacée par une autre instruction. }} == Gestion des erreurs == Dans un bloc d'instructions, on peut utiliser la structure <code>try:… except:</code>. Le bloc après <code>try</code> est exécuté ; si une erreur se déclare dans ce bloc, alors le bloc <code>except</code> s'exécute. Par exemple <syntaxhighlight lang="python"> try: 1/0 # Génère une erreur except: print("Division par zéro") # Cette instruction est donc exécutée </syntaxhighlight> On peut compléter avec <code>else:</code> et <code>finally:</code> : <syntaxhighlight lang="python"> try: <code à exécuter> except: <s’exécute en cas d’erreur> else: <s’exécute s’il n’y a pas d’erreur> finally: <s’exécute dans tous les cas> </syntaxhighlight> On peut séparer les différents types d'erreur : <syntaxhighlight lang="python"> try: <code à exécuter> except ValueError: print("Valeur erronée") except TypeError: print("Type erroné") </syntaxhighlight> Les types d'erreur les plus courants sont : * <code>NameError</code> : le nom de variable n'existe pas ; * <code>TypeError</code> : la valeur n'est pas du bon type ; * <code>ValueError</code> : la valeur n'est pas compatible avec ce qui est attendu ; * <code>RuntimeError</code> : type d'erreur général. On peut aussi créer ses propres erreurs : si une situation erronée survient, on peut « lever » une exception avec <code>raise</code>. Par exemple <syntaxhighlight lang="python"> if a < 0: raise ValueError("La valeur doit être positive") </syntaxhighlight> ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/errors.html | titre = Errors and exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} * {{lien web | url = https://docs.python.org/3/library/exceptions.html | titre = Built-in Exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} == Exercices == === Calcul du PGCD et du PPCM par l'algorithme d'Euclide === {{loupe|w:Algorithme d'Euclide}} Écrire un programme Python qui demande deux nombres entiers et affiche leurs PGCD et PPCM. Le programme utilisera l'algorithme d'Euclide. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """Programme : euclide.py Auteur : User:cdang date : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : calcule le PGCD et le PPCM de deux nombres entiers. Entrée ------ au clavier, saisie de deux nombres entiers. Sorties ------- à l'écran, affichage du PGCD et du PPCM. """ # *************** # *************** # ** Fonctions ** # *************** # *************** def euclide(): """Calcule le PGCD et le PPCM avec l'algorithme d'Elclide Entrée ------ Aucune, la saisie des paramètres fait partie de la fonction Sortie ------ affichage du PGCD et du PPCM """ print("***** Algorithme d'Euclide *****\n") a0 = int(input("Premier nombre entier : a = ")) b0 = int(input("Second nombre entier : b = ")) a = a0 b = b0 r = a%b # initialisation while (r != 0) : # algorithme d'Euclide a = b b = r r = a%b # affichage des résultats print("PGCD(", a0, ", ", b0, ") = ", b) print("PPCM(", a0, ", ", b0, ") = ", a0*b0//b) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* euclide() </syntaxhighlight> On peut simplifier la boucle centrale : <syntaxhighlight lang="python"> while b: # s'exécute tant que b n'est pas 0 a, b = b, a % b # affectation de liste à liste return a </syntaxhighlight> {{boîte déroulante fin}} Notez que le module NumPy propose l'instruction <code>gcd()</code> : <syntaxhighlight lang="python"> import numpy … print(numpy.gcd(a, b)) </syntaxhighlight> === Tours de Hanoï === {{loupe|w:Tours de Hanoï}} Écrire un programme Python qui demande le nombre ''n'' de plateaux et affiche les manipulations nécessaires pour déplacer la pile d'un emplacement à un autre. Le programme utilisera l'algorithme récursif. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """nom : hanoi.py auteur : User:cdang date de création : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : résout le problème des tours de Hanoï Entrées ------- trois chaînes de caractères (nom des piliers) Sorties ------- une chaîne de caractères (liste des opérations) """ # *************** # *************** # ** Fonctions ** # *************** # *************** def hanoi(a, b, c, n): """Résout le problème des tours de Hanoï de manière récursive But : déplace la pile de n disques du piler a au pilier b Entrées ------- a, b c : chaînes de 1 caractère, référence des emplacements ; n : entier, nombre de disques sur l'emplacement a Sorties ------- operations : chaînes de caractères décrivant les opérations """" if n>1: operations = hanoi(a, c, b, n-1) operations = operations+a+"→"+b+" ; " operations = operations+hanoi(c, b, a, n-1) else: operations = a+"→"+b+" ; " return operations # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* resultat = hanoi("1", "2", "3", 3) print(resultat) </syntaxhighlight> {{boîte déroulante fin}} === Lancer de rayons === [[Fichier:Lentille hemispherique perspective.svg|vignette|Lentille hémisphérique.]] Considérons une lentille hémisphérique de rayon R faite d’un verre d’indice de réfraction ''n''. Nous plaçons une source ponctuelle à une distance ''d'' du dioptre plan, sur l’axe optique. Tracer des rayons partant de la source et traversant la lentille. {{clear}} {{Boîte déroulante/début |titre=Analyse d’optique géométrique}} [[Fichier:Lentille hemispherique analyse geometrique.svg|vignette|Analyse géométrique du problème.]] Il s’agit d’un problème ayant une symétrie de révolution par rapport à l’axe optique. Nous pouvons nous réduire à un problème plan en nous plaçant dans un plan contenant l’axe optique ; l’axe optique est encore un axe de symétrie orthogonale, nous pouvons donc nous contenter d'étudier un demi-plan. Pour simplifier, nous plaçons le centre du dioptre sphérique à l’origine O du repère. L’axe optique est l’axe ''x'' et l'axe perpendiculaire, vertical sur la figure, c’est l’axe ''y''. Les coordonnées de la source sont donc (-''d'' ; 0). Le rayon issu de la source et faisant un angle θ avec l’axe ''x'' frappe le dioptre plan à l’altitude ''h''. Nous avons : : ''h'' = ''d'' ⋅ tan θ. L’angle d’incidence vaut θ. D’après la loi de Snell-Descartes, l'angle de réfraction θ<sub>2</sub> vaut : : θ<sub>2</sub> = arcsin((sin θ) / ''n''). Le rayon réfracté passe par le points de coordonnées (0, ''h''). L’équation de la droite est donc : : ''y'' = a ⋅ ''x'' + ''h'' avec : ''a'' = tan θ<sub>2</sub>. L’équation du cercle de centre O et de rayon R est : : ''x''<sup>2</sup> + ''y''<sup>2</sup> = R<sup>2</sup>. Les coordonnées (''x''<sub>M</sub>, ''y''<sub>M</sub>) de l’intersection M du rayon avec le dioptre sphérique vérifient les deux équations. Par substitution, nous obtenons une équation du second degré en ''x'' que nous savons résoudre : : ''x''<sub>M</sub><sup>2</sup> + (''a'' ⋅ ''x''<sub>M</sub> + ''h'')<sup>2</sup> = R<sup>2</sup> : ⇔ (1 + ''a''<sup>2</sup>) ⋅ ''x''<sub>M</sub><sup>2</sup> + 2 ⋅ ''a'' ⋅ ''h'' ⋅ ''x''<sub>M</sub> + ''h''<sup>2</sup> – R<sup>2</sup> = 0. D’après les propriétés du cercle, le rayon est perpendiculaire à la tangente. Le rayon [OM] est donc normal au dioptre en M. Nous pouvons déterminer l’angle d’incidence θ<sub>i</sub> par le produit scalaire : : <math>\begin{pmatrix} 1 \\ a \end{pmatrix} \cdot \begin{pmatrix} x_\mathrm{M} \\ y_\mathrm{M} \end{pmatrix} = \sqrt{1^2 + a^2} \cdot \mathrm{R} \cdot \cos(\theta_\mathrm{i})</math> ce qui nous permet de calculer cet angle : : <math>\theta_\mathrm{i} = \operatorname{arcos} \left ( \frac{x_\mathrm{M} + a \cdot y_\mathrm{M}}{\mathrm{R} \cdot \sqrt{1^2 + a^2} } \right )</math> Comme nous passons vers un milieu d’indice plus faible, il y a un risque de réflexion totale. L’angle limite est : : θ<sub>max</sub> = arcsin(1/''n''). Si l’on a θ<sub>i</sub> &gt; θ<sub>max</sub>, le rayon repart vers l’intérieur. Nous ne traçons pas le rayon car cela nous emmènerait trop loin dans l’analyse. En revanche, si θ<sub>i</sub> ≤ θ<sub>max</sub>, alors nous pouvons appliquer la loi de Snell-Descartes pour avoir l’angle de réfraction θ<sub>e</sub> : : θ<sub>e</sub> = arcsin(''n'' ⋅ sin θ<sub>i</sub>). Pour tracer le rayon sortant, il nous faut l’angle θ<sub>3</sub> par rapport à l’horizontale. L’angle du rayon [OM] par rapport à l’horizontal vaut arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>), nous avons donc : θ<sub>3</sub> = arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>) + θ<sub>e</sub>. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Analyse algorithmique}} '''Structure des données''' Le problème est décrit par trois paramètres : # Le rayon <code>R1</code> de la lentille, en milliètres (réel en virgule flottante). # L’indice du verre, <code>n</code> sans dimension (réel en virgule flottante). L’indice de l’air vaut 1. # La distance de la source au dioptre d’entrée plan, <code>d</code> en millimètres (réel en virgule flottante). Un rayon est caractérisé par quatre paramètres : # L’angle d’émission <code>theta1</code> en radians (réel en virgule flottante). # L’angle de réfraction dans la lentille <code>theta2</code> en radians (réel en virgule flottante). # Les cordonnées <code>M</code> en millimètre (vecteur de dimension 2 <code>([x, y])</code> de réels en virgule flottante) du point d’intersection du rayon avec le dioptre sphérique. # L’angle de réfraction dans l’air après la lentille <code>theta3</code> en radians (réel en virgule flottante). Pour le calcul et le tracé, nous avons besoin des paramètres intermédiaires suivants : * l’altitude ''y'' = <code>h</code> en millimètres (réel en virgule flottante) à laquelle le rayon frappe le dioptre plan d’entrée ; * l’angle d’incidence du rayon avec le dioptre sphérique <code>thetaint</code> en radians (réel en virgule flottante). Les angles sont stockés en radians car c’est l’unité naturelle pour le calcul mais nous affichons les valeurs en degrés. Comme le calcul de conversion est récurrent, nous conservons les facteurs <code>degversrad</code> (conversion des degrés vers les radians, facteur valant π/180, réel en virgule flottante) et <code>radversdeg</code> (conversion des radians vers les degrés, facteur valant 180/π, réel en virgule flottante). '''Fonctions''' Nous avons besoin d’une fonction qui calcule les trois paramètres du rayon <code>(theta2, M, theta3)</code> à partir de l’angle d’émission <code>theta1</code>. Nous appelons cette fonction <code>lanceRayon()</code>. Cette fonction fait appelle à une fonction qui calcule l’angle du rayon réfracté à partir de l’angle du rayon incident <code>theta1</code>, les deux angles étant par rapport à la normale au dioptre au point considéré. Nous appelons cette fonction <code>refrac()</code>. La recherche de l’intersection <code>M</code> du rayon avec le dioptre sphérique nécessite de résoudre une équation du second degré. Nous utilisons pour cela la recherche des racines du polynôme en <code>x</code> avec la fonction <code lang="python">numpy.polynomial.polynomial.polyroots()</code>. D’après la configuration du problème géométrique, si l’on s’assure que le rayon frappe bien la lentille (0 ≤ <code>h</code> ≤ <code>R1</code>) alors nous sommes sûrs que le problème a deux solutions réelles (une positive et une négative) ou, dans le cas dégénéré où <code>h == R1</code>, une valeur unique <code>x == 0</code>. Comme nous recherchons la valeur positive, nous sélectionons la plus grande des deux racines. Pour la gestion de la réflexion interne : dans la fonction <code>refrac()</code>, nous vérifions les conditions de réflexion totale et si elles sont remplies, alors nous générons une erreur (commandes <code lang="python">try… except</code> et <code lang="python">raise ValueError</code>). Cette erreur est propagée à la fonction <code>lanceRayon()</code> : <code>lanceRayon()</code> appelle la fonction <code>refrac()</code> et si cette fonction renvoie une erreur, alors <code>lanceRayon()</code> renvoie également une erreur. Pour trouver l’angle d’émission <code>thetaLimite</code> provoquant la réflexion totale (en radians, réel en virgule flottante), nous effectuons une recherche par dichotomie : * nous partons de l’angle maximum possible, lorsque le rayon frappe le sommet de la lentille, et nous appelons la fonction <code>lanceRayon()</code> ; si cela ne génère pas d’erreur, alors nous pouvons aller jusqu’à cette valeur, la recherche est terminée ; si cela génère une erreur, alors nous divisons la valeur par deux ; * à une étape de la recherche donnée, si <code>lanceRayon()</code> ne génère pas d’erreur avec l’angle testé, alors nous savons que l’angle limite est supérieur à cette valeur ; cette valeur minore donc la valeur recherchée ; si au contraire <code>lanceRayon()</code> génère une erreur, alors c’est que l’angle est trop important, cette valeur majore donc la valeur recherchée ; nous pouvons ainsi resserer l’intervalle de recherche ; * nous nous arrêtons lorsque les valeurs haute et basse sont suffisamment proche. Concrètement : # Nous définissons une variable <code>angleHaut</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus bas connu provoquant la réflexion totale. # Nous définissons une variable <code>angleBas</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus haut connu ne provoquant pas de réflexion totale. Sa valeur initiale est 0. L’angle limite recherché est donc entre <code>angleBas</code> et <code>angleHaut</code>. # Nous définissons l’angle <code>angleTest</code> comme étant la moyenne entre <code>angleBas</code> et <code>angleHaut</code>. Si <code>lanceRayon(angleTest)</code> génère une erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleHaut</code> (puisque c’est une valeur provoquant la réflexion totale et qu’elle est plus basse que la valeur actuelle d’<code>angleHaut</code>). À l’inverse, si <code>lanceRayon(angleTest)</code> ne génère pas d’erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleBas</code> (puisque c’est une valeur ne provoquant pas la réflexion totale et qu’elle est plus haute que la valeur actuelle d’<code>angleBas</code>). # Nous arrêtons la procédure lorsque l’écart entre <code>angleBas</code> et <code>angleHaut</code> est inférieur à {{unité|10|échelle=<sup>–3</sup>|rad}} (valeur arbitraire). La valeur retenue est la valeur finale d’<code>angleBas</code> (puisque l’on veut être sûr qu’il n’y ait pas de réflexion totale). La valeur affichée est la valeur en degrés arrondie au dixième. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Solution}} Nous demandons à l’utilisateur ou à l’utilisatrice les valeurs des paramètres du problème : rayon de la lentille, distance de la source, indice de réfraction du verre. Nous vérifions que les valeurs entrées sont bien des nombres ; si c’est une chaîne vide, alors nous utilisons une valeur par défaut. Nous créons une fonction <code>refrac()</code> qui permet de calculer l’angle réfracté à partir de l’angle d’incidence et des indices de réfraction. S’il y a rélexion totale, alors nous générons une erreur. La fonction <code>lanceRayon()</code> calcule les différents points de passage du rayon. Elle appelle pour cela la fonction <code>refrac()</code>. Si un appel de la commande <code>refrac()</code> génère une erreur, alors nous générons également une erreur. Nous déterminons l’angle d’émision du rayon <code>thetaLimite</code> qui provoque une réflecxion totale. Pour cela, nous créons une fonction <code>rechercheLimite()</code> qui cherche par dichotomie. Nous traçons un rayon tous les 5° jusqu’à la valeur limite. <syntaxhighlight lang="python"> #!/usr/bin/env python3 # coding: utf-8 """nom : lancerRayons.py auteur : User:cdang date de création : 2022-05-06 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : NumPy, matplotlib ---------------------------------------------------------------------------- Objectif : trace des trajets optique avec une lentille hémisphérique Entrées ------- Le rayon de la lentille, la distance de la source, l’indice de réfraction du verre, trois chaînes de caractères saisies par l’utilisateur·rice et qui sont converties en réels. Sorties ------- La valeur limite de l’angle (réel) et le tracé de plusieurs rayons. """ # ****************************************************** # ****************************************************** # ** Lancer de rayons pour une lentille hémisphérique ** # ****************************************************** # ****************************************************** import numpy as np import matplotlib.pyplot as plt import numpy.polynomial.polynomial as nppol # ************** # * Constantes * # ************** # Pour la conversion degrés ↔ radians radversdeg = 180/np.pi degversrad = 1/radversdeg # ************* # * Fonctions * # ************* def boucleEntreeNombre(messageSaisie, valeurDefaut): """Permet de s’assurer que l’utilisateur·rice a bien entré un nombre. Entrée : — message à afficher (chaîne de caractères) ; — valeur par défaut (réel à virgule flottante). Sortie : nombre (réel à virgule flottante).""" messageErreur = "Veuillez entrer une valeur numérique (ou vide pour accepter la valeur par défaut).\n" execute = True while execute: strNombre = input(messageSaisie+f" (valeur par défaut {valeurDefaut}) : ") if strNombre == "": nombre = valeurDefaut execute = False else: try: nombre = float(strNombre) except: print(messageErreur) else: execute = False return nombre def initialisation(): """L’utilisateur·rice entre les variables du problème. Entrées : aucune. Sorties : — R1 (mm) : rayon de la lentille ; — d (mm) : distance de la source au dioptre plan ; — n (sans dimension) : indice de réfraction du verre.""" R1 = boucleEntreeNombre("Rayon de la lentille en mm", 20.0) d = boucleEntreeNombre("Distance de la source au dioptre plan en mm", 20.0) n = boucleEntreeNombre("Indice de réfraction (sans dimension)", 1.5) return (R1, d, n) def refrac(n1, n2, theta1): """Calcule l’angle de réfraction theta2 (radians) en fonction — de l’angle d’incidence theta1 (radians); — de l’indice de réfraction n1 du premier milieu ; — de l’indice de réfraction n2 du second milieu.""" reflexionTotale=False rapport=n2/n1 rapportinv=np.reciprocal(rapport) if n1 > n2: thetal = np.arcsin(rapport) # angle limite pour la réflexion totale if theta1 >= thetal: reflexionTotale=True if reflexionTotale: print("Réflexion totale") raise ValueError else: return np.arcsin(rapportinv*np.sin(theta1)) def lanceRayon(n1, n2, d, R, theta1): """Détermine le rayon issu de la source située à une distance d (mm) du bareau et avec une élévation de theta1 (radians), en fonction des indices de réfraction n1 et n2. Les éléments retournés sont : — la hauteur h (mm) à laquelle le rayon frappe le barreau ; — l’angle de réfraction theta2 (radians)) dans le barreau ; — l’angle de réfraction theta3 (radians) à la sortie du barreau — le point M(x, y) (mm) auquel le rayon sort du barreau.""" h = d*np.tan(theta1) if h >= R: print("Le rayon est au-dessus du barreau") raise ValueError else: theta2 = refrac(n1, n2, theta1) a = np.tan(theta2) x = max(nppol.polyroots([h*h - R*R, 2*a*h, 1+a*a])) # recherche de l’intersection du rayon avec le cercle y = a*x + h M = np.array([x, y]) thetaint = np.arccos((x + a*y)/(R*np.sqrt(1 + a*a))) theta3 = np.arctan(y/x) - refrac(n2, n1, thetaint) return (h, theta2, theta3, M) def rechercheLimite(n1, n2, d, R): """Recherche l’angle limite pour la réflexion totale. Entrée : — indice de réfraction des milieux 1 et 2, n1 et n2 ; — distance au barreau, d(mm). Sortie : angle limite theta (radians)""" angleHaut = np.arctan(R/d) angleBas = 0 angleTest = angleHaut try: lanceRayon(n1, n2, d, angleTest, R) except: condition = True # il y a réflexion total en haut de la lentille else: condition = False # il n’y a jamais réflexion totale dans la lentille while condition: #dichotomie angleTest = np.mean([angleHaut, angleBas]) # on ajuste la valeur de test try: lanceRayon(n1, n2, d, R, angleTest) except: angleHaut = angleTest # réflexion totale : on abaisse la valeur maximale else: angleBas = angleTest # pas de réflexion totale : on monte la valeur minimale condition = ((angleHaut - angleBas) >= 0.001) # on a cerné la limite à 0,001 rad près if not condition: angleTest = angleBas return angleTest # *********************** # * Programme principal * # *********************** (R1, d, n) = initialisation() xmax = round(R1 + d) thetaLimite = rechercheLimite(1, n, d, R1) thetaLimiteDeg = thetaLimite*radversdeg print(f"Angle limite pour la réflexion totale : {thetaLimiteDeg:.1f}°.\n") anglesDeg = np.arange(0, thetaLimiteDeg, 5)[1:] # trace un rayon tous les 5° anglesRad = anglesDeg*degversrad nb = len(anglesDeg) h = np.zeros(nb) # initialisation des vecteurs de valeurs theta2 = np.zeros(nb) theta3 = np.zeros(nb) M = np.zeros((nb, 2)) for i in range(nb): (h[i], theta2[i], theta3[i], M[i, :]) = lanceRayon(1, n, d, R1, anglesRad[i]) (h_lim, theta2_lim, theta3_lim, M_lim) = lanceRayon(1, n, d, R1, thetaLimite) # tracé anglesCercle = 0.5*np.pi*(np.linspace(1, 0, 20)) x_cercle = R1*np.cos(anglesCercle) # coordonnées des pints du cercle y_cercle = R1*np.sin(anglesCercle) fig = plt.plot([-d,xmax], [0, 0], "k-.", linewidth="0.5") # tracé de l’axe optique for i in range(nb): plt.plot([-d, 0, M[i, 0], xmax], [0, h[i], M[i, 1], M[i, 1] + (xmax - M[i, 0])*np.tan(theta3[i])], label=f"{anglesDeg[i]:.0f}°") plt.plot([-d, 0, M_lim[0], xmax], [0, h_lim, M_lim[1], M_lim[1] + (xmax - M_lim[0])*np.tan(theta3_lim)], label=f"{0.1*int(np.trunc(10*thetaLimite*radversdeg)):.1f}°") plt.plot(x_cercle, y_cercle, "k", linewidth="0.5") # tracé du cercle plt.plot([0,0], [0, R1], "k", linewidth="0.5") # tracé du premier dioptre #plt.axis("square") plt.gca().set_aspect("equal", adjustable="box") plt.xlabel("x (mm)") plt.ylabel("y (mm)") plt.title("Lentille hémisphérique, lancer de rayons") plt.legend() plt.savefig("lentille_hemispherique_lancer_rayon.svg", format="svg") plt.show() </syntaxhighlight> {{Boîte déroulante/fin}} == Mesurer le temps == Le module <code>time</code> fournit les fonctions suivantes : * <code>time.gmtime()</code> : renvoie la date et l'heure du méridien de Greenwich (''{{lang|en|Greenwich mean time}}'', GMT), sous la forme d'un dictionnaire (année, mois, jour du mois, heure, minute, seconde, jour de la semaine, jour de l'année, heure d'été/hiver), ** jour de la semaine est un entier entre 0 (lundi) et 6 (dimanche), ** jour du mois est un entier entre 1 et 366 ; * <code>time.localtime()</code> : comme le précédent, mais l'heure est l'heure locale ; * <code>time.time()</code> : donne le nombre de seconde qui se sont écoulées depuis le 1er janvier 1970 ; * <code>time.gmtime(n)</code> et <code>time.localtime(n)</code> transforment un nombre de secondes (écoulées depuis le 1er janvier 1970) en une date au format (année, mois, jour, etc.), n-uplet de neuf valeurs ; <code>time.mktime()</code> fait le contraire, il transforme un n-uplet de neuf valeurs (années, mois, jour, etc.) en un nombre de secondes (écoulées depuis le 1er janvier 1970) ; * <code>time.sleep(n)</code> : provoque une pause dans le déroulement du programme de ''n'' secondes ; * <code>time.perf_counter()</code> : indique une date en seconde ; s'utilise pour mesurer la durée d'exécution d'une partie du code, en faisant la différence entre deux relevés. Concernant la date et l'heure sous la forme d'un n-uplet, on peut extraire l'heure de la manière suivante : <syntaxhighlight lang="python"> import time a = time.localtime() print("Il est ", a[3], "h", a[4]) # ou bien print("Il est ", a.tm_hour, "h", a.tm_min) </syntaxhighlight> Pour mesurer la performance d'une portion de code : <syntaxhighlight lang="python"> import time t1 = time.perf_counter() <suite d’instructions> t2 = time.perf_counter() print("Durée d'exécution :", t2-t1 </syntaxhighlight> == Programmation orientée objet == Nous n'allons pas ici faire un cours de programmation orientée objet (POO), nous allons aborder le sujet de manière pragmatique. De manière schématique, un « objet » est une « super-variable ». Cette super-variable peut contenir plusieurs variables, appelées « attributs » ; elle contient en fait un dictionnaire (paires « nom d'attribut : valeur d'attribut »). Elle peut aussi contenir des fonctions spécifiques appelées « méthodes ». De même qu'une variable a un type, un objet fait partie d'une « classe ». La classe est le modèle de l'objet ; en franglais informatique, on dit que l'objet est une instance de la classe. La POO est donc un formalisme : lorsque l'on définit des variables et des fonctions concernant un même type d'objet (au sens commun du terme), on les empaquette dans une classe. Il faut donc d'abord définir la classe, puis attribuer cette classe à un objet (« instancier » la classe). Considérons par exemple que nous voulons travailler sur des [[w:Engrenage|engrenages]] ; pour simplifier, nous nous contentons d'engrenages à dentures droites. Une roue dentée, un pignon, est essentiellement définie par son nombre de dents Z et par son module ''m'' qui correspond à la largeur de dents<ref>ainsi que par son épaisseur ''e'' et le matériau dont elle est faite mais nous allons négliger ces paramètres pour la simplicité de l'étude.</ref>. Nous allons définir trois méthodes : la méthode <code>.diametrePrimitif()</code> qui calcule le diamètre primitif de la roue dentée, <code>.pas()</code> qui calcule la largeur des dents au niveau du cercle primitif et <code>.rapport()</code> qui calcule le rapport de transmission de deux roues engrenées Z<sub>1</sub>/Z<sub>2</sub>. La méthode <code>.rapport()</code> vérifie par ailleurs que les roues ont le même module, condition indispensable pour former un engrenage. Nous définissons la classe ainsi : <syntaxhighlight lang="python"> class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): # instructions lancées lors de la déclaration """Valeurs des attributs""" self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z </syntaxhighlight> Nous remarquons que lorsque nous déclarons les méthodes, le paramètre <code>self</code> correspond à l'objet lui-même. Ainsi, dans la méthode <code>.rapport()</code>, la variable <code>self.Z</code> est le nombre de dents de la roue elle-même et <code>roueDentee.Z</code> est le nombre de dents de la roue passée en paramètre. Pour déclarer les roues, nous écrivons : <syntaxhighlight lang="python"> roue1 = pignon() # attribution de la classe, « instanciation » roue1.Z = 13 # définition des caractéristiques du pignon « roue1 » roue1.m = 2 roue2 = pignon(16, 2) # manière alternative </syntaxhighlight> Nous pouvons alors utiliser les objets de la manière suivante : <syntaxhighlight lang="python"> print(roue1.Z) # 13 print(roue1.diametrePrimitif()) # 26 R = roue1.rapport(roue2) # 0.8125 </syntaxhighlight> La commande <code>dir(a)</code> affiche tous les attributs et méthodes de l'objet <code>a</code>. ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/classes.html | titre = Classes | site = Python documentation | consulté le = 2019-03-08 }} == Interface graphique avec Tk == Une interface graphique utilisateur (GUI, ''{{lang|en|graphic user interface}}'') est un ensemble de boîtes permettant d'interagir avec l'utilisateur c'est-à-dire permettre la saisie d'informations, l'exécution d'actions et afficher des informations. Elle se compose d'éléments appelés ''{{lang|en|widgets}}''. Les éléments ''({{lang|en|widgets}})'' classiques sont : * boîte de dialogue ''({{lang|en|dialog box}})'' : fenêtre contenant d'autres éléments ; * étiquette ''({{lang|en|label}})'' : texte affiché ; * liste déroulante ''({{lang|en|drop-down list}})'' : zone permettant le choix d'une option, la liste se déployant lorsque l'on clique sur la zone ; * zone de texte, champ de saisie ''({{lang|en|text box}})'' : zone permettant de taper du texte ; * boîte combinée ''({{lang|en|combo box}})'' : zone de saisie de texte contenant une liste déroulante qui permet de choisir des éléments prédéfinis ; * bouton ''({{lang|en|button}})'' : objet effectuant une action lorsque l'on clique dessus ; * case à cocher ''({{lang|en|checkbox, tickbox}})'' : objet permettant d'activer ou de désactiver une option lorsque l'on clique dessus ; * bouton radio, case d'option ''({{lang|en|radio button}})'' : objet permettant d'activer une option en désactivant les autres options ; une seule option peut être activée à la fois. Plusieurs modules permettent de gérer les interfaces graphiques. Nous choisissons ici le module développé sur la bibliothèque Tk qui est une bibliothèque multiplateforme. Pour cela, nous importons le module <code>tkinter</code> ainsi que le module <code>ttk</code>, ce dernier proposant des options plus « modernes » : <syntaxhighlight lang="python"> import tkinter as tk from tkinter import ttk </syntaxhighlight> Voici un programme permettant comme précédemment de calculer le rapport de transmission d'un engrenage. Nous détaillons sa construction ci-après. <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: IUrapport.set(valeurZ2/valeurZ1) except: IUrapport.set("erreur") # ************************* # ************************* # ** Interface graphique ** # ************************* # ************************* # fenetre principale fenetre = tk.Tk() fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> '''Explications''' Nous commençons par définir la boîte de dialogue que nous appelons <code>fenetre</code> ; c'est un objet <code>Tk</code> et nous lui donnons un titre « » : <syntaxhighlight lang="python"> fenetre = tk.Tk() fenetre.title("Rapport de réduction") </syntaxhighlight> Puis, nous définissons un cadre attaché à cette fenêtre et qui va nous permettre « d'accrocher » les autres éléments, ce qui permet de garder une apparence satisfaisante lorsque l'on retaille la fenêtre : <syntaxhighlight lang="python"> cadre = ttk.Frame(fenetre) </syntaxhighlight> Le cadre va comporter six lignes ''({{lang|en|row}})'' et deux colonnes ''({{lang|en|column}})''. Nous allons placer une étiquette ''({{lang|en|label}})'' « z1 » : <code>text="z1"</code>. Cette étiquette se trouve dans une case du cadre, celle de la première colonne et la première ligne : <code>grid(column=1, row=1)</code>. Par rapport à cette case, elle est collée à « l'ouest » (W, ''{{lang|en|west}}'', gauche) de la case : <code>sticky=tk.W</code>. <syntaxhighlight lang="python"> z1_label = ttk.Label(cadre, text="z1") # Création de l'étiquette z1_label.grid(column=1, row=1, sticky=tk.W) # Placement de l'étiquette </syntaxhighlight> Notez que l'on aurait pu écrire directement : <syntaxhighlight lang="python"> ttk.Label(cadre, text="z1").grid(column=1, row=1, sticky=tk.W) </syntaxhighlight> mais le fait de séparer la création de l'élément et son placement facilite la maintenance (recherche d'erreur, évolution du code). Pour tout ce qui est dynamique, c'est-à-dire les zone de saisie des valeurs et l'affichage du résultat, il faut définir des « chaînes variables » ''({{lang|variable strings}})'' : <syntaxhighlight lang="python"> IUz1 = tk.StringVar() </syntaxhighlight> Cette variable est une variable globale à la création. Nous pouvons alors placer la zone de saisie ''({{lang|en|entry}})'' à côté de l'étiquette lui correspondant. Nous nommons la zone de saisie <code>z1_entry</code> : <syntaxhighlight lang="python"> z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) </syntaxhighlight> Nous faisons de même pour les trois autres paramètres de l'engrenage, ''m''<sub>1</sub>, ''z''<sub>2</sub> et ''m''<sub>2</sub>. Le résultat est également une chaîne variable globale. Par rapport à notre mise en page, elle se situe dans la case colonne 2 ligne 5, centrée sur cette case (collé à l'est et à l'ouest) : <syntaxhighlight lang="python"> rapport = tk.StringVar() rapport_dynamique = ttk.Label(cadre, textvariable=rapport) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) </syntaxhighlight> Il nous faut encore définir une fonction de manière classique, nous l'appelons « calcule ». Les variables étant globales, on les utilise directement. On récupère les valeurs avec la méthode <code>get()</code> et nous modifions la valeur avec la méthode <code>set()</code> : <syntaxhighlight lang="python"> def calcule(): valeurZ1 = float(IUz1.get()) valeurZ2 = float(IUz2.get()) IUrapport.set(valeurZ2/valeurZ1) </syntaxhighlight> Cette fonction est déclenchée lorsque l'on clique sur le bouton « Calcul » situé dans la case du cadre ligne 6 colonne 2 : <syntaxhighlight lang="python"> bouton = ttk.Button(cadre, text="Calcul", command=calcule) bouton.grid(column=2, row=6, sticky=tk.W) </syntaxhighlight> ou bien si l'on appuie sur la touche <code>[entrée]</code> du clavier : <syntaxhighlight lang="python"> fenetre.bind("<Return>", calcule) </syntaxhighlight> À tout ceci, nous ajoutons des « gouttières » (marges, ''{{lang|en|paddings}}'') afin d'espacer les éléments. Il faut ensuite « activer » la fenêtre pour qu'elle s'affiche. La méthode est <code>mainloop()</code> (boucle principale) : « boucle » (elle est active en permanence et attend des actions sur ses éléments), <syntaxhighlight lang="python"> fenetre.mainloop() </syntaxhighlight> Nous avons ci-dessus mis la plupart du code en programme principal. Nous pouvons aussi programmer de manière fonctionnelle, en mettant la plupart du code dans des fonctions ; cependant, pour que la fenêtre et les variables dynamiques soient globales à tout le programme, elles doivent être déclarées dans le programme principal. Nous pouvons aussi mêler la programmation orientée objet. {{boîte déroulante début|Calcul du rapport de transmission en programmation fonctionnelle et orientée objet}} <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # ************* # ************* # ** Classes ** # ************* # ************* class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): """Valeurs des attributs""" # instructions lancées lors de la déclaration self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z # ************************ # ************************ # ** Variables globales ** # ************************ # ************************ # fenetre principale fenetre = tk.Tk() # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: roue1 = pignon(valeurZ1, valeurM1) roue2 = pignon(valeurZ2, valeurM2) IUrapport.set(roue1.rapport(roue2)) except: IUrapport.set("Erreur") # *********************** # * Interface graphique * # *********************** def configureFenetre(): """Configuration de la fenêtre principale""" fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* configureFenetre() # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> {{boîte déroulante fin}} == Annotations == Une annotation est un commentaire qui sert à expliciter un type de variable. La syntaxe est différente des commentaires « classiques » : cela permet d'avoir un affichage différent avec les éditeurs de texte ayant une coloration syntaxique, et ces informations peuvent être récupérées par des logiciels extérieurs pour effectuer une documentation automatique ou bien des vérifications de type. Cependant : * comme les commentaires normaux, ils n'ont aucune influence lors de l'exécution du texte ; en particulier : * rien n'oblige à annoter les variables ; * il est possible d'avoir une variable ayant un type différent de son annotation ; le fait de pouvoir définir et changer le type de variable à la volée est une fonctionnalité fondamentale de Python. La syntaxe pour une annotation est : : nom_de_variable + deux-points + espace + type par exemple : <syntaxhighlight lang="python"> a: int </syntaxhighlight> Notez qu'ici, la variable n'est ''pas'' créée. Pour la créer, il faut lui affecter une valeur. Il est possible de l'affecter après ou bien sur la même ligne avec la syntaxe : : nom_de_variable + deux-points + espace + type + espace + égal + espace + valeur par exemple : <syntaxhighlight lang="python"> a: int a = 5 # est équivalent à a: int = 5 </syntaxhighlight> Même si l'annotation n'a pas d'impact sur l'exécution, le type doit être un type existant sinon cela génère une erreur de syntaxe. Les types classiques sont : : <code>int</code> — <code>float</code> — <code>str</code> — <code>bool</code> — <code>list</code> — <code>tuple</code> — <code>dict</code> Il est également possible de mettre une chaîne de caractères : <syntaxhighlight lang="python"> a: "ce que je veux" = 3.1516 </syntaxhighlight> On peut annoter une fonction. Il est possible d'annoter les variables déclarées au sein de la fonction, mais pas les variables globales (puisqu'elle ne sont pas définie au sein de la fonction). On peut aussi annoter : * les variables passées en paramètre, avec la même syntaxe dans les parenthèses ; * annoter le type de la variable de sortie (retournée) en la faisant précéder de <code>-&gt;</code> : <syntaxhighlight lang="python"> def plusCinq(a: float = 0) -> float: return a + 5 </syntaxhighlight> ; Ressources * {{lien web | url = https://www.python.org/dev/peps/pep-0526/ | titre = PEP 526 -- Syntax for Variable Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} * {{lien web | url = https://www.python.org/dev/peps/pep-3107/ | titre = PEP 3107 -- Function Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} == Décorateur == Un décorateur est une fonction qui s'applique à une fonction, à la manière de la composition mathématique ''g'' ∘ ƒ = ''g''(ƒ). Mais cette composition affecte la fonction elle-même ; l'utilisateur appelle la fonction ƒ mais c'est la fonction ''g'' ∘ ƒ qui s'exécute. Cette fonction ''g'' est appelée le décorateur. L'intérêt est de pouvoir modifier une fonction sans modifier le code de la fonction elle-même. Pour appliquer une décoration, il faut : # Déclarer le décorateur : une fonction qui s'applique à une autre fonction. # Affecter le décorateur à la fonction visée : en mettant <code>@''décoration''</code> juste avant la définition de la fonction. Par exemple : <syntaxhighlight lang="python"> def decorateur(f): print("Avant la fonction") f() print("après la fonction") @decorateur def afficheFoo(): print("Foo.") afficheFoo # Avant la fonction # Foo. # Après la fonction </syntaxhighlight> Lorsque l'on appelle <code>afficheFoo</code>, on appelle en fait <code>decorateur(afficheFoo)</code>. Si la fonction à modifier admet des paramètres, il faut définir une fonction enveloppante dans le décorateur. Par exemple, nous définissons ci-dessous un décorateur <code>deuxFois()</code> qui fait s'exécuter deux fois de suite la fonction : <syntaxhighlight lang="python"> def deuxFois(f): def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # conteneurFonction </syntaxhighlight> Nous voyons que l'application du décorateur a modifié le nom de la fonction — pas le nom de la variable qui contient la fonction mais bien son nom « intime ». Pour éviter cela, on utilise la méthode <code>wraps()</code> du module <code>functools</code> : <syntaxhighlight lang="python"> import functools def deuxFois(f): @functools.wraps(f) def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # plusCinq </syntaxhighlight> On peut par exemple utiliser un décorateur pour la mémoïsation. La mémoïsation est une méthode consistant à mémoriser les valeurs d'une fonction au fur et à mesure de son utilisation ; ainsi, si l'on veut évaluer la fonction avec les mêmes entrées, on se contente d'aller chercher la valeur enregistrée ce qui est plus rapide. On sacrifie donc la place mémoire au profit de la rapidité. On peut trouver des décorateurs de mémoïsation aux adresses suivantes : * https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize * https://gist.github.com/robcowie/1357800 ; Ressources : {{lien web | url = https://www.python.org/dev/peps/pep-0318/ | titre = PEP 318 -- Decorators for Functions and Methods | site = Python.org | lang = en | consulté le = 2019-04-05 }} == Manipulation de fichiers == === Importer le contenu d'un fichier === Python possède la fonction <code lang="python">open()</code> qui permet d'ouvrir un fichier. Ouvrir signifie qu'il crée un objet de type <code>file</code> qui possède notamment les méthodes <code lang="python">read()</code> et <code lang="python">write()</code>. Il peut s'agir d'un objet de type « fichier binaire » ''({{lang|en|binary file}})'' ou « fichier texte » ''({{lang|en|text file}})''. Si par exemple on veut utiliser (et donc lire) le contenu du fichier texte <code>monfichier.txt</code>, on écrit : <syntaxhighlight lang="python"> fichier = open("monfichier.txt", "rt") … fichier.close() </syntaxhighlight> Le paramètre <code>"rt"</code> signifie que nous ouvrons le fichier en lecture ''({{lang|en|read}})'' et qu'il s'agit d'un objet de type fichier texte. Notons deux choses : * en faisant cela, nous ne faisons qu'associer le fichier à un objet Python, nous n'avons pas encore importé les données ; * si nous ouvrons le fichier, il faut le fermer par la suite ; c'est pourquoi nous utilisons la méthode <code lang="python">.close()</code>. Pour éviter d'avoir à fermer le fichier, nous pouvons l'ouvrir au sein d'un contexte : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: … </syntaxhighlight> Notons aussi que la chaîne de caractères indiquant le nom du fichier peut contenir le chemin d'accès au répertoire (dossier), mais sous Microsoft Windows, il faut utiliser des barres de fractions <code>/</code> pour séparer les sous-répertoires au lieu de la barre inversée habituelle, par exemple : <syntaxhighlight lang="python"> chemin = "C:/Temp/monfichier.txt" with open(chemin, "rt") as fichier: … </syntaxhighlight> Pour mettre les données du fichier dans la variable <code>contenu</code>, nous écrivons donc : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() print(contenu) </syntaxhighlight> et si nous ne voulons lire que les <code>n</code> premiers caractères (<code>n</code> étant un entier), nous utilisons <code lang="python">contenu = fichier.read(n)</code>. Cette lecture est séquentielle, c'est-à-dire que si nous appliquons la méthode plusieurs fois, nous reprenons la lecture là où nous l'avons laissée. Si nous voulons lire une ligne, nous utilisons la méthode <code lang="python">.readline()</code>. La lecture ligne par ligne est également séquentielle. Nous pouvons aussi créer une liste dont chaque élément est une ligne du fichier ; nous utilisons alors la méthode <code lang="python">.readlines()</code> (notez le pluriel). Chaque élément de la liste se termine par le caractère de fin de ligne <code lang="python">\n</code>. Pour l'enlever, nous pouvons utiliser la méthode <code lang="python">.rstrip()</code> pour chaque élément de la liste, par exemple. L'exemple complet est alors : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.readlines() contenu = [item.rstrip() for item in contenu] print(contenu) </syntaxhighlight> === Exporter du contenu vers un fichier === Si nous voulons créer un fichier texte pour y mettre le contenu de la variable <code>texte</code>, alors nous utilisons : <syntaxhighlight lang="python"> with open("monfichier.txt", "wt") as fichier: contenu = fichier.write(texte) </syntaxhighlight> Le module principal important pour la manipulation de fichiers est est <code lang="python">os</code>. === Exploiter le contenu d'un fichier texte === Avec un fichier texte, la méthode <code lang="python">.read()</code> crée une variable de type texte. Nous pouvons séparer cette variable en différentes lignes avec la méthode <code lang="python">.splitlines()</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une ligne. Si maintenant une ligne contient plusieurs données séparées par un séparateur commun, par exemple un espace, nous pouvons séparer les données par la méthode <code lang="python">.split(''séparateur'')</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une donnée. Si par exemple le fichier est du type CSV ''({{lang|en|comma separated values}}'', valeurs séparées par une virgule), l'exploitation du fichier est : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(",") for item in contenu] </syntaxhighlight> La variable <code>contenu</code> est une liste de listes. Pour avoir la ''n''<sup>e</sup> valeurs de la ''m''<sup>e</sup> ligne, on utilise : <syntaxhighlight lang="python"> contenu[m-1][n-1] </syntaxhighlight> Si l'on veut extraire la ligne ''m'' il suffit d'écrire : <syntaxhighlight lang="python"> contenu[m-1] </syntaxhighlight> mais si l'on veut la colonne ''n'', le plus simple est d'utiliser une définitipon en compréhension : <syntaxhighlight lang="python"> [ligne[n-1] for ligne in contenu] </syntaxhighlight> Dans certains fichiers CSV, les séparateurs de valeurs ne sont pas des virgules, on peut donc utiliser un autre caractère pour le séparateur. Si le séparateur est une tabulation, on utilise <code lang="python">\t</code> : <code lang="python">contenu = [item.split("\t") for item in contenu]</code> Si la première ligne contient les en-têtes des colonnes, on peut l'enlever avec la fonction <code lang="python">del()</code> : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() del(contenu[0]) contenu = [item.split(",") for item in contenu] </syntaxhighlight> Certains logiciels créent des fichiers en utilisant le séparateur décimal régional, qui en France est la virgule. Pour remplacer les virgules par des points, on peut utiliser la méthode <code lang="python">.replace()</code>, de préférence ''avant'' de séparer les valeurs : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.replace(",", ".") for item in contenu] # remplace les virgules par des points contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule </syntaxhighlight> en effet, lorsque l'on a séparé les valeurs, on a une liste de liste, il faut alors balayer les sous-listes ce qui prend plus de temps : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule contenu = [[subitem.replace(",", ".") for subitem in item] for item in contenu] # remplace les virgules par des points </syntaxhighlight> '''Exemple complet''' Supposons que l'on ait un fichier texte de la forme : <syntaxhighlight lang="text"> x y z V 0.0 1.5 3.2 8.657 0.4 1.5 3.2 8.392 0.2 1.5 3.2 8.485 ... </syntaxhighlight> C'est un fichier valeurs V associées à des points de coordonnées ''(x, y, z)'' (un champ V sur l'espace, donc). Nous remarquons que seule la coordonnée ''x'' change : les données concernent la droite (''y'' = 1,5 ; ''z'' = 3,2). Nous remarquons aussi que les valeurs de ''x'' ne sont pas classées par ordre croissant ni décroissant. Nous voulons au final avoir une matrice [[''x''], [V]] triée par ''x'' croissant. Pour cela, nous pouvons faire : <syntaxhighlight lang="python"> with open(nomdefichier, "rt") ad fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(" ") for item in contenu contenu = contenu[1:] # élimine la première ligne x = np.array([float(ligne[0]) for ligne in contenu]) V = np.array([float(ligne[3]) for ligne in contenu]) donnees = np.concatenate((x.reshape(-1, 1), V.reshape(-1, 1)), axis=1) # matrice [[x], [V]] ind = np.argsort(donnees[:, 0]) donnees = donnees[ind, :] # matrice triée plt.plot(donnees[:, 0], donnees[:, 1]) </syntaxhighlight> {{note|Pour le tri, voir [[../Manipulation_de_matrices#Fonctions_et_méthodes_de_base|''Manipulation de matrices'' &gt; ''Fonctions et méthodes de base'']].}} === Cas d'un fichier CSV === Si le fichier CSV ne contient que des valeurs numériques, on peut utiliser : <syntaxhighlight lang="python"> valeurs = np.loadtxt(chemin+nomfic, delimiter=",") # si le séparateur est une virgule </syntaxhighlight> Il existe un module <code lang="python">csv</code> dédié aux fichiers CSV. La manipulation du fichier se fait comme suit : <syntaxhighlight lang="python"> import csv with open(chemin+nomfic, "rt") as fichier: lecteur = csv.reader(fichier, delimiter=",") contenu = [ligne for ligne in lecteur] print(contenu) </syntaxhighlight> === Utilisation de Pandas === Pandas<ref>https://pandas.pydata.org/</ref> est un module gérant les tableaux de données, appelés <em lang="en">data frames</em>. Voici quelques commandes utiles : <syntaxhighlight lang="python"> import numpy as np import pandas as pd M = np.random.rand(10, 10) # crée une matrice NumPy aléatoire de dimension 10 × 10 tableau = pd.DataFrame(M) # transforme la matrice en tableau DataFrame tableau.to_csv("tableau.csv") # enregistre le tableau dans un fichier CSV donnees = pd.read_csv("tableau.csv").to_numpy() # lit le fichier et transforme le tableau DataFrame en matrice NumPy </syntaxhighlight> == Exporter un programme Python == Vous pouvez créer un fichier « Python pur » <code>.py</code>. Pour cela, dans le menu <code>fichier/file</code> de Jupyter, choisir <code>télécharger/download</code> au format <code>.py</code> ; le fichier se trouve alors dans le répertoire de téléchargement du navigateur. == Ressources == * {{lien web | url = https://www.python.org/dev/peps/pep-0008/ | titre = PEP 8 -- Style Guide for Python Code | site = Python documentation | consulté le = 2019-03-14 }} == Notes et références == {{références}} ---- [[../Fonctions mathématiques générales|Fonctions mathématiques générales]] &lt; [[../|↑]] &gt; [[../Graphiques|Graphiques]] {{DEFAULTSORT:Elements de programmation}} [[Catégorie:Python pour le calcul scientifique (livre)]] gz37c2pvv4zkolqzxk5v0qccurfz7jg 767324 767323 2026-06-02T13:34:52Z Cdang 1202 /* Autres fonctions */ 767324 wikitext text/x-wiki Rappel : les programmes commencent par : <syntaxhighlight lang="python"> #!/usr/bin/python3 import numpy as np import matplotlib.pyplot as plt </syntaxhighlight> == Entrées et sorties == Pour permettre à l'utilisateur ou à l'utilisatrice d'entrer une valeur, nous utilisons la fonction <code lang="python">input()</code> comme évoqué précédemment (chapitre ''[[../Premiers programmes|Premiers programmes]]''), avec la syntaxe <code lang="python">''variable'' = input(''texte'')</code>. Notez que la valeur renvoyée par <code lang="python">input()</code> est une chaîne de caractères. Si vous voulez autre chose, typiquement un nombre, il faut convertir cette chaîne. Par exemple, nous demandons ici d'entrer une longueur sous la forme d'une valeur numérique : <syntaxhighlight lang="python"> longueurDefaut = 10.0 texteDemandeLongueur = f"Veuillez entrer la longueur en millimètres (valeur par défaut {longueurDefaut} mm) : " longueur = input(texteDemandeLongueur) if longueur=="": longueur=longueurDefaut else: longueur=float(longueur) print(longueur) </syntaxhighlight> Pour afficher un texte, on utilise la fonction <code lang="python">print()</code>, également présentée dans le chapitre ''[[../Premiers programmes|Premiers programmes]]'', avec la syntaxe <code lang="python">print(''texte'')</code>. Le texte à afficher peut être de n'importe quel type (entier, réel en virgule flottante, booléen, chaîne de caractères…) mais si l'on veut « mélanger » les types, il faut tout convertir en chaînes de caractères, avec la fonction <code lang="python">str()</code>, et concaténer les chaînes avec <code lang="python">+</code>. Par exemple : <syntaxhighlight lang="python"> print("La longueur vaut : "+str(longueur)+" mm.") </syntaxhighlight> Nous pouvons aussi utiliser une « chaîne “f” » ''({{lang|en|f-string}})'' : on met un le <code lang="python">f</code> devant le guillemet ouvrant et dans la chaîne, on met un champ sous la forme <code lang="python">{''nomDeVariable''}</code>. L'exemple ci-dessus devient alors : <syntaxhighlight lang="python"> print(f"La longueur vaut : {longueur} mm.") </syntaxhighlight> Les chaînes « f » sont détaillées dans la section ''[[#Chaînes de caractères|Chaînes de caractères]]'' ci-dessous. Si l'on veut introduire un retour à la ligne dans la chaîne, on utilise les caractères <code lang="python">\n</code> (contre-oblique suivie de la lettre N minuscule). Par exemple <syntaxhighlight lang="python"> print("Ceci est un texte\navec un retour à la ligne.") </syntaxhighlight> == Types de variables == === Généralités === Python définit « tout seul » le type de la variable : « <code>3</code> » sera un entier ''({{lang|en|integer}})'', « <code>3.0</code> » sera un réel à virgule flottante ''({{lang|en|float}})'', « <code>"3"</code> » sera une chaîne de caractères ''({{lang|en|string}})''. On peut connaître le type d'une variable avec la fonction <code>type()</code>. On peut tester certaines valeurs, avec le module <code>NumPy</code> : * <code>np.isnan(x)</code> indique si les valeurs de ''x'' sont des NaN ''({{lang|en|not a number}})'' ; si ''x'' est une matrice, le résultat est une matrice de booléens, l'élément [''i'', ''j''] est <code>True</code> si <code>x[i, j]</code> est un NaN ; * <code>np.isinf(x)</code> indique si les valeurs de ''x'' sont ±∞ ; si ''x'' est une matrice, le résultat est une matrice booléenne de même dimension. On peut forcer un type : * <code>int(x)</code> : transforme la valeur ''x'' en nombre entier ; * <code>long(x)</code> : " en entier long (précision illimitée) ; * <code>float(x)</code> : " en nombre réel à virgule flottante ; * <code>str(x)</code> : " en chaîne de caractères ; * <code>complex(Re, Im)</code> : crée le nombre complexe ''Re'' + ''Im''·j, j désignant la racine carrée de –1 ; * <code>list()</code> : crée une liste ; * <code>tuple()</code> : crée un n-uplet. Par exemple <syntaxhighlight lang="python"> type(3) # <class 'int'> type(float(3)) # <class 'float'> complex(1, 1) == 1 + 1j # True list("blabla") # ['b', 'l', 'a', 'b', 'l', 'a'] </syntaxhighlight> Python distingue plusieurs genres de types : * Un itérable est un objet dont on peut extraire les éléments un par un ; ce sont les objets pour lesquels on peut écrire <code> for i in ''iterable'':</code>. Il s'agit essentiellement des listes, n-uplets, chaînes de caractères, ensembles, dictionnaires et fichiers. * Un modifiable ''({{lang|en|mutable}})'' est un objet que l'on peut modifier ; par exemple une liste est modifiable — on peut changer la valeur d'un élément, en ajouter ou en enlever un — mais les n-uplets non, pas plus qu'une chaîne de caractères ou un nombre. * Un identifiable (''{{lang|en|hashable}}'', le ''{{lang|en|hashage}}'' étant une signature caractéristique d'un objet) : objet possédant un identifiant unique. Un objet identifiable est toujours non-modifiable ''({{lang|en|unmutable}})''. === Types numériques === ==== Entiers ==== Nous pouvons définir les entiers au format octal ou hexadécimal : il faut débuter le nombre par respectivement <code>0o</code> (le chiffre zéro et la lettre o) et <code>0x</code> (le chiffre zéro et la lettre x). À l'inverse, la fonction <code>hex()</code> renvoie une chaîne correspondant à l'écriture d'un entier au format hexadécimal, et <code>oct()</code> renvoie la chaîne correspondant à l'éciture en octal. Par exemple : <syntaxhighlight lang="python"> print(0o10, ";", 0x10) # 8 ; 16 print(hex(20)) # 0x14 </syntaxhighlight> ==== Réels ==== Les réels disposent de fonctions spécifiques appelées « méthodes ». Une méthode est une fonction spécifique à un type d'objets. Étant conçue ''ad hoc'', elle est souvent plus économe en ressource et en temps qu'une fonction générique. Pour appliquer la méthode <code>meth()</code> à la variable <code>x</code>, on écrit : <code>x.meth()</code>. Nous avons déjà présenté la méthode <code>''float''.as_integer_ration()</code> qui donne la fraction réduite égale à la valeur du nombre. Les réels disposent de plusieurs autres méthodes : * <code>''float''.trunc()</code> : tronque le nombre réel ; * <code>''float''.floor()</code>, <code>''float''.ceil()</code> : renvoie l'entier le plus proche, respectivement inférieur ou supérieur ; * <code>''float''.hex()</code> : renvoie une chaîne de caractères correspondant à l'écriture du nombre en hexadécimal. Par exemple : <syntaxhighlight lang="python"> a = 20. print(a.hex()) # 0x1.4000000000000p+4 print(10..hex()) # 0x1.4000000000000p+3 </syntaxhighlight> Dans le deuxième exemple, nous appliquons la méthode <code>''float''.hex()</code> directement au nombre <code>10.</code> ; le point est obligatoire car sinon, c'est un entier, pour lequel la méthode n'est pas définie. Notez que la ''méthode'' <code>''float''.hex()</code> est différentes de la ''fonction'' <code>hex()</code> : la première concerne les réels, la seconde les entiers. ==== Complexes ==== Nous avons déjà mentionné la méthode <code>''complex''.conjugate()</code> qui donne le conjugué du nombre. Un nombre complexe dispose de deux attributs : * <code>''complex''.real</code> : sa partie réelle ; * <code> ''complex''.imag</code> : sa partie imaginaire. Par exemple : <syntaxhighlight lang = "python"> a = 5+2j print(a.conjugate(), ";", a.real, ";", a.imag) # (5-2j) ; 5.0 ; 2.0 </syntaxhighlight> === Chaînes de caractères === ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/inputoutput.html | titre = 7. Input and Output | site = Python Documentation | consulté le = 2019-04-06 }} ==== Généralités ==== Il existe en fait trois manières de définir une chaîne de caractères : * avec des guillemets simples ou doubles comme vu précédemment : <code>"…"</code> ou bien <code>'…'</code> ; * avec trois guillemets doubles : <code>"""…"""</code> : cela permet d'avoir une chaîne de caractères s'étendant sur plusieurs lignes, les retours de ligne étant pris en compte ; c'est utilisé en particulier pour la description des fonctions (''{{lang|en|docstrings}}'', voir ci-après) ; * avec des guillemets précédés d'un « r », <code>r"…"</code> ou <code>r'…'</code> : cela permet d'interpréter les barres de fraction inverses « \ » comme un caractère « normal » et non comme un caractère d'échappement (voir ci-après) ; cela est utile lorsque l'on utilise les possibilités LaTeX dans le tracé de graphiques (voir plus loin) ; * avec des guillemets précédés d'un « f », <code>f"…"</code> ou <code>f'…'</code> : cela permet d'utiliser des variables formatées (voir ci-après). Une chaîne de caractères n'est pas modifiable. Si l'on veut remplacer un caractère, l'insérer ou le supprimer, il faut transformer la chaîne en liste, avec la commande <code>list()</code>, puis rassembler la liste en la joignant ''({{lang|en|join}})'' à une chaîne vide : <syntaxhighlight lang="python"> chaine = "blabla" chaineList = list(chaine) chaineList[2] = "c" chaine = "".join(chaineList) print(chaine) # blcbla </syntaxhighlight> Dans une chaîne simple <code>"…"</code> ou <code>'…'</code>, on peut introduire un retour à la ligne avec <code>\n</code>. ==== Substitution de variables ==== Lorsque l'on veut utiliser des variables, on fait précéder les guillemets d'un « f » et l'on écrit les noms de vrariables entre accolades. Par exemple : <syntaxhighlight lang="python"> monde = "world" chaine = f"Hello {monde}!" print(chaine) # Hello world! </syntaxhighlight> On peut indiquer la taille de la chaîne générée à partir de la variable sous la forme <code>{nomVariable:taille}</code>, la taille étant un entier. Par exemple : <syntaxhighlight lang="python"> chiffre1 = 1 nom1 = "un" chiffre2 = 2 nom2 = "deux" chaine = f"{nom1:5} : {chiffre1:5d}\n{nom2:5} : {chiffre2:5d}" print(chaine) # un : 1 # deux : 2 </syntaxhighlight> Vous remarquez que l'on ajoute un « d » pour les entiers décimaux, et que les nombres sont alignés à droite. Si le nombre est un nombre réal à virgule flottante ''({{lang|en|float}})'', on peut indiquer le nombre de décimales sous la forme <code>.''n''f</code> : <syntaxhighlight lang="python"> chaine = f"{np.pi:.5f}" print(chaine) # 3.15169 </syntaxhighlight> Avec la syntaxe <code>''m''.''n''f</code>, on indique également que la totalité du nombre doit occuper ''m'' caractères. Pour convertir un nombre en caractère Unicode correspondant, on utilise la lettre c : <syntaxhighlight lang="python"> nompi = 0x03c0 # Caractère Unicode π : U+03C0 chaine = f"{nompi:c} = {np.pi:.5f}" print(chaine) # π = 3.14159 </syntaxhighlight> La classe ''str'' dispose également de la méthode <code>.format()</code>. On indique un n-uplet de chaînes (ou de nombres) à la méthode et l'on met des accolades dans la chaîne principale ; les accolades sont remplacées dans l'ordre des chaînes de la méthode. On peut changer l'ordre en indiquant quelle valeur utiliser dans quelle accolade. Par exemple : <syntaxhighlight lang="python"> chaine1 = "On compte {} puis {}".format(1, 2) chaine2 = "On compte {0} puis {1}. Mais à rebours, on compte {1} puis {0}.".format("un", "deux") print(chaine1, "\n", chaine2) # On compte 1 puis 2 # On compte un puis deux. Mais à rebours, on compte deux puis un. </syntaxhighlight> L'utilisation du caractère pourcent « % » permet d'utiliser la mise en forme <code>sprintf()</code> du langage C : <syntaxhighlight lang="python"> chaine = "π = %.5f" % np.pi print(chaine) # π = 3.14159 </syntaxhighlight> ; Exemple <nowiki>:</nowikI> barre de progression : Voici une fonction affichant une barre de progression, pour la ''i''-ème étape d'un processus ayant ''n'' étapes (pour la notion de fonction, voir la section ci-après ''[[#Fonction|Fonction]]''). : NB : nous avons utilisé les codes Unicode pour l'exemple, mais on peut évidemment copier le caractère, par exemple depuis une table Unicode ou une page Web<ref>Pour le point médian : ''{{W|Table des caractères Unicode/U0080}}'' ou ''{{W|Point médian}}''. Pour le pavé : ''{{W|Table des caractères Unicode/U2580}}''.</ref>, et le coller dans le code, comme nous l'avons fait dans le commentaire. <syntaxhighlight lang="Python"> def barre_progression(i, n, largeur=40): """ Affiche une barre de progression Entrées : — i : étape en cours, entier ; — n : nombre d'étapes à réaliser, entier ; — largeur : nombre de caractères total de la barre, entier. Sortie : affichage de la barre de progression. """ taux = i/n fait = int(largeur * taux) barre = f"{0x2588:c}" * fait + f"{0x00b7:c}" * (largeur - fait) # U+2588 : pavé "█" ; U+00B7 : point médian "·" print(f"Progression | {barre} | {100*taux:3.1f} %") barre_progression(25, 100) # Progression | ██████████······························ | 25.0 % </syntaxhighlight> ==== Méthodes des chaînes ==== Le type ''str'' dispose d'un certain nombre de méthodes. Nous avons déjà vu les méthodes <code>''str''.join()</code> et <code>''str''.format()</code>, en voici quelques autres : * <code>''str''.capitalize()</code> : met le premier caractère en capitale (majuscule) et les autres en minuscule ; * <code>''str''.lower()</code> : met tout en minuscules ''({{lang|en|lowercase}})'' ; * <code>''str''.upper()</code> : met tout en capitales ''({{lang|en|lowercase}})'' ; * <code>''str''.center(''n'')</code> : met la chaîne au centre d'une chaîne de longueur ''n'', en complétant avec des espaces ; on peut compléter avec d'autres caractères avec <code>''str''.center(''n'', ''c'')</code>, par exemple <code>"a".center(7, ".")</code> donne <code>"....a...."</code> ; * <code>''str''.ljust(''n'', ''c'')</code> et <code>''str''.rjust(''n'', ''c'')</code> : comme <code>.center()</code> mais la chaîne est respectivement alignée au fer à gauche ''({{lang|en|left}})'' et à droite ''({{lang|en|right}})'' ; * <code>''str''.isdigit()</code> : booléen vrai si tous les caractères sont des nombres ; * <code>''str''.find(''sous-chaine'')</code>, <code>''str''.rfind(''sous-chaine'')</code> : indique respectivement le premier emplacement et le dernier emplacement de la sous-chaîne dans la chaîne ; * <code>''str''.partition(''séparateur'')</code> : retourne un triplet avec la portion de chaîne avant le séparateur, le séparateur puis la portion de chaîne après le séparateur ; * <code>''str''.replace(''ancien'', ''nouveau'')</code> : remplace la chaîne ''ancien'' par la chaîne ''nouveau'' dans la chaîne ; * <code>''str''.split(''séparateur'')</code> : découpe la chaîne au niveau des séparateurs et renvoie une liste. ==== Autres fonctions ==== La fonction <code>chr()</code> transforme un code Unicode en caractère. Par exemple, <code>chr(97)</code> donne <code>"a"</code> et <code>chr(0x03c0)</code> donne <code>"π"</code>. Si on veut créer une liste de caractères qui se suivent, on peut par exemple utiliser : <syntaxhighlight lang="python"> [chr(x) for x in range(97, 102)] # ['a', 'b', 'c', 'd', 'e'] </syntaxhighlight> Si on veut créer une liste de nombres sous la forme de chaînes de caractères, on peut utiliser la commande <code>str()</code> vue ci-dessus. Par exemple : <syntaxhighlight lang="python"> [str(x) for x in range(1, 6)] # ['1', '2', '3', '4', '5'] </syntaxhighlight> Pour la syntaxe, voir ci-dessous la section [[#Définition en compréhension|''Définition en compréhension'']]. Ainsi, dans l'exemple de la barre de progression ci-dessus, on peut utiliser la solution suivante pour constituer la barre : <syntaxhighlight lang="python"> barre = chr(0x2588) * fait + chr(0x00b7) * (largeur - fait) # U+2588 : bloc ; U+00B7 : point médian </syntaxhighlight> Rappel : le module <code>html</code> permet d'utiliser les entités HTML : <syntaxhighlight lang="python"> import html … print(html.entities.html5["alpha;"]+html.entities.html5["middot;"]) # α· </syntaxhighlight> L'entité HTML <code>&xxx;</code> s'obtient par <code>html.entities.html5["xxx;"]</code>, donc en enlevant la perluète ; mais cela ne fonctionne pas avec les codes Unicode. Pour cela, on peut utiliser la commande <code>html.unescape()</code>. Ainsi, dans l'exemple de la barre de progression ci-dessus, on peut utiliser la solution suivante pour constituer la barre : <syntaxhighlight lang="python"> barre = html.unescape("&#x2588;") * fait + html.entities.html5["middot;"] * (largeur - fait) # U+2588 : bloc ; middot : point médian </syntaxhighlight> La commande <code>html.unescape()</code> interprète une chaîne complète, par exemple <syntaxhighlight lang="python"> print(html.unescape("L'esperluette est le caractère &amp;")) # L'esperluette est le caractère & </syntaxhighlight> == Manipulation de listes == Les listes sont une structure de données fondamentale en Python. ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/datastructures.html | langue = en | titre = 5. Data structures | site = Python documentation | consulté le = 2019-03-16 }} === Copie d'une liste === Contrairement à d'autres types, lorsque vos écrivez <code>b = a</code> avec des listes, vous ne créez pas une copie de la variable <code>a</code>, vous créez un ''alias'' : l'objet <code>b</code> est un autre nom de l'objet <code>a</code>. En particulier, si vous modifiez <code>b</code>, vous modifiez en fait <code>a</code>. Par exemple : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a b[2] = 5 print(a, b) # [1, 2, 5, 4] [1, 2, 5, 4] </syntaxhighlight> Si l'on veut créer une copie de <code>a</code>, il faut utiliser <code>a[:]</code> ou bien <code>a.copy()</code> : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a[:] c = a.copy() b[2] = 5 c[2] = 6 print(a, b, c) # [1, 2, 3, 4] [1, 2, 5, 4] [1, 2, 6, 4] </syntaxhighlight> === Méthodes de listes === Pour modifier une liste, vous disposez des méthodes suivantes : * <code>a.append(x)</code> : ajoute l'élément <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.extend(x)</code> : ajoute la liste <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.append(i, x)</code> : aoute l'élément <code>x</code> ''avant'' l'interstice ''i'' de la liste <code>a</code> ; * <code> x = a.pop(i)</code> : enlève l'élément ''i'' de la liste <code>a</code> et le met dans la variable <code>x</code> ; <code> x = a.pop()</code> enlève le dernier élément de la liste ; * <code>a.clear()</code> : vide la liste <code>a</code> ; * <code>a.sort()</code> : trie la liste par ordre croissant ; * <code>a.sort(reverse = True)</code> : trie par ordre décroissant ; * <code>a.reverse()</code> : inverse l'ordre de <code>a</code>. Pour supprimer l'élément à l'indice ''i'', au lieu d'utiliser <code>a.pop(i)</code>, on peut aussi utiliser <syntaxhighlight lang="python"> del(a[i]) </syntaxhighlight> Pour trier une liste, on peut aussi utiliser la fonction <code>sorted()</code>, ce qui permet par exemple de conserver la liste originale, non triée : <code>b = sorted(a)</code>. La fonction <code>sorted()</code> fonctionne avec tous les objets « itérables » comme par exemple une chaîne de caractères : <syntaxhighlight lang="python"> a = "ahjbfk" print(sorted(a)) # ['a', 'b', 'f', 'h', 'j', 'k'] </syntaxhighlight> Pour mettre en évidence la performance de la méthode <code>''list''.sort()</code> par rapport à la fonction générique <code>sorted()</code> : <syntaxhighlight lang="python"> import numpy as np import time a = np.random.rand(int(1e7)) t1 = time.perf_counter() b = sorted(a) # Fonction générique t2 = time.perf_counter() a.sort() # Méthode spécifique t3 = time.perf_counter() print("Sorted :", t2-t1, " s ; .sort :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # Sorted : 14.2... s ; .sort : 1.1... s ; rapport : 12.6... </syntaxhighlight> Par rapport à une valeur donnée : * <code>a.remove(x)</code> : retire la première occurrence de la valeur <code>x</code> de la liste <code>a</code> ; * <code>a.index(x)</code> : indique l'indice où se trouve la première occurrence de la valeur <code>x</code> ; * <code>a.count(x)</code> : indique le nombre de fois que l'on trouve la valeur <code>x</code> dans la liste <code>a</code>. === Définition en compréhension === La [[w:fr:Liste en compréhension|définition en compréhension]] ''({{lang|en|list comprehension}})'' est une méthode permettant de construire des listes en indiquant simplement des axiomes, des consignes de filtrage. Cette méthode est élégante car proche de la notation mathématique et compacte, mais c'est une méthode itérative donc lente par rapport à une méthode vectorisée fournie par le module NumPy. Par exemple, pour créer la liste des carrés des nombres entiers entre 0 et 9, il suffit d'écrire <syntaxhighlight lang="python"> carre = [x**2 for x in range(10)] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x^2 | x \in [0 ; 9] \}</math>. Si l'on veut la liste des nombres strictement inférieurs à 20 dont le carré est supérieur à 10, on peut écrire : <syntaxhighlight lang="python"> X = [x for x in range(20) if x**2 > 10] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x | x \in [0 ; 19], x^2 > 10 \}</math>. Pour mettre en évidence la performance du calcul vectorisé par rapport à la méthode itérative : <syntaxhighlight lang="python"> import time import numpy as np n = int(1e7) # taille de la liste t1 = time.perf_counter() carre = [x**2 for x in range(n)] # Définition en compréhension t2 = time.perf_counter() carre2 = np.arange(n)**2 # Calcul vectorisé t3 = time.perf_counter() print("En compréhension : ", t2-t1, "s ; vectorisé :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # En compréhension : 4.515... s ; vectorisé : 0.156... s ; rapport : 28.982... </syntaxhighlight> == Structure d'un programme == Un programme est simplement une suite d'instructions. Dans les environnements Unix BSD, un programme Python peut être considéré comme un script c'est-à-dire qu'il suffit de taper son nom dans l'invite de commande ''({{lang|en|shell}})'' sans avoir à invoquer <code>python</code>. Le programme doit alors commencer par un en-tête normalisé surnommé ''{{lang|en|[[wikt:shebang|shebang]]}}'' : <syntaxhighlight lang="python"> #!/usr/bin/env python3 </syntaxhighlight> Ce ''{{lang|en|shebang}}'' est inutile avec Jupyter. L'en-tête peut également contenir la description de l'encodage du fichier texte, typiquement : <syntaxhighlight lang="python"> # coding: utf-8 </syntaxhighlight> Le codage UTF-8 est le codage par défaut pour Python 3, il est donc inutile de l'indiquer. Les commentaires sont introduits par le croisillon <code>#</code>. On peut grouper une suite d'instructions dans un bloc. Un bloc d'instructions commence par deux-points « <code>:</code> » et est identé, c'est-à-dire qu'il a une marge constituée de quatre espaces — on peut aussi utiliser une tabulation mais il ne faut pas mélanger les deux méthodes ; les tabulations sont déconseillées, il vaut mieux utiliser quatre espaces<ref>{{lien web | url = https://www.python.org/dev/peps/pep-0008/#tabs-or-spaces | titre = Tabs or Spaces? | site = Python documentation | consulté le = 2019-03-14 }}</ref>. Pour terminer le bloc, il suffit simplement de revenir en début de ligne ; contrairement à d'autres langages, il n'y a pas de commende de fin ''({{lang|en|end}})'', c'est l'indentation qui définit le bloc. : # début du bloc ''instruction 1'' ''instruction 2'' … ''dernière instruction du bloc'' ''instruction hors bloc'' Par exemple, une exécution conditionnelle <code>if</code> ou une boucle <code>for</code> exécute un bloc d'instruction. Si l'on a besoin d'un bloc d'instruction qui « ne fait rien », on utilise l'instruction <code>pass</code>. == Structures de contrôle == '''Boucle itérative''' La boucle itérative s'écrit : <syntaxhighlight lang="python"> for <variable> in <itérable>: <bloc d’instructions> </syntaxhighlight> Si l'on veut que la variable prenne ''n'' valeurs de 0 à ''n'' – 1, on utilise l'instruction <code>range()</code> : <syntaxhighlight lang="python"> for i in range(5): print(i) print("Fin de la boucle") </syntaxhighlight> <code>[▶]</code> 0 1 2 3 4 Fin de la boucle En fait, la commande <code>range()</code> extrait des valeurs de l'ensemble des nombres entiers ; on peut ainsi utiliser le découpage en tranches, par exemple <code>range(2, 5)</code>pour avoir la « liste » <code>[2, 3, 4]</code>. Notez que <code>range()</code> ne crée pas à proprement parler une liste, cela crée un objet de type ''« {{lang|en|range}} »'' (plage, intervalle) ; pour avoir une liste, il faut écrire <code>list(range(n))</code>. Dans une boucle, la commande <code>continue()</code> saute la fin du bloc d'instruction et passe à la valeur suivante de la boucle. La commande <code>break()</code> interrompt la boucle et passe à la suite. '''Exécution conditionnelle''' L'exécution conditionnelle s'écrit : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> </syntaxhighlight> On peut utiliser les commandes <code>elif</code> ''(else if'') et <code>else</code> : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> elif <booléen>: <bloc d’instructions> else: <bloc d’instructions> </syntaxhighlight> Notez que le test d'une condition est gourmand en ressources. S'il s'agit de savoir si l'on effectue une opération mathématique simple ou pas, on peut remplacer le test par une multiplication par un booléen (<code>True</code> vaut 1, <code>False</code> vaut 0). Par exemple, plutôt que d'écrire <syntaxhighlight lang="python"> if a > 0: b = b - c </syntaxhighlight> mieux vaut écrire : <syntaxhighlight lang="python"> b = b - (a > 0)*c </syntaxhighlight> '''Boucle antéconditionnée''' La boucle antéconditionnée s'écrit : <syntaxhighlight lang="python"> while <booléen>: <bloc d’instructions> </syntaxhighlight> Cette boucle peut contenir des instructions <code>continue()</code> et <code>break()</code>. == Fonction == La déclaration d'une fonction utilise la commande <code>def</code>. La fonction est un bloc d'instructions. Si elle doit renvoyer des valeurs, on utilise la commande <code>return</code>. Par exemple <syntaxhighlight lang="python"> def nombres(n): """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo a = nombres(3) print(a) </syntaxhighlight> La fonction commence par une chaîne de caractères qui la décrit. Cette chaîne peut être récupérée automatiquement par certains logiciels pour faire une documentation automatique. Si la description prend plusieurs lignes, elle commence et finit par trois double-guillemets <code>"""…"""</code> ; en fait, par convention, même si cela n'est pas obligatoire, les descriptions sont toutes encadrées de trois double-guillemets. Cette description est appelée ''{{lang|en|docstring (documentation string)}}''. Pour récupérer les ''{{lang|en|docstrings}}'' : <syntaxhighlight lang="python"> def foo(): """Cette fonction ne fait rien""" pass print(foo.__doc__) # Cette fonction ne fait rien </syntaxhighlight> L'instruction <code>input()</code> permet à l'utilisateur de saisir une valeur. La valeur est retournée sous la forme d'une chaîne de caractères qui est ensuite convertie en nombre réel avec l'instruction <code>float()</code>. On peut définir une valeur par défaut en l'indiquant dans l'en-tête de la définition de la fonction, de la manière suivante : <syntaxhighlight lang="python"> def nombres(n=1): # valeur par défaut : 1 """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo </syntaxhighlight> Si le paramètre à initialiser est de type modifiable ''({{lang|en|mutable}})'', comme par exemple une liste, il faut procéder comme suit : <syntaxhighlight lang="python"> def fooFonction(fooListe=None): # valeur par défaut : n'existe pas """Description""" if fooListe = None: fooListe = [] # initialisation <suite des instructions> </syntaxhighlight> Par défaut, les variables sont locales. On peut rendre une variable globale avec l'instruction <code>global</code> ''à l'intérieur de la fonction'', avant l'utilisation de la variable. Par exemple : <syntaxhighlight lang="python"> a = 1 b = 1 def toto(): """Test de variable globale. Entrée : aucune. Sortie : aucune.""" global a a = 2 b = 2 toto() print("a =", a, "; b =", b) # a = 2 ; b = 1 </syntaxhighlight> Pour être plus précis : si une variable n'est pas assignée dans une fonction, alors Python va chercher une variable du même nom à l'extérieur de la fonction. Mais à partir du moment où la variable est assignée dans la fonction, elle devient locale ''sauf'' si l'on a utilisé l'instruction <code>global</code>. Si l'on s'attend à un nombre indéfini d'arguments, on utilise la notion d'empaquetage/dépaquetage ''({{lang|en|packing/unpacking}})''<ref>{{lien web | url = https://deusyss.developpez.com/tutoriels/Python/args_kwargs/ | titre = Introduction à *args et **kwargs | consulté le = 2019-03-09 | site = Developpez.com }}.</ref>. L'empaquetage consiste à mettre les arguments dans un n-uplet, le dépaquetage consiste à développer un n-uplet en plusieurs variables. Cela se fait en mettant un astérisque ''({{lang|en|splat}})'' « <code>*</code> » devant le nom de la variable. Par convention, on utilise le nom de variable <code>*args</code> mais cela n'est pas obligatoire. <syntaxhighlight lang="python"> def concatenation(*args): """Concatène des chaînes de caractères Entrée : *args, n-uplet de chaînes de caractères. Sortie : resultat, chaîne de caractères.""" resultat = "" for i in args: resultat = resultat + i return resultat concatenation("a", "foo", "toto") # 'afoototo' </syntaxhighlight> À l'inverse, si une fonction doit recevoir plusieurs paramètres, on peut à la place lui transmettre une liste à dépaqueter : <syntaxhighlight lang="python"> def addition(a, b): """Ajoute deux nombres Entrées : — a : réel ; — b : réel. Sortie : a+b, réel""" return a+b arg = (1, 2) addition(*arg) # 3 </syntaxhighlight> On peut aussi empaqueter/dépaqueter un dictionnaire, on utilise pour cela deux astérisques « <code>**</code> ». Par convention, on utilise le nom <code>**kwargs</code> sans que cela soit obligatoire. L'instruction <code>lambda</code> permet de créer de petites fonctions ne contenant pas de boucle ni de branchement conditionnel. Cependant, si la déclaration est courte et compacte, le code n'est pas toujours facilement lisible ; l'utilisation de cette instruction n'est pas recommandée. Par exemple l'expression <syntaxhighlight lang="python"> f = lambda x: 2*x </syntaxhighlight> est la même chose que <syntaxhighlight lang="python"> def f(x): """Calcule le double. Entrée : x, réel. Sortie : 2*x, réel.""" return 2*x </syntaxhighlight> {{note|L'instruction <code>eval()</code> exécute une chaîne de caractères, c'est-à-dire traite une chaîne de caractères comme si c'étaient des instructions données à Python. Cette instruction est à éviter pour deux raisons : # Un utilisateur malveillant pourrait entrer du code malveillant dans la chaîne de caractères. # L'exécution est lente puisque Python doit compiler la chaîne à la volée. Cette instruction peut en général être remplacée par une autre instruction. }} == Gestion des erreurs == Dans un bloc d'instructions, on peut utiliser la structure <code>try:… except:</code>. Le bloc après <code>try</code> est exécuté ; si une erreur se déclare dans ce bloc, alors le bloc <code>except</code> s'exécute. Par exemple <syntaxhighlight lang="python"> try: 1/0 # Génère une erreur except: print("Division par zéro") # Cette instruction est donc exécutée </syntaxhighlight> On peut compléter avec <code>else:</code> et <code>finally:</code> : <syntaxhighlight lang="python"> try: <code à exécuter> except: <s’exécute en cas d’erreur> else: <s’exécute s’il n’y a pas d’erreur> finally: <s’exécute dans tous les cas> </syntaxhighlight> On peut séparer les différents types d'erreur : <syntaxhighlight lang="python"> try: <code à exécuter> except ValueError: print("Valeur erronée") except TypeError: print("Type erroné") </syntaxhighlight> Les types d'erreur les plus courants sont : * <code>NameError</code> : le nom de variable n'existe pas ; * <code>TypeError</code> : la valeur n'est pas du bon type ; * <code>ValueError</code> : la valeur n'est pas compatible avec ce qui est attendu ; * <code>RuntimeError</code> : type d'erreur général. On peut aussi créer ses propres erreurs : si une situation erronée survient, on peut « lever » une exception avec <code>raise</code>. Par exemple <syntaxhighlight lang="python"> if a < 0: raise ValueError("La valeur doit être positive") </syntaxhighlight> ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/errors.html | titre = Errors and exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} * {{lien web | url = https://docs.python.org/3/library/exceptions.html | titre = Built-in Exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} == Exercices == === Calcul du PGCD et du PPCM par l'algorithme d'Euclide === {{loupe|w:Algorithme d'Euclide}} Écrire un programme Python qui demande deux nombres entiers et affiche leurs PGCD et PPCM. Le programme utilisera l'algorithme d'Euclide. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """Programme : euclide.py Auteur : User:cdang date : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : calcule le PGCD et le PPCM de deux nombres entiers. Entrée ------ au clavier, saisie de deux nombres entiers. Sorties ------- à l'écran, affichage du PGCD et du PPCM. """ # *************** # *************** # ** Fonctions ** # *************** # *************** def euclide(): """Calcule le PGCD et le PPCM avec l'algorithme d'Elclide Entrée ------ Aucune, la saisie des paramètres fait partie de la fonction Sortie ------ affichage du PGCD et du PPCM """ print("***** Algorithme d'Euclide *****\n") a0 = int(input("Premier nombre entier : a = ")) b0 = int(input("Second nombre entier : b = ")) a = a0 b = b0 r = a%b # initialisation while (r != 0) : # algorithme d'Euclide a = b b = r r = a%b # affichage des résultats print("PGCD(", a0, ", ", b0, ") = ", b) print("PPCM(", a0, ", ", b0, ") = ", a0*b0//b) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* euclide() </syntaxhighlight> On peut simplifier la boucle centrale : <syntaxhighlight lang="python"> while b: # s'exécute tant que b n'est pas 0 a, b = b, a % b # affectation de liste à liste return a </syntaxhighlight> {{boîte déroulante fin}} Notez que le module NumPy propose l'instruction <code>gcd()</code> : <syntaxhighlight lang="python"> import numpy … print(numpy.gcd(a, b)) </syntaxhighlight> === Tours de Hanoï === {{loupe|w:Tours de Hanoï}} Écrire un programme Python qui demande le nombre ''n'' de plateaux et affiche les manipulations nécessaires pour déplacer la pile d'un emplacement à un autre. Le programme utilisera l'algorithme récursif. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """nom : hanoi.py auteur : User:cdang date de création : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : résout le problème des tours de Hanoï Entrées ------- trois chaînes de caractères (nom des piliers) Sorties ------- une chaîne de caractères (liste des opérations) """ # *************** # *************** # ** Fonctions ** # *************** # *************** def hanoi(a, b, c, n): """Résout le problème des tours de Hanoï de manière récursive But : déplace la pile de n disques du piler a au pilier b Entrées ------- a, b c : chaînes de 1 caractère, référence des emplacements ; n : entier, nombre de disques sur l'emplacement a Sorties ------- operations : chaînes de caractères décrivant les opérations """" if n>1: operations = hanoi(a, c, b, n-1) operations = operations+a+"→"+b+" ; " operations = operations+hanoi(c, b, a, n-1) else: operations = a+"→"+b+" ; " return operations # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* resultat = hanoi("1", "2", "3", 3) print(resultat) </syntaxhighlight> {{boîte déroulante fin}} === Lancer de rayons === [[Fichier:Lentille hemispherique perspective.svg|vignette|Lentille hémisphérique.]] Considérons une lentille hémisphérique de rayon R faite d’un verre d’indice de réfraction ''n''. Nous plaçons une source ponctuelle à une distance ''d'' du dioptre plan, sur l’axe optique. Tracer des rayons partant de la source et traversant la lentille. {{clear}} {{Boîte déroulante/début |titre=Analyse d’optique géométrique}} [[Fichier:Lentille hemispherique analyse geometrique.svg|vignette|Analyse géométrique du problème.]] Il s’agit d’un problème ayant une symétrie de révolution par rapport à l’axe optique. Nous pouvons nous réduire à un problème plan en nous plaçant dans un plan contenant l’axe optique ; l’axe optique est encore un axe de symétrie orthogonale, nous pouvons donc nous contenter d'étudier un demi-plan. Pour simplifier, nous plaçons le centre du dioptre sphérique à l’origine O du repère. L’axe optique est l’axe ''x'' et l'axe perpendiculaire, vertical sur la figure, c’est l’axe ''y''. Les coordonnées de la source sont donc (-''d'' ; 0). Le rayon issu de la source et faisant un angle θ avec l’axe ''x'' frappe le dioptre plan à l’altitude ''h''. Nous avons : : ''h'' = ''d'' ⋅ tan θ. L’angle d’incidence vaut θ. D’après la loi de Snell-Descartes, l'angle de réfraction θ<sub>2</sub> vaut : : θ<sub>2</sub> = arcsin((sin θ) / ''n''). Le rayon réfracté passe par le points de coordonnées (0, ''h''). L’équation de la droite est donc : : ''y'' = a ⋅ ''x'' + ''h'' avec : ''a'' = tan θ<sub>2</sub>. L’équation du cercle de centre O et de rayon R est : : ''x''<sup>2</sup> + ''y''<sup>2</sup> = R<sup>2</sup>. Les coordonnées (''x''<sub>M</sub>, ''y''<sub>M</sub>) de l’intersection M du rayon avec le dioptre sphérique vérifient les deux équations. Par substitution, nous obtenons une équation du second degré en ''x'' que nous savons résoudre : : ''x''<sub>M</sub><sup>2</sup> + (''a'' ⋅ ''x''<sub>M</sub> + ''h'')<sup>2</sup> = R<sup>2</sup> : ⇔ (1 + ''a''<sup>2</sup>) ⋅ ''x''<sub>M</sub><sup>2</sup> + 2 ⋅ ''a'' ⋅ ''h'' ⋅ ''x''<sub>M</sub> + ''h''<sup>2</sup> – R<sup>2</sup> = 0. D’après les propriétés du cercle, le rayon est perpendiculaire à la tangente. Le rayon [OM] est donc normal au dioptre en M. Nous pouvons déterminer l’angle d’incidence θ<sub>i</sub> par le produit scalaire : : <math>\begin{pmatrix} 1 \\ a \end{pmatrix} \cdot \begin{pmatrix} x_\mathrm{M} \\ y_\mathrm{M} \end{pmatrix} = \sqrt{1^2 + a^2} \cdot \mathrm{R} \cdot \cos(\theta_\mathrm{i})</math> ce qui nous permet de calculer cet angle : : <math>\theta_\mathrm{i} = \operatorname{arcos} \left ( \frac{x_\mathrm{M} + a \cdot y_\mathrm{M}}{\mathrm{R} \cdot \sqrt{1^2 + a^2} } \right )</math> Comme nous passons vers un milieu d’indice plus faible, il y a un risque de réflexion totale. L’angle limite est : : θ<sub>max</sub> = arcsin(1/''n''). Si l’on a θ<sub>i</sub> &gt; θ<sub>max</sub>, le rayon repart vers l’intérieur. Nous ne traçons pas le rayon car cela nous emmènerait trop loin dans l’analyse. En revanche, si θ<sub>i</sub> ≤ θ<sub>max</sub>, alors nous pouvons appliquer la loi de Snell-Descartes pour avoir l’angle de réfraction θ<sub>e</sub> : : θ<sub>e</sub> = arcsin(''n'' ⋅ sin θ<sub>i</sub>). Pour tracer le rayon sortant, il nous faut l’angle θ<sub>3</sub> par rapport à l’horizontale. L’angle du rayon [OM] par rapport à l’horizontal vaut arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>), nous avons donc : θ<sub>3</sub> = arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>) + θ<sub>e</sub>. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Analyse algorithmique}} '''Structure des données''' Le problème est décrit par trois paramètres : # Le rayon <code>R1</code> de la lentille, en milliètres (réel en virgule flottante). # L’indice du verre, <code>n</code> sans dimension (réel en virgule flottante). L’indice de l’air vaut 1. # La distance de la source au dioptre d’entrée plan, <code>d</code> en millimètres (réel en virgule flottante). Un rayon est caractérisé par quatre paramètres : # L’angle d’émission <code>theta1</code> en radians (réel en virgule flottante). # L’angle de réfraction dans la lentille <code>theta2</code> en radians (réel en virgule flottante). # Les cordonnées <code>M</code> en millimètre (vecteur de dimension 2 <code>([x, y])</code> de réels en virgule flottante) du point d’intersection du rayon avec le dioptre sphérique. # L’angle de réfraction dans l’air après la lentille <code>theta3</code> en radians (réel en virgule flottante). Pour le calcul et le tracé, nous avons besoin des paramètres intermédiaires suivants : * l’altitude ''y'' = <code>h</code> en millimètres (réel en virgule flottante) à laquelle le rayon frappe le dioptre plan d’entrée ; * l’angle d’incidence du rayon avec le dioptre sphérique <code>thetaint</code> en radians (réel en virgule flottante). Les angles sont stockés en radians car c’est l’unité naturelle pour le calcul mais nous affichons les valeurs en degrés. Comme le calcul de conversion est récurrent, nous conservons les facteurs <code>degversrad</code> (conversion des degrés vers les radians, facteur valant π/180, réel en virgule flottante) et <code>radversdeg</code> (conversion des radians vers les degrés, facteur valant 180/π, réel en virgule flottante). '''Fonctions''' Nous avons besoin d’une fonction qui calcule les trois paramètres du rayon <code>(theta2, M, theta3)</code> à partir de l’angle d’émission <code>theta1</code>. Nous appelons cette fonction <code>lanceRayon()</code>. Cette fonction fait appelle à une fonction qui calcule l’angle du rayon réfracté à partir de l’angle du rayon incident <code>theta1</code>, les deux angles étant par rapport à la normale au dioptre au point considéré. Nous appelons cette fonction <code>refrac()</code>. La recherche de l’intersection <code>M</code> du rayon avec le dioptre sphérique nécessite de résoudre une équation du second degré. Nous utilisons pour cela la recherche des racines du polynôme en <code>x</code> avec la fonction <code lang="python">numpy.polynomial.polynomial.polyroots()</code>. D’après la configuration du problème géométrique, si l’on s’assure que le rayon frappe bien la lentille (0 ≤ <code>h</code> ≤ <code>R1</code>) alors nous sommes sûrs que le problème a deux solutions réelles (une positive et une négative) ou, dans le cas dégénéré où <code>h == R1</code>, une valeur unique <code>x == 0</code>. Comme nous recherchons la valeur positive, nous sélectionons la plus grande des deux racines. Pour la gestion de la réflexion interne : dans la fonction <code>refrac()</code>, nous vérifions les conditions de réflexion totale et si elles sont remplies, alors nous générons une erreur (commandes <code lang="python">try… except</code> et <code lang="python">raise ValueError</code>). Cette erreur est propagée à la fonction <code>lanceRayon()</code> : <code>lanceRayon()</code> appelle la fonction <code>refrac()</code> et si cette fonction renvoie une erreur, alors <code>lanceRayon()</code> renvoie également une erreur. Pour trouver l’angle d’émission <code>thetaLimite</code> provoquant la réflexion totale (en radians, réel en virgule flottante), nous effectuons une recherche par dichotomie : * nous partons de l’angle maximum possible, lorsque le rayon frappe le sommet de la lentille, et nous appelons la fonction <code>lanceRayon()</code> ; si cela ne génère pas d’erreur, alors nous pouvons aller jusqu’à cette valeur, la recherche est terminée ; si cela génère une erreur, alors nous divisons la valeur par deux ; * à une étape de la recherche donnée, si <code>lanceRayon()</code> ne génère pas d’erreur avec l’angle testé, alors nous savons que l’angle limite est supérieur à cette valeur ; cette valeur minore donc la valeur recherchée ; si au contraire <code>lanceRayon()</code> génère une erreur, alors c’est que l’angle est trop important, cette valeur majore donc la valeur recherchée ; nous pouvons ainsi resserer l’intervalle de recherche ; * nous nous arrêtons lorsque les valeurs haute et basse sont suffisamment proche. Concrètement : # Nous définissons une variable <code>angleHaut</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus bas connu provoquant la réflexion totale. # Nous définissons une variable <code>angleBas</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus haut connu ne provoquant pas de réflexion totale. Sa valeur initiale est 0. L’angle limite recherché est donc entre <code>angleBas</code> et <code>angleHaut</code>. # Nous définissons l’angle <code>angleTest</code> comme étant la moyenne entre <code>angleBas</code> et <code>angleHaut</code>. Si <code>lanceRayon(angleTest)</code> génère une erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleHaut</code> (puisque c’est une valeur provoquant la réflexion totale et qu’elle est plus basse que la valeur actuelle d’<code>angleHaut</code>). À l’inverse, si <code>lanceRayon(angleTest)</code> ne génère pas d’erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleBas</code> (puisque c’est une valeur ne provoquant pas la réflexion totale et qu’elle est plus haute que la valeur actuelle d’<code>angleBas</code>). # Nous arrêtons la procédure lorsque l’écart entre <code>angleBas</code> et <code>angleHaut</code> est inférieur à {{unité|10|échelle=<sup>–3</sup>|rad}} (valeur arbitraire). La valeur retenue est la valeur finale d’<code>angleBas</code> (puisque l’on veut être sûr qu’il n’y ait pas de réflexion totale). La valeur affichée est la valeur en degrés arrondie au dixième. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Solution}} Nous demandons à l’utilisateur ou à l’utilisatrice les valeurs des paramètres du problème : rayon de la lentille, distance de la source, indice de réfraction du verre. Nous vérifions que les valeurs entrées sont bien des nombres ; si c’est une chaîne vide, alors nous utilisons une valeur par défaut. Nous créons une fonction <code>refrac()</code> qui permet de calculer l’angle réfracté à partir de l’angle d’incidence et des indices de réfraction. S’il y a rélexion totale, alors nous générons une erreur. La fonction <code>lanceRayon()</code> calcule les différents points de passage du rayon. Elle appelle pour cela la fonction <code>refrac()</code>. Si un appel de la commande <code>refrac()</code> génère une erreur, alors nous générons également une erreur. Nous déterminons l’angle d’émision du rayon <code>thetaLimite</code> qui provoque une réflecxion totale. Pour cela, nous créons une fonction <code>rechercheLimite()</code> qui cherche par dichotomie. Nous traçons un rayon tous les 5° jusqu’à la valeur limite. <syntaxhighlight lang="python"> #!/usr/bin/env python3 # coding: utf-8 """nom : lancerRayons.py auteur : User:cdang date de création : 2022-05-06 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : NumPy, matplotlib ---------------------------------------------------------------------------- Objectif : trace des trajets optique avec une lentille hémisphérique Entrées ------- Le rayon de la lentille, la distance de la source, l’indice de réfraction du verre, trois chaînes de caractères saisies par l’utilisateur·rice et qui sont converties en réels. Sorties ------- La valeur limite de l’angle (réel) et le tracé de plusieurs rayons. """ # ****************************************************** # ****************************************************** # ** Lancer de rayons pour une lentille hémisphérique ** # ****************************************************** # ****************************************************** import numpy as np import matplotlib.pyplot as plt import numpy.polynomial.polynomial as nppol # ************** # * Constantes * # ************** # Pour la conversion degrés ↔ radians radversdeg = 180/np.pi degversrad = 1/radversdeg # ************* # * Fonctions * # ************* def boucleEntreeNombre(messageSaisie, valeurDefaut): """Permet de s’assurer que l’utilisateur·rice a bien entré un nombre. Entrée : — message à afficher (chaîne de caractères) ; — valeur par défaut (réel à virgule flottante). Sortie : nombre (réel à virgule flottante).""" messageErreur = "Veuillez entrer une valeur numérique (ou vide pour accepter la valeur par défaut).\n" execute = True while execute: strNombre = input(messageSaisie+f" (valeur par défaut {valeurDefaut}) : ") if strNombre == "": nombre = valeurDefaut execute = False else: try: nombre = float(strNombre) except: print(messageErreur) else: execute = False return nombre def initialisation(): """L’utilisateur·rice entre les variables du problème. Entrées : aucune. Sorties : — R1 (mm) : rayon de la lentille ; — d (mm) : distance de la source au dioptre plan ; — n (sans dimension) : indice de réfraction du verre.""" R1 = boucleEntreeNombre("Rayon de la lentille en mm", 20.0) d = boucleEntreeNombre("Distance de la source au dioptre plan en mm", 20.0) n = boucleEntreeNombre("Indice de réfraction (sans dimension)", 1.5) return (R1, d, n) def refrac(n1, n2, theta1): """Calcule l’angle de réfraction theta2 (radians) en fonction — de l’angle d’incidence theta1 (radians); — de l’indice de réfraction n1 du premier milieu ; — de l’indice de réfraction n2 du second milieu.""" reflexionTotale=False rapport=n2/n1 rapportinv=np.reciprocal(rapport) if n1 > n2: thetal = np.arcsin(rapport) # angle limite pour la réflexion totale if theta1 >= thetal: reflexionTotale=True if reflexionTotale: print("Réflexion totale") raise ValueError else: return np.arcsin(rapportinv*np.sin(theta1)) def lanceRayon(n1, n2, d, R, theta1): """Détermine le rayon issu de la source située à une distance d (mm) du bareau et avec une élévation de theta1 (radians), en fonction des indices de réfraction n1 et n2. Les éléments retournés sont : — la hauteur h (mm) à laquelle le rayon frappe le barreau ; — l’angle de réfraction theta2 (radians)) dans le barreau ; — l’angle de réfraction theta3 (radians) à la sortie du barreau — le point M(x, y) (mm) auquel le rayon sort du barreau.""" h = d*np.tan(theta1) if h >= R: print("Le rayon est au-dessus du barreau") raise ValueError else: theta2 = refrac(n1, n2, theta1) a = np.tan(theta2) x = max(nppol.polyroots([h*h - R*R, 2*a*h, 1+a*a])) # recherche de l’intersection du rayon avec le cercle y = a*x + h M = np.array([x, y]) thetaint = np.arccos((x + a*y)/(R*np.sqrt(1 + a*a))) theta3 = np.arctan(y/x) - refrac(n2, n1, thetaint) return (h, theta2, theta3, M) def rechercheLimite(n1, n2, d, R): """Recherche l’angle limite pour la réflexion totale. Entrée : — indice de réfraction des milieux 1 et 2, n1 et n2 ; — distance au barreau, d(mm). Sortie : angle limite theta (radians)""" angleHaut = np.arctan(R/d) angleBas = 0 angleTest = angleHaut try: lanceRayon(n1, n2, d, angleTest, R) except: condition = True # il y a réflexion total en haut de la lentille else: condition = False # il n’y a jamais réflexion totale dans la lentille while condition: #dichotomie angleTest = np.mean([angleHaut, angleBas]) # on ajuste la valeur de test try: lanceRayon(n1, n2, d, R, angleTest) except: angleHaut = angleTest # réflexion totale : on abaisse la valeur maximale else: angleBas = angleTest # pas de réflexion totale : on monte la valeur minimale condition = ((angleHaut - angleBas) >= 0.001) # on a cerné la limite à 0,001 rad près if not condition: angleTest = angleBas return angleTest # *********************** # * Programme principal * # *********************** (R1, d, n) = initialisation() xmax = round(R1 + d) thetaLimite = rechercheLimite(1, n, d, R1) thetaLimiteDeg = thetaLimite*radversdeg print(f"Angle limite pour la réflexion totale : {thetaLimiteDeg:.1f}°.\n") anglesDeg = np.arange(0, thetaLimiteDeg, 5)[1:] # trace un rayon tous les 5° anglesRad = anglesDeg*degversrad nb = len(anglesDeg) h = np.zeros(nb) # initialisation des vecteurs de valeurs theta2 = np.zeros(nb) theta3 = np.zeros(nb) M = np.zeros((nb, 2)) for i in range(nb): (h[i], theta2[i], theta3[i], M[i, :]) = lanceRayon(1, n, d, R1, anglesRad[i]) (h_lim, theta2_lim, theta3_lim, M_lim) = lanceRayon(1, n, d, R1, thetaLimite) # tracé anglesCercle = 0.5*np.pi*(np.linspace(1, 0, 20)) x_cercle = R1*np.cos(anglesCercle) # coordonnées des pints du cercle y_cercle = R1*np.sin(anglesCercle) fig = plt.plot([-d,xmax], [0, 0], "k-.", linewidth="0.5") # tracé de l’axe optique for i in range(nb): plt.plot([-d, 0, M[i, 0], xmax], [0, h[i], M[i, 1], M[i, 1] + (xmax - M[i, 0])*np.tan(theta3[i])], label=f"{anglesDeg[i]:.0f}°") plt.plot([-d, 0, M_lim[0], xmax], [0, h_lim, M_lim[1], M_lim[1] + (xmax - M_lim[0])*np.tan(theta3_lim)], label=f"{0.1*int(np.trunc(10*thetaLimite*radversdeg)):.1f}°") plt.plot(x_cercle, y_cercle, "k", linewidth="0.5") # tracé du cercle plt.plot([0,0], [0, R1], "k", linewidth="0.5") # tracé du premier dioptre #plt.axis("square") plt.gca().set_aspect("equal", adjustable="box") plt.xlabel("x (mm)") plt.ylabel("y (mm)") plt.title("Lentille hémisphérique, lancer de rayons") plt.legend() plt.savefig("lentille_hemispherique_lancer_rayon.svg", format="svg") plt.show() </syntaxhighlight> {{Boîte déroulante/fin}} == Mesurer le temps == Le module <code>time</code> fournit les fonctions suivantes : * <code>time.gmtime()</code> : renvoie la date et l'heure du méridien de Greenwich (''{{lang|en|Greenwich mean time}}'', GMT), sous la forme d'un dictionnaire (année, mois, jour du mois, heure, minute, seconde, jour de la semaine, jour de l'année, heure d'été/hiver), ** jour de la semaine est un entier entre 0 (lundi) et 6 (dimanche), ** jour du mois est un entier entre 1 et 366 ; * <code>time.localtime()</code> : comme le précédent, mais l'heure est l'heure locale ; * <code>time.time()</code> : donne le nombre de seconde qui se sont écoulées depuis le 1er janvier 1970 ; * <code>time.gmtime(n)</code> et <code>time.localtime(n)</code> transforment un nombre de secondes (écoulées depuis le 1er janvier 1970) en une date au format (année, mois, jour, etc.), n-uplet de neuf valeurs ; <code>time.mktime()</code> fait le contraire, il transforme un n-uplet de neuf valeurs (années, mois, jour, etc.) en un nombre de secondes (écoulées depuis le 1er janvier 1970) ; * <code>time.sleep(n)</code> : provoque une pause dans le déroulement du programme de ''n'' secondes ; * <code>time.perf_counter()</code> : indique une date en seconde ; s'utilise pour mesurer la durée d'exécution d'une partie du code, en faisant la différence entre deux relevés. Concernant la date et l'heure sous la forme d'un n-uplet, on peut extraire l'heure de la manière suivante : <syntaxhighlight lang="python"> import time a = time.localtime() print("Il est ", a[3], "h", a[4]) # ou bien print("Il est ", a.tm_hour, "h", a.tm_min) </syntaxhighlight> Pour mesurer la performance d'une portion de code : <syntaxhighlight lang="python"> import time t1 = time.perf_counter() <suite d’instructions> t2 = time.perf_counter() print("Durée d'exécution :", t2-t1 </syntaxhighlight> == Programmation orientée objet == Nous n'allons pas ici faire un cours de programmation orientée objet (POO), nous allons aborder le sujet de manière pragmatique. De manière schématique, un « objet » est une « super-variable ». Cette super-variable peut contenir plusieurs variables, appelées « attributs » ; elle contient en fait un dictionnaire (paires « nom d'attribut : valeur d'attribut »). Elle peut aussi contenir des fonctions spécifiques appelées « méthodes ». De même qu'une variable a un type, un objet fait partie d'une « classe ». La classe est le modèle de l'objet ; en franglais informatique, on dit que l'objet est une instance de la classe. La POO est donc un formalisme : lorsque l'on définit des variables et des fonctions concernant un même type d'objet (au sens commun du terme), on les empaquette dans une classe. Il faut donc d'abord définir la classe, puis attribuer cette classe à un objet (« instancier » la classe). Considérons par exemple que nous voulons travailler sur des [[w:Engrenage|engrenages]] ; pour simplifier, nous nous contentons d'engrenages à dentures droites. Une roue dentée, un pignon, est essentiellement définie par son nombre de dents Z et par son module ''m'' qui correspond à la largeur de dents<ref>ainsi que par son épaisseur ''e'' et le matériau dont elle est faite mais nous allons négliger ces paramètres pour la simplicité de l'étude.</ref>. Nous allons définir trois méthodes : la méthode <code>.diametrePrimitif()</code> qui calcule le diamètre primitif de la roue dentée, <code>.pas()</code> qui calcule la largeur des dents au niveau du cercle primitif et <code>.rapport()</code> qui calcule le rapport de transmission de deux roues engrenées Z<sub>1</sub>/Z<sub>2</sub>. La méthode <code>.rapport()</code> vérifie par ailleurs que les roues ont le même module, condition indispensable pour former un engrenage. Nous définissons la classe ainsi : <syntaxhighlight lang="python"> class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): # instructions lancées lors de la déclaration """Valeurs des attributs""" self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z </syntaxhighlight> Nous remarquons que lorsque nous déclarons les méthodes, le paramètre <code>self</code> correspond à l'objet lui-même. Ainsi, dans la méthode <code>.rapport()</code>, la variable <code>self.Z</code> est le nombre de dents de la roue elle-même et <code>roueDentee.Z</code> est le nombre de dents de la roue passée en paramètre. Pour déclarer les roues, nous écrivons : <syntaxhighlight lang="python"> roue1 = pignon() # attribution de la classe, « instanciation » roue1.Z = 13 # définition des caractéristiques du pignon « roue1 » roue1.m = 2 roue2 = pignon(16, 2) # manière alternative </syntaxhighlight> Nous pouvons alors utiliser les objets de la manière suivante : <syntaxhighlight lang="python"> print(roue1.Z) # 13 print(roue1.diametrePrimitif()) # 26 R = roue1.rapport(roue2) # 0.8125 </syntaxhighlight> La commande <code>dir(a)</code> affiche tous les attributs et méthodes de l'objet <code>a</code>. ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/classes.html | titre = Classes | site = Python documentation | consulté le = 2019-03-08 }} == Interface graphique avec Tk == Une interface graphique utilisateur (GUI, ''{{lang|en|graphic user interface}}'') est un ensemble de boîtes permettant d'interagir avec l'utilisateur c'est-à-dire permettre la saisie d'informations, l'exécution d'actions et afficher des informations. Elle se compose d'éléments appelés ''{{lang|en|widgets}}''. Les éléments ''({{lang|en|widgets}})'' classiques sont : * boîte de dialogue ''({{lang|en|dialog box}})'' : fenêtre contenant d'autres éléments ; * étiquette ''({{lang|en|label}})'' : texte affiché ; * liste déroulante ''({{lang|en|drop-down list}})'' : zone permettant le choix d'une option, la liste se déployant lorsque l'on clique sur la zone ; * zone de texte, champ de saisie ''({{lang|en|text box}})'' : zone permettant de taper du texte ; * boîte combinée ''({{lang|en|combo box}})'' : zone de saisie de texte contenant une liste déroulante qui permet de choisir des éléments prédéfinis ; * bouton ''({{lang|en|button}})'' : objet effectuant une action lorsque l'on clique dessus ; * case à cocher ''({{lang|en|checkbox, tickbox}})'' : objet permettant d'activer ou de désactiver une option lorsque l'on clique dessus ; * bouton radio, case d'option ''({{lang|en|radio button}})'' : objet permettant d'activer une option en désactivant les autres options ; une seule option peut être activée à la fois. Plusieurs modules permettent de gérer les interfaces graphiques. Nous choisissons ici le module développé sur la bibliothèque Tk qui est une bibliothèque multiplateforme. Pour cela, nous importons le module <code>tkinter</code> ainsi que le module <code>ttk</code>, ce dernier proposant des options plus « modernes » : <syntaxhighlight lang="python"> import tkinter as tk from tkinter import ttk </syntaxhighlight> Voici un programme permettant comme précédemment de calculer le rapport de transmission d'un engrenage. Nous détaillons sa construction ci-après. <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: IUrapport.set(valeurZ2/valeurZ1) except: IUrapport.set("erreur") # ************************* # ************************* # ** Interface graphique ** # ************************* # ************************* # fenetre principale fenetre = tk.Tk() fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> '''Explications''' Nous commençons par définir la boîte de dialogue que nous appelons <code>fenetre</code> ; c'est un objet <code>Tk</code> et nous lui donnons un titre « » : <syntaxhighlight lang="python"> fenetre = tk.Tk() fenetre.title("Rapport de réduction") </syntaxhighlight> Puis, nous définissons un cadre attaché à cette fenêtre et qui va nous permettre « d'accrocher » les autres éléments, ce qui permet de garder une apparence satisfaisante lorsque l'on retaille la fenêtre : <syntaxhighlight lang="python"> cadre = ttk.Frame(fenetre) </syntaxhighlight> Le cadre va comporter six lignes ''({{lang|en|row}})'' et deux colonnes ''({{lang|en|column}})''. Nous allons placer une étiquette ''({{lang|en|label}})'' « z1 » : <code>text="z1"</code>. Cette étiquette se trouve dans une case du cadre, celle de la première colonne et la première ligne : <code>grid(column=1, row=1)</code>. Par rapport à cette case, elle est collée à « l'ouest » (W, ''{{lang|en|west}}'', gauche) de la case : <code>sticky=tk.W</code>. <syntaxhighlight lang="python"> z1_label = ttk.Label(cadre, text="z1") # Création de l'étiquette z1_label.grid(column=1, row=1, sticky=tk.W) # Placement de l'étiquette </syntaxhighlight> Notez que l'on aurait pu écrire directement : <syntaxhighlight lang="python"> ttk.Label(cadre, text="z1").grid(column=1, row=1, sticky=tk.W) </syntaxhighlight> mais le fait de séparer la création de l'élément et son placement facilite la maintenance (recherche d'erreur, évolution du code). Pour tout ce qui est dynamique, c'est-à-dire les zone de saisie des valeurs et l'affichage du résultat, il faut définir des « chaînes variables » ''({{lang|variable strings}})'' : <syntaxhighlight lang="python"> IUz1 = tk.StringVar() </syntaxhighlight> Cette variable est une variable globale à la création. Nous pouvons alors placer la zone de saisie ''({{lang|en|entry}})'' à côté de l'étiquette lui correspondant. Nous nommons la zone de saisie <code>z1_entry</code> : <syntaxhighlight lang="python"> z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) </syntaxhighlight> Nous faisons de même pour les trois autres paramètres de l'engrenage, ''m''<sub>1</sub>, ''z''<sub>2</sub> et ''m''<sub>2</sub>. Le résultat est également une chaîne variable globale. Par rapport à notre mise en page, elle se situe dans la case colonne 2 ligne 5, centrée sur cette case (collé à l'est et à l'ouest) : <syntaxhighlight lang="python"> rapport = tk.StringVar() rapport_dynamique = ttk.Label(cadre, textvariable=rapport) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) </syntaxhighlight> Il nous faut encore définir une fonction de manière classique, nous l'appelons « calcule ». Les variables étant globales, on les utilise directement. On récupère les valeurs avec la méthode <code>get()</code> et nous modifions la valeur avec la méthode <code>set()</code> : <syntaxhighlight lang="python"> def calcule(): valeurZ1 = float(IUz1.get()) valeurZ2 = float(IUz2.get()) IUrapport.set(valeurZ2/valeurZ1) </syntaxhighlight> Cette fonction est déclenchée lorsque l'on clique sur le bouton « Calcul » situé dans la case du cadre ligne 6 colonne 2 : <syntaxhighlight lang="python"> bouton = ttk.Button(cadre, text="Calcul", command=calcule) bouton.grid(column=2, row=6, sticky=tk.W) </syntaxhighlight> ou bien si l'on appuie sur la touche <code>[entrée]</code> du clavier : <syntaxhighlight lang="python"> fenetre.bind("<Return>", calcule) </syntaxhighlight> À tout ceci, nous ajoutons des « gouttières » (marges, ''{{lang|en|paddings}}'') afin d'espacer les éléments. Il faut ensuite « activer » la fenêtre pour qu'elle s'affiche. La méthode est <code>mainloop()</code> (boucle principale) : « boucle » (elle est active en permanence et attend des actions sur ses éléments), <syntaxhighlight lang="python"> fenetre.mainloop() </syntaxhighlight> Nous avons ci-dessus mis la plupart du code en programme principal. Nous pouvons aussi programmer de manière fonctionnelle, en mettant la plupart du code dans des fonctions ; cependant, pour que la fenêtre et les variables dynamiques soient globales à tout le programme, elles doivent être déclarées dans le programme principal. Nous pouvons aussi mêler la programmation orientée objet. {{boîte déroulante début|Calcul du rapport de transmission en programmation fonctionnelle et orientée objet}} <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # ************* # ************* # ** Classes ** # ************* # ************* class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): """Valeurs des attributs""" # instructions lancées lors de la déclaration self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z # ************************ # ************************ # ** Variables globales ** # ************************ # ************************ # fenetre principale fenetre = tk.Tk() # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: roue1 = pignon(valeurZ1, valeurM1) roue2 = pignon(valeurZ2, valeurM2) IUrapport.set(roue1.rapport(roue2)) except: IUrapport.set("Erreur") # *********************** # * Interface graphique * # *********************** def configureFenetre(): """Configuration de la fenêtre principale""" fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* configureFenetre() # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> {{boîte déroulante fin}} == Annotations == Une annotation est un commentaire qui sert à expliciter un type de variable. La syntaxe est différente des commentaires « classiques » : cela permet d'avoir un affichage différent avec les éditeurs de texte ayant une coloration syntaxique, et ces informations peuvent être récupérées par des logiciels extérieurs pour effectuer une documentation automatique ou bien des vérifications de type. Cependant : * comme les commentaires normaux, ils n'ont aucune influence lors de l'exécution du texte ; en particulier : * rien n'oblige à annoter les variables ; * il est possible d'avoir une variable ayant un type différent de son annotation ; le fait de pouvoir définir et changer le type de variable à la volée est une fonctionnalité fondamentale de Python. La syntaxe pour une annotation est : : nom_de_variable + deux-points + espace + type par exemple : <syntaxhighlight lang="python"> a: int </syntaxhighlight> Notez qu'ici, la variable n'est ''pas'' créée. Pour la créer, il faut lui affecter une valeur. Il est possible de l'affecter après ou bien sur la même ligne avec la syntaxe : : nom_de_variable + deux-points + espace + type + espace + égal + espace + valeur par exemple : <syntaxhighlight lang="python"> a: int a = 5 # est équivalent à a: int = 5 </syntaxhighlight> Même si l'annotation n'a pas d'impact sur l'exécution, le type doit être un type existant sinon cela génère une erreur de syntaxe. Les types classiques sont : : <code>int</code> — <code>float</code> — <code>str</code> — <code>bool</code> — <code>list</code> — <code>tuple</code> — <code>dict</code> Il est également possible de mettre une chaîne de caractères : <syntaxhighlight lang="python"> a: "ce que je veux" = 3.1516 </syntaxhighlight> On peut annoter une fonction. Il est possible d'annoter les variables déclarées au sein de la fonction, mais pas les variables globales (puisqu'elle ne sont pas définie au sein de la fonction). On peut aussi annoter : * les variables passées en paramètre, avec la même syntaxe dans les parenthèses ; * annoter le type de la variable de sortie (retournée) en la faisant précéder de <code>-&gt;</code> : <syntaxhighlight lang="python"> def plusCinq(a: float = 0) -> float: return a + 5 </syntaxhighlight> ; Ressources * {{lien web | url = https://www.python.org/dev/peps/pep-0526/ | titre = PEP 526 -- Syntax for Variable Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} * {{lien web | url = https://www.python.org/dev/peps/pep-3107/ | titre = PEP 3107 -- Function Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} == Décorateur == Un décorateur est une fonction qui s'applique à une fonction, à la manière de la composition mathématique ''g'' ∘ ƒ = ''g''(ƒ). Mais cette composition affecte la fonction elle-même ; l'utilisateur appelle la fonction ƒ mais c'est la fonction ''g'' ∘ ƒ qui s'exécute. Cette fonction ''g'' est appelée le décorateur. L'intérêt est de pouvoir modifier une fonction sans modifier le code de la fonction elle-même. Pour appliquer une décoration, il faut : # Déclarer le décorateur : une fonction qui s'applique à une autre fonction. # Affecter le décorateur à la fonction visée : en mettant <code>@''décoration''</code> juste avant la définition de la fonction. Par exemple : <syntaxhighlight lang="python"> def decorateur(f): print("Avant la fonction") f() print("après la fonction") @decorateur def afficheFoo(): print("Foo.") afficheFoo # Avant la fonction # Foo. # Après la fonction </syntaxhighlight> Lorsque l'on appelle <code>afficheFoo</code>, on appelle en fait <code>decorateur(afficheFoo)</code>. Si la fonction à modifier admet des paramètres, il faut définir une fonction enveloppante dans le décorateur. Par exemple, nous définissons ci-dessous un décorateur <code>deuxFois()</code> qui fait s'exécuter deux fois de suite la fonction : <syntaxhighlight lang="python"> def deuxFois(f): def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # conteneurFonction </syntaxhighlight> Nous voyons que l'application du décorateur a modifié le nom de la fonction — pas le nom de la variable qui contient la fonction mais bien son nom « intime ». Pour éviter cela, on utilise la méthode <code>wraps()</code> du module <code>functools</code> : <syntaxhighlight lang="python"> import functools def deuxFois(f): @functools.wraps(f) def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # plusCinq </syntaxhighlight> On peut par exemple utiliser un décorateur pour la mémoïsation. La mémoïsation est une méthode consistant à mémoriser les valeurs d'une fonction au fur et à mesure de son utilisation ; ainsi, si l'on veut évaluer la fonction avec les mêmes entrées, on se contente d'aller chercher la valeur enregistrée ce qui est plus rapide. On sacrifie donc la place mémoire au profit de la rapidité. On peut trouver des décorateurs de mémoïsation aux adresses suivantes : * https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize * https://gist.github.com/robcowie/1357800 ; Ressources : {{lien web | url = https://www.python.org/dev/peps/pep-0318/ | titre = PEP 318 -- Decorators for Functions and Methods | site = Python.org | lang = en | consulté le = 2019-04-05 }} == Manipulation de fichiers == === Importer le contenu d'un fichier === Python possède la fonction <code lang="python">open()</code> qui permet d'ouvrir un fichier. Ouvrir signifie qu'il crée un objet de type <code>file</code> qui possède notamment les méthodes <code lang="python">read()</code> et <code lang="python">write()</code>. Il peut s'agir d'un objet de type « fichier binaire » ''({{lang|en|binary file}})'' ou « fichier texte » ''({{lang|en|text file}})''. Si par exemple on veut utiliser (et donc lire) le contenu du fichier texte <code>monfichier.txt</code>, on écrit : <syntaxhighlight lang="python"> fichier = open("monfichier.txt", "rt") … fichier.close() </syntaxhighlight> Le paramètre <code>"rt"</code> signifie que nous ouvrons le fichier en lecture ''({{lang|en|read}})'' et qu'il s'agit d'un objet de type fichier texte. Notons deux choses : * en faisant cela, nous ne faisons qu'associer le fichier à un objet Python, nous n'avons pas encore importé les données ; * si nous ouvrons le fichier, il faut le fermer par la suite ; c'est pourquoi nous utilisons la méthode <code lang="python">.close()</code>. Pour éviter d'avoir à fermer le fichier, nous pouvons l'ouvrir au sein d'un contexte : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: … </syntaxhighlight> Notons aussi que la chaîne de caractères indiquant le nom du fichier peut contenir le chemin d'accès au répertoire (dossier), mais sous Microsoft Windows, il faut utiliser des barres de fractions <code>/</code> pour séparer les sous-répertoires au lieu de la barre inversée habituelle, par exemple : <syntaxhighlight lang="python"> chemin = "C:/Temp/monfichier.txt" with open(chemin, "rt") as fichier: … </syntaxhighlight> Pour mettre les données du fichier dans la variable <code>contenu</code>, nous écrivons donc : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() print(contenu) </syntaxhighlight> et si nous ne voulons lire que les <code>n</code> premiers caractères (<code>n</code> étant un entier), nous utilisons <code lang="python">contenu = fichier.read(n)</code>. Cette lecture est séquentielle, c'est-à-dire que si nous appliquons la méthode plusieurs fois, nous reprenons la lecture là où nous l'avons laissée. Si nous voulons lire une ligne, nous utilisons la méthode <code lang="python">.readline()</code>. La lecture ligne par ligne est également séquentielle. Nous pouvons aussi créer une liste dont chaque élément est une ligne du fichier ; nous utilisons alors la méthode <code lang="python">.readlines()</code> (notez le pluriel). Chaque élément de la liste se termine par le caractère de fin de ligne <code lang="python">\n</code>. Pour l'enlever, nous pouvons utiliser la méthode <code lang="python">.rstrip()</code> pour chaque élément de la liste, par exemple. L'exemple complet est alors : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.readlines() contenu = [item.rstrip() for item in contenu] print(contenu) </syntaxhighlight> === Exporter du contenu vers un fichier === Si nous voulons créer un fichier texte pour y mettre le contenu de la variable <code>texte</code>, alors nous utilisons : <syntaxhighlight lang="python"> with open("monfichier.txt", "wt") as fichier: contenu = fichier.write(texte) </syntaxhighlight> Le module principal important pour la manipulation de fichiers est est <code lang="python">os</code>. === Exploiter le contenu d'un fichier texte === Avec un fichier texte, la méthode <code lang="python">.read()</code> crée une variable de type texte. Nous pouvons séparer cette variable en différentes lignes avec la méthode <code lang="python">.splitlines()</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une ligne. Si maintenant une ligne contient plusieurs données séparées par un séparateur commun, par exemple un espace, nous pouvons séparer les données par la méthode <code lang="python">.split(''séparateur'')</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une donnée. Si par exemple le fichier est du type CSV ''({{lang|en|comma separated values}}'', valeurs séparées par une virgule), l'exploitation du fichier est : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(",") for item in contenu] </syntaxhighlight> La variable <code>contenu</code> est une liste de listes. Pour avoir la ''n''<sup>e</sup> valeurs de la ''m''<sup>e</sup> ligne, on utilise : <syntaxhighlight lang="python"> contenu[m-1][n-1] </syntaxhighlight> Si l'on veut extraire la ligne ''m'' il suffit d'écrire : <syntaxhighlight lang="python"> contenu[m-1] </syntaxhighlight> mais si l'on veut la colonne ''n'', le plus simple est d'utiliser une définitipon en compréhension : <syntaxhighlight lang="python"> [ligne[n-1] for ligne in contenu] </syntaxhighlight> Dans certains fichiers CSV, les séparateurs de valeurs ne sont pas des virgules, on peut donc utiliser un autre caractère pour le séparateur. Si le séparateur est une tabulation, on utilise <code lang="python">\t</code> : <code lang="python">contenu = [item.split("\t") for item in contenu]</code> Si la première ligne contient les en-têtes des colonnes, on peut l'enlever avec la fonction <code lang="python">del()</code> : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() del(contenu[0]) contenu = [item.split(",") for item in contenu] </syntaxhighlight> Certains logiciels créent des fichiers en utilisant le séparateur décimal régional, qui en France est la virgule. Pour remplacer les virgules par des points, on peut utiliser la méthode <code lang="python">.replace()</code>, de préférence ''avant'' de séparer les valeurs : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.replace(",", ".") for item in contenu] # remplace les virgules par des points contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule </syntaxhighlight> en effet, lorsque l'on a séparé les valeurs, on a une liste de liste, il faut alors balayer les sous-listes ce qui prend plus de temps : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule contenu = [[subitem.replace(",", ".") for subitem in item] for item in contenu] # remplace les virgules par des points </syntaxhighlight> '''Exemple complet''' Supposons que l'on ait un fichier texte de la forme : <syntaxhighlight lang="text"> x y z V 0.0 1.5 3.2 8.657 0.4 1.5 3.2 8.392 0.2 1.5 3.2 8.485 ... </syntaxhighlight> C'est un fichier valeurs V associées à des points de coordonnées ''(x, y, z)'' (un champ V sur l'espace, donc). Nous remarquons que seule la coordonnée ''x'' change : les données concernent la droite (''y'' = 1,5 ; ''z'' = 3,2). Nous remarquons aussi que les valeurs de ''x'' ne sont pas classées par ordre croissant ni décroissant. Nous voulons au final avoir une matrice [[''x''], [V]] triée par ''x'' croissant. Pour cela, nous pouvons faire : <syntaxhighlight lang="python"> with open(nomdefichier, "rt") ad fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(" ") for item in contenu contenu = contenu[1:] # élimine la première ligne x = np.array([float(ligne[0]) for ligne in contenu]) V = np.array([float(ligne[3]) for ligne in contenu]) donnees = np.concatenate((x.reshape(-1, 1), V.reshape(-1, 1)), axis=1) # matrice [[x], [V]] ind = np.argsort(donnees[:, 0]) donnees = donnees[ind, :] # matrice triée plt.plot(donnees[:, 0], donnees[:, 1]) </syntaxhighlight> {{note|Pour le tri, voir [[../Manipulation_de_matrices#Fonctions_et_méthodes_de_base|''Manipulation de matrices'' &gt; ''Fonctions et méthodes de base'']].}} === Cas d'un fichier CSV === Si le fichier CSV ne contient que des valeurs numériques, on peut utiliser : <syntaxhighlight lang="python"> valeurs = np.loadtxt(chemin+nomfic, delimiter=",") # si le séparateur est une virgule </syntaxhighlight> Il existe un module <code lang="python">csv</code> dédié aux fichiers CSV. La manipulation du fichier se fait comme suit : <syntaxhighlight lang="python"> import csv with open(chemin+nomfic, "rt") as fichier: lecteur = csv.reader(fichier, delimiter=",") contenu = [ligne for ligne in lecteur] print(contenu) </syntaxhighlight> === Utilisation de Pandas === Pandas<ref>https://pandas.pydata.org/</ref> est un module gérant les tableaux de données, appelés <em lang="en">data frames</em>. Voici quelques commandes utiles : <syntaxhighlight lang="python"> import numpy as np import pandas as pd M = np.random.rand(10, 10) # crée une matrice NumPy aléatoire de dimension 10 × 10 tableau = pd.DataFrame(M) # transforme la matrice en tableau DataFrame tableau.to_csv("tableau.csv") # enregistre le tableau dans un fichier CSV donnees = pd.read_csv("tableau.csv").to_numpy() # lit le fichier et transforme le tableau DataFrame en matrice NumPy </syntaxhighlight> == Exporter un programme Python == Vous pouvez créer un fichier « Python pur » <code>.py</code>. Pour cela, dans le menu <code>fichier/file</code> de Jupyter, choisir <code>télécharger/download</code> au format <code>.py</code> ; le fichier se trouve alors dans le répertoire de téléchargement du navigateur. == Ressources == * {{lien web | url = https://www.python.org/dev/peps/pep-0008/ | titre = PEP 8 -- Style Guide for Python Code | site = Python documentation | consulté le = 2019-03-14 }} == Notes et références == {{références}} ---- [[../Fonctions mathématiques générales|Fonctions mathématiques générales]] &lt; [[../|↑]] &gt; [[../Graphiques|Graphiques]] {{DEFAULTSORT:Elements de programmation}} [[Catégorie:Python pour le calcul scientifique (livre)]] l405nwxmqsrmynvgfyg39j86ilrg8u2 767325 767324 2026-06-02T13:36:45Z Cdang 1202 /* Autres fonctions */ exemple plus complet 767325 wikitext text/x-wiki Rappel : les programmes commencent par : <syntaxhighlight lang="python"> #!/usr/bin/python3 import numpy as np import matplotlib.pyplot as plt </syntaxhighlight> == Entrées et sorties == Pour permettre à l'utilisateur ou à l'utilisatrice d'entrer une valeur, nous utilisons la fonction <code lang="python">input()</code> comme évoqué précédemment (chapitre ''[[../Premiers programmes|Premiers programmes]]''), avec la syntaxe <code lang="python">''variable'' = input(''texte'')</code>. Notez que la valeur renvoyée par <code lang="python">input()</code> est une chaîne de caractères. Si vous voulez autre chose, typiquement un nombre, il faut convertir cette chaîne. Par exemple, nous demandons ici d'entrer une longueur sous la forme d'une valeur numérique : <syntaxhighlight lang="python"> longueurDefaut = 10.0 texteDemandeLongueur = f"Veuillez entrer la longueur en millimètres (valeur par défaut {longueurDefaut} mm) : " longueur = input(texteDemandeLongueur) if longueur=="": longueur=longueurDefaut else: longueur=float(longueur) print(longueur) </syntaxhighlight> Pour afficher un texte, on utilise la fonction <code lang="python">print()</code>, également présentée dans le chapitre ''[[../Premiers programmes|Premiers programmes]]'', avec la syntaxe <code lang="python">print(''texte'')</code>. Le texte à afficher peut être de n'importe quel type (entier, réel en virgule flottante, booléen, chaîne de caractères…) mais si l'on veut « mélanger » les types, il faut tout convertir en chaînes de caractères, avec la fonction <code lang="python">str()</code>, et concaténer les chaînes avec <code lang="python">+</code>. Par exemple : <syntaxhighlight lang="python"> print("La longueur vaut : "+str(longueur)+" mm.") </syntaxhighlight> Nous pouvons aussi utiliser une « chaîne “f” » ''({{lang|en|f-string}})'' : on met un le <code lang="python">f</code> devant le guillemet ouvrant et dans la chaîne, on met un champ sous la forme <code lang="python">{''nomDeVariable''}</code>. L'exemple ci-dessus devient alors : <syntaxhighlight lang="python"> print(f"La longueur vaut : {longueur} mm.") </syntaxhighlight> Les chaînes « f » sont détaillées dans la section ''[[#Chaînes de caractères|Chaînes de caractères]]'' ci-dessous. Si l'on veut introduire un retour à la ligne dans la chaîne, on utilise les caractères <code lang="python">\n</code> (contre-oblique suivie de la lettre N minuscule). Par exemple <syntaxhighlight lang="python"> print("Ceci est un texte\navec un retour à la ligne.") </syntaxhighlight> == Types de variables == === Généralités === Python définit « tout seul » le type de la variable : « <code>3</code> » sera un entier ''({{lang|en|integer}})'', « <code>3.0</code> » sera un réel à virgule flottante ''({{lang|en|float}})'', « <code>"3"</code> » sera une chaîne de caractères ''({{lang|en|string}})''. On peut connaître le type d'une variable avec la fonction <code>type()</code>. On peut tester certaines valeurs, avec le module <code>NumPy</code> : * <code>np.isnan(x)</code> indique si les valeurs de ''x'' sont des NaN ''({{lang|en|not a number}})'' ; si ''x'' est une matrice, le résultat est une matrice de booléens, l'élément [''i'', ''j''] est <code>True</code> si <code>x[i, j]</code> est un NaN ; * <code>np.isinf(x)</code> indique si les valeurs de ''x'' sont ±∞ ; si ''x'' est une matrice, le résultat est une matrice booléenne de même dimension. On peut forcer un type : * <code>int(x)</code> : transforme la valeur ''x'' en nombre entier ; * <code>long(x)</code> : " en entier long (précision illimitée) ; * <code>float(x)</code> : " en nombre réel à virgule flottante ; * <code>str(x)</code> : " en chaîne de caractères ; * <code>complex(Re, Im)</code> : crée le nombre complexe ''Re'' + ''Im''·j, j désignant la racine carrée de –1 ; * <code>list()</code> : crée une liste ; * <code>tuple()</code> : crée un n-uplet. Par exemple <syntaxhighlight lang="python"> type(3) # <class 'int'> type(float(3)) # <class 'float'> complex(1, 1) == 1 + 1j # True list("blabla") # ['b', 'l', 'a', 'b', 'l', 'a'] </syntaxhighlight> Python distingue plusieurs genres de types : * Un itérable est un objet dont on peut extraire les éléments un par un ; ce sont les objets pour lesquels on peut écrire <code> for i in ''iterable'':</code>. Il s'agit essentiellement des listes, n-uplets, chaînes de caractères, ensembles, dictionnaires et fichiers. * Un modifiable ''({{lang|en|mutable}})'' est un objet que l'on peut modifier ; par exemple une liste est modifiable — on peut changer la valeur d'un élément, en ajouter ou en enlever un — mais les n-uplets non, pas plus qu'une chaîne de caractères ou un nombre. * Un identifiable (''{{lang|en|hashable}}'', le ''{{lang|en|hashage}}'' étant une signature caractéristique d'un objet) : objet possédant un identifiant unique. Un objet identifiable est toujours non-modifiable ''({{lang|en|unmutable}})''. === Types numériques === ==== Entiers ==== Nous pouvons définir les entiers au format octal ou hexadécimal : il faut débuter le nombre par respectivement <code>0o</code> (le chiffre zéro et la lettre o) et <code>0x</code> (le chiffre zéro et la lettre x). À l'inverse, la fonction <code>hex()</code> renvoie une chaîne correspondant à l'écriture d'un entier au format hexadécimal, et <code>oct()</code> renvoie la chaîne correspondant à l'éciture en octal. Par exemple : <syntaxhighlight lang="python"> print(0o10, ";", 0x10) # 8 ; 16 print(hex(20)) # 0x14 </syntaxhighlight> ==== Réels ==== Les réels disposent de fonctions spécifiques appelées « méthodes ». Une méthode est une fonction spécifique à un type d'objets. Étant conçue ''ad hoc'', elle est souvent plus économe en ressource et en temps qu'une fonction générique. Pour appliquer la méthode <code>meth()</code> à la variable <code>x</code>, on écrit : <code>x.meth()</code>. Nous avons déjà présenté la méthode <code>''float''.as_integer_ration()</code> qui donne la fraction réduite égale à la valeur du nombre. Les réels disposent de plusieurs autres méthodes : * <code>''float''.trunc()</code> : tronque le nombre réel ; * <code>''float''.floor()</code>, <code>''float''.ceil()</code> : renvoie l'entier le plus proche, respectivement inférieur ou supérieur ; * <code>''float''.hex()</code> : renvoie une chaîne de caractères correspondant à l'écriture du nombre en hexadécimal. Par exemple : <syntaxhighlight lang="python"> a = 20. print(a.hex()) # 0x1.4000000000000p+4 print(10..hex()) # 0x1.4000000000000p+3 </syntaxhighlight> Dans le deuxième exemple, nous appliquons la méthode <code>''float''.hex()</code> directement au nombre <code>10.</code> ; le point est obligatoire car sinon, c'est un entier, pour lequel la méthode n'est pas définie. Notez que la ''méthode'' <code>''float''.hex()</code> est différentes de la ''fonction'' <code>hex()</code> : la première concerne les réels, la seconde les entiers. ==== Complexes ==== Nous avons déjà mentionné la méthode <code>''complex''.conjugate()</code> qui donne le conjugué du nombre. Un nombre complexe dispose de deux attributs : * <code>''complex''.real</code> : sa partie réelle ; * <code> ''complex''.imag</code> : sa partie imaginaire. Par exemple : <syntaxhighlight lang = "python"> a = 5+2j print(a.conjugate(), ";", a.real, ";", a.imag) # (5-2j) ; 5.0 ; 2.0 </syntaxhighlight> === Chaînes de caractères === ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/inputoutput.html | titre = 7. Input and Output | site = Python Documentation | consulté le = 2019-04-06 }} ==== Généralités ==== Il existe en fait trois manières de définir une chaîne de caractères : * avec des guillemets simples ou doubles comme vu précédemment : <code>"…"</code> ou bien <code>'…'</code> ; * avec trois guillemets doubles : <code>"""…"""</code> : cela permet d'avoir une chaîne de caractères s'étendant sur plusieurs lignes, les retours de ligne étant pris en compte ; c'est utilisé en particulier pour la description des fonctions (''{{lang|en|docstrings}}'', voir ci-après) ; * avec des guillemets précédés d'un « r », <code>r"…"</code> ou <code>r'…'</code> : cela permet d'interpréter les barres de fraction inverses « \ » comme un caractère « normal » et non comme un caractère d'échappement (voir ci-après) ; cela est utile lorsque l'on utilise les possibilités LaTeX dans le tracé de graphiques (voir plus loin) ; * avec des guillemets précédés d'un « f », <code>f"…"</code> ou <code>f'…'</code> : cela permet d'utiliser des variables formatées (voir ci-après). Une chaîne de caractères n'est pas modifiable. Si l'on veut remplacer un caractère, l'insérer ou le supprimer, il faut transformer la chaîne en liste, avec la commande <code>list()</code>, puis rassembler la liste en la joignant ''({{lang|en|join}})'' à une chaîne vide : <syntaxhighlight lang="python"> chaine = "blabla" chaineList = list(chaine) chaineList[2] = "c" chaine = "".join(chaineList) print(chaine) # blcbla </syntaxhighlight> Dans une chaîne simple <code>"…"</code> ou <code>'…'</code>, on peut introduire un retour à la ligne avec <code>\n</code>. ==== Substitution de variables ==== Lorsque l'on veut utiliser des variables, on fait précéder les guillemets d'un « f » et l'on écrit les noms de vrariables entre accolades. Par exemple : <syntaxhighlight lang="python"> monde = "world" chaine = f"Hello {monde}!" print(chaine) # Hello world! </syntaxhighlight> On peut indiquer la taille de la chaîne générée à partir de la variable sous la forme <code>{nomVariable:taille}</code>, la taille étant un entier. Par exemple : <syntaxhighlight lang="python"> chiffre1 = 1 nom1 = "un" chiffre2 = 2 nom2 = "deux" chaine = f"{nom1:5} : {chiffre1:5d}\n{nom2:5} : {chiffre2:5d}" print(chaine) # un : 1 # deux : 2 </syntaxhighlight> Vous remarquez que l'on ajoute un « d » pour les entiers décimaux, et que les nombres sont alignés à droite. Si le nombre est un nombre réal à virgule flottante ''({{lang|en|float}})'', on peut indiquer le nombre de décimales sous la forme <code>.''n''f</code> : <syntaxhighlight lang="python"> chaine = f"{np.pi:.5f}" print(chaine) # 3.15169 </syntaxhighlight> Avec la syntaxe <code>''m''.''n''f</code>, on indique également que la totalité du nombre doit occuper ''m'' caractères. Pour convertir un nombre en caractère Unicode correspondant, on utilise la lettre c : <syntaxhighlight lang="python"> nompi = 0x03c0 # Caractère Unicode π : U+03C0 chaine = f"{nompi:c} = {np.pi:.5f}" print(chaine) # π = 3.14159 </syntaxhighlight> La classe ''str'' dispose également de la méthode <code>.format()</code>. On indique un n-uplet de chaînes (ou de nombres) à la méthode et l'on met des accolades dans la chaîne principale ; les accolades sont remplacées dans l'ordre des chaînes de la méthode. On peut changer l'ordre en indiquant quelle valeur utiliser dans quelle accolade. Par exemple : <syntaxhighlight lang="python"> chaine1 = "On compte {} puis {}".format(1, 2) chaine2 = "On compte {0} puis {1}. Mais à rebours, on compte {1} puis {0}.".format("un", "deux") print(chaine1, "\n", chaine2) # On compte 1 puis 2 # On compte un puis deux. Mais à rebours, on compte deux puis un. </syntaxhighlight> L'utilisation du caractère pourcent « % » permet d'utiliser la mise en forme <code>sprintf()</code> du langage C : <syntaxhighlight lang="python"> chaine = "π = %.5f" % np.pi print(chaine) # π = 3.14159 </syntaxhighlight> ; Exemple <nowiki>:</nowikI> barre de progression : Voici une fonction affichant une barre de progression, pour la ''i''-ème étape d'un processus ayant ''n'' étapes (pour la notion de fonction, voir la section ci-après ''[[#Fonction|Fonction]]''). : NB : nous avons utilisé les codes Unicode pour l'exemple, mais on peut évidemment copier le caractère, par exemple depuis une table Unicode ou une page Web<ref>Pour le point médian : ''{{W|Table des caractères Unicode/U0080}}'' ou ''{{W|Point médian}}''. Pour le pavé : ''{{W|Table des caractères Unicode/U2580}}''.</ref>, et le coller dans le code, comme nous l'avons fait dans le commentaire. <syntaxhighlight lang="Python"> def barre_progression(i, n, largeur=40): """ Affiche une barre de progression Entrées : — i : étape en cours, entier ; — n : nombre d'étapes à réaliser, entier ; — largeur : nombre de caractères total de la barre, entier. Sortie : affichage de la barre de progression. """ taux = i/n fait = int(largeur * taux) barre = f"{0x2588:c}" * fait + f"{0x00b7:c}" * (largeur - fait) # U+2588 : pavé "█" ; U+00B7 : point médian "·" print(f"Progression | {barre} | {100*taux:3.1f} %") barre_progression(25, 100) # Progression | ██████████······························ | 25.0 % </syntaxhighlight> ==== Méthodes des chaînes ==== Le type ''str'' dispose d'un certain nombre de méthodes. Nous avons déjà vu les méthodes <code>''str''.join()</code> et <code>''str''.format()</code>, en voici quelques autres : * <code>''str''.capitalize()</code> : met le premier caractère en capitale (majuscule) et les autres en minuscule ; * <code>''str''.lower()</code> : met tout en minuscules ''({{lang|en|lowercase}})'' ; * <code>''str''.upper()</code> : met tout en capitales ''({{lang|en|lowercase}})'' ; * <code>''str''.center(''n'')</code> : met la chaîne au centre d'une chaîne de longueur ''n'', en complétant avec des espaces ; on peut compléter avec d'autres caractères avec <code>''str''.center(''n'', ''c'')</code>, par exemple <code>"a".center(7, ".")</code> donne <code>"....a...."</code> ; * <code>''str''.ljust(''n'', ''c'')</code> et <code>''str''.rjust(''n'', ''c'')</code> : comme <code>.center()</code> mais la chaîne est respectivement alignée au fer à gauche ''({{lang|en|left}})'' et à droite ''({{lang|en|right}})'' ; * <code>''str''.isdigit()</code> : booléen vrai si tous les caractères sont des nombres ; * <code>''str''.find(''sous-chaine'')</code>, <code>''str''.rfind(''sous-chaine'')</code> : indique respectivement le premier emplacement et le dernier emplacement de la sous-chaîne dans la chaîne ; * <code>''str''.partition(''séparateur'')</code> : retourne un triplet avec la portion de chaîne avant le séparateur, le séparateur puis la portion de chaîne après le séparateur ; * <code>''str''.replace(''ancien'', ''nouveau'')</code> : remplace la chaîne ''ancien'' par la chaîne ''nouveau'' dans la chaîne ; * <code>''str''.split(''séparateur'')</code> : découpe la chaîne au niveau des séparateurs et renvoie une liste. ==== Autres fonctions ==== La fonction <code>chr()</code> transforme un code Unicode en caractère. Par exemple, <code>chr(97)</code> donne <code>"a"</code> et <code>chr(0x03c0)</code> donne <code>"π"</code>. Si on veut créer une liste de caractères qui se suivent, on peut par exemple utiliser : <syntaxhighlight lang="python"> [chr(x) for x in range(97, 102)] # ['a', 'b', 'c', 'd', 'e'] </syntaxhighlight> Si on veut créer une liste de nombres sous la forme de chaînes de caractères, on peut utiliser la commande <code>str()</code> vue ci-dessus. Par exemple : <syntaxhighlight lang="python"> [str(x) for x in range(1, 6)] # ['1', '2', '3', '4', '5'] </syntaxhighlight> Pour la syntaxe, voir ci-dessous la section [[#Définition en compréhension|''Définition en compréhension'']]. Ainsi, dans l'exemple de la barre de progression ci-dessus, on peut utiliser la solution suivante pour constituer la barre : <syntaxhighlight lang="python"> barre = chr(0x2588) * fait + chr(0x00b7) * (largeur - fait) # U+2588 : bloc ; U+00B7 : point médian </syntaxhighlight> Rappel : le module <code>html</code> permet d'utiliser les entités HTML : <syntaxhighlight lang="python"> import html … print(html.entities.html5["alpha;"]+html.entities.html5["middot;"]) # α· </syntaxhighlight> L'entité HTML <code>&xxx;</code> s'obtient par <code>html.entities.html5["xxx;"]</code>, donc en enlevant la perluète ; mais cela ne fonctionne pas avec les codes Unicode. Pour cela, on peut utiliser la commande <code>html.unescape()</code>. Ainsi, dans l'exemple de la barre de progression ci-dessus, on peut utiliser la solution suivante pour constituer la barre : <syntaxhighlight lang="python"> barre = html.unescape("&#x2588;") * fait + html.entities.html5["middot;"] * (largeur - fait) # U+2588 : bloc ; middot : point médian </syntaxhighlight> La commande <code>html.unescape()</code> interprète une chaîne complète, par exemple <syntaxhighlight lang="python"> print(html.unescape("L'esperluette est le caractère &laquo;&nbsp;&amp;&nbsp;&raquo;.")) # L'esperluette est le caractère « & ». </syntaxhighlight> == Manipulation de listes == Les listes sont une structure de données fondamentale en Python. ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/datastructures.html | langue = en | titre = 5. Data structures | site = Python documentation | consulté le = 2019-03-16 }} === Copie d'une liste === Contrairement à d'autres types, lorsque vos écrivez <code>b = a</code> avec des listes, vous ne créez pas une copie de la variable <code>a</code>, vous créez un ''alias'' : l'objet <code>b</code> est un autre nom de l'objet <code>a</code>. En particulier, si vous modifiez <code>b</code>, vous modifiez en fait <code>a</code>. Par exemple : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a b[2] = 5 print(a, b) # [1, 2, 5, 4] [1, 2, 5, 4] </syntaxhighlight> Si l'on veut créer une copie de <code>a</code>, il faut utiliser <code>a[:]</code> ou bien <code>a.copy()</code> : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a[:] c = a.copy() b[2] = 5 c[2] = 6 print(a, b, c) # [1, 2, 3, 4] [1, 2, 5, 4] [1, 2, 6, 4] </syntaxhighlight> === Méthodes de listes === Pour modifier une liste, vous disposez des méthodes suivantes : * <code>a.append(x)</code> : ajoute l'élément <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.extend(x)</code> : ajoute la liste <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.append(i, x)</code> : aoute l'élément <code>x</code> ''avant'' l'interstice ''i'' de la liste <code>a</code> ; * <code> x = a.pop(i)</code> : enlève l'élément ''i'' de la liste <code>a</code> et le met dans la variable <code>x</code> ; <code> x = a.pop()</code> enlève le dernier élément de la liste ; * <code>a.clear()</code> : vide la liste <code>a</code> ; * <code>a.sort()</code> : trie la liste par ordre croissant ; * <code>a.sort(reverse = True)</code> : trie par ordre décroissant ; * <code>a.reverse()</code> : inverse l'ordre de <code>a</code>. Pour supprimer l'élément à l'indice ''i'', au lieu d'utiliser <code>a.pop(i)</code>, on peut aussi utiliser <syntaxhighlight lang="python"> del(a[i]) </syntaxhighlight> Pour trier une liste, on peut aussi utiliser la fonction <code>sorted()</code>, ce qui permet par exemple de conserver la liste originale, non triée : <code>b = sorted(a)</code>. La fonction <code>sorted()</code> fonctionne avec tous les objets « itérables » comme par exemple une chaîne de caractères : <syntaxhighlight lang="python"> a = "ahjbfk" print(sorted(a)) # ['a', 'b', 'f', 'h', 'j', 'k'] </syntaxhighlight> Pour mettre en évidence la performance de la méthode <code>''list''.sort()</code> par rapport à la fonction générique <code>sorted()</code> : <syntaxhighlight lang="python"> import numpy as np import time a = np.random.rand(int(1e7)) t1 = time.perf_counter() b = sorted(a) # Fonction générique t2 = time.perf_counter() a.sort() # Méthode spécifique t3 = time.perf_counter() print("Sorted :", t2-t1, " s ; .sort :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # Sorted : 14.2... s ; .sort : 1.1... s ; rapport : 12.6... </syntaxhighlight> Par rapport à une valeur donnée : * <code>a.remove(x)</code> : retire la première occurrence de la valeur <code>x</code> de la liste <code>a</code> ; * <code>a.index(x)</code> : indique l'indice où se trouve la première occurrence de la valeur <code>x</code> ; * <code>a.count(x)</code> : indique le nombre de fois que l'on trouve la valeur <code>x</code> dans la liste <code>a</code>. === Définition en compréhension === La [[w:fr:Liste en compréhension|définition en compréhension]] ''({{lang|en|list comprehension}})'' est une méthode permettant de construire des listes en indiquant simplement des axiomes, des consignes de filtrage. Cette méthode est élégante car proche de la notation mathématique et compacte, mais c'est une méthode itérative donc lente par rapport à une méthode vectorisée fournie par le module NumPy. Par exemple, pour créer la liste des carrés des nombres entiers entre 0 et 9, il suffit d'écrire <syntaxhighlight lang="python"> carre = [x**2 for x in range(10)] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x^2 | x \in [0 ; 9] \}</math>. Si l'on veut la liste des nombres strictement inférieurs à 20 dont le carré est supérieur à 10, on peut écrire : <syntaxhighlight lang="python"> X = [x for x in range(20) if x**2 > 10] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x | x \in [0 ; 19], x^2 > 10 \}</math>. Pour mettre en évidence la performance du calcul vectorisé par rapport à la méthode itérative : <syntaxhighlight lang="python"> import time import numpy as np n = int(1e7) # taille de la liste t1 = time.perf_counter() carre = [x**2 for x in range(n)] # Définition en compréhension t2 = time.perf_counter() carre2 = np.arange(n)**2 # Calcul vectorisé t3 = time.perf_counter() print("En compréhension : ", t2-t1, "s ; vectorisé :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # En compréhension : 4.515... s ; vectorisé : 0.156... s ; rapport : 28.982... </syntaxhighlight> == Structure d'un programme == Un programme est simplement une suite d'instructions. Dans les environnements Unix BSD, un programme Python peut être considéré comme un script c'est-à-dire qu'il suffit de taper son nom dans l'invite de commande ''({{lang|en|shell}})'' sans avoir à invoquer <code>python</code>. Le programme doit alors commencer par un en-tête normalisé surnommé ''{{lang|en|[[wikt:shebang|shebang]]}}'' : <syntaxhighlight lang="python"> #!/usr/bin/env python3 </syntaxhighlight> Ce ''{{lang|en|shebang}}'' est inutile avec Jupyter. L'en-tête peut également contenir la description de l'encodage du fichier texte, typiquement : <syntaxhighlight lang="python"> # coding: utf-8 </syntaxhighlight> Le codage UTF-8 est le codage par défaut pour Python 3, il est donc inutile de l'indiquer. Les commentaires sont introduits par le croisillon <code>#</code>. On peut grouper une suite d'instructions dans un bloc. Un bloc d'instructions commence par deux-points « <code>:</code> » et est identé, c'est-à-dire qu'il a une marge constituée de quatre espaces — on peut aussi utiliser une tabulation mais il ne faut pas mélanger les deux méthodes ; les tabulations sont déconseillées, il vaut mieux utiliser quatre espaces<ref>{{lien web | url = https://www.python.org/dev/peps/pep-0008/#tabs-or-spaces | titre = Tabs or Spaces? | site = Python documentation | consulté le = 2019-03-14 }}</ref>. Pour terminer le bloc, il suffit simplement de revenir en début de ligne ; contrairement à d'autres langages, il n'y a pas de commende de fin ''({{lang|en|end}})'', c'est l'indentation qui définit le bloc. : # début du bloc ''instruction 1'' ''instruction 2'' … ''dernière instruction du bloc'' ''instruction hors bloc'' Par exemple, une exécution conditionnelle <code>if</code> ou une boucle <code>for</code> exécute un bloc d'instruction. Si l'on a besoin d'un bloc d'instruction qui « ne fait rien », on utilise l'instruction <code>pass</code>. == Structures de contrôle == '''Boucle itérative''' La boucle itérative s'écrit : <syntaxhighlight lang="python"> for <variable> in <itérable>: <bloc d’instructions> </syntaxhighlight> Si l'on veut que la variable prenne ''n'' valeurs de 0 à ''n'' – 1, on utilise l'instruction <code>range()</code> : <syntaxhighlight lang="python"> for i in range(5): print(i) print("Fin de la boucle") </syntaxhighlight> <code>[▶]</code> 0 1 2 3 4 Fin de la boucle En fait, la commande <code>range()</code> extrait des valeurs de l'ensemble des nombres entiers ; on peut ainsi utiliser le découpage en tranches, par exemple <code>range(2, 5)</code>pour avoir la « liste » <code>[2, 3, 4]</code>. Notez que <code>range()</code> ne crée pas à proprement parler une liste, cela crée un objet de type ''« {{lang|en|range}} »'' (plage, intervalle) ; pour avoir une liste, il faut écrire <code>list(range(n))</code>. Dans une boucle, la commande <code>continue()</code> saute la fin du bloc d'instruction et passe à la valeur suivante de la boucle. La commande <code>break()</code> interrompt la boucle et passe à la suite. '''Exécution conditionnelle''' L'exécution conditionnelle s'écrit : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> </syntaxhighlight> On peut utiliser les commandes <code>elif</code> ''(else if'') et <code>else</code> : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> elif <booléen>: <bloc d’instructions> else: <bloc d’instructions> </syntaxhighlight> Notez que le test d'une condition est gourmand en ressources. S'il s'agit de savoir si l'on effectue une opération mathématique simple ou pas, on peut remplacer le test par une multiplication par un booléen (<code>True</code> vaut 1, <code>False</code> vaut 0). Par exemple, plutôt que d'écrire <syntaxhighlight lang="python"> if a > 0: b = b - c </syntaxhighlight> mieux vaut écrire : <syntaxhighlight lang="python"> b = b - (a > 0)*c </syntaxhighlight> '''Boucle antéconditionnée''' La boucle antéconditionnée s'écrit : <syntaxhighlight lang="python"> while <booléen>: <bloc d’instructions> </syntaxhighlight> Cette boucle peut contenir des instructions <code>continue()</code> et <code>break()</code>. == Fonction == La déclaration d'une fonction utilise la commande <code>def</code>. La fonction est un bloc d'instructions. Si elle doit renvoyer des valeurs, on utilise la commande <code>return</code>. Par exemple <syntaxhighlight lang="python"> def nombres(n): """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo a = nombres(3) print(a) </syntaxhighlight> La fonction commence par une chaîne de caractères qui la décrit. Cette chaîne peut être récupérée automatiquement par certains logiciels pour faire une documentation automatique. Si la description prend plusieurs lignes, elle commence et finit par trois double-guillemets <code>"""…"""</code> ; en fait, par convention, même si cela n'est pas obligatoire, les descriptions sont toutes encadrées de trois double-guillemets. Cette description est appelée ''{{lang|en|docstring (documentation string)}}''. Pour récupérer les ''{{lang|en|docstrings}}'' : <syntaxhighlight lang="python"> def foo(): """Cette fonction ne fait rien""" pass print(foo.__doc__) # Cette fonction ne fait rien </syntaxhighlight> L'instruction <code>input()</code> permet à l'utilisateur de saisir une valeur. La valeur est retournée sous la forme d'une chaîne de caractères qui est ensuite convertie en nombre réel avec l'instruction <code>float()</code>. On peut définir une valeur par défaut en l'indiquant dans l'en-tête de la définition de la fonction, de la manière suivante : <syntaxhighlight lang="python"> def nombres(n=1): # valeur par défaut : 1 """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo </syntaxhighlight> Si le paramètre à initialiser est de type modifiable ''({{lang|en|mutable}})'', comme par exemple une liste, il faut procéder comme suit : <syntaxhighlight lang="python"> def fooFonction(fooListe=None): # valeur par défaut : n'existe pas """Description""" if fooListe = None: fooListe = [] # initialisation <suite des instructions> </syntaxhighlight> Par défaut, les variables sont locales. On peut rendre une variable globale avec l'instruction <code>global</code> ''à l'intérieur de la fonction'', avant l'utilisation de la variable. Par exemple : <syntaxhighlight lang="python"> a = 1 b = 1 def toto(): """Test de variable globale. Entrée : aucune. Sortie : aucune.""" global a a = 2 b = 2 toto() print("a =", a, "; b =", b) # a = 2 ; b = 1 </syntaxhighlight> Pour être plus précis : si une variable n'est pas assignée dans une fonction, alors Python va chercher une variable du même nom à l'extérieur de la fonction. Mais à partir du moment où la variable est assignée dans la fonction, elle devient locale ''sauf'' si l'on a utilisé l'instruction <code>global</code>. Si l'on s'attend à un nombre indéfini d'arguments, on utilise la notion d'empaquetage/dépaquetage ''({{lang|en|packing/unpacking}})''<ref>{{lien web | url = https://deusyss.developpez.com/tutoriels/Python/args_kwargs/ | titre = Introduction à *args et **kwargs | consulté le = 2019-03-09 | site = Developpez.com }}.</ref>. L'empaquetage consiste à mettre les arguments dans un n-uplet, le dépaquetage consiste à développer un n-uplet en plusieurs variables. Cela se fait en mettant un astérisque ''({{lang|en|splat}})'' « <code>*</code> » devant le nom de la variable. Par convention, on utilise le nom de variable <code>*args</code> mais cela n'est pas obligatoire. <syntaxhighlight lang="python"> def concatenation(*args): """Concatène des chaînes de caractères Entrée : *args, n-uplet de chaînes de caractères. Sortie : resultat, chaîne de caractères.""" resultat = "" for i in args: resultat = resultat + i return resultat concatenation("a", "foo", "toto") # 'afoototo' </syntaxhighlight> À l'inverse, si une fonction doit recevoir plusieurs paramètres, on peut à la place lui transmettre une liste à dépaqueter : <syntaxhighlight lang="python"> def addition(a, b): """Ajoute deux nombres Entrées : — a : réel ; — b : réel. Sortie : a+b, réel""" return a+b arg = (1, 2) addition(*arg) # 3 </syntaxhighlight> On peut aussi empaqueter/dépaqueter un dictionnaire, on utilise pour cela deux astérisques « <code>**</code> ». Par convention, on utilise le nom <code>**kwargs</code> sans que cela soit obligatoire. L'instruction <code>lambda</code> permet de créer de petites fonctions ne contenant pas de boucle ni de branchement conditionnel. Cependant, si la déclaration est courte et compacte, le code n'est pas toujours facilement lisible ; l'utilisation de cette instruction n'est pas recommandée. Par exemple l'expression <syntaxhighlight lang="python"> f = lambda x: 2*x </syntaxhighlight> est la même chose que <syntaxhighlight lang="python"> def f(x): """Calcule le double. Entrée : x, réel. Sortie : 2*x, réel.""" return 2*x </syntaxhighlight> {{note|L'instruction <code>eval()</code> exécute une chaîne de caractères, c'est-à-dire traite une chaîne de caractères comme si c'étaient des instructions données à Python. Cette instruction est à éviter pour deux raisons : # Un utilisateur malveillant pourrait entrer du code malveillant dans la chaîne de caractères. # L'exécution est lente puisque Python doit compiler la chaîne à la volée. Cette instruction peut en général être remplacée par une autre instruction. }} == Gestion des erreurs == Dans un bloc d'instructions, on peut utiliser la structure <code>try:… except:</code>. Le bloc après <code>try</code> est exécuté ; si une erreur se déclare dans ce bloc, alors le bloc <code>except</code> s'exécute. Par exemple <syntaxhighlight lang="python"> try: 1/0 # Génère une erreur except: print("Division par zéro") # Cette instruction est donc exécutée </syntaxhighlight> On peut compléter avec <code>else:</code> et <code>finally:</code> : <syntaxhighlight lang="python"> try: <code à exécuter> except: <s’exécute en cas d’erreur> else: <s’exécute s’il n’y a pas d’erreur> finally: <s’exécute dans tous les cas> </syntaxhighlight> On peut séparer les différents types d'erreur : <syntaxhighlight lang="python"> try: <code à exécuter> except ValueError: print("Valeur erronée") except TypeError: print("Type erroné") </syntaxhighlight> Les types d'erreur les plus courants sont : * <code>NameError</code> : le nom de variable n'existe pas ; * <code>TypeError</code> : la valeur n'est pas du bon type ; * <code>ValueError</code> : la valeur n'est pas compatible avec ce qui est attendu ; * <code>RuntimeError</code> : type d'erreur général. On peut aussi créer ses propres erreurs : si une situation erronée survient, on peut « lever » une exception avec <code>raise</code>. Par exemple <syntaxhighlight lang="python"> if a < 0: raise ValueError("La valeur doit être positive") </syntaxhighlight> ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/errors.html | titre = Errors and exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} * {{lien web | url = https://docs.python.org/3/library/exceptions.html | titre = Built-in Exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} == Exercices == === Calcul du PGCD et du PPCM par l'algorithme d'Euclide === {{loupe|w:Algorithme d'Euclide}} Écrire un programme Python qui demande deux nombres entiers et affiche leurs PGCD et PPCM. Le programme utilisera l'algorithme d'Euclide. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """Programme : euclide.py Auteur : User:cdang date : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : calcule le PGCD et le PPCM de deux nombres entiers. Entrée ------ au clavier, saisie de deux nombres entiers. Sorties ------- à l'écran, affichage du PGCD et du PPCM. """ # *************** # *************** # ** Fonctions ** # *************** # *************** def euclide(): """Calcule le PGCD et le PPCM avec l'algorithme d'Elclide Entrée ------ Aucune, la saisie des paramètres fait partie de la fonction Sortie ------ affichage du PGCD et du PPCM """ print("***** Algorithme d'Euclide *****\n") a0 = int(input("Premier nombre entier : a = ")) b0 = int(input("Second nombre entier : b = ")) a = a0 b = b0 r = a%b # initialisation while (r != 0) : # algorithme d'Euclide a = b b = r r = a%b # affichage des résultats print("PGCD(", a0, ", ", b0, ") = ", b) print("PPCM(", a0, ", ", b0, ") = ", a0*b0//b) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* euclide() </syntaxhighlight> On peut simplifier la boucle centrale : <syntaxhighlight lang="python"> while b: # s'exécute tant que b n'est pas 0 a, b = b, a % b # affectation de liste à liste return a </syntaxhighlight> {{boîte déroulante fin}} Notez que le module NumPy propose l'instruction <code>gcd()</code> : <syntaxhighlight lang="python"> import numpy … print(numpy.gcd(a, b)) </syntaxhighlight> === Tours de Hanoï === {{loupe|w:Tours de Hanoï}} Écrire un programme Python qui demande le nombre ''n'' de plateaux et affiche les manipulations nécessaires pour déplacer la pile d'un emplacement à un autre. Le programme utilisera l'algorithme récursif. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """nom : hanoi.py auteur : User:cdang date de création : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : résout le problème des tours de Hanoï Entrées ------- trois chaînes de caractères (nom des piliers) Sorties ------- une chaîne de caractères (liste des opérations) """ # *************** # *************** # ** Fonctions ** # *************** # *************** def hanoi(a, b, c, n): """Résout le problème des tours de Hanoï de manière récursive But : déplace la pile de n disques du piler a au pilier b Entrées ------- a, b c : chaînes de 1 caractère, référence des emplacements ; n : entier, nombre de disques sur l'emplacement a Sorties ------- operations : chaînes de caractères décrivant les opérations """" if n>1: operations = hanoi(a, c, b, n-1) operations = operations+a+"→"+b+" ; " operations = operations+hanoi(c, b, a, n-1) else: operations = a+"→"+b+" ; " return operations # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* resultat = hanoi("1", "2", "3", 3) print(resultat) </syntaxhighlight> {{boîte déroulante fin}} === Lancer de rayons === [[Fichier:Lentille hemispherique perspective.svg|vignette|Lentille hémisphérique.]] Considérons une lentille hémisphérique de rayon R faite d’un verre d’indice de réfraction ''n''. Nous plaçons une source ponctuelle à une distance ''d'' du dioptre plan, sur l’axe optique. Tracer des rayons partant de la source et traversant la lentille. {{clear}} {{Boîte déroulante/début |titre=Analyse d’optique géométrique}} [[Fichier:Lentille hemispherique analyse geometrique.svg|vignette|Analyse géométrique du problème.]] Il s’agit d’un problème ayant une symétrie de révolution par rapport à l’axe optique. Nous pouvons nous réduire à un problème plan en nous plaçant dans un plan contenant l’axe optique ; l’axe optique est encore un axe de symétrie orthogonale, nous pouvons donc nous contenter d'étudier un demi-plan. Pour simplifier, nous plaçons le centre du dioptre sphérique à l’origine O du repère. L’axe optique est l’axe ''x'' et l'axe perpendiculaire, vertical sur la figure, c’est l’axe ''y''. Les coordonnées de la source sont donc (-''d'' ; 0). Le rayon issu de la source et faisant un angle θ avec l’axe ''x'' frappe le dioptre plan à l’altitude ''h''. Nous avons : : ''h'' = ''d'' ⋅ tan θ. L’angle d’incidence vaut θ. D’après la loi de Snell-Descartes, l'angle de réfraction θ<sub>2</sub> vaut : : θ<sub>2</sub> = arcsin((sin θ) / ''n''). Le rayon réfracté passe par le points de coordonnées (0, ''h''). L’équation de la droite est donc : : ''y'' = a ⋅ ''x'' + ''h'' avec : ''a'' = tan θ<sub>2</sub>. L’équation du cercle de centre O et de rayon R est : : ''x''<sup>2</sup> + ''y''<sup>2</sup> = R<sup>2</sup>. Les coordonnées (''x''<sub>M</sub>, ''y''<sub>M</sub>) de l’intersection M du rayon avec le dioptre sphérique vérifient les deux équations. Par substitution, nous obtenons une équation du second degré en ''x'' que nous savons résoudre : : ''x''<sub>M</sub><sup>2</sup> + (''a'' ⋅ ''x''<sub>M</sub> + ''h'')<sup>2</sup> = R<sup>2</sup> : ⇔ (1 + ''a''<sup>2</sup>) ⋅ ''x''<sub>M</sub><sup>2</sup> + 2 ⋅ ''a'' ⋅ ''h'' ⋅ ''x''<sub>M</sub> + ''h''<sup>2</sup> – R<sup>2</sup> = 0. D’après les propriétés du cercle, le rayon est perpendiculaire à la tangente. Le rayon [OM] est donc normal au dioptre en M. Nous pouvons déterminer l’angle d’incidence θ<sub>i</sub> par le produit scalaire : : <math>\begin{pmatrix} 1 \\ a \end{pmatrix} \cdot \begin{pmatrix} x_\mathrm{M} \\ y_\mathrm{M} \end{pmatrix} = \sqrt{1^2 + a^2} \cdot \mathrm{R} \cdot \cos(\theta_\mathrm{i})</math> ce qui nous permet de calculer cet angle : : <math>\theta_\mathrm{i} = \operatorname{arcos} \left ( \frac{x_\mathrm{M} + a \cdot y_\mathrm{M}}{\mathrm{R} \cdot \sqrt{1^2 + a^2} } \right )</math> Comme nous passons vers un milieu d’indice plus faible, il y a un risque de réflexion totale. L’angle limite est : : θ<sub>max</sub> = arcsin(1/''n''). Si l’on a θ<sub>i</sub> &gt; θ<sub>max</sub>, le rayon repart vers l’intérieur. Nous ne traçons pas le rayon car cela nous emmènerait trop loin dans l’analyse. En revanche, si θ<sub>i</sub> ≤ θ<sub>max</sub>, alors nous pouvons appliquer la loi de Snell-Descartes pour avoir l’angle de réfraction θ<sub>e</sub> : : θ<sub>e</sub> = arcsin(''n'' ⋅ sin θ<sub>i</sub>). Pour tracer le rayon sortant, il nous faut l’angle θ<sub>3</sub> par rapport à l’horizontale. L’angle du rayon [OM] par rapport à l’horizontal vaut arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>), nous avons donc : θ<sub>3</sub> = arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>) + θ<sub>e</sub>. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Analyse algorithmique}} '''Structure des données''' Le problème est décrit par trois paramètres : # Le rayon <code>R1</code> de la lentille, en milliètres (réel en virgule flottante). # L’indice du verre, <code>n</code> sans dimension (réel en virgule flottante). L’indice de l’air vaut 1. # La distance de la source au dioptre d’entrée plan, <code>d</code> en millimètres (réel en virgule flottante). Un rayon est caractérisé par quatre paramètres : # L’angle d’émission <code>theta1</code> en radians (réel en virgule flottante). # L’angle de réfraction dans la lentille <code>theta2</code> en radians (réel en virgule flottante). # Les cordonnées <code>M</code> en millimètre (vecteur de dimension 2 <code>([x, y])</code> de réels en virgule flottante) du point d’intersection du rayon avec le dioptre sphérique. # L’angle de réfraction dans l’air après la lentille <code>theta3</code> en radians (réel en virgule flottante). Pour le calcul et le tracé, nous avons besoin des paramètres intermédiaires suivants : * l’altitude ''y'' = <code>h</code> en millimètres (réel en virgule flottante) à laquelle le rayon frappe le dioptre plan d’entrée ; * l’angle d’incidence du rayon avec le dioptre sphérique <code>thetaint</code> en radians (réel en virgule flottante). Les angles sont stockés en radians car c’est l’unité naturelle pour le calcul mais nous affichons les valeurs en degrés. Comme le calcul de conversion est récurrent, nous conservons les facteurs <code>degversrad</code> (conversion des degrés vers les radians, facteur valant π/180, réel en virgule flottante) et <code>radversdeg</code> (conversion des radians vers les degrés, facteur valant 180/π, réel en virgule flottante). '''Fonctions''' Nous avons besoin d’une fonction qui calcule les trois paramètres du rayon <code>(theta2, M, theta3)</code> à partir de l’angle d’émission <code>theta1</code>. Nous appelons cette fonction <code>lanceRayon()</code>. Cette fonction fait appelle à une fonction qui calcule l’angle du rayon réfracté à partir de l’angle du rayon incident <code>theta1</code>, les deux angles étant par rapport à la normale au dioptre au point considéré. Nous appelons cette fonction <code>refrac()</code>. La recherche de l’intersection <code>M</code> du rayon avec le dioptre sphérique nécessite de résoudre une équation du second degré. Nous utilisons pour cela la recherche des racines du polynôme en <code>x</code> avec la fonction <code lang="python">numpy.polynomial.polynomial.polyroots()</code>. D’après la configuration du problème géométrique, si l’on s’assure que le rayon frappe bien la lentille (0 ≤ <code>h</code> ≤ <code>R1</code>) alors nous sommes sûrs que le problème a deux solutions réelles (une positive et une négative) ou, dans le cas dégénéré où <code>h == R1</code>, une valeur unique <code>x == 0</code>. Comme nous recherchons la valeur positive, nous sélectionons la plus grande des deux racines. Pour la gestion de la réflexion interne : dans la fonction <code>refrac()</code>, nous vérifions les conditions de réflexion totale et si elles sont remplies, alors nous générons une erreur (commandes <code lang="python">try… except</code> et <code lang="python">raise ValueError</code>). Cette erreur est propagée à la fonction <code>lanceRayon()</code> : <code>lanceRayon()</code> appelle la fonction <code>refrac()</code> et si cette fonction renvoie une erreur, alors <code>lanceRayon()</code> renvoie également une erreur. Pour trouver l’angle d’émission <code>thetaLimite</code> provoquant la réflexion totale (en radians, réel en virgule flottante), nous effectuons une recherche par dichotomie : * nous partons de l’angle maximum possible, lorsque le rayon frappe le sommet de la lentille, et nous appelons la fonction <code>lanceRayon()</code> ; si cela ne génère pas d’erreur, alors nous pouvons aller jusqu’à cette valeur, la recherche est terminée ; si cela génère une erreur, alors nous divisons la valeur par deux ; * à une étape de la recherche donnée, si <code>lanceRayon()</code> ne génère pas d’erreur avec l’angle testé, alors nous savons que l’angle limite est supérieur à cette valeur ; cette valeur minore donc la valeur recherchée ; si au contraire <code>lanceRayon()</code> génère une erreur, alors c’est que l’angle est trop important, cette valeur majore donc la valeur recherchée ; nous pouvons ainsi resserer l’intervalle de recherche ; * nous nous arrêtons lorsque les valeurs haute et basse sont suffisamment proche. Concrètement : # Nous définissons une variable <code>angleHaut</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus bas connu provoquant la réflexion totale. # Nous définissons une variable <code>angleBas</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus haut connu ne provoquant pas de réflexion totale. Sa valeur initiale est 0. L’angle limite recherché est donc entre <code>angleBas</code> et <code>angleHaut</code>. # Nous définissons l’angle <code>angleTest</code> comme étant la moyenne entre <code>angleBas</code> et <code>angleHaut</code>. Si <code>lanceRayon(angleTest)</code> génère une erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleHaut</code> (puisque c’est une valeur provoquant la réflexion totale et qu’elle est plus basse que la valeur actuelle d’<code>angleHaut</code>). À l’inverse, si <code>lanceRayon(angleTest)</code> ne génère pas d’erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleBas</code> (puisque c’est une valeur ne provoquant pas la réflexion totale et qu’elle est plus haute que la valeur actuelle d’<code>angleBas</code>). # Nous arrêtons la procédure lorsque l’écart entre <code>angleBas</code> et <code>angleHaut</code> est inférieur à {{unité|10|échelle=<sup>–3</sup>|rad}} (valeur arbitraire). La valeur retenue est la valeur finale d’<code>angleBas</code> (puisque l’on veut être sûr qu’il n’y ait pas de réflexion totale). La valeur affichée est la valeur en degrés arrondie au dixième. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Solution}} Nous demandons à l’utilisateur ou à l’utilisatrice les valeurs des paramètres du problème : rayon de la lentille, distance de la source, indice de réfraction du verre. Nous vérifions que les valeurs entrées sont bien des nombres ; si c’est une chaîne vide, alors nous utilisons une valeur par défaut. Nous créons une fonction <code>refrac()</code> qui permet de calculer l’angle réfracté à partir de l’angle d’incidence et des indices de réfraction. S’il y a rélexion totale, alors nous générons une erreur. La fonction <code>lanceRayon()</code> calcule les différents points de passage du rayon. Elle appelle pour cela la fonction <code>refrac()</code>. Si un appel de la commande <code>refrac()</code> génère une erreur, alors nous générons également une erreur. Nous déterminons l’angle d’émision du rayon <code>thetaLimite</code> qui provoque une réflecxion totale. Pour cela, nous créons une fonction <code>rechercheLimite()</code> qui cherche par dichotomie. Nous traçons un rayon tous les 5° jusqu’à la valeur limite. <syntaxhighlight lang="python"> #!/usr/bin/env python3 # coding: utf-8 """nom : lancerRayons.py auteur : User:cdang date de création : 2022-05-06 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : NumPy, matplotlib ---------------------------------------------------------------------------- Objectif : trace des trajets optique avec une lentille hémisphérique Entrées ------- Le rayon de la lentille, la distance de la source, l’indice de réfraction du verre, trois chaînes de caractères saisies par l’utilisateur·rice et qui sont converties en réels. Sorties ------- La valeur limite de l’angle (réel) et le tracé de plusieurs rayons. """ # ****************************************************** # ****************************************************** # ** Lancer de rayons pour une lentille hémisphérique ** # ****************************************************** # ****************************************************** import numpy as np import matplotlib.pyplot as plt import numpy.polynomial.polynomial as nppol # ************** # * Constantes * # ************** # Pour la conversion degrés ↔ radians radversdeg = 180/np.pi degversrad = 1/radversdeg # ************* # * Fonctions * # ************* def boucleEntreeNombre(messageSaisie, valeurDefaut): """Permet de s’assurer que l’utilisateur·rice a bien entré un nombre. Entrée : — message à afficher (chaîne de caractères) ; — valeur par défaut (réel à virgule flottante). Sortie : nombre (réel à virgule flottante).""" messageErreur = "Veuillez entrer une valeur numérique (ou vide pour accepter la valeur par défaut).\n" execute = True while execute: strNombre = input(messageSaisie+f" (valeur par défaut {valeurDefaut}) : ") if strNombre == "": nombre = valeurDefaut execute = False else: try: nombre = float(strNombre) except: print(messageErreur) else: execute = False return nombre def initialisation(): """L’utilisateur·rice entre les variables du problème. Entrées : aucune. Sorties : — R1 (mm) : rayon de la lentille ; — d (mm) : distance de la source au dioptre plan ; — n (sans dimension) : indice de réfraction du verre.""" R1 = boucleEntreeNombre("Rayon de la lentille en mm", 20.0) d = boucleEntreeNombre("Distance de la source au dioptre plan en mm", 20.0) n = boucleEntreeNombre("Indice de réfraction (sans dimension)", 1.5) return (R1, d, n) def refrac(n1, n2, theta1): """Calcule l’angle de réfraction theta2 (radians) en fonction — de l’angle d’incidence theta1 (radians); — de l’indice de réfraction n1 du premier milieu ; — de l’indice de réfraction n2 du second milieu.""" reflexionTotale=False rapport=n2/n1 rapportinv=np.reciprocal(rapport) if n1 > n2: thetal = np.arcsin(rapport) # angle limite pour la réflexion totale if theta1 >= thetal: reflexionTotale=True if reflexionTotale: print("Réflexion totale") raise ValueError else: return np.arcsin(rapportinv*np.sin(theta1)) def lanceRayon(n1, n2, d, R, theta1): """Détermine le rayon issu de la source située à une distance d (mm) du bareau et avec une élévation de theta1 (radians), en fonction des indices de réfraction n1 et n2. Les éléments retournés sont : — la hauteur h (mm) à laquelle le rayon frappe le barreau ; — l’angle de réfraction theta2 (radians)) dans le barreau ; — l’angle de réfraction theta3 (radians) à la sortie du barreau — le point M(x, y) (mm) auquel le rayon sort du barreau.""" h = d*np.tan(theta1) if h >= R: print("Le rayon est au-dessus du barreau") raise ValueError else: theta2 = refrac(n1, n2, theta1) a = np.tan(theta2) x = max(nppol.polyroots([h*h - R*R, 2*a*h, 1+a*a])) # recherche de l’intersection du rayon avec le cercle y = a*x + h M = np.array([x, y]) thetaint = np.arccos((x + a*y)/(R*np.sqrt(1 + a*a))) theta3 = np.arctan(y/x) - refrac(n2, n1, thetaint) return (h, theta2, theta3, M) def rechercheLimite(n1, n2, d, R): """Recherche l’angle limite pour la réflexion totale. Entrée : — indice de réfraction des milieux 1 et 2, n1 et n2 ; — distance au barreau, d(mm). Sortie : angle limite theta (radians)""" angleHaut = np.arctan(R/d) angleBas = 0 angleTest = angleHaut try: lanceRayon(n1, n2, d, angleTest, R) except: condition = True # il y a réflexion total en haut de la lentille else: condition = False # il n’y a jamais réflexion totale dans la lentille while condition: #dichotomie angleTest = np.mean([angleHaut, angleBas]) # on ajuste la valeur de test try: lanceRayon(n1, n2, d, R, angleTest) except: angleHaut = angleTest # réflexion totale : on abaisse la valeur maximale else: angleBas = angleTest # pas de réflexion totale : on monte la valeur minimale condition = ((angleHaut - angleBas) >= 0.001) # on a cerné la limite à 0,001 rad près if not condition: angleTest = angleBas return angleTest # *********************** # * Programme principal * # *********************** (R1, d, n) = initialisation() xmax = round(R1 + d) thetaLimite = rechercheLimite(1, n, d, R1) thetaLimiteDeg = thetaLimite*radversdeg print(f"Angle limite pour la réflexion totale : {thetaLimiteDeg:.1f}°.\n") anglesDeg = np.arange(0, thetaLimiteDeg, 5)[1:] # trace un rayon tous les 5° anglesRad = anglesDeg*degversrad nb = len(anglesDeg) h = np.zeros(nb) # initialisation des vecteurs de valeurs theta2 = np.zeros(nb) theta3 = np.zeros(nb) M = np.zeros((nb, 2)) for i in range(nb): (h[i], theta2[i], theta3[i], M[i, :]) = lanceRayon(1, n, d, R1, anglesRad[i]) (h_lim, theta2_lim, theta3_lim, M_lim) = lanceRayon(1, n, d, R1, thetaLimite) # tracé anglesCercle = 0.5*np.pi*(np.linspace(1, 0, 20)) x_cercle = R1*np.cos(anglesCercle) # coordonnées des pints du cercle y_cercle = R1*np.sin(anglesCercle) fig = plt.plot([-d,xmax], [0, 0], "k-.", linewidth="0.5") # tracé de l’axe optique for i in range(nb): plt.plot([-d, 0, M[i, 0], xmax], [0, h[i], M[i, 1], M[i, 1] + (xmax - M[i, 0])*np.tan(theta3[i])], label=f"{anglesDeg[i]:.0f}°") plt.plot([-d, 0, M_lim[0], xmax], [0, h_lim, M_lim[1], M_lim[1] + (xmax - M_lim[0])*np.tan(theta3_lim)], label=f"{0.1*int(np.trunc(10*thetaLimite*radversdeg)):.1f}°") plt.plot(x_cercle, y_cercle, "k", linewidth="0.5") # tracé du cercle plt.plot([0,0], [0, R1], "k", linewidth="0.5") # tracé du premier dioptre #plt.axis("square") plt.gca().set_aspect("equal", adjustable="box") plt.xlabel("x (mm)") plt.ylabel("y (mm)") plt.title("Lentille hémisphérique, lancer de rayons") plt.legend() plt.savefig("lentille_hemispherique_lancer_rayon.svg", format="svg") plt.show() </syntaxhighlight> {{Boîte déroulante/fin}} == Mesurer le temps == Le module <code>time</code> fournit les fonctions suivantes : * <code>time.gmtime()</code> : renvoie la date et l'heure du méridien de Greenwich (''{{lang|en|Greenwich mean time}}'', GMT), sous la forme d'un dictionnaire (année, mois, jour du mois, heure, minute, seconde, jour de la semaine, jour de l'année, heure d'été/hiver), ** jour de la semaine est un entier entre 0 (lundi) et 6 (dimanche), ** jour du mois est un entier entre 1 et 366 ; * <code>time.localtime()</code> : comme le précédent, mais l'heure est l'heure locale ; * <code>time.time()</code> : donne le nombre de seconde qui se sont écoulées depuis le 1er janvier 1970 ; * <code>time.gmtime(n)</code> et <code>time.localtime(n)</code> transforment un nombre de secondes (écoulées depuis le 1er janvier 1970) en une date au format (année, mois, jour, etc.), n-uplet de neuf valeurs ; <code>time.mktime()</code> fait le contraire, il transforme un n-uplet de neuf valeurs (années, mois, jour, etc.) en un nombre de secondes (écoulées depuis le 1er janvier 1970) ; * <code>time.sleep(n)</code> : provoque une pause dans le déroulement du programme de ''n'' secondes ; * <code>time.perf_counter()</code> : indique une date en seconde ; s'utilise pour mesurer la durée d'exécution d'une partie du code, en faisant la différence entre deux relevés. Concernant la date et l'heure sous la forme d'un n-uplet, on peut extraire l'heure de la manière suivante : <syntaxhighlight lang="python"> import time a = time.localtime() print("Il est ", a[3], "h", a[4]) # ou bien print("Il est ", a.tm_hour, "h", a.tm_min) </syntaxhighlight> Pour mesurer la performance d'une portion de code : <syntaxhighlight lang="python"> import time t1 = time.perf_counter() <suite d’instructions> t2 = time.perf_counter() print("Durée d'exécution :", t2-t1 </syntaxhighlight> == Programmation orientée objet == Nous n'allons pas ici faire un cours de programmation orientée objet (POO), nous allons aborder le sujet de manière pragmatique. De manière schématique, un « objet » est une « super-variable ». Cette super-variable peut contenir plusieurs variables, appelées « attributs » ; elle contient en fait un dictionnaire (paires « nom d'attribut : valeur d'attribut »). Elle peut aussi contenir des fonctions spécifiques appelées « méthodes ». De même qu'une variable a un type, un objet fait partie d'une « classe ». La classe est le modèle de l'objet ; en franglais informatique, on dit que l'objet est une instance de la classe. La POO est donc un formalisme : lorsque l'on définit des variables et des fonctions concernant un même type d'objet (au sens commun du terme), on les empaquette dans une classe. Il faut donc d'abord définir la classe, puis attribuer cette classe à un objet (« instancier » la classe). Considérons par exemple que nous voulons travailler sur des [[w:Engrenage|engrenages]] ; pour simplifier, nous nous contentons d'engrenages à dentures droites. Une roue dentée, un pignon, est essentiellement définie par son nombre de dents Z et par son module ''m'' qui correspond à la largeur de dents<ref>ainsi que par son épaisseur ''e'' et le matériau dont elle est faite mais nous allons négliger ces paramètres pour la simplicité de l'étude.</ref>. Nous allons définir trois méthodes : la méthode <code>.diametrePrimitif()</code> qui calcule le diamètre primitif de la roue dentée, <code>.pas()</code> qui calcule la largeur des dents au niveau du cercle primitif et <code>.rapport()</code> qui calcule le rapport de transmission de deux roues engrenées Z<sub>1</sub>/Z<sub>2</sub>. La méthode <code>.rapport()</code> vérifie par ailleurs que les roues ont le même module, condition indispensable pour former un engrenage. Nous définissons la classe ainsi : <syntaxhighlight lang="python"> class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): # instructions lancées lors de la déclaration """Valeurs des attributs""" self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z </syntaxhighlight> Nous remarquons que lorsque nous déclarons les méthodes, le paramètre <code>self</code> correspond à l'objet lui-même. Ainsi, dans la méthode <code>.rapport()</code>, la variable <code>self.Z</code> est le nombre de dents de la roue elle-même et <code>roueDentee.Z</code> est le nombre de dents de la roue passée en paramètre. Pour déclarer les roues, nous écrivons : <syntaxhighlight lang="python"> roue1 = pignon() # attribution de la classe, « instanciation » roue1.Z = 13 # définition des caractéristiques du pignon « roue1 » roue1.m = 2 roue2 = pignon(16, 2) # manière alternative </syntaxhighlight> Nous pouvons alors utiliser les objets de la manière suivante : <syntaxhighlight lang="python"> print(roue1.Z) # 13 print(roue1.diametrePrimitif()) # 26 R = roue1.rapport(roue2) # 0.8125 </syntaxhighlight> La commande <code>dir(a)</code> affiche tous les attributs et méthodes de l'objet <code>a</code>. ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/classes.html | titre = Classes | site = Python documentation | consulté le = 2019-03-08 }} == Interface graphique avec Tk == Une interface graphique utilisateur (GUI, ''{{lang|en|graphic user interface}}'') est un ensemble de boîtes permettant d'interagir avec l'utilisateur c'est-à-dire permettre la saisie d'informations, l'exécution d'actions et afficher des informations. Elle se compose d'éléments appelés ''{{lang|en|widgets}}''. Les éléments ''({{lang|en|widgets}})'' classiques sont : * boîte de dialogue ''({{lang|en|dialog box}})'' : fenêtre contenant d'autres éléments ; * étiquette ''({{lang|en|label}})'' : texte affiché ; * liste déroulante ''({{lang|en|drop-down list}})'' : zone permettant le choix d'une option, la liste se déployant lorsque l'on clique sur la zone ; * zone de texte, champ de saisie ''({{lang|en|text box}})'' : zone permettant de taper du texte ; * boîte combinée ''({{lang|en|combo box}})'' : zone de saisie de texte contenant une liste déroulante qui permet de choisir des éléments prédéfinis ; * bouton ''({{lang|en|button}})'' : objet effectuant une action lorsque l'on clique dessus ; * case à cocher ''({{lang|en|checkbox, tickbox}})'' : objet permettant d'activer ou de désactiver une option lorsque l'on clique dessus ; * bouton radio, case d'option ''({{lang|en|radio button}})'' : objet permettant d'activer une option en désactivant les autres options ; une seule option peut être activée à la fois. Plusieurs modules permettent de gérer les interfaces graphiques. Nous choisissons ici le module développé sur la bibliothèque Tk qui est une bibliothèque multiplateforme. Pour cela, nous importons le module <code>tkinter</code> ainsi que le module <code>ttk</code>, ce dernier proposant des options plus « modernes » : <syntaxhighlight lang="python"> import tkinter as tk from tkinter import ttk </syntaxhighlight> Voici un programme permettant comme précédemment de calculer le rapport de transmission d'un engrenage. Nous détaillons sa construction ci-après. <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: IUrapport.set(valeurZ2/valeurZ1) except: IUrapport.set("erreur") # ************************* # ************************* # ** Interface graphique ** # ************************* # ************************* # fenetre principale fenetre = tk.Tk() fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> '''Explications''' Nous commençons par définir la boîte de dialogue que nous appelons <code>fenetre</code> ; c'est un objet <code>Tk</code> et nous lui donnons un titre « » : <syntaxhighlight lang="python"> fenetre = tk.Tk() fenetre.title("Rapport de réduction") </syntaxhighlight> Puis, nous définissons un cadre attaché à cette fenêtre et qui va nous permettre « d'accrocher » les autres éléments, ce qui permet de garder une apparence satisfaisante lorsque l'on retaille la fenêtre : <syntaxhighlight lang="python"> cadre = ttk.Frame(fenetre) </syntaxhighlight> Le cadre va comporter six lignes ''({{lang|en|row}})'' et deux colonnes ''({{lang|en|column}})''. Nous allons placer une étiquette ''({{lang|en|label}})'' « z1 » : <code>text="z1"</code>. Cette étiquette se trouve dans une case du cadre, celle de la première colonne et la première ligne : <code>grid(column=1, row=1)</code>. Par rapport à cette case, elle est collée à « l'ouest » (W, ''{{lang|en|west}}'', gauche) de la case : <code>sticky=tk.W</code>. <syntaxhighlight lang="python"> z1_label = ttk.Label(cadre, text="z1") # Création de l'étiquette z1_label.grid(column=1, row=1, sticky=tk.W) # Placement de l'étiquette </syntaxhighlight> Notez que l'on aurait pu écrire directement : <syntaxhighlight lang="python"> ttk.Label(cadre, text="z1").grid(column=1, row=1, sticky=tk.W) </syntaxhighlight> mais le fait de séparer la création de l'élément et son placement facilite la maintenance (recherche d'erreur, évolution du code). Pour tout ce qui est dynamique, c'est-à-dire les zone de saisie des valeurs et l'affichage du résultat, il faut définir des « chaînes variables » ''({{lang|variable strings}})'' : <syntaxhighlight lang="python"> IUz1 = tk.StringVar() </syntaxhighlight> Cette variable est une variable globale à la création. Nous pouvons alors placer la zone de saisie ''({{lang|en|entry}})'' à côté de l'étiquette lui correspondant. Nous nommons la zone de saisie <code>z1_entry</code> : <syntaxhighlight lang="python"> z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) </syntaxhighlight> Nous faisons de même pour les trois autres paramètres de l'engrenage, ''m''<sub>1</sub>, ''z''<sub>2</sub> et ''m''<sub>2</sub>. Le résultat est également une chaîne variable globale. Par rapport à notre mise en page, elle se situe dans la case colonne 2 ligne 5, centrée sur cette case (collé à l'est et à l'ouest) : <syntaxhighlight lang="python"> rapport = tk.StringVar() rapport_dynamique = ttk.Label(cadre, textvariable=rapport) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) </syntaxhighlight> Il nous faut encore définir une fonction de manière classique, nous l'appelons « calcule ». Les variables étant globales, on les utilise directement. On récupère les valeurs avec la méthode <code>get()</code> et nous modifions la valeur avec la méthode <code>set()</code> : <syntaxhighlight lang="python"> def calcule(): valeurZ1 = float(IUz1.get()) valeurZ2 = float(IUz2.get()) IUrapport.set(valeurZ2/valeurZ1) </syntaxhighlight> Cette fonction est déclenchée lorsque l'on clique sur le bouton « Calcul » situé dans la case du cadre ligne 6 colonne 2 : <syntaxhighlight lang="python"> bouton = ttk.Button(cadre, text="Calcul", command=calcule) bouton.grid(column=2, row=6, sticky=tk.W) </syntaxhighlight> ou bien si l'on appuie sur la touche <code>[entrée]</code> du clavier : <syntaxhighlight lang="python"> fenetre.bind("<Return>", calcule) </syntaxhighlight> À tout ceci, nous ajoutons des « gouttières » (marges, ''{{lang|en|paddings}}'') afin d'espacer les éléments. Il faut ensuite « activer » la fenêtre pour qu'elle s'affiche. La méthode est <code>mainloop()</code> (boucle principale) : « boucle » (elle est active en permanence et attend des actions sur ses éléments), <syntaxhighlight lang="python"> fenetre.mainloop() </syntaxhighlight> Nous avons ci-dessus mis la plupart du code en programme principal. Nous pouvons aussi programmer de manière fonctionnelle, en mettant la plupart du code dans des fonctions ; cependant, pour que la fenêtre et les variables dynamiques soient globales à tout le programme, elles doivent être déclarées dans le programme principal. Nous pouvons aussi mêler la programmation orientée objet. {{boîte déroulante début|Calcul du rapport de transmission en programmation fonctionnelle et orientée objet}} <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # ************* # ************* # ** Classes ** # ************* # ************* class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): """Valeurs des attributs""" # instructions lancées lors de la déclaration self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z # ************************ # ************************ # ** Variables globales ** # ************************ # ************************ # fenetre principale fenetre = tk.Tk() # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: roue1 = pignon(valeurZ1, valeurM1) roue2 = pignon(valeurZ2, valeurM2) IUrapport.set(roue1.rapport(roue2)) except: IUrapport.set("Erreur") # *********************** # * Interface graphique * # *********************** def configureFenetre(): """Configuration de la fenêtre principale""" fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* configureFenetre() # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> {{boîte déroulante fin}} == Annotations == Une annotation est un commentaire qui sert à expliciter un type de variable. La syntaxe est différente des commentaires « classiques » : cela permet d'avoir un affichage différent avec les éditeurs de texte ayant une coloration syntaxique, et ces informations peuvent être récupérées par des logiciels extérieurs pour effectuer une documentation automatique ou bien des vérifications de type. Cependant : * comme les commentaires normaux, ils n'ont aucune influence lors de l'exécution du texte ; en particulier : * rien n'oblige à annoter les variables ; * il est possible d'avoir une variable ayant un type différent de son annotation ; le fait de pouvoir définir et changer le type de variable à la volée est une fonctionnalité fondamentale de Python. La syntaxe pour une annotation est : : nom_de_variable + deux-points + espace + type par exemple : <syntaxhighlight lang="python"> a: int </syntaxhighlight> Notez qu'ici, la variable n'est ''pas'' créée. Pour la créer, il faut lui affecter une valeur. Il est possible de l'affecter après ou bien sur la même ligne avec la syntaxe : : nom_de_variable + deux-points + espace + type + espace + égal + espace + valeur par exemple : <syntaxhighlight lang="python"> a: int a = 5 # est équivalent à a: int = 5 </syntaxhighlight> Même si l'annotation n'a pas d'impact sur l'exécution, le type doit être un type existant sinon cela génère une erreur de syntaxe. Les types classiques sont : : <code>int</code> — <code>float</code> — <code>str</code> — <code>bool</code> — <code>list</code> — <code>tuple</code> — <code>dict</code> Il est également possible de mettre une chaîne de caractères : <syntaxhighlight lang="python"> a: "ce que je veux" = 3.1516 </syntaxhighlight> On peut annoter une fonction. Il est possible d'annoter les variables déclarées au sein de la fonction, mais pas les variables globales (puisqu'elle ne sont pas définie au sein de la fonction). On peut aussi annoter : * les variables passées en paramètre, avec la même syntaxe dans les parenthèses ; * annoter le type de la variable de sortie (retournée) en la faisant précéder de <code>-&gt;</code> : <syntaxhighlight lang="python"> def plusCinq(a: float = 0) -> float: return a + 5 </syntaxhighlight> ; Ressources * {{lien web | url = https://www.python.org/dev/peps/pep-0526/ | titre = PEP 526 -- Syntax for Variable Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} * {{lien web | url = https://www.python.org/dev/peps/pep-3107/ | titre = PEP 3107 -- Function Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} == Décorateur == Un décorateur est une fonction qui s'applique à une fonction, à la manière de la composition mathématique ''g'' ∘ ƒ = ''g''(ƒ). Mais cette composition affecte la fonction elle-même ; l'utilisateur appelle la fonction ƒ mais c'est la fonction ''g'' ∘ ƒ qui s'exécute. Cette fonction ''g'' est appelée le décorateur. L'intérêt est de pouvoir modifier une fonction sans modifier le code de la fonction elle-même. Pour appliquer une décoration, il faut : # Déclarer le décorateur : une fonction qui s'applique à une autre fonction. # Affecter le décorateur à la fonction visée : en mettant <code>@''décoration''</code> juste avant la définition de la fonction. Par exemple : <syntaxhighlight lang="python"> def decorateur(f): print("Avant la fonction") f() print("après la fonction") @decorateur def afficheFoo(): print("Foo.") afficheFoo # Avant la fonction # Foo. # Après la fonction </syntaxhighlight> Lorsque l'on appelle <code>afficheFoo</code>, on appelle en fait <code>decorateur(afficheFoo)</code>. Si la fonction à modifier admet des paramètres, il faut définir une fonction enveloppante dans le décorateur. Par exemple, nous définissons ci-dessous un décorateur <code>deuxFois()</code> qui fait s'exécuter deux fois de suite la fonction : <syntaxhighlight lang="python"> def deuxFois(f): def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # conteneurFonction </syntaxhighlight> Nous voyons que l'application du décorateur a modifié le nom de la fonction — pas le nom de la variable qui contient la fonction mais bien son nom « intime ». Pour éviter cela, on utilise la méthode <code>wraps()</code> du module <code>functools</code> : <syntaxhighlight lang="python"> import functools def deuxFois(f): @functools.wraps(f) def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # plusCinq </syntaxhighlight> On peut par exemple utiliser un décorateur pour la mémoïsation. La mémoïsation est une méthode consistant à mémoriser les valeurs d'une fonction au fur et à mesure de son utilisation ; ainsi, si l'on veut évaluer la fonction avec les mêmes entrées, on se contente d'aller chercher la valeur enregistrée ce qui est plus rapide. On sacrifie donc la place mémoire au profit de la rapidité. On peut trouver des décorateurs de mémoïsation aux adresses suivantes : * https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize * https://gist.github.com/robcowie/1357800 ; Ressources : {{lien web | url = https://www.python.org/dev/peps/pep-0318/ | titre = PEP 318 -- Decorators for Functions and Methods | site = Python.org | lang = en | consulté le = 2019-04-05 }} == Manipulation de fichiers == === Importer le contenu d'un fichier === Python possède la fonction <code lang="python">open()</code> qui permet d'ouvrir un fichier. Ouvrir signifie qu'il crée un objet de type <code>file</code> qui possède notamment les méthodes <code lang="python">read()</code> et <code lang="python">write()</code>. Il peut s'agir d'un objet de type « fichier binaire » ''({{lang|en|binary file}})'' ou « fichier texte » ''({{lang|en|text file}})''. Si par exemple on veut utiliser (et donc lire) le contenu du fichier texte <code>monfichier.txt</code>, on écrit : <syntaxhighlight lang="python"> fichier = open("monfichier.txt", "rt") … fichier.close() </syntaxhighlight> Le paramètre <code>"rt"</code> signifie que nous ouvrons le fichier en lecture ''({{lang|en|read}})'' et qu'il s'agit d'un objet de type fichier texte. Notons deux choses : * en faisant cela, nous ne faisons qu'associer le fichier à un objet Python, nous n'avons pas encore importé les données ; * si nous ouvrons le fichier, il faut le fermer par la suite ; c'est pourquoi nous utilisons la méthode <code lang="python">.close()</code>. Pour éviter d'avoir à fermer le fichier, nous pouvons l'ouvrir au sein d'un contexte : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: … </syntaxhighlight> Notons aussi que la chaîne de caractères indiquant le nom du fichier peut contenir le chemin d'accès au répertoire (dossier), mais sous Microsoft Windows, il faut utiliser des barres de fractions <code>/</code> pour séparer les sous-répertoires au lieu de la barre inversée habituelle, par exemple : <syntaxhighlight lang="python"> chemin = "C:/Temp/monfichier.txt" with open(chemin, "rt") as fichier: … </syntaxhighlight> Pour mettre les données du fichier dans la variable <code>contenu</code>, nous écrivons donc : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() print(contenu) </syntaxhighlight> et si nous ne voulons lire que les <code>n</code> premiers caractères (<code>n</code> étant un entier), nous utilisons <code lang="python">contenu = fichier.read(n)</code>. Cette lecture est séquentielle, c'est-à-dire que si nous appliquons la méthode plusieurs fois, nous reprenons la lecture là où nous l'avons laissée. Si nous voulons lire une ligne, nous utilisons la méthode <code lang="python">.readline()</code>. La lecture ligne par ligne est également séquentielle. Nous pouvons aussi créer une liste dont chaque élément est une ligne du fichier ; nous utilisons alors la méthode <code lang="python">.readlines()</code> (notez le pluriel). Chaque élément de la liste se termine par le caractère de fin de ligne <code lang="python">\n</code>. Pour l'enlever, nous pouvons utiliser la méthode <code lang="python">.rstrip()</code> pour chaque élément de la liste, par exemple. L'exemple complet est alors : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.readlines() contenu = [item.rstrip() for item in contenu] print(contenu) </syntaxhighlight> === Exporter du contenu vers un fichier === Si nous voulons créer un fichier texte pour y mettre le contenu de la variable <code>texte</code>, alors nous utilisons : <syntaxhighlight lang="python"> with open("monfichier.txt", "wt") as fichier: contenu = fichier.write(texte) </syntaxhighlight> Le module principal important pour la manipulation de fichiers est est <code lang="python">os</code>. === Exploiter le contenu d'un fichier texte === Avec un fichier texte, la méthode <code lang="python">.read()</code> crée une variable de type texte. Nous pouvons séparer cette variable en différentes lignes avec la méthode <code lang="python">.splitlines()</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une ligne. Si maintenant une ligne contient plusieurs données séparées par un séparateur commun, par exemple un espace, nous pouvons séparer les données par la méthode <code lang="python">.split(''séparateur'')</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une donnée. Si par exemple le fichier est du type CSV ''({{lang|en|comma separated values}}'', valeurs séparées par une virgule), l'exploitation du fichier est : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(",") for item in contenu] </syntaxhighlight> La variable <code>contenu</code> est une liste de listes. Pour avoir la ''n''<sup>e</sup> valeurs de la ''m''<sup>e</sup> ligne, on utilise : <syntaxhighlight lang="python"> contenu[m-1][n-1] </syntaxhighlight> Si l'on veut extraire la ligne ''m'' il suffit d'écrire : <syntaxhighlight lang="python"> contenu[m-1] </syntaxhighlight> mais si l'on veut la colonne ''n'', le plus simple est d'utiliser une définitipon en compréhension : <syntaxhighlight lang="python"> [ligne[n-1] for ligne in contenu] </syntaxhighlight> Dans certains fichiers CSV, les séparateurs de valeurs ne sont pas des virgules, on peut donc utiliser un autre caractère pour le séparateur. Si le séparateur est une tabulation, on utilise <code lang="python">\t</code> : <code lang="python">contenu = [item.split("\t") for item in contenu]</code> Si la première ligne contient les en-têtes des colonnes, on peut l'enlever avec la fonction <code lang="python">del()</code> : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() del(contenu[0]) contenu = [item.split(",") for item in contenu] </syntaxhighlight> Certains logiciels créent des fichiers en utilisant le séparateur décimal régional, qui en France est la virgule. Pour remplacer les virgules par des points, on peut utiliser la méthode <code lang="python">.replace()</code>, de préférence ''avant'' de séparer les valeurs : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.replace(",", ".") for item in contenu] # remplace les virgules par des points contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule </syntaxhighlight> en effet, lorsque l'on a séparé les valeurs, on a une liste de liste, il faut alors balayer les sous-listes ce qui prend plus de temps : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule contenu = [[subitem.replace(",", ".") for subitem in item] for item in contenu] # remplace les virgules par des points </syntaxhighlight> '''Exemple complet''' Supposons que l'on ait un fichier texte de la forme : <syntaxhighlight lang="text"> x y z V 0.0 1.5 3.2 8.657 0.4 1.5 3.2 8.392 0.2 1.5 3.2 8.485 ... </syntaxhighlight> C'est un fichier valeurs V associées à des points de coordonnées ''(x, y, z)'' (un champ V sur l'espace, donc). Nous remarquons que seule la coordonnée ''x'' change : les données concernent la droite (''y'' = 1,5 ; ''z'' = 3,2). Nous remarquons aussi que les valeurs de ''x'' ne sont pas classées par ordre croissant ni décroissant. Nous voulons au final avoir une matrice [[''x''], [V]] triée par ''x'' croissant. Pour cela, nous pouvons faire : <syntaxhighlight lang="python"> with open(nomdefichier, "rt") ad fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(" ") for item in contenu contenu = contenu[1:] # élimine la première ligne x = np.array([float(ligne[0]) for ligne in contenu]) V = np.array([float(ligne[3]) for ligne in contenu]) donnees = np.concatenate((x.reshape(-1, 1), V.reshape(-1, 1)), axis=1) # matrice [[x], [V]] ind = np.argsort(donnees[:, 0]) donnees = donnees[ind, :] # matrice triée plt.plot(donnees[:, 0], donnees[:, 1]) </syntaxhighlight> {{note|Pour le tri, voir [[../Manipulation_de_matrices#Fonctions_et_méthodes_de_base|''Manipulation de matrices'' &gt; ''Fonctions et méthodes de base'']].}} === Cas d'un fichier CSV === Si le fichier CSV ne contient que des valeurs numériques, on peut utiliser : <syntaxhighlight lang="python"> valeurs = np.loadtxt(chemin+nomfic, delimiter=",") # si le séparateur est une virgule </syntaxhighlight> Il existe un module <code lang="python">csv</code> dédié aux fichiers CSV. La manipulation du fichier se fait comme suit : <syntaxhighlight lang="python"> import csv with open(chemin+nomfic, "rt") as fichier: lecteur = csv.reader(fichier, delimiter=",") contenu = [ligne for ligne in lecteur] print(contenu) </syntaxhighlight> === Utilisation de Pandas === Pandas<ref>https://pandas.pydata.org/</ref> est un module gérant les tableaux de données, appelés <em lang="en">data frames</em>. Voici quelques commandes utiles : <syntaxhighlight lang="python"> import numpy as np import pandas as pd M = np.random.rand(10, 10) # crée une matrice NumPy aléatoire de dimension 10 × 10 tableau = pd.DataFrame(M) # transforme la matrice en tableau DataFrame tableau.to_csv("tableau.csv") # enregistre le tableau dans un fichier CSV donnees = pd.read_csv("tableau.csv").to_numpy() # lit le fichier et transforme le tableau DataFrame en matrice NumPy </syntaxhighlight> == Exporter un programme Python == Vous pouvez créer un fichier « Python pur » <code>.py</code>. Pour cela, dans le menu <code>fichier/file</code> de Jupyter, choisir <code>télécharger/download</code> au format <code>.py</code> ; le fichier se trouve alors dans le répertoire de téléchargement du navigateur. == Ressources == * {{lien web | url = https://www.python.org/dev/peps/pep-0008/ | titre = PEP 8 -- Style Guide for Python Code | site = Python documentation | consulté le = 2019-03-14 }} == Notes et références == {{références}} ---- [[../Fonctions mathématiques générales|Fonctions mathématiques générales]] &lt; [[../|↑]] &gt; [[../Graphiques|Graphiques]] {{DEFAULTSORT:Elements de programmation}} [[Catégorie:Python pour le calcul scientifique (livre)]] o5l130fkvwxh56nu41dq8opiko24u4c 767326 767325 2026-06-02T13:38:22Z Cdang 1202 /* Autres fonctions */ autre manière 767326 wikitext text/x-wiki Rappel : les programmes commencent par : <syntaxhighlight lang="python"> #!/usr/bin/python3 import numpy as np import matplotlib.pyplot as plt </syntaxhighlight> == Entrées et sorties == Pour permettre à l'utilisateur ou à l'utilisatrice d'entrer une valeur, nous utilisons la fonction <code lang="python">input()</code> comme évoqué précédemment (chapitre ''[[../Premiers programmes|Premiers programmes]]''), avec la syntaxe <code lang="python">''variable'' = input(''texte'')</code>. Notez que la valeur renvoyée par <code lang="python">input()</code> est une chaîne de caractères. Si vous voulez autre chose, typiquement un nombre, il faut convertir cette chaîne. Par exemple, nous demandons ici d'entrer une longueur sous la forme d'une valeur numérique : <syntaxhighlight lang="python"> longueurDefaut = 10.0 texteDemandeLongueur = f"Veuillez entrer la longueur en millimètres (valeur par défaut {longueurDefaut} mm) : " longueur = input(texteDemandeLongueur) if longueur=="": longueur=longueurDefaut else: longueur=float(longueur) print(longueur) </syntaxhighlight> Pour afficher un texte, on utilise la fonction <code lang="python">print()</code>, également présentée dans le chapitre ''[[../Premiers programmes|Premiers programmes]]'', avec la syntaxe <code lang="python">print(''texte'')</code>. Le texte à afficher peut être de n'importe quel type (entier, réel en virgule flottante, booléen, chaîne de caractères…) mais si l'on veut « mélanger » les types, il faut tout convertir en chaînes de caractères, avec la fonction <code lang="python">str()</code>, et concaténer les chaînes avec <code lang="python">+</code>. Par exemple : <syntaxhighlight lang="python"> print("La longueur vaut : "+str(longueur)+" mm.") </syntaxhighlight> Nous pouvons aussi utiliser une « chaîne “f” » ''({{lang|en|f-string}})'' : on met un le <code lang="python">f</code> devant le guillemet ouvrant et dans la chaîne, on met un champ sous la forme <code lang="python">{''nomDeVariable''}</code>. L'exemple ci-dessus devient alors : <syntaxhighlight lang="python"> print(f"La longueur vaut : {longueur} mm.") </syntaxhighlight> Les chaînes « f » sont détaillées dans la section ''[[#Chaînes de caractères|Chaînes de caractères]]'' ci-dessous. Si l'on veut introduire un retour à la ligne dans la chaîne, on utilise les caractères <code lang="python">\n</code> (contre-oblique suivie de la lettre N minuscule). Par exemple <syntaxhighlight lang="python"> print("Ceci est un texte\navec un retour à la ligne.") </syntaxhighlight> == Types de variables == === Généralités === Python définit « tout seul » le type de la variable : « <code>3</code> » sera un entier ''({{lang|en|integer}})'', « <code>3.0</code> » sera un réel à virgule flottante ''({{lang|en|float}})'', « <code>"3"</code> » sera une chaîne de caractères ''({{lang|en|string}})''. On peut connaître le type d'une variable avec la fonction <code>type()</code>. On peut tester certaines valeurs, avec le module <code>NumPy</code> : * <code>np.isnan(x)</code> indique si les valeurs de ''x'' sont des NaN ''({{lang|en|not a number}})'' ; si ''x'' est une matrice, le résultat est une matrice de booléens, l'élément [''i'', ''j''] est <code>True</code> si <code>x[i, j]</code> est un NaN ; * <code>np.isinf(x)</code> indique si les valeurs de ''x'' sont ±∞ ; si ''x'' est une matrice, le résultat est une matrice booléenne de même dimension. On peut forcer un type : * <code>int(x)</code> : transforme la valeur ''x'' en nombre entier ; * <code>long(x)</code> : " en entier long (précision illimitée) ; * <code>float(x)</code> : " en nombre réel à virgule flottante ; * <code>str(x)</code> : " en chaîne de caractères ; * <code>complex(Re, Im)</code> : crée le nombre complexe ''Re'' + ''Im''·j, j désignant la racine carrée de –1 ; * <code>list()</code> : crée une liste ; * <code>tuple()</code> : crée un n-uplet. Par exemple <syntaxhighlight lang="python"> type(3) # <class 'int'> type(float(3)) # <class 'float'> complex(1, 1) == 1 + 1j # True list("blabla") # ['b', 'l', 'a', 'b', 'l', 'a'] </syntaxhighlight> Python distingue plusieurs genres de types : * Un itérable est un objet dont on peut extraire les éléments un par un ; ce sont les objets pour lesquels on peut écrire <code> for i in ''iterable'':</code>. Il s'agit essentiellement des listes, n-uplets, chaînes de caractères, ensembles, dictionnaires et fichiers. * Un modifiable ''({{lang|en|mutable}})'' est un objet que l'on peut modifier ; par exemple une liste est modifiable — on peut changer la valeur d'un élément, en ajouter ou en enlever un — mais les n-uplets non, pas plus qu'une chaîne de caractères ou un nombre. * Un identifiable (''{{lang|en|hashable}}'', le ''{{lang|en|hashage}}'' étant une signature caractéristique d'un objet) : objet possédant un identifiant unique. Un objet identifiable est toujours non-modifiable ''({{lang|en|unmutable}})''. === Types numériques === ==== Entiers ==== Nous pouvons définir les entiers au format octal ou hexadécimal : il faut débuter le nombre par respectivement <code>0o</code> (le chiffre zéro et la lettre o) et <code>0x</code> (le chiffre zéro et la lettre x). À l'inverse, la fonction <code>hex()</code> renvoie une chaîne correspondant à l'écriture d'un entier au format hexadécimal, et <code>oct()</code> renvoie la chaîne correspondant à l'éciture en octal. Par exemple : <syntaxhighlight lang="python"> print(0o10, ";", 0x10) # 8 ; 16 print(hex(20)) # 0x14 </syntaxhighlight> ==== Réels ==== Les réels disposent de fonctions spécifiques appelées « méthodes ». Une méthode est une fonction spécifique à un type d'objets. Étant conçue ''ad hoc'', elle est souvent plus économe en ressource et en temps qu'une fonction générique. Pour appliquer la méthode <code>meth()</code> à la variable <code>x</code>, on écrit : <code>x.meth()</code>. Nous avons déjà présenté la méthode <code>''float''.as_integer_ration()</code> qui donne la fraction réduite égale à la valeur du nombre. Les réels disposent de plusieurs autres méthodes : * <code>''float''.trunc()</code> : tronque le nombre réel ; * <code>''float''.floor()</code>, <code>''float''.ceil()</code> : renvoie l'entier le plus proche, respectivement inférieur ou supérieur ; * <code>''float''.hex()</code> : renvoie une chaîne de caractères correspondant à l'écriture du nombre en hexadécimal. Par exemple : <syntaxhighlight lang="python"> a = 20. print(a.hex()) # 0x1.4000000000000p+4 print(10..hex()) # 0x1.4000000000000p+3 </syntaxhighlight> Dans le deuxième exemple, nous appliquons la méthode <code>''float''.hex()</code> directement au nombre <code>10.</code> ; le point est obligatoire car sinon, c'est un entier, pour lequel la méthode n'est pas définie. Notez que la ''méthode'' <code>''float''.hex()</code> est différentes de la ''fonction'' <code>hex()</code> : la première concerne les réels, la seconde les entiers. ==== Complexes ==== Nous avons déjà mentionné la méthode <code>''complex''.conjugate()</code> qui donne le conjugué du nombre. Un nombre complexe dispose de deux attributs : * <code>''complex''.real</code> : sa partie réelle ; * <code> ''complex''.imag</code> : sa partie imaginaire. Par exemple : <syntaxhighlight lang = "python"> a = 5+2j print(a.conjugate(), ";", a.real, ";", a.imag) # (5-2j) ; 5.0 ; 2.0 </syntaxhighlight> === Chaînes de caractères === ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/inputoutput.html | titre = 7. Input and Output | site = Python Documentation | consulté le = 2019-04-06 }} ==== Généralités ==== Il existe en fait trois manières de définir une chaîne de caractères : * avec des guillemets simples ou doubles comme vu précédemment : <code>"…"</code> ou bien <code>'…'</code> ; * avec trois guillemets doubles : <code>"""…"""</code> : cela permet d'avoir une chaîne de caractères s'étendant sur plusieurs lignes, les retours de ligne étant pris en compte ; c'est utilisé en particulier pour la description des fonctions (''{{lang|en|docstrings}}'', voir ci-après) ; * avec des guillemets précédés d'un « r », <code>r"…"</code> ou <code>r'…'</code> : cela permet d'interpréter les barres de fraction inverses « \ » comme un caractère « normal » et non comme un caractère d'échappement (voir ci-après) ; cela est utile lorsque l'on utilise les possibilités LaTeX dans le tracé de graphiques (voir plus loin) ; * avec des guillemets précédés d'un « f », <code>f"…"</code> ou <code>f'…'</code> : cela permet d'utiliser des variables formatées (voir ci-après). Une chaîne de caractères n'est pas modifiable. Si l'on veut remplacer un caractère, l'insérer ou le supprimer, il faut transformer la chaîne en liste, avec la commande <code>list()</code>, puis rassembler la liste en la joignant ''({{lang|en|join}})'' à une chaîne vide : <syntaxhighlight lang="python"> chaine = "blabla" chaineList = list(chaine) chaineList[2] = "c" chaine = "".join(chaineList) print(chaine) # blcbla </syntaxhighlight> Dans une chaîne simple <code>"…"</code> ou <code>'…'</code>, on peut introduire un retour à la ligne avec <code>\n</code>. ==== Substitution de variables ==== Lorsque l'on veut utiliser des variables, on fait précéder les guillemets d'un « f » et l'on écrit les noms de vrariables entre accolades. Par exemple : <syntaxhighlight lang="python"> monde = "world" chaine = f"Hello {monde}!" print(chaine) # Hello world! </syntaxhighlight> On peut indiquer la taille de la chaîne générée à partir de la variable sous la forme <code>{nomVariable:taille}</code>, la taille étant un entier. Par exemple : <syntaxhighlight lang="python"> chiffre1 = 1 nom1 = "un" chiffre2 = 2 nom2 = "deux" chaine = f"{nom1:5} : {chiffre1:5d}\n{nom2:5} : {chiffre2:5d}" print(chaine) # un : 1 # deux : 2 </syntaxhighlight> Vous remarquez que l'on ajoute un « d » pour les entiers décimaux, et que les nombres sont alignés à droite. Si le nombre est un nombre réal à virgule flottante ''({{lang|en|float}})'', on peut indiquer le nombre de décimales sous la forme <code>.''n''f</code> : <syntaxhighlight lang="python"> chaine = f"{np.pi:.5f}" print(chaine) # 3.15169 </syntaxhighlight> Avec la syntaxe <code>''m''.''n''f</code>, on indique également que la totalité du nombre doit occuper ''m'' caractères. Pour convertir un nombre en caractère Unicode correspondant, on utilise la lettre c : <syntaxhighlight lang="python"> nompi = 0x03c0 # Caractère Unicode π : U+03C0 chaine = f"{nompi:c} = {np.pi:.5f}" print(chaine) # π = 3.14159 </syntaxhighlight> La classe ''str'' dispose également de la méthode <code>.format()</code>. On indique un n-uplet de chaînes (ou de nombres) à la méthode et l'on met des accolades dans la chaîne principale ; les accolades sont remplacées dans l'ordre des chaînes de la méthode. On peut changer l'ordre en indiquant quelle valeur utiliser dans quelle accolade. Par exemple : <syntaxhighlight lang="python"> chaine1 = "On compte {} puis {}".format(1, 2) chaine2 = "On compte {0} puis {1}. Mais à rebours, on compte {1} puis {0}.".format("un", "deux") print(chaine1, "\n", chaine2) # On compte 1 puis 2 # On compte un puis deux. Mais à rebours, on compte deux puis un. </syntaxhighlight> L'utilisation du caractère pourcent « % » permet d'utiliser la mise en forme <code>sprintf()</code> du langage C : <syntaxhighlight lang="python"> chaine = "π = %.5f" % np.pi print(chaine) # π = 3.14159 </syntaxhighlight> ; Exemple <nowiki>:</nowikI> barre de progression : Voici une fonction affichant une barre de progression, pour la ''i''-ème étape d'un processus ayant ''n'' étapes (pour la notion de fonction, voir la section ci-après ''[[#Fonction|Fonction]]''). : NB : nous avons utilisé les codes Unicode pour l'exemple, mais on peut évidemment copier le caractère, par exemple depuis une table Unicode ou une page Web<ref>Pour le point médian : ''{{W|Table des caractères Unicode/U0080}}'' ou ''{{W|Point médian}}''. Pour le pavé : ''{{W|Table des caractères Unicode/U2580}}''.</ref>, et le coller dans le code, comme nous l'avons fait dans le commentaire. <syntaxhighlight lang="Python"> def barre_progression(i, n, largeur=40): """ Affiche une barre de progression Entrées : — i : étape en cours, entier ; — n : nombre d'étapes à réaliser, entier ; — largeur : nombre de caractères total de la barre, entier. Sortie : affichage de la barre de progression. """ taux = i/n fait = int(largeur * taux) barre = f"{0x2588:c}" * fait + f"{0x00b7:c}" * (largeur - fait) # U+2588 : pavé "█" ; U+00B7 : point médian "·" print(f"Progression | {barre} | {100*taux:3.1f} %") barre_progression(25, 100) # Progression | ██████████······························ | 25.0 % </syntaxhighlight> ==== Méthodes des chaînes ==== Le type ''str'' dispose d'un certain nombre de méthodes. Nous avons déjà vu les méthodes <code>''str''.join()</code> et <code>''str''.format()</code>, en voici quelques autres : * <code>''str''.capitalize()</code> : met le premier caractère en capitale (majuscule) et les autres en minuscule ; * <code>''str''.lower()</code> : met tout en minuscules ''({{lang|en|lowercase}})'' ; * <code>''str''.upper()</code> : met tout en capitales ''({{lang|en|lowercase}})'' ; * <code>''str''.center(''n'')</code> : met la chaîne au centre d'une chaîne de longueur ''n'', en complétant avec des espaces ; on peut compléter avec d'autres caractères avec <code>''str''.center(''n'', ''c'')</code>, par exemple <code>"a".center(7, ".")</code> donne <code>"....a...."</code> ; * <code>''str''.ljust(''n'', ''c'')</code> et <code>''str''.rjust(''n'', ''c'')</code> : comme <code>.center()</code> mais la chaîne est respectivement alignée au fer à gauche ''({{lang|en|left}})'' et à droite ''({{lang|en|right}})'' ; * <code>''str''.isdigit()</code> : booléen vrai si tous les caractères sont des nombres ; * <code>''str''.find(''sous-chaine'')</code>, <code>''str''.rfind(''sous-chaine'')</code> : indique respectivement le premier emplacement et le dernier emplacement de la sous-chaîne dans la chaîne ; * <code>''str''.partition(''séparateur'')</code> : retourne un triplet avec la portion de chaîne avant le séparateur, le séparateur puis la portion de chaîne après le séparateur ; * <code>''str''.replace(''ancien'', ''nouveau'')</code> : remplace la chaîne ''ancien'' par la chaîne ''nouveau'' dans la chaîne ; * <code>''str''.split(''séparateur'')</code> : découpe la chaîne au niveau des séparateurs et renvoie une liste. ==== Autres fonctions ==== La fonction <code>chr()</code> transforme un code Unicode en caractère. Par exemple, <code>chr(97)</code> donne <code>"a"</code> et <code>chr(0x03c0)</code> donne <code>"π"</code>. Si on veut créer une liste de caractères qui se suivent, on peut par exemple utiliser : <syntaxhighlight lang="python"> [chr(x) for x in range(97, 102)] # ['a', 'b', 'c', 'd', 'e'] </syntaxhighlight> Si on veut créer une liste de nombres sous la forme de chaînes de caractères, on peut utiliser la commande <code>str()</code> vue ci-dessus. Par exemple : <syntaxhighlight lang="python"> [str(x) for x in range(1, 6)] # ['1', '2', '3', '4', '5'] </syntaxhighlight> Pour la syntaxe, voir ci-dessous la section [[#Définition en compréhension|''Définition en compréhension'']]. Ainsi, dans l'exemple de la barre de progression ci-dessus, on peut utiliser la solution suivante pour constituer la barre : <syntaxhighlight lang="python"> barre = chr(0x2588) * fait + chr(0x00b7) * (largeur - fait) # U+2588 : bloc ; U+00B7 : point médian </syntaxhighlight> Rappel : le module <code>html</code> permet d'utiliser les entités HTML : <syntaxhighlight lang="python"> import html … print(html.entities.html5["alpha;"]+html.entities.html5["middot;"]) # α· </syntaxhighlight> L'entité HTML <code>&xxx;</code> s'obtient par <code>html.entities.html5["xxx;"]</code>, donc en enlevant la perluète ; mais cela ne fonctionne pas avec les codes Unicode. Pour cela, on peut utiliser la commande <code>html.unescape()</code>. Ainsi, dans l'exemple de la barre de progression ci-dessus, on peut utiliser la solution suivante pour constituer la barre : <syntaxhighlight lang="python"> barre = html.unescape("&#x2588;") * fait + html.entities.html5["middot;"] * (largeur - fait) # U+2588 : bloc ; middot : point médian </syntaxhighlight> ou bien <syntaxhighlight lang="python"> barre = html.unescape("&#x2588;") * fait + html.unescape("&middot;") * (largeur - fait) # U+2588 : bloc ; middot : point médian </syntaxhighlight> La commande <code>html.unescape()</code> interprète une chaîne complète, par exemple <syntaxhighlight lang="python"> print(html.unescape("L'esperluette est le caractère &laquo;&nbsp;&amp;&nbsp;&raquo;.")) # L'esperluette est le caractère « & ». </syntaxhighlight> == Manipulation de listes == Les listes sont une structure de données fondamentale en Python. ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/datastructures.html | langue = en | titre = 5. Data structures | site = Python documentation | consulté le = 2019-03-16 }} === Copie d'une liste === Contrairement à d'autres types, lorsque vos écrivez <code>b = a</code> avec des listes, vous ne créez pas une copie de la variable <code>a</code>, vous créez un ''alias'' : l'objet <code>b</code> est un autre nom de l'objet <code>a</code>. En particulier, si vous modifiez <code>b</code>, vous modifiez en fait <code>a</code>. Par exemple : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a b[2] = 5 print(a, b) # [1, 2, 5, 4] [1, 2, 5, 4] </syntaxhighlight> Si l'on veut créer une copie de <code>a</code>, il faut utiliser <code>a[:]</code> ou bien <code>a.copy()</code> : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a[:] c = a.copy() b[2] = 5 c[2] = 6 print(a, b, c) # [1, 2, 3, 4] [1, 2, 5, 4] [1, 2, 6, 4] </syntaxhighlight> === Méthodes de listes === Pour modifier une liste, vous disposez des méthodes suivantes : * <code>a.append(x)</code> : ajoute l'élément <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.extend(x)</code> : ajoute la liste <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.append(i, x)</code> : aoute l'élément <code>x</code> ''avant'' l'interstice ''i'' de la liste <code>a</code> ; * <code> x = a.pop(i)</code> : enlève l'élément ''i'' de la liste <code>a</code> et le met dans la variable <code>x</code> ; <code> x = a.pop()</code> enlève le dernier élément de la liste ; * <code>a.clear()</code> : vide la liste <code>a</code> ; * <code>a.sort()</code> : trie la liste par ordre croissant ; * <code>a.sort(reverse = True)</code> : trie par ordre décroissant ; * <code>a.reverse()</code> : inverse l'ordre de <code>a</code>. Pour supprimer l'élément à l'indice ''i'', au lieu d'utiliser <code>a.pop(i)</code>, on peut aussi utiliser <syntaxhighlight lang="python"> del(a[i]) </syntaxhighlight> Pour trier une liste, on peut aussi utiliser la fonction <code>sorted()</code>, ce qui permet par exemple de conserver la liste originale, non triée : <code>b = sorted(a)</code>. La fonction <code>sorted()</code> fonctionne avec tous les objets « itérables » comme par exemple une chaîne de caractères : <syntaxhighlight lang="python"> a = "ahjbfk" print(sorted(a)) # ['a', 'b', 'f', 'h', 'j', 'k'] </syntaxhighlight> Pour mettre en évidence la performance de la méthode <code>''list''.sort()</code> par rapport à la fonction générique <code>sorted()</code> : <syntaxhighlight lang="python"> import numpy as np import time a = np.random.rand(int(1e7)) t1 = time.perf_counter() b = sorted(a) # Fonction générique t2 = time.perf_counter() a.sort() # Méthode spécifique t3 = time.perf_counter() print("Sorted :", t2-t1, " s ; .sort :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # Sorted : 14.2... s ; .sort : 1.1... s ; rapport : 12.6... </syntaxhighlight> Par rapport à une valeur donnée : * <code>a.remove(x)</code> : retire la première occurrence de la valeur <code>x</code> de la liste <code>a</code> ; * <code>a.index(x)</code> : indique l'indice où se trouve la première occurrence de la valeur <code>x</code> ; * <code>a.count(x)</code> : indique le nombre de fois que l'on trouve la valeur <code>x</code> dans la liste <code>a</code>. === Définition en compréhension === La [[w:fr:Liste en compréhension|définition en compréhension]] ''({{lang|en|list comprehension}})'' est une méthode permettant de construire des listes en indiquant simplement des axiomes, des consignes de filtrage. Cette méthode est élégante car proche de la notation mathématique et compacte, mais c'est une méthode itérative donc lente par rapport à une méthode vectorisée fournie par le module NumPy. Par exemple, pour créer la liste des carrés des nombres entiers entre 0 et 9, il suffit d'écrire <syntaxhighlight lang="python"> carre = [x**2 for x in range(10)] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x^2 | x \in [0 ; 9] \}</math>. Si l'on veut la liste des nombres strictement inférieurs à 20 dont le carré est supérieur à 10, on peut écrire : <syntaxhighlight lang="python"> X = [x for x in range(20) if x**2 > 10] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x | x \in [0 ; 19], x^2 > 10 \}</math>. Pour mettre en évidence la performance du calcul vectorisé par rapport à la méthode itérative : <syntaxhighlight lang="python"> import time import numpy as np n = int(1e7) # taille de la liste t1 = time.perf_counter() carre = [x**2 for x in range(n)] # Définition en compréhension t2 = time.perf_counter() carre2 = np.arange(n)**2 # Calcul vectorisé t3 = time.perf_counter() print("En compréhension : ", t2-t1, "s ; vectorisé :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # En compréhension : 4.515... s ; vectorisé : 0.156... s ; rapport : 28.982... </syntaxhighlight> == Structure d'un programme == Un programme est simplement une suite d'instructions. Dans les environnements Unix BSD, un programme Python peut être considéré comme un script c'est-à-dire qu'il suffit de taper son nom dans l'invite de commande ''({{lang|en|shell}})'' sans avoir à invoquer <code>python</code>. Le programme doit alors commencer par un en-tête normalisé surnommé ''{{lang|en|[[wikt:shebang|shebang]]}}'' : <syntaxhighlight lang="python"> #!/usr/bin/env python3 </syntaxhighlight> Ce ''{{lang|en|shebang}}'' est inutile avec Jupyter. L'en-tête peut également contenir la description de l'encodage du fichier texte, typiquement : <syntaxhighlight lang="python"> # coding: utf-8 </syntaxhighlight> Le codage UTF-8 est le codage par défaut pour Python 3, il est donc inutile de l'indiquer. Les commentaires sont introduits par le croisillon <code>#</code>. On peut grouper une suite d'instructions dans un bloc. Un bloc d'instructions commence par deux-points « <code>:</code> » et est identé, c'est-à-dire qu'il a une marge constituée de quatre espaces — on peut aussi utiliser une tabulation mais il ne faut pas mélanger les deux méthodes ; les tabulations sont déconseillées, il vaut mieux utiliser quatre espaces<ref>{{lien web | url = https://www.python.org/dev/peps/pep-0008/#tabs-or-spaces | titre = Tabs or Spaces? | site = Python documentation | consulté le = 2019-03-14 }}</ref>. Pour terminer le bloc, il suffit simplement de revenir en début de ligne ; contrairement à d'autres langages, il n'y a pas de commende de fin ''({{lang|en|end}})'', c'est l'indentation qui définit le bloc. : # début du bloc ''instruction 1'' ''instruction 2'' … ''dernière instruction du bloc'' ''instruction hors bloc'' Par exemple, une exécution conditionnelle <code>if</code> ou une boucle <code>for</code> exécute un bloc d'instruction. Si l'on a besoin d'un bloc d'instruction qui « ne fait rien », on utilise l'instruction <code>pass</code>. == Structures de contrôle == '''Boucle itérative''' La boucle itérative s'écrit : <syntaxhighlight lang="python"> for <variable> in <itérable>: <bloc d’instructions> </syntaxhighlight> Si l'on veut que la variable prenne ''n'' valeurs de 0 à ''n'' – 1, on utilise l'instruction <code>range()</code> : <syntaxhighlight lang="python"> for i in range(5): print(i) print("Fin de la boucle") </syntaxhighlight> <code>[▶]</code> 0 1 2 3 4 Fin de la boucle En fait, la commande <code>range()</code> extrait des valeurs de l'ensemble des nombres entiers ; on peut ainsi utiliser le découpage en tranches, par exemple <code>range(2, 5)</code>pour avoir la « liste » <code>[2, 3, 4]</code>. Notez que <code>range()</code> ne crée pas à proprement parler une liste, cela crée un objet de type ''« {{lang|en|range}} »'' (plage, intervalle) ; pour avoir une liste, il faut écrire <code>list(range(n))</code>. Dans une boucle, la commande <code>continue()</code> saute la fin du bloc d'instruction et passe à la valeur suivante de la boucle. La commande <code>break()</code> interrompt la boucle et passe à la suite. '''Exécution conditionnelle''' L'exécution conditionnelle s'écrit : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> </syntaxhighlight> On peut utiliser les commandes <code>elif</code> ''(else if'') et <code>else</code> : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> elif <booléen>: <bloc d’instructions> else: <bloc d’instructions> </syntaxhighlight> Notez que le test d'une condition est gourmand en ressources. S'il s'agit de savoir si l'on effectue une opération mathématique simple ou pas, on peut remplacer le test par une multiplication par un booléen (<code>True</code> vaut 1, <code>False</code> vaut 0). Par exemple, plutôt que d'écrire <syntaxhighlight lang="python"> if a > 0: b = b - c </syntaxhighlight> mieux vaut écrire : <syntaxhighlight lang="python"> b = b - (a > 0)*c </syntaxhighlight> '''Boucle antéconditionnée''' La boucle antéconditionnée s'écrit : <syntaxhighlight lang="python"> while <booléen>: <bloc d’instructions> </syntaxhighlight> Cette boucle peut contenir des instructions <code>continue()</code> et <code>break()</code>. == Fonction == La déclaration d'une fonction utilise la commande <code>def</code>. La fonction est un bloc d'instructions. Si elle doit renvoyer des valeurs, on utilise la commande <code>return</code>. Par exemple <syntaxhighlight lang="python"> def nombres(n): """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo a = nombres(3) print(a) </syntaxhighlight> La fonction commence par une chaîne de caractères qui la décrit. Cette chaîne peut être récupérée automatiquement par certains logiciels pour faire une documentation automatique. Si la description prend plusieurs lignes, elle commence et finit par trois double-guillemets <code>"""…"""</code> ; en fait, par convention, même si cela n'est pas obligatoire, les descriptions sont toutes encadrées de trois double-guillemets. Cette description est appelée ''{{lang|en|docstring (documentation string)}}''. Pour récupérer les ''{{lang|en|docstrings}}'' : <syntaxhighlight lang="python"> def foo(): """Cette fonction ne fait rien""" pass print(foo.__doc__) # Cette fonction ne fait rien </syntaxhighlight> L'instruction <code>input()</code> permet à l'utilisateur de saisir une valeur. La valeur est retournée sous la forme d'une chaîne de caractères qui est ensuite convertie en nombre réel avec l'instruction <code>float()</code>. On peut définir une valeur par défaut en l'indiquant dans l'en-tête de la définition de la fonction, de la manière suivante : <syntaxhighlight lang="python"> def nombres(n=1): # valeur par défaut : 1 """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo </syntaxhighlight> Si le paramètre à initialiser est de type modifiable ''({{lang|en|mutable}})'', comme par exemple une liste, il faut procéder comme suit : <syntaxhighlight lang="python"> def fooFonction(fooListe=None): # valeur par défaut : n'existe pas """Description""" if fooListe = None: fooListe = [] # initialisation <suite des instructions> </syntaxhighlight> Par défaut, les variables sont locales. On peut rendre une variable globale avec l'instruction <code>global</code> ''à l'intérieur de la fonction'', avant l'utilisation de la variable. Par exemple : <syntaxhighlight lang="python"> a = 1 b = 1 def toto(): """Test de variable globale. Entrée : aucune. Sortie : aucune.""" global a a = 2 b = 2 toto() print("a =", a, "; b =", b) # a = 2 ; b = 1 </syntaxhighlight> Pour être plus précis : si une variable n'est pas assignée dans une fonction, alors Python va chercher une variable du même nom à l'extérieur de la fonction. Mais à partir du moment où la variable est assignée dans la fonction, elle devient locale ''sauf'' si l'on a utilisé l'instruction <code>global</code>. Si l'on s'attend à un nombre indéfini d'arguments, on utilise la notion d'empaquetage/dépaquetage ''({{lang|en|packing/unpacking}})''<ref>{{lien web | url = https://deusyss.developpez.com/tutoriels/Python/args_kwargs/ | titre = Introduction à *args et **kwargs | consulté le = 2019-03-09 | site = Developpez.com }}.</ref>. L'empaquetage consiste à mettre les arguments dans un n-uplet, le dépaquetage consiste à développer un n-uplet en plusieurs variables. Cela se fait en mettant un astérisque ''({{lang|en|splat}})'' « <code>*</code> » devant le nom de la variable. Par convention, on utilise le nom de variable <code>*args</code> mais cela n'est pas obligatoire. <syntaxhighlight lang="python"> def concatenation(*args): """Concatène des chaînes de caractères Entrée : *args, n-uplet de chaînes de caractères. Sortie : resultat, chaîne de caractères.""" resultat = "" for i in args: resultat = resultat + i return resultat concatenation("a", "foo", "toto") # 'afoototo' </syntaxhighlight> À l'inverse, si une fonction doit recevoir plusieurs paramètres, on peut à la place lui transmettre une liste à dépaqueter : <syntaxhighlight lang="python"> def addition(a, b): """Ajoute deux nombres Entrées : — a : réel ; — b : réel. Sortie : a+b, réel""" return a+b arg = (1, 2) addition(*arg) # 3 </syntaxhighlight> On peut aussi empaqueter/dépaqueter un dictionnaire, on utilise pour cela deux astérisques « <code>**</code> ». Par convention, on utilise le nom <code>**kwargs</code> sans que cela soit obligatoire. L'instruction <code>lambda</code> permet de créer de petites fonctions ne contenant pas de boucle ni de branchement conditionnel. Cependant, si la déclaration est courte et compacte, le code n'est pas toujours facilement lisible ; l'utilisation de cette instruction n'est pas recommandée. Par exemple l'expression <syntaxhighlight lang="python"> f = lambda x: 2*x </syntaxhighlight> est la même chose que <syntaxhighlight lang="python"> def f(x): """Calcule le double. Entrée : x, réel. Sortie : 2*x, réel.""" return 2*x </syntaxhighlight> {{note|L'instruction <code>eval()</code> exécute une chaîne de caractères, c'est-à-dire traite une chaîne de caractères comme si c'étaient des instructions données à Python. Cette instruction est à éviter pour deux raisons : # Un utilisateur malveillant pourrait entrer du code malveillant dans la chaîne de caractères. # L'exécution est lente puisque Python doit compiler la chaîne à la volée. Cette instruction peut en général être remplacée par une autre instruction. }} == Gestion des erreurs == Dans un bloc d'instructions, on peut utiliser la structure <code>try:… except:</code>. Le bloc après <code>try</code> est exécuté ; si une erreur se déclare dans ce bloc, alors le bloc <code>except</code> s'exécute. Par exemple <syntaxhighlight lang="python"> try: 1/0 # Génère une erreur except: print("Division par zéro") # Cette instruction est donc exécutée </syntaxhighlight> On peut compléter avec <code>else:</code> et <code>finally:</code> : <syntaxhighlight lang="python"> try: <code à exécuter> except: <s’exécute en cas d’erreur> else: <s’exécute s’il n’y a pas d’erreur> finally: <s’exécute dans tous les cas> </syntaxhighlight> On peut séparer les différents types d'erreur : <syntaxhighlight lang="python"> try: <code à exécuter> except ValueError: print("Valeur erronée") except TypeError: print("Type erroné") </syntaxhighlight> Les types d'erreur les plus courants sont : * <code>NameError</code> : le nom de variable n'existe pas ; * <code>TypeError</code> : la valeur n'est pas du bon type ; * <code>ValueError</code> : la valeur n'est pas compatible avec ce qui est attendu ; * <code>RuntimeError</code> : type d'erreur général. On peut aussi créer ses propres erreurs : si une situation erronée survient, on peut « lever » une exception avec <code>raise</code>. Par exemple <syntaxhighlight lang="python"> if a < 0: raise ValueError("La valeur doit être positive") </syntaxhighlight> ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/errors.html | titre = Errors and exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} * {{lien web | url = https://docs.python.org/3/library/exceptions.html | titre = Built-in Exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} == Exercices == === Calcul du PGCD et du PPCM par l'algorithme d'Euclide === {{loupe|w:Algorithme d'Euclide}} Écrire un programme Python qui demande deux nombres entiers et affiche leurs PGCD et PPCM. Le programme utilisera l'algorithme d'Euclide. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """Programme : euclide.py Auteur : User:cdang date : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : calcule le PGCD et le PPCM de deux nombres entiers. Entrée ------ au clavier, saisie de deux nombres entiers. Sorties ------- à l'écran, affichage du PGCD et du PPCM. """ # *************** # *************** # ** Fonctions ** # *************** # *************** def euclide(): """Calcule le PGCD et le PPCM avec l'algorithme d'Elclide Entrée ------ Aucune, la saisie des paramètres fait partie de la fonction Sortie ------ affichage du PGCD et du PPCM """ print("***** Algorithme d'Euclide *****\n") a0 = int(input("Premier nombre entier : a = ")) b0 = int(input("Second nombre entier : b = ")) a = a0 b = b0 r = a%b # initialisation while (r != 0) : # algorithme d'Euclide a = b b = r r = a%b # affichage des résultats print("PGCD(", a0, ", ", b0, ") = ", b) print("PPCM(", a0, ", ", b0, ") = ", a0*b0//b) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* euclide() </syntaxhighlight> On peut simplifier la boucle centrale : <syntaxhighlight lang="python"> while b: # s'exécute tant que b n'est pas 0 a, b = b, a % b # affectation de liste à liste return a </syntaxhighlight> {{boîte déroulante fin}} Notez que le module NumPy propose l'instruction <code>gcd()</code> : <syntaxhighlight lang="python"> import numpy … print(numpy.gcd(a, b)) </syntaxhighlight> === Tours de Hanoï === {{loupe|w:Tours de Hanoï}} Écrire un programme Python qui demande le nombre ''n'' de plateaux et affiche les manipulations nécessaires pour déplacer la pile d'un emplacement à un autre. Le programme utilisera l'algorithme récursif. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """nom : hanoi.py auteur : User:cdang date de création : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : résout le problème des tours de Hanoï Entrées ------- trois chaînes de caractères (nom des piliers) Sorties ------- une chaîne de caractères (liste des opérations) """ # *************** # *************** # ** Fonctions ** # *************** # *************** def hanoi(a, b, c, n): """Résout le problème des tours de Hanoï de manière récursive But : déplace la pile de n disques du piler a au pilier b Entrées ------- a, b c : chaînes de 1 caractère, référence des emplacements ; n : entier, nombre de disques sur l'emplacement a Sorties ------- operations : chaînes de caractères décrivant les opérations """" if n>1: operations = hanoi(a, c, b, n-1) operations = operations+a+"→"+b+" ; " operations = operations+hanoi(c, b, a, n-1) else: operations = a+"→"+b+" ; " return operations # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* resultat = hanoi("1", "2", "3", 3) print(resultat) </syntaxhighlight> {{boîte déroulante fin}} === Lancer de rayons === [[Fichier:Lentille hemispherique perspective.svg|vignette|Lentille hémisphérique.]] Considérons une lentille hémisphérique de rayon R faite d’un verre d’indice de réfraction ''n''. Nous plaçons une source ponctuelle à une distance ''d'' du dioptre plan, sur l’axe optique. Tracer des rayons partant de la source et traversant la lentille. {{clear}} {{Boîte déroulante/début |titre=Analyse d’optique géométrique}} [[Fichier:Lentille hemispherique analyse geometrique.svg|vignette|Analyse géométrique du problème.]] Il s’agit d’un problème ayant une symétrie de révolution par rapport à l’axe optique. Nous pouvons nous réduire à un problème plan en nous plaçant dans un plan contenant l’axe optique ; l’axe optique est encore un axe de symétrie orthogonale, nous pouvons donc nous contenter d'étudier un demi-plan. Pour simplifier, nous plaçons le centre du dioptre sphérique à l’origine O du repère. L’axe optique est l’axe ''x'' et l'axe perpendiculaire, vertical sur la figure, c’est l’axe ''y''. Les coordonnées de la source sont donc (-''d'' ; 0). Le rayon issu de la source et faisant un angle θ avec l’axe ''x'' frappe le dioptre plan à l’altitude ''h''. Nous avons : : ''h'' = ''d'' ⋅ tan θ. L’angle d’incidence vaut θ. D’après la loi de Snell-Descartes, l'angle de réfraction θ<sub>2</sub> vaut : : θ<sub>2</sub> = arcsin((sin θ) / ''n''). Le rayon réfracté passe par le points de coordonnées (0, ''h''). L’équation de la droite est donc : : ''y'' = a ⋅ ''x'' + ''h'' avec : ''a'' = tan θ<sub>2</sub>. L’équation du cercle de centre O et de rayon R est : : ''x''<sup>2</sup> + ''y''<sup>2</sup> = R<sup>2</sup>. Les coordonnées (''x''<sub>M</sub>, ''y''<sub>M</sub>) de l’intersection M du rayon avec le dioptre sphérique vérifient les deux équations. Par substitution, nous obtenons une équation du second degré en ''x'' que nous savons résoudre : : ''x''<sub>M</sub><sup>2</sup> + (''a'' ⋅ ''x''<sub>M</sub> + ''h'')<sup>2</sup> = R<sup>2</sup> : ⇔ (1 + ''a''<sup>2</sup>) ⋅ ''x''<sub>M</sub><sup>2</sup> + 2 ⋅ ''a'' ⋅ ''h'' ⋅ ''x''<sub>M</sub> + ''h''<sup>2</sup> – R<sup>2</sup> = 0. D’après les propriétés du cercle, le rayon est perpendiculaire à la tangente. Le rayon [OM] est donc normal au dioptre en M. Nous pouvons déterminer l’angle d’incidence θ<sub>i</sub> par le produit scalaire : : <math>\begin{pmatrix} 1 \\ a \end{pmatrix} \cdot \begin{pmatrix} x_\mathrm{M} \\ y_\mathrm{M} \end{pmatrix} = \sqrt{1^2 + a^2} \cdot \mathrm{R} \cdot \cos(\theta_\mathrm{i})</math> ce qui nous permet de calculer cet angle : : <math>\theta_\mathrm{i} = \operatorname{arcos} \left ( \frac{x_\mathrm{M} + a \cdot y_\mathrm{M}}{\mathrm{R} \cdot \sqrt{1^2 + a^2} } \right )</math> Comme nous passons vers un milieu d’indice plus faible, il y a un risque de réflexion totale. L’angle limite est : : θ<sub>max</sub> = arcsin(1/''n''). Si l’on a θ<sub>i</sub> &gt; θ<sub>max</sub>, le rayon repart vers l’intérieur. Nous ne traçons pas le rayon car cela nous emmènerait trop loin dans l’analyse. En revanche, si θ<sub>i</sub> ≤ θ<sub>max</sub>, alors nous pouvons appliquer la loi de Snell-Descartes pour avoir l’angle de réfraction θ<sub>e</sub> : : θ<sub>e</sub> = arcsin(''n'' ⋅ sin θ<sub>i</sub>). Pour tracer le rayon sortant, il nous faut l’angle θ<sub>3</sub> par rapport à l’horizontale. L’angle du rayon [OM] par rapport à l’horizontal vaut arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>), nous avons donc : θ<sub>3</sub> = arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>) + θ<sub>e</sub>. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Analyse algorithmique}} '''Structure des données''' Le problème est décrit par trois paramètres : # Le rayon <code>R1</code> de la lentille, en milliètres (réel en virgule flottante). # L’indice du verre, <code>n</code> sans dimension (réel en virgule flottante). L’indice de l’air vaut 1. # La distance de la source au dioptre d’entrée plan, <code>d</code> en millimètres (réel en virgule flottante). Un rayon est caractérisé par quatre paramètres : # L’angle d’émission <code>theta1</code> en radians (réel en virgule flottante). # L’angle de réfraction dans la lentille <code>theta2</code> en radians (réel en virgule flottante). # Les cordonnées <code>M</code> en millimètre (vecteur de dimension 2 <code>([x, y])</code> de réels en virgule flottante) du point d’intersection du rayon avec le dioptre sphérique. # L’angle de réfraction dans l’air après la lentille <code>theta3</code> en radians (réel en virgule flottante). Pour le calcul et le tracé, nous avons besoin des paramètres intermédiaires suivants : * l’altitude ''y'' = <code>h</code> en millimètres (réel en virgule flottante) à laquelle le rayon frappe le dioptre plan d’entrée ; * l’angle d’incidence du rayon avec le dioptre sphérique <code>thetaint</code> en radians (réel en virgule flottante). Les angles sont stockés en radians car c’est l’unité naturelle pour le calcul mais nous affichons les valeurs en degrés. Comme le calcul de conversion est récurrent, nous conservons les facteurs <code>degversrad</code> (conversion des degrés vers les radians, facteur valant π/180, réel en virgule flottante) et <code>radversdeg</code> (conversion des radians vers les degrés, facteur valant 180/π, réel en virgule flottante). '''Fonctions''' Nous avons besoin d’une fonction qui calcule les trois paramètres du rayon <code>(theta2, M, theta3)</code> à partir de l’angle d’émission <code>theta1</code>. Nous appelons cette fonction <code>lanceRayon()</code>. Cette fonction fait appelle à une fonction qui calcule l’angle du rayon réfracté à partir de l’angle du rayon incident <code>theta1</code>, les deux angles étant par rapport à la normale au dioptre au point considéré. Nous appelons cette fonction <code>refrac()</code>. La recherche de l’intersection <code>M</code> du rayon avec le dioptre sphérique nécessite de résoudre une équation du second degré. Nous utilisons pour cela la recherche des racines du polynôme en <code>x</code> avec la fonction <code lang="python">numpy.polynomial.polynomial.polyroots()</code>. D’après la configuration du problème géométrique, si l’on s’assure que le rayon frappe bien la lentille (0 ≤ <code>h</code> ≤ <code>R1</code>) alors nous sommes sûrs que le problème a deux solutions réelles (une positive et une négative) ou, dans le cas dégénéré où <code>h == R1</code>, une valeur unique <code>x == 0</code>. Comme nous recherchons la valeur positive, nous sélectionons la plus grande des deux racines. Pour la gestion de la réflexion interne : dans la fonction <code>refrac()</code>, nous vérifions les conditions de réflexion totale et si elles sont remplies, alors nous générons une erreur (commandes <code lang="python">try… except</code> et <code lang="python">raise ValueError</code>). Cette erreur est propagée à la fonction <code>lanceRayon()</code> : <code>lanceRayon()</code> appelle la fonction <code>refrac()</code> et si cette fonction renvoie une erreur, alors <code>lanceRayon()</code> renvoie également une erreur. Pour trouver l’angle d’émission <code>thetaLimite</code> provoquant la réflexion totale (en radians, réel en virgule flottante), nous effectuons une recherche par dichotomie : * nous partons de l’angle maximum possible, lorsque le rayon frappe le sommet de la lentille, et nous appelons la fonction <code>lanceRayon()</code> ; si cela ne génère pas d’erreur, alors nous pouvons aller jusqu’à cette valeur, la recherche est terminée ; si cela génère une erreur, alors nous divisons la valeur par deux ; * à une étape de la recherche donnée, si <code>lanceRayon()</code> ne génère pas d’erreur avec l’angle testé, alors nous savons que l’angle limite est supérieur à cette valeur ; cette valeur minore donc la valeur recherchée ; si au contraire <code>lanceRayon()</code> génère une erreur, alors c’est que l’angle est trop important, cette valeur majore donc la valeur recherchée ; nous pouvons ainsi resserer l’intervalle de recherche ; * nous nous arrêtons lorsque les valeurs haute et basse sont suffisamment proche. Concrètement : # Nous définissons une variable <code>angleHaut</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus bas connu provoquant la réflexion totale. # Nous définissons une variable <code>angleBas</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus haut connu ne provoquant pas de réflexion totale. Sa valeur initiale est 0. L’angle limite recherché est donc entre <code>angleBas</code> et <code>angleHaut</code>. # Nous définissons l’angle <code>angleTest</code> comme étant la moyenne entre <code>angleBas</code> et <code>angleHaut</code>. Si <code>lanceRayon(angleTest)</code> génère une erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleHaut</code> (puisque c’est une valeur provoquant la réflexion totale et qu’elle est plus basse que la valeur actuelle d’<code>angleHaut</code>). À l’inverse, si <code>lanceRayon(angleTest)</code> ne génère pas d’erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleBas</code> (puisque c’est une valeur ne provoquant pas la réflexion totale et qu’elle est plus haute que la valeur actuelle d’<code>angleBas</code>). # Nous arrêtons la procédure lorsque l’écart entre <code>angleBas</code> et <code>angleHaut</code> est inférieur à {{unité|10|échelle=<sup>–3</sup>|rad}} (valeur arbitraire). La valeur retenue est la valeur finale d’<code>angleBas</code> (puisque l’on veut être sûr qu’il n’y ait pas de réflexion totale). La valeur affichée est la valeur en degrés arrondie au dixième. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Solution}} Nous demandons à l’utilisateur ou à l’utilisatrice les valeurs des paramètres du problème : rayon de la lentille, distance de la source, indice de réfraction du verre. Nous vérifions que les valeurs entrées sont bien des nombres ; si c’est une chaîne vide, alors nous utilisons une valeur par défaut. Nous créons une fonction <code>refrac()</code> qui permet de calculer l’angle réfracté à partir de l’angle d’incidence et des indices de réfraction. S’il y a rélexion totale, alors nous générons une erreur. La fonction <code>lanceRayon()</code> calcule les différents points de passage du rayon. Elle appelle pour cela la fonction <code>refrac()</code>. Si un appel de la commande <code>refrac()</code> génère une erreur, alors nous générons également une erreur. Nous déterminons l’angle d’émision du rayon <code>thetaLimite</code> qui provoque une réflecxion totale. Pour cela, nous créons une fonction <code>rechercheLimite()</code> qui cherche par dichotomie. Nous traçons un rayon tous les 5° jusqu’à la valeur limite. <syntaxhighlight lang="python"> #!/usr/bin/env python3 # coding: utf-8 """nom : lancerRayons.py auteur : User:cdang date de création : 2022-05-06 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : NumPy, matplotlib ---------------------------------------------------------------------------- Objectif : trace des trajets optique avec une lentille hémisphérique Entrées ------- Le rayon de la lentille, la distance de la source, l’indice de réfraction du verre, trois chaînes de caractères saisies par l’utilisateur·rice et qui sont converties en réels. Sorties ------- La valeur limite de l’angle (réel) et le tracé de plusieurs rayons. """ # ****************************************************** # ****************************************************** # ** Lancer de rayons pour une lentille hémisphérique ** # ****************************************************** # ****************************************************** import numpy as np import matplotlib.pyplot as plt import numpy.polynomial.polynomial as nppol # ************** # * Constantes * # ************** # Pour la conversion degrés ↔ radians radversdeg = 180/np.pi degversrad = 1/radversdeg # ************* # * Fonctions * # ************* def boucleEntreeNombre(messageSaisie, valeurDefaut): """Permet de s’assurer que l’utilisateur·rice a bien entré un nombre. Entrée : — message à afficher (chaîne de caractères) ; — valeur par défaut (réel à virgule flottante). Sortie : nombre (réel à virgule flottante).""" messageErreur = "Veuillez entrer une valeur numérique (ou vide pour accepter la valeur par défaut).\n" execute = True while execute: strNombre = input(messageSaisie+f" (valeur par défaut {valeurDefaut}) : ") if strNombre == "": nombre = valeurDefaut execute = False else: try: nombre = float(strNombre) except: print(messageErreur) else: execute = False return nombre def initialisation(): """L’utilisateur·rice entre les variables du problème. Entrées : aucune. Sorties : — R1 (mm) : rayon de la lentille ; — d (mm) : distance de la source au dioptre plan ; — n (sans dimension) : indice de réfraction du verre.""" R1 = boucleEntreeNombre("Rayon de la lentille en mm", 20.0) d = boucleEntreeNombre("Distance de la source au dioptre plan en mm", 20.0) n = boucleEntreeNombre("Indice de réfraction (sans dimension)", 1.5) return (R1, d, n) def refrac(n1, n2, theta1): """Calcule l’angle de réfraction theta2 (radians) en fonction — de l’angle d’incidence theta1 (radians); — de l’indice de réfraction n1 du premier milieu ; — de l’indice de réfraction n2 du second milieu.""" reflexionTotale=False rapport=n2/n1 rapportinv=np.reciprocal(rapport) if n1 > n2: thetal = np.arcsin(rapport) # angle limite pour la réflexion totale if theta1 >= thetal: reflexionTotale=True if reflexionTotale: print("Réflexion totale") raise ValueError else: return np.arcsin(rapportinv*np.sin(theta1)) def lanceRayon(n1, n2, d, R, theta1): """Détermine le rayon issu de la source située à une distance d (mm) du bareau et avec une élévation de theta1 (radians), en fonction des indices de réfraction n1 et n2. Les éléments retournés sont : — la hauteur h (mm) à laquelle le rayon frappe le barreau ; — l’angle de réfraction theta2 (radians)) dans le barreau ; — l’angle de réfraction theta3 (radians) à la sortie du barreau — le point M(x, y) (mm) auquel le rayon sort du barreau.""" h = d*np.tan(theta1) if h >= R: print("Le rayon est au-dessus du barreau") raise ValueError else: theta2 = refrac(n1, n2, theta1) a = np.tan(theta2) x = max(nppol.polyroots([h*h - R*R, 2*a*h, 1+a*a])) # recherche de l’intersection du rayon avec le cercle y = a*x + h M = np.array([x, y]) thetaint = np.arccos((x + a*y)/(R*np.sqrt(1 + a*a))) theta3 = np.arctan(y/x) - refrac(n2, n1, thetaint) return (h, theta2, theta3, M) def rechercheLimite(n1, n2, d, R): """Recherche l’angle limite pour la réflexion totale. Entrée : — indice de réfraction des milieux 1 et 2, n1 et n2 ; — distance au barreau, d(mm). Sortie : angle limite theta (radians)""" angleHaut = np.arctan(R/d) angleBas = 0 angleTest = angleHaut try: lanceRayon(n1, n2, d, angleTest, R) except: condition = True # il y a réflexion total en haut de la lentille else: condition = False # il n’y a jamais réflexion totale dans la lentille while condition: #dichotomie angleTest = np.mean([angleHaut, angleBas]) # on ajuste la valeur de test try: lanceRayon(n1, n2, d, R, angleTest) except: angleHaut = angleTest # réflexion totale : on abaisse la valeur maximale else: angleBas = angleTest # pas de réflexion totale : on monte la valeur minimale condition = ((angleHaut - angleBas) >= 0.001) # on a cerné la limite à 0,001 rad près if not condition: angleTest = angleBas return angleTest # *********************** # * Programme principal * # *********************** (R1, d, n) = initialisation() xmax = round(R1 + d) thetaLimite = rechercheLimite(1, n, d, R1) thetaLimiteDeg = thetaLimite*radversdeg print(f"Angle limite pour la réflexion totale : {thetaLimiteDeg:.1f}°.\n") anglesDeg = np.arange(0, thetaLimiteDeg, 5)[1:] # trace un rayon tous les 5° anglesRad = anglesDeg*degversrad nb = len(anglesDeg) h = np.zeros(nb) # initialisation des vecteurs de valeurs theta2 = np.zeros(nb) theta3 = np.zeros(nb) M = np.zeros((nb, 2)) for i in range(nb): (h[i], theta2[i], theta3[i], M[i, :]) = lanceRayon(1, n, d, R1, anglesRad[i]) (h_lim, theta2_lim, theta3_lim, M_lim) = lanceRayon(1, n, d, R1, thetaLimite) # tracé anglesCercle = 0.5*np.pi*(np.linspace(1, 0, 20)) x_cercle = R1*np.cos(anglesCercle) # coordonnées des pints du cercle y_cercle = R1*np.sin(anglesCercle) fig = plt.plot([-d,xmax], [0, 0], "k-.", linewidth="0.5") # tracé de l’axe optique for i in range(nb): plt.plot([-d, 0, M[i, 0], xmax], [0, h[i], M[i, 1], M[i, 1] + (xmax - M[i, 0])*np.tan(theta3[i])], label=f"{anglesDeg[i]:.0f}°") plt.plot([-d, 0, M_lim[0], xmax], [0, h_lim, M_lim[1], M_lim[1] + (xmax - M_lim[0])*np.tan(theta3_lim)], label=f"{0.1*int(np.trunc(10*thetaLimite*radversdeg)):.1f}°") plt.plot(x_cercle, y_cercle, "k", linewidth="0.5") # tracé du cercle plt.plot([0,0], [0, R1], "k", linewidth="0.5") # tracé du premier dioptre #plt.axis("square") plt.gca().set_aspect("equal", adjustable="box") plt.xlabel("x (mm)") plt.ylabel("y (mm)") plt.title("Lentille hémisphérique, lancer de rayons") plt.legend() plt.savefig("lentille_hemispherique_lancer_rayon.svg", format="svg") plt.show() </syntaxhighlight> {{Boîte déroulante/fin}} == Mesurer le temps == Le module <code>time</code> fournit les fonctions suivantes : * <code>time.gmtime()</code> : renvoie la date et l'heure du méridien de Greenwich (''{{lang|en|Greenwich mean time}}'', GMT), sous la forme d'un dictionnaire (année, mois, jour du mois, heure, minute, seconde, jour de la semaine, jour de l'année, heure d'été/hiver), ** jour de la semaine est un entier entre 0 (lundi) et 6 (dimanche), ** jour du mois est un entier entre 1 et 366 ; * <code>time.localtime()</code> : comme le précédent, mais l'heure est l'heure locale ; * <code>time.time()</code> : donne le nombre de seconde qui se sont écoulées depuis le 1er janvier 1970 ; * <code>time.gmtime(n)</code> et <code>time.localtime(n)</code> transforment un nombre de secondes (écoulées depuis le 1er janvier 1970) en une date au format (année, mois, jour, etc.), n-uplet de neuf valeurs ; <code>time.mktime()</code> fait le contraire, il transforme un n-uplet de neuf valeurs (années, mois, jour, etc.) en un nombre de secondes (écoulées depuis le 1er janvier 1970) ; * <code>time.sleep(n)</code> : provoque une pause dans le déroulement du programme de ''n'' secondes ; * <code>time.perf_counter()</code> : indique une date en seconde ; s'utilise pour mesurer la durée d'exécution d'une partie du code, en faisant la différence entre deux relevés. Concernant la date et l'heure sous la forme d'un n-uplet, on peut extraire l'heure de la manière suivante : <syntaxhighlight lang="python"> import time a = time.localtime() print("Il est ", a[3], "h", a[4]) # ou bien print("Il est ", a.tm_hour, "h", a.tm_min) </syntaxhighlight> Pour mesurer la performance d'une portion de code : <syntaxhighlight lang="python"> import time t1 = time.perf_counter() <suite d’instructions> t2 = time.perf_counter() print("Durée d'exécution :", t2-t1 </syntaxhighlight> == Programmation orientée objet == Nous n'allons pas ici faire un cours de programmation orientée objet (POO), nous allons aborder le sujet de manière pragmatique. De manière schématique, un « objet » est une « super-variable ». Cette super-variable peut contenir plusieurs variables, appelées « attributs » ; elle contient en fait un dictionnaire (paires « nom d'attribut : valeur d'attribut »). Elle peut aussi contenir des fonctions spécifiques appelées « méthodes ». De même qu'une variable a un type, un objet fait partie d'une « classe ». La classe est le modèle de l'objet ; en franglais informatique, on dit que l'objet est une instance de la classe. La POO est donc un formalisme : lorsque l'on définit des variables et des fonctions concernant un même type d'objet (au sens commun du terme), on les empaquette dans une classe. Il faut donc d'abord définir la classe, puis attribuer cette classe à un objet (« instancier » la classe). Considérons par exemple que nous voulons travailler sur des [[w:Engrenage|engrenages]] ; pour simplifier, nous nous contentons d'engrenages à dentures droites. Une roue dentée, un pignon, est essentiellement définie par son nombre de dents Z et par son module ''m'' qui correspond à la largeur de dents<ref>ainsi que par son épaisseur ''e'' et le matériau dont elle est faite mais nous allons négliger ces paramètres pour la simplicité de l'étude.</ref>. Nous allons définir trois méthodes : la méthode <code>.diametrePrimitif()</code> qui calcule le diamètre primitif de la roue dentée, <code>.pas()</code> qui calcule la largeur des dents au niveau du cercle primitif et <code>.rapport()</code> qui calcule le rapport de transmission de deux roues engrenées Z<sub>1</sub>/Z<sub>2</sub>. La méthode <code>.rapport()</code> vérifie par ailleurs que les roues ont le même module, condition indispensable pour former un engrenage. Nous définissons la classe ainsi : <syntaxhighlight lang="python"> class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): # instructions lancées lors de la déclaration """Valeurs des attributs""" self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z </syntaxhighlight> Nous remarquons que lorsque nous déclarons les méthodes, le paramètre <code>self</code> correspond à l'objet lui-même. Ainsi, dans la méthode <code>.rapport()</code>, la variable <code>self.Z</code> est le nombre de dents de la roue elle-même et <code>roueDentee.Z</code> est le nombre de dents de la roue passée en paramètre. Pour déclarer les roues, nous écrivons : <syntaxhighlight lang="python"> roue1 = pignon() # attribution de la classe, « instanciation » roue1.Z = 13 # définition des caractéristiques du pignon « roue1 » roue1.m = 2 roue2 = pignon(16, 2) # manière alternative </syntaxhighlight> Nous pouvons alors utiliser les objets de la manière suivante : <syntaxhighlight lang="python"> print(roue1.Z) # 13 print(roue1.diametrePrimitif()) # 26 R = roue1.rapport(roue2) # 0.8125 </syntaxhighlight> La commande <code>dir(a)</code> affiche tous les attributs et méthodes de l'objet <code>a</code>. ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/classes.html | titre = Classes | site = Python documentation | consulté le = 2019-03-08 }} == Interface graphique avec Tk == Une interface graphique utilisateur (GUI, ''{{lang|en|graphic user interface}}'') est un ensemble de boîtes permettant d'interagir avec l'utilisateur c'est-à-dire permettre la saisie d'informations, l'exécution d'actions et afficher des informations. Elle se compose d'éléments appelés ''{{lang|en|widgets}}''. Les éléments ''({{lang|en|widgets}})'' classiques sont : * boîte de dialogue ''({{lang|en|dialog box}})'' : fenêtre contenant d'autres éléments ; * étiquette ''({{lang|en|label}})'' : texte affiché ; * liste déroulante ''({{lang|en|drop-down list}})'' : zone permettant le choix d'une option, la liste se déployant lorsque l'on clique sur la zone ; * zone de texte, champ de saisie ''({{lang|en|text box}})'' : zone permettant de taper du texte ; * boîte combinée ''({{lang|en|combo box}})'' : zone de saisie de texte contenant une liste déroulante qui permet de choisir des éléments prédéfinis ; * bouton ''({{lang|en|button}})'' : objet effectuant une action lorsque l'on clique dessus ; * case à cocher ''({{lang|en|checkbox, tickbox}})'' : objet permettant d'activer ou de désactiver une option lorsque l'on clique dessus ; * bouton radio, case d'option ''({{lang|en|radio button}})'' : objet permettant d'activer une option en désactivant les autres options ; une seule option peut être activée à la fois. Plusieurs modules permettent de gérer les interfaces graphiques. Nous choisissons ici le module développé sur la bibliothèque Tk qui est une bibliothèque multiplateforme. Pour cela, nous importons le module <code>tkinter</code> ainsi que le module <code>ttk</code>, ce dernier proposant des options plus « modernes » : <syntaxhighlight lang="python"> import tkinter as tk from tkinter import ttk </syntaxhighlight> Voici un programme permettant comme précédemment de calculer le rapport de transmission d'un engrenage. Nous détaillons sa construction ci-après. <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: IUrapport.set(valeurZ2/valeurZ1) except: IUrapport.set("erreur") # ************************* # ************************* # ** Interface graphique ** # ************************* # ************************* # fenetre principale fenetre = tk.Tk() fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> '''Explications''' Nous commençons par définir la boîte de dialogue que nous appelons <code>fenetre</code> ; c'est un objet <code>Tk</code> et nous lui donnons un titre « » : <syntaxhighlight lang="python"> fenetre = tk.Tk() fenetre.title("Rapport de réduction") </syntaxhighlight> Puis, nous définissons un cadre attaché à cette fenêtre et qui va nous permettre « d'accrocher » les autres éléments, ce qui permet de garder une apparence satisfaisante lorsque l'on retaille la fenêtre : <syntaxhighlight lang="python"> cadre = ttk.Frame(fenetre) </syntaxhighlight> Le cadre va comporter six lignes ''({{lang|en|row}})'' et deux colonnes ''({{lang|en|column}})''. Nous allons placer une étiquette ''({{lang|en|label}})'' « z1 » : <code>text="z1"</code>. Cette étiquette se trouve dans une case du cadre, celle de la première colonne et la première ligne : <code>grid(column=1, row=1)</code>. Par rapport à cette case, elle est collée à « l'ouest » (W, ''{{lang|en|west}}'', gauche) de la case : <code>sticky=tk.W</code>. <syntaxhighlight lang="python"> z1_label = ttk.Label(cadre, text="z1") # Création de l'étiquette z1_label.grid(column=1, row=1, sticky=tk.W) # Placement de l'étiquette </syntaxhighlight> Notez que l'on aurait pu écrire directement : <syntaxhighlight lang="python"> ttk.Label(cadre, text="z1").grid(column=1, row=1, sticky=tk.W) </syntaxhighlight> mais le fait de séparer la création de l'élément et son placement facilite la maintenance (recherche d'erreur, évolution du code). Pour tout ce qui est dynamique, c'est-à-dire les zone de saisie des valeurs et l'affichage du résultat, il faut définir des « chaînes variables » ''({{lang|variable strings}})'' : <syntaxhighlight lang="python"> IUz1 = tk.StringVar() </syntaxhighlight> Cette variable est une variable globale à la création. Nous pouvons alors placer la zone de saisie ''({{lang|en|entry}})'' à côté de l'étiquette lui correspondant. Nous nommons la zone de saisie <code>z1_entry</code> : <syntaxhighlight lang="python"> z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) </syntaxhighlight> Nous faisons de même pour les trois autres paramètres de l'engrenage, ''m''<sub>1</sub>, ''z''<sub>2</sub> et ''m''<sub>2</sub>. Le résultat est également une chaîne variable globale. Par rapport à notre mise en page, elle se situe dans la case colonne 2 ligne 5, centrée sur cette case (collé à l'est et à l'ouest) : <syntaxhighlight lang="python"> rapport = tk.StringVar() rapport_dynamique = ttk.Label(cadre, textvariable=rapport) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) </syntaxhighlight> Il nous faut encore définir une fonction de manière classique, nous l'appelons « calcule ». Les variables étant globales, on les utilise directement. On récupère les valeurs avec la méthode <code>get()</code> et nous modifions la valeur avec la méthode <code>set()</code> : <syntaxhighlight lang="python"> def calcule(): valeurZ1 = float(IUz1.get()) valeurZ2 = float(IUz2.get()) IUrapport.set(valeurZ2/valeurZ1) </syntaxhighlight> Cette fonction est déclenchée lorsque l'on clique sur le bouton « Calcul » situé dans la case du cadre ligne 6 colonne 2 : <syntaxhighlight lang="python"> bouton = ttk.Button(cadre, text="Calcul", command=calcule) bouton.grid(column=2, row=6, sticky=tk.W) </syntaxhighlight> ou bien si l'on appuie sur la touche <code>[entrée]</code> du clavier : <syntaxhighlight lang="python"> fenetre.bind("<Return>", calcule) </syntaxhighlight> À tout ceci, nous ajoutons des « gouttières » (marges, ''{{lang|en|paddings}}'') afin d'espacer les éléments. Il faut ensuite « activer » la fenêtre pour qu'elle s'affiche. La méthode est <code>mainloop()</code> (boucle principale) : « boucle » (elle est active en permanence et attend des actions sur ses éléments), <syntaxhighlight lang="python"> fenetre.mainloop() </syntaxhighlight> Nous avons ci-dessus mis la plupart du code en programme principal. Nous pouvons aussi programmer de manière fonctionnelle, en mettant la plupart du code dans des fonctions ; cependant, pour que la fenêtre et les variables dynamiques soient globales à tout le programme, elles doivent être déclarées dans le programme principal. Nous pouvons aussi mêler la programmation orientée objet. {{boîte déroulante début|Calcul du rapport de transmission en programmation fonctionnelle et orientée objet}} <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # ************* # ************* # ** Classes ** # ************* # ************* class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): """Valeurs des attributs""" # instructions lancées lors de la déclaration self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z # ************************ # ************************ # ** Variables globales ** # ************************ # ************************ # fenetre principale fenetre = tk.Tk() # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: roue1 = pignon(valeurZ1, valeurM1) roue2 = pignon(valeurZ2, valeurM2) IUrapport.set(roue1.rapport(roue2)) except: IUrapport.set("Erreur") # *********************** # * Interface graphique * # *********************** def configureFenetre(): """Configuration de la fenêtre principale""" fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* configureFenetre() # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> {{boîte déroulante fin}} == Annotations == Une annotation est un commentaire qui sert à expliciter un type de variable. La syntaxe est différente des commentaires « classiques » : cela permet d'avoir un affichage différent avec les éditeurs de texte ayant une coloration syntaxique, et ces informations peuvent être récupérées par des logiciels extérieurs pour effectuer une documentation automatique ou bien des vérifications de type. Cependant : * comme les commentaires normaux, ils n'ont aucune influence lors de l'exécution du texte ; en particulier : * rien n'oblige à annoter les variables ; * il est possible d'avoir une variable ayant un type différent de son annotation ; le fait de pouvoir définir et changer le type de variable à la volée est une fonctionnalité fondamentale de Python. La syntaxe pour une annotation est : : nom_de_variable + deux-points + espace + type par exemple : <syntaxhighlight lang="python"> a: int </syntaxhighlight> Notez qu'ici, la variable n'est ''pas'' créée. Pour la créer, il faut lui affecter une valeur. Il est possible de l'affecter après ou bien sur la même ligne avec la syntaxe : : nom_de_variable + deux-points + espace + type + espace + égal + espace + valeur par exemple : <syntaxhighlight lang="python"> a: int a = 5 # est équivalent à a: int = 5 </syntaxhighlight> Même si l'annotation n'a pas d'impact sur l'exécution, le type doit être un type existant sinon cela génère une erreur de syntaxe. Les types classiques sont : : <code>int</code> — <code>float</code> — <code>str</code> — <code>bool</code> — <code>list</code> — <code>tuple</code> — <code>dict</code> Il est également possible de mettre une chaîne de caractères : <syntaxhighlight lang="python"> a: "ce que je veux" = 3.1516 </syntaxhighlight> On peut annoter une fonction. Il est possible d'annoter les variables déclarées au sein de la fonction, mais pas les variables globales (puisqu'elle ne sont pas définie au sein de la fonction). On peut aussi annoter : * les variables passées en paramètre, avec la même syntaxe dans les parenthèses ; * annoter le type de la variable de sortie (retournée) en la faisant précéder de <code>-&gt;</code> : <syntaxhighlight lang="python"> def plusCinq(a: float = 0) -> float: return a + 5 </syntaxhighlight> ; Ressources * {{lien web | url = https://www.python.org/dev/peps/pep-0526/ | titre = PEP 526 -- Syntax for Variable Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} * {{lien web | url = https://www.python.org/dev/peps/pep-3107/ | titre = PEP 3107 -- Function Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} == Décorateur == Un décorateur est une fonction qui s'applique à une fonction, à la manière de la composition mathématique ''g'' ∘ ƒ = ''g''(ƒ). Mais cette composition affecte la fonction elle-même ; l'utilisateur appelle la fonction ƒ mais c'est la fonction ''g'' ∘ ƒ qui s'exécute. Cette fonction ''g'' est appelée le décorateur. L'intérêt est de pouvoir modifier une fonction sans modifier le code de la fonction elle-même. Pour appliquer une décoration, il faut : # Déclarer le décorateur : une fonction qui s'applique à une autre fonction. # Affecter le décorateur à la fonction visée : en mettant <code>@''décoration''</code> juste avant la définition de la fonction. Par exemple : <syntaxhighlight lang="python"> def decorateur(f): print("Avant la fonction") f() print("après la fonction") @decorateur def afficheFoo(): print("Foo.") afficheFoo # Avant la fonction # Foo. # Après la fonction </syntaxhighlight> Lorsque l'on appelle <code>afficheFoo</code>, on appelle en fait <code>decorateur(afficheFoo)</code>. Si la fonction à modifier admet des paramètres, il faut définir une fonction enveloppante dans le décorateur. Par exemple, nous définissons ci-dessous un décorateur <code>deuxFois()</code> qui fait s'exécuter deux fois de suite la fonction : <syntaxhighlight lang="python"> def deuxFois(f): def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # conteneurFonction </syntaxhighlight> Nous voyons que l'application du décorateur a modifié le nom de la fonction — pas le nom de la variable qui contient la fonction mais bien son nom « intime ». Pour éviter cela, on utilise la méthode <code>wraps()</code> du module <code>functools</code> : <syntaxhighlight lang="python"> import functools def deuxFois(f): @functools.wraps(f) def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # plusCinq </syntaxhighlight> On peut par exemple utiliser un décorateur pour la mémoïsation. La mémoïsation est une méthode consistant à mémoriser les valeurs d'une fonction au fur et à mesure de son utilisation ; ainsi, si l'on veut évaluer la fonction avec les mêmes entrées, on se contente d'aller chercher la valeur enregistrée ce qui est plus rapide. On sacrifie donc la place mémoire au profit de la rapidité. On peut trouver des décorateurs de mémoïsation aux adresses suivantes : * https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize * https://gist.github.com/robcowie/1357800 ; Ressources : {{lien web | url = https://www.python.org/dev/peps/pep-0318/ | titre = PEP 318 -- Decorators for Functions and Methods | site = Python.org | lang = en | consulté le = 2019-04-05 }} == Manipulation de fichiers == === Importer le contenu d'un fichier === Python possède la fonction <code lang="python">open()</code> qui permet d'ouvrir un fichier. Ouvrir signifie qu'il crée un objet de type <code>file</code> qui possède notamment les méthodes <code lang="python">read()</code> et <code lang="python">write()</code>. Il peut s'agir d'un objet de type « fichier binaire » ''({{lang|en|binary file}})'' ou « fichier texte » ''({{lang|en|text file}})''. Si par exemple on veut utiliser (et donc lire) le contenu du fichier texte <code>monfichier.txt</code>, on écrit : <syntaxhighlight lang="python"> fichier = open("monfichier.txt", "rt") … fichier.close() </syntaxhighlight> Le paramètre <code>"rt"</code> signifie que nous ouvrons le fichier en lecture ''({{lang|en|read}})'' et qu'il s'agit d'un objet de type fichier texte. Notons deux choses : * en faisant cela, nous ne faisons qu'associer le fichier à un objet Python, nous n'avons pas encore importé les données ; * si nous ouvrons le fichier, il faut le fermer par la suite ; c'est pourquoi nous utilisons la méthode <code lang="python">.close()</code>. Pour éviter d'avoir à fermer le fichier, nous pouvons l'ouvrir au sein d'un contexte : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: … </syntaxhighlight> Notons aussi que la chaîne de caractères indiquant le nom du fichier peut contenir le chemin d'accès au répertoire (dossier), mais sous Microsoft Windows, il faut utiliser des barres de fractions <code>/</code> pour séparer les sous-répertoires au lieu de la barre inversée habituelle, par exemple : <syntaxhighlight lang="python"> chemin = "C:/Temp/monfichier.txt" with open(chemin, "rt") as fichier: … </syntaxhighlight> Pour mettre les données du fichier dans la variable <code>contenu</code>, nous écrivons donc : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() print(contenu) </syntaxhighlight> et si nous ne voulons lire que les <code>n</code> premiers caractères (<code>n</code> étant un entier), nous utilisons <code lang="python">contenu = fichier.read(n)</code>. Cette lecture est séquentielle, c'est-à-dire que si nous appliquons la méthode plusieurs fois, nous reprenons la lecture là où nous l'avons laissée. Si nous voulons lire une ligne, nous utilisons la méthode <code lang="python">.readline()</code>. La lecture ligne par ligne est également séquentielle. Nous pouvons aussi créer une liste dont chaque élément est une ligne du fichier ; nous utilisons alors la méthode <code lang="python">.readlines()</code> (notez le pluriel). Chaque élément de la liste se termine par le caractère de fin de ligne <code lang="python">\n</code>. Pour l'enlever, nous pouvons utiliser la méthode <code lang="python">.rstrip()</code> pour chaque élément de la liste, par exemple. L'exemple complet est alors : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.readlines() contenu = [item.rstrip() for item in contenu] print(contenu) </syntaxhighlight> === Exporter du contenu vers un fichier === Si nous voulons créer un fichier texte pour y mettre le contenu de la variable <code>texte</code>, alors nous utilisons : <syntaxhighlight lang="python"> with open("monfichier.txt", "wt") as fichier: contenu = fichier.write(texte) </syntaxhighlight> Le module principal important pour la manipulation de fichiers est est <code lang="python">os</code>. === Exploiter le contenu d'un fichier texte === Avec un fichier texte, la méthode <code lang="python">.read()</code> crée une variable de type texte. Nous pouvons séparer cette variable en différentes lignes avec la méthode <code lang="python">.splitlines()</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une ligne. Si maintenant une ligne contient plusieurs données séparées par un séparateur commun, par exemple un espace, nous pouvons séparer les données par la méthode <code lang="python">.split(''séparateur'')</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une donnée. Si par exemple le fichier est du type CSV ''({{lang|en|comma separated values}}'', valeurs séparées par une virgule), l'exploitation du fichier est : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(",") for item in contenu] </syntaxhighlight> La variable <code>contenu</code> est une liste de listes. Pour avoir la ''n''<sup>e</sup> valeurs de la ''m''<sup>e</sup> ligne, on utilise : <syntaxhighlight lang="python"> contenu[m-1][n-1] </syntaxhighlight> Si l'on veut extraire la ligne ''m'' il suffit d'écrire : <syntaxhighlight lang="python"> contenu[m-1] </syntaxhighlight> mais si l'on veut la colonne ''n'', le plus simple est d'utiliser une définitipon en compréhension : <syntaxhighlight lang="python"> [ligne[n-1] for ligne in contenu] </syntaxhighlight> Dans certains fichiers CSV, les séparateurs de valeurs ne sont pas des virgules, on peut donc utiliser un autre caractère pour le séparateur. Si le séparateur est une tabulation, on utilise <code lang="python">\t</code> : <code lang="python">contenu = [item.split("\t") for item in contenu]</code> Si la première ligne contient les en-têtes des colonnes, on peut l'enlever avec la fonction <code lang="python">del()</code> : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() del(contenu[0]) contenu = [item.split(",") for item in contenu] </syntaxhighlight> Certains logiciels créent des fichiers en utilisant le séparateur décimal régional, qui en France est la virgule. Pour remplacer les virgules par des points, on peut utiliser la méthode <code lang="python">.replace()</code>, de préférence ''avant'' de séparer les valeurs : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.replace(",", ".") for item in contenu] # remplace les virgules par des points contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule </syntaxhighlight> en effet, lorsque l'on a séparé les valeurs, on a une liste de liste, il faut alors balayer les sous-listes ce qui prend plus de temps : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule contenu = [[subitem.replace(",", ".") for subitem in item] for item in contenu] # remplace les virgules par des points </syntaxhighlight> '''Exemple complet''' Supposons que l'on ait un fichier texte de la forme : <syntaxhighlight lang="text"> x y z V 0.0 1.5 3.2 8.657 0.4 1.5 3.2 8.392 0.2 1.5 3.2 8.485 ... </syntaxhighlight> C'est un fichier valeurs V associées à des points de coordonnées ''(x, y, z)'' (un champ V sur l'espace, donc). Nous remarquons que seule la coordonnée ''x'' change : les données concernent la droite (''y'' = 1,5 ; ''z'' = 3,2). Nous remarquons aussi que les valeurs de ''x'' ne sont pas classées par ordre croissant ni décroissant. Nous voulons au final avoir une matrice [[''x''], [V]] triée par ''x'' croissant. Pour cela, nous pouvons faire : <syntaxhighlight lang="python"> with open(nomdefichier, "rt") ad fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(" ") for item in contenu contenu = contenu[1:] # élimine la première ligne x = np.array([float(ligne[0]) for ligne in contenu]) V = np.array([float(ligne[3]) for ligne in contenu]) donnees = np.concatenate((x.reshape(-1, 1), V.reshape(-1, 1)), axis=1) # matrice [[x], [V]] ind = np.argsort(donnees[:, 0]) donnees = donnees[ind, :] # matrice triée plt.plot(donnees[:, 0], donnees[:, 1]) </syntaxhighlight> {{note|Pour le tri, voir [[../Manipulation_de_matrices#Fonctions_et_méthodes_de_base|''Manipulation de matrices'' &gt; ''Fonctions et méthodes de base'']].}} === Cas d'un fichier CSV === Si le fichier CSV ne contient que des valeurs numériques, on peut utiliser : <syntaxhighlight lang="python"> valeurs = np.loadtxt(chemin+nomfic, delimiter=",") # si le séparateur est une virgule </syntaxhighlight> Il existe un module <code lang="python">csv</code> dédié aux fichiers CSV. La manipulation du fichier se fait comme suit : <syntaxhighlight lang="python"> import csv with open(chemin+nomfic, "rt") as fichier: lecteur = csv.reader(fichier, delimiter=",") contenu = [ligne for ligne in lecteur] print(contenu) </syntaxhighlight> === Utilisation de Pandas === Pandas<ref>https://pandas.pydata.org/</ref> est un module gérant les tableaux de données, appelés <em lang="en">data frames</em>. Voici quelques commandes utiles : <syntaxhighlight lang="python"> import numpy as np import pandas as pd M = np.random.rand(10, 10) # crée une matrice NumPy aléatoire de dimension 10 × 10 tableau = pd.DataFrame(M) # transforme la matrice en tableau DataFrame tableau.to_csv("tableau.csv") # enregistre le tableau dans un fichier CSV donnees = pd.read_csv("tableau.csv").to_numpy() # lit le fichier et transforme le tableau DataFrame en matrice NumPy </syntaxhighlight> == Exporter un programme Python == Vous pouvez créer un fichier « Python pur » <code>.py</code>. Pour cela, dans le menu <code>fichier/file</code> de Jupyter, choisir <code>télécharger/download</code> au format <code>.py</code> ; le fichier se trouve alors dans le répertoire de téléchargement du navigateur. == Ressources == * {{lien web | url = https://www.python.org/dev/peps/pep-0008/ | titre = PEP 8 -- Style Guide for Python Code | site = Python documentation | consulté le = 2019-03-14 }} == Notes et références == {{références}} ---- [[../Fonctions mathématiques générales|Fonctions mathématiques générales]] &lt; [[../|↑]] &gt; [[../Graphiques|Graphiques]] {{DEFAULTSORT:Elements de programmation}} [[Catégorie:Python pour le calcul scientifique (livre)]] 9beuxa75fjt5ahe7o1vixfzooztyon5 767327 767326 2026-06-02T13:39:31Z Cdang 1202 /* Autres fonctions */ 767327 wikitext text/x-wiki Rappel : les programmes commencent par : <syntaxhighlight lang="python"> #!/usr/bin/python3 import numpy as np import matplotlib.pyplot as plt </syntaxhighlight> == Entrées et sorties == Pour permettre à l'utilisateur ou à l'utilisatrice d'entrer une valeur, nous utilisons la fonction <code lang="python">input()</code> comme évoqué précédemment (chapitre ''[[../Premiers programmes|Premiers programmes]]''), avec la syntaxe <code lang="python">''variable'' = input(''texte'')</code>. Notez que la valeur renvoyée par <code lang="python">input()</code> est une chaîne de caractères. Si vous voulez autre chose, typiquement un nombre, il faut convertir cette chaîne. Par exemple, nous demandons ici d'entrer une longueur sous la forme d'une valeur numérique : <syntaxhighlight lang="python"> longueurDefaut = 10.0 texteDemandeLongueur = f"Veuillez entrer la longueur en millimètres (valeur par défaut {longueurDefaut} mm) : " longueur = input(texteDemandeLongueur) if longueur=="": longueur=longueurDefaut else: longueur=float(longueur) print(longueur) </syntaxhighlight> Pour afficher un texte, on utilise la fonction <code lang="python">print()</code>, également présentée dans le chapitre ''[[../Premiers programmes|Premiers programmes]]'', avec la syntaxe <code lang="python">print(''texte'')</code>. Le texte à afficher peut être de n'importe quel type (entier, réel en virgule flottante, booléen, chaîne de caractères…) mais si l'on veut « mélanger » les types, il faut tout convertir en chaînes de caractères, avec la fonction <code lang="python">str()</code>, et concaténer les chaînes avec <code lang="python">+</code>. Par exemple : <syntaxhighlight lang="python"> print("La longueur vaut : "+str(longueur)+" mm.") </syntaxhighlight> Nous pouvons aussi utiliser une « chaîne “f” » ''({{lang|en|f-string}})'' : on met un le <code lang="python">f</code> devant le guillemet ouvrant et dans la chaîne, on met un champ sous la forme <code lang="python">{''nomDeVariable''}</code>. L'exemple ci-dessus devient alors : <syntaxhighlight lang="python"> print(f"La longueur vaut : {longueur} mm.") </syntaxhighlight> Les chaînes « f » sont détaillées dans la section ''[[#Chaînes de caractères|Chaînes de caractères]]'' ci-dessous. Si l'on veut introduire un retour à la ligne dans la chaîne, on utilise les caractères <code lang="python">\n</code> (contre-oblique suivie de la lettre N minuscule). Par exemple <syntaxhighlight lang="python"> print("Ceci est un texte\navec un retour à la ligne.") </syntaxhighlight> == Types de variables == === Généralités === Python définit « tout seul » le type de la variable : « <code>3</code> » sera un entier ''({{lang|en|integer}})'', « <code>3.0</code> » sera un réel à virgule flottante ''({{lang|en|float}})'', « <code>"3"</code> » sera une chaîne de caractères ''({{lang|en|string}})''. On peut connaître le type d'une variable avec la fonction <code>type()</code>. On peut tester certaines valeurs, avec le module <code>NumPy</code> : * <code>np.isnan(x)</code> indique si les valeurs de ''x'' sont des NaN ''({{lang|en|not a number}})'' ; si ''x'' est une matrice, le résultat est une matrice de booléens, l'élément [''i'', ''j''] est <code>True</code> si <code>x[i, j]</code> est un NaN ; * <code>np.isinf(x)</code> indique si les valeurs de ''x'' sont ±∞ ; si ''x'' est une matrice, le résultat est une matrice booléenne de même dimension. On peut forcer un type : * <code>int(x)</code> : transforme la valeur ''x'' en nombre entier ; * <code>long(x)</code> : " en entier long (précision illimitée) ; * <code>float(x)</code> : " en nombre réel à virgule flottante ; * <code>str(x)</code> : " en chaîne de caractères ; * <code>complex(Re, Im)</code> : crée le nombre complexe ''Re'' + ''Im''·j, j désignant la racine carrée de –1 ; * <code>list()</code> : crée une liste ; * <code>tuple()</code> : crée un n-uplet. Par exemple <syntaxhighlight lang="python"> type(3) # <class 'int'> type(float(3)) # <class 'float'> complex(1, 1) == 1 + 1j # True list("blabla") # ['b', 'l', 'a', 'b', 'l', 'a'] </syntaxhighlight> Python distingue plusieurs genres de types : * Un itérable est un objet dont on peut extraire les éléments un par un ; ce sont les objets pour lesquels on peut écrire <code> for i in ''iterable'':</code>. Il s'agit essentiellement des listes, n-uplets, chaînes de caractères, ensembles, dictionnaires et fichiers. * Un modifiable ''({{lang|en|mutable}})'' est un objet que l'on peut modifier ; par exemple une liste est modifiable — on peut changer la valeur d'un élément, en ajouter ou en enlever un — mais les n-uplets non, pas plus qu'une chaîne de caractères ou un nombre. * Un identifiable (''{{lang|en|hashable}}'', le ''{{lang|en|hashage}}'' étant une signature caractéristique d'un objet) : objet possédant un identifiant unique. Un objet identifiable est toujours non-modifiable ''({{lang|en|unmutable}})''. === Types numériques === ==== Entiers ==== Nous pouvons définir les entiers au format octal ou hexadécimal : il faut débuter le nombre par respectivement <code>0o</code> (le chiffre zéro et la lettre o) et <code>0x</code> (le chiffre zéro et la lettre x). À l'inverse, la fonction <code>hex()</code> renvoie une chaîne correspondant à l'écriture d'un entier au format hexadécimal, et <code>oct()</code> renvoie la chaîne correspondant à l'éciture en octal. Par exemple : <syntaxhighlight lang="python"> print(0o10, ";", 0x10) # 8 ; 16 print(hex(20)) # 0x14 </syntaxhighlight> ==== Réels ==== Les réels disposent de fonctions spécifiques appelées « méthodes ». Une méthode est une fonction spécifique à un type d'objets. Étant conçue ''ad hoc'', elle est souvent plus économe en ressource et en temps qu'une fonction générique. Pour appliquer la méthode <code>meth()</code> à la variable <code>x</code>, on écrit : <code>x.meth()</code>. Nous avons déjà présenté la méthode <code>''float''.as_integer_ration()</code> qui donne la fraction réduite égale à la valeur du nombre. Les réels disposent de plusieurs autres méthodes : * <code>''float''.trunc()</code> : tronque le nombre réel ; * <code>''float''.floor()</code>, <code>''float''.ceil()</code> : renvoie l'entier le plus proche, respectivement inférieur ou supérieur ; * <code>''float''.hex()</code> : renvoie une chaîne de caractères correspondant à l'écriture du nombre en hexadécimal. Par exemple : <syntaxhighlight lang="python"> a = 20. print(a.hex()) # 0x1.4000000000000p+4 print(10..hex()) # 0x1.4000000000000p+3 </syntaxhighlight> Dans le deuxième exemple, nous appliquons la méthode <code>''float''.hex()</code> directement au nombre <code>10.</code> ; le point est obligatoire car sinon, c'est un entier, pour lequel la méthode n'est pas définie. Notez que la ''méthode'' <code>''float''.hex()</code> est différentes de la ''fonction'' <code>hex()</code> : la première concerne les réels, la seconde les entiers. ==== Complexes ==== Nous avons déjà mentionné la méthode <code>''complex''.conjugate()</code> qui donne le conjugué du nombre. Un nombre complexe dispose de deux attributs : * <code>''complex''.real</code> : sa partie réelle ; * <code> ''complex''.imag</code> : sa partie imaginaire. Par exemple : <syntaxhighlight lang = "python"> a = 5+2j print(a.conjugate(), ";", a.real, ";", a.imag) # (5-2j) ; 5.0 ; 2.0 </syntaxhighlight> === Chaînes de caractères === ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/inputoutput.html | titre = 7. Input and Output | site = Python Documentation | consulté le = 2019-04-06 }} ==== Généralités ==== Il existe en fait trois manières de définir une chaîne de caractères : * avec des guillemets simples ou doubles comme vu précédemment : <code>"…"</code> ou bien <code>'…'</code> ; * avec trois guillemets doubles : <code>"""…"""</code> : cela permet d'avoir une chaîne de caractères s'étendant sur plusieurs lignes, les retours de ligne étant pris en compte ; c'est utilisé en particulier pour la description des fonctions (''{{lang|en|docstrings}}'', voir ci-après) ; * avec des guillemets précédés d'un « r », <code>r"…"</code> ou <code>r'…'</code> : cela permet d'interpréter les barres de fraction inverses « \ » comme un caractère « normal » et non comme un caractère d'échappement (voir ci-après) ; cela est utile lorsque l'on utilise les possibilités LaTeX dans le tracé de graphiques (voir plus loin) ; * avec des guillemets précédés d'un « f », <code>f"…"</code> ou <code>f'…'</code> : cela permet d'utiliser des variables formatées (voir ci-après). Une chaîne de caractères n'est pas modifiable. Si l'on veut remplacer un caractère, l'insérer ou le supprimer, il faut transformer la chaîne en liste, avec la commande <code>list()</code>, puis rassembler la liste en la joignant ''({{lang|en|join}})'' à une chaîne vide : <syntaxhighlight lang="python"> chaine = "blabla" chaineList = list(chaine) chaineList[2] = "c" chaine = "".join(chaineList) print(chaine) # blcbla </syntaxhighlight> Dans une chaîne simple <code>"…"</code> ou <code>'…'</code>, on peut introduire un retour à la ligne avec <code>\n</code>. ==== Substitution de variables ==== Lorsque l'on veut utiliser des variables, on fait précéder les guillemets d'un « f » et l'on écrit les noms de vrariables entre accolades. Par exemple : <syntaxhighlight lang="python"> monde = "world" chaine = f"Hello {monde}!" print(chaine) # Hello world! </syntaxhighlight> On peut indiquer la taille de la chaîne générée à partir de la variable sous la forme <code>{nomVariable:taille}</code>, la taille étant un entier. Par exemple : <syntaxhighlight lang="python"> chiffre1 = 1 nom1 = "un" chiffre2 = 2 nom2 = "deux" chaine = f"{nom1:5} : {chiffre1:5d}\n{nom2:5} : {chiffre2:5d}" print(chaine) # un : 1 # deux : 2 </syntaxhighlight> Vous remarquez que l'on ajoute un « d » pour les entiers décimaux, et que les nombres sont alignés à droite. Si le nombre est un nombre réal à virgule flottante ''({{lang|en|float}})'', on peut indiquer le nombre de décimales sous la forme <code>.''n''f</code> : <syntaxhighlight lang="python"> chaine = f"{np.pi:.5f}" print(chaine) # 3.15169 </syntaxhighlight> Avec la syntaxe <code>''m''.''n''f</code>, on indique également que la totalité du nombre doit occuper ''m'' caractères. Pour convertir un nombre en caractère Unicode correspondant, on utilise la lettre c : <syntaxhighlight lang="python"> nompi = 0x03c0 # Caractère Unicode π : U+03C0 chaine = f"{nompi:c} = {np.pi:.5f}" print(chaine) # π = 3.14159 </syntaxhighlight> La classe ''str'' dispose également de la méthode <code>.format()</code>. On indique un n-uplet de chaînes (ou de nombres) à la méthode et l'on met des accolades dans la chaîne principale ; les accolades sont remplacées dans l'ordre des chaînes de la méthode. On peut changer l'ordre en indiquant quelle valeur utiliser dans quelle accolade. Par exemple : <syntaxhighlight lang="python"> chaine1 = "On compte {} puis {}".format(1, 2) chaine2 = "On compte {0} puis {1}. Mais à rebours, on compte {1} puis {0}.".format("un", "deux") print(chaine1, "\n", chaine2) # On compte 1 puis 2 # On compte un puis deux. Mais à rebours, on compte deux puis un. </syntaxhighlight> L'utilisation du caractère pourcent « % » permet d'utiliser la mise en forme <code>sprintf()</code> du langage C : <syntaxhighlight lang="python"> chaine = "π = %.5f" % np.pi print(chaine) # π = 3.14159 </syntaxhighlight> ; Exemple <nowiki>:</nowikI> barre de progression : Voici une fonction affichant une barre de progression, pour la ''i''-ème étape d'un processus ayant ''n'' étapes (pour la notion de fonction, voir la section ci-après ''[[#Fonction|Fonction]]''). : NB : nous avons utilisé les codes Unicode pour l'exemple, mais on peut évidemment copier le caractère, par exemple depuis une table Unicode ou une page Web<ref>Pour le point médian : ''{{W|Table des caractères Unicode/U0080}}'' ou ''{{W|Point médian}}''. Pour le pavé : ''{{W|Table des caractères Unicode/U2580}}''.</ref>, et le coller dans le code, comme nous l'avons fait dans le commentaire. <syntaxhighlight lang="Python"> def barre_progression(i, n, largeur=40): """ Affiche une barre de progression Entrées : — i : étape en cours, entier ; — n : nombre d'étapes à réaliser, entier ; — largeur : nombre de caractères total de la barre, entier. Sortie : affichage de la barre de progression. """ taux = i/n fait = int(largeur * taux) barre = f"{0x2588:c}" * fait + f"{0x00b7:c}" * (largeur - fait) # U+2588 : pavé "█" ; U+00B7 : point médian "·" print(f"Progression | {barre} | {100*taux:3.1f} %") barre_progression(25, 100) # Progression | ██████████······························ | 25.0 % </syntaxhighlight> ==== Méthodes des chaînes ==== Le type ''str'' dispose d'un certain nombre de méthodes. Nous avons déjà vu les méthodes <code>''str''.join()</code> et <code>''str''.format()</code>, en voici quelques autres : * <code>''str''.capitalize()</code> : met le premier caractère en capitale (majuscule) et les autres en minuscule ; * <code>''str''.lower()</code> : met tout en minuscules ''({{lang|en|lowercase}})'' ; * <code>''str''.upper()</code> : met tout en capitales ''({{lang|en|lowercase}})'' ; * <code>''str''.center(''n'')</code> : met la chaîne au centre d'une chaîne de longueur ''n'', en complétant avec des espaces ; on peut compléter avec d'autres caractères avec <code>''str''.center(''n'', ''c'')</code>, par exemple <code>"a".center(7, ".")</code> donne <code>"....a...."</code> ; * <code>''str''.ljust(''n'', ''c'')</code> et <code>''str''.rjust(''n'', ''c'')</code> : comme <code>.center()</code> mais la chaîne est respectivement alignée au fer à gauche ''({{lang|en|left}})'' et à droite ''({{lang|en|right}})'' ; * <code>''str''.isdigit()</code> : booléen vrai si tous les caractères sont des nombres ; * <code>''str''.find(''sous-chaine'')</code>, <code>''str''.rfind(''sous-chaine'')</code> : indique respectivement le premier emplacement et le dernier emplacement de la sous-chaîne dans la chaîne ; * <code>''str''.partition(''séparateur'')</code> : retourne un triplet avec la portion de chaîne avant le séparateur, le séparateur puis la portion de chaîne après le séparateur ; * <code>''str''.replace(''ancien'', ''nouveau'')</code> : remplace la chaîne ''ancien'' par la chaîne ''nouveau'' dans la chaîne ; * <code>''str''.split(''séparateur'')</code> : découpe la chaîne au niveau des séparateurs et renvoie une liste. ==== Autres fonctions ==== La fonction <code>chr()</code> transforme un code Unicode en caractère. Par exemple, <code>chr(97)</code> donne <code>"a"</code> et <code>chr(0x03c0)</code> donne <code>"π"</code>. Si on veut créer une liste de caractères qui se suivent, on peut par exemple utiliser : <syntaxhighlight lang="python"> [chr(x) for x in range(97, 102)] # ['a', 'b', 'c', 'd', 'e'] </syntaxhighlight> Si on veut créer une liste de nombres sous la forme de chaînes de caractères, on peut utiliser la commande <code>str()</code> vue ci-dessus. Par exemple : <syntaxhighlight lang="python"> [str(x) for x in range(1, 6)] # ['1', '2', '3', '4', '5'] </syntaxhighlight> Pour la syntaxe, voir ci-dessous la section [[#Définition en compréhension|''Définition en compréhension'']]. Ainsi, dans l'exemple de la barre de progression ci-dessus, on peut utiliser la solution suivante pour constituer la barre : <syntaxhighlight lang="python"> barre = chr(0x2588) * fait + chr(0x00b7) * (largeur - fait) # U+2588 : bloc ; U+00B7 : point médian </syntaxhighlight> Rappel : le module <code>html</code> permet d'utiliser les entités HTML : <syntaxhighlight lang="python"> import html … print(html.entities.html5["alpha;"]+html.entities.html5["middot;"]) # α· </syntaxhighlight> L'entité HTML <code>&xxx;</code> s'obtient par <code>html.entities.html5["xxx;"]</code>, donc en enlevant la perluète ; mais cela ne fonctionne pas avec les codes Unicode. Pour cela, on peut utiliser la commande <code>html.unescape()</code>. Ainsi, dans l'exemple de la barre de progression ci-dessus, on peut utiliser la solution suivante pour constituer la barre : <syntaxhighlight lang="python"> barre = html.unescape("&#x2588;") * fait + html.entities.html5["middot;"] * (largeur - fait) # U+2588 : bloc ; middot : point médian </syntaxhighlight> ou bien <syntaxhighlight lang="python"> barre = barre = html.unescape("&#x2588;" * fait + "&middot;" * (largeur - fait)) # U+2588 : bloc ; middot : point médian </syntaxhighlight> La commande <code>html.unescape()</code> interprète donc une chaîne complète, par exemple <syntaxhighlight lang="python"> print(html.unescape("L'esperluette est le caractère &laquo;&nbsp;&amp;&nbsp;&raquo;.")) # L'esperluette est le caractère « & ». </syntaxhighlight> == Manipulation de listes == Les listes sont une structure de données fondamentale en Python. ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/datastructures.html | langue = en | titre = 5. Data structures | site = Python documentation | consulté le = 2019-03-16 }} === Copie d'une liste === Contrairement à d'autres types, lorsque vos écrivez <code>b = a</code> avec des listes, vous ne créez pas une copie de la variable <code>a</code>, vous créez un ''alias'' : l'objet <code>b</code> est un autre nom de l'objet <code>a</code>. En particulier, si vous modifiez <code>b</code>, vous modifiez en fait <code>a</code>. Par exemple : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a b[2] = 5 print(a, b) # [1, 2, 5, 4] [1, 2, 5, 4] </syntaxhighlight> Si l'on veut créer une copie de <code>a</code>, il faut utiliser <code>a[:]</code> ou bien <code>a.copy()</code> : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a[:] c = a.copy() b[2] = 5 c[2] = 6 print(a, b, c) # [1, 2, 3, 4] [1, 2, 5, 4] [1, 2, 6, 4] </syntaxhighlight> === Méthodes de listes === Pour modifier une liste, vous disposez des méthodes suivantes : * <code>a.append(x)</code> : ajoute l'élément <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.extend(x)</code> : ajoute la liste <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.append(i, x)</code> : aoute l'élément <code>x</code> ''avant'' l'interstice ''i'' de la liste <code>a</code> ; * <code> x = a.pop(i)</code> : enlève l'élément ''i'' de la liste <code>a</code> et le met dans la variable <code>x</code> ; <code> x = a.pop()</code> enlève le dernier élément de la liste ; * <code>a.clear()</code> : vide la liste <code>a</code> ; * <code>a.sort()</code> : trie la liste par ordre croissant ; * <code>a.sort(reverse = True)</code> : trie par ordre décroissant ; * <code>a.reverse()</code> : inverse l'ordre de <code>a</code>. Pour supprimer l'élément à l'indice ''i'', au lieu d'utiliser <code>a.pop(i)</code>, on peut aussi utiliser <syntaxhighlight lang="python"> del(a[i]) </syntaxhighlight> Pour trier une liste, on peut aussi utiliser la fonction <code>sorted()</code>, ce qui permet par exemple de conserver la liste originale, non triée : <code>b = sorted(a)</code>. La fonction <code>sorted()</code> fonctionne avec tous les objets « itérables » comme par exemple une chaîne de caractères : <syntaxhighlight lang="python"> a = "ahjbfk" print(sorted(a)) # ['a', 'b', 'f', 'h', 'j', 'k'] </syntaxhighlight> Pour mettre en évidence la performance de la méthode <code>''list''.sort()</code> par rapport à la fonction générique <code>sorted()</code> : <syntaxhighlight lang="python"> import numpy as np import time a = np.random.rand(int(1e7)) t1 = time.perf_counter() b = sorted(a) # Fonction générique t2 = time.perf_counter() a.sort() # Méthode spécifique t3 = time.perf_counter() print("Sorted :", t2-t1, " s ; .sort :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # Sorted : 14.2... s ; .sort : 1.1... s ; rapport : 12.6... </syntaxhighlight> Par rapport à une valeur donnée : * <code>a.remove(x)</code> : retire la première occurrence de la valeur <code>x</code> de la liste <code>a</code> ; * <code>a.index(x)</code> : indique l'indice où se trouve la première occurrence de la valeur <code>x</code> ; * <code>a.count(x)</code> : indique le nombre de fois que l'on trouve la valeur <code>x</code> dans la liste <code>a</code>. === Définition en compréhension === La [[w:fr:Liste en compréhension|définition en compréhension]] ''({{lang|en|list comprehension}})'' est une méthode permettant de construire des listes en indiquant simplement des axiomes, des consignes de filtrage. Cette méthode est élégante car proche de la notation mathématique et compacte, mais c'est une méthode itérative donc lente par rapport à une méthode vectorisée fournie par le module NumPy. Par exemple, pour créer la liste des carrés des nombres entiers entre 0 et 9, il suffit d'écrire <syntaxhighlight lang="python"> carre = [x**2 for x in range(10)] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x^2 | x \in [0 ; 9] \}</math>. Si l'on veut la liste des nombres strictement inférieurs à 20 dont le carré est supérieur à 10, on peut écrire : <syntaxhighlight lang="python"> X = [x for x in range(20) if x**2 > 10] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x | x \in [0 ; 19], x^2 > 10 \}</math>. Pour mettre en évidence la performance du calcul vectorisé par rapport à la méthode itérative : <syntaxhighlight lang="python"> import time import numpy as np n = int(1e7) # taille de la liste t1 = time.perf_counter() carre = [x**2 for x in range(n)] # Définition en compréhension t2 = time.perf_counter() carre2 = np.arange(n)**2 # Calcul vectorisé t3 = time.perf_counter() print("En compréhension : ", t2-t1, "s ; vectorisé :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # En compréhension : 4.515... s ; vectorisé : 0.156... s ; rapport : 28.982... </syntaxhighlight> == Structure d'un programme == Un programme est simplement une suite d'instructions. Dans les environnements Unix BSD, un programme Python peut être considéré comme un script c'est-à-dire qu'il suffit de taper son nom dans l'invite de commande ''({{lang|en|shell}})'' sans avoir à invoquer <code>python</code>. Le programme doit alors commencer par un en-tête normalisé surnommé ''{{lang|en|[[wikt:shebang|shebang]]}}'' : <syntaxhighlight lang="python"> #!/usr/bin/env python3 </syntaxhighlight> Ce ''{{lang|en|shebang}}'' est inutile avec Jupyter. L'en-tête peut également contenir la description de l'encodage du fichier texte, typiquement : <syntaxhighlight lang="python"> # coding: utf-8 </syntaxhighlight> Le codage UTF-8 est le codage par défaut pour Python 3, il est donc inutile de l'indiquer. Les commentaires sont introduits par le croisillon <code>#</code>. On peut grouper une suite d'instructions dans un bloc. Un bloc d'instructions commence par deux-points « <code>:</code> » et est identé, c'est-à-dire qu'il a une marge constituée de quatre espaces — on peut aussi utiliser une tabulation mais il ne faut pas mélanger les deux méthodes ; les tabulations sont déconseillées, il vaut mieux utiliser quatre espaces<ref>{{lien web | url = https://www.python.org/dev/peps/pep-0008/#tabs-or-spaces | titre = Tabs or Spaces? | site = Python documentation | consulté le = 2019-03-14 }}</ref>. Pour terminer le bloc, il suffit simplement de revenir en début de ligne ; contrairement à d'autres langages, il n'y a pas de commende de fin ''({{lang|en|end}})'', c'est l'indentation qui définit le bloc. : # début du bloc ''instruction 1'' ''instruction 2'' … ''dernière instruction du bloc'' ''instruction hors bloc'' Par exemple, une exécution conditionnelle <code>if</code> ou une boucle <code>for</code> exécute un bloc d'instruction. Si l'on a besoin d'un bloc d'instruction qui « ne fait rien », on utilise l'instruction <code>pass</code>. == Structures de contrôle == '''Boucle itérative''' La boucle itérative s'écrit : <syntaxhighlight lang="python"> for <variable> in <itérable>: <bloc d’instructions> </syntaxhighlight> Si l'on veut que la variable prenne ''n'' valeurs de 0 à ''n'' – 1, on utilise l'instruction <code>range()</code> : <syntaxhighlight lang="python"> for i in range(5): print(i) print("Fin de la boucle") </syntaxhighlight> <code>[▶]</code> 0 1 2 3 4 Fin de la boucle En fait, la commande <code>range()</code> extrait des valeurs de l'ensemble des nombres entiers ; on peut ainsi utiliser le découpage en tranches, par exemple <code>range(2, 5)</code>pour avoir la « liste » <code>[2, 3, 4]</code>. Notez que <code>range()</code> ne crée pas à proprement parler une liste, cela crée un objet de type ''« {{lang|en|range}} »'' (plage, intervalle) ; pour avoir une liste, il faut écrire <code>list(range(n))</code>. Dans une boucle, la commande <code>continue()</code> saute la fin du bloc d'instruction et passe à la valeur suivante de la boucle. La commande <code>break()</code> interrompt la boucle et passe à la suite. '''Exécution conditionnelle''' L'exécution conditionnelle s'écrit : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> </syntaxhighlight> On peut utiliser les commandes <code>elif</code> ''(else if'') et <code>else</code> : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> elif <booléen>: <bloc d’instructions> else: <bloc d’instructions> </syntaxhighlight> Notez que le test d'une condition est gourmand en ressources. S'il s'agit de savoir si l'on effectue une opération mathématique simple ou pas, on peut remplacer le test par une multiplication par un booléen (<code>True</code> vaut 1, <code>False</code> vaut 0). Par exemple, plutôt que d'écrire <syntaxhighlight lang="python"> if a > 0: b = b - c </syntaxhighlight> mieux vaut écrire : <syntaxhighlight lang="python"> b = b - (a > 0)*c </syntaxhighlight> '''Boucle antéconditionnée''' La boucle antéconditionnée s'écrit : <syntaxhighlight lang="python"> while <booléen>: <bloc d’instructions> </syntaxhighlight> Cette boucle peut contenir des instructions <code>continue()</code> et <code>break()</code>. == Fonction == La déclaration d'une fonction utilise la commande <code>def</code>. La fonction est un bloc d'instructions. Si elle doit renvoyer des valeurs, on utilise la commande <code>return</code>. Par exemple <syntaxhighlight lang="python"> def nombres(n): """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo a = nombres(3) print(a) </syntaxhighlight> La fonction commence par une chaîne de caractères qui la décrit. Cette chaîne peut être récupérée automatiquement par certains logiciels pour faire une documentation automatique. Si la description prend plusieurs lignes, elle commence et finit par trois double-guillemets <code>"""…"""</code> ; en fait, par convention, même si cela n'est pas obligatoire, les descriptions sont toutes encadrées de trois double-guillemets. Cette description est appelée ''{{lang|en|docstring (documentation string)}}''. Pour récupérer les ''{{lang|en|docstrings}}'' : <syntaxhighlight lang="python"> def foo(): """Cette fonction ne fait rien""" pass print(foo.__doc__) # Cette fonction ne fait rien </syntaxhighlight> L'instruction <code>input()</code> permet à l'utilisateur de saisir une valeur. La valeur est retournée sous la forme d'une chaîne de caractères qui est ensuite convertie en nombre réel avec l'instruction <code>float()</code>. On peut définir une valeur par défaut en l'indiquant dans l'en-tête de la définition de la fonction, de la manière suivante : <syntaxhighlight lang="python"> def nombres(n=1): # valeur par défaut : 1 """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo </syntaxhighlight> Si le paramètre à initialiser est de type modifiable ''({{lang|en|mutable}})'', comme par exemple une liste, il faut procéder comme suit : <syntaxhighlight lang="python"> def fooFonction(fooListe=None): # valeur par défaut : n'existe pas """Description""" if fooListe = None: fooListe = [] # initialisation <suite des instructions> </syntaxhighlight> Par défaut, les variables sont locales. On peut rendre une variable globale avec l'instruction <code>global</code> ''à l'intérieur de la fonction'', avant l'utilisation de la variable. Par exemple : <syntaxhighlight lang="python"> a = 1 b = 1 def toto(): """Test de variable globale. Entrée : aucune. Sortie : aucune.""" global a a = 2 b = 2 toto() print("a =", a, "; b =", b) # a = 2 ; b = 1 </syntaxhighlight> Pour être plus précis : si une variable n'est pas assignée dans une fonction, alors Python va chercher une variable du même nom à l'extérieur de la fonction. Mais à partir du moment où la variable est assignée dans la fonction, elle devient locale ''sauf'' si l'on a utilisé l'instruction <code>global</code>. Si l'on s'attend à un nombre indéfini d'arguments, on utilise la notion d'empaquetage/dépaquetage ''({{lang|en|packing/unpacking}})''<ref>{{lien web | url = https://deusyss.developpez.com/tutoriels/Python/args_kwargs/ | titre = Introduction à *args et **kwargs | consulté le = 2019-03-09 | site = Developpez.com }}.</ref>. L'empaquetage consiste à mettre les arguments dans un n-uplet, le dépaquetage consiste à développer un n-uplet en plusieurs variables. Cela se fait en mettant un astérisque ''({{lang|en|splat}})'' « <code>*</code> » devant le nom de la variable. Par convention, on utilise le nom de variable <code>*args</code> mais cela n'est pas obligatoire. <syntaxhighlight lang="python"> def concatenation(*args): """Concatène des chaînes de caractères Entrée : *args, n-uplet de chaînes de caractères. Sortie : resultat, chaîne de caractères.""" resultat = "" for i in args: resultat = resultat + i return resultat concatenation("a", "foo", "toto") # 'afoototo' </syntaxhighlight> À l'inverse, si une fonction doit recevoir plusieurs paramètres, on peut à la place lui transmettre une liste à dépaqueter : <syntaxhighlight lang="python"> def addition(a, b): """Ajoute deux nombres Entrées : — a : réel ; — b : réel. Sortie : a+b, réel""" return a+b arg = (1, 2) addition(*arg) # 3 </syntaxhighlight> On peut aussi empaqueter/dépaqueter un dictionnaire, on utilise pour cela deux astérisques « <code>**</code> ». Par convention, on utilise le nom <code>**kwargs</code> sans que cela soit obligatoire. L'instruction <code>lambda</code> permet de créer de petites fonctions ne contenant pas de boucle ni de branchement conditionnel. Cependant, si la déclaration est courte et compacte, le code n'est pas toujours facilement lisible ; l'utilisation de cette instruction n'est pas recommandée. Par exemple l'expression <syntaxhighlight lang="python"> f = lambda x: 2*x </syntaxhighlight> est la même chose que <syntaxhighlight lang="python"> def f(x): """Calcule le double. Entrée : x, réel. Sortie : 2*x, réel.""" return 2*x </syntaxhighlight> {{note|L'instruction <code>eval()</code> exécute une chaîne de caractères, c'est-à-dire traite une chaîne de caractères comme si c'étaient des instructions données à Python. Cette instruction est à éviter pour deux raisons : # Un utilisateur malveillant pourrait entrer du code malveillant dans la chaîne de caractères. # L'exécution est lente puisque Python doit compiler la chaîne à la volée. Cette instruction peut en général être remplacée par une autre instruction. }} == Gestion des erreurs == Dans un bloc d'instructions, on peut utiliser la structure <code>try:… except:</code>. Le bloc après <code>try</code> est exécuté ; si une erreur se déclare dans ce bloc, alors le bloc <code>except</code> s'exécute. Par exemple <syntaxhighlight lang="python"> try: 1/0 # Génère une erreur except: print("Division par zéro") # Cette instruction est donc exécutée </syntaxhighlight> On peut compléter avec <code>else:</code> et <code>finally:</code> : <syntaxhighlight lang="python"> try: <code à exécuter> except: <s’exécute en cas d’erreur> else: <s’exécute s’il n’y a pas d’erreur> finally: <s’exécute dans tous les cas> </syntaxhighlight> On peut séparer les différents types d'erreur : <syntaxhighlight lang="python"> try: <code à exécuter> except ValueError: print("Valeur erronée") except TypeError: print("Type erroné") </syntaxhighlight> Les types d'erreur les plus courants sont : * <code>NameError</code> : le nom de variable n'existe pas ; * <code>TypeError</code> : la valeur n'est pas du bon type ; * <code>ValueError</code> : la valeur n'est pas compatible avec ce qui est attendu ; * <code>RuntimeError</code> : type d'erreur général. On peut aussi créer ses propres erreurs : si une situation erronée survient, on peut « lever » une exception avec <code>raise</code>. Par exemple <syntaxhighlight lang="python"> if a < 0: raise ValueError("La valeur doit être positive") </syntaxhighlight> ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/errors.html | titre = Errors and exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} * {{lien web | url = https://docs.python.org/3/library/exceptions.html | titre = Built-in Exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} == Exercices == === Calcul du PGCD et du PPCM par l'algorithme d'Euclide === {{loupe|w:Algorithme d'Euclide}} Écrire un programme Python qui demande deux nombres entiers et affiche leurs PGCD et PPCM. Le programme utilisera l'algorithme d'Euclide. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """Programme : euclide.py Auteur : User:cdang date : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : calcule le PGCD et le PPCM de deux nombres entiers. Entrée ------ au clavier, saisie de deux nombres entiers. Sorties ------- à l'écran, affichage du PGCD et du PPCM. """ # *************** # *************** # ** Fonctions ** # *************** # *************** def euclide(): """Calcule le PGCD et le PPCM avec l'algorithme d'Elclide Entrée ------ Aucune, la saisie des paramètres fait partie de la fonction Sortie ------ affichage du PGCD et du PPCM """ print("***** Algorithme d'Euclide *****\n") a0 = int(input("Premier nombre entier : a = ")) b0 = int(input("Second nombre entier : b = ")) a = a0 b = b0 r = a%b # initialisation while (r != 0) : # algorithme d'Euclide a = b b = r r = a%b # affichage des résultats print("PGCD(", a0, ", ", b0, ") = ", b) print("PPCM(", a0, ", ", b0, ") = ", a0*b0//b) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* euclide() </syntaxhighlight> On peut simplifier la boucle centrale : <syntaxhighlight lang="python"> while b: # s'exécute tant que b n'est pas 0 a, b = b, a % b # affectation de liste à liste return a </syntaxhighlight> {{boîte déroulante fin}} Notez que le module NumPy propose l'instruction <code>gcd()</code> : <syntaxhighlight lang="python"> import numpy … print(numpy.gcd(a, b)) </syntaxhighlight> === Tours de Hanoï === {{loupe|w:Tours de Hanoï}} Écrire un programme Python qui demande le nombre ''n'' de plateaux et affiche les manipulations nécessaires pour déplacer la pile d'un emplacement à un autre. Le programme utilisera l'algorithme récursif. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """nom : hanoi.py auteur : User:cdang date de création : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : résout le problème des tours de Hanoï Entrées ------- trois chaînes de caractères (nom des piliers) Sorties ------- une chaîne de caractères (liste des opérations) """ # *************** # *************** # ** Fonctions ** # *************** # *************** def hanoi(a, b, c, n): """Résout le problème des tours de Hanoï de manière récursive But : déplace la pile de n disques du piler a au pilier b Entrées ------- a, b c : chaînes de 1 caractère, référence des emplacements ; n : entier, nombre de disques sur l'emplacement a Sorties ------- operations : chaînes de caractères décrivant les opérations """" if n>1: operations = hanoi(a, c, b, n-1) operations = operations+a+"→"+b+" ; " operations = operations+hanoi(c, b, a, n-1) else: operations = a+"→"+b+" ; " return operations # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* resultat = hanoi("1", "2", "3", 3) print(resultat) </syntaxhighlight> {{boîte déroulante fin}} === Lancer de rayons === [[Fichier:Lentille hemispherique perspective.svg|vignette|Lentille hémisphérique.]] Considérons une lentille hémisphérique de rayon R faite d’un verre d’indice de réfraction ''n''. Nous plaçons une source ponctuelle à une distance ''d'' du dioptre plan, sur l’axe optique. Tracer des rayons partant de la source et traversant la lentille. {{clear}} {{Boîte déroulante/début |titre=Analyse d’optique géométrique}} [[Fichier:Lentille hemispherique analyse geometrique.svg|vignette|Analyse géométrique du problème.]] Il s’agit d’un problème ayant une symétrie de révolution par rapport à l’axe optique. Nous pouvons nous réduire à un problème plan en nous plaçant dans un plan contenant l’axe optique ; l’axe optique est encore un axe de symétrie orthogonale, nous pouvons donc nous contenter d'étudier un demi-plan. Pour simplifier, nous plaçons le centre du dioptre sphérique à l’origine O du repère. L’axe optique est l’axe ''x'' et l'axe perpendiculaire, vertical sur la figure, c’est l’axe ''y''. Les coordonnées de la source sont donc (-''d'' ; 0). Le rayon issu de la source et faisant un angle θ avec l’axe ''x'' frappe le dioptre plan à l’altitude ''h''. Nous avons : : ''h'' = ''d'' ⋅ tan θ. L’angle d’incidence vaut θ. D’après la loi de Snell-Descartes, l'angle de réfraction θ<sub>2</sub> vaut : : θ<sub>2</sub> = arcsin((sin θ) / ''n''). Le rayon réfracté passe par le points de coordonnées (0, ''h''). L’équation de la droite est donc : : ''y'' = a ⋅ ''x'' + ''h'' avec : ''a'' = tan θ<sub>2</sub>. L’équation du cercle de centre O et de rayon R est : : ''x''<sup>2</sup> + ''y''<sup>2</sup> = R<sup>2</sup>. Les coordonnées (''x''<sub>M</sub>, ''y''<sub>M</sub>) de l’intersection M du rayon avec le dioptre sphérique vérifient les deux équations. Par substitution, nous obtenons une équation du second degré en ''x'' que nous savons résoudre : : ''x''<sub>M</sub><sup>2</sup> + (''a'' ⋅ ''x''<sub>M</sub> + ''h'')<sup>2</sup> = R<sup>2</sup> : ⇔ (1 + ''a''<sup>2</sup>) ⋅ ''x''<sub>M</sub><sup>2</sup> + 2 ⋅ ''a'' ⋅ ''h'' ⋅ ''x''<sub>M</sub> + ''h''<sup>2</sup> – R<sup>2</sup> = 0. D’après les propriétés du cercle, le rayon est perpendiculaire à la tangente. Le rayon [OM] est donc normal au dioptre en M. Nous pouvons déterminer l’angle d’incidence θ<sub>i</sub> par le produit scalaire : : <math>\begin{pmatrix} 1 \\ a \end{pmatrix} \cdot \begin{pmatrix} x_\mathrm{M} \\ y_\mathrm{M} \end{pmatrix} = \sqrt{1^2 + a^2} \cdot \mathrm{R} \cdot \cos(\theta_\mathrm{i})</math> ce qui nous permet de calculer cet angle : : <math>\theta_\mathrm{i} = \operatorname{arcos} \left ( \frac{x_\mathrm{M} + a \cdot y_\mathrm{M}}{\mathrm{R} \cdot \sqrt{1^2 + a^2} } \right )</math> Comme nous passons vers un milieu d’indice plus faible, il y a un risque de réflexion totale. L’angle limite est : : θ<sub>max</sub> = arcsin(1/''n''). Si l’on a θ<sub>i</sub> &gt; θ<sub>max</sub>, le rayon repart vers l’intérieur. Nous ne traçons pas le rayon car cela nous emmènerait trop loin dans l’analyse. En revanche, si θ<sub>i</sub> ≤ θ<sub>max</sub>, alors nous pouvons appliquer la loi de Snell-Descartes pour avoir l’angle de réfraction θ<sub>e</sub> : : θ<sub>e</sub> = arcsin(''n'' ⋅ sin θ<sub>i</sub>). Pour tracer le rayon sortant, il nous faut l’angle θ<sub>3</sub> par rapport à l’horizontale. L’angle du rayon [OM] par rapport à l’horizontal vaut arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>), nous avons donc : θ<sub>3</sub> = arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>) + θ<sub>e</sub>. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Analyse algorithmique}} '''Structure des données''' Le problème est décrit par trois paramètres : # Le rayon <code>R1</code> de la lentille, en milliètres (réel en virgule flottante). # L’indice du verre, <code>n</code> sans dimension (réel en virgule flottante). L’indice de l’air vaut 1. # La distance de la source au dioptre d’entrée plan, <code>d</code> en millimètres (réel en virgule flottante). Un rayon est caractérisé par quatre paramètres : # L’angle d’émission <code>theta1</code> en radians (réel en virgule flottante). # L’angle de réfraction dans la lentille <code>theta2</code> en radians (réel en virgule flottante). # Les cordonnées <code>M</code> en millimètre (vecteur de dimension 2 <code>([x, y])</code> de réels en virgule flottante) du point d’intersection du rayon avec le dioptre sphérique. # L’angle de réfraction dans l’air après la lentille <code>theta3</code> en radians (réel en virgule flottante). Pour le calcul et le tracé, nous avons besoin des paramètres intermédiaires suivants : * l’altitude ''y'' = <code>h</code> en millimètres (réel en virgule flottante) à laquelle le rayon frappe le dioptre plan d’entrée ; * l’angle d’incidence du rayon avec le dioptre sphérique <code>thetaint</code> en radians (réel en virgule flottante). Les angles sont stockés en radians car c’est l’unité naturelle pour le calcul mais nous affichons les valeurs en degrés. Comme le calcul de conversion est récurrent, nous conservons les facteurs <code>degversrad</code> (conversion des degrés vers les radians, facteur valant π/180, réel en virgule flottante) et <code>radversdeg</code> (conversion des radians vers les degrés, facteur valant 180/π, réel en virgule flottante). '''Fonctions''' Nous avons besoin d’une fonction qui calcule les trois paramètres du rayon <code>(theta2, M, theta3)</code> à partir de l’angle d’émission <code>theta1</code>. Nous appelons cette fonction <code>lanceRayon()</code>. Cette fonction fait appelle à une fonction qui calcule l’angle du rayon réfracté à partir de l’angle du rayon incident <code>theta1</code>, les deux angles étant par rapport à la normale au dioptre au point considéré. Nous appelons cette fonction <code>refrac()</code>. La recherche de l’intersection <code>M</code> du rayon avec le dioptre sphérique nécessite de résoudre une équation du second degré. Nous utilisons pour cela la recherche des racines du polynôme en <code>x</code> avec la fonction <code lang="python">numpy.polynomial.polynomial.polyroots()</code>. D’après la configuration du problème géométrique, si l’on s’assure que le rayon frappe bien la lentille (0 ≤ <code>h</code> ≤ <code>R1</code>) alors nous sommes sûrs que le problème a deux solutions réelles (une positive et une négative) ou, dans le cas dégénéré où <code>h == R1</code>, une valeur unique <code>x == 0</code>. Comme nous recherchons la valeur positive, nous sélectionons la plus grande des deux racines. Pour la gestion de la réflexion interne : dans la fonction <code>refrac()</code>, nous vérifions les conditions de réflexion totale et si elles sont remplies, alors nous générons une erreur (commandes <code lang="python">try… except</code> et <code lang="python">raise ValueError</code>). Cette erreur est propagée à la fonction <code>lanceRayon()</code> : <code>lanceRayon()</code> appelle la fonction <code>refrac()</code> et si cette fonction renvoie une erreur, alors <code>lanceRayon()</code> renvoie également une erreur. Pour trouver l’angle d’émission <code>thetaLimite</code> provoquant la réflexion totale (en radians, réel en virgule flottante), nous effectuons une recherche par dichotomie : * nous partons de l’angle maximum possible, lorsque le rayon frappe le sommet de la lentille, et nous appelons la fonction <code>lanceRayon()</code> ; si cela ne génère pas d’erreur, alors nous pouvons aller jusqu’à cette valeur, la recherche est terminée ; si cela génère une erreur, alors nous divisons la valeur par deux ; * à une étape de la recherche donnée, si <code>lanceRayon()</code> ne génère pas d’erreur avec l’angle testé, alors nous savons que l’angle limite est supérieur à cette valeur ; cette valeur minore donc la valeur recherchée ; si au contraire <code>lanceRayon()</code> génère une erreur, alors c’est que l’angle est trop important, cette valeur majore donc la valeur recherchée ; nous pouvons ainsi resserer l’intervalle de recherche ; * nous nous arrêtons lorsque les valeurs haute et basse sont suffisamment proche. Concrètement : # Nous définissons une variable <code>angleHaut</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus bas connu provoquant la réflexion totale. # Nous définissons une variable <code>angleBas</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus haut connu ne provoquant pas de réflexion totale. Sa valeur initiale est 0. L’angle limite recherché est donc entre <code>angleBas</code> et <code>angleHaut</code>. # Nous définissons l’angle <code>angleTest</code> comme étant la moyenne entre <code>angleBas</code> et <code>angleHaut</code>. Si <code>lanceRayon(angleTest)</code> génère une erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleHaut</code> (puisque c’est une valeur provoquant la réflexion totale et qu’elle est plus basse que la valeur actuelle d’<code>angleHaut</code>). À l’inverse, si <code>lanceRayon(angleTest)</code> ne génère pas d’erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleBas</code> (puisque c’est une valeur ne provoquant pas la réflexion totale et qu’elle est plus haute que la valeur actuelle d’<code>angleBas</code>). # Nous arrêtons la procédure lorsque l’écart entre <code>angleBas</code> et <code>angleHaut</code> est inférieur à {{unité|10|échelle=<sup>–3</sup>|rad}} (valeur arbitraire). La valeur retenue est la valeur finale d’<code>angleBas</code> (puisque l’on veut être sûr qu’il n’y ait pas de réflexion totale). La valeur affichée est la valeur en degrés arrondie au dixième. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Solution}} Nous demandons à l’utilisateur ou à l’utilisatrice les valeurs des paramètres du problème : rayon de la lentille, distance de la source, indice de réfraction du verre. Nous vérifions que les valeurs entrées sont bien des nombres ; si c’est une chaîne vide, alors nous utilisons une valeur par défaut. Nous créons une fonction <code>refrac()</code> qui permet de calculer l’angle réfracté à partir de l’angle d’incidence et des indices de réfraction. S’il y a rélexion totale, alors nous générons une erreur. La fonction <code>lanceRayon()</code> calcule les différents points de passage du rayon. Elle appelle pour cela la fonction <code>refrac()</code>. Si un appel de la commande <code>refrac()</code> génère une erreur, alors nous générons également une erreur. Nous déterminons l’angle d’émision du rayon <code>thetaLimite</code> qui provoque une réflecxion totale. Pour cela, nous créons une fonction <code>rechercheLimite()</code> qui cherche par dichotomie. Nous traçons un rayon tous les 5° jusqu’à la valeur limite. <syntaxhighlight lang="python"> #!/usr/bin/env python3 # coding: utf-8 """nom : lancerRayons.py auteur : User:cdang date de création : 2022-05-06 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : NumPy, matplotlib ---------------------------------------------------------------------------- Objectif : trace des trajets optique avec une lentille hémisphérique Entrées ------- Le rayon de la lentille, la distance de la source, l’indice de réfraction du verre, trois chaînes de caractères saisies par l’utilisateur·rice et qui sont converties en réels. Sorties ------- La valeur limite de l’angle (réel) et le tracé de plusieurs rayons. """ # ****************************************************** # ****************************************************** # ** Lancer de rayons pour une lentille hémisphérique ** # ****************************************************** # ****************************************************** import numpy as np import matplotlib.pyplot as plt import numpy.polynomial.polynomial as nppol # ************** # * Constantes * # ************** # Pour la conversion degrés ↔ radians radversdeg = 180/np.pi degversrad = 1/radversdeg # ************* # * Fonctions * # ************* def boucleEntreeNombre(messageSaisie, valeurDefaut): """Permet de s’assurer que l’utilisateur·rice a bien entré un nombre. Entrée : — message à afficher (chaîne de caractères) ; — valeur par défaut (réel à virgule flottante). Sortie : nombre (réel à virgule flottante).""" messageErreur = "Veuillez entrer une valeur numérique (ou vide pour accepter la valeur par défaut).\n" execute = True while execute: strNombre = input(messageSaisie+f" (valeur par défaut {valeurDefaut}) : ") if strNombre == "": nombre = valeurDefaut execute = False else: try: nombre = float(strNombre) except: print(messageErreur) else: execute = False return nombre def initialisation(): """L’utilisateur·rice entre les variables du problème. Entrées : aucune. Sorties : — R1 (mm) : rayon de la lentille ; — d (mm) : distance de la source au dioptre plan ; — n (sans dimension) : indice de réfraction du verre.""" R1 = boucleEntreeNombre("Rayon de la lentille en mm", 20.0) d = boucleEntreeNombre("Distance de la source au dioptre plan en mm", 20.0) n = boucleEntreeNombre("Indice de réfraction (sans dimension)", 1.5) return (R1, d, n) def refrac(n1, n2, theta1): """Calcule l’angle de réfraction theta2 (radians) en fonction — de l’angle d’incidence theta1 (radians); — de l’indice de réfraction n1 du premier milieu ; — de l’indice de réfraction n2 du second milieu.""" reflexionTotale=False rapport=n2/n1 rapportinv=np.reciprocal(rapport) if n1 > n2: thetal = np.arcsin(rapport) # angle limite pour la réflexion totale if theta1 >= thetal: reflexionTotale=True if reflexionTotale: print("Réflexion totale") raise ValueError else: return np.arcsin(rapportinv*np.sin(theta1)) def lanceRayon(n1, n2, d, R, theta1): """Détermine le rayon issu de la source située à une distance d (mm) du bareau et avec une élévation de theta1 (radians), en fonction des indices de réfraction n1 et n2. Les éléments retournés sont : — la hauteur h (mm) à laquelle le rayon frappe le barreau ; — l’angle de réfraction theta2 (radians)) dans le barreau ; — l’angle de réfraction theta3 (radians) à la sortie du barreau — le point M(x, y) (mm) auquel le rayon sort du barreau.""" h = d*np.tan(theta1) if h >= R: print("Le rayon est au-dessus du barreau") raise ValueError else: theta2 = refrac(n1, n2, theta1) a = np.tan(theta2) x = max(nppol.polyroots([h*h - R*R, 2*a*h, 1+a*a])) # recherche de l’intersection du rayon avec le cercle y = a*x + h M = np.array([x, y]) thetaint = np.arccos((x + a*y)/(R*np.sqrt(1 + a*a))) theta3 = np.arctan(y/x) - refrac(n2, n1, thetaint) return (h, theta2, theta3, M) def rechercheLimite(n1, n2, d, R): """Recherche l’angle limite pour la réflexion totale. Entrée : — indice de réfraction des milieux 1 et 2, n1 et n2 ; — distance au barreau, d(mm). Sortie : angle limite theta (radians)""" angleHaut = np.arctan(R/d) angleBas = 0 angleTest = angleHaut try: lanceRayon(n1, n2, d, angleTest, R) except: condition = True # il y a réflexion total en haut de la lentille else: condition = False # il n’y a jamais réflexion totale dans la lentille while condition: #dichotomie angleTest = np.mean([angleHaut, angleBas]) # on ajuste la valeur de test try: lanceRayon(n1, n2, d, R, angleTest) except: angleHaut = angleTest # réflexion totale : on abaisse la valeur maximale else: angleBas = angleTest # pas de réflexion totale : on monte la valeur minimale condition = ((angleHaut - angleBas) >= 0.001) # on a cerné la limite à 0,001 rad près if not condition: angleTest = angleBas return angleTest # *********************** # * Programme principal * # *********************** (R1, d, n) = initialisation() xmax = round(R1 + d) thetaLimite = rechercheLimite(1, n, d, R1) thetaLimiteDeg = thetaLimite*radversdeg print(f"Angle limite pour la réflexion totale : {thetaLimiteDeg:.1f}°.\n") anglesDeg = np.arange(0, thetaLimiteDeg, 5)[1:] # trace un rayon tous les 5° anglesRad = anglesDeg*degversrad nb = len(anglesDeg) h = np.zeros(nb) # initialisation des vecteurs de valeurs theta2 = np.zeros(nb) theta3 = np.zeros(nb) M = np.zeros((nb, 2)) for i in range(nb): (h[i], theta2[i], theta3[i], M[i, :]) = lanceRayon(1, n, d, R1, anglesRad[i]) (h_lim, theta2_lim, theta3_lim, M_lim) = lanceRayon(1, n, d, R1, thetaLimite) # tracé anglesCercle = 0.5*np.pi*(np.linspace(1, 0, 20)) x_cercle = R1*np.cos(anglesCercle) # coordonnées des pints du cercle y_cercle = R1*np.sin(anglesCercle) fig = plt.plot([-d,xmax], [0, 0], "k-.", linewidth="0.5") # tracé de l’axe optique for i in range(nb): plt.plot([-d, 0, M[i, 0], xmax], [0, h[i], M[i, 1], M[i, 1] + (xmax - M[i, 0])*np.tan(theta3[i])], label=f"{anglesDeg[i]:.0f}°") plt.plot([-d, 0, M_lim[0], xmax], [0, h_lim, M_lim[1], M_lim[1] + (xmax - M_lim[0])*np.tan(theta3_lim)], label=f"{0.1*int(np.trunc(10*thetaLimite*radversdeg)):.1f}°") plt.plot(x_cercle, y_cercle, "k", linewidth="0.5") # tracé du cercle plt.plot([0,0], [0, R1], "k", linewidth="0.5") # tracé du premier dioptre #plt.axis("square") plt.gca().set_aspect("equal", adjustable="box") plt.xlabel("x (mm)") plt.ylabel("y (mm)") plt.title("Lentille hémisphérique, lancer de rayons") plt.legend() plt.savefig("lentille_hemispherique_lancer_rayon.svg", format="svg") plt.show() </syntaxhighlight> {{Boîte déroulante/fin}} == Mesurer le temps == Le module <code>time</code> fournit les fonctions suivantes : * <code>time.gmtime()</code> : renvoie la date et l'heure du méridien de Greenwich (''{{lang|en|Greenwich mean time}}'', GMT), sous la forme d'un dictionnaire (année, mois, jour du mois, heure, minute, seconde, jour de la semaine, jour de l'année, heure d'été/hiver), ** jour de la semaine est un entier entre 0 (lundi) et 6 (dimanche), ** jour du mois est un entier entre 1 et 366 ; * <code>time.localtime()</code> : comme le précédent, mais l'heure est l'heure locale ; * <code>time.time()</code> : donne le nombre de seconde qui se sont écoulées depuis le 1er janvier 1970 ; * <code>time.gmtime(n)</code> et <code>time.localtime(n)</code> transforment un nombre de secondes (écoulées depuis le 1er janvier 1970) en une date au format (année, mois, jour, etc.), n-uplet de neuf valeurs ; <code>time.mktime()</code> fait le contraire, il transforme un n-uplet de neuf valeurs (années, mois, jour, etc.) en un nombre de secondes (écoulées depuis le 1er janvier 1970) ; * <code>time.sleep(n)</code> : provoque une pause dans le déroulement du programme de ''n'' secondes ; * <code>time.perf_counter()</code> : indique une date en seconde ; s'utilise pour mesurer la durée d'exécution d'une partie du code, en faisant la différence entre deux relevés. Concernant la date et l'heure sous la forme d'un n-uplet, on peut extraire l'heure de la manière suivante : <syntaxhighlight lang="python"> import time a = time.localtime() print("Il est ", a[3], "h", a[4]) # ou bien print("Il est ", a.tm_hour, "h", a.tm_min) </syntaxhighlight> Pour mesurer la performance d'une portion de code : <syntaxhighlight lang="python"> import time t1 = time.perf_counter() <suite d’instructions> t2 = time.perf_counter() print("Durée d'exécution :", t2-t1 </syntaxhighlight> == Programmation orientée objet == Nous n'allons pas ici faire un cours de programmation orientée objet (POO), nous allons aborder le sujet de manière pragmatique. De manière schématique, un « objet » est une « super-variable ». Cette super-variable peut contenir plusieurs variables, appelées « attributs » ; elle contient en fait un dictionnaire (paires « nom d'attribut : valeur d'attribut »). Elle peut aussi contenir des fonctions spécifiques appelées « méthodes ». De même qu'une variable a un type, un objet fait partie d'une « classe ». La classe est le modèle de l'objet ; en franglais informatique, on dit que l'objet est une instance de la classe. La POO est donc un formalisme : lorsque l'on définit des variables et des fonctions concernant un même type d'objet (au sens commun du terme), on les empaquette dans une classe. Il faut donc d'abord définir la classe, puis attribuer cette classe à un objet (« instancier » la classe). Considérons par exemple que nous voulons travailler sur des [[w:Engrenage|engrenages]] ; pour simplifier, nous nous contentons d'engrenages à dentures droites. Une roue dentée, un pignon, est essentiellement définie par son nombre de dents Z et par son module ''m'' qui correspond à la largeur de dents<ref>ainsi que par son épaisseur ''e'' et le matériau dont elle est faite mais nous allons négliger ces paramètres pour la simplicité de l'étude.</ref>. Nous allons définir trois méthodes : la méthode <code>.diametrePrimitif()</code> qui calcule le diamètre primitif de la roue dentée, <code>.pas()</code> qui calcule la largeur des dents au niveau du cercle primitif et <code>.rapport()</code> qui calcule le rapport de transmission de deux roues engrenées Z<sub>1</sub>/Z<sub>2</sub>. La méthode <code>.rapport()</code> vérifie par ailleurs que les roues ont le même module, condition indispensable pour former un engrenage. Nous définissons la classe ainsi : <syntaxhighlight lang="python"> class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): # instructions lancées lors de la déclaration """Valeurs des attributs""" self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z </syntaxhighlight> Nous remarquons que lorsque nous déclarons les méthodes, le paramètre <code>self</code> correspond à l'objet lui-même. Ainsi, dans la méthode <code>.rapport()</code>, la variable <code>self.Z</code> est le nombre de dents de la roue elle-même et <code>roueDentee.Z</code> est le nombre de dents de la roue passée en paramètre. Pour déclarer les roues, nous écrivons : <syntaxhighlight lang="python"> roue1 = pignon() # attribution de la classe, « instanciation » roue1.Z = 13 # définition des caractéristiques du pignon « roue1 » roue1.m = 2 roue2 = pignon(16, 2) # manière alternative </syntaxhighlight> Nous pouvons alors utiliser les objets de la manière suivante : <syntaxhighlight lang="python"> print(roue1.Z) # 13 print(roue1.diametrePrimitif()) # 26 R = roue1.rapport(roue2) # 0.8125 </syntaxhighlight> La commande <code>dir(a)</code> affiche tous les attributs et méthodes de l'objet <code>a</code>. ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/classes.html | titre = Classes | site = Python documentation | consulté le = 2019-03-08 }} == Interface graphique avec Tk == Une interface graphique utilisateur (GUI, ''{{lang|en|graphic user interface}}'') est un ensemble de boîtes permettant d'interagir avec l'utilisateur c'est-à-dire permettre la saisie d'informations, l'exécution d'actions et afficher des informations. Elle se compose d'éléments appelés ''{{lang|en|widgets}}''. Les éléments ''({{lang|en|widgets}})'' classiques sont : * boîte de dialogue ''({{lang|en|dialog box}})'' : fenêtre contenant d'autres éléments ; * étiquette ''({{lang|en|label}})'' : texte affiché ; * liste déroulante ''({{lang|en|drop-down list}})'' : zone permettant le choix d'une option, la liste se déployant lorsque l'on clique sur la zone ; * zone de texte, champ de saisie ''({{lang|en|text box}})'' : zone permettant de taper du texte ; * boîte combinée ''({{lang|en|combo box}})'' : zone de saisie de texte contenant une liste déroulante qui permet de choisir des éléments prédéfinis ; * bouton ''({{lang|en|button}})'' : objet effectuant une action lorsque l'on clique dessus ; * case à cocher ''({{lang|en|checkbox, tickbox}})'' : objet permettant d'activer ou de désactiver une option lorsque l'on clique dessus ; * bouton radio, case d'option ''({{lang|en|radio button}})'' : objet permettant d'activer une option en désactivant les autres options ; une seule option peut être activée à la fois. Plusieurs modules permettent de gérer les interfaces graphiques. Nous choisissons ici le module développé sur la bibliothèque Tk qui est une bibliothèque multiplateforme. Pour cela, nous importons le module <code>tkinter</code> ainsi que le module <code>ttk</code>, ce dernier proposant des options plus « modernes » : <syntaxhighlight lang="python"> import tkinter as tk from tkinter import ttk </syntaxhighlight> Voici un programme permettant comme précédemment de calculer le rapport de transmission d'un engrenage. Nous détaillons sa construction ci-après. <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: IUrapport.set(valeurZ2/valeurZ1) except: IUrapport.set("erreur") # ************************* # ************************* # ** Interface graphique ** # ************************* # ************************* # fenetre principale fenetre = tk.Tk() fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> '''Explications''' Nous commençons par définir la boîte de dialogue que nous appelons <code>fenetre</code> ; c'est un objet <code>Tk</code> et nous lui donnons un titre « » : <syntaxhighlight lang="python"> fenetre = tk.Tk() fenetre.title("Rapport de réduction") </syntaxhighlight> Puis, nous définissons un cadre attaché à cette fenêtre et qui va nous permettre « d'accrocher » les autres éléments, ce qui permet de garder une apparence satisfaisante lorsque l'on retaille la fenêtre : <syntaxhighlight lang="python"> cadre = ttk.Frame(fenetre) </syntaxhighlight> Le cadre va comporter six lignes ''({{lang|en|row}})'' et deux colonnes ''({{lang|en|column}})''. Nous allons placer une étiquette ''({{lang|en|label}})'' « z1 » : <code>text="z1"</code>. Cette étiquette se trouve dans une case du cadre, celle de la première colonne et la première ligne : <code>grid(column=1, row=1)</code>. Par rapport à cette case, elle est collée à « l'ouest » (W, ''{{lang|en|west}}'', gauche) de la case : <code>sticky=tk.W</code>. <syntaxhighlight lang="python"> z1_label = ttk.Label(cadre, text="z1") # Création de l'étiquette z1_label.grid(column=1, row=1, sticky=tk.W) # Placement de l'étiquette </syntaxhighlight> Notez que l'on aurait pu écrire directement : <syntaxhighlight lang="python"> ttk.Label(cadre, text="z1").grid(column=1, row=1, sticky=tk.W) </syntaxhighlight> mais le fait de séparer la création de l'élément et son placement facilite la maintenance (recherche d'erreur, évolution du code). Pour tout ce qui est dynamique, c'est-à-dire les zone de saisie des valeurs et l'affichage du résultat, il faut définir des « chaînes variables » ''({{lang|variable strings}})'' : <syntaxhighlight lang="python"> IUz1 = tk.StringVar() </syntaxhighlight> Cette variable est une variable globale à la création. Nous pouvons alors placer la zone de saisie ''({{lang|en|entry}})'' à côté de l'étiquette lui correspondant. Nous nommons la zone de saisie <code>z1_entry</code> : <syntaxhighlight lang="python"> z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) </syntaxhighlight> Nous faisons de même pour les trois autres paramètres de l'engrenage, ''m''<sub>1</sub>, ''z''<sub>2</sub> et ''m''<sub>2</sub>. Le résultat est également une chaîne variable globale. Par rapport à notre mise en page, elle se situe dans la case colonne 2 ligne 5, centrée sur cette case (collé à l'est et à l'ouest) : <syntaxhighlight lang="python"> rapport = tk.StringVar() rapport_dynamique = ttk.Label(cadre, textvariable=rapport) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) </syntaxhighlight> Il nous faut encore définir une fonction de manière classique, nous l'appelons « calcule ». Les variables étant globales, on les utilise directement. On récupère les valeurs avec la méthode <code>get()</code> et nous modifions la valeur avec la méthode <code>set()</code> : <syntaxhighlight lang="python"> def calcule(): valeurZ1 = float(IUz1.get()) valeurZ2 = float(IUz2.get()) IUrapport.set(valeurZ2/valeurZ1) </syntaxhighlight> Cette fonction est déclenchée lorsque l'on clique sur le bouton « Calcul » situé dans la case du cadre ligne 6 colonne 2 : <syntaxhighlight lang="python"> bouton = ttk.Button(cadre, text="Calcul", command=calcule) bouton.grid(column=2, row=6, sticky=tk.W) </syntaxhighlight> ou bien si l'on appuie sur la touche <code>[entrée]</code> du clavier : <syntaxhighlight lang="python"> fenetre.bind("<Return>", calcule) </syntaxhighlight> À tout ceci, nous ajoutons des « gouttières » (marges, ''{{lang|en|paddings}}'') afin d'espacer les éléments. Il faut ensuite « activer » la fenêtre pour qu'elle s'affiche. La méthode est <code>mainloop()</code> (boucle principale) : « boucle » (elle est active en permanence et attend des actions sur ses éléments), <syntaxhighlight lang="python"> fenetre.mainloop() </syntaxhighlight> Nous avons ci-dessus mis la plupart du code en programme principal. Nous pouvons aussi programmer de manière fonctionnelle, en mettant la plupart du code dans des fonctions ; cependant, pour que la fenêtre et les variables dynamiques soient globales à tout le programme, elles doivent être déclarées dans le programme principal. Nous pouvons aussi mêler la programmation orientée objet. {{boîte déroulante début|Calcul du rapport de transmission en programmation fonctionnelle et orientée objet}} <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # ************* # ************* # ** Classes ** # ************* # ************* class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): """Valeurs des attributs""" # instructions lancées lors de la déclaration self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z # ************************ # ************************ # ** Variables globales ** # ************************ # ************************ # fenetre principale fenetre = tk.Tk() # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: roue1 = pignon(valeurZ1, valeurM1) roue2 = pignon(valeurZ2, valeurM2) IUrapport.set(roue1.rapport(roue2)) except: IUrapport.set("Erreur") # *********************** # * Interface graphique * # *********************** def configureFenetre(): """Configuration de la fenêtre principale""" fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* configureFenetre() # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> {{boîte déroulante fin}} == Annotations == Une annotation est un commentaire qui sert à expliciter un type de variable. La syntaxe est différente des commentaires « classiques » : cela permet d'avoir un affichage différent avec les éditeurs de texte ayant une coloration syntaxique, et ces informations peuvent être récupérées par des logiciels extérieurs pour effectuer une documentation automatique ou bien des vérifications de type. Cependant : * comme les commentaires normaux, ils n'ont aucune influence lors de l'exécution du texte ; en particulier : * rien n'oblige à annoter les variables ; * il est possible d'avoir une variable ayant un type différent de son annotation ; le fait de pouvoir définir et changer le type de variable à la volée est une fonctionnalité fondamentale de Python. La syntaxe pour une annotation est : : nom_de_variable + deux-points + espace + type par exemple : <syntaxhighlight lang="python"> a: int </syntaxhighlight> Notez qu'ici, la variable n'est ''pas'' créée. Pour la créer, il faut lui affecter une valeur. Il est possible de l'affecter après ou bien sur la même ligne avec la syntaxe : : nom_de_variable + deux-points + espace + type + espace + égal + espace + valeur par exemple : <syntaxhighlight lang="python"> a: int a = 5 # est équivalent à a: int = 5 </syntaxhighlight> Même si l'annotation n'a pas d'impact sur l'exécution, le type doit être un type existant sinon cela génère une erreur de syntaxe. Les types classiques sont : : <code>int</code> — <code>float</code> — <code>str</code> — <code>bool</code> — <code>list</code> — <code>tuple</code> — <code>dict</code> Il est également possible de mettre une chaîne de caractères : <syntaxhighlight lang="python"> a: "ce que je veux" = 3.1516 </syntaxhighlight> On peut annoter une fonction. Il est possible d'annoter les variables déclarées au sein de la fonction, mais pas les variables globales (puisqu'elle ne sont pas définie au sein de la fonction). On peut aussi annoter : * les variables passées en paramètre, avec la même syntaxe dans les parenthèses ; * annoter le type de la variable de sortie (retournée) en la faisant précéder de <code>-&gt;</code> : <syntaxhighlight lang="python"> def plusCinq(a: float = 0) -> float: return a + 5 </syntaxhighlight> ; Ressources * {{lien web | url = https://www.python.org/dev/peps/pep-0526/ | titre = PEP 526 -- Syntax for Variable Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} * {{lien web | url = https://www.python.org/dev/peps/pep-3107/ | titre = PEP 3107 -- Function Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} == Décorateur == Un décorateur est une fonction qui s'applique à une fonction, à la manière de la composition mathématique ''g'' ∘ ƒ = ''g''(ƒ). Mais cette composition affecte la fonction elle-même ; l'utilisateur appelle la fonction ƒ mais c'est la fonction ''g'' ∘ ƒ qui s'exécute. Cette fonction ''g'' est appelée le décorateur. L'intérêt est de pouvoir modifier une fonction sans modifier le code de la fonction elle-même. Pour appliquer une décoration, il faut : # Déclarer le décorateur : une fonction qui s'applique à une autre fonction. # Affecter le décorateur à la fonction visée : en mettant <code>@''décoration''</code> juste avant la définition de la fonction. Par exemple : <syntaxhighlight lang="python"> def decorateur(f): print("Avant la fonction") f() print("après la fonction") @decorateur def afficheFoo(): print("Foo.") afficheFoo # Avant la fonction # Foo. # Après la fonction </syntaxhighlight> Lorsque l'on appelle <code>afficheFoo</code>, on appelle en fait <code>decorateur(afficheFoo)</code>. Si la fonction à modifier admet des paramètres, il faut définir une fonction enveloppante dans le décorateur. Par exemple, nous définissons ci-dessous un décorateur <code>deuxFois()</code> qui fait s'exécuter deux fois de suite la fonction : <syntaxhighlight lang="python"> def deuxFois(f): def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # conteneurFonction </syntaxhighlight> Nous voyons que l'application du décorateur a modifié le nom de la fonction — pas le nom de la variable qui contient la fonction mais bien son nom « intime ». Pour éviter cela, on utilise la méthode <code>wraps()</code> du module <code>functools</code> : <syntaxhighlight lang="python"> import functools def deuxFois(f): @functools.wraps(f) def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # plusCinq </syntaxhighlight> On peut par exemple utiliser un décorateur pour la mémoïsation. La mémoïsation est une méthode consistant à mémoriser les valeurs d'une fonction au fur et à mesure de son utilisation ; ainsi, si l'on veut évaluer la fonction avec les mêmes entrées, on se contente d'aller chercher la valeur enregistrée ce qui est plus rapide. On sacrifie donc la place mémoire au profit de la rapidité. On peut trouver des décorateurs de mémoïsation aux adresses suivantes : * https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize * https://gist.github.com/robcowie/1357800 ; Ressources : {{lien web | url = https://www.python.org/dev/peps/pep-0318/ | titre = PEP 318 -- Decorators for Functions and Methods | site = Python.org | lang = en | consulté le = 2019-04-05 }} == Manipulation de fichiers == === Importer le contenu d'un fichier === Python possède la fonction <code lang="python">open()</code> qui permet d'ouvrir un fichier. Ouvrir signifie qu'il crée un objet de type <code>file</code> qui possède notamment les méthodes <code lang="python">read()</code> et <code lang="python">write()</code>. Il peut s'agir d'un objet de type « fichier binaire » ''({{lang|en|binary file}})'' ou « fichier texte » ''({{lang|en|text file}})''. Si par exemple on veut utiliser (et donc lire) le contenu du fichier texte <code>monfichier.txt</code>, on écrit : <syntaxhighlight lang="python"> fichier = open("monfichier.txt", "rt") … fichier.close() </syntaxhighlight> Le paramètre <code>"rt"</code> signifie que nous ouvrons le fichier en lecture ''({{lang|en|read}})'' et qu'il s'agit d'un objet de type fichier texte. Notons deux choses : * en faisant cela, nous ne faisons qu'associer le fichier à un objet Python, nous n'avons pas encore importé les données ; * si nous ouvrons le fichier, il faut le fermer par la suite ; c'est pourquoi nous utilisons la méthode <code lang="python">.close()</code>. Pour éviter d'avoir à fermer le fichier, nous pouvons l'ouvrir au sein d'un contexte : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: … </syntaxhighlight> Notons aussi que la chaîne de caractères indiquant le nom du fichier peut contenir le chemin d'accès au répertoire (dossier), mais sous Microsoft Windows, il faut utiliser des barres de fractions <code>/</code> pour séparer les sous-répertoires au lieu de la barre inversée habituelle, par exemple : <syntaxhighlight lang="python"> chemin = "C:/Temp/monfichier.txt" with open(chemin, "rt") as fichier: … </syntaxhighlight> Pour mettre les données du fichier dans la variable <code>contenu</code>, nous écrivons donc : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() print(contenu) </syntaxhighlight> et si nous ne voulons lire que les <code>n</code> premiers caractères (<code>n</code> étant un entier), nous utilisons <code lang="python">contenu = fichier.read(n)</code>. Cette lecture est séquentielle, c'est-à-dire que si nous appliquons la méthode plusieurs fois, nous reprenons la lecture là où nous l'avons laissée. Si nous voulons lire une ligne, nous utilisons la méthode <code lang="python">.readline()</code>. La lecture ligne par ligne est également séquentielle. Nous pouvons aussi créer une liste dont chaque élément est une ligne du fichier ; nous utilisons alors la méthode <code lang="python">.readlines()</code> (notez le pluriel). Chaque élément de la liste se termine par le caractère de fin de ligne <code lang="python">\n</code>. Pour l'enlever, nous pouvons utiliser la méthode <code lang="python">.rstrip()</code> pour chaque élément de la liste, par exemple. L'exemple complet est alors : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.readlines() contenu = [item.rstrip() for item in contenu] print(contenu) </syntaxhighlight> === Exporter du contenu vers un fichier === Si nous voulons créer un fichier texte pour y mettre le contenu de la variable <code>texte</code>, alors nous utilisons : <syntaxhighlight lang="python"> with open("monfichier.txt", "wt") as fichier: contenu = fichier.write(texte) </syntaxhighlight> Le module principal important pour la manipulation de fichiers est est <code lang="python">os</code>. === Exploiter le contenu d'un fichier texte === Avec un fichier texte, la méthode <code lang="python">.read()</code> crée une variable de type texte. Nous pouvons séparer cette variable en différentes lignes avec la méthode <code lang="python">.splitlines()</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une ligne. Si maintenant une ligne contient plusieurs données séparées par un séparateur commun, par exemple un espace, nous pouvons séparer les données par la méthode <code lang="python">.split(''séparateur'')</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une donnée. Si par exemple le fichier est du type CSV ''({{lang|en|comma separated values}}'', valeurs séparées par une virgule), l'exploitation du fichier est : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(",") for item in contenu] </syntaxhighlight> La variable <code>contenu</code> est une liste de listes. Pour avoir la ''n''<sup>e</sup> valeurs de la ''m''<sup>e</sup> ligne, on utilise : <syntaxhighlight lang="python"> contenu[m-1][n-1] </syntaxhighlight> Si l'on veut extraire la ligne ''m'' il suffit d'écrire : <syntaxhighlight lang="python"> contenu[m-1] </syntaxhighlight> mais si l'on veut la colonne ''n'', le plus simple est d'utiliser une définitipon en compréhension : <syntaxhighlight lang="python"> [ligne[n-1] for ligne in contenu] </syntaxhighlight> Dans certains fichiers CSV, les séparateurs de valeurs ne sont pas des virgules, on peut donc utiliser un autre caractère pour le séparateur. Si le séparateur est une tabulation, on utilise <code lang="python">\t</code> : <code lang="python">contenu = [item.split("\t") for item in contenu]</code> Si la première ligne contient les en-têtes des colonnes, on peut l'enlever avec la fonction <code lang="python">del()</code> : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() del(contenu[0]) contenu = [item.split(",") for item in contenu] </syntaxhighlight> Certains logiciels créent des fichiers en utilisant le séparateur décimal régional, qui en France est la virgule. Pour remplacer les virgules par des points, on peut utiliser la méthode <code lang="python">.replace()</code>, de préférence ''avant'' de séparer les valeurs : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.replace(",", ".") for item in contenu] # remplace les virgules par des points contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule </syntaxhighlight> en effet, lorsque l'on a séparé les valeurs, on a une liste de liste, il faut alors balayer les sous-listes ce qui prend plus de temps : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule contenu = [[subitem.replace(",", ".") for subitem in item] for item in contenu] # remplace les virgules par des points </syntaxhighlight> '''Exemple complet''' Supposons que l'on ait un fichier texte de la forme : <syntaxhighlight lang="text"> x y z V 0.0 1.5 3.2 8.657 0.4 1.5 3.2 8.392 0.2 1.5 3.2 8.485 ... </syntaxhighlight> C'est un fichier valeurs V associées à des points de coordonnées ''(x, y, z)'' (un champ V sur l'espace, donc). Nous remarquons que seule la coordonnée ''x'' change : les données concernent la droite (''y'' = 1,5 ; ''z'' = 3,2). Nous remarquons aussi que les valeurs de ''x'' ne sont pas classées par ordre croissant ni décroissant. Nous voulons au final avoir une matrice [[''x''], [V]] triée par ''x'' croissant. Pour cela, nous pouvons faire : <syntaxhighlight lang="python"> with open(nomdefichier, "rt") ad fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(" ") for item in contenu contenu = contenu[1:] # élimine la première ligne x = np.array([float(ligne[0]) for ligne in contenu]) V = np.array([float(ligne[3]) for ligne in contenu]) donnees = np.concatenate((x.reshape(-1, 1), V.reshape(-1, 1)), axis=1) # matrice [[x], [V]] ind = np.argsort(donnees[:, 0]) donnees = donnees[ind, :] # matrice triée plt.plot(donnees[:, 0], donnees[:, 1]) </syntaxhighlight> {{note|Pour le tri, voir [[../Manipulation_de_matrices#Fonctions_et_méthodes_de_base|''Manipulation de matrices'' &gt; ''Fonctions et méthodes de base'']].}} === Cas d'un fichier CSV === Si le fichier CSV ne contient que des valeurs numériques, on peut utiliser : <syntaxhighlight lang="python"> valeurs = np.loadtxt(chemin+nomfic, delimiter=",") # si le séparateur est une virgule </syntaxhighlight> Il existe un module <code lang="python">csv</code> dédié aux fichiers CSV. La manipulation du fichier se fait comme suit : <syntaxhighlight lang="python"> import csv with open(chemin+nomfic, "rt") as fichier: lecteur = csv.reader(fichier, delimiter=",") contenu = [ligne for ligne in lecteur] print(contenu) </syntaxhighlight> === Utilisation de Pandas === Pandas<ref>https://pandas.pydata.org/</ref> est un module gérant les tableaux de données, appelés <em lang="en">data frames</em>. Voici quelques commandes utiles : <syntaxhighlight lang="python"> import numpy as np import pandas as pd M = np.random.rand(10, 10) # crée une matrice NumPy aléatoire de dimension 10 × 10 tableau = pd.DataFrame(M) # transforme la matrice en tableau DataFrame tableau.to_csv("tableau.csv") # enregistre le tableau dans un fichier CSV donnees = pd.read_csv("tableau.csv").to_numpy() # lit le fichier et transforme le tableau DataFrame en matrice NumPy </syntaxhighlight> == Exporter un programme Python == Vous pouvez créer un fichier « Python pur » <code>.py</code>. Pour cela, dans le menu <code>fichier/file</code> de Jupyter, choisir <code>télécharger/download</code> au format <code>.py</code> ; le fichier se trouve alors dans le répertoire de téléchargement du navigateur. == Ressources == * {{lien web | url = https://www.python.org/dev/peps/pep-0008/ | titre = PEP 8 -- Style Guide for Python Code | site = Python documentation | consulté le = 2019-03-14 }} == Notes et références == {{références}} ---- [[../Fonctions mathématiques générales|Fonctions mathématiques générales]] &lt; [[../|↑]] &gt; [[../Graphiques|Graphiques]] {{DEFAULTSORT:Elements de programmation}} [[Catégorie:Python pour le calcul scientifique (livre)]] 7ob1lmdwttn362mjf296gf7ugmt14le 767382 767327 2026-06-03T06:51:45Z Cdang 1202 /* Interface graphique avec Tk */ formulaiton 767382 wikitext text/x-wiki Rappel : les programmes commencent par : <syntaxhighlight lang="python"> #!/usr/bin/python3 import numpy as np import matplotlib.pyplot as plt </syntaxhighlight> == Entrées et sorties == Pour permettre à l'utilisateur ou à l'utilisatrice d'entrer une valeur, nous utilisons la fonction <code lang="python">input()</code> comme évoqué précédemment (chapitre ''[[../Premiers programmes|Premiers programmes]]''), avec la syntaxe <code lang="python">''variable'' = input(''texte'')</code>. Notez que la valeur renvoyée par <code lang="python">input()</code> est une chaîne de caractères. Si vous voulez autre chose, typiquement un nombre, il faut convertir cette chaîne. Par exemple, nous demandons ici d'entrer une longueur sous la forme d'une valeur numérique : <syntaxhighlight lang="python"> longueurDefaut = 10.0 texteDemandeLongueur = f"Veuillez entrer la longueur en millimètres (valeur par défaut {longueurDefaut} mm) : " longueur = input(texteDemandeLongueur) if longueur=="": longueur=longueurDefaut else: longueur=float(longueur) print(longueur) </syntaxhighlight> Pour afficher un texte, on utilise la fonction <code lang="python">print()</code>, également présentée dans le chapitre ''[[../Premiers programmes|Premiers programmes]]'', avec la syntaxe <code lang="python">print(''texte'')</code>. Le texte à afficher peut être de n'importe quel type (entier, réel en virgule flottante, booléen, chaîne de caractères…) mais si l'on veut « mélanger » les types, il faut tout convertir en chaînes de caractères, avec la fonction <code lang="python">str()</code>, et concaténer les chaînes avec <code lang="python">+</code>. Par exemple : <syntaxhighlight lang="python"> print("La longueur vaut : "+str(longueur)+" mm.") </syntaxhighlight> Nous pouvons aussi utiliser une « chaîne “f” » ''({{lang|en|f-string}})'' : on met un le <code lang="python">f</code> devant le guillemet ouvrant et dans la chaîne, on met un champ sous la forme <code lang="python">{''nomDeVariable''}</code>. L'exemple ci-dessus devient alors : <syntaxhighlight lang="python"> print(f"La longueur vaut : {longueur} mm.") </syntaxhighlight> Les chaînes « f » sont détaillées dans la section ''[[#Chaînes de caractères|Chaînes de caractères]]'' ci-dessous. Si l'on veut introduire un retour à la ligne dans la chaîne, on utilise les caractères <code lang="python">\n</code> (contre-oblique suivie de la lettre N minuscule). Par exemple <syntaxhighlight lang="python"> print("Ceci est un texte\navec un retour à la ligne.") </syntaxhighlight> == Types de variables == === Généralités === Python définit « tout seul » le type de la variable : « <code>3</code> » sera un entier ''({{lang|en|integer}})'', « <code>3.0</code> » sera un réel à virgule flottante ''({{lang|en|float}})'', « <code>"3"</code> » sera une chaîne de caractères ''({{lang|en|string}})''. On peut connaître le type d'une variable avec la fonction <code>type()</code>. On peut tester certaines valeurs, avec le module <code>NumPy</code> : * <code>np.isnan(x)</code> indique si les valeurs de ''x'' sont des NaN ''({{lang|en|not a number}})'' ; si ''x'' est une matrice, le résultat est une matrice de booléens, l'élément [''i'', ''j''] est <code>True</code> si <code>x[i, j]</code> est un NaN ; * <code>np.isinf(x)</code> indique si les valeurs de ''x'' sont ±∞ ; si ''x'' est une matrice, le résultat est une matrice booléenne de même dimension. On peut forcer un type : * <code>int(x)</code> : transforme la valeur ''x'' en nombre entier ; * <code>long(x)</code> : " en entier long (précision illimitée) ; * <code>float(x)</code> : " en nombre réel à virgule flottante ; * <code>str(x)</code> : " en chaîne de caractères ; * <code>complex(Re, Im)</code> : crée le nombre complexe ''Re'' + ''Im''·j, j désignant la racine carrée de –1 ; * <code>list()</code> : crée une liste ; * <code>tuple()</code> : crée un n-uplet. Par exemple <syntaxhighlight lang="python"> type(3) # <class 'int'> type(float(3)) # <class 'float'> complex(1, 1) == 1 + 1j # True list("blabla") # ['b', 'l', 'a', 'b', 'l', 'a'] </syntaxhighlight> Python distingue plusieurs genres de types : * Un itérable est un objet dont on peut extraire les éléments un par un ; ce sont les objets pour lesquels on peut écrire <code> for i in ''iterable'':</code>. Il s'agit essentiellement des listes, n-uplets, chaînes de caractères, ensembles, dictionnaires et fichiers. * Un modifiable ''({{lang|en|mutable}})'' est un objet que l'on peut modifier ; par exemple une liste est modifiable — on peut changer la valeur d'un élément, en ajouter ou en enlever un — mais les n-uplets non, pas plus qu'une chaîne de caractères ou un nombre. * Un identifiable (''{{lang|en|hashable}}'', le ''{{lang|en|hashage}}'' étant une signature caractéristique d'un objet) : objet possédant un identifiant unique. Un objet identifiable est toujours non-modifiable ''({{lang|en|unmutable}})''. === Types numériques === ==== Entiers ==== Nous pouvons définir les entiers au format octal ou hexadécimal : il faut débuter le nombre par respectivement <code>0o</code> (le chiffre zéro et la lettre o) et <code>0x</code> (le chiffre zéro et la lettre x). À l'inverse, la fonction <code>hex()</code> renvoie une chaîne correspondant à l'écriture d'un entier au format hexadécimal, et <code>oct()</code> renvoie la chaîne correspondant à l'éciture en octal. Par exemple : <syntaxhighlight lang="python"> print(0o10, ";", 0x10) # 8 ; 16 print(hex(20)) # 0x14 </syntaxhighlight> ==== Réels ==== Les réels disposent de fonctions spécifiques appelées « méthodes ». Une méthode est une fonction spécifique à un type d'objets. Étant conçue ''ad hoc'', elle est souvent plus économe en ressource et en temps qu'une fonction générique. Pour appliquer la méthode <code>meth()</code> à la variable <code>x</code>, on écrit : <code>x.meth()</code>. Nous avons déjà présenté la méthode <code>''float''.as_integer_ration()</code> qui donne la fraction réduite égale à la valeur du nombre. Les réels disposent de plusieurs autres méthodes : * <code>''float''.trunc()</code> : tronque le nombre réel ; * <code>''float''.floor()</code>, <code>''float''.ceil()</code> : renvoie l'entier le plus proche, respectivement inférieur ou supérieur ; * <code>''float''.hex()</code> : renvoie une chaîne de caractères correspondant à l'écriture du nombre en hexadécimal. Par exemple : <syntaxhighlight lang="python"> a = 20. print(a.hex()) # 0x1.4000000000000p+4 print(10..hex()) # 0x1.4000000000000p+3 </syntaxhighlight> Dans le deuxième exemple, nous appliquons la méthode <code>''float''.hex()</code> directement au nombre <code>10.</code> ; le point est obligatoire car sinon, c'est un entier, pour lequel la méthode n'est pas définie. Notez que la ''méthode'' <code>''float''.hex()</code> est différentes de la ''fonction'' <code>hex()</code> : la première concerne les réels, la seconde les entiers. ==== Complexes ==== Nous avons déjà mentionné la méthode <code>''complex''.conjugate()</code> qui donne le conjugué du nombre. Un nombre complexe dispose de deux attributs : * <code>''complex''.real</code> : sa partie réelle ; * <code> ''complex''.imag</code> : sa partie imaginaire. Par exemple : <syntaxhighlight lang = "python"> a = 5+2j print(a.conjugate(), ";", a.real, ";", a.imag) # (5-2j) ; 5.0 ; 2.0 </syntaxhighlight> === Chaînes de caractères === ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/inputoutput.html | titre = 7. Input and Output | site = Python Documentation | consulté le = 2019-04-06 }} ==== Généralités ==== Il existe en fait trois manières de définir une chaîne de caractères : * avec des guillemets simples ou doubles comme vu précédemment : <code>"…"</code> ou bien <code>'…'</code> ; * avec trois guillemets doubles : <code>"""…"""</code> : cela permet d'avoir une chaîne de caractères s'étendant sur plusieurs lignes, les retours de ligne étant pris en compte ; c'est utilisé en particulier pour la description des fonctions (''{{lang|en|docstrings}}'', voir ci-après) ; * avec des guillemets précédés d'un « r », <code>r"…"</code> ou <code>r'…'</code> : cela permet d'interpréter les barres de fraction inverses « \ » comme un caractère « normal » et non comme un caractère d'échappement (voir ci-après) ; cela est utile lorsque l'on utilise les possibilités LaTeX dans le tracé de graphiques (voir plus loin) ; * avec des guillemets précédés d'un « f », <code>f"…"</code> ou <code>f'…'</code> : cela permet d'utiliser des variables formatées (voir ci-après). Une chaîne de caractères n'est pas modifiable. Si l'on veut remplacer un caractère, l'insérer ou le supprimer, il faut transformer la chaîne en liste, avec la commande <code>list()</code>, puis rassembler la liste en la joignant ''({{lang|en|join}})'' à une chaîne vide : <syntaxhighlight lang="python"> chaine = "blabla" chaineList = list(chaine) chaineList[2] = "c" chaine = "".join(chaineList) print(chaine) # blcbla </syntaxhighlight> Dans une chaîne simple <code>"…"</code> ou <code>'…'</code>, on peut introduire un retour à la ligne avec <code>\n</code>. ==== Substitution de variables ==== Lorsque l'on veut utiliser des variables, on fait précéder les guillemets d'un « f » et l'on écrit les noms de vrariables entre accolades. Par exemple : <syntaxhighlight lang="python"> monde = "world" chaine = f"Hello {monde}!" print(chaine) # Hello world! </syntaxhighlight> On peut indiquer la taille de la chaîne générée à partir de la variable sous la forme <code>{nomVariable:taille}</code>, la taille étant un entier. Par exemple : <syntaxhighlight lang="python"> chiffre1 = 1 nom1 = "un" chiffre2 = 2 nom2 = "deux" chaine = f"{nom1:5} : {chiffre1:5d}\n{nom2:5} : {chiffre2:5d}" print(chaine) # un : 1 # deux : 2 </syntaxhighlight> Vous remarquez que l'on ajoute un « d » pour les entiers décimaux, et que les nombres sont alignés à droite. Si le nombre est un nombre réal à virgule flottante ''({{lang|en|float}})'', on peut indiquer le nombre de décimales sous la forme <code>.''n''f</code> : <syntaxhighlight lang="python"> chaine = f"{np.pi:.5f}" print(chaine) # 3.15169 </syntaxhighlight> Avec la syntaxe <code>''m''.''n''f</code>, on indique également que la totalité du nombre doit occuper ''m'' caractères. Pour convertir un nombre en caractère Unicode correspondant, on utilise la lettre c : <syntaxhighlight lang="python"> nompi = 0x03c0 # Caractère Unicode π : U+03C0 chaine = f"{nompi:c} = {np.pi:.5f}" print(chaine) # π = 3.14159 </syntaxhighlight> La classe ''str'' dispose également de la méthode <code>.format()</code>. On indique un n-uplet de chaînes (ou de nombres) à la méthode et l'on met des accolades dans la chaîne principale ; les accolades sont remplacées dans l'ordre des chaînes de la méthode. On peut changer l'ordre en indiquant quelle valeur utiliser dans quelle accolade. Par exemple : <syntaxhighlight lang="python"> chaine1 = "On compte {} puis {}".format(1, 2) chaine2 = "On compte {0} puis {1}. Mais à rebours, on compte {1} puis {0}.".format("un", "deux") print(chaine1, "\n", chaine2) # On compte 1 puis 2 # On compte un puis deux. Mais à rebours, on compte deux puis un. </syntaxhighlight> L'utilisation du caractère pourcent « % » permet d'utiliser la mise en forme <code>sprintf()</code> du langage C : <syntaxhighlight lang="python"> chaine = "π = %.5f" % np.pi print(chaine) # π = 3.14159 </syntaxhighlight> ; Exemple <nowiki>:</nowikI> barre de progression : Voici une fonction affichant une barre de progression, pour la ''i''-ème étape d'un processus ayant ''n'' étapes (pour la notion de fonction, voir la section ci-après ''[[#Fonction|Fonction]]''). : NB : nous avons utilisé les codes Unicode pour l'exemple, mais on peut évidemment copier le caractère, par exemple depuis une table Unicode ou une page Web<ref>Pour le point médian : ''{{W|Table des caractères Unicode/U0080}}'' ou ''{{W|Point médian}}''. Pour le pavé : ''{{W|Table des caractères Unicode/U2580}}''.</ref>, et le coller dans le code, comme nous l'avons fait dans le commentaire. <syntaxhighlight lang="Python"> def barre_progression(i, n, largeur=40): """ Affiche une barre de progression Entrées : — i : étape en cours, entier ; — n : nombre d'étapes à réaliser, entier ; — largeur : nombre de caractères total de la barre, entier. Sortie : affichage de la barre de progression. """ taux = i/n fait = int(largeur * taux) barre = f"{0x2588:c}" * fait + f"{0x00b7:c}" * (largeur - fait) # U+2588 : pavé "█" ; U+00B7 : point médian "·" print(f"Progression | {barre} | {100*taux:3.1f} %") barre_progression(25, 100) # Progression | ██████████······························ | 25.0 % </syntaxhighlight> ==== Méthodes des chaînes ==== Le type ''str'' dispose d'un certain nombre de méthodes. Nous avons déjà vu les méthodes <code>''str''.join()</code> et <code>''str''.format()</code>, en voici quelques autres : * <code>''str''.capitalize()</code> : met le premier caractère en capitale (majuscule) et les autres en minuscule ; * <code>''str''.lower()</code> : met tout en minuscules ''({{lang|en|lowercase}})'' ; * <code>''str''.upper()</code> : met tout en capitales ''({{lang|en|lowercase}})'' ; * <code>''str''.center(''n'')</code> : met la chaîne au centre d'une chaîne de longueur ''n'', en complétant avec des espaces ; on peut compléter avec d'autres caractères avec <code>''str''.center(''n'', ''c'')</code>, par exemple <code>"a".center(7, ".")</code> donne <code>"....a...."</code> ; * <code>''str''.ljust(''n'', ''c'')</code> et <code>''str''.rjust(''n'', ''c'')</code> : comme <code>.center()</code> mais la chaîne est respectivement alignée au fer à gauche ''({{lang|en|left}})'' et à droite ''({{lang|en|right}})'' ; * <code>''str''.isdigit()</code> : booléen vrai si tous les caractères sont des nombres ; * <code>''str''.find(''sous-chaine'')</code>, <code>''str''.rfind(''sous-chaine'')</code> : indique respectivement le premier emplacement et le dernier emplacement de la sous-chaîne dans la chaîne ; * <code>''str''.partition(''séparateur'')</code> : retourne un triplet avec la portion de chaîne avant le séparateur, le séparateur puis la portion de chaîne après le séparateur ; * <code>''str''.replace(''ancien'', ''nouveau'')</code> : remplace la chaîne ''ancien'' par la chaîne ''nouveau'' dans la chaîne ; * <code>''str''.split(''séparateur'')</code> : découpe la chaîne au niveau des séparateurs et renvoie une liste. ==== Autres fonctions ==== La fonction <code>chr()</code> transforme un code Unicode en caractère. Par exemple, <code>chr(97)</code> donne <code>"a"</code> et <code>chr(0x03c0)</code> donne <code>"π"</code>. Si on veut créer une liste de caractères qui se suivent, on peut par exemple utiliser : <syntaxhighlight lang="python"> [chr(x) for x in range(97, 102)] # ['a', 'b', 'c', 'd', 'e'] </syntaxhighlight> Si on veut créer une liste de nombres sous la forme de chaînes de caractères, on peut utiliser la commande <code>str()</code> vue ci-dessus. Par exemple : <syntaxhighlight lang="python"> [str(x) for x in range(1, 6)] # ['1', '2', '3', '4', '5'] </syntaxhighlight> Pour la syntaxe, voir ci-dessous la section [[#Définition en compréhension|''Définition en compréhension'']]. Ainsi, dans l'exemple de la barre de progression ci-dessus, on peut utiliser la solution suivante pour constituer la barre : <syntaxhighlight lang="python"> barre = chr(0x2588) * fait + chr(0x00b7) * (largeur - fait) # U+2588 : bloc ; U+00B7 : point médian </syntaxhighlight> Rappel : le module <code>html</code> permet d'utiliser les entités HTML : <syntaxhighlight lang="python"> import html … print(html.entities.html5["alpha;"]+html.entities.html5["middot;"]) # α· </syntaxhighlight> L'entité HTML <code>&xxx;</code> s'obtient par <code>html.entities.html5["xxx;"]</code>, donc en enlevant la perluète ; mais cela ne fonctionne pas avec les codes Unicode. Pour cela, on peut utiliser la commande <code>html.unescape()</code>. Ainsi, dans l'exemple de la barre de progression ci-dessus, on peut utiliser la solution suivante pour constituer la barre : <syntaxhighlight lang="python"> barre = html.unescape("&#x2588;") * fait + html.entities.html5["middot;"] * (largeur - fait) # U+2588 : bloc ; middot : point médian </syntaxhighlight> ou bien <syntaxhighlight lang="python"> barre = barre = html.unescape("&#x2588;" * fait + "&middot;" * (largeur - fait)) # U+2588 : bloc ; middot : point médian </syntaxhighlight> La commande <code>html.unescape()</code> interprète donc une chaîne complète, par exemple <syntaxhighlight lang="python"> print(html.unescape("L'esperluette est le caractère &laquo;&nbsp;&amp;&nbsp;&raquo;.")) # L'esperluette est le caractère « & ». </syntaxhighlight> == Manipulation de listes == Les listes sont une structure de données fondamentale en Python. ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/datastructures.html | langue = en | titre = 5. Data structures | site = Python documentation | consulté le = 2019-03-16 }} === Copie d'une liste === Contrairement à d'autres types, lorsque vos écrivez <code>b = a</code> avec des listes, vous ne créez pas une copie de la variable <code>a</code>, vous créez un ''alias'' : l'objet <code>b</code> est un autre nom de l'objet <code>a</code>. En particulier, si vous modifiez <code>b</code>, vous modifiez en fait <code>a</code>. Par exemple : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a b[2] = 5 print(a, b) # [1, 2, 5, 4] [1, 2, 5, 4] </syntaxhighlight> Si l'on veut créer une copie de <code>a</code>, il faut utiliser <code>a[:]</code> ou bien <code>a.copy()</code> : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a[:] c = a.copy() b[2] = 5 c[2] = 6 print(a, b, c) # [1, 2, 3, 4] [1, 2, 5, 4] [1, 2, 6, 4] </syntaxhighlight> === Méthodes de listes === Pour modifier une liste, vous disposez des méthodes suivantes : * <code>a.append(x)</code> : ajoute l'élément <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.extend(x)</code> : ajoute la liste <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.append(i, x)</code> : aoute l'élément <code>x</code> ''avant'' l'interstice ''i'' de la liste <code>a</code> ; * <code> x = a.pop(i)</code> : enlève l'élément ''i'' de la liste <code>a</code> et le met dans la variable <code>x</code> ; <code> x = a.pop()</code> enlève le dernier élément de la liste ; * <code>a.clear()</code> : vide la liste <code>a</code> ; * <code>a.sort()</code> : trie la liste par ordre croissant ; * <code>a.sort(reverse = True)</code> : trie par ordre décroissant ; * <code>a.reverse()</code> : inverse l'ordre de <code>a</code>. Pour supprimer l'élément à l'indice ''i'', au lieu d'utiliser <code>a.pop(i)</code>, on peut aussi utiliser <syntaxhighlight lang="python"> del(a[i]) </syntaxhighlight> Pour trier une liste, on peut aussi utiliser la fonction <code>sorted()</code>, ce qui permet par exemple de conserver la liste originale, non triée : <code>b = sorted(a)</code>. La fonction <code>sorted()</code> fonctionne avec tous les objets « itérables » comme par exemple une chaîne de caractères : <syntaxhighlight lang="python"> a = "ahjbfk" print(sorted(a)) # ['a', 'b', 'f', 'h', 'j', 'k'] </syntaxhighlight> Pour mettre en évidence la performance de la méthode <code>''list''.sort()</code> par rapport à la fonction générique <code>sorted()</code> : <syntaxhighlight lang="python"> import numpy as np import time a = np.random.rand(int(1e7)) t1 = time.perf_counter() b = sorted(a) # Fonction générique t2 = time.perf_counter() a.sort() # Méthode spécifique t3 = time.perf_counter() print("Sorted :", t2-t1, " s ; .sort :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # Sorted : 14.2... s ; .sort : 1.1... s ; rapport : 12.6... </syntaxhighlight> Par rapport à une valeur donnée : * <code>a.remove(x)</code> : retire la première occurrence de la valeur <code>x</code> de la liste <code>a</code> ; * <code>a.index(x)</code> : indique l'indice où se trouve la première occurrence de la valeur <code>x</code> ; * <code>a.count(x)</code> : indique le nombre de fois que l'on trouve la valeur <code>x</code> dans la liste <code>a</code>. === Définition en compréhension === La [[w:fr:Liste en compréhension|définition en compréhension]] ''({{lang|en|list comprehension}})'' est une méthode permettant de construire des listes en indiquant simplement des axiomes, des consignes de filtrage. Cette méthode est élégante car proche de la notation mathématique et compacte, mais c'est une méthode itérative donc lente par rapport à une méthode vectorisée fournie par le module NumPy. Par exemple, pour créer la liste des carrés des nombres entiers entre 0 et 9, il suffit d'écrire <syntaxhighlight lang="python"> carre = [x**2 for x in range(10)] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x^2 | x \in [0 ; 9] \}</math>. Si l'on veut la liste des nombres strictement inférieurs à 20 dont le carré est supérieur à 10, on peut écrire : <syntaxhighlight lang="python"> X = [x for x in range(20) if x**2 > 10] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x | x \in [0 ; 19], x^2 > 10 \}</math>. Pour mettre en évidence la performance du calcul vectorisé par rapport à la méthode itérative : <syntaxhighlight lang="python"> import time import numpy as np n = int(1e7) # taille de la liste t1 = time.perf_counter() carre = [x**2 for x in range(n)] # Définition en compréhension t2 = time.perf_counter() carre2 = np.arange(n)**2 # Calcul vectorisé t3 = time.perf_counter() print("En compréhension : ", t2-t1, "s ; vectorisé :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # En compréhension : 4.515... s ; vectorisé : 0.156... s ; rapport : 28.982... </syntaxhighlight> == Structure d'un programme == Un programme est simplement une suite d'instructions. Dans les environnements Unix BSD, un programme Python peut être considéré comme un script c'est-à-dire qu'il suffit de taper son nom dans l'invite de commande ''({{lang|en|shell}})'' sans avoir à invoquer <code>python</code>. Le programme doit alors commencer par un en-tête normalisé surnommé ''{{lang|en|[[wikt:shebang|shebang]]}}'' : <syntaxhighlight lang="python"> #!/usr/bin/env python3 </syntaxhighlight> Ce ''{{lang|en|shebang}}'' est inutile avec Jupyter. L'en-tête peut également contenir la description de l'encodage du fichier texte, typiquement : <syntaxhighlight lang="python"> # coding: utf-8 </syntaxhighlight> Le codage UTF-8 est le codage par défaut pour Python 3, il est donc inutile de l'indiquer. Les commentaires sont introduits par le croisillon <code>#</code>. On peut grouper une suite d'instructions dans un bloc. Un bloc d'instructions commence par deux-points « <code>:</code> » et est identé, c'est-à-dire qu'il a une marge constituée de quatre espaces — on peut aussi utiliser une tabulation mais il ne faut pas mélanger les deux méthodes ; les tabulations sont déconseillées, il vaut mieux utiliser quatre espaces<ref>{{lien web | url = https://www.python.org/dev/peps/pep-0008/#tabs-or-spaces | titre = Tabs or Spaces? | site = Python documentation | consulté le = 2019-03-14 }}</ref>. Pour terminer le bloc, il suffit simplement de revenir en début de ligne ; contrairement à d'autres langages, il n'y a pas de commende de fin ''({{lang|en|end}})'', c'est l'indentation qui définit le bloc. : # début du bloc ''instruction 1'' ''instruction 2'' … ''dernière instruction du bloc'' ''instruction hors bloc'' Par exemple, une exécution conditionnelle <code>if</code> ou une boucle <code>for</code> exécute un bloc d'instruction. Si l'on a besoin d'un bloc d'instruction qui « ne fait rien », on utilise l'instruction <code>pass</code>. == Structures de contrôle == '''Boucle itérative''' La boucle itérative s'écrit : <syntaxhighlight lang="python"> for <variable> in <itérable>: <bloc d’instructions> </syntaxhighlight> Si l'on veut que la variable prenne ''n'' valeurs de 0 à ''n'' – 1, on utilise l'instruction <code>range()</code> : <syntaxhighlight lang="python"> for i in range(5): print(i) print("Fin de la boucle") </syntaxhighlight> <code>[▶]</code> 0 1 2 3 4 Fin de la boucle En fait, la commande <code>range()</code> extrait des valeurs de l'ensemble des nombres entiers ; on peut ainsi utiliser le découpage en tranches, par exemple <code>range(2, 5)</code>pour avoir la « liste » <code>[2, 3, 4]</code>. Notez que <code>range()</code> ne crée pas à proprement parler une liste, cela crée un objet de type ''« {{lang|en|range}} »'' (plage, intervalle) ; pour avoir une liste, il faut écrire <code>list(range(n))</code>. Dans une boucle, la commande <code>continue()</code> saute la fin du bloc d'instruction et passe à la valeur suivante de la boucle. La commande <code>break()</code> interrompt la boucle et passe à la suite. '''Exécution conditionnelle''' L'exécution conditionnelle s'écrit : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> </syntaxhighlight> On peut utiliser les commandes <code>elif</code> ''(else if'') et <code>else</code> : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> elif <booléen>: <bloc d’instructions> else: <bloc d’instructions> </syntaxhighlight> Notez que le test d'une condition est gourmand en ressources. S'il s'agit de savoir si l'on effectue une opération mathématique simple ou pas, on peut remplacer le test par une multiplication par un booléen (<code>True</code> vaut 1, <code>False</code> vaut 0). Par exemple, plutôt que d'écrire <syntaxhighlight lang="python"> if a > 0: b = b - c </syntaxhighlight> mieux vaut écrire : <syntaxhighlight lang="python"> b = b - (a > 0)*c </syntaxhighlight> '''Boucle antéconditionnée''' La boucle antéconditionnée s'écrit : <syntaxhighlight lang="python"> while <booléen>: <bloc d’instructions> </syntaxhighlight> Cette boucle peut contenir des instructions <code>continue()</code> et <code>break()</code>. == Fonction == La déclaration d'une fonction utilise la commande <code>def</code>. La fonction est un bloc d'instructions. Si elle doit renvoyer des valeurs, on utilise la commande <code>return</code>. Par exemple <syntaxhighlight lang="python"> def nombres(n): """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo a = nombres(3) print(a) </syntaxhighlight> La fonction commence par une chaîne de caractères qui la décrit. Cette chaîne peut être récupérée automatiquement par certains logiciels pour faire une documentation automatique. Si la description prend plusieurs lignes, elle commence et finit par trois double-guillemets <code>"""…"""</code> ; en fait, par convention, même si cela n'est pas obligatoire, les descriptions sont toutes encadrées de trois double-guillemets. Cette description est appelée ''{{lang|en|docstring (documentation string)}}''. Pour récupérer les ''{{lang|en|docstrings}}'' : <syntaxhighlight lang="python"> def foo(): """Cette fonction ne fait rien""" pass print(foo.__doc__) # Cette fonction ne fait rien </syntaxhighlight> L'instruction <code>input()</code> permet à l'utilisateur de saisir une valeur. La valeur est retournée sous la forme d'une chaîne de caractères qui est ensuite convertie en nombre réel avec l'instruction <code>float()</code>. On peut définir une valeur par défaut en l'indiquant dans l'en-tête de la définition de la fonction, de la manière suivante : <syntaxhighlight lang="python"> def nombres(n=1): # valeur par défaut : 1 """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo </syntaxhighlight> Si le paramètre à initialiser est de type modifiable ''({{lang|en|mutable}})'', comme par exemple une liste, il faut procéder comme suit : <syntaxhighlight lang="python"> def fooFonction(fooListe=None): # valeur par défaut : n'existe pas """Description""" if fooListe = None: fooListe = [] # initialisation <suite des instructions> </syntaxhighlight> Par défaut, les variables sont locales. On peut rendre une variable globale avec l'instruction <code>global</code> ''à l'intérieur de la fonction'', avant l'utilisation de la variable. Par exemple : <syntaxhighlight lang="python"> a = 1 b = 1 def toto(): """Test de variable globale. Entrée : aucune. Sortie : aucune.""" global a a = 2 b = 2 toto() print("a =", a, "; b =", b) # a = 2 ; b = 1 </syntaxhighlight> Pour être plus précis : si une variable n'est pas assignée dans une fonction, alors Python va chercher une variable du même nom à l'extérieur de la fonction. Mais à partir du moment où la variable est assignée dans la fonction, elle devient locale ''sauf'' si l'on a utilisé l'instruction <code>global</code>. Si l'on s'attend à un nombre indéfini d'arguments, on utilise la notion d'empaquetage/dépaquetage ''({{lang|en|packing/unpacking}})''<ref>{{lien web | url = https://deusyss.developpez.com/tutoriels/Python/args_kwargs/ | titre = Introduction à *args et **kwargs | consulté le = 2019-03-09 | site = Developpez.com }}.</ref>. L'empaquetage consiste à mettre les arguments dans un n-uplet, le dépaquetage consiste à développer un n-uplet en plusieurs variables. Cela se fait en mettant un astérisque ''({{lang|en|splat}})'' « <code>*</code> » devant le nom de la variable. Par convention, on utilise le nom de variable <code>*args</code> mais cela n'est pas obligatoire. <syntaxhighlight lang="python"> def concatenation(*args): """Concatène des chaînes de caractères Entrée : *args, n-uplet de chaînes de caractères. Sortie : resultat, chaîne de caractères.""" resultat = "" for i in args: resultat = resultat + i return resultat concatenation("a", "foo", "toto") # 'afoototo' </syntaxhighlight> À l'inverse, si une fonction doit recevoir plusieurs paramètres, on peut à la place lui transmettre une liste à dépaqueter : <syntaxhighlight lang="python"> def addition(a, b): """Ajoute deux nombres Entrées : — a : réel ; — b : réel. Sortie : a+b, réel""" return a+b arg = (1, 2) addition(*arg) # 3 </syntaxhighlight> On peut aussi empaqueter/dépaqueter un dictionnaire, on utilise pour cela deux astérisques « <code>**</code> ». Par convention, on utilise le nom <code>**kwargs</code> sans que cela soit obligatoire. L'instruction <code>lambda</code> permet de créer de petites fonctions ne contenant pas de boucle ni de branchement conditionnel. Cependant, si la déclaration est courte et compacte, le code n'est pas toujours facilement lisible ; l'utilisation de cette instruction n'est pas recommandée. Par exemple l'expression <syntaxhighlight lang="python"> f = lambda x: 2*x </syntaxhighlight> est la même chose que <syntaxhighlight lang="python"> def f(x): """Calcule le double. Entrée : x, réel. Sortie : 2*x, réel.""" return 2*x </syntaxhighlight> {{note|L'instruction <code>eval()</code> exécute une chaîne de caractères, c'est-à-dire traite une chaîne de caractères comme si c'étaient des instructions données à Python. Cette instruction est à éviter pour deux raisons : # Un utilisateur malveillant pourrait entrer du code malveillant dans la chaîne de caractères. # L'exécution est lente puisque Python doit compiler la chaîne à la volée. Cette instruction peut en général être remplacée par une autre instruction. }} == Gestion des erreurs == Dans un bloc d'instructions, on peut utiliser la structure <code>try:… except:</code>. Le bloc après <code>try</code> est exécuté ; si une erreur se déclare dans ce bloc, alors le bloc <code>except</code> s'exécute. Par exemple <syntaxhighlight lang="python"> try: 1/0 # Génère une erreur except: print("Division par zéro") # Cette instruction est donc exécutée </syntaxhighlight> On peut compléter avec <code>else:</code> et <code>finally:</code> : <syntaxhighlight lang="python"> try: <code à exécuter> except: <s’exécute en cas d’erreur> else: <s’exécute s’il n’y a pas d’erreur> finally: <s’exécute dans tous les cas> </syntaxhighlight> On peut séparer les différents types d'erreur : <syntaxhighlight lang="python"> try: <code à exécuter> except ValueError: print("Valeur erronée") except TypeError: print("Type erroné") </syntaxhighlight> Les types d'erreur les plus courants sont : * <code>NameError</code> : le nom de variable n'existe pas ; * <code>TypeError</code> : la valeur n'est pas du bon type ; * <code>ValueError</code> : la valeur n'est pas compatible avec ce qui est attendu ; * <code>RuntimeError</code> : type d'erreur général. On peut aussi créer ses propres erreurs : si une situation erronée survient, on peut « lever » une exception avec <code>raise</code>. Par exemple <syntaxhighlight lang="python"> if a < 0: raise ValueError("La valeur doit être positive") </syntaxhighlight> ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/errors.html | titre = Errors and exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} * {{lien web | url = https://docs.python.org/3/library/exceptions.html | titre = Built-in Exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} == Exercices == === Calcul du PGCD et du PPCM par l'algorithme d'Euclide === {{loupe|w:Algorithme d'Euclide}} Écrire un programme Python qui demande deux nombres entiers et affiche leurs PGCD et PPCM. Le programme utilisera l'algorithme d'Euclide. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """Programme : euclide.py Auteur : User:cdang date : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : calcule le PGCD et le PPCM de deux nombres entiers. Entrée ------ au clavier, saisie de deux nombres entiers. Sorties ------- à l'écran, affichage du PGCD et du PPCM. """ # *************** # *************** # ** Fonctions ** # *************** # *************** def euclide(): """Calcule le PGCD et le PPCM avec l'algorithme d'Elclide Entrée ------ Aucune, la saisie des paramètres fait partie de la fonction Sortie ------ affichage du PGCD et du PPCM """ print("***** Algorithme d'Euclide *****\n") a0 = int(input("Premier nombre entier : a = ")) b0 = int(input("Second nombre entier : b = ")) a = a0 b = b0 r = a%b # initialisation while (r != 0) : # algorithme d'Euclide a = b b = r r = a%b # affichage des résultats print("PGCD(", a0, ", ", b0, ") = ", b) print("PPCM(", a0, ", ", b0, ") = ", a0*b0//b) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* euclide() </syntaxhighlight> On peut simplifier la boucle centrale : <syntaxhighlight lang="python"> while b: # s'exécute tant que b n'est pas 0 a, b = b, a % b # affectation de liste à liste return a </syntaxhighlight> {{boîte déroulante fin}} Notez que le module NumPy propose l'instruction <code>gcd()</code> : <syntaxhighlight lang="python"> import numpy … print(numpy.gcd(a, b)) </syntaxhighlight> === Tours de Hanoï === {{loupe|w:Tours de Hanoï}} Écrire un programme Python qui demande le nombre ''n'' de plateaux et affiche les manipulations nécessaires pour déplacer la pile d'un emplacement à un autre. Le programme utilisera l'algorithme récursif. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """nom : hanoi.py auteur : User:cdang date de création : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : résout le problème des tours de Hanoï Entrées ------- trois chaînes de caractères (nom des piliers) Sorties ------- une chaîne de caractères (liste des opérations) """ # *************** # *************** # ** Fonctions ** # *************** # *************** def hanoi(a, b, c, n): """Résout le problème des tours de Hanoï de manière récursive But : déplace la pile de n disques du piler a au pilier b Entrées ------- a, b c : chaînes de 1 caractère, référence des emplacements ; n : entier, nombre de disques sur l'emplacement a Sorties ------- operations : chaînes de caractères décrivant les opérations """" if n>1: operations = hanoi(a, c, b, n-1) operations = operations+a+"→"+b+" ; " operations = operations+hanoi(c, b, a, n-1) else: operations = a+"→"+b+" ; " return operations # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* resultat = hanoi("1", "2", "3", 3) print(resultat) </syntaxhighlight> {{boîte déroulante fin}} === Lancer de rayons === [[Fichier:Lentille hemispherique perspective.svg|vignette|Lentille hémisphérique.]] Considérons une lentille hémisphérique de rayon R faite d’un verre d’indice de réfraction ''n''. Nous plaçons une source ponctuelle à une distance ''d'' du dioptre plan, sur l’axe optique. Tracer des rayons partant de la source et traversant la lentille. {{clear}} {{Boîte déroulante/début |titre=Analyse d’optique géométrique}} [[Fichier:Lentille hemispherique analyse geometrique.svg|vignette|Analyse géométrique du problème.]] Il s’agit d’un problème ayant une symétrie de révolution par rapport à l’axe optique. Nous pouvons nous réduire à un problème plan en nous plaçant dans un plan contenant l’axe optique ; l’axe optique est encore un axe de symétrie orthogonale, nous pouvons donc nous contenter d'étudier un demi-plan. Pour simplifier, nous plaçons le centre du dioptre sphérique à l’origine O du repère. L’axe optique est l’axe ''x'' et l'axe perpendiculaire, vertical sur la figure, c’est l’axe ''y''. Les coordonnées de la source sont donc (-''d'' ; 0). Le rayon issu de la source et faisant un angle θ avec l’axe ''x'' frappe le dioptre plan à l’altitude ''h''. Nous avons : : ''h'' = ''d'' ⋅ tan θ. L’angle d’incidence vaut θ. D’après la loi de Snell-Descartes, l'angle de réfraction θ<sub>2</sub> vaut : : θ<sub>2</sub> = arcsin((sin θ) / ''n''). Le rayon réfracté passe par le points de coordonnées (0, ''h''). L’équation de la droite est donc : : ''y'' = a ⋅ ''x'' + ''h'' avec : ''a'' = tan θ<sub>2</sub>. L’équation du cercle de centre O et de rayon R est : : ''x''<sup>2</sup> + ''y''<sup>2</sup> = R<sup>2</sup>. Les coordonnées (''x''<sub>M</sub>, ''y''<sub>M</sub>) de l’intersection M du rayon avec le dioptre sphérique vérifient les deux équations. Par substitution, nous obtenons une équation du second degré en ''x'' que nous savons résoudre : : ''x''<sub>M</sub><sup>2</sup> + (''a'' ⋅ ''x''<sub>M</sub> + ''h'')<sup>2</sup> = R<sup>2</sup> : ⇔ (1 + ''a''<sup>2</sup>) ⋅ ''x''<sub>M</sub><sup>2</sup> + 2 ⋅ ''a'' ⋅ ''h'' ⋅ ''x''<sub>M</sub> + ''h''<sup>2</sup> – R<sup>2</sup> = 0. D’après les propriétés du cercle, le rayon est perpendiculaire à la tangente. Le rayon [OM] est donc normal au dioptre en M. Nous pouvons déterminer l’angle d’incidence θ<sub>i</sub> par le produit scalaire : : <math>\begin{pmatrix} 1 \\ a \end{pmatrix} \cdot \begin{pmatrix} x_\mathrm{M} \\ y_\mathrm{M} \end{pmatrix} = \sqrt{1^2 + a^2} \cdot \mathrm{R} \cdot \cos(\theta_\mathrm{i})</math> ce qui nous permet de calculer cet angle : : <math>\theta_\mathrm{i} = \operatorname{arcos} \left ( \frac{x_\mathrm{M} + a \cdot y_\mathrm{M}}{\mathrm{R} \cdot \sqrt{1^2 + a^2} } \right )</math> Comme nous passons vers un milieu d’indice plus faible, il y a un risque de réflexion totale. L’angle limite est : : θ<sub>max</sub> = arcsin(1/''n''). Si l’on a θ<sub>i</sub> &gt; θ<sub>max</sub>, le rayon repart vers l’intérieur. Nous ne traçons pas le rayon car cela nous emmènerait trop loin dans l’analyse. En revanche, si θ<sub>i</sub> ≤ θ<sub>max</sub>, alors nous pouvons appliquer la loi de Snell-Descartes pour avoir l’angle de réfraction θ<sub>e</sub> : : θ<sub>e</sub> = arcsin(''n'' ⋅ sin θ<sub>i</sub>). Pour tracer le rayon sortant, il nous faut l’angle θ<sub>3</sub> par rapport à l’horizontale. L’angle du rayon [OM] par rapport à l’horizontal vaut arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>), nous avons donc : θ<sub>3</sub> = arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>) + θ<sub>e</sub>. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Analyse algorithmique}} '''Structure des données''' Le problème est décrit par trois paramètres : # Le rayon <code>R1</code> de la lentille, en milliètres (réel en virgule flottante). # L’indice du verre, <code>n</code> sans dimension (réel en virgule flottante). L’indice de l’air vaut 1. # La distance de la source au dioptre d’entrée plan, <code>d</code> en millimètres (réel en virgule flottante). Un rayon est caractérisé par quatre paramètres : # L’angle d’émission <code>theta1</code> en radians (réel en virgule flottante). # L’angle de réfraction dans la lentille <code>theta2</code> en radians (réel en virgule flottante). # Les cordonnées <code>M</code> en millimètre (vecteur de dimension 2 <code>([x, y])</code> de réels en virgule flottante) du point d’intersection du rayon avec le dioptre sphérique. # L’angle de réfraction dans l’air après la lentille <code>theta3</code> en radians (réel en virgule flottante). Pour le calcul et le tracé, nous avons besoin des paramètres intermédiaires suivants : * l’altitude ''y'' = <code>h</code> en millimètres (réel en virgule flottante) à laquelle le rayon frappe le dioptre plan d’entrée ; * l’angle d’incidence du rayon avec le dioptre sphérique <code>thetaint</code> en radians (réel en virgule flottante). Les angles sont stockés en radians car c’est l’unité naturelle pour le calcul mais nous affichons les valeurs en degrés. Comme le calcul de conversion est récurrent, nous conservons les facteurs <code>degversrad</code> (conversion des degrés vers les radians, facteur valant π/180, réel en virgule flottante) et <code>radversdeg</code> (conversion des radians vers les degrés, facteur valant 180/π, réel en virgule flottante). '''Fonctions''' Nous avons besoin d’une fonction qui calcule les trois paramètres du rayon <code>(theta2, M, theta3)</code> à partir de l’angle d’émission <code>theta1</code>. Nous appelons cette fonction <code>lanceRayon()</code>. Cette fonction fait appelle à une fonction qui calcule l’angle du rayon réfracté à partir de l’angle du rayon incident <code>theta1</code>, les deux angles étant par rapport à la normale au dioptre au point considéré. Nous appelons cette fonction <code>refrac()</code>. La recherche de l’intersection <code>M</code> du rayon avec le dioptre sphérique nécessite de résoudre une équation du second degré. Nous utilisons pour cela la recherche des racines du polynôme en <code>x</code> avec la fonction <code lang="python">numpy.polynomial.polynomial.polyroots()</code>. D’après la configuration du problème géométrique, si l’on s’assure que le rayon frappe bien la lentille (0 ≤ <code>h</code> ≤ <code>R1</code>) alors nous sommes sûrs que le problème a deux solutions réelles (une positive et une négative) ou, dans le cas dégénéré où <code>h == R1</code>, une valeur unique <code>x == 0</code>. Comme nous recherchons la valeur positive, nous sélectionons la plus grande des deux racines. Pour la gestion de la réflexion interne : dans la fonction <code>refrac()</code>, nous vérifions les conditions de réflexion totale et si elles sont remplies, alors nous générons une erreur (commandes <code lang="python">try… except</code> et <code lang="python">raise ValueError</code>). Cette erreur est propagée à la fonction <code>lanceRayon()</code> : <code>lanceRayon()</code> appelle la fonction <code>refrac()</code> et si cette fonction renvoie une erreur, alors <code>lanceRayon()</code> renvoie également une erreur. Pour trouver l’angle d’émission <code>thetaLimite</code> provoquant la réflexion totale (en radians, réel en virgule flottante), nous effectuons une recherche par dichotomie : * nous partons de l’angle maximum possible, lorsque le rayon frappe le sommet de la lentille, et nous appelons la fonction <code>lanceRayon()</code> ; si cela ne génère pas d’erreur, alors nous pouvons aller jusqu’à cette valeur, la recherche est terminée ; si cela génère une erreur, alors nous divisons la valeur par deux ; * à une étape de la recherche donnée, si <code>lanceRayon()</code> ne génère pas d’erreur avec l’angle testé, alors nous savons que l’angle limite est supérieur à cette valeur ; cette valeur minore donc la valeur recherchée ; si au contraire <code>lanceRayon()</code> génère une erreur, alors c’est que l’angle est trop important, cette valeur majore donc la valeur recherchée ; nous pouvons ainsi resserer l’intervalle de recherche ; * nous nous arrêtons lorsque les valeurs haute et basse sont suffisamment proche. Concrètement : # Nous définissons une variable <code>angleHaut</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus bas connu provoquant la réflexion totale. # Nous définissons une variable <code>angleBas</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus haut connu ne provoquant pas de réflexion totale. Sa valeur initiale est 0. L’angle limite recherché est donc entre <code>angleBas</code> et <code>angleHaut</code>. # Nous définissons l’angle <code>angleTest</code> comme étant la moyenne entre <code>angleBas</code> et <code>angleHaut</code>. Si <code>lanceRayon(angleTest)</code> génère une erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleHaut</code> (puisque c’est une valeur provoquant la réflexion totale et qu’elle est plus basse que la valeur actuelle d’<code>angleHaut</code>). À l’inverse, si <code>lanceRayon(angleTest)</code> ne génère pas d’erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleBas</code> (puisque c’est une valeur ne provoquant pas la réflexion totale et qu’elle est plus haute que la valeur actuelle d’<code>angleBas</code>). # Nous arrêtons la procédure lorsque l’écart entre <code>angleBas</code> et <code>angleHaut</code> est inférieur à {{unité|10|échelle=<sup>–3</sup>|rad}} (valeur arbitraire). La valeur retenue est la valeur finale d’<code>angleBas</code> (puisque l’on veut être sûr qu’il n’y ait pas de réflexion totale). La valeur affichée est la valeur en degrés arrondie au dixième. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Solution}} Nous demandons à l’utilisateur ou à l’utilisatrice les valeurs des paramètres du problème : rayon de la lentille, distance de la source, indice de réfraction du verre. Nous vérifions que les valeurs entrées sont bien des nombres ; si c’est une chaîne vide, alors nous utilisons une valeur par défaut. Nous créons une fonction <code>refrac()</code> qui permet de calculer l’angle réfracté à partir de l’angle d’incidence et des indices de réfraction. S’il y a rélexion totale, alors nous générons une erreur. La fonction <code>lanceRayon()</code> calcule les différents points de passage du rayon. Elle appelle pour cela la fonction <code>refrac()</code>. Si un appel de la commande <code>refrac()</code> génère une erreur, alors nous générons également une erreur. Nous déterminons l’angle d’émision du rayon <code>thetaLimite</code> qui provoque une réflecxion totale. Pour cela, nous créons une fonction <code>rechercheLimite()</code> qui cherche par dichotomie. Nous traçons un rayon tous les 5° jusqu’à la valeur limite. <syntaxhighlight lang="python"> #!/usr/bin/env python3 # coding: utf-8 """nom : lancerRayons.py auteur : User:cdang date de création : 2022-05-06 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : NumPy, matplotlib ---------------------------------------------------------------------------- Objectif : trace des trajets optique avec une lentille hémisphérique Entrées ------- Le rayon de la lentille, la distance de la source, l’indice de réfraction du verre, trois chaînes de caractères saisies par l’utilisateur·rice et qui sont converties en réels. Sorties ------- La valeur limite de l’angle (réel) et le tracé de plusieurs rayons. """ # ****************************************************** # ****************************************************** # ** Lancer de rayons pour une lentille hémisphérique ** # ****************************************************** # ****************************************************** import numpy as np import matplotlib.pyplot as plt import numpy.polynomial.polynomial as nppol # ************** # * Constantes * # ************** # Pour la conversion degrés ↔ radians radversdeg = 180/np.pi degversrad = 1/radversdeg # ************* # * Fonctions * # ************* def boucleEntreeNombre(messageSaisie, valeurDefaut): """Permet de s’assurer que l’utilisateur·rice a bien entré un nombre. Entrée : — message à afficher (chaîne de caractères) ; — valeur par défaut (réel à virgule flottante). Sortie : nombre (réel à virgule flottante).""" messageErreur = "Veuillez entrer une valeur numérique (ou vide pour accepter la valeur par défaut).\n" execute = True while execute: strNombre = input(messageSaisie+f" (valeur par défaut {valeurDefaut}) : ") if strNombre == "": nombre = valeurDefaut execute = False else: try: nombre = float(strNombre) except: print(messageErreur) else: execute = False return nombre def initialisation(): """L’utilisateur·rice entre les variables du problème. Entrées : aucune. Sorties : — R1 (mm) : rayon de la lentille ; — d (mm) : distance de la source au dioptre plan ; — n (sans dimension) : indice de réfraction du verre.""" R1 = boucleEntreeNombre("Rayon de la lentille en mm", 20.0) d = boucleEntreeNombre("Distance de la source au dioptre plan en mm", 20.0) n = boucleEntreeNombre("Indice de réfraction (sans dimension)", 1.5) return (R1, d, n) def refrac(n1, n2, theta1): """Calcule l’angle de réfraction theta2 (radians) en fonction — de l’angle d’incidence theta1 (radians); — de l’indice de réfraction n1 du premier milieu ; — de l’indice de réfraction n2 du second milieu.""" reflexionTotale=False rapport=n2/n1 rapportinv=np.reciprocal(rapport) if n1 > n2: thetal = np.arcsin(rapport) # angle limite pour la réflexion totale if theta1 >= thetal: reflexionTotale=True if reflexionTotale: print("Réflexion totale") raise ValueError else: return np.arcsin(rapportinv*np.sin(theta1)) def lanceRayon(n1, n2, d, R, theta1): """Détermine le rayon issu de la source située à une distance d (mm) du bareau et avec une élévation de theta1 (radians), en fonction des indices de réfraction n1 et n2. Les éléments retournés sont : — la hauteur h (mm) à laquelle le rayon frappe le barreau ; — l’angle de réfraction theta2 (radians)) dans le barreau ; — l’angle de réfraction theta3 (radians) à la sortie du barreau — le point M(x, y) (mm) auquel le rayon sort du barreau.""" h = d*np.tan(theta1) if h >= R: print("Le rayon est au-dessus du barreau") raise ValueError else: theta2 = refrac(n1, n2, theta1) a = np.tan(theta2) x = max(nppol.polyroots([h*h - R*R, 2*a*h, 1+a*a])) # recherche de l’intersection du rayon avec le cercle y = a*x + h M = np.array([x, y]) thetaint = np.arccos((x + a*y)/(R*np.sqrt(1 + a*a))) theta3 = np.arctan(y/x) - refrac(n2, n1, thetaint) return (h, theta2, theta3, M) def rechercheLimite(n1, n2, d, R): """Recherche l’angle limite pour la réflexion totale. Entrée : — indice de réfraction des milieux 1 et 2, n1 et n2 ; — distance au barreau, d(mm). Sortie : angle limite theta (radians)""" angleHaut = np.arctan(R/d) angleBas = 0 angleTest = angleHaut try: lanceRayon(n1, n2, d, angleTest, R) except: condition = True # il y a réflexion total en haut de la lentille else: condition = False # il n’y a jamais réflexion totale dans la lentille while condition: #dichotomie angleTest = np.mean([angleHaut, angleBas]) # on ajuste la valeur de test try: lanceRayon(n1, n2, d, R, angleTest) except: angleHaut = angleTest # réflexion totale : on abaisse la valeur maximale else: angleBas = angleTest # pas de réflexion totale : on monte la valeur minimale condition = ((angleHaut - angleBas) >= 0.001) # on a cerné la limite à 0,001 rad près if not condition: angleTest = angleBas return angleTest # *********************** # * Programme principal * # *********************** (R1, d, n) = initialisation() xmax = round(R1 + d) thetaLimite = rechercheLimite(1, n, d, R1) thetaLimiteDeg = thetaLimite*radversdeg print(f"Angle limite pour la réflexion totale : {thetaLimiteDeg:.1f}°.\n") anglesDeg = np.arange(0, thetaLimiteDeg, 5)[1:] # trace un rayon tous les 5° anglesRad = anglesDeg*degversrad nb = len(anglesDeg) h = np.zeros(nb) # initialisation des vecteurs de valeurs theta2 = np.zeros(nb) theta3 = np.zeros(nb) M = np.zeros((nb, 2)) for i in range(nb): (h[i], theta2[i], theta3[i], M[i, :]) = lanceRayon(1, n, d, R1, anglesRad[i]) (h_lim, theta2_lim, theta3_lim, M_lim) = lanceRayon(1, n, d, R1, thetaLimite) # tracé anglesCercle = 0.5*np.pi*(np.linspace(1, 0, 20)) x_cercle = R1*np.cos(anglesCercle) # coordonnées des pints du cercle y_cercle = R1*np.sin(anglesCercle) fig = plt.plot([-d,xmax], [0, 0], "k-.", linewidth="0.5") # tracé de l’axe optique for i in range(nb): plt.plot([-d, 0, M[i, 0], xmax], [0, h[i], M[i, 1], M[i, 1] + (xmax - M[i, 0])*np.tan(theta3[i])], label=f"{anglesDeg[i]:.0f}°") plt.plot([-d, 0, M_lim[0], xmax], [0, h_lim, M_lim[1], M_lim[1] + (xmax - M_lim[0])*np.tan(theta3_lim)], label=f"{0.1*int(np.trunc(10*thetaLimite*radversdeg)):.1f}°") plt.plot(x_cercle, y_cercle, "k", linewidth="0.5") # tracé du cercle plt.plot([0,0], [0, R1], "k", linewidth="0.5") # tracé du premier dioptre #plt.axis("square") plt.gca().set_aspect("equal", adjustable="box") plt.xlabel("x (mm)") plt.ylabel("y (mm)") plt.title("Lentille hémisphérique, lancer de rayons") plt.legend() plt.savefig("lentille_hemispherique_lancer_rayon.svg", format="svg") plt.show() </syntaxhighlight> {{Boîte déroulante/fin}} == Mesurer le temps == Le module <code>time</code> fournit les fonctions suivantes : * <code>time.gmtime()</code> : renvoie la date et l'heure du méridien de Greenwich (''{{lang|en|Greenwich mean time}}'', GMT), sous la forme d'un dictionnaire (année, mois, jour du mois, heure, minute, seconde, jour de la semaine, jour de l'année, heure d'été/hiver), ** jour de la semaine est un entier entre 0 (lundi) et 6 (dimanche), ** jour du mois est un entier entre 1 et 366 ; * <code>time.localtime()</code> : comme le précédent, mais l'heure est l'heure locale ; * <code>time.time()</code> : donne le nombre de seconde qui se sont écoulées depuis le 1er janvier 1970 ; * <code>time.gmtime(n)</code> et <code>time.localtime(n)</code> transforment un nombre de secondes (écoulées depuis le 1er janvier 1970) en une date au format (année, mois, jour, etc.), n-uplet de neuf valeurs ; <code>time.mktime()</code> fait le contraire, il transforme un n-uplet de neuf valeurs (années, mois, jour, etc.) en un nombre de secondes (écoulées depuis le 1er janvier 1970) ; * <code>time.sleep(n)</code> : provoque une pause dans le déroulement du programme de ''n'' secondes ; * <code>time.perf_counter()</code> : indique une date en seconde ; s'utilise pour mesurer la durée d'exécution d'une partie du code, en faisant la différence entre deux relevés. Concernant la date et l'heure sous la forme d'un n-uplet, on peut extraire l'heure de la manière suivante : <syntaxhighlight lang="python"> import time a = time.localtime() print("Il est ", a[3], "h", a[4]) # ou bien print("Il est ", a.tm_hour, "h", a.tm_min) </syntaxhighlight> Pour mesurer la performance d'une portion de code : <syntaxhighlight lang="python"> import time t1 = time.perf_counter() <suite d’instructions> t2 = time.perf_counter() print("Durée d'exécution :", t2-t1 </syntaxhighlight> == Programmation orientée objet == Nous n'allons pas ici faire un cours de programmation orientée objet (POO), nous allons aborder le sujet de manière pragmatique. De manière schématique, un « objet » est une « super-variable ». Cette super-variable peut contenir plusieurs variables, appelées « attributs » ; elle contient en fait un dictionnaire (paires « nom d'attribut : valeur d'attribut »). Elle peut aussi contenir des fonctions spécifiques appelées « méthodes ». De même qu'une variable a un type, un objet fait partie d'une « classe ». La classe est le modèle de l'objet ; en franglais informatique, on dit que l'objet est une instance de la classe. La POO est donc un formalisme : lorsque l'on définit des variables et des fonctions concernant un même type d'objet (au sens commun du terme), on les empaquette dans une classe. Il faut donc d'abord définir la classe, puis attribuer cette classe à un objet (« instancier » la classe). Considérons par exemple que nous voulons travailler sur des [[w:Engrenage|engrenages]] ; pour simplifier, nous nous contentons d'engrenages à dentures droites. Une roue dentée, un pignon, est essentiellement définie par son nombre de dents Z et par son module ''m'' qui correspond à la largeur de dents<ref>ainsi que par son épaisseur ''e'' et le matériau dont elle est faite mais nous allons négliger ces paramètres pour la simplicité de l'étude.</ref>. Nous allons définir trois méthodes : la méthode <code>.diametrePrimitif()</code> qui calcule le diamètre primitif de la roue dentée, <code>.pas()</code> qui calcule la largeur des dents au niveau du cercle primitif et <code>.rapport()</code> qui calcule le rapport de transmission de deux roues engrenées Z<sub>1</sub>/Z<sub>2</sub>. La méthode <code>.rapport()</code> vérifie par ailleurs que les roues ont le même module, condition indispensable pour former un engrenage. Nous définissons la classe ainsi : <syntaxhighlight lang="python"> class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): # instructions lancées lors de la déclaration """Valeurs des attributs""" self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z </syntaxhighlight> Nous remarquons que lorsque nous déclarons les méthodes, le paramètre <code>self</code> correspond à l'objet lui-même. Ainsi, dans la méthode <code>.rapport()</code>, la variable <code>self.Z</code> est le nombre de dents de la roue elle-même et <code>roueDentee.Z</code> est le nombre de dents de la roue passée en paramètre. Pour déclarer les roues, nous écrivons : <syntaxhighlight lang="python"> roue1 = pignon() # attribution de la classe, « instanciation » roue1.Z = 13 # définition des caractéristiques du pignon « roue1 » roue1.m = 2 roue2 = pignon(16, 2) # manière alternative </syntaxhighlight> Nous pouvons alors utiliser les objets de la manière suivante : <syntaxhighlight lang="python"> print(roue1.Z) # 13 print(roue1.diametrePrimitif()) # 26 R = roue1.rapport(roue2) # 0.8125 </syntaxhighlight> La commande <code>dir(a)</code> affiche tous les attributs et méthodes de l'objet <code>a</code>. ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/classes.html | titre = Classes | site = Python documentation | consulté le = 2019-03-08 }} == Interface graphique avec Tk == Une interface graphique utilisateur (GUI, ''{{lang|en|graphic user interface}}'') est un ensemble de boîtes permettant d'interagir avec l'utilisateur, c'est-à-dire qui permettent la saisie d'informations, l'exécution d'actions et l'affichage d'informations. L'interface se compose d'éléments appelés ''{{lang|en|widgets}}''. Les éléments ''({{lang|en|widgets}})'' classiques sont : * boîte de dialogue ''({{lang|en|dialog box}})'' : fenêtre contenant d'autres éléments ; * étiquette ''({{lang|en|label}})'' : texte affiché ; * liste déroulante ''({{lang|en|drop-down list}})'' : zone permettant le choix d'une option, la liste se déployant lorsque l'on clique sur la zone ; * zone de texte, champ de saisie ''({{lang|en|text box}})'' : zone permettant de taper du texte ; * boîte combinée ''({{lang|en|combo box}})'' : zone de saisie de texte contenant une liste déroulante qui permet de choisir des éléments prédéfinis ; * bouton ''({{lang|en|button}})'' : objet effectuant une action lorsque l'on clique dessus ; * case à cocher ''({{lang|en|checkbox, tickbox}})'' : objet permettant d'activer ou de désactiver une option lorsque l'on clique dessus ; * bouton radio, case d'option ''({{lang|en|radio button}})'' : objet permettant d'activer une option en désactivant les autres options ; une seule option peut être activée à la fois. Plusieurs modules permettent de gérer les interfaces graphiques. Nous choisissons ici le module développé sur la bibliothèque Tk qui est une bibliothèque multiplateforme. Pour cela, nous importons le module <code>tkinter</code> ainsi que le module <code>ttk</code>, ce dernier proposant des options plus « modernes » : <syntaxhighlight lang="python"> import tkinter as tk from tkinter import ttk </syntaxhighlight> Voici un programme permettant comme précédemment de calculer le rapport de transmission d'un engrenage. Nous détaillons sa construction ci-après. <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: IUrapport.set(valeurZ2/valeurZ1) except: IUrapport.set("erreur") # ************************* # ************************* # ** Interface graphique ** # ************************* # ************************* # fenetre principale fenetre = tk.Tk() fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> '''Explications''' Nous commençons par définir la boîte de dialogue que nous appelons <code>fenetre</code> ; c'est un objet <code>Tk</code> et nous lui donnons un titre « » : <syntaxhighlight lang="python"> fenetre = tk.Tk() fenetre.title("Rapport de réduction") </syntaxhighlight> Puis, nous définissons un cadre attaché à cette fenêtre et qui va nous permettre « d'accrocher » les autres éléments, ce qui permet de garder une apparence satisfaisante lorsque l'on retaille la fenêtre : <syntaxhighlight lang="python"> cadre = ttk.Frame(fenetre) </syntaxhighlight> Le cadre va comporter six lignes ''({{lang|en|row}})'' et deux colonnes ''({{lang|en|column}})''. Nous allons placer une étiquette ''({{lang|en|label}})'' « z1 » : <code>text="z1"</code>. Cette étiquette se trouve dans une case du cadre, celle de la première colonne et la première ligne : <code>grid(column=1, row=1)</code>. Par rapport à cette case, elle est collée à « l'ouest » (W, ''{{lang|en|west}}'', gauche) de la case : <code>sticky=tk.W</code>. <syntaxhighlight lang="python"> z1_label = ttk.Label(cadre, text="z1") # Création de l'étiquette z1_label.grid(column=1, row=1, sticky=tk.W) # Placement de l'étiquette </syntaxhighlight> Notez que l'on aurait pu écrire directement : <syntaxhighlight lang="python"> ttk.Label(cadre, text="z1").grid(column=1, row=1, sticky=tk.W) </syntaxhighlight> mais le fait de séparer la création de l'élément et son placement facilite la maintenance (recherche d'erreur, évolution du code). Pour tout ce qui est dynamique, c'est-à-dire les zone de saisie des valeurs et l'affichage du résultat, il faut définir des « chaînes variables » ''({{lang|variable strings}})'' : <syntaxhighlight lang="python"> IUz1 = tk.StringVar() </syntaxhighlight> Cette variable est une variable globale à la création. Nous pouvons alors placer la zone de saisie ''({{lang|en|entry}})'' à côté de l'étiquette lui correspondant. Nous nommons la zone de saisie <code>z1_entry</code> : <syntaxhighlight lang="python"> z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) </syntaxhighlight> Nous faisons de même pour les trois autres paramètres de l'engrenage, ''m''<sub>1</sub>, ''z''<sub>2</sub> et ''m''<sub>2</sub>. Le résultat est également une chaîne variable globale. Par rapport à notre mise en page, elle se situe dans la case colonne 2 ligne 5, centrée sur cette case (collé à l'est et à l'ouest) : <syntaxhighlight lang="python"> rapport = tk.StringVar() rapport_dynamique = ttk.Label(cadre, textvariable=rapport) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) </syntaxhighlight> Il nous faut encore définir une fonction de manière classique, nous l'appelons « calcule ». Les variables étant globales, on les utilise directement. On récupère les valeurs avec la méthode <code>get()</code> et nous modifions la valeur avec la méthode <code>set()</code> : <syntaxhighlight lang="python"> def calcule(): valeurZ1 = float(IUz1.get()) valeurZ2 = float(IUz2.get()) IUrapport.set(valeurZ2/valeurZ1) </syntaxhighlight> Cette fonction est déclenchée lorsque l'on clique sur le bouton « Calcul » situé dans la case du cadre ligne 6 colonne 2 : <syntaxhighlight lang="python"> bouton = ttk.Button(cadre, text="Calcul", command=calcule) bouton.grid(column=2, row=6, sticky=tk.W) </syntaxhighlight> ou bien si l'on appuie sur la touche <code>[entrée]</code> du clavier : <syntaxhighlight lang="python"> fenetre.bind("<Return>", calcule) </syntaxhighlight> À tout ceci, nous ajoutons des « gouttières » (marges, ''{{lang|en|paddings}}'') afin d'espacer les éléments. Il faut ensuite « activer » la fenêtre pour qu'elle s'affiche. La méthode est <code>mainloop()</code> (boucle principale) : « boucle » (elle est active en permanence et attend des actions sur ses éléments), <syntaxhighlight lang="python"> fenetre.mainloop() </syntaxhighlight> Nous avons ci-dessus mis la plupart du code en programme principal. Nous pouvons aussi programmer de manière fonctionnelle, en mettant la plupart du code dans des fonctions ; cependant, pour que la fenêtre et les variables dynamiques soient globales à tout le programme, elles doivent être déclarées dans le programme principal. Nous pouvons aussi mêler la programmation orientée objet. {{boîte déroulante début|Calcul du rapport de transmission en programmation fonctionnelle et orientée objet}} <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # ************* # ************* # ** Classes ** # ************* # ************* class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): """Valeurs des attributs""" # instructions lancées lors de la déclaration self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z # ************************ # ************************ # ** Variables globales ** # ************************ # ************************ # fenetre principale fenetre = tk.Tk() # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: roue1 = pignon(valeurZ1, valeurM1) roue2 = pignon(valeurZ2, valeurM2) IUrapport.set(roue1.rapport(roue2)) except: IUrapport.set("Erreur") # *********************** # * Interface graphique * # *********************** def configureFenetre(): """Configuration de la fenêtre principale""" fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* configureFenetre() # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> {{boîte déroulante fin}} == Annotations == Une annotation est un commentaire qui sert à expliciter un type de variable. La syntaxe est différente des commentaires « classiques » : cela permet d'avoir un affichage différent avec les éditeurs de texte ayant une coloration syntaxique, et ces informations peuvent être récupérées par des logiciels extérieurs pour effectuer une documentation automatique ou bien des vérifications de type. Cependant : * comme les commentaires normaux, ils n'ont aucune influence lors de l'exécution du texte ; en particulier : * rien n'oblige à annoter les variables ; * il est possible d'avoir une variable ayant un type différent de son annotation ; le fait de pouvoir définir et changer le type de variable à la volée est une fonctionnalité fondamentale de Python. La syntaxe pour une annotation est : : nom_de_variable + deux-points + espace + type par exemple : <syntaxhighlight lang="python"> a: int </syntaxhighlight> Notez qu'ici, la variable n'est ''pas'' créée. Pour la créer, il faut lui affecter une valeur. Il est possible de l'affecter après ou bien sur la même ligne avec la syntaxe : : nom_de_variable + deux-points + espace + type + espace + égal + espace + valeur par exemple : <syntaxhighlight lang="python"> a: int a = 5 # est équivalent à a: int = 5 </syntaxhighlight> Même si l'annotation n'a pas d'impact sur l'exécution, le type doit être un type existant sinon cela génère une erreur de syntaxe. Les types classiques sont : : <code>int</code> — <code>float</code> — <code>str</code> — <code>bool</code> — <code>list</code> — <code>tuple</code> — <code>dict</code> Il est également possible de mettre une chaîne de caractères : <syntaxhighlight lang="python"> a: "ce que je veux" = 3.1516 </syntaxhighlight> On peut annoter une fonction. Il est possible d'annoter les variables déclarées au sein de la fonction, mais pas les variables globales (puisqu'elle ne sont pas définie au sein de la fonction). On peut aussi annoter : * les variables passées en paramètre, avec la même syntaxe dans les parenthèses ; * annoter le type de la variable de sortie (retournée) en la faisant précéder de <code>-&gt;</code> : <syntaxhighlight lang="python"> def plusCinq(a: float = 0) -> float: return a + 5 </syntaxhighlight> ; Ressources * {{lien web | url = https://www.python.org/dev/peps/pep-0526/ | titre = PEP 526 -- Syntax for Variable Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} * {{lien web | url = https://www.python.org/dev/peps/pep-3107/ | titre = PEP 3107 -- Function Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} == Décorateur == Un décorateur est une fonction qui s'applique à une fonction, à la manière de la composition mathématique ''g'' ∘ ƒ = ''g''(ƒ). Mais cette composition affecte la fonction elle-même ; l'utilisateur appelle la fonction ƒ mais c'est la fonction ''g'' ∘ ƒ qui s'exécute. Cette fonction ''g'' est appelée le décorateur. L'intérêt est de pouvoir modifier une fonction sans modifier le code de la fonction elle-même. Pour appliquer une décoration, il faut : # Déclarer le décorateur : une fonction qui s'applique à une autre fonction. # Affecter le décorateur à la fonction visée : en mettant <code>@''décoration''</code> juste avant la définition de la fonction. Par exemple : <syntaxhighlight lang="python"> def decorateur(f): print("Avant la fonction") f() print("après la fonction") @decorateur def afficheFoo(): print("Foo.") afficheFoo # Avant la fonction # Foo. # Après la fonction </syntaxhighlight> Lorsque l'on appelle <code>afficheFoo</code>, on appelle en fait <code>decorateur(afficheFoo)</code>. Si la fonction à modifier admet des paramètres, il faut définir une fonction enveloppante dans le décorateur. Par exemple, nous définissons ci-dessous un décorateur <code>deuxFois()</code> qui fait s'exécuter deux fois de suite la fonction : <syntaxhighlight lang="python"> def deuxFois(f): def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # conteneurFonction </syntaxhighlight> Nous voyons que l'application du décorateur a modifié le nom de la fonction — pas le nom de la variable qui contient la fonction mais bien son nom « intime ». Pour éviter cela, on utilise la méthode <code>wraps()</code> du module <code>functools</code> : <syntaxhighlight lang="python"> import functools def deuxFois(f): @functools.wraps(f) def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # plusCinq </syntaxhighlight> On peut par exemple utiliser un décorateur pour la mémoïsation. La mémoïsation est une méthode consistant à mémoriser les valeurs d'une fonction au fur et à mesure de son utilisation ; ainsi, si l'on veut évaluer la fonction avec les mêmes entrées, on se contente d'aller chercher la valeur enregistrée ce qui est plus rapide. On sacrifie donc la place mémoire au profit de la rapidité. On peut trouver des décorateurs de mémoïsation aux adresses suivantes : * https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize * https://gist.github.com/robcowie/1357800 ; Ressources : {{lien web | url = https://www.python.org/dev/peps/pep-0318/ | titre = PEP 318 -- Decorators for Functions and Methods | site = Python.org | lang = en | consulté le = 2019-04-05 }} == Manipulation de fichiers == === Importer le contenu d'un fichier === Python possède la fonction <code lang="python">open()</code> qui permet d'ouvrir un fichier. Ouvrir signifie qu'il crée un objet de type <code>file</code> qui possède notamment les méthodes <code lang="python">read()</code> et <code lang="python">write()</code>. Il peut s'agir d'un objet de type « fichier binaire » ''({{lang|en|binary file}})'' ou « fichier texte » ''({{lang|en|text file}})''. Si par exemple on veut utiliser (et donc lire) le contenu du fichier texte <code>monfichier.txt</code>, on écrit : <syntaxhighlight lang="python"> fichier = open("monfichier.txt", "rt") … fichier.close() </syntaxhighlight> Le paramètre <code>"rt"</code> signifie que nous ouvrons le fichier en lecture ''({{lang|en|read}})'' et qu'il s'agit d'un objet de type fichier texte. Notons deux choses : * en faisant cela, nous ne faisons qu'associer le fichier à un objet Python, nous n'avons pas encore importé les données ; * si nous ouvrons le fichier, il faut le fermer par la suite ; c'est pourquoi nous utilisons la méthode <code lang="python">.close()</code>. Pour éviter d'avoir à fermer le fichier, nous pouvons l'ouvrir au sein d'un contexte : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: … </syntaxhighlight> Notons aussi que la chaîne de caractères indiquant le nom du fichier peut contenir le chemin d'accès au répertoire (dossier), mais sous Microsoft Windows, il faut utiliser des barres de fractions <code>/</code> pour séparer les sous-répertoires au lieu de la barre inversée habituelle, par exemple : <syntaxhighlight lang="python"> chemin = "C:/Temp/monfichier.txt" with open(chemin, "rt") as fichier: … </syntaxhighlight> Pour mettre les données du fichier dans la variable <code>contenu</code>, nous écrivons donc : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() print(contenu) </syntaxhighlight> et si nous ne voulons lire que les <code>n</code> premiers caractères (<code>n</code> étant un entier), nous utilisons <code lang="python">contenu = fichier.read(n)</code>. Cette lecture est séquentielle, c'est-à-dire que si nous appliquons la méthode plusieurs fois, nous reprenons la lecture là où nous l'avons laissée. Si nous voulons lire une ligne, nous utilisons la méthode <code lang="python">.readline()</code>. La lecture ligne par ligne est également séquentielle. Nous pouvons aussi créer une liste dont chaque élément est une ligne du fichier ; nous utilisons alors la méthode <code lang="python">.readlines()</code> (notez le pluriel). Chaque élément de la liste se termine par le caractère de fin de ligne <code lang="python">\n</code>. Pour l'enlever, nous pouvons utiliser la méthode <code lang="python">.rstrip()</code> pour chaque élément de la liste, par exemple. L'exemple complet est alors : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.readlines() contenu = [item.rstrip() for item in contenu] print(contenu) </syntaxhighlight> === Exporter du contenu vers un fichier === Si nous voulons créer un fichier texte pour y mettre le contenu de la variable <code>texte</code>, alors nous utilisons : <syntaxhighlight lang="python"> with open("monfichier.txt", "wt") as fichier: contenu = fichier.write(texte) </syntaxhighlight> Le module principal important pour la manipulation de fichiers est est <code lang="python">os</code>. === Exploiter le contenu d'un fichier texte === Avec un fichier texte, la méthode <code lang="python">.read()</code> crée une variable de type texte. Nous pouvons séparer cette variable en différentes lignes avec la méthode <code lang="python">.splitlines()</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une ligne. Si maintenant une ligne contient plusieurs données séparées par un séparateur commun, par exemple un espace, nous pouvons séparer les données par la méthode <code lang="python">.split(''séparateur'')</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une donnée. Si par exemple le fichier est du type CSV ''({{lang|en|comma separated values}}'', valeurs séparées par une virgule), l'exploitation du fichier est : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(",") for item in contenu] </syntaxhighlight> La variable <code>contenu</code> est une liste de listes. Pour avoir la ''n''<sup>e</sup> valeurs de la ''m''<sup>e</sup> ligne, on utilise : <syntaxhighlight lang="python"> contenu[m-1][n-1] </syntaxhighlight> Si l'on veut extraire la ligne ''m'' il suffit d'écrire : <syntaxhighlight lang="python"> contenu[m-1] </syntaxhighlight> mais si l'on veut la colonne ''n'', le plus simple est d'utiliser une définitipon en compréhension : <syntaxhighlight lang="python"> [ligne[n-1] for ligne in contenu] </syntaxhighlight> Dans certains fichiers CSV, les séparateurs de valeurs ne sont pas des virgules, on peut donc utiliser un autre caractère pour le séparateur. Si le séparateur est une tabulation, on utilise <code lang="python">\t</code> : <code lang="python">contenu = [item.split("\t") for item in contenu]</code> Si la première ligne contient les en-têtes des colonnes, on peut l'enlever avec la fonction <code lang="python">del()</code> : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() del(contenu[0]) contenu = [item.split(",") for item in contenu] </syntaxhighlight> Certains logiciels créent des fichiers en utilisant le séparateur décimal régional, qui en France est la virgule. Pour remplacer les virgules par des points, on peut utiliser la méthode <code lang="python">.replace()</code>, de préférence ''avant'' de séparer les valeurs : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.replace(",", ".") for item in contenu] # remplace les virgules par des points contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule </syntaxhighlight> en effet, lorsque l'on a séparé les valeurs, on a une liste de liste, il faut alors balayer les sous-listes ce qui prend plus de temps : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule contenu = [[subitem.replace(",", ".") for subitem in item] for item in contenu] # remplace les virgules par des points </syntaxhighlight> '''Exemple complet''' Supposons que l'on ait un fichier texte de la forme : <syntaxhighlight lang="text"> x y z V 0.0 1.5 3.2 8.657 0.4 1.5 3.2 8.392 0.2 1.5 3.2 8.485 ... </syntaxhighlight> C'est un fichier valeurs V associées à des points de coordonnées ''(x, y, z)'' (un champ V sur l'espace, donc). Nous remarquons que seule la coordonnée ''x'' change : les données concernent la droite (''y'' = 1,5 ; ''z'' = 3,2). Nous remarquons aussi que les valeurs de ''x'' ne sont pas classées par ordre croissant ni décroissant. Nous voulons au final avoir une matrice [[''x''], [V]] triée par ''x'' croissant. Pour cela, nous pouvons faire : <syntaxhighlight lang="python"> with open(nomdefichier, "rt") ad fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(" ") for item in contenu contenu = contenu[1:] # élimine la première ligne x = np.array([float(ligne[0]) for ligne in contenu]) V = np.array([float(ligne[3]) for ligne in contenu]) donnees = np.concatenate((x.reshape(-1, 1), V.reshape(-1, 1)), axis=1) # matrice [[x], [V]] ind = np.argsort(donnees[:, 0]) donnees = donnees[ind, :] # matrice triée plt.plot(donnees[:, 0], donnees[:, 1]) </syntaxhighlight> {{note|Pour le tri, voir [[../Manipulation_de_matrices#Fonctions_et_méthodes_de_base|''Manipulation de matrices'' &gt; ''Fonctions et méthodes de base'']].}} === Cas d'un fichier CSV === Si le fichier CSV ne contient que des valeurs numériques, on peut utiliser : <syntaxhighlight lang="python"> valeurs = np.loadtxt(chemin+nomfic, delimiter=",") # si le séparateur est une virgule </syntaxhighlight> Il existe un module <code lang="python">csv</code> dédié aux fichiers CSV. La manipulation du fichier se fait comme suit : <syntaxhighlight lang="python"> import csv with open(chemin+nomfic, "rt") as fichier: lecteur = csv.reader(fichier, delimiter=",") contenu = [ligne for ligne in lecteur] print(contenu) </syntaxhighlight> === Utilisation de Pandas === Pandas<ref>https://pandas.pydata.org/</ref> est un module gérant les tableaux de données, appelés <em lang="en">data frames</em>. Voici quelques commandes utiles : <syntaxhighlight lang="python"> import numpy as np import pandas as pd M = np.random.rand(10, 10) # crée une matrice NumPy aléatoire de dimension 10 × 10 tableau = pd.DataFrame(M) # transforme la matrice en tableau DataFrame tableau.to_csv("tableau.csv") # enregistre le tableau dans un fichier CSV donnees = pd.read_csv("tableau.csv").to_numpy() # lit le fichier et transforme le tableau DataFrame en matrice NumPy </syntaxhighlight> == Exporter un programme Python == Vous pouvez créer un fichier « Python pur » <code>.py</code>. Pour cela, dans le menu <code>fichier/file</code> de Jupyter, choisir <code>télécharger/download</code> au format <code>.py</code> ; le fichier se trouve alors dans le répertoire de téléchargement du navigateur. == Ressources == * {{lien web | url = https://www.python.org/dev/peps/pep-0008/ | titre = PEP 8 -- Style Guide for Python Code | site = Python documentation | consulté le = 2019-03-14 }} == Notes et références == {{références}} ---- [[../Fonctions mathématiques générales|Fonctions mathématiques générales]] &lt; [[../|↑]] &gt; [[../Graphiques|Graphiques]] {{DEFAULTSORT:Elements de programmation}} [[Catégorie:Python pour le calcul scientifique (livre)]] 4oc70bg1qiw99443lfe3utgl7tpkix8 767403 767382 2026-06-03T08:50:33Z Cdang 1202 /* Interface graphique avec Tk */ +image 767403 wikitext text/x-wiki Rappel : les programmes commencent par : <syntaxhighlight lang="python"> #!/usr/bin/python3 import numpy as np import matplotlib.pyplot as plt </syntaxhighlight> == Entrées et sorties == Pour permettre à l'utilisateur ou à l'utilisatrice d'entrer une valeur, nous utilisons la fonction <code lang="python">input()</code> comme évoqué précédemment (chapitre ''[[../Premiers programmes|Premiers programmes]]''), avec la syntaxe <code lang="python">''variable'' = input(''texte'')</code>. Notez que la valeur renvoyée par <code lang="python">input()</code> est une chaîne de caractères. Si vous voulez autre chose, typiquement un nombre, il faut convertir cette chaîne. Par exemple, nous demandons ici d'entrer une longueur sous la forme d'une valeur numérique : <syntaxhighlight lang="python"> longueurDefaut = 10.0 texteDemandeLongueur = f"Veuillez entrer la longueur en millimètres (valeur par défaut {longueurDefaut} mm) : " longueur = input(texteDemandeLongueur) if longueur=="": longueur=longueurDefaut else: longueur=float(longueur) print(longueur) </syntaxhighlight> Pour afficher un texte, on utilise la fonction <code lang="python">print()</code>, également présentée dans le chapitre ''[[../Premiers programmes|Premiers programmes]]'', avec la syntaxe <code lang="python">print(''texte'')</code>. Le texte à afficher peut être de n'importe quel type (entier, réel en virgule flottante, booléen, chaîne de caractères…) mais si l'on veut « mélanger » les types, il faut tout convertir en chaînes de caractères, avec la fonction <code lang="python">str()</code>, et concaténer les chaînes avec <code lang="python">+</code>. Par exemple : <syntaxhighlight lang="python"> print("La longueur vaut : "+str(longueur)+" mm.") </syntaxhighlight> Nous pouvons aussi utiliser une « chaîne “f” » ''({{lang|en|f-string}})'' : on met un le <code lang="python">f</code> devant le guillemet ouvrant et dans la chaîne, on met un champ sous la forme <code lang="python">{''nomDeVariable''}</code>. L'exemple ci-dessus devient alors : <syntaxhighlight lang="python"> print(f"La longueur vaut : {longueur} mm.") </syntaxhighlight> Les chaînes « f » sont détaillées dans la section ''[[#Chaînes de caractères|Chaînes de caractères]]'' ci-dessous. Si l'on veut introduire un retour à la ligne dans la chaîne, on utilise les caractères <code lang="python">\n</code> (contre-oblique suivie de la lettre N minuscule). Par exemple <syntaxhighlight lang="python"> print("Ceci est un texte\navec un retour à la ligne.") </syntaxhighlight> == Types de variables == === Généralités === Python définit « tout seul » le type de la variable : « <code>3</code> » sera un entier ''({{lang|en|integer}})'', « <code>3.0</code> » sera un réel à virgule flottante ''({{lang|en|float}})'', « <code>"3"</code> » sera une chaîne de caractères ''({{lang|en|string}})''. On peut connaître le type d'une variable avec la fonction <code>type()</code>. On peut tester certaines valeurs, avec le module <code>NumPy</code> : * <code>np.isnan(x)</code> indique si les valeurs de ''x'' sont des NaN ''({{lang|en|not a number}})'' ; si ''x'' est une matrice, le résultat est une matrice de booléens, l'élément [''i'', ''j''] est <code>True</code> si <code>x[i, j]</code> est un NaN ; * <code>np.isinf(x)</code> indique si les valeurs de ''x'' sont ±∞ ; si ''x'' est une matrice, le résultat est une matrice booléenne de même dimension. On peut forcer un type : * <code>int(x)</code> : transforme la valeur ''x'' en nombre entier ; * <code>long(x)</code> : " en entier long (précision illimitée) ; * <code>float(x)</code> : " en nombre réel à virgule flottante ; * <code>str(x)</code> : " en chaîne de caractères ; * <code>complex(Re, Im)</code> : crée le nombre complexe ''Re'' + ''Im''·j, j désignant la racine carrée de –1 ; * <code>list()</code> : crée une liste ; * <code>tuple()</code> : crée un n-uplet. Par exemple <syntaxhighlight lang="python"> type(3) # <class 'int'> type(float(3)) # <class 'float'> complex(1, 1) == 1 + 1j # True list("blabla") # ['b', 'l', 'a', 'b', 'l', 'a'] </syntaxhighlight> Python distingue plusieurs genres de types : * Un itérable est un objet dont on peut extraire les éléments un par un ; ce sont les objets pour lesquels on peut écrire <code> for i in ''iterable'':</code>. Il s'agit essentiellement des listes, n-uplets, chaînes de caractères, ensembles, dictionnaires et fichiers. * Un modifiable ''({{lang|en|mutable}})'' est un objet que l'on peut modifier ; par exemple une liste est modifiable — on peut changer la valeur d'un élément, en ajouter ou en enlever un — mais les n-uplets non, pas plus qu'une chaîne de caractères ou un nombre. * Un identifiable (''{{lang|en|hashable}}'', le ''{{lang|en|hashage}}'' étant une signature caractéristique d'un objet) : objet possédant un identifiant unique. Un objet identifiable est toujours non-modifiable ''({{lang|en|unmutable}})''. === Types numériques === ==== Entiers ==== Nous pouvons définir les entiers au format octal ou hexadécimal : il faut débuter le nombre par respectivement <code>0o</code> (le chiffre zéro et la lettre o) et <code>0x</code> (le chiffre zéro et la lettre x). À l'inverse, la fonction <code>hex()</code> renvoie une chaîne correspondant à l'écriture d'un entier au format hexadécimal, et <code>oct()</code> renvoie la chaîne correspondant à l'éciture en octal. Par exemple : <syntaxhighlight lang="python"> print(0o10, ";", 0x10) # 8 ; 16 print(hex(20)) # 0x14 </syntaxhighlight> ==== Réels ==== Les réels disposent de fonctions spécifiques appelées « méthodes ». Une méthode est une fonction spécifique à un type d'objets. Étant conçue ''ad hoc'', elle est souvent plus économe en ressource et en temps qu'une fonction générique. Pour appliquer la méthode <code>meth()</code> à la variable <code>x</code>, on écrit : <code>x.meth()</code>. Nous avons déjà présenté la méthode <code>''float''.as_integer_ration()</code> qui donne la fraction réduite égale à la valeur du nombre. Les réels disposent de plusieurs autres méthodes : * <code>''float''.trunc()</code> : tronque le nombre réel ; * <code>''float''.floor()</code>, <code>''float''.ceil()</code> : renvoie l'entier le plus proche, respectivement inférieur ou supérieur ; * <code>''float''.hex()</code> : renvoie une chaîne de caractères correspondant à l'écriture du nombre en hexadécimal. Par exemple : <syntaxhighlight lang="python"> a = 20. print(a.hex()) # 0x1.4000000000000p+4 print(10..hex()) # 0x1.4000000000000p+3 </syntaxhighlight> Dans le deuxième exemple, nous appliquons la méthode <code>''float''.hex()</code> directement au nombre <code>10.</code> ; le point est obligatoire car sinon, c'est un entier, pour lequel la méthode n'est pas définie. Notez que la ''méthode'' <code>''float''.hex()</code> est différentes de la ''fonction'' <code>hex()</code> : la première concerne les réels, la seconde les entiers. ==== Complexes ==== Nous avons déjà mentionné la méthode <code>''complex''.conjugate()</code> qui donne le conjugué du nombre. Un nombre complexe dispose de deux attributs : * <code>''complex''.real</code> : sa partie réelle ; * <code> ''complex''.imag</code> : sa partie imaginaire. Par exemple : <syntaxhighlight lang = "python"> a = 5+2j print(a.conjugate(), ";", a.real, ";", a.imag) # (5-2j) ; 5.0 ; 2.0 </syntaxhighlight> === Chaînes de caractères === ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/inputoutput.html | titre = 7. Input and Output | site = Python Documentation | consulté le = 2019-04-06 }} ==== Généralités ==== Il existe en fait trois manières de définir une chaîne de caractères : * avec des guillemets simples ou doubles comme vu précédemment : <code>"…"</code> ou bien <code>'…'</code> ; * avec trois guillemets doubles : <code>"""…"""</code> : cela permet d'avoir une chaîne de caractères s'étendant sur plusieurs lignes, les retours de ligne étant pris en compte ; c'est utilisé en particulier pour la description des fonctions (''{{lang|en|docstrings}}'', voir ci-après) ; * avec des guillemets précédés d'un « r », <code>r"…"</code> ou <code>r'…'</code> : cela permet d'interpréter les barres de fraction inverses « \ » comme un caractère « normal » et non comme un caractère d'échappement (voir ci-après) ; cela est utile lorsque l'on utilise les possibilités LaTeX dans le tracé de graphiques (voir plus loin) ; * avec des guillemets précédés d'un « f », <code>f"…"</code> ou <code>f'…'</code> : cela permet d'utiliser des variables formatées (voir ci-après). Une chaîne de caractères n'est pas modifiable. Si l'on veut remplacer un caractère, l'insérer ou le supprimer, il faut transformer la chaîne en liste, avec la commande <code>list()</code>, puis rassembler la liste en la joignant ''({{lang|en|join}})'' à une chaîne vide : <syntaxhighlight lang="python"> chaine = "blabla" chaineList = list(chaine) chaineList[2] = "c" chaine = "".join(chaineList) print(chaine) # blcbla </syntaxhighlight> Dans une chaîne simple <code>"…"</code> ou <code>'…'</code>, on peut introduire un retour à la ligne avec <code>\n</code>. ==== Substitution de variables ==== Lorsque l'on veut utiliser des variables, on fait précéder les guillemets d'un « f » et l'on écrit les noms de vrariables entre accolades. Par exemple : <syntaxhighlight lang="python"> monde = "world" chaine = f"Hello {monde}!" print(chaine) # Hello world! </syntaxhighlight> On peut indiquer la taille de la chaîne générée à partir de la variable sous la forme <code>{nomVariable:taille}</code>, la taille étant un entier. Par exemple : <syntaxhighlight lang="python"> chiffre1 = 1 nom1 = "un" chiffre2 = 2 nom2 = "deux" chaine = f"{nom1:5} : {chiffre1:5d}\n{nom2:5} : {chiffre2:5d}" print(chaine) # un : 1 # deux : 2 </syntaxhighlight> Vous remarquez que l'on ajoute un « d » pour les entiers décimaux, et que les nombres sont alignés à droite. Si le nombre est un nombre réal à virgule flottante ''({{lang|en|float}})'', on peut indiquer le nombre de décimales sous la forme <code>.''n''f</code> : <syntaxhighlight lang="python"> chaine = f"{np.pi:.5f}" print(chaine) # 3.15169 </syntaxhighlight> Avec la syntaxe <code>''m''.''n''f</code>, on indique également que la totalité du nombre doit occuper ''m'' caractères. Pour convertir un nombre en caractère Unicode correspondant, on utilise la lettre c : <syntaxhighlight lang="python"> nompi = 0x03c0 # Caractère Unicode π : U+03C0 chaine = f"{nompi:c} = {np.pi:.5f}" print(chaine) # π = 3.14159 </syntaxhighlight> La classe ''str'' dispose également de la méthode <code>.format()</code>. On indique un n-uplet de chaînes (ou de nombres) à la méthode et l'on met des accolades dans la chaîne principale ; les accolades sont remplacées dans l'ordre des chaînes de la méthode. On peut changer l'ordre en indiquant quelle valeur utiliser dans quelle accolade. Par exemple : <syntaxhighlight lang="python"> chaine1 = "On compte {} puis {}".format(1, 2) chaine2 = "On compte {0} puis {1}. Mais à rebours, on compte {1} puis {0}.".format("un", "deux") print(chaine1, "\n", chaine2) # On compte 1 puis 2 # On compte un puis deux. Mais à rebours, on compte deux puis un. </syntaxhighlight> L'utilisation du caractère pourcent « % » permet d'utiliser la mise en forme <code>sprintf()</code> du langage C : <syntaxhighlight lang="python"> chaine = "π = %.5f" % np.pi print(chaine) # π = 3.14159 </syntaxhighlight> ; Exemple <nowiki>:</nowikI> barre de progression : Voici une fonction affichant une barre de progression, pour la ''i''-ème étape d'un processus ayant ''n'' étapes (pour la notion de fonction, voir la section ci-après ''[[#Fonction|Fonction]]''). : NB : nous avons utilisé les codes Unicode pour l'exemple, mais on peut évidemment copier le caractère, par exemple depuis une table Unicode ou une page Web<ref>Pour le point médian : ''{{W|Table des caractères Unicode/U0080}}'' ou ''{{W|Point médian}}''. Pour le pavé : ''{{W|Table des caractères Unicode/U2580}}''.</ref>, et le coller dans le code, comme nous l'avons fait dans le commentaire. <syntaxhighlight lang="Python"> def barre_progression(i, n, largeur=40): """ Affiche une barre de progression Entrées : — i : étape en cours, entier ; — n : nombre d'étapes à réaliser, entier ; — largeur : nombre de caractères total de la barre, entier. Sortie : affichage de la barre de progression. """ taux = i/n fait = int(largeur * taux) barre = f"{0x2588:c}" * fait + f"{0x00b7:c}" * (largeur - fait) # U+2588 : pavé "█" ; U+00B7 : point médian "·" print(f"Progression | {barre} | {100*taux:3.1f} %") barre_progression(25, 100) # Progression | ██████████······························ | 25.0 % </syntaxhighlight> ==== Méthodes des chaînes ==== Le type ''str'' dispose d'un certain nombre de méthodes. Nous avons déjà vu les méthodes <code>''str''.join()</code> et <code>''str''.format()</code>, en voici quelques autres : * <code>''str''.capitalize()</code> : met le premier caractère en capitale (majuscule) et les autres en minuscule ; * <code>''str''.lower()</code> : met tout en minuscules ''({{lang|en|lowercase}})'' ; * <code>''str''.upper()</code> : met tout en capitales ''({{lang|en|lowercase}})'' ; * <code>''str''.center(''n'')</code> : met la chaîne au centre d'une chaîne de longueur ''n'', en complétant avec des espaces ; on peut compléter avec d'autres caractères avec <code>''str''.center(''n'', ''c'')</code>, par exemple <code>"a".center(7, ".")</code> donne <code>"....a...."</code> ; * <code>''str''.ljust(''n'', ''c'')</code> et <code>''str''.rjust(''n'', ''c'')</code> : comme <code>.center()</code> mais la chaîne est respectivement alignée au fer à gauche ''({{lang|en|left}})'' et à droite ''({{lang|en|right}})'' ; * <code>''str''.isdigit()</code> : booléen vrai si tous les caractères sont des nombres ; * <code>''str''.find(''sous-chaine'')</code>, <code>''str''.rfind(''sous-chaine'')</code> : indique respectivement le premier emplacement et le dernier emplacement de la sous-chaîne dans la chaîne ; * <code>''str''.partition(''séparateur'')</code> : retourne un triplet avec la portion de chaîne avant le séparateur, le séparateur puis la portion de chaîne après le séparateur ; * <code>''str''.replace(''ancien'', ''nouveau'')</code> : remplace la chaîne ''ancien'' par la chaîne ''nouveau'' dans la chaîne ; * <code>''str''.split(''séparateur'')</code> : découpe la chaîne au niveau des séparateurs et renvoie une liste. ==== Autres fonctions ==== La fonction <code>chr()</code> transforme un code Unicode en caractère. Par exemple, <code>chr(97)</code> donne <code>"a"</code> et <code>chr(0x03c0)</code> donne <code>"π"</code>. Si on veut créer une liste de caractères qui se suivent, on peut par exemple utiliser : <syntaxhighlight lang="python"> [chr(x) for x in range(97, 102)] # ['a', 'b', 'c', 'd', 'e'] </syntaxhighlight> Si on veut créer une liste de nombres sous la forme de chaînes de caractères, on peut utiliser la commande <code>str()</code> vue ci-dessus. Par exemple : <syntaxhighlight lang="python"> [str(x) for x in range(1, 6)] # ['1', '2', '3', '4', '5'] </syntaxhighlight> Pour la syntaxe, voir ci-dessous la section [[#Définition en compréhension|''Définition en compréhension'']]. Ainsi, dans l'exemple de la barre de progression ci-dessus, on peut utiliser la solution suivante pour constituer la barre : <syntaxhighlight lang="python"> barre = chr(0x2588) * fait + chr(0x00b7) * (largeur - fait) # U+2588 : bloc ; U+00B7 : point médian </syntaxhighlight> Rappel : le module <code>html</code> permet d'utiliser les entités HTML : <syntaxhighlight lang="python"> import html … print(html.entities.html5["alpha;"]+html.entities.html5["middot;"]) # α· </syntaxhighlight> L'entité HTML <code>&xxx;</code> s'obtient par <code>html.entities.html5["xxx;"]</code>, donc en enlevant la perluète ; mais cela ne fonctionne pas avec les codes Unicode. Pour cela, on peut utiliser la commande <code>html.unescape()</code>. Ainsi, dans l'exemple de la barre de progression ci-dessus, on peut utiliser la solution suivante pour constituer la barre : <syntaxhighlight lang="python"> barre = html.unescape("&#x2588;") * fait + html.entities.html5["middot;"] * (largeur - fait) # U+2588 : bloc ; middot : point médian </syntaxhighlight> ou bien <syntaxhighlight lang="python"> barre = barre = html.unescape("&#x2588;" * fait + "&middot;" * (largeur - fait)) # U+2588 : bloc ; middot : point médian </syntaxhighlight> La commande <code>html.unescape()</code> interprète donc une chaîne complète, par exemple <syntaxhighlight lang="python"> print(html.unescape("L'esperluette est le caractère &laquo;&nbsp;&amp;&nbsp;&raquo;.")) # L'esperluette est le caractère « & ». </syntaxhighlight> == Manipulation de listes == Les listes sont une structure de données fondamentale en Python. ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/datastructures.html | langue = en | titre = 5. Data structures | site = Python documentation | consulté le = 2019-03-16 }} === Copie d'une liste === Contrairement à d'autres types, lorsque vos écrivez <code>b = a</code> avec des listes, vous ne créez pas une copie de la variable <code>a</code>, vous créez un ''alias'' : l'objet <code>b</code> est un autre nom de l'objet <code>a</code>. En particulier, si vous modifiez <code>b</code>, vous modifiez en fait <code>a</code>. Par exemple : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a b[2] = 5 print(a, b) # [1, 2, 5, 4] [1, 2, 5, 4] </syntaxhighlight> Si l'on veut créer une copie de <code>a</code>, il faut utiliser <code>a[:]</code> ou bien <code>a.copy()</code> : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a[:] c = a.copy() b[2] = 5 c[2] = 6 print(a, b, c) # [1, 2, 3, 4] [1, 2, 5, 4] [1, 2, 6, 4] </syntaxhighlight> === Méthodes de listes === Pour modifier une liste, vous disposez des méthodes suivantes : * <code>a.append(x)</code> : ajoute l'élément <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.extend(x)</code> : ajoute la liste <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.append(i, x)</code> : aoute l'élément <code>x</code> ''avant'' l'interstice ''i'' de la liste <code>a</code> ; * <code> x = a.pop(i)</code> : enlève l'élément ''i'' de la liste <code>a</code> et le met dans la variable <code>x</code> ; <code> x = a.pop()</code> enlève le dernier élément de la liste ; * <code>a.clear()</code> : vide la liste <code>a</code> ; * <code>a.sort()</code> : trie la liste par ordre croissant ; * <code>a.sort(reverse = True)</code> : trie par ordre décroissant ; * <code>a.reverse()</code> : inverse l'ordre de <code>a</code>. Pour supprimer l'élément à l'indice ''i'', au lieu d'utiliser <code>a.pop(i)</code>, on peut aussi utiliser <syntaxhighlight lang="python"> del(a[i]) </syntaxhighlight> Pour trier une liste, on peut aussi utiliser la fonction <code>sorted()</code>, ce qui permet par exemple de conserver la liste originale, non triée : <code>b = sorted(a)</code>. La fonction <code>sorted()</code> fonctionne avec tous les objets « itérables » comme par exemple une chaîne de caractères : <syntaxhighlight lang="python"> a = "ahjbfk" print(sorted(a)) # ['a', 'b', 'f', 'h', 'j', 'k'] </syntaxhighlight> Pour mettre en évidence la performance de la méthode <code>''list''.sort()</code> par rapport à la fonction générique <code>sorted()</code> : <syntaxhighlight lang="python"> import numpy as np import time a = np.random.rand(int(1e7)) t1 = time.perf_counter() b = sorted(a) # Fonction générique t2 = time.perf_counter() a.sort() # Méthode spécifique t3 = time.perf_counter() print("Sorted :", t2-t1, " s ; .sort :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # Sorted : 14.2... s ; .sort : 1.1... s ; rapport : 12.6... </syntaxhighlight> Par rapport à une valeur donnée : * <code>a.remove(x)</code> : retire la première occurrence de la valeur <code>x</code> de la liste <code>a</code> ; * <code>a.index(x)</code> : indique l'indice où se trouve la première occurrence de la valeur <code>x</code> ; * <code>a.count(x)</code> : indique le nombre de fois que l'on trouve la valeur <code>x</code> dans la liste <code>a</code>. === Définition en compréhension === La [[w:fr:Liste en compréhension|définition en compréhension]] ''({{lang|en|list comprehension}})'' est une méthode permettant de construire des listes en indiquant simplement des axiomes, des consignes de filtrage. Cette méthode est élégante car proche de la notation mathématique et compacte, mais c'est une méthode itérative donc lente par rapport à une méthode vectorisée fournie par le module NumPy. Par exemple, pour créer la liste des carrés des nombres entiers entre 0 et 9, il suffit d'écrire <syntaxhighlight lang="python"> carre = [x**2 for x in range(10)] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x^2 | x \in [0 ; 9] \}</math>. Si l'on veut la liste des nombres strictement inférieurs à 20 dont le carré est supérieur à 10, on peut écrire : <syntaxhighlight lang="python"> X = [x for x in range(20) if x**2 > 10] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x | x \in [0 ; 19], x^2 > 10 \}</math>. Pour mettre en évidence la performance du calcul vectorisé par rapport à la méthode itérative : <syntaxhighlight lang="python"> import time import numpy as np n = int(1e7) # taille de la liste t1 = time.perf_counter() carre = [x**2 for x in range(n)] # Définition en compréhension t2 = time.perf_counter() carre2 = np.arange(n)**2 # Calcul vectorisé t3 = time.perf_counter() print("En compréhension : ", t2-t1, "s ; vectorisé :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # En compréhension : 4.515... s ; vectorisé : 0.156... s ; rapport : 28.982... </syntaxhighlight> == Structure d'un programme == Un programme est simplement une suite d'instructions. Dans les environnements Unix BSD, un programme Python peut être considéré comme un script c'est-à-dire qu'il suffit de taper son nom dans l'invite de commande ''({{lang|en|shell}})'' sans avoir à invoquer <code>python</code>. Le programme doit alors commencer par un en-tête normalisé surnommé ''{{lang|en|[[wikt:shebang|shebang]]}}'' : <syntaxhighlight lang="python"> #!/usr/bin/env python3 </syntaxhighlight> Ce ''{{lang|en|shebang}}'' est inutile avec Jupyter. L'en-tête peut également contenir la description de l'encodage du fichier texte, typiquement : <syntaxhighlight lang="python"> # coding: utf-8 </syntaxhighlight> Le codage UTF-8 est le codage par défaut pour Python 3, il est donc inutile de l'indiquer. Les commentaires sont introduits par le croisillon <code>#</code>. On peut grouper une suite d'instructions dans un bloc. Un bloc d'instructions commence par deux-points « <code>:</code> » et est identé, c'est-à-dire qu'il a une marge constituée de quatre espaces — on peut aussi utiliser une tabulation mais il ne faut pas mélanger les deux méthodes ; les tabulations sont déconseillées, il vaut mieux utiliser quatre espaces<ref>{{lien web | url = https://www.python.org/dev/peps/pep-0008/#tabs-or-spaces | titre = Tabs or Spaces? | site = Python documentation | consulté le = 2019-03-14 }}</ref>. Pour terminer le bloc, il suffit simplement de revenir en début de ligne ; contrairement à d'autres langages, il n'y a pas de commende de fin ''({{lang|en|end}})'', c'est l'indentation qui définit le bloc. : # début du bloc ''instruction 1'' ''instruction 2'' … ''dernière instruction du bloc'' ''instruction hors bloc'' Par exemple, une exécution conditionnelle <code>if</code> ou une boucle <code>for</code> exécute un bloc d'instruction. Si l'on a besoin d'un bloc d'instruction qui « ne fait rien », on utilise l'instruction <code>pass</code>. == Structures de contrôle == '''Boucle itérative''' La boucle itérative s'écrit : <syntaxhighlight lang="python"> for <variable> in <itérable>: <bloc d’instructions> </syntaxhighlight> Si l'on veut que la variable prenne ''n'' valeurs de 0 à ''n'' – 1, on utilise l'instruction <code>range()</code> : <syntaxhighlight lang="python"> for i in range(5): print(i) print("Fin de la boucle") </syntaxhighlight> <code>[▶]</code> 0 1 2 3 4 Fin de la boucle En fait, la commande <code>range()</code> extrait des valeurs de l'ensemble des nombres entiers ; on peut ainsi utiliser le découpage en tranches, par exemple <code>range(2, 5)</code>pour avoir la « liste » <code>[2, 3, 4]</code>. Notez que <code>range()</code> ne crée pas à proprement parler une liste, cela crée un objet de type ''« {{lang|en|range}} »'' (plage, intervalle) ; pour avoir une liste, il faut écrire <code>list(range(n))</code>. Dans une boucle, la commande <code>continue()</code> saute la fin du bloc d'instruction et passe à la valeur suivante de la boucle. La commande <code>break()</code> interrompt la boucle et passe à la suite. '''Exécution conditionnelle''' L'exécution conditionnelle s'écrit : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> </syntaxhighlight> On peut utiliser les commandes <code>elif</code> ''(else if'') et <code>else</code> : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> elif <booléen>: <bloc d’instructions> else: <bloc d’instructions> </syntaxhighlight> Notez que le test d'une condition est gourmand en ressources. S'il s'agit de savoir si l'on effectue une opération mathématique simple ou pas, on peut remplacer le test par une multiplication par un booléen (<code>True</code> vaut 1, <code>False</code> vaut 0). Par exemple, plutôt que d'écrire <syntaxhighlight lang="python"> if a > 0: b = b - c </syntaxhighlight> mieux vaut écrire : <syntaxhighlight lang="python"> b = b - (a > 0)*c </syntaxhighlight> '''Boucle antéconditionnée''' La boucle antéconditionnée s'écrit : <syntaxhighlight lang="python"> while <booléen>: <bloc d’instructions> </syntaxhighlight> Cette boucle peut contenir des instructions <code>continue()</code> et <code>break()</code>. == Fonction == La déclaration d'une fonction utilise la commande <code>def</code>. La fonction est un bloc d'instructions. Si elle doit renvoyer des valeurs, on utilise la commande <code>return</code>. Par exemple <syntaxhighlight lang="python"> def nombres(n): """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo a = nombres(3) print(a) </syntaxhighlight> La fonction commence par une chaîne de caractères qui la décrit. Cette chaîne peut être récupérée automatiquement par certains logiciels pour faire une documentation automatique. Si la description prend plusieurs lignes, elle commence et finit par trois double-guillemets <code>"""…"""</code> ; en fait, par convention, même si cela n'est pas obligatoire, les descriptions sont toutes encadrées de trois double-guillemets. Cette description est appelée ''{{lang|en|docstring (documentation string)}}''. Pour récupérer les ''{{lang|en|docstrings}}'' : <syntaxhighlight lang="python"> def foo(): """Cette fonction ne fait rien""" pass print(foo.__doc__) # Cette fonction ne fait rien </syntaxhighlight> L'instruction <code>input()</code> permet à l'utilisateur de saisir une valeur. La valeur est retournée sous la forme d'une chaîne de caractères qui est ensuite convertie en nombre réel avec l'instruction <code>float()</code>. On peut définir une valeur par défaut en l'indiquant dans l'en-tête de la définition de la fonction, de la manière suivante : <syntaxhighlight lang="python"> def nombres(n=1): # valeur par défaut : 1 """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo </syntaxhighlight> Si le paramètre à initialiser est de type modifiable ''({{lang|en|mutable}})'', comme par exemple une liste, il faut procéder comme suit : <syntaxhighlight lang="python"> def fooFonction(fooListe=None): # valeur par défaut : n'existe pas """Description""" if fooListe = None: fooListe = [] # initialisation <suite des instructions> </syntaxhighlight> Par défaut, les variables sont locales. On peut rendre une variable globale avec l'instruction <code>global</code> ''à l'intérieur de la fonction'', avant l'utilisation de la variable. Par exemple : <syntaxhighlight lang="python"> a = 1 b = 1 def toto(): """Test de variable globale. Entrée : aucune. Sortie : aucune.""" global a a = 2 b = 2 toto() print("a =", a, "; b =", b) # a = 2 ; b = 1 </syntaxhighlight> Pour être plus précis : si une variable n'est pas assignée dans une fonction, alors Python va chercher une variable du même nom à l'extérieur de la fonction. Mais à partir du moment où la variable est assignée dans la fonction, elle devient locale ''sauf'' si l'on a utilisé l'instruction <code>global</code>. Si l'on s'attend à un nombre indéfini d'arguments, on utilise la notion d'empaquetage/dépaquetage ''({{lang|en|packing/unpacking}})''<ref>{{lien web | url = https://deusyss.developpez.com/tutoriels/Python/args_kwargs/ | titre = Introduction à *args et **kwargs | consulté le = 2019-03-09 | site = Developpez.com }}.</ref>. L'empaquetage consiste à mettre les arguments dans un n-uplet, le dépaquetage consiste à développer un n-uplet en plusieurs variables. Cela se fait en mettant un astérisque ''({{lang|en|splat}})'' « <code>*</code> » devant le nom de la variable. Par convention, on utilise le nom de variable <code>*args</code> mais cela n'est pas obligatoire. <syntaxhighlight lang="python"> def concatenation(*args): """Concatène des chaînes de caractères Entrée : *args, n-uplet de chaînes de caractères. Sortie : resultat, chaîne de caractères.""" resultat = "" for i in args: resultat = resultat + i return resultat concatenation("a", "foo", "toto") # 'afoototo' </syntaxhighlight> À l'inverse, si une fonction doit recevoir plusieurs paramètres, on peut à la place lui transmettre une liste à dépaqueter : <syntaxhighlight lang="python"> def addition(a, b): """Ajoute deux nombres Entrées : — a : réel ; — b : réel. Sortie : a+b, réel""" return a+b arg = (1, 2) addition(*arg) # 3 </syntaxhighlight> On peut aussi empaqueter/dépaqueter un dictionnaire, on utilise pour cela deux astérisques « <code>**</code> ». Par convention, on utilise le nom <code>**kwargs</code> sans que cela soit obligatoire. L'instruction <code>lambda</code> permet de créer de petites fonctions ne contenant pas de boucle ni de branchement conditionnel. Cependant, si la déclaration est courte et compacte, le code n'est pas toujours facilement lisible ; l'utilisation de cette instruction n'est pas recommandée. Par exemple l'expression <syntaxhighlight lang="python"> f = lambda x: 2*x </syntaxhighlight> est la même chose que <syntaxhighlight lang="python"> def f(x): """Calcule le double. Entrée : x, réel. Sortie : 2*x, réel.""" return 2*x </syntaxhighlight> {{note|L'instruction <code>eval()</code> exécute une chaîne de caractères, c'est-à-dire traite une chaîne de caractères comme si c'étaient des instructions données à Python. Cette instruction est à éviter pour deux raisons : # Un utilisateur malveillant pourrait entrer du code malveillant dans la chaîne de caractères. # L'exécution est lente puisque Python doit compiler la chaîne à la volée. Cette instruction peut en général être remplacée par une autre instruction. }} == Gestion des erreurs == Dans un bloc d'instructions, on peut utiliser la structure <code>try:… except:</code>. Le bloc après <code>try</code> est exécuté ; si une erreur se déclare dans ce bloc, alors le bloc <code>except</code> s'exécute. Par exemple <syntaxhighlight lang="python"> try: 1/0 # Génère une erreur except: print("Division par zéro") # Cette instruction est donc exécutée </syntaxhighlight> On peut compléter avec <code>else:</code> et <code>finally:</code> : <syntaxhighlight lang="python"> try: <code à exécuter> except: <s’exécute en cas d’erreur> else: <s’exécute s’il n’y a pas d’erreur> finally: <s’exécute dans tous les cas> </syntaxhighlight> On peut séparer les différents types d'erreur : <syntaxhighlight lang="python"> try: <code à exécuter> except ValueError: print("Valeur erronée") except TypeError: print("Type erroné") </syntaxhighlight> Les types d'erreur les plus courants sont : * <code>NameError</code> : le nom de variable n'existe pas ; * <code>TypeError</code> : la valeur n'est pas du bon type ; * <code>ValueError</code> : la valeur n'est pas compatible avec ce qui est attendu ; * <code>RuntimeError</code> : type d'erreur général. On peut aussi créer ses propres erreurs : si une situation erronée survient, on peut « lever » une exception avec <code>raise</code>. Par exemple <syntaxhighlight lang="python"> if a < 0: raise ValueError("La valeur doit être positive") </syntaxhighlight> ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/errors.html | titre = Errors and exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} * {{lien web | url = https://docs.python.org/3/library/exceptions.html | titre = Built-in Exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} == Exercices == === Calcul du PGCD et du PPCM par l'algorithme d'Euclide === {{loupe|w:Algorithme d'Euclide}} Écrire un programme Python qui demande deux nombres entiers et affiche leurs PGCD et PPCM. Le programme utilisera l'algorithme d'Euclide. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """Programme : euclide.py Auteur : User:cdang date : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : calcule le PGCD et le PPCM de deux nombres entiers. Entrée ------ au clavier, saisie de deux nombres entiers. Sorties ------- à l'écran, affichage du PGCD et du PPCM. """ # *************** # *************** # ** Fonctions ** # *************** # *************** def euclide(): """Calcule le PGCD et le PPCM avec l'algorithme d'Elclide Entrée ------ Aucune, la saisie des paramètres fait partie de la fonction Sortie ------ affichage du PGCD et du PPCM """ print("***** Algorithme d'Euclide *****\n") a0 = int(input("Premier nombre entier : a = ")) b0 = int(input("Second nombre entier : b = ")) a = a0 b = b0 r = a%b # initialisation while (r != 0) : # algorithme d'Euclide a = b b = r r = a%b # affichage des résultats print("PGCD(", a0, ", ", b0, ") = ", b) print("PPCM(", a0, ", ", b0, ") = ", a0*b0//b) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* euclide() </syntaxhighlight> On peut simplifier la boucle centrale : <syntaxhighlight lang="python"> while b: # s'exécute tant que b n'est pas 0 a, b = b, a % b # affectation de liste à liste return a </syntaxhighlight> {{boîte déroulante fin}} Notez que le module NumPy propose l'instruction <code>gcd()</code> : <syntaxhighlight lang="python"> import numpy … print(numpy.gcd(a, b)) </syntaxhighlight> === Tours de Hanoï === {{loupe|w:Tours de Hanoï}} Écrire un programme Python qui demande le nombre ''n'' de plateaux et affiche les manipulations nécessaires pour déplacer la pile d'un emplacement à un autre. Le programme utilisera l'algorithme récursif. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """nom : hanoi.py auteur : User:cdang date de création : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : résout le problème des tours de Hanoï Entrées ------- trois chaînes de caractères (nom des piliers) Sorties ------- une chaîne de caractères (liste des opérations) """ # *************** # *************** # ** Fonctions ** # *************** # *************** def hanoi(a, b, c, n): """Résout le problème des tours de Hanoï de manière récursive But : déplace la pile de n disques du piler a au pilier b Entrées ------- a, b c : chaînes de 1 caractère, référence des emplacements ; n : entier, nombre de disques sur l'emplacement a Sorties ------- operations : chaînes de caractères décrivant les opérations """" if n>1: operations = hanoi(a, c, b, n-1) operations = operations+a+"→"+b+" ; " operations = operations+hanoi(c, b, a, n-1) else: operations = a+"→"+b+" ; " return operations # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* resultat = hanoi("1", "2", "3", 3) print(resultat) </syntaxhighlight> {{boîte déroulante fin}} === Lancer de rayons === [[Fichier:Lentille hemispherique perspective.svg|vignette|Lentille hémisphérique.]] Considérons une lentille hémisphérique de rayon R faite d’un verre d’indice de réfraction ''n''. Nous plaçons une source ponctuelle à une distance ''d'' du dioptre plan, sur l’axe optique. Tracer des rayons partant de la source et traversant la lentille. {{clear}} {{Boîte déroulante/début |titre=Analyse d’optique géométrique}} [[Fichier:Lentille hemispherique analyse geometrique.svg|vignette|Analyse géométrique du problème.]] Il s’agit d’un problème ayant une symétrie de révolution par rapport à l’axe optique. Nous pouvons nous réduire à un problème plan en nous plaçant dans un plan contenant l’axe optique ; l’axe optique est encore un axe de symétrie orthogonale, nous pouvons donc nous contenter d'étudier un demi-plan. Pour simplifier, nous plaçons le centre du dioptre sphérique à l’origine O du repère. L’axe optique est l’axe ''x'' et l'axe perpendiculaire, vertical sur la figure, c’est l’axe ''y''. Les coordonnées de la source sont donc (-''d'' ; 0). Le rayon issu de la source et faisant un angle θ avec l’axe ''x'' frappe le dioptre plan à l’altitude ''h''. Nous avons : : ''h'' = ''d'' ⋅ tan θ. L’angle d’incidence vaut θ. D’après la loi de Snell-Descartes, l'angle de réfraction θ<sub>2</sub> vaut : : θ<sub>2</sub> = arcsin((sin θ) / ''n''). Le rayon réfracté passe par le points de coordonnées (0, ''h''). L’équation de la droite est donc : : ''y'' = a ⋅ ''x'' + ''h'' avec : ''a'' = tan θ<sub>2</sub>. L’équation du cercle de centre O et de rayon R est : : ''x''<sup>2</sup> + ''y''<sup>2</sup> = R<sup>2</sup>. Les coordonnées (''x''<sub>M</sub>, ''y''<sub>M</sub>) de l’intersection M du rayon avec le dioptre sphérique vérifient les deux équations. Par substitution, nous obtenons une équation du second degré en ''x'' que nous savons résoudre : : ''x''<sub>M</sub><sup>2</sup> + (''a'' ⋅ ''x''<sub>M</sub> + ''h'')<sup>2</sup> = R<sup>2</sup> : ⇔ (1 + ''a''<sup>2</sup>) ⋅ ''x''<sub>M</sub><sup>2</sup> + 2 ⋅ ''a'' ⋅ ''h'' ⋅ ''x''<sub>M</sub> + ''h''<sup>2</sup> – R<sup>2</sup> = 0. D’après les propriétés du cercle, le rayon est perpendiculaire à la tangente. Le rayon [OM] est donc normal au dioptre en M. Nous pouvons déterminer l’angle d’incidence θ<sub>i</sub> par le produit scalaire : : <math>\begin{pmatrix} 1 \\ a \end{pmatrix} \cdot \begin{pmatrix} x_\mathrm{M} \\ y_\mathrm{M} \end{pmatrix} = \sqrt{1^2 + a^2} \cdot \mathrm{R} \cdot \cos(\theta_\mathrm{i})</math> ce qui nous permet de calculer cet angle : : <math>\theta_\mathrm{i} = \operatorname{arcos} \left ( \frac{x_\mathrm{M} + a \cdot y_\mathrm{M}}{\mathrm{R} \cdot \sqrt{1^2 + a^2} } \right )</math> Comme nous passons vers un milieu d’indice plus faible, il y a un risque de réflexion totale. L’angle limite est : : θ<sub>max</sub> = arcsin(1/''n''). Si l’on a θ<sub>i</sub> &gt; θ<sub>max</sub>, le rayon repart vers l’intérieur. Nous ne traçons pas le rayon car cela nous emmènerait trop loin dans l’analyse. En revanche, si θ<sub>i</sub> ≤ θ<sub>max</sub>, alors nous pouvons appliquer la loi de Snell-Descartes pour avoir l’angle de réfraction θ<sub>e</sub> : : θ<sub>e</sub> = arcsin(''n'' ⋅ sin θ<sub>i</sub>). Pour tracer le rayon sortant, il nous faut l’angle θ<sub>3</sub> par rapport à l’horizontale. L’angle du rayon [OM] par rapport à l’horizontal vaut arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>), nous avons donc : θ<sub>3</sub> = arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>) + θ<sub>e</sub>. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Analyse algorithmique}} '''Structure des données''' Le problème est décrit par trois paramètres : # Le rayon <code>R1</code> de la lentille, en milliètres (réel en virgule flottante). # L’indice du verre, <code>n</code> sans dimension (réel en virgule flottante). L’indice de l’air vaut 1. # La distance de la source au dioptre d’entrée plan, <code>d</code> en millimètres (réel en virgule flottante). Un rayon est caractérisé par quatre paramètres : # L’angle d’émission <code>theta1</code> en radians (réel en virgule flottante). # L’angle de réfraction dans la lentille <code>theta2</code> en radians (réel en virgule flottante). # Les cordonnées <code>M</code> en millimètre (vecteur de dimension 2 <code>([x, y])</code> de réels en virgule flottante) du point d’intersection du rayon avec le dioptre sphérique. # L’angle de réfraction dans l’air après la lentille <code>theta3</code> en radians (réel en virgule flottante). Pour le calcul et le tracé, nous avons besoin des paramètres intermédiaires suivants : * l’altitude ''y'' = <code>h</code> en millimètres (réel en virgule flottante) à laquelle le rayon frappe le dioptre plan d’entrée ; * l’angle d’incidence du rayon avec le dioptre sphérique <code>thetaint</code> en radians (réel en virgule flottante). Les angles sont stockés en radians car c’est l’unité naturelle pour le calcul mais nous affichons les valeurs en degrés. Comme le calcul de conversion est récurrent, nous conservons les facteurs <code>degversrad</code> (conversion des degrés vers les radians, facteur valant π/180, réel en virgule flottante) et <code>radversdeg</code> (conversion des radians vers les degrés, facteur valant 180/π, réel en virgule flottante). '''Fonctions''' Nous avons besoin d’une fonction qui calcule les trois paramètres du rayon <code>(theta2, M, theta3)</code> à partir de l’angle d’émission <code>theta1</code>. Nous appelons cette fonction <code>lanceRayon()</code>. Cette fonction fait appelle à une fonction qui calcule l’angle du rayon réfracté à partir de l’angle du rayon incident <code>theta1</code>, les deux angles étant par rapport à la normale au dioptre au point considéré. Nous appelons cette fonction <code>refrac()</code>. La recherche de l’intersection <code>M</code> du rayon avec le dioptre sphérique nécessite de résoudre une équation du second degré. Nous utilisons pour cela la recherche des racines du polynôme en <code>x</code> avec la fonction <code lang="python">numpy.polynomial.polynomial.polyroots()</code>. D’après la configuration du problème géométrique, si l’on s’assure que le rayon frappe bien la lentille (0 ≤ <code>h</code> ≤ <code>R1</code>) alors nous sommes sûrs que le problème a deux solutions réelles (une positive et une négative) ou, dans le cas dégénéré où <code>h == R1</code>, une valeur unique <code>x == 0</code>. Comme nous recherchons la valeur positive, nous sélectionons la plus grande des deux racines. Pour la gestion de la réflexion interne : dans la fonction <code>refrac()</code>, nous vérifions les conditions de réflexion totale et si elles sont remplies, alors nous générons une erreur (commandes <code lang="python">try… except</code> et <code lang="python">raise ValueError</code>). Cette erreur est propagée à la fonction <code>lanceRayon()</code> : <code>lanceRayon()</code> appelle la fonction <code>refrac()</code> et si cette fonction renvoie une erreur, alors <code>lanceRayon()</code> renvoie également une erreur. Pour trouver l’angle d’émission <code>thetaLimite</code> provoquant la réflexion totale (en radians, réel en virgule flottante), nous effectuons une recherche par dichotomie : * nous partons de l’angle maximum possible, lorsque le rayon frappe le sommet de la lentille, et nous appelons la fonction <code>lanceRayon()</code> ; si cela ne génère pas d’erreur, alors nous pouvons aller jusqu’à cette valeur, la recherche est terminée ; si cela génère une erreur, alors nous divisons la valeur par deux ; * à une étape de la recherche donnée, si <code>lanceRayon()</code> ne génère pas d’erreur avec l’angle testé, alors nous savons que l’angle limite est supérieur à cette valeur ; cette valeur minore donc la valeur recherchée ; si au contraire <code>lanceRayon()</code> génère une erreur, alors c’est que l’angle est trop important, cette valeur majore donc la valeur recherchée ; nous pouvons ainsi resserer l’intervalle de recherche ; * nous nous arrêtons lorsque les valeurs haute et basse sont suffisamment proche. Concrètement : # Nous définissons une variable <code>angleHaut</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus bas connu provoquant la réflexion totale. # Nous définissons une variable <code>angleBas</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus haut connu ne provoquant pas de réflexion totale. Sa valeur initiale est 0. L’angle limite recherché est donc entre <code>angleBas</code> et <code>angleHaut</code>. # Nous définissons l’angle <code>angleTest</code> comme étant la moyenne entre <code>angleBas</code> et <code>angleHaut</code>. Si <code>lanceRayon(angleTest)</code> génère une erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleHaut</code> (puisque c’est une valeur provoquant la réflexion totale et qu’elle est plus basse que la valeur actuelle d’<code>angleHaut</code>). À l’inverse, si <code>lanceRayon(angleTest)</code> ne génère pas d’erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleBas</code> (puisque c’est une valeur ne provoquant pas la réflexion totale et qu’elle est plus haute que la valeur actuelle d’<code>angleBas</code>). # Nous arrêtons la procédure lorsque l’écart entre <code>angleBas</code> et <code>angleHaut</code> est inférieur à {{unité|10|échelle=<sup>–3</sup>|rad}} (valeur arbitraire). La valeur retenue est la valeur finale d’<code>angleBas</code> (puisque l’on veut être sûr qu’il n’y ait pas de réflexion totale). La valeur affichée est la valeur en degrés arrondie au dixième. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Solution}} Nous demandons à l’utilisateur ou à l’utilisatrice les valeurs des paramètres du problème : rayon de la lentille, distance de la source, indice de réfraction du verre. Nous vérifions que les valeurs entrées sont bien des nombres ; si c’est une chaîne vide, alors nous utilisons une valeur par défaut. Nous créons une fonction <code>refrac()</code> qui permet de calculer l’angle réfracté à partir de l’angle d’incidence et des indices de réfraction. S’il y a rélexion totale, alors nous générons une erreur. La fonction <code>lanceRayon()</code> calcule les différents points de passage du rayon. Elle appelle pour cela la fonction <code>refrac()</code>. Si un appel de la commande <code>refrac()</code> génère une erreur, alors nous générons également une erreur. Nous déterminons l’angle d’émision du rayon <code>thetaLimite</code> qui provoque une réflecxion totale. Pour cela, nous créons une fonction <code>rechercheLimite()</code> qui cherche par dichotomie. Nous traçons un rayon tous les 5° jusqu’à la valeur limite. <syntaxhighlight lang="python"> #!/usr/bin/env python3 # coding: utf-8 """nom : lancerRayons.py auteur : User:cdang date de création : 2022-05-06 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : NumPy, matplotlib ---------------------------------------------------------------------------- Objectif : trace des trajets optique avec une lentille hémisphérique Entrées ------- Le rayon de la lentille, la distance de la source, l’indice de réfraction du verre, trois chaînes de caractères saisies par l’utilisateur·rice et qui sont converties en réels. Sorties ------- La valeur limite de l’angle (réel) et le tracé de plusieurs rayons. """ # ****************************************************** # ****************************************************** # ** Lancer de rayons pour une lentille hémisphérique ** # ****************************************************** # ****************************************************** import numpy as np import matplotlib.pyplot as plt import numpy.polynomial.polynomial as nppol # ************** # * Constantes * # ************** # Pour la conversion degrés ↔ radians radversdeg = 180/np.pi degversrad = 1/radversdeg # ************* # * Fonctions * # ************* def boucleEntreeNombre(messageSaisie, valeurDefaut): """Permet de s’assurer que l’utilisateur·rice a bien entré un nombre. Entrée : — message à afficher (chaîne de caractères) ; — valeur par défaut (réel à virgule flottante). Sortie : nombre (réel à virgule flottante).""" messageErreur = "Veuillez entrer une valeur numérique (ou vide pour accepter la valeur par défaut).\n" execute = True while execute: strNombre = input(messageSaisie+f" (valeur par défaut {valeurDefaut}) : ") if strNombre == "": nombre = valeurDefaut execute = False else: try: nombre = float(strNombre) except: print(messageErreur) else: execute = False return nombre def initialisation(): """L’utilisateur·rice entre les variables du problème. Entrées : aucune. Sorties : — R1 (mm) : rayon de la lentille ; — d (mm) : distance de la source au dioptre plan ; — n (sans dimension) : indice de réfraction du verre.""" R1 = boucleEntreeNombre("Rayon de la lentille en mm", 20.0) d = boucleEntreeNombre("Distance de la source au dioptre plan en mm", 20.0) n = boucleEntreeNombre("Indice de réfraction (sans dimension)", 1.5) return (R1, d, n) def refrac(n1, n2, theta1): """Calcule l’angle de réfraction theta2 (radians) en fonction — de l’angle d’incidence theta1 (radians); — de l’indice de réfraction n1 du premier milieu ; — de l’indice de réfraction n2 du second milieu.""" reflexionTotale=False rapport=n2/n1 rapportinv=np.reciprocal(rapport) if n1 > n2: thetal = np.arcsin(rapport) # angle limite pour la réflexion totale if theta1 >= thetal: reflexionTotale=True if reflexionTotale: print("Réflexion totale") raise ValueError else: return np.arcsin(rapportinv*np.sin(theta1)) def lanceRayon(n1, n2, d, R, theta1): """Détermine le rayon issu de la source située à une distance d (mm) du bareau et avec une élévation de theta1 (radians), en fonction des indices de réfraction n1 et n2. Les éléments retournés sont : — la hauteur h (mm) à laquelle le rayon frappe le barreau ; — l’angle de réfraction theta2 (radians)) dans le barreau ; — l’angle de réfraction theta3 (radians) à la sortie du barreau — le point M(x, y) (mm) auquel le rayon sort du barreau.""" h = d*np.tan(theta1) if h >= R: print("Le rayon est au-dessus du barreau") raise ValueError else: theta2 = refrac(n1, n2, theta1) a = np.tan(theta2) x = max(nppol.polyroots([h*h - R*R, 2*a*h, 1+a*a])) # recherche de l’intersection du rayon avec le cercle y = a*x + h M = np.array([x, y]) thetaint = np.arccos((x + a*y)/(R*np.sqrt(1 + a*a))) theta3 = np.arctan(y/x) - refrac(n2, n1, thetaint) return (h, theta2, theta3, M) def rechercheLimite(n1, n2, d, R): """Recherche l’angle limite pour la réflexion totale. Entrée : — indice de réfraction des milieux 1 et 2, n1 et n2 ; — distance au barreau, d(mm). Sortie : angle limite theta (radians)""" angleHaut = np.arctan(R/d) angleBas = 0 angleTest = angleHaut try: lanceRayon(n1, n2, d, angleTest, R) except: condition = True # il y a réflexion total en haut de la lentille else: condition = False # il n’y a jamais réflexion totale dans la lentille while condition: #dichotomie angleTest = np.mean([angleHaut, angleBas]) # on ajuste la valeur de test try: lanceRayon(n1, n2, d, R, angleTest) except: angleHaut = angleTest # réflexion totale : on abaisse la valeur maximale else: angleBas = angleTest # pas de réflexion totale : on monte la valeur minimale condition = ((angleHaut - angleBas) >= 0.001) # on a cerné la limite à 0,001 rad près if not condition: angleTest = angleBas return angleTest # *********************** # * Programme principal * # *********************** (R1, d, n) = initialisation() xmax = round(R1 + d) thetaLimite = rechercheLimite(1, n, d, R1) thetaLimiteDeg = thetaLimite*radversdeg print(f"Angle limite pour la réflexion totale : {thetaLimiteDeg:.1f}°.\n") anglesDeg = np.arange(0, thetaLimiteDeg, 5)[1:] # trace un rayon tous les 5° anglesRad = anglesDeg*degversrad nb = len(anglesDeg) h = np.zeros(nb) # initialisation des vecteurs de valeurs theta2 = np.zeros(nb) theta3 = np.zeros(nb) M = np.zeros((nb, 2)) for i in range(nb): (h[i], theta2[i], theta3[i], M[i, :]) = lanceRayon(1, n, d, R1, anglesRad[i]) (h_lim, theta2_lim, theta3_lim, M_lim) = lanceRayon(1, n, d, R1, thetaLimite) # tracé anglesCercle = 0.5*np.pi*(np.linspace(1, 0, 20)) x_cercle = R1*np.cos(anglesCercle) # coordonnées des pints du cercle y_cercle = R1*np.sin(anglesCercle) fig = plt.plot([-d,xmax], [0, 0], "k-.", linewidth="0.5") # tracé de l’axe optique for i in range(nb): plt.plot([-d, 0, M[i, 0], xmax], [0, h[i], M[i, 1], M[i, 1] + (xmax - M[i, 0])*np.tan(theta3[i])], label=f"{anglesDeg[i]:.0f}°") plt.plot([-d, 0, M_lim[0], xmax], [0, h_lim, M_lim[1], M_lim[1] + (xmax - M_lim[0])*np.tan(theta3_lim)], label=f"{0.1*int(np.trunc(10*thetaLimite*radversdeg)):.1f}°") plt.plot(x_cercle, y_cercle, "k", linewidth="0.5") # tracé du cercle plt.plot([0,0], [0, R1], "k", linewidth="0.5") # tracé du premier dioptre #plt.axis("square") plt.gca().set_aspect("equal", adjustable="box") plt.xlabel("x (mm)") plt.ylabel("y (mm)") plt.title("Lentille hémisphérique, lancer de rayons") plt.legend() plt.savefig("lentille_hemispherique_lancer_rayon.svg", format="svg") plt.show() </syntaxhighlight> {{Boîte déroulante/fin}} == Mesurer le temps == Le module <code>time</code> fournit les fonctions suivantes : * <code>time.gmtime()</code> : renvoie la date et l'heure du méridien de Greenwich (''{{lang|en|Greenwich mean time}}'', GMT), sous la forme d'un dictionnaire (année, mois, jour du mois, heure, minute, seconde, jour de la semaine, jour de l'année, heure d'été/hiver), ** jour de la semaine est un entier entre 0 (lundi) et 6 (dimanche), ** jour du mois est un entier entre 1 et 366 ; * <code>time.localtime()</code> : comme le précédent, mais l'heure est l'heure locale ; * <code>time.time()</code> : donne le nombre de seconde qui se sont écoulées depuis le 1er janvier 1970 ; * <code>time.gmtime(n)</code> et <code>time.localtime(n)</code> transforment un nombre de secondes (écoulées depuis le 1er janvier 1970) en une date au format (année, mois, jour, etc.), n-uplet de neuf valeurs ; <code>time.mktime()</code> fait le contraire, il transforme un n-uplet de neuf valeurs (années, mois, jour, etc.) en un nombre de secondes (écoulées depuis le 1er janvier 1970) ; * <code>time.sleep(n)</code> : provoque une pause dans le déroulement du programme de ''n'' secondes ; * <code>time.perf_counter()</code> : indique une date en seconde ; s'utilise pour mesurer la durée d'exécution d'une partie du code, en faisant la différence entre deux relevés. Concernant la date et l'heure sous la forme d'un n-uplet, on peut extraire l'heure de la manière suivante : <syntaxhighlight lang="python"> import time a = time.localtime() print("Il est ", a[3], "h", a[4]) # ou bien print("Il est ", a.tm_hour, "h", a.tm_min) </syntaxhighlight> Pour mesurer la performance d'une portion de code : <syntaxhighlight lang="python"> import time t1 = time.perf_counter() <suite d’instructions> t2 = time.perf_counter() print("Durée d'exécution :", t2-t1 </syntaxhighlight> == Programmation orientée objet == Nous n'allons pas ici faire un cours de programmation orientée objet (POO), nous allons aborder le sujet de manière pragmatique. De manière schématique, un « objet » est une « super-variable ». Cette super-variable peut contenir plusieurs variables, appelées « attributs » ; elle contient en fait un dictionnaire (paires « nom d'attribut : valeur d'attribut »). Elle peut aussi contenir des fonctions spécifiques appelées « méthodes ». De même qu'une variable a un type, un objet fait partie d'une « classe ». La classe est le modèle de l'objet ; en franglais informatique, on dit que l'objet est une instance de la classe. La POO est donc un formalisme : lorsque l'on définit des variables et des fonctions concernant un même type d'objet (au sens commun du terme), on les empaquette dans une classe. Il faut donc d'abord définir la classe, puis attribuer cette classe à un objet (« instancier » la classe). Considérons par exemple que nous voulons travailler sur des [[w:Engrenage|engrenages]] ; pour simplifier, nous nous contentons d'engrenages à dentures droites. Une roue dentée, un pignon, est essentiellement définie par son nombre de dents Z et par son module ''m'' qui correspond à la largeur de dents<ref>ainsi que par son épaisseur ''e'' et le matériau dont elle est faite mais nous allons négliger ces paramètres pour la simplicité de l'étude.</ref>. Nous allons définir trois méthodes : la méthode <code>.diametrePrimitif()</code> qui calcule le diamètre primitif de la roue dentée, <code>.pas()</code> qui calcule la largeur des dents au niveau du cercle primitif et <code>.rapport()</code> qui calcule le rapport de transmission de deux roues engrenées Z<sub>1</sub>/Z<sub>2</sub>. La méthode <code>.rapport()</code> vérifie par ailleurs que les roues ont le même module, condition indispensable pour former un engrenage. Nous définissons la classe ainsi : <syntaxhighlight lang="python"> class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): # instructions lancées lors de la déclaration """Valeurs des attributs""" self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z </syntaxhighlight> Nous remarquons que lorsque nous déclarons les méthodes, le paramètre <code>self</code> correspond à l'objet lui-même. Ainsi, dans la méthode <code>.rapport()</code>, la variable <code>self.Z</code> est le nombre de dents de la roue elle-même et <code>roueDentee.Z</code> est le nombre de dents de la roue passée en paramètre. Pour déclarer les roues, nous écrivons : <syntaxhighlight lang="python"> roue1 = pignon() # attribution de la classe, « instanciation » roue1.Z = 13 # définition des caractéristiques du pignon « roue1 » roue1.m = 2 roue2 = pignon(16, 2) # manière alternative </syntaxhighlight> Nous pouvons alors utiliser les objets de la manière suivante : <syntaxhighlight lang="python"> print(roue1.Z) # 13 print(roue1.diametrePrimitif()) # 26 R = roue1.rapport(roue2) # 0.8125 </syntaxhighlight> La commande <code>dir(a)</code> affiche tous les attributs et méthodes de l'objet <code>a</code>. ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/classes.html | titre = Classes | site = Python documentation | consulté le = 2019-03-08 }} == Interface graphique avec Tk == Une interface graphique utilisateur (GUI, ''{{lang|en|graphic user interface}}'') est un ensemble de boîtes permettant d'interagir avec l'utilisateur, c'est-à-dire qui permettent la saisie d'informations, l'exécution d'actions et l'affichage d'informations. L'interface se compose d'éléments appelés ''{{lang|en|widgets}}''. Les éléments ''({{lang|en|widgets}})'' classiques sont : * boîte de dialogue ''({{lang|en|dialog box}})'' : fenêtre contenant d'autres éléments ; * étiquette ''({{lang|en|label}})'' : texte affiché ; * liste déroulante ''({{lang|en|drop-down list}})'' : zone permettant le choix d'une option, la liste se déployant lorsque l'on clique sur la zone ; * zone de texte, champ de saisie ''({{lang|en|text box}})'' : zone permettant de taper du texte ; * boîte combinée ''({{lang|en|combo box}})'' : zone de saisie de texte contenant une liste déroulante qui permet de choisir des éléments prédéfinis ; * bouton ''({{lang|en|button}})'' : objet effectuant une action lorsque l'on clique dessus ; * case à cocher ''({{lang|en|checkbox, tickbox}})'' : objet permettant d'activer ou de désactiver une option lorsque l'on clique dessus ; * bouton radio, case d'option ''({{lang|en|radio button}})'' : objet permettant d'activer une option en désactivant les autres options ; une seule option peut être activée à la fois. Plusieurs modules permettent de gérer les interfaces graphiques. Nous choisissons ici le module développé sur la bibliothèque Tk qui est une bibliothèque multiplateforme. Pour cela, nous importons le module <code>tkinter</code> ainsi que le module <code>ttk</code>, ce dernier proposant des options plus « modernes » : <syntaxhighlight lang="python"> import tkinter as tk from tkinter import ttk </syntaxhighlight> Voici un programme permettant comme précédemment de calculer le rapport de transmission d'un engrenage. Nous détaillons sa construction ci-après. <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: IUrapport.set(valeurZ2/valeurZ1) except: IUrapport.set("erreur") # ************************* # ************************* # ** Interface graphique ** # ************************* # ************************* # fenetre principale fenetre = tk.Tk() fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> [[Fichier:Organisation interface Tk Python.svg|vignette|upright=2|Organisation des ''widgets''.]] '''Explications''' Nous commençons par définir la boîte de dialogue que nous appelons <code>fenetre</code> ; c'est un objet <code>Tk</code> et nous lui donnons un titre « » : <syntaxhighlight lang="python"> fenetre = tk.Tk() fenetre.title("Rapport de réduction") </syntaxhighlight> Puis, nous définissons un cadre attaché à cette fenêtre et qui va nous permettre « d'accrocher » les autres éléments, ce qui permet de garder une apparence satisfaisante lorsque l'on retaille la fenêtre : <syntaxhighlight lang="python"> cadre = ttk.Frame(fenetre) </syntaxhighlight> Le cadre va comporter six lignes ''({{lang|en|row}})'' et deux colonnes ''({{lang|en|column}})''. Nous allons placer une étiquette ''({{lang|en|label}})'' « z1 » : <code>text="z1"</code>. Cette étiquette se trouve dans une case du cadre, celle de la première colonne et la première ligne : <code>grid(column=1, row=1)</code>. Par rapport à cette case, elle est collée à « l'ouest » (W, ''{{lang|en|west}}'', gauche) de la case : <code>sticky=tk.W</code>. <syntaxhighlight lang="python"> z1_label = ttk.Label(cadre, text="z1") # Création de l'étiquette z1_label.grid(column=1, row=1, sticky=tk.W) # Placement de l'étiquette </syntaxhighlight> Notez que l'on aurait pu écrire directement : <syntaxhighlight lang="python"> ttk.Label(cadre, text="z1").grid(column=1, row=1, sticky=tk.W) </syntaxhighlight> mais le fait de séparer la création de l'élément et son placement facilite la maintenance (recherche d'erreur, évolution du code). Pour tout ce qui est dynamique, c'est-à-dire les zone de saisie des valeurs et l'affichage du résultat, il faut définir des « chaînes variables » ''({{lang|variable strings}})'' : <syntaxhighlight lang="python"> IUz1 = tk.StringVar() </syntaxhighlight> Cette variable est une variable globale à la création. Nous pouvons alors placer la zone de saisie ''({{lang|en|entry}})'' à côté de l'étiquette lui correspondant. Nous nommons la zone de saisie <code>z1_entry</code> : <syntaxhighlight lang="python"> z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) </syntaxhighlight> Nous faisons de même pour les trois autres paramètres de l'engrenage, ''m''<sub>1</sub>, ''z''<sub>2</sub> et ''m''<sub>2</sub>. Le résultat est également une chaîne variable globale. Par rapport à notre mise en page, elle se situe dans la case colonne 2 ligne 5, centrée sur cette case (collé à l'est et à l'ouest) : <syntaxhighlight lang="python"> rapport = tk.StringVar() rapport_dynamique = ttk.Label(cadre, textvariable=rapport) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) </syntaxhighlight> Il nous faut encore définir une fonction de manière classique, nous l'appelons « calcule ». Les variables étant globales, on les utilise directement. On récupère les valeurs avec la méthode <code>get()</code> et nous modifions la valeur avec la méthode <code>set()</code> : <syntaxhighlight lang="python"> def calcule(): valeurZ1 = float(IUz1.get()) valeurZ2 = float(IUz2.get()) IUrapport.set(valeurZ2/valeurZ1) </syntaxhighlight> Cette fonction est déclenchée lorsque l'on clique sur le bouton « Calcul » situé dans la case du cadre ligne 6 colonne 2 : <syntaxhighlight lang="python"> bouton = ttk.Button(cadre, text="Calcul", command=calcule) bouton.grid(column=2, row=6, sticky=tk.W) </syntaxhighlight> ou bien si l'on appuie sur la touche <code>[entrée]</code> du clavier : <syntaxhighlight lang="python"> fenetre.bind("<Return>", calcule) </syntaxhighlight> À tout ceci, nous ajoutons des « gouttières » (marges, ''{{lang|en|paddings}}'') afin d'espacer les éléments. Il faut ensuite « activer » la fenêtre pour qu'elle s'affiche. La méthode est <code>mainloop()</code> (boucle principale) : « boucle » (elle est active en permanence et attend des actions sur ses éléments), <syntaxhighlight lang="python"> fenetre.mainloop() </syntaxhighlight> Nous avons ci-dessus mis la plupart du code en programme principal. Nous pouvons aussi programmer de manière fonctionnelle, en mettant la plupart du code dans des fonctions ; cependant, pour que la fenêtre et les variables dynamiques soient globales à tout le programme, elles doivent être déclarées dans le programme principal. Nous pouvons aussi mêler la programmation orientée objet. {{boîte déroulante début|Calcul du rapport de transmission en programmation fonctionnelle et orientée objet}} <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # ************* # ************* # ** Classes ** # ************* # ************* class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): """Valeurs des attributs""" # instructions lancées lors de la déclaration self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z # ************************ # ************************ # ** Variables globales ** # ************************ # ************************ # fenetre principale fenetre = tk.Tk() # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: roue1 = pignon(valeurZ1, valeurM1) roue2 = pignon(valeurZ2, valeurM2) IUrapport.set(roue1.rapport(roue2)) except: IUrapport.set("Erreur") # *********************** # * Interface graphique * # *********************** def configureFenetre(): """Configuration de la fenêtre principale""" fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* configureFenetre() # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> {{boîte déroulante fin}} == Annotations == Une annotation est un commentaire qui sert à expliciter un type de variable. La syntaxe est différente des commentaires « classiques » : cela permet d'avoir un affichage différent avec les éditeurs de texte ayant une coloration syntaxique, et ces informations peuvent être récupérées par des logiciels extérieurs pour effectuer une documentation automatique ou bien des vérifications de type. Cependant : * comme les commentaires normaux, ils n'ont aucune influence lors de l'exécution du texte ; en particulier : * rien n'oblige à annoter les variables ; * il est possible d'avoir une variable ayant un type différent de son annotation ; le fait de pouvoir définir et changer le type de variable à la volée est une fonctionnalité fondamentale de Python. La syntaxe pour une annotation est : : nom_de_variable + deux-points + espace + type par exemple : <syntaxhighlight lang="python"> a: int </syntaxhighlight> Notez qu'ici, la variable n'est ''pas'' créée. Pour la créer, il faut lui affecter une valeur. Il est possible de l'affecter après ou bien sur la même ligne avec la syntaxe : : nom_de_variable + deux-points + espace + type + espace + égal + espace + valeur par exemple : <syntaxhighlight lang="python"> a: int a = 5 # est équivalent à a: int = 5 </syntaxhighlight> Même si l'annotation n'a pas d'impact sur l'exécution, le type doit être un type existant sinon cela génère une erreur de syntaxe. Les types classiques sont : : <code>int</code> — <code>float</code> — <code>str</code> — <code>bool</code> — <code>list</code> — <code>tuple</code> — <code>dict</code> Il est également possible de mettre une chaîne de caractères : <syntaxhighlight lang="python"> a: "ce que je veux" = 3.1516 </syntaxhighlight> On peut annoter une fonction. Il est possible d'annoter les variables déclarées au sein de la fonction, mais pas les variables globales (puisqu'elle ne sont pas définie au sein de la fonction). On peut aussi annoter : * les variables passées en paramètre, avec la même syntaxe dans les parenthèses ; * annoter le type de la variable de sortie (retournée) en la faisant précéder de <code>-&gt;</code> : <syntaxhighlight lang="python"> def plusCinq(a: float = 0) -> float: return a + 5 </syntaxhighlight> ; Ressources * {{lien web | url = https://www.python.org/dev/peps/pep-0526/ | titre = PEP 526 -- Syntax for Variable Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} * {{lien web | url = https://www.python.org/dev/peps/pep-3107/ | titre = PEP 3107 -- Function Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} == Décorateur == Un décorateur est une fonction qui s'applique à une fonction, à la manière de la composition mathématique ''g'' ∘ ƒ = ''g''(ƒ). Mais cette composition affecte la fonction elle-même ; l'utilisateur appelle la fonction ƒ mais c'est la fonction ''g'' ∘ ƒ qui s'exécute. Cette fonction ''g'' est appelée le décorateur. L'intérêt est de pouvoir modifier une fonction sans modifier le code de la fonction elle-même. Pour appliquer une décoration, il faut : # Déclarer le décorateur : une fonction qui s'applique à une autre fonction. # Affecter le décorateur à la fonction visée : en mettant <code>@''décoration''</code> juste avant la définition de la fonction. Par exemple : <syntaxhighlight lang="python"> def decorateur(f): print("Avant la fonction") f() print("après la fonction") @decorateur def afficheFoo(): print("Foo.") afficheFoo # Avant la fonction # Foo. # Après la fonction </syntaxhighlight> Lorsque l'on appelle <code>afficheFoo</code>, on appelle en fait <code>decorateur(afficheFoo)</code>. Si la fonction à modifier admet des paramètres, il faut définir une fonction enveloppante dans le décorateur. Par exemple, nous définissons ci-dessous un décorateur <code>deuxFois()</code> qui fait s'exécuter deux fois de suite la fonction : <syntaxhighlight lang="python"> def deuxFois(f): def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # conteneurFonction </syntaxhighlight> Nous voyons que l'application du décorateur a modifié le nom de la fonction — pas le nom de la variable qui contient la fonction mais bien son nom « intime ». Pour éviter cela, on utilise la méthode <code>wraps()</code> du module <code>functools</code> : <syntaxhighlight lang="python"> import functools def deuxFois(f): @functools.wraps(f) def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # plusCinq </syntaxhighlight> On peut par exemple utiliser un décorateur pour la mémoïsation. La mémoïsation est une méthode consistant à mémoriser les valeurs d'une fonction au fur et à mesure de son utilisation ; ainsi, si l'on veut évaluer la fonction avec les mêmes entrées, on se contente d'aller chercher la valeur enregistrée ce qui est plus rapide. On sacrifie donc la place mémoire au profit de la rapidité. On peut trouver des décorateurs de mémoïsation aux adresses suivantes : * https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize * https://gist.github.com/robcowie/1357800 ; Ressources : {{lien web | url = https://www.python.org/dev/peps/pep-0318/ | titre = PEP 318 -- Decorators for Functions and Methods | site = Python.org | lang = en | consulté le = 2019-04-05 }} == Manipulation de fichiers == === Importer le contenu d'un fichier === Python possède la fonction <code lang="python">open()</code> qui permet d'ouvrir un fichier. Ouvrir signifie qu'il crée un objet de type <code>file</code> qui possède notamment les méthodes <code lang="python">read()</code> et <code lang="python">write()</code>. Il peut s'agir d'un objet de type « fichier binaire » ''({{lang|en|binary file}})'' ou « fichier texte » ''({{lang|en|text file}})''. Si par exemple on veut utiliser (et donc lire) le contenu du fichier texte <code>monfichier.txt</code>, on écrit : <syntaxhighlight lang="python"> fichier = open("monfichier.txt", "rt") … fichier.close() </syntaxhighlight> Le paramètre <code>"rt"</code> signifie que nous ouvrons le fichier en lecture ''({{lang|en|read}})'' et qu'il s'agit d'un objet de type fichier texte. Notons deux choses : * en faisant cela, nous ne faisons qu'associer le fichier à un objet Python, nous n'avons pas encore importé les données ; * si nous ouvrons le fichier, il faut le fermer par la suite ; c'est pourquoi nous utilisons la méthode <code lang="python">.close()</code>. Pour éviter d'avoir à fermer le fichier, nous pouvons l'ouvrir au sein d'un contexte : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: … </syntaxhighlight> Notons aussi que la chaîne de caractères indiquant le nom du fichier peut contenir le chemin d'accès au répertoire (dossier), mais sous Microsoft Windows, il faut utiliser des barres de fractions <code>/</code> pour séparer les sous-répertoires au lieu de la barre inversée habituelle, par exemple : <syntaxhighlight lang="python"> chemin = "C:/Temp/monfichier.txt" with open(chemin, "rt") as fichier: … </syntaxhighlight> Pour mettre les données du fichier dans la variable <code>contenu</code>, nous écrivons donc : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() print(contenu) </syntaxhighlight> et si nous ne voulons lire que les <code>n</code> premiers caractères (<code>n</code> étant un entier), nous utilisons <code lang="python">contenu = fichier.read(n)</code>. Cette lecture est séquentielle, c'est-à-dire que si nous appliquons la méthode plusieurs fois, nous reprenons la lecture là où nous l'avons laissée. Si nous voulons lire une ligne, nous utilisons la méthode <code lang="python">.readline()</code>. La lecture ligne par ligne est également séquentielle. Nous pouvons aussi créer une liste dont chaque élément est une ligne du fichier ; nous utilisons alors la méthode <code lang="python">.readlines()</code> (notez le pluriel). Chaque élément de la liste se termine par le caractère de fin de ligne <code lang="python">\n</code>. Pour l'enlever, nous pouvons utiliser la méthode <code lang="python">.rstrip()</code> pour chaque élément de la liste, par exemple. L'exemple complet est alors : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.readlines() contenu = [item.rstrip() for item in contenu] print(contenu) </syntaxhighlight> === Exporter du contenu vers un fichier === Si nous voulons créer un fichier texte pour y mettre le contenu de la variable <code>texte</code>, alors nous utilisons : <syntaxhighlight lang="python"> with open("monfichier.txt", "wt") as fichier: contenu = fichier.write(texte) </syntaxhighlight> Le module principal important pour la manipulation de fichiers est est <code lang="python">os</code>. === Exploiter le contenu d'un fichier texte === Avec un fichier texte, la méthode <code lang="python">.read()</code> crée une variable de type texte. Nous pouvons séparer cette variable en différentes lignes avec la méthode <code lang="python">.splitlines()</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une ligne. Si maintenant une ligne contient plusieurs données séparées par un séparateur commun, par exemple un espace, nous pouvons séparer les données par la méthode <code lang="python">.split(''séparateur'')</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une donnée. Si par exemple le fichier est du type CSV ''({{lang|en|comma separated values}}'', valeurs séparées par une virgule), l'exploitation du fichier est : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(",") for item in contenu] </syntaxhighlight> La variable <code>contenu</code> est une liste de listes. Pour avoir la ''n''<sup>e</sup> valeurs de la ''m''<sup>e</sup> ligne, on utilise : <syntaxhighlight lang="python"> contenu[m-1][n-1] </syntaxhighlight> Si l'on veut extraire la ligne ''m'' il suffit d'écrire : <syntaxhighlight lang="python"> contenu[m-1] </syntaxhighlight> mais si l'on veut la colonne ''n'', le plus simple est d'utiliser une définitipon en compréhension : <syntaxhighlight lang="python"> [ligne[n-1] for ligne in contenu] </syntaxhighlight> Dans certains fichiers CSV, les séparateurs de valeurs ne sont pas des virgules, on peut donc utiliser un autre caractère pour le séparateur. Si le séparateur est une tabulation, on utilise <code lang="python">\t</code> : <code lang="python">contenu = [item.split("\t") for item in contenu]</code> Si la première ligne contient les en-têtes des colonnes, on peut l'enlever avec la fonction <code lang="python">del()</code> : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() del(contenu[0]) contenu = [item.split(",") for item in contenu] </syntaxhighlight> Certains logiciels créent des fichiers en utilisant le séparateur décimal régional, qui en France est la virgule. Pour remplacer les virgules par des points, on peut utiliser la méthode <code lang="python">.replace()</code>, de préférence ''avant'' de séparer les valeurs : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.replace(",", ".") for item in contenu] # remplace les virgules par des points contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule </syntaxhighlight> en effet, lorsque l'on a séparé les valeurs, on a une liste de liste, il faut alors balayer les sous-listes ce qui prend plus de temps : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule contenu = [[subitem.replace(",", ".") for subitem in item] for item in contenu] # remplace les virgules par des points </syntaxhighlight> '''Exemple complet''' Supposons que l'on ait un fichier texte de la forme : <syntaxhighlight lang="text"> x y z V 0.0 1.5 3.2 8.657 0.4 1.5 3.2 8.392 0.2 1.5 3.2 8.485 ... </syntaxhighlight> C'est un fichier valeurs V associées à des points de coordonnées ''(x, y, z)'' (un champ V sur l'espace, donc). Nous remarquons que seule la coordonnée ''x'' change : les données concernent la droite (''y'' = 1,5 ; ''z'' = 3,2). Nous remarquons aussi que les valeurs de ''x'' ne sont pas classées par ordre croissant ni décroissant. Nous voulons au final avoir une matrice [[''x''], [V]] triée par ''x'' croissant. Pour cela, nous pouvons faire : <syntaxhighlight lang="python"> with open(nomdefichier, "rt") ad fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(" ") for item in contenu contenu = contenu[1:] # élimine la première ligne x = np.array([float(ligne[0]) for ligne in contenu]) V = np.array([float(ligne[3]) for ligne in contenu]) donnees = np.concatenate((x.reshape(-1, 1), V.reshape(-1, 1)), axis=1) # matrice [[x], [V]] ind = np.argsort(donnees[:, 0]) donnees = donnees[ind, :] # matrice triée plt.plot(donnees[:, 0], donnees[:, 1]) </syntaxhighlight> {{note|Pour le tri, voir [[../Manipulation_de_matrices#Fonctions_et_méthodes_de_base|''Manipulation de matrices'' &gt; ''Fonctions et méthodes de base'']].}} === Cas d'un fichier CSV === Si le fichier CSV ne contient que des valeurs numériques, on peut utiliser : <syntaxhighlight lang="python"> valeurs = np.loadtxt(chemin+nomfic, delimiter=",") # si le séparateur est une virgule </syntaxhighlight> Il existe un module <code lang="python">csv</code> dédié aux fichiers CSV. La manipulation du fichier se fait comme suit : <syntaxhighlight lang="python"> import csv with open(chemin+nomfic, "rt") as fichier: lecteur = csv.reader(fichier, delimiter=",") contenu = [ligne for ligne in lecteur] print(contenu) </syntaxhighlight> === Utilisation de Pandas === Pandas<ref>https://pandas.pydata.org/</ref> est un module gérant les tableaux de données, appelés <em lang="en">data frames</em>. Voici quelques commandes utiles : <syntaxhighlight lang="python"> import numpy as np import pandas as pd M = np.random.rand(10, 10) # crée une matrice NumPy aléatoire de dimension 10 × 10 tableau = pd.DataFrame(M) # transforme la matrice en tableau DataFrame tableau.to_csv("tableau.csv") # enregistre le tableau dans un fichier CSV donnees = pd.read_csv("tableau.csv").to_numpy() # lit le fichier et transforme le tableau DataFrame en matrice NumPy </syntaxhighlight> == Exporter un programme Python == Vous pouvez créer un fichier « Python pur » <code>.py</code>. Pour cela, dans le menu <code>fichier/file</code> de Jupyter, choisir <code>télécharger/download</code> au format <code>.py</code> ; le fichier se trouve alors dans le répertoire de téléchargement du navigateur. == Ressources == * {{lien web | url = https://www.python.org/dev/peps/pep-0008/ | titre = PEP 8 -- Style Guide for Python Code | site = Python documentation | consulté le = 2019-03-14 }} == Notes et références == {{références}} ---- [[../Fonctions mathématiques générales|Fonctions mathématiques générales]] &lt; [[../|↑]] &gt; [[../Graphiques|Graphiques]] {{DEFAULTSORT:Elements de programmation}} [[Catégorie:Python pour le calcul scientifique (livre)]] oh7pw8cv3q9binqgnawsm7dhx2aekl6 Programmation Java Swing/Contenu en HTML 0 74455 767360 749363 2026-06-02T16:57:18Z DavidL 1746 /* Limitations CSS */ 767360 wikitext text/x-wiki <noinclude>{{Programmation Java Swing}}</noinclude> La plupart des composants Swing supporte le texte en HTML. Cela permet d'ajouter facilement du texte formaté pour améliorer la présentation de l'interface graphique. == Affichage en HTML == ;JLabel, JButton:Pour un rendu HTML, le texte doit être encadré par <code>&lt;html&gt;</code> et <code>&lt;/html&gt;</code>. :Exemple : :<syntaxhighlight lang="java"> JLabel l_title = new JLabel("<html>Le titre avec <b>une partie en gras</b>,"+ " et <span style=\"color:blue;\">une autre partie en bleu</span>.</html>"); </syntaxhighlight> ;JTextPane:En plus d'encadrer le texte par <code>&lt;html&gt;</code> et <code>&lt;/html&gt;</code>, il faut spécifier le type de contenu, car ce composant supporte plusieurs types de document. :Exemple : :<syntaxhighlight lang="java"> JTextPane tp_exemple = new JTextPane(); tp_exemple.setContentType("text/html"); tp_exemple.setText("<html><head><style>p { margin: 20px 0; }</style></head>"+ "<body><h1>Titre</h1><p>Le texte avec <b>une partie en gras</b>,"+ " et <span style=\"color:blue;\">une autre partie en bleu</span>.</p></body></html>"); </syntaxhighlight> :Ce composant mémorise la feuille de style définie par l'entête (head) du source HTML. :Il faut forcer le changement de type pour la supprimer comme montré ci-dessous : :<syntaxhighlight lang="java"> // Force la suppression de la feuille de style mémorisée : tp_exemple.setContentType("text/plain"); // Utiliser les propriétés du composant comme style par défaut (couleurs, police de caractères) : tp_exemple.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, true); tp_exemple.setContentType("text/html"); tp_exemple.setText("<html><h1>Autre titre</h1><p>Autre texte.</p></html>"); </syntaxhighlight> == Limitations == Swing supporte HTML 4 et CSS 1.0 de manière limitée. === Limitations HTML === * Un élément ne peut avoir qu'une seule classe CSS. {| class="wikitable" |+ Éléments HTML supportés par Swing ! Élément(s) ! Supporté(s) |- | '''&lt;p&gt; &lt;span&gt; &lt;div&gt;''' | Oui |- | '''&lt;b&gt; &lt;i&gt; &lt;u&gt; &lt;sup&gt; &lt;sub&gt;''' | Oui |- | '''&lt;strong&gt; &lt;em&gt;''' | Oui |- | '''&lt;br&gt; &lt;hr&gt;''' | Oui |- | '''&lt;ins&gt; &lt;del&gt;''' | Oui, mais rendu spécifique |- | &lt;pre&gt; | Non |} {| class="wikitable" |+ Attributs supportés par Swing ! Attribut(s) ! Supporté(s) |- | '''href src''' | Oui |- | '''class style''' | Oui |} === Limitations CSS === Le support du langage CSS est très limité. ==== Sélecteurs ==== Les sélecteurs suivants sont supportés : ;''nomÉlément'':Les éléments <code>&lt;nomÉlément&gt;</code>. ;.''classeCSS'':Les éléments ayant l'attribut <code>class=''classeCSS''</code>. ;#''idÉlément'':Les éléments ayant l'attribut <code>id=''idÉlément''</code>. L'enchaînement des éléments est particulier : * Plusieurs sélecteurs pour les mêmes règles de style : utiliser "<code>, </code>" (virgule + espace) pour séparer les sélecteurs. ==== Attributs ==== {| class="wikitable" |+ Attributs supportés ! Attribut(s) ! Supporté(s) |- | '''color background''' | Oui |- | '''font font-family''' | Oui |- | '''border border-spacing''' | Oui |- | border-top border-bottom border-left border-right border-collapse | Oui/Non |- | '''margin padding''' | Oui |- | margin-top margin-bottom margin-left margin-right | Oui/Non |- | padding-top padding-bottom padding-left padding-right | Oui/Non |} ==== Valeurs ==== Les couleurs sont également limitées (pas de transparence, ni de notation hexadécimale courte) : {| class="wikitable" |+ Spécification de couleur supportées ! Couleur ! Supporté |- | <code>red</code>, <code>white</code>, <code>green</code>, ... | Oui |- | <code>#445566</code> | Oui |- | <code>#456</code> | Non |- | <code>#44556640</code> | Non |- | <code>#4564</code> | Non |- | <code>rgb(68,85,102)</code> | Oui |- | <code>rgba(68,85,102,64)</code> | Non |} {| class="wikitable" |+ Unités supportées ! Unité ! Supporté |- | <code>px</code> | Oui |- | <code>%</code> | Oui mais la taille est mal calculée, particulièrement pour les polices de caractères |- | <code>em</code> | Non |} == Tester l'affichage en HTML == L'application dont le code source est ci-dessous permet de tester l'affichage en HTML avec un composant JTextPane. === Aperçu === [[File:Test Java Swing html.png]] === Code source === <syntaxhighlight lang="Java"> package org.wikibooks.fr.swing.html; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; /** * Fenêtre pour tester le rendu HTML en Swing avec un JTextPane. * @author fr.wikibooks.org */ public class FenetreRenduHtml extends JFrame { private JPanel p_content; private JTextArea ta_css; private JTextArea ta_html_body; private JTextPane tp_html; private void renderHtml(String html) { tp_html.setContentType("text/plain"); tp_html.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, true); tp_html.setContentType("text/html"); tp_html.setText("<html>"+html+"</html>"); } private void renderHtml(String html_body, String style) { if (style==null) renderHtml(html_body); else renderHtml("<head><style>\n"+style+"\n</style></head><body>"+html_body+"</body>"); } private void doHtmlRender() { String t_html_body = ta_html_body.getText(), t_css = ta_css.getText(); renderHtml(t_html_body, t_css); } public FenetreRenduHtml() { setTitle("Test d'affichage en HTML"); Dimension d = new Dimension(800, 600); setSize(d); setMinimumSize(d); setLocation(new Point(200, 100)); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); p_content = new JPanel(); p_content.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(p_content); GridBagLayout gbl = new GridBagLayout(); gbl.columnWidths = new int[]{0, 0, 0}; gbl.rowHeights = new int[]{0, 0, 0, 0, 0, 0}; gbl.columnWeights = new double[]{1.0, 1.0, Double.MIN_VALUE}; gbl.rowWeights = new double[]{0.0, 1.0, 0.0, 1.0, 0.0, Double.MIN_VALUE}; p_content.setLayout(gbl); Font f_mono = new Font("monospaced", Font.PLAIN, 14); Border text_border = BorderFactory.createEmptyBorder(4, 4, 4, 4); JLabel l_css = new JLabel("Contenu CSS"); { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(0, 0, 5, 5); gbc.gridx = 0; gbc.gridy = 0; p_content.add(l_css, gbc); } JScrollPane sp_css = new JScrollPane(); { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(0, 0, 0, 5); gbc.fill = GridBagConstraints.BOTH; gbc.gridx = 0; gbc.gridy = 1; p_content.add(sp_css, gbc); } ta_css = new JTextArea(); ta_css.setFont(f_mono); ta_css.setBorder(text_border); ta_css.setText("/* Style CSS ici */"); sp_css.setViewportView(ta_css); JLabel l_html = new JLabel("HTML source"); { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(0, 0, 5, 5); gbc.gridx = 0; gbc.gridy = 2; p_content.add(l_html, gbc); } JScrollPane sp_html_body = new JScrollPane(); { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(0, 0, 0, 5); gbc.fill = GridBagConstraints.BOTH; gbc.gridx = 0; gbc.gridy = 3; p_content.add(sp_html_body, gbc); } ta_html_body = new JTextArea(); ta_html_body.setFont(f_mono); ta_html_body.setBorder(text_border); sp_html_body.setViewportView(ta_html_body); JButton b_disp_html = new JButton("Afficher \u2192"); // "Afficher ->" b_disp_html.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { doHtmlRender(); } }); { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(0, 0, 5, 5); gbc.gridx = 0; gbc.gridy = 4; p_content.add(b_disp_html, gbc); } JLabel l_disp_html = new JLabel("HTML affiché"); { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(0, 0, 5, 0); gbc.gridx = 1; gbc.gridy = 0; p_content.add(l_disp_html, gbc); } JScrollPane sp_html = new JScrollPane(); { GridBagConstraints gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.BOTH; gbc.gridx = 1; gbc.gridy = 1; gbc.gridheight = 3; p_content.add(sp_html, gbc); } tp_html = new JTextPane(); sp_html.setViewportView(tp_html); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { FenetreRenduHtml frame = new FenetreRenduHtml(); frame.setVisible(true); } }); } } </syntaxhighlight> == Images == Le contenu HTML peut faire référence à des images. Par défaut, les chemins relatifs ne sont pas supportés, seul un chemin absolu permet l'affichage de l'image. Les URLs distantes sont également supportées pour les protocoles supportés par Java (HTTP, HTTPS). [[Fichier:Test Java Swing html images.png|Test de rendu par Swing d'un texte HTML utilisant des images en chemin relatifs et absolus]] Les chemins et URL relatifs sont supportés quand une URL de base est fournie à la méthode <code>setPage(url)</code> (url de type <code>java.lang.String</code> ou <code>java.net.URL</code>) qui charge la page correspondante. Cette méthode permet le chargement de pages HTML simples (HTML 4 et CSS 1), sans Javascript. Elle ne peut donc pas servir à afficher un site web. qa9wjasxhyb648dcckgfmj386opilui 767361 767360 2026-06-02T16:58:49Z DavidL 1746 /* Sélecteurs */ 767361 wikitext text/x-wiki <noinclude>{{Programmation Java Swing}}</noinclude> La plupart des composants Swing supporte le texte en HTML. Cela permet d'ajouter facilement du texte formaté pour améliorer la présentation de l'interface graphique. == Affichage en HTML == ;JLabel, JButton:Pour un rendu HTML, le texte doit être encadré par <code>&lt;html&gt;</code> et <code>&lt;/html&gt;</code>. :Exemple : :<syntaxhighlight lang="java"> JLabel l_title = new JLabel("<html>Le titre avec <b>une partie en gras</b>,"+ " et <span style=\"color:blue;\">une autre partie en bleu</span>.</html>"); </syntaxhighlight> ;JTextPane:En plus d'encadrer le texte par <code>&lt;html&gt;</code> et <code>&lt;/html&gt;</code>, il faut spécifier le type de contenu, car ce composant supporte plusieurs types de document. :Exemple : :<syntaxhighlight lang="java"> JTextPane tp_exemple = new JTextPane(); tp_exemple.setContentType("text/html"); tp_exemple.setText("<html><head><style>p { margin: 20px 0; }</style></head>"+ "<body><h1>Titre</h1><p>Le texte avec <b>une partie en gras</b>,"+ " et <span style=\"color:blue;\">une autre partie en bleu</span>.</p></body></html>"); </syntaxhighlight> :Ce composant mémorise la feuille de style définie par l'entête (head) du source HTML. :Il faut forcer le changement de type pour la supprimer comme montré ci-dessous : :<syntaxhighlight lang="java"> // Force la suppression de la feuille de style mémorisée : tp_exemple.setContentType("text/plain"); // Utiliser les propriétés du composant comme style par défaut (couleurs, police de caractères) : tp_exemple.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, true); tp_exemple.setContentType("text/html"); tp_exemple.setText("<html><h1>Autre titre</h1><p>Autre texte.</p></html>"); </syntaxhighlight> == Limitations == Swing supporte HTML 4 et CSS 1.0 de manière limitée. === Limitations HTML === * Un élément ne peut avoir qu'une seule classe CSS. {| class="wikitable" |+ Éléments HTML supportés par Swing ! Élément(s) ! Supporté(s) |- | '''&lt;p&gt; &lt;span&gt; &lt;div&gt;''' | Oui |- | '''&lt;b&gt; &lt;i&gt; &lt;u&gt; &lt;sup&gt; &lt;sub&gt;''' | Oui |- | '''&lt;strong&gt; &lt;em&gt;''' | Oui |- | '''&lt;br&gt; &lt;hr&gt;''' | Oui |- | '''&lt;ins&gt; &lt;del&gt;''' | Oui, mais rendu spécifique |- | &lt;pre&gt; | Non |} {| class="wikitable" |+ Attributs supportés par Swing ! Attribut(s) ! Supporté(s) |- | '''href src''' | Oui |- | '''class style''' | Oui |} === Limitations CSS === Le support du langage CSS est très limité. ==== Sélecteurs ==== Les sélecteurs suivants sont supportés : ;''nomÉlément'':Les éléments <code>&lt;nomÉlément&gt;</code>. ;.''classeCSS'':Les éléments ayant l'attribut <code>class=''classeCSS''</code>. ;#''idÉlément'':Les éléments ayant l'attribut <code>id=''idÉlément''</code>. L'enchaînement des éléments est particulier : * Plusieurs sélecteurs pour les mêmes règles de style : utiliser "<code>, </code>" (virgule + espace) pour séparer les sélecteurs. *:<code>h1, table { font-family: Arial; } /* OK */</code> *:<code>h1,table { font-family: Arial; } /* Ligne ignorée <!> */</code> ==== Attributs ==== {| class="wikitable" |+ Attributs supportés ! Attribut(s) ! Supporté(s) |- | '''color background''' | Oui |- | '''font font-family''' | Oui |- | '''border border-spacing''' | Oui |- | border-top border-bottom border-left border-right border-collapse | Oui/Non |- | '''margin padding''' | Oui |- | margin-top margin-bottom margin-left margin-right | Oui/Non |- | padding-top padding-bottom padding-left padding-right | Oui/Non |} ==== Valeurs ==== Les couleurs sont également limitées (pas de transparence, ni de notation hexadécimale courte) : {| class="wikitable" |+ Spécification de couleur supportées ! Couleur ! Supporté |- | <code>red</code>, <code>white</code>, <code>green</code>, ... | Oui |- | <code>#445566</code> | Oui |- | <code>#456</code> | Non |- | <code>#44556640</code> | Non |- | <code>#4564</code> | Non |- | <code>rgb(68,85,102)</code> | Oui |- | <code>rgba(68,85,102,64)</code> | Non |} {| class="wikitable" |+ Unités supportées ! Unité ! Supporté |- | <code>px</code> | Oui |- | <code>%</code> | Oui mais la taille est mal calculée, particulièrement pour les polices de caractères |- | <code>em</code> | Non |} == Tester l'affichage en HTML == L'application dont le code source est ci-dessous permet de tester l'affichage en HTML avec un composant JTextPane. === Aperçu === [[File:Test Java Swing html.png]] === Code source === <syntaxhighlight lang="Java"> package org.wikibooks.fr.swing.html; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; /** * Fenêtre pour tester le rendu HTML en Swing avec un JTextPane. * @author fr.wikibooks.org */ public class FenetreRenduHtml extends JFrame { private JPanel p_content; private JTextArea ta_css; private JTextArea ta_html_body; private JTextPane tp_html; private void renderHtml(String html) { tp_html.setContentType("text/plain"); tp_html.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, true); tp_html.setContentType("text/html"); tp_html.setText("<html>"+html+"</html>"); } private void renderHtml(String html_body, String style) { if (style==null) renderHtml(html_body); else renderHtml("<head><style>\n"+style+"\n</style></head><body>"+html_body+"</body>"); } private void doHtmlRender() { String t_html_body = ta_html_body.getText(), t_css = ta_css.getText(); renderHtml(t_html_body, t_css); } public FenetreRenduHtml() { setTitle("Test d'affichage en HTML"); Dimension d = new Dimension(800, 600); setSize(d); setMinimumSize(d); setLocation(new Point(200, 100)); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); p_content = new JPanel(); p_content.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(p_content); GridBagLayout gbl = new GridBagLayout(); gbl.columnWidths = new int[]{0, 0, 0}; gbl.rowHeights = new int[]{0, 0, 0, 0, 0, 0}; gbl.columnWeights = new double[]{1.0, 1.0, Double.MIN_VALUE}; gbl.rowWeights = new double[]{0.0, 1.0, 0.0, 1.0, 0.0, Double.MIN_VALUE}; p_content.setLayout(gbl); Font f_mono = new Font("monospaced", Font.PLAIN, 14); Border text_border = BorderFactory.createEmptyBorder(4, 4, 4, 4); JLabel l_css = new JLabel("Contenu CSS"); { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(0, 0, 5, 5); gbc.gridx = 0; gbc.gridy = 0; p_content.add(l_css, gbc); } JScrollPane sp_css = new JScrollPane(); { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(0, 0, 0, 5); gbc.fill = GridBagConstraints.BOTH; gbc.gridx = 0; gbc.gridy = 1; p_content.add(sp_css, gbc); } ta_css = new JTextArea(); ta_css.setFont(f_mono); ta_css.setBorder(text_border); ta_css.setText("/* Style CSS ici */"); sp_css.setViewportView(ta_css); JLabel l_html = new JLabel("HTML source"); { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(0, 0, 5, 5); gbc.gridx = 0; gbc.gridy = 2; p_content.add(l_html, gbc); } JScrollPane sp_html_body = new JScrollPane(); { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(0, 0, 0, 5); gbc.fill = GridBagConstraints.BOTH; gbc.gridx = 0; gbc.gridy = 3; p_content.add(sp_html_body, gbc); } ta_html_body = new JTextArea(); ta_html_body.setFont(f_mono); ta_html_body.setBorder(text_border); sp_html_body.setViewportView(ta_html_body); JButton b_disp_html = new JButton("Afficher \u2192"); // "Afficher ->" b_disp_html.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { doHtmlRender(); } }); { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(0, 0, 5, 5); gbc.gridx = 0; gbc.gridy = 4; p_content.add(b_disp_html, gbc); } JLabel l_disp_html = new JLabel("HTML affiché"); { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(0, 0, 5, 0); gbc.gridx = 1; gbc.gridy = 0; p_content.add(l_disp_html, gbc); } JScrollPane sp_html = new JScrollPane(); { GridBagConstraints gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.BOTH; gbc.gridx = 1; gbc.gridy = 1; gbc.gridheight = 3; p_content.add(sp_html, gbc); } tp_html = new JTextPane(); sp_html.setViewportView(tp_html); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { FenetreRenduHtml frame = new FenetreRenduHtml(); frame.setVisible(true); } }); } } </syntaxhighlight> == Images == Le contenu HTML peut faire référence à des images. Par défaut, les chemins relatifs ne sont pas supportés, seul un chemin absolu permet l'affichage de l'image. Les URLs distantes sont également supportées pour les protocoles supportés par Java (HTTP, HTTPS). [[Fichier:Test Java Swing html images.png|Test de rendu par Swing d'un texte HTML utilisant des images en chemin relatifs et absolus]] Les chemins et URL relatifs sont supportés quand une URL de base est fournie à la méthode <code>setPage(url)</code> (url de type <code>java.lang.String</code> ou <code>java.net.URL</code>) qui charge la page correspondante. Cette méthode permet le chargement de pages HTML simples (HTML 4 et CSS 1), sans Javascript. Elle ne peut donc pas servir à afficher un site web. jim2oyqwj1vmet8k0632p4my7mvy6hh 767362 767361 2026-06-02T17:00:28Z DavidL 1746 /* Sélecteurs */ 767362 wikitext text/x-wiki <noinclude>{{Programmation Java Swing}}</noinclude> La plupart des composants Swing supporte le texte en HTML. Cela permet d'ajouter facilement du texte formaté pour améliorer la présentation de l'interface graphique. == Affichage en HTML == ;JLabel, JButton:Pour un rendu HTML, le texte doit être encadré par <code>&lt;html&gt;</code> et <code>&lt;/html&gt;</code>. :Exemple : :<syntaxhighlight lang="java"> JLabel l_title = new JLabel("<html>Le titre avec <b>une partie en gras</b>,"+ " et <span style=\"color:blue;\">une autre partie en bleu</span>.</html>"); </syntaxhighlight> ;JTextPane:En plus d'encadrer le texte par <code>&lt;html&gt;</code> et <code>&lt;/html&gt;</code>, il faut spécifier le type de contenu, car ce composant supporte plusieurs types de document. :Exemple : :<syntaxhighlight lang="java"> JTextPane tp_exemple = new JTextPane(); tp_exemple.setContentType("text/html"); tp_exemple.setText("<html><head><style>p { margin: 20px 0; }</style></head>"+ "<body><h1>Titre</h1><p>Le texte avec <b>une partie en gras</b>,"+ " et <span style=\"color:blue;\">une autre partie en bleu</span>.</p></body></html>"); </syntaxhighlight> :Ce composant mémorise la feuille de style définie par l'entête (head) du source HTML. :Il faut forcer le changement de type pour la supprimer comme montré ci-dessous : :<syntaxhighlight lang="java"> // Force la suppression de la feuille de style mémorisée : tp_exemple.setContentType("text/plain"); // Utiliser les propriétés du composant comme style par défaut (couleurs, police de caractères) : tp_exemple.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, true); tp_exemple.setContentType("text/html"); tp_exemple.setText("<html><h1>Autre titre</h1><p>Autre texte.</p></html>"); </syntaxhighlight> == Limitations == Swing supporte HTML 4 et CSS 1.0 de manière limitée. === Limitations HTML === * Un élément ne peut avoir qu'une seule classe CSS. {| class="wikitable" |+ Éléments HTML supportés par Swing ! Élément(s) ! Supporté(s) |- | '''&lt;p&gt; &lt;span&gt; &lt;div&gt;''' | Oui |- | '''&lt;b&gt; &lt;i&gt; &lt;u&gt; &lt;sup&gt; &lt;sub&gt;''' | Oui |- | '''&lt;strong&gt; &lt;em&gt;''' | Oui |- | '''&lt;br&gt; &lt;hr&gt;''' | Oui |- | '''&lt;ins&gt; &lt;del&gt;''' | Oui, mais rendu spécifique |- | &lt;pre&gt; | Non |} {| class="wikitable" |+ Attributs supportés par Swing ! Attribut(s) ! Supporté(s) |- | '''href src''' | Oui |- | '''class style''' | Oui |} === Limitations CSS === Le support du langage CSS est très limité. ==== Sélecteurs ==== Les sélecteurs suivants sont supportés : ;''nomÉlément'':Les éléments <code>&lt;nomÉlément&gt;</code>. ;.''classeCSS'':Les éléments ayant l'attribut <code>class=''classeCSS''</code>. ;#''idÉlément'':Les éléments ayant l'attribut <code>id=''idÉlément''</code>. Les sélecteurs suivants ne sont pas supportés : ;*:Pas de possibilité de définir des règles pour tous les éléments. L'enchaînement des éléments est particulier : * Plusieurs sélecteurs pour les mêmes règles de style : utiliser "<code>, </code>" (virgule + espace) pour séparer les sélecteurs. *:<code>h1, table { font-family: Arial; } /* OK */</code> *:<code>h1,table { font-family: Arial; } /* Ligne ignorée <!> */</code> ==== Attributs ==== {| class="wikitable" |+ Attributs supportés ! Attribut(s) ! Supporté(s) |- | '''color background''' | Oui |- | '''font font-family''' | Oui |- | '''border border-spacing''' | Oui |- | border-top border-bottom border-left border-right border-collapse | Oui/Non |- | '''margin padding''' | Oui |- | margin-top margin-bottom margin-left margin-right | Oui/Non |- | padding-top padding-bottom padding-left padding-right | Oui/Non |} ==== Valeurs ==== Les couleurs sont également limitées (pas de transparence, ni de notation hexadécimale courte) : {| class="wikitable" |+ Spécification de couleur supportées ! Couleur ! Supporté |- | <code>red</code>, <code>white</code>, <code>green</code>, ... | Oui |- | <code>#445566</code> | Oui |- | <code>#456</code> | Non |- | <code>#44556640</code> | Non |- | <code>#4564</code> | Non |- | <code>rgb(68,85,102)</code> | Oui |- | <code>rgba(68,85,102,64)</code> | Non |} {| class="wikitable" |+ Unités supportées ! Unité ! Supporté |- | <code>px</code> | Oui |- | <code>%</code> | Oui mais la taille est mal calculée, particulièrement pour les polices de caractères |- | <code>em</code> | Non |} == Tester l'affichage en HTML == L'application dont le code source est ci-dessous permet de tester l'affichage en HTML avec un composant JTextPane. === Aperçu === [[File:Test Java Swing html.png]] === Code source === <syntaxhighlight lang="Java"> package org.wikibooks.fr.swing.html; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; /** * Fenêtre pour tester le rendu HTML en Swing avec un JTextPane. * @author fr.wikibooks.org */ public class FenetreRenduHtml extends JFrame { private JPanel p_content; private JTextArea ta_css; private JTextArea ta_html_body; private JTextPane tp_html; private void renderHtml(String html) { tp_html.setContentType("text/plain"); tp_html.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, true); tp_html.setContentType("text/html"); tp_html.setText("<html>"+html+"</html>"); } private void renderHtml(String html_body, String style) { if (style==null) renderHtml(html_body); else renderHtml("<head><style>\n"+style+"\n</style></head><body>"+html_body+"</body>"); } private void doHtmlRender() { String t_html_body = ta_html_body.getText(), t_css = ta_css.getText(); renderHtml(t_html_body, t_css); } public FenetreRenduHtml() { setTitle("Test d'affichage en HTML"); Dimension d = new Dimension(800, 600); setSize(d); setMinimumSize(d); setLocation(new Point(200, 100)); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); p_content = new JPanel(); p_content.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(p_content); GridBagLayout gbl = new GridBagLayout(); gbl.columnWidths = new int[]{0, 0, 0}; gbl.rowHeights = new int[]{0, 0, 0, 0, 0, 0}; gbl.columnWeights = new double[]{1.0, 1.0, Double.MIN_VALUE}; gbl.rowWeights = new double[]{0.0, 1.0, 0.0, 1.0, 0.0, Double.MIN_VALUE}; p_content.setLayout(gbl); Font f_mono = new Font("monospaced", Font.PLAIN, 14); Border text_border = BorderFactory.createEmptyBorder(4, 4, 4, 4); JLabel l_css = new JLabel("Contenu CSS"); { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(0, 0, 5, 5); gbc.gridx = 0; gbc.gridy = 0; p_content.add(l_css, gbc); } JScrollPane sp_css = new JScrollPane(); { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(0, 0, 0, 5); gbc.fill = GridBagConstraints.BOTH; gbc.gridx = 0; gbc.gridy = 1; p_content.add(sp_css, gbc); } ta_css = new JTextArea(); ta_css.setFont(f_mono); ta_css.setBorder(text_border); ta_css.setText("/* Style CSS ici */"); sp_css.setViewportView(ta_css); JLabel l_html = new JLabel("HTML source"); { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(0, 0, 5, 5); gbc.gridx = 0; gbc.gridy = 2; p_content.add(l_html, gbc); } JScrollPane sp_html_body = new JScrollPane(); { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(0, 0, 0, 5); gbc.fill = GridBagConstraints.BOTH; gbc.gridx = 0; gbc.gridy = 3; p_content.add(sp_html_body, gbc); } ta_html_body = new JTextArea(); ta_html_body.setFont(f_mono); ta_html_body.setBorder(text_border); sp_html_body.setViewportView(ta_html_body); JButton b_disp_html = new JButton("Afficher \u2192"); // "Afficher ->" b_disp_html.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { doHtmlRender(); } }); { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(0, 0, 5, 5); gbc.gridx = 0; gbc.gridy = 4; p_content.add(b_disp_html, gbc); } JLabel l_disp_html = new JLabel("HTML affiché"); { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(0, 0, 5, 0); gbc.gridx = 1; gbc.gridy = 0; p_content.add(l_disp_html, gbc); } JScrollPane sp_html = new JScrollPane(); { GridBagConstraints gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.BOTH; gbc.gridx = 1; gbc.gridy = 1; gbc.gridheight = 3; p_content.add(sp_html, gbc); } tp_html = new JTextPane(); sp_html.setViewportView(tp_html); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { FenetreRenduHtml frame = new FenetreRenduHtml(); frame.setVisible(true); } }); } } </syntaxhighlight> == Images == Le contenu HTML peut faire référence à des images. Par défaut, les chemins relatifs ne sont pas supportés, seul un chemin absolu permet l'affichage de l'image. Les URLs distantes sont également supportées pour les protocoles supportés par Java (HTTP, HTTPS). [[Fichier:Test Java Swing html images.png|Test de rendu par Swing d'un texte HTML utilisant des images en chemin relatifs et absolus]] Les chemins et URL relatifs sont supportés quand une URL de base est fournie à la méthode <code>setPage(url)</code> (url de type <code>java.lang.String</code> ou <code>java.net.URL</code>) qui charge la page correspondante. Cette méthode permet le chargement de pages HTML simples (HTML 4 et CSS 1), sans Javascript. Elle ne peut donc pas servir à afficher un site web. 2h7owm25xc3mgehw3trpusbzwfjpuy9 767363 767362 2026-06-02T17:01:14Z DavidL 1746 /* Sélecteurs */ 767363 wikitext text/x-wiki <noinclude>{{Programmation Java Swing}}</noinclude> La plupart des composants Swing supporte le texte en HTML. Cela permet d'ajouter facilement du texte formaté pour améliorer la présentation de l'interface graphique. == Affichage en HTML == ;JLabel, JButton:Pour un rendu HTML, le texte doit être encadré par <code>&lt;html&gt;</code> et <code>&lt;/html&gt;</code>. :Exemple : :<syntaxhighlight lang="java"> JLabel l_title = new JLabel("<html>Le titre avec <b>une partie en gras</b>,"+ " et <span style=\"color:blue;\">une autre partie en bleu</span>.</html>"); </syntaxhighlight> ;JTextPane:En plus d'encadrer le texte par <code>&lt;html&gt;</code> et <code>&lt;/html&gt;</code>, il faut spécifier le type de contenu, car ce composant supporte plusieurs types de document. :Exemple : :<syntaxhighlight lang="java"> JTextPane tp_exemple = new JTextPane(); tp_exemple.setContentType("text/html"); tp_exemple.setText("<html><head><style>p { margin: 20px 0; }</style></head>"+ "<body><h1>Titre</h1><p>Le texte avec <b>une partie en gras</b>,"+ " et <span style=\"color:blue;\">une autre partie en bleu</span>.</p></body></html>"); </syntaxhighlight> :Ce composant mémorise la feuille de style définie par l'entête (head) du source HTML. :Il faut forcer le changement de type pour la supprimer comme montré ci-dessous : :<syntaxhighlight lang="java"> // Force la suppression de la feuille de style mémorisée : tp_exemple.setContentType("text/plain"); // Utiliser les propriétés du composant comme style par défaut (couleurs, police de caractères) : tp_exemple.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, true); tp_exemple.setContentType("text/html"); tp_exemple.setText("<html><h1>Autre titre</h1><p>Autre texte.</p></html>"); </syntaxhighlight> == Limitations == Swing supporte HTML 4 et CSS 1.0 de manière limitée. === Limitations HTML === * Un élément ne peut avoir qu'une seule classe CSS. {| class="wikitable" |+ Éléments HTML supportés par Swing ! Élément(s) ! Supporté(s) |- | '''&lt;p&gt; &lt;span&gt; &lt;div&gt;''' | Oui |- | '''&lt;b&gt; &lt;i&gt; &lt;u&gt; &lt;sup&gt; &lt;sub&gt;''' | Oui |- | '''&lt;strong&gt; &lt;em&gt;''' | Oui |- | '''&lt;br&gt; &lt;hr&gt;''' | Oui |- | '''&lt;ins&gt; &lt;del&gt;''' | Oui, mais rendu spécifique |- | &lt;pre&gt; | Non |} {| class="wikitable" |+ Attributs supportés par Swing ! Attribut(s) ! Supporté(s) |- | '''href src''' | Oui |- | '''class style''' | Oui |} === Limitations CSS === Le support du langage CSS est très limité. ==== Sélecteurs ==== Les sélecteurs suivants sont supportés : ;<code>''nomÉlément''</code>:Les éléments <code>&lt;nomÉlément&gt;</code>. ;<code>.''classeCSS''</code>:Les éléments ayant l'attribut <code>class=''classeCSS''</code>. ;<code>#''idÉlément''</code>:Les éléments ayant l'attribut <code>id=''idÉlément''</code>. Les sélecteurs suivants ne sont pas supportés : ;<code><nowiki>*</nowiki></code>:Pas de possibilité de définir des règles pour tous les éléments. L'enchaînement des éléments est particulier : * Plusieurs sélecteurs pour les mêmes règles de style : utiliser "<code>, </code>" (virgule + espace) pour séparer les sélecteurs. *:<code>h1, table { font-family: Arial; } /* OK */</code> *:<code>h1,table { font-family: Arial; } /* Ligne ignorée <!> */</code> ==== Attributs ==== {| class="wikitable" |+ Attributs supportés ! Attribut(s) ! Supporté(s) |- | '''color background''' | Oui |- | '''font font-family''' | Oui |- | '''border border-spacing''' | Oui |- | border-top border-bottom border-left border-right border-collapse | Oui/Non |- | '''margin padding''' | Oui |- | margin-top margin-bottom margin-left margin-right | Oui/Non |- | padding-top padding-bottom padding-left padding-right | Oui/Non |} ==== Valeurs ==== Les couleurs sont également limitées (pas de transparence, ni de notation hexadécimale courte) : {| class="wikitable" |+ Spécification de couleur supportées ! Couleur ! Supporté |- | <code>red</code>, <code>white</code>, <code>green</code>, ... | Oui |- | <code>#445566</code> | Oui |- | <code>#456</code> | Non |- | <code>#44556640</code> | Non |- | <code>#4564</code> | Non |- | <code>rgb(68,85,102)</code> | Oui |- | <code>rgba(68,85,102,64)</code> | Non |} {| class="wikitable" |+ Unités supportées ! Unité ! Supporté |- | <code>px</code> | Oui |- | <code>%</code> | Oui mais la taille est mal calculée, particulièrement pour les polices de caractères |- | <code>em</code> | Non |} == Tester l'affichage en HTML == L'application dont le code source est ci-dessous permet de tester l'affichage en HTML avec un composant JTextPane. === Aperçu === [[File:Test Java Swing html.png]] === Code source === <syntaxhighlight lang="Java"> package org.wikibooks.fr.swing.html; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; /** * Fenêtre pour tester le rendu HTML en Swing avec un JTextPane. * @author fr.wikibooks.org */ public class FenetreRenduHtml extends JFrame { private JPanel p_content; private JTextArea ta_css; private JTextArea ta_html_body; private JTextPane tp_html; private void renderHtml(String html) { tp_html.setContentType("text/plain"); tp_html.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, true); tp_html.setContentType("text/html"); tp_html.setText("<html>"+html+"</html>"); } private void renderHtml(String html_body, String style) { if (style==null) renderHtml(html_body); else renderHtml("<head><style>\n"+style+"\n</style></head><body>"+html_body+"</body>"); } private void doHtmlRender() { String t_html_body = ta_html_body.getText(), t_css = ta_css.getText(); renderHtml(t_html_body, t_css); } public FenetreRenduHtml() { setTitle("Test d'affichage en HTML"); Dimension d = new Dimension(800, 600); setSize(d); setMinimumSize(d); setLocation(new Point(200, 100)); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); p_content = new JPanel(); p_content.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(p_content); GridBagLayout gbl = new GridBagLayout(); gbl.columnWidths = new int[]{0, 0, 0}; gbl.rowHeights = new int[]{0, 0, 0, 0, 0, 0}; gbl.columnWeights = new double[]{1.0, 1.0, Double.MIN_VALUE}; gbl.rowWeights = new double[]{0.0, 1.0, 0.0, 1.0, 0.0, Double.MIN_VALUE}; p_content.setLayout(gbl); Font f_mono = new Font("monospaced", Font.PLAIN, 14); Border text_border = BorderFactory.createEmptyBorder(4, 4, 4, 4); JLabel l_css = new JLabel("Contenu CSS"); { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(0, 0, 5, 5); gbc.gridx = 0; gbc.gridy = 0; p_content.add(l_css, gbc); } JScrollPane sp_css = new JScrollPane(); { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(0, 0, 0, 5); gbc.fill = GridBagConstraints.BOTH; gbc.gridx = 0; gbc.gridy = 1; p_content.add(sp_css, gbc); } ta_css = new JTextArea(); ta_css.setFont(f_mono); ta_css.setBorder(text_border); ta_css.setText("/* Style CSS ici */"); sp_css.setViewportView(ta_css); JLabel l_html = new JLabel("HTML source"); { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(0, 0, 5, 5); gbc.gridx = 0; gbc.gridy = 2; p_content.add(l_html, gbc); } JScrollPane sp_html_body = new JScrollPane(); { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(0, 0, 0, 5); gbc.fill = GridBagConstraints.BOTH; gbc.gridx = 0; gbc.gridy = 3; p_content.add(sp_html_body, gbc); } ta_html_body = new JTextArea(); ta_html_body.setFont(f_mono); ta_html_body.setBorder(text_border); sp_html_body.setViewportView(ta_html_body); JButton b_disp_html = new JButton("Afficher \u2192"); // "Afficher ->" b_disp_html.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { doHtmlRender(); } }); { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(0, 0, 5, 5); gbc.gridx = 0; gbc.gridy = 4; p_content.add(b_disp_html, gbc); } JLabel l_disp_html = new JLabel("HTML affiché"); { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(0, 0, 5, 0); gbc.gridx = 1; gbc.gridy = 0; p_content.add(l_disp_html, gbc); } JScrollPane sp_html = new JScrollPane(); { GridBagConstraints gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.BOTH; gbc.gridx = 1; gbc.gridy = 1; gbc.gridheight = 3; p_content.add(sp_html, gbc); } tp_html = new JTextPane(); sp_html.setViewportView(tp_html); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { FenetreRenduHtml frame = new FenetreRenduHtml(); frame.setVisible(true); } }); } } </syntaxhighlight> == Images == Le contenu HTML peut faire référence à des images. Par défaut, les chemins relatifs ne sont pas supportés, seul un chemin absolu permet l'affichage de l'image. Les URLs distantes sont également supportées pour les protocoles supportés par Java (HTTP, HTTPS). [[Fichier:Test Java Swing html images.png|Test de rendu par Swing d'un texte HTML utilisant des images en chemin relatifs et absolus]] Les chemins et URL relatifs sont supportés quand une URL de base est fournie à la méthode <code>setPage(url)</code> (url de type <code>java.lang.String</code> ou <code>java.net.URL</code>) qui charge la page correspondante. Cette méthode permet le chargement de pages HTML simples (HTML 4 et CSS 1), sans Javascript. Elle ne peut donc pas servir à afficher un site web. 598r3zsp56gexnpvlrdqi7y9h94ia80 Jardinage/Calendrier/Mois 0 75899 767359 655267 2026-06-02T15:34:36Z DavidL 1746 767359 wikitext text/x-wiki <noinclude> Modèle utilisé pour présenter les tâches dans [[Jardinage/Calendrier|le calendrier de jardinage]]. </noinclude> {| width="100%" align="center" border="0" cellpadding="4" cellspacing="3" style="border: 1px solid #99993380; background-color:#bfbc6b40;" |+ style="border: 1px solid #99993380; background-color:#bfbc6b40;" | «'''MOIS d{{Apos|{{{1}}}}}{{{1}}}'''» &nbsp;&nbsp;&nbsp;&nbsp; |- style="background-color:#cfa89440;" | valign="top" width="33%" | * '''Première quinzaine''' {{{2}}} | valign="top" width="33%" | * '''Deuxième quinzaine''' {{{3}}} | valign="top" width="33%" | *'''Autres travaux''' {{{4}}} |} {{AutoCat}} 421fd7yt2qq379n2rxbhyyoogspjcnh Philosophie/Thalès de Milet/Textes et traductions période Principat Empire Romain 0 78966 767364 767308 2026-06-02T17:09:47Z Alex Mtlr 103840 767364 wikitext text/x-wiki {| border="0" cellpadding="0" width="100%" style="background: #f9f9f9" | colspan="3" height="25"|<div style="text-align: center;">[[Philosophie/Thalès de Milet|'''Thalès de Milet''']]</div> |- | width="33%"|'''[[Philosophie/Thalès de Milet/Textes_et_traductions_période_République_Romaine|Période République Romaine]]''' |- | width="33%"|'''[[Philosophie/Thalès de Milet/Textes_et_traductions_période_Grèce_Hellénistique|Période de la Grèce Hellénistique]]''' |- | width="33%"|'''[[Philosophie/Thalès de Milet/Textes_et_traductions_Ier_millénaire_AEC|Période de la Grèce Classique]]''' |} {{EnTravaux}} <span style="font-size:18pt;">Période du Principat de l’[[w:Empire_romain|''Empire'']] [[#Empire|<span id="Empire_back"><sup>'''I'''</sup></span>]] [[w:Rome_antique|''Romain'']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Rome_back|<sup>🔄</sup>]]</span> <p style="text-align: right;">(16 janvier [[w:27_av._J.-C.|-27]] <sup>[[w:Ier_siècle_av._J.-C.|⏳]]</sup>, nomination de [[w:Auguste|'''Caius Iulius Caesar Octavianus''']] aux titres d’[[w:Auguste_(titre)|''Augustus'']] et de [[w:Princeps_senatus|''Princeps'']] par le [[w:Sénat_romain|''Sénat romain'']] — fin du [[w:IIIe_siècle|III<sup>ème</sup> siècle {{Info|EC|de l’Ère Commune}}]], création du système [[w:Tétrarchie|''tétrarchique'']] [[#tétrarchie|<span id="tétrarchie_back"><sup>'''II'''</sup></span>]] par [[w:Dioclétien|'''Dioclétien''']] [[#Dioclétien|<span id="Dioclétien_back"><sup>'''III'''</sup></span>]] pour faire face aux [[w:Invasions_barbares#Première_période_:_les_mouvements_migratoires_germaniques_du_IIIe_siècle|''incursions barbares'']]) {{Boîte déroulante début|titre=NdA Empire|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Empire_back|<span id="Empire"><sup>I</sup></span>]] Du nom commun latin imperium [[wikt:en:imperium#Latin|(en)]], « 1. L’empire, l’État, le gouvernement impérial, le royaume, la domination. 2. Le droit ou le pouvoir de commander ou d’avoir le contrôle ; domination. 3. Commandement ou autorité absolue sur l’empire (ou un autre régime politique) ; souveraineté ; domination. 4. (militaire) Autorité militaire, commandement (d’une armée). 5. L’exercice de l’autorité, de la règle, de la loi, du contrôle, de la souveraineté. 6. Un commandement, un ordre, une direction, une injonction.) »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ du verbe imperō, « 1. (avec datif) Commander, donner des ordres à, imposer, exiger. 2. Gouverner. »;<br /><p style="margin: 0 2em; text-indent: 30px;">➥ du préfixe prépositionnal in-, « 1. Dans, à l’intérieur. 2. Contre; dans; sur; vers. 3. (utiliser comme un intensifieur). 4. Attaché à des [[w:Aspect_inchoatif|''verbes inchoatifs'']], il peut exprimer le sens d’un changement en cours ou d’un achèvement partiel. »;<br /><p style="margin: 0 2em; text-indent: 30px;">➥ +‎ du verbe parō [[wikt:en:paro#Latin|(en)]], « 1. Arranger, ordonner, concevoir. 2. Fournir, meubler, préparer. 3. Résoudre, viser, décider. 4. Obtenir, acquérir, se procurer, se faire. »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ + du suffixe nominal abstractif‎ -ium [[wikt:en:-ium#Latin|(en)]], désignant parfois des offices et des groupes. »;<br /><p style="margin: 0 2em; text-indent: 15px;">Selon l’historien, spécialiste de l’[[w:Grèce_antique|''antiquité grecque'']], [[w:Moses_Finley|Moses Finley]], définit un empire par tout {{Info|''« exercice durable par un État d’une autorité, d’un pouvoir, ou d’un contrôle sur un ou plusieurs États, communautés ou peuples »''|Moses Finley, Économie et société en Grèce antique, La Découverte, 2007.}}. L’historien [[w:Jean_Tulard|Jean Tulard]], précise cette définition par {{Info|''cinq traits suivants''|Jean Tulard, Les Empires occidentaux de Rome à Berlin, PUF, 1997.}} :<br /><p style="margin: 0 2em; text-indent: 15px;"> • Une volonté expansionniste ;<br /><p style="margin: 0 2em; text-indent: 15px;">• Une organisation centralisée ;<br /><p style="margin: 0 2em; text-indent: 15px;">• Des peuples encadrés par une armature politique et fiscale commune ;<br /><p style="margin: 0 2em; text-indent: 15px;">• La croyance en une supériorité d’essence ;<br /><p style="margin: 0 2em; text-indent: 15px;">• Un début et une fin clairement identifiés. <br /><br /><p style="margin: 0 2em; text-indent: 15px;">'''[[#tétrarchie_back|<span id="tétrarchie"><sup>II</sup></span>]] Du nom commun grec ancien τετραρχία / tetrarkhía;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ du préfixe τετρα- / tétra- [[wikt:en:τετρα-#Ancient_Greek|(en)]], « quatre »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ + du suffixe -αρχία / -arkhía [[wikt:en:-αρχία#Ancient_Greek|(en)]], « -archie (forme de gouvernement ou de règle) »;<br /><p style="margin: 0 2em; text-indent: 15px;"> Système de gouvernement de l’Empire ''romain'' mis en place par Dioclétien à la fin du [[w:IIIe_siècle|III<sup>ème</sup> siècle {{Info|EC|de l’Ère Commune}}]], pour faire face aux invasions barbares. Il consiste en la division de la direction de l’empire entre, d’une part deux [[w:Empereur_romain|''empereurs'']] — les [[w:Auguste_(titre)|''augustes'']] —, d’autre part deux ''lieutenants'' (successeurs désignés des ''augustes'') — les [[w:C%C3%A9sar_(titre)|''césars'']]. <br /><br /><p style="margin: 0 2em; text-indent: 15px;">'''[[#Dioclétien_back|<span id="Dioclétien"><sup>III</sup></span>]] [[w:Nom_romain|Tria Nomina]] en latin {{Info|Gaius|praenomen, nom individuel du citoyen romain}} {{Info|Aurelius|nomen, nom de famille}} {{Info|Valerius|cognomen, surnom héréditaire, servant à distinguer les diverses branches d’une même gens}}, surnommé Dioclētiānus [[wikt:en:Diocletian#English|(en)]] lorsqu’il a été proclamé empereur par ses troupes;<br /><p style="margin: 0 2em; text-indent: 15px;"> Militaire et empereur, connu pour avoir séparé et élargi les services civils et militaires de l’empire, et réorganisé les divisions provinciales de l’empire, établissant le gouvernement le plus vaste et le plus bureaucratique de l’histoire de l’empire. En [[w:286|286]], il nomme son ''césar'', ou adjoint et successeur, [[w:Maximien_Hercule|Maximien]] ''Auguste'', co-empereur, et partage l’Empire entre l’Orient et l’Occident, puis en 293, y nomme respectivement [[w:Galère_(empereur_romain)|Maximien Galère]] et [[w:Constance_Chlore|Constance Chlore]] comme ''césar''.<br/><br/></div> ''' {{Boîte déroulante fin}} == [[w:Sénèque|'''Sénèque''']] [[#Sénèque|<span id="Sénèque_back"><sup>'''I'''</sup></span>]] == <p style="text-align: right;">([[w:5_av._J.-C.|-5]] <sup>[[w:Ier_siècle_av._J.-C.|⏳]]</sup> / [[w:1|1]] <sup>[[w:Ier_siècle|⏳]]</sup>, à [[w:Corduba|Corduba]] — 12 avril [[w:65|65]], à [[w:Rome_antique|''Rome'']], dans une maison de plaisance, la « quatrième pierre milliaire », contraint au [[w:Suicide_forcé|''suicide forcé'']] par l’empereur [[w:Néron|'''Néron''']] après avoir été dénoncé dans la [[w:Conjuration_de_Pison|''Conjuration de Pison'']], sans preuve selon [[w:Tacite|'''Tacite''']] [https://remacle.org/bloodwolf/historiens/tacite/annales15.htm <sup>Annales, l.V, §§LX-LXVI.</sup>]) [[s:Auteur:Sénèque_le_Jeune|<sup>📚</sup>]] [https://books.google.fr/books?id=_HZTvAxN7CIC&newbks=1&newbks_redir=0&lpg=PA3&dq=bibliogroup%3A%22Dictionnaire%20des%20philosophes%20antiques%22&hl=fr&pg=PA177#v=onepage&q&f=true {{Info|<sup>🔍</sup>|Dictionnaire des Philosophes Antiques, publié sous la direction de Richard Goulet, Volume VI, §43 - Seneca (Lucius Annaeus –)}}] [[Fichier:Duble_herma_of_Socrates_and_Seneca_Antikensammlung_Berlin_03_.jpg|vignette|<p style="text-align: justify; text-indent: 15px;">Double-hermès du [[w:IIIe_siècle|III<sup>ème</sup> siècle {{Info|EC|de l’Ère Commune}}]], unique portrait de '''Sénèque''' nommé et authentifié, et associé à celui de '''Socrate''', dont le point commun est celui d’avoir été contraint de se donner la mort. Copie ''romaine'' d’un modèle fait du vivant même du philosophe [https://books.google.fr/books?id=_HZTvAxN7CIC&newbks=1&newbks_redir=0&lpg=PA3&dq=bibliogroup%3A%22Dictionnaire%20des%20philosophes%20antiques%22&hl=fr&pg=PA180#v=onepage&q&f=true {{Info|<sup>➕</sup>|Dictionnaire des Philosophes Antiques, publié sous la direction de Richard Goulet, Volume VI, §43 - Seneca (Lucius Annaeus –), Iconographie}}] [https://books.google.fr/books?id=_HZTvAxN7CIC&newbks=1&newbks_redir=0&lpg=PA3&dq=bibliogroup%3A%22Dictionnaire%20des%20philosophes%20antiques%22&hl=fr&pg=PA201#v=onepage&q&f=true {{Info|<sup>➕➕</sup>|Dictionnaire des Philosophes Antiques, publié sous la direction de Richard Goulet, Volume VI, §43 - Seneca (Lucius Annaeus –), Iconographie - contribution de J. Lang}}].<br /><p style="text-align: justify; text-indent: 15px;">Matériau : Marbre blanc-brunâtre, légèrement veiné, finement cristallin.<br /><p style="text-indent: 15px;">Provenance : ''Rome'', 1813.<br /><p style="text-align: justify; text-indent: 15px;">Exposition : Staatliche Museen zu Berlin, Antikensammlung, SK. 391 [https://recherche.smb.museum/detail/698814/doppelherme-des-sokrates-und-seneca-mit-namensbeischriften-der-dargestellten <sup>🔍</sup>].]] <div style="text-align: justify; margin: 0 1em; text-indent: 15px">Homme politique romain, philosophe stoïcien et dramaturge, il devient tour à tour conseiller à la cour impériale sous '''Caligula''' puis '''Claude''', est exilé en 41 en ''Corse'', où il écrit ses premiers traités philosophiques avant d’être rappelé comme tuteur du jeune '''Néron''' en 49, et enfin, lorsque ce dernier accède au pouvoir, en devient le conseiller et l’un des personnages les plus influents de l’Empire.</div> {{Boîte déroulante début|titre=NdA Sénèque|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Sénèque_back|<span id="Sénèque"><sup>I</sup></span>]] [[w:Nom_romain|Tria Nomina]] en latin {{Info|Lucius|praenomen, nom individuel du citoyen romain}} {{Info|Annaeus|nomen, nom de famille}} {{Info|Seneca|cognomen, surnom héréditaire, servant à distinguer les diverses branches d’une même gens}}'''<br/><br/></div> {{Boîte déroulante fin}} === [[w:Sénèque#Physique|Questions naturelles]] === <p style="text-align: right;">[[s:Questions_naturelles|📚]] <div style="text-align: justify; margin: 0 1em; text-indent: 15px">Ouvrage de philosophie naturelle écrit vers 65. Il ne s’agit pas d’une [[w:Encyclopédie|encyclopédie]] [[#encyclopédie|<span id="encyclopédie_back"><sup>'''I'''</sup></span>]] systématique comme l’[[w:Histoire_naturelle_(Pline_l'Ancien)|''Histoire naturelle'']] [[#Histoire_naturelle|<sup>⤵️</sup>]] de [[w:Pline_l'Ancien|'''Pline l’Ancien''']] [[#Pline_l’Ancien_I|<sup>⤵️</sup>]], bien que ces 2 œuvres représentent les rares ouvrages romains consacrés à l’étude du monde naturel. L’investigation de '''Sénèque''' se déroule principalement à travers la prise en compte des points de vue d’autres penseurs, ''grecs'' et ''romains'', bien qu’elle ne soit pas dénuée de pensées originales, dont éthiques conforment à la pensée ''stoïcienne''.</div> {{Boîte déroulante début|titre=NdA Questions naturelles|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#encyclopédie_back|<span id="encyclopédie"><sup>I</sup></span>]] Du nom commun [[w:Latin#Latin_humaniste|latin Renaissance]] encyclopaedīa [[wikt:en:encyclopaedia#Latin|(en)]]; de l’expression grec ancien ἐγκύκλῐος παιδείᾱ / enkúklios paideíā [https://dumas.ccsd.cnrs.fr/dumas-03927443/file/DONNADILLE-MR2-Pline-VERS-FINALE.pdf {{Info|<sup>🔍</sup>|Lisa Donnadille. Merveilles animalières dans les livres VIII à XI de l’Histoire naturelle de Pline l’Ancien. Littératures. 2020. ffdumas-03927443, p.21}}], « cercle de l’éducation ou des sciences, l’ensemble des sciences qui constituent une éducation complète »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ de l’adjectif ἐγκύκλιος / enkúklios, littéralement « qui est rond ou tourne en rond, circulaire », ou au sens figuré « qui revient en cercle sur soi-même, périodique », « qui embrasse un cercle entier »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ du nom commun παιδεία / paideía, « l’éducation »;'''<br /><p style="margin: 0 2em; text-align: center;">« ''Si à première vue la signification de cette expression semble être sans ambiguïté, sa portée réelle et la compréhension qu’en avaient les auteurs grecs puis latins font l’objet de débats parmi les spécialistes. En effet, deux interprétations sont possibles lorsqu’un auteur de l’Antiquité a recours à cette expression dans l’un de ses textes. Dans le premier cas, cela équivaudrait à parler d’une éducation ordinaire, commune à tous ; et dans le second cas, cela ferait référence à la quantité de connaissances et de sciences qu’il faudrait maîtriser au préalable avant de commencer l’étude d’un sujet précis, qui serait dans ce cas placé en haut d’une hiérarchie dans les savoirs.'' »<br /><p style="margin: 0 2em; text-align: right;">''' Lisa Donnadille. [https://dumas.ccsd.cnrs.fr/dumas-03927443/file/DONNADILLE-MR2-Pline-VERS-FINALE.pdf Merveilles animalières dans les livres VIII à XI de l’Histoire naturelle de Pline l’Ancien. Littératures. 2020. ffdumas-03927443], p.21'''<br/><br/></div> {{Boîte déroulante fin}} ==== Livre III — De l’eau ==== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">En prologue, Sénèque explique pourquoi il est plus important de s’intéresser à l’observation du monde, à sa connaissance et à sa compréhension plutôt qu’à sa conquête. Puis, il développe diverses théories sur la formation des rivières, les eaux souterraines et les propriétés de l’eau. Dans une critique morale aux chapitres XVII à XIX, il fustige la mauvaise pratique consistant à amener à table des poissons, notamment des rougets, vivants et à se délecter de leurs couleurs changeantes à l’agonie avant de les préparer devant les convives. En épilogue, il énonce son [[w:Eschatologie|''eschatologie'']], sa vision de la fin du monde où les êtres vivants seront anéantis par des raz-de-marée, marquant la fin d’un cycle du vivant et le début d’un autre.</div> ===== <div style="text-align: center;">Chapitre XIII.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage de la doctrine de '''Thalès''' faisant de l’eau l’élément à l’origine de la vie et critique d’une autre de la terre flottant dessus.</div> :'''Texte latin''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''13.''' Adiciam, ut '''Thales''' ait, «ualentissimum elementum est». Hoc fuisse primum putat, ex hoc surrexisse omnia. Sed nos quoque aut in eadem sententia, aut in uicinia eius sumus. Dicimus enim ignem esse qui occupet mundum et in se cuncta conuertat; hunc euanidum languentemque considere et nihil relinqui aliud in rerum natura igne restincto quam umoren; in hoc futuri mundi spem latere. Ita ignis exitus mundi est, umor primordium. Miraris ex hoc posse amnes semper exire qui pro omnibus fuit et ex quo sunt omnia? Hic umor in diductione rerum ad quartas redactus est, sic positus ut sufficere fluminibus edendis, ut riuis, ut fontibus posset.<br /><p style="text-indent: 15px;">'''14.''' Quae sequitur '''Thaletis''' inepta sententia est. Ait enim terrarum orbem aqua sustineri et uehi more nauigii mobilitateque eius fluctuare tunc cum dicitur tremere; non est ergo mirum si abundat umor ad flumina profundenda, cum in umore sit totus. Hanc ueterem et rudem sententiam explode. Nec est quod credas in hunc orbem aquam subire per rimas et facere sentinam.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-i-1979/page/n1/mode/2up <u>L. Annaei Senecae, Natvrales Qvaestiones</u>], [https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-i-1979/page/n261/mode/2up ''Liber Tertivs.''], [https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-i-1979/page/n293/mode/2up ''chap. 13.-14.''], texte établi par Carmen Codoñer Merino [[w:es:Carmen_Codoñer_Merino|(es)]], Consejo Superior de Investigaciones Científicas, Madrid, 1979</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''XIII.''' Aqua, ait '''Thales''', valentissimum elementum est : hoc fuisse primum putat, et hoc surrexisse omnia. Sed et nos quoque aut in eadem sententia, aut in ultima sumus. Dicimus enim ignem esse, qui occupet mundum, et in se cuncta convertat ; hunc evanidum considere, et nihil relinqui aliud in rerum natura, igne restincto, quam humorem : in hoc futuri mundi spem latere. Ita ignis exitus mundi est, humor primordium. Miraris amnes ex hoc posse exire semper, qui pro omnibus fuit, et ex quo sunt omnia? Hic humor in diductione rerum ad quartas redactus est, sic positus, ut fluminibus edendis sufficere, ut rivis, ut fontibus posset. Quæ sequitur, '''Thaletis''' inepta sententia est : ait enim , terrarum orbem aqua sustineri, et vehi more navigii, mobilitateque ejus fluctuare, tum quum dicitur tremere. Non est ergo mirum, si abundat humor ad flumina fundenda, quum mundus in humore sit totus. Hanc veterem et rudem sententiam explode : nec est quod credas, in hunc orbem aquam subire per rimas et facere sentiuam.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PP9#v=onepage&q&f=true <u>Œuvres Complètes de Sénèque, Tome Quatrième</u>], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA327#v=onepage&q&f=true ''Questions Naturelles, De Sénèque à Lucilius - Livre Troisième.''], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA342#v=onepage&q&f=true ''chap. XIII.''], traduction française de la collection Panckoucke, nouvelle édition très soigneusement revue par M. Charpentier et M. Félix Lemaistre, 1860</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''XIII.''' L’eau, dit '''Thalès''', est le plus puissant des éléments, le premier en date, celui par qui tout a pris vie. Nous pensons comme '''Thalès''', au moins sur le dernier point. En effet, nous prétendons que le feu doit s’emparer du monde entier et convertir tout en sa propre substance, puis s’évaporer, s’affaisser, s’éteindre et ne rien laisser autre chose dans la nature que l’eau ; qu’enfin l’eau recèle l’espoir du monde futur. Ainsi périra par le feu cette création dont l’eau fut le principe. Es-tu surpris que des fleuves sortent incessamment d’un élément qui a tenu lieu de tout, et duquel tout est sorti ? Quand les éléments furent séparés les uns des autres, l’eau fut réduite au quart de l’univers, et placée de manière à suffire à l’écoulement des fleuves, des ruisseaux, des fontaines. Mais voici une idée absurde de ce même '''Thalès'''. Il dit que la terre est soutenue par l’eau sur laquelle elle vogue comme un navire ; qu’à la mobilité d’un tel support sont dues les fluctuations qu’on appelle tremblements de terre. Ce ne sera donc pas merveille qu’il y ait assez d’eau pour entretenir les fleuves, si tout le globe est dans l’eau. Ce système grossier et suranné n’est que risible ; tu ne saurais admettre que l’eau pénètre notre globe par ses interstices, et que la cale est entr’ouverte.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[[s:Questions_naturelles_(trad._Baillard)|<u>Sénèque le Jeune</u>]], [[s:Questions_naturelles_(trad._Baillard)/Livre_3|''Livre III. chap. 13.'']], traduction par [[s:Auteur:Joseph_Baillard|Joseph Baillard]], Hachette, 1914<br />(également disponible [https://remacle.org/bloodwolf/philosophes/seneque/questionsnaturelles3.htm ici])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''XIII.''' L’eau, dit '''Thalès''', est le plus puissant des éléments : elle existait avant tout, elle est le principe de tout. Nous pensons comme '''Thalès''', au moins sur le dernier point. En effet, nous croyons que le feu, s’emparant du monde entier, convertira tout en sa propre substance : mais il finira par cesser ses ravages, et quand il sera éteint, dans toute la nature il ne restera que l’eau, et cette eau renfermera le germe et l’espérance d’un monde futur. Ainsi par le feu s’accomplira la destruction de l’univers, et par l’eau sa réorganisation. Êtes-vous surpris, maintenant, qu’après avoir tenu lieu de tous les éléments, et les avoir produits tous, l’eau suffise à l’entretien perpétuel des fleuves ? Quand les éléments furent séparés les uns des autres, l’eau fut réduite au quart de l’univers, et dans une proportion convenable pour suffire à l’alimentation des fontaines, des ruisseaux et des rivières. Mais voici une idée absurde du même '''Thalès''' : il dit que la terre est soutenue par l’eau, et qu’elle flotte sur elle comme un navire ; que les tremblements de terre sont causés par les oscillations et les mouvements du fluide qui la soutient. Il n’est donc pas étonnant qu’il y ait assez d’eau pour alimenter les fleuves, puisque tout le globe est dans l’eau. Mais rejetons cette vieille et informe hypothèse, qui assimile les sources aux flots que la cale entr’ouverte laisse pénétrer dans le vaisseau.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PP9#v=onepage&q&f=true <u>Œuvres Complètes de Sénèque, Tome Quatrième</u>], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA327#v=onepage&q&f=true ''Questions Naturelles, De Sénèque à Lucilius - Livre Troisième.''], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA342#v=onepage&q&f=true ''chap. XIII.''], traduction française de la collection Panckoucke, nouvelle édition très soigneusement revue par M. Charpentier et M. Félix Lemaistre, 1860</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''Chap. III.'''<br />''Opiniõ de Thales touchant l’eau.''<br /><p style="text-align: justify; text-indent: 15px;">L’eau , comme dit '''Thales''' , e[[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki>t</nowiki> le plus fort des Elemens. Il croit me{{Info|ſ|forme ancienne longue de la lettre s minuscule}}me qu’elle e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t le premier , & que toutes cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es en ont pris nai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ance. Pour moy ie {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uis de cette opinion , ou du moins de la derniere partie de cette opinion. Car nous [[#nous_stoiciens_NdT_dR|<span id="nous_stoiciens_NdT_dR_back"><sup>1</sup></span>]] di{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ons que c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t le feu qui enueloppera tout le monde , & qui conuertira en {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oy toutes cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es; qu’il deuiendra {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ans force quand il n’aura plus de nourriture , qu’apres que le feu {{Info|ſ|forme ancienne longue de la lettre s minuscule}}era e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}teint il ne demeurera rien de re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te à la nature que l’eau {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement , & que c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t en elle {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eule que con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te l’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}perance d’vn monde futur. Ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i le feu e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t la fin du monde , & l’eau en e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t le commencement. Vous e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tonnez-vous donc que les fleuues pui{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ent tou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iours {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ortir d’vn Element , qui e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t fait pour toutes cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es & dont toutes cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e font ? Lors que la nature fit le departement des Elemens , l’eau fut placée de telle {{Info|ſ|forme ancienne longue de la lettre s minuscule}}orte , qu’elle peut {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uffire pour les fleuues , pour les rui{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eaux , pour les fontaines. Mais ce que '''Thales''' dit en {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uitte e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t ridicule , car il dit que le Globe de la terre e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tenu par les eaux ; qu’elles le portent comme vn vai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eau , & qu’elles l’agitent de la me{{Info|ſ|forme ancienne longue de la lettre s minuscule}}me {{Info|ſ|forme ancienne longue de la lettre s minuscule}}orte , lors que nous croyons qu’il tremble. Il ne faut donc pas s’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tonner , s’il ya tou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iours a{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ez d’eau pour former de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i grands fleuues , puis que tout le monde nage fur l’eau. Mais me{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pri{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ez cette vieille , & cette gro{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}iere opinion , & ne croyez pas que l’eau vienne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur la terre , comme par des fentes & par des creua{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}es , & qu’elle y {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oit {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement comme dans le fond d’vn vai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eau.</div> <table cellspacing=15 style="margin: 0 4em; font-size:85%;"> <tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#nous_stoiciens_NdT_dR_back|<span id="nous_stoiciens_NdT_dR"><sup>1.</sup></span>]] Les Stoïciens.''' </td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=ktOcOg9lr54C&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii&hl=fr&pg=PA1#v=onepage&q&f=true <u>Seneque Des Qvestions Natvrelles</u>], [https://books.google.fr/books?id=ktOcOg9lr54C&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii&hl=fr&pg=PA202#v=onepage&q&f=true ''Livre Troisiesme. Des eaux.''], [https://books.google.fr/books?id=ktOcOg9lr54C&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii&hl=fr&pg=PA234#v=onepage&q&f=true ''chap. XIII.''], traduction par [[w:Pierre_Du_Ryer|Pierre Du Ryer]], A Lyon, Chez Christofle Fovrmy, 1663</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div> </div> <div style="text-align: center; margin: 0 auto;">― ● ―</div> ==== Livre IV — Du Nil ==== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">En prologue, '''Sénèque''' fait l’éloge de [[w:Lucilius_le_Jeune|'''Lucilius''']] [[#Lucilius|<span id="Lucilius_back"><sup>'''I'''</sup></span>]] avant de lui expliquer les dangers de la flatterie. Puis, il décrit la crue du [[w:Nil|''Nil'']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Nil_back|<sup>🔄</sup>]], expose les théories tentant de l’expliquer et les réfute. En épilogue, il fait le procès du luxe, et plus particulièrement celui d’acheter de la neige, et donc de marchandiser l’eau, regrettant qu’on ne puisse faire de même avec l’air et le soleil.</div> {{Boîte déroulante début|titre=NdA Lucilius|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Lucilius_back|<span id="Lucilius"><sup>I</sup></span>]] Du nom propre latin Lucilius [[wikt:en:Lucilius#Latin|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;">Gouverneur ''romain'' de Sicile durant le règne de [[w:Néron|Néron]], ainsi qu’un ami et un correspondant de Sénèque.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:Ier_siècle_av._J.-C.|I<sup>er</sup> siècle {{Info|EC|de l’Ère Commune}}]], [[w:Campanie#Histoire|''Campanie'']], [[w:Quatorze_régions_de_la_Rome_augustéenne#Regio_I_:_Porte_Capène|''Regio I'']])'''<br/><br/></div> {{Boîte déroulante fin}} ===== <div style="text-align: center;">Chapitre II.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Réfutation par '''Sénèque''' d’une théorie explicite de '''Thalès''' sur la crue du ''Nil'' (théorie identique mais supposément implicite rapportée par [[w:Hérodote|'''Hérodote''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Chapitre_XX|<sup>🔄</sup>]]).</div> :'''Texte latin''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''2.''' [...] Si '''Thaleti''' credis, etesiae descendenti ''Nilo'' resistunt et cursum eius acto contra ostia mari sustinent. Ita reuerberatus in se recurrit, nec crescit, sed exitu prohibitus resistit et quacumque mox potuit ui congestus erumpit. '''Euthymenes''' ''Massiliensis'' testimonium dicit: «Nauigaui, inquit, ''Atlanticum'' mare. Inde ''Nilus'' fluit, maior, quamdiu etesiae tempus obseruant; tunc enim eicitur mare instantibus uentis. Cum resederunt, et pelagus conquiescit minorque descendenti inde uis ''Nilo'' est. Ceterum dulcis mari sapor est et similes ''Niloticis'' beluae». Quare ergo, si ''Nilum'' etesiae prouocant, et ante illos incipit incrementum eius et post eos durat? Praeterea non fit maior quo illi flauere uehementius, nec remittitur incitaturque, prout illis impetus fuit; quod fieret, si illorum uiribus cresceret. Quid quod etesiae litus ''Aegyptium'' uerberant et contra illos ''Nilus'' descendit, inde uenturus unde illi, si origo ab illis esset? Praeterea ex mari purus et caeruleus efflueret, non, ut nunc, turbidus ueniret. Adde quod testimonium eius testium turba coarguitur. Tunc erat mendacio locus; cum ignota essent externa, licebat illis fabulas mittere. Nunc uero tota exteri maris ora mercatorum nauibus stringitur, quorum nemo narrat initium ''Nili'' aut mare saporis alterius: quae natura credi uetat, quia dulcissimum quodque et leuissimum sol trahit. Praeterea quare hieme non crescit? Et tunc potest uentis concitari mare, aliquanto quidem majoribus; nam etesiae temperati sunt. Quod si e mari ferretur ''Atlantico'', semel oppleret ''Aegyptum''. At nunc per gradus crescit.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-ii-1979/page/n1/mode/2up <u>L. Annaei Senecae, Natvrales Qvaestiones</u>], [https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-ii-1979/page/n7/mode/2up ''Liber Qvartvs A.''], [https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-ii-1979/page/n41/mode/2up ''chap. 2.''], texte établi par Carmen Codoñer Merino [[w:es:Carmen_Codoñer_Merino|(es)]], Consejo Superior de Investigaciones Científicas, Madrid, 1979</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''II.''' [...] Si '''Thaleti''' credis, Etesiæ descendenti ''Nilo'' resistunt, et cursus ejus acto contra ostia mari sustinent : ita reverberatus in se recurrit : nec crescit, sed exitu prohibitus resistit, et quacumque mox potuit, inconcessus erumpit.<br /><p style="text-align: justify; text-indent: 15px;">'''Euthymenes''' ''Massiliensis'' testimonium dicit : « Navigavi, inquit, ''Atlanticum'' mare. Inde ''Nilus'' fluit major, quamdiu Etesiæ tempus observant : tunc enim ejicitur mare instantibus ventis. Quum resederint, et pelagus conquiescit, minorque descendenti inde vis ''Nilo'' est. Ceterum dulcis maris sapor est, et similes ''Niloticis'' belluæ. » Quare ergo, si ''Nilum'' Etesiæ provocant, et ante illos incipit incrementum ejus, et post eos durat ? Præterea non fit major, quo illi flavere vehementius. Nec remittitur, incitaturque, prout illis impetus fuit : quod fieret, si illorum viribus cresceret. Quid, quod Etesiæ littus ''ægyptium'' verberant, et contra illos ''Nilus'' descendit, inde venturus, unde illi, si origo ab illis esset ? Præterea ex mari purus et cæruleus efflueret, non ut nunc turbidus venit. Adde, quod testimonium ejus testium turba coarguitur. Tunc erat mendacio locus, quum ignota essent externa. Licebat illis fabulas mittere. Nunc vero tota exteri maris ora mercatorum navibus stringitur : quorum nemo narrat nunc cæruleum ''Nilum'', aut mare saporis alterius ; quod et natura credi vetat, quia dulcissimum quodque et levissimum sol trahit. Præterea quare hieme non crescit ? et tunc potest ventis concitari mare, aliquando quidem majoribus ; nam Etesiæ temperati sunt. Quod si e mari ferretur ''Atlantico'', semel oppleret ''Ægyptum''. At nunc per gradus crescit.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PP9#v=onepage&q&f=true <u>Œuvres Complètes de Sénèque, Tome Quatrième</u>], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA371#v=onepage&q&f=true ''Questions Naturelles, De Sénèque à Lucilius - Livre Quatrième.''], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA385#v=onepage&q&f=true ''chap. II.''], traduction française de la collection Panckoucke, nouvelle édition très soigneusement revue par M. Charpentier et M. Félix Lemaistre, 1860</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''II.''' [...] À en croire '''Thalès''', les vents étésiens repoussent le ''Nil'' à sa descente dans la mer, et suspendent son cours en poussant la mer contre ses embouchures. Ainsi refoulé, il revient sur lui-même, sans pour cela grossir ; mais l’issue lui étant barrée, il s’arrête, et bientôt, partout où il le peut, force le passage qui lui est refusé. [[w:Euthymènes|'''Euthymène''']] [[#Euthymènes|<span id="Euthymènes_back"><sup>'''I'''</sup></span>]], de ''Marseille'', en parle comme témoin : « J’ai navigué, dit-il, sur la mer ''Atlantique''. Elle cause le débordement du ''Nil'', tant que les vents étésiens se soutiennent ; car c’est leur souffle qui alors pousse cette mer hors de son lit. Dès qu’ils tombent, la mer aussi redevient calme, et le ''Nil'' à sa descente déploie moins de puissance. Du reste, l’eau de cette mer est douce, et nourrit des animaux semblables à ceux du ''Nil''. » Mais pourquoi, si les vents étésiens font gonfler le ''Nil'', la crue commence-t-elle avant la saison de ces vents, et dure-t-elle encore après ? D’ailleurs le fleuve ne grossit pas à mesure qu’ils soufflent plus violemment. Son plus ou moins de fougue n’est point réglé sur celle des vents étésiens, ce qui aurait lieu, si leur action le faisait hausser. Et puis ils battent la côte ''égyptienne'', le ''Nil'' descend à leur encontre : il faudrait qu’il vînt du même point qu’eux, si son accroissement était leur ouvrage. De plus, il sortirait pur et azuré de la mer, et non pas trouble comme il est. Ajoute que le témoignage d’'''Euthymène''' est réfuté par une foule d’autres. Le mensonge avait libre carrière, quand les plages étrangères étaient inconnues ; on pouvait de là nous envoyer des fables, À présent, la mer extérieure est côtoyée sur tous ses bords par des trafiquants dont pas un ne raconte qu’aujourd’hui le ''Nil'' soit azuré ou que l’eau de la mer soit douce. La nature elle-même repousse cette idée ; car les parties les plus douces et les plus légères sont pompées par le soleil. Et encore pourquoi le ''Nil'' ne croît-il pas en hiver ? Alors aussi la mer peut être agitée par des vents quelque peu plus forts que les étésiens, qui sont modérés. Si le mouvement venait de l’Atlantique, il couvrirait tout d’un coup l’Égypte : or l’inondation est graduelle.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[[s:Questions_naturelles_(trad._Baillard)|<u>Sénèque le Jeune</u>]], [[s:Questions_naturelles_(trad._Baillard)/Livre_4|''Livre IV.'']] ''chap. 2.'', traduction par [[s:Auteur:Joseph_Baillard|Joseph Baillard]], Hachette, 1914<br />(également disponible [https://remacle.org/bloodwolf/philosophes/seneque/questionsnaturelles4.htm ici])</div> {{Boîte déroulante début|titre=NdA trad. par Joseph Baillard de 1914|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Euthymènes_back|<span id="Euthymènes"><sup>I</sup></span>]] Du nom propre grec ancien Εὐθυμένης / Euthuménēs [[wikt:en:Εὐθυμένης#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;"> ➥ de l’adjectif εὐθύς / euthús, « 1. Droit, direct : (au sens moral) direct, ouvert, franc. »;<br /><p style="margin: 0 2em; text-indent: 15px;"> ➥ + du nom commun μενος / ménos, « 1. Esprit. 2. Désir, ardeur, souhait, but. 3. Colère. 4. Courage, esprit, vigueur. 5. Pouvoir, force. 6. Violence. »;<br /><p style="margin: 0 2em; text-indent: 15px;"> ➥ + du suffixe nominal‎ propre -ης / -ēs [[wikt:en:-ης#Suffix_2|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;"> Navigateur et explorateur de la mer Extérieure le long des côtes africaines (actuelle Atlantique sud).<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:VIeme_siècle_av._J.-C.|VI<sup>ème</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]], [[w:Marseille_antique#Massalia,_une_cité_grecque|''Massalia'']], actuelle Marseille)'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''II.''' [...] Selon '''Thalès''', le phénomène a pour cause les vents Étésiens, qui s’opposent au cours du ''Nil'' et font rebrousser ses eaux en sens inverse du mouvement qui le porte vers la mer. Refoulés sur eux-mêmes, les flots refluent sans pour cela grossir ; mais l’issue leur étant fermée, ils s’arrêtent, et bientôt ils s’ouvrent partout où ils peuvent le passage qui leur est refusé.<br /><p style="text-align: justify; text-indent: 15px;">'''Euthymène''' de ''Marseille'' en parle comme témoin : « J’ai navigué, dit-il, sur la mer ''Atlantique''. Le ''Nil'' roule des eaux plus abondantes, tant que durent les vents Étésiens ; car alors ils refoulent la mer sur le fleuve. Dès qu’ils se sont abattus et que la mer est devenue calme, le ''Nil'', qui peut redescendre vers celle-ci, diminue. Au reste, les eaux de cette mer sont douces et contiennent des animaux semblables à ceux du ''Nil''. » Dans cette hypothèse, qui donne les vents Étésiens pour cause des crues du ''Nil'', qu’on me dise pourquoi ces crues précèdent les vents, persistent quand les vents ne sont plus, enfin n’augmentent plus d’intensité et de violence, et ne diminuent pas selon la violence et l’impétuosité du vent même ; c’est pourtant ce qui devrait arriver, si les vents déterminaient la hausse des eaux. De plus, les vents Étésiens battent directement la côte ''égyptienne'' : pourquoi donc le ''Nil'' descend-il contre le souffle de ces vents, tandis qu’il devrait couler dans la même direction, s’il leur devait ses débordements ? Enfin, pourquoi, au lieu d’être diaphanes et azurés, ces flots, qu’on fait venir de la mer, sont-ils chargés de limon ? Ajoutez qu’une foule de témoignages réfutent '''Euthymène'''. On pouvait mentir, quand les plages étrangères étaient inconnues : c’était alors le temps des fables ; mais aujourd’hui mille vaisseaux marchands côtoient la mer extérieure ; personne ne dit que le ''Nil'' ait des flots d’azur ; personne ne donne à la mer une saveur douce, que la nature refuse à ses eaux : car le soleil en pompe sans cesse la partie la plus douce et la plus légère ; ensuite pourquoi le ''Nil'' ne croîtrait-il point pendant l’hiver ? la mer alors peut être battue par les vents, par des vents plus violents que les Étésiens, qui sont modérés. Enfin, si le mouvement venait de l’Atlantique, l’Égypte entière serait inondée tout d’un coup : or, l’inondation est graduelle.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PP9#v=onepage&q&f=true <u>Œuvres Complètes de Sénèque, Tome Quatrième</u>], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA371#v=onepage&q&f=true ''Questions Naturelles, De Sénèque à Lucilius - Livre Quatrième.''], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA385#v=onepage&q&f=true ''chap. II.''], traduction française de la collection Panckoucke, nouvelle édition très soigneusement revue par M. Charpentier et M. Félix Lemaistre, 1860</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''Chap. II.'''<br />''En quelle fai[[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki>ó</nowiki> {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e fait l’accroi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ement du Nil.''<br /><p style="text-align: justify; text-indent: 15px;">[...] Si vous en croyez '''Thales''' , les vents Ethe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iens re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tent au ''Nil'' en de{{Info|ſ|forme ancienne longue de la lettre s minuscule}}cendant dans la mer; & arre{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tent {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on cours, en pou{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ant la mer contre {{Info|ſ|forme ancienne longue de la lettre s minuscule}}es {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ept emboucheures. Si bien qu’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es {{Info|ſ|forme ancienne longue de la lettre s minuscule}}tant repou{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}é de la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}orte il retourne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oy-me{{Info|ſ|forme ancienne longue de la lettre s minuscule}}me , & ne croi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t pas comme l’on pen{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e , mais par ce qu’il trouue vn ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tacle qui l’empe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}che de pa{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}er outre , il e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t contraint de s’arre{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ter , & ne pouuant plus pour{{Info|ſ|forme ancienne longue de la lettre s minuscule}}uiure {{Info|ſ|forme ancienne longue de la lettre s minuscule}}a cour{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e , il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pand par où il peut {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e répandre. '''Euthimenes''' de ''Mar{{Info|ſ|forme ancienne longue de la lettre s minuscule}}eille'' en rend ce te{{Info|ſ|forme ancienne longue de la lettre s minuscule}}moignage. I’ay nauigé, dit il, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur la mer ''Atlantique'' , & c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t par elle que le ''Nil'' deuient plus grand, lors que les vents Ethe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iens {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oufflent ; car alors cette mer {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ort pour ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i dire d’elle-me{{Info|ſ|forme ancienne longue de la lettre s minuscule}}me par la force & par la violence de ces vents. Mais lors qu’ils ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oufflent plus la mer demeure tranquille, & le Nil ne trouue plus rien qui l’empe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}che de de{{Info|ſ|forme ancienne longue de la lettre s minuscule}}cendre , Au re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te l’eau de la mer e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t douce en ce temps-là , & l’on y void des be{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tes {{Info|ſ|forme ancienne longue de la lettre s minuscule}}emblables à celles du Nil. Mais {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i les Ethe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iens {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont enfler le Nil, pourquoy {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on débordement commence il auant qu’ils {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oufflent & pourquoy dure - il encore lors qu’ils ont ce{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}é de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ouffler. Dauantage ils ne s’enfle pas plus que de cou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tume , quand ces vents {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oufflent auecque plus de violence qu’ils ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont ordinairement. Enfim il ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e hau{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}e & ne s’abai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}e pas {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon que leur impetuo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ité e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t plus ou moins grande , ce qui arriveroit {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ans doute s’il s’enfloit par la force de ces véts. Mais comme les Ete{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iens battent directement les bords de l’Egypte, & que le Nil de{{Info|ſ|forme ancienne longue de la lettre s minuscule}}cend contre eux ; il faudroit s’ils e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}toient cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on accroi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ement , qu’il commença{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t par l’endroit d’où ils viennent. Outre cela il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ortiroit tout pur de la mer, & de la couleur de la mer, & ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit pas trouble & limonneux , comme il e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t. Et apres tout le te{{Info|ſ|forme ancienne longue de la lettre s minuscule}}moignage d’'''Euthimene''' , e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t condamné par le plus grand nombre. Il e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}toit permis de mentir quand on n’auoit point de connoi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ance des pays e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}trangers ; & alors on pouuoit facilement nous en enuoyer des fables. Mais aujourd’huy tous les riuages des mers les plus e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}loignées {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont remplis de vai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eaux de marchands, & pas vn ne nous apporte que le ''Nil'' {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oit de la couleur de la mer, ou que la mer ait vn autre gou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t. Quand nous aurions des rai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ons pour nous la per{{Info|ſ|forme ancienne longue de la lettre s minuscule}}uader , la nature nous empe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}cheroit de le croire par ce que le Soleil en attire ce qu’il y a de plus leger & de plus doux. Dauantage pourquoy ne croi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t-il pas en Hyuer , puis que la met en ce temps là peut e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tre agitée par des vents plus violents, que les Ethe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iens qui {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont tou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iours moderez. Que {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i le ''Nil'' venoit de la mer ''Atlantique'' , il couuriroit l’Egypte tout d’vn coup, & neantmoins il ne la couure que peu à peu.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=gEzVYlz3c3cC&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii%20volume%202&hl=fr&pg=PA1#v=onepage&q&f=true <u>Seneque Des Qvestions Natvrelles</u>], [https://books.google.fr/books?id=gEzVYlz3c3cC&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii%20volume%202&hl=fr&pg=PA3#v=onepage&q&f=true ''Livre Qvatriesme. De la Nege, de la Greſle, & de la Pluye.''], [https://books.google.fr/books?id=gEzVYlz3c3cC&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii%20volume%202&hl=fr&pg=PA37#v=onepage&q&f=true ''chap. II.''], traduction par [[w:Pierre_Du_Ryer|Pierre Du Ryer]], A Lyon, Chez Christofle Fovrmy, 1663</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div> </div> <div style="text-align: center; margin: 0 auto;">― ● ―</div> ==== Livre VI — Des tremblements de terre ==== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">En prologue, '''Sénèque''' énonce le plan du livre, des causes des tremblements de terre et des peurs qu’ils provoquent, en s’appuyant sur celui de ''Campanie'' qui a récemment causé d’importants dégâts à ''Pompéi'' et à ''Herculanum''. Des chapitres IV à XX, de nombreuses théories sismiques sont présentées, la plupart liées au nom d’un philosophe qui les prône. Le feu, l’eau et l’air sont cités comme causes, et plusieurs d’entre-elles les combinent. À partir du chapitre XXIV, '''Sénèque''' développe sa propre opinion : l’air pénétrant, qui remplit complètement les cavités souterraines sous une forte pression, en est la cause. En épilogue, il explique à '''Lucilius''' quel comportement adopté en de telles situations, à savoir être courageux en ne craignant pas la mort</div> ===== <div style="text-align: center;">Chapitre VI.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Réfutation d’une théorie de '''Thalès''' de la Terre flottant sur l’eau, et témoignage d’une de ses preuves portant sur les tremblements de terre.</div> :'''Texte latin''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''6.''' In aqua causam esse nec ab uno dictum est nec uno modo. '''Thales''' ''Milesius'' totam terram subiecto iudicat umore portari et innare, siue illud oceanum uocas, siue magnum mare, siue alterius naturae simplicem adhuc aquam et umidum elementum. Hac, inquit, unda sustinetur orbis uelut aliquod grande nauigium et graue his aquis quas premit. Superuacuum est reddere causas propter quas existimat grauissimam partem mundi non posse spiritu tam tenui fugacique gestari; non enim nunc de situ terrarum sed de motu agitur. Illud argumenti loco ponit aquas esse in causa quibus hic orbis agitetur, quod in omni maiore motu erumpunt fere noui fontes, sicut in nauigiis quoque euenit ut, si inclinata sunt et abierunt in latus, aquam sorbeant, quae in omni eorum onere quae uehit, si immodice depressa sunt, aut superfunditur aut certe dextra sinistraque solito magis surgit. Hanc opinionem falsam esse non est diu colligendum. Nam, si terra aqua sustineretur et ea aliquando concuteretur, semper moueretur, nec agitari illam miraremur sed manere; deinde tota concuteretur, non ex parte; numquam enim nauis dimidia iactatur. Nunc uero terrarum non uniuersarum sed ex parte motus est. Quomodo ergo fieri potest ut, quod totum uehitur, totum non agitetur, si eo quo uehitur agitatum est? — At quare aquae erumpunt? — Primum omnium saepe tremuit terra et nihil umoris noui fluxit. Deinde, si ex hac causa unda prorumperet, a lateribus terrae circumfunderetur, sicut in fluminibus ac mari uidemus incidere ut incrementum aquarum, quotiens nauigia desidunt, in lateribus maxime appareat. Ad ultimum non tam exigua fieret quam tu dicis eruptio nec uelut per rimam sentina subreperet, sed fieret ingens inundatio ut ex infinito liquore et ferente uniuersa.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-ii-1979/page/n1/mode/2up <u>L. Annaei Senecae, Natvrales Qvaestiones</u>], [https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-ii-1979/page/n135/mode/2up ''Liber Qvintvs - De terrae motv''], [https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-ii-1979/page/n155/mode/2up ''chap. 6.''], texte établi par Carmen Codoñer Merino [[w:es:Carmen_Codoñer_Merino|(es)]], Consejo Superior de Investigaciones Científicas, Madrid, 1979</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''VI.''' In aqua causam esse, nec ab uno dictum est, nec uno modo. '''Thales''' ''Milesius'' totam terram subjecto judicat humore portari et innatare : sive illud Oceanum vocas, sive magnum mare, sive alterius naturæ simplicem adhuc aquam et humidum elementum. Hac, inquit, unda sustinetur orbis, velut aliquod grande navigium et grave his aquis, quas premit. Supervacuum est reddere causas, propter quas existimat, gravissimam partem mundi non posse spiritu tam tenui fugacique gestari ; non enim nunc de situ terrarum, sed de motu agitur. Illud argumenti loco ponit, aquas esse in causa, quibus hic orbis agitatur, quod in omui majore motu erumpunt fere novi fontes : sicut in navigiis quoque evenit, ut, si inclinata sunt et abiere in latus, aquam sorbeant, quæ in omni onere eorum quæ vehit, si immodice depressa sunt, aut superfunditur, aut certe dextra sinistraque solito magis surgit. Hanc opinionem falsam esse, non est diu colligendum ; nam, si terram aqua sustineret, et ea aliquando concuteretur : semper moveretur, nec agitari illam miraremur, sed manere. Tum tota concuteretur, non ex parte : nunquam enim navis dimidia jactatur. Nunc vero non terrarum universarum, sed ex parte motus est. Quomodo ergo fieri potest, ut quod totum vehitur, totum non agitetur, si eo quo vehitur, agitatum est ? At quare aquæ erumpunt ? Primum omnium sæpe tremuit terra, et nihil humoris novi fluxit. Deinde si ex hac causa unda prorumperet, a lateribus terræ circumfunderetur : sicut in fluminibus ac mari videmus accidere, ut incrementum aquarum, quoties navigia desidunt, in lateribus maxime appareat. Ad ultimum non tam exigua fieret quam dicit eruptio, nec velut per rimam sentina subreperet, sed fieret ingens inundatio, ut ex infinito liquore, et ferente universa.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PP9#v=onepage&q&f=true <u>Œuvres Complètes de Sénèque, Tome Quatrième</u>], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA420#v=onepage&q&f=true ''Questions Naturelles, De Sénèque à Lucilius - Livre Sixième.''], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA429#v=onepage&q&f=true ''chap. VI.''], traduction française de la collection Panckoucke, nouvelle édition très soigneusement revue par M. Charpentier et M. Félix Lemaistre, 1860</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''VI.''' Que l’eau soit cause des tremblements de terre, c’est ce qu’affirment divers auteurs et avec divers arguments. '''Thalès''' de ''Milet'' estime que le globe entier a pour support une masse d’eaux sur laquelle il flotte, et qu’on peut appeler Océan ou grande mer, ou élément jusqu’ici de nature simple, l’élément humide. Cette eau, dit-il, soutient la terre ; et l’immense navire pèse sur le liquide qu’il comprime. Il est superflu d’exposer les motifs qui font croire à '''Thalès''' que la partie de l’univers la plus pesante ne saurait porter sur une substance aussi ténue, aussi fugace que l’air : il ne s’agit pas maintenant de l’assiette du globe, mais de ses secousses. '''Thalès''' apporte en preuve de son système, que presque toujours les grandes secousses font jaillir des sources nouvelles, comme il arrive dans les navires qui, lorsqu’ils penchent et s’inclinent sur le flanc, sont envahis par l’eau ; toujours, s’il y a surcharge, l’eau vient couvrir le bâtiment, ou du moins s’élève à droite et à gauche plus que de coutume. La fausseté de cette opinion se démontre sans longs raisonnements. Si la terre était soutenue par l’eau, elle tremblerait quelquefois dans toute sa masse et toujours serait en mouvement ; ce ne serait pas son agitation qui étonnerait, mais son repos. Elle s’ébranlerait tout entière, non partiellement ; car ce n’est jamais la moitié seulement d’un navire qui est battue des flots. Or, les tremblements de notre terre ne sont pas universels, mais partiels. Comment serait-il possible qu’un corps porté tout entier par l’eau ne fût pas agité tout entier, quand ce fluide est agité ? « Mais d’où viennent les eaux qu’on a vues jaillir ? » D’abord, souvent la terre tremble, sans qu’il en sorte de nouvelles eaux. Ensuite, si telle était la cause de ces éruptions, elles n’auraient lieu qu’autour des flancs du globe ; ce que nous voyons arriver sur les fleuves et en mer : l’exhaussement de l’onde, à mesure que s’enfonce le navire, se remarque surtout aux flancs du bâtiment. Enfin l’éruption dont on parle ne serait pas si minime, et comme une voie d’eau qui s’infiltre par une fente légère ; l’inondation serait immense en raison de l’abîme infini sur lequel flotterait le monde.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[[s:Questions_naturelles_(trad._Baillard)|<u>Sénèque le Jeune</u>]], [[s:Questions_naturelles_(trad._Baillard)/Livre_6|''Livre VI.'']] ''chap. 6.'', traduction par [[s:Auteur:Joseph_Baillard|Joseph Baillard]], Hachette, 1914<br />(également disponible [https://remacle.org/bloodwolf/philosophes/seneque/questionsnaturelles6.htm ici])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''VI.''' Plusieurs philosophes ont prétendu que l’eau est la cause de ces secousses : ce que chacun explique à sa manière. '''Thalès''' de ''Milet'' prétend que le globe entier a pour support une masse d’eau sur laquelle il flotte ; peu importe qu’on donne à cet amas le nom d’Océan, de grande mer ou d’eau élémentaire, eau simple. Cette eau, dit-il, soutient la terre comme un grand vaisseau pesant sur le liquide qu’il comprime. Il est inutile d’exposer les raisons qui font croire à '''Thalès''' que le corps le plus pesant de la nature ne peut être soutenu par un fluide aussi délié et aussi rare que l’air : car il s’agit ici des tremblements de terre et non de l’assiette du globe. La grande raison de '''Thales''' pour faire de l’eau la cause des secousses de la terre, c’est que, dans tout tremblement considérable, jaillissent des eaux nouvelles ainsi les vaisseaux se remplissent d’eau quand ils penchent d’un côté ; chargés à l’excès, ou ils sont submergés, ou ils s’enfoncent à droite et à gauche plus profondément dans la mer. Il ne faut pas longtemps discuter pour voir la fausseté de cette opinion. Si la terre était soutenue par les eaux, elle serait quelquefois fortement ébranlée, mais de plus elle serait toujours flottante, et il faudrait s’étonner non de son agitation , mais de son repos ; enfin, au lieu d’être ébranlée en partie, elle le serait tout entière : car jamais la moitié d’un vaisseau n’est battue des flots. Or, on sait que les secousses de la terre sont partielles et non universelles : comment se ferait-il donc que ce qui est entièrement porté par les eaux ne fût pas entièrement agité, tandis que les eaux mêmes le sont en totalité ? Mais, dit-on, qui fait jaillir les eaux ? D'abord, souvent la terre tremble sans qu’il se produise des eaux nouvelles ; ensuite, si telle était la cause de ces éruptions, les eaux se répandraient latéralement autour de la terre. Ainsi, par exemple, quand un vaisseau s’enfonce ou dans la mer ou dans les fleuves, c’est vers les bords surtout que l’accroissement devient sensible. Enfin les sources qui jaillissent ne seraient pas si peu considérables ; on ne pourrait pas les comparer à une voie d’eau qui pénètre par les fentes du fond de cale : ce serait une inondation immense comme l’abîme infini sur lequel flotterait le monde.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PP9#v=onepage&q&f=true <u>Œuvres Complètes de Sénèque, Tome Quatrième</u>], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA420#v=onepage&q&f=true ''Questions Naturelles, De Sénèque à Lucilius - Livre Sixième.''], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA429#v=onepage&q&f=true ''chap. VI.''], traduction française de la collection Panckoucke, nouvelle édition très soigneusement revue par M. Charpentier et M. Félix Lemaistre, 1860</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''Chap. VI.'''<br />''Si l’eau e[[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki>t</nowiki> la cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e des tréblemés de terre.''<br /><p style="text-align: justify; text-indent: 15px;">Ce n'e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t pas vn homme {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eul qui a dit , que l’eau e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}toit cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e du tremblement de la terre ; & l’on ne l’a pas dit d’vne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eule façó. '''Thales''' ''Mile{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ien'' a crû que toute la terre e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}toit portée {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur l’eau , & qu’elle y nageoit, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oit que vous appelliez cette eau Ocean, ou que vous l’appelliez grade mer, ou vne eau d’vne autre nature , eau {{Info|ſ|forme ancienne longue de la lettre s minuscule}}imple , element humide. C’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur cette eau, dit-il, que le monde e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tenu, comme quelque vai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eau d’vne grandeur deme{{Info|ſ|forme ancienne longue de la lettre s minuscule}}urée , qui charge les eaux qui le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tiennent. Il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit inutile de rapporter les rai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ons qui luy {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont croire que la plus pe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ante partie du móde ne peut e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tre {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tenuë par l’air qui e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ubtil, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i fluide & {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i delié ; & d’ailleurs, il ne s’agit pas icy de l’a{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}iete de la terre , mais du tremblement de la terre. Ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i pour preuue que les eaux {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e que la terre tremble , il dit qu’il ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e fait pre{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que point de grands tremblemens de terre, qu’on n’en voye {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ortir en{{Info|ſ|forme ancienne longue de la lettre s minuscule}}uitte de nouuelles {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ources; que la terre re{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}emble en cela aux vai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eaux qui ne peuuent pancher d’vn co{{Info|ſ|forme ancienne longue de la lettre s minuscule}}té, qu’ils ne pui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ent de l’eau, qui {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pand {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur toutes les cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es qu’ils portent , {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i elles {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont trop enfoncées; ou qui s’éleue de part & d’autre à la gauche , & à la droite. Il n’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t pas besoin d’vn long di{{Info|ſ|forme ancienne longue de la lettre s minuscule}}cours pour montrer la fau{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eté de cette opinion ; car {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i l’eau {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tenoit la terre, quelquesfois elle trembleroit toute entiere, & {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit tou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iours en mouuement; & nous ne nous e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tonnerions point de la voir remuer, mais de la voir ferme & inébranlable. Elle trembleroit toute entiere , & non pas en partie , car vn vai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eau n’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t iamais agité par vne moitié {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement ; & apres tout nous voyons que le tremblement ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e fait pas de toute la terre , mais {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement d’vne partie. Comment donc {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e peut-il faire que ce qui e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t porté tout entier ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oit pas entierement agité , {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i la cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e me{{Info|ſ|forme ancienne longue de la lettre s minuscule}}me qui porte e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}meuë & agitée ? Mais pourquoy {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ort-il de l’eau apres vn tremblement de terre ? Premierement la terre a {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ouuent tremblé {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ans qu’on en ayt veu {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ortir de nouuelles {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ources. D’ailleurs {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i l’eau {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ortoit par cette rai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}on elle {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pandroit par les co{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tez de la terre , comme nous voyons dans les fleuues & dans la mer , où lors que le vai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eau s’enfonce on remarque que l’eau s'éleue , principalement par les co{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tez. Enfin ces eaux ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ortiroient pas en {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i petite quantité, ny par vne fi petite ouuerture , mais il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit vne grande inondation, comme procedant de cette abondance d’eaux qui {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tiennent tout l’vniuers.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=gEzVYlz3c3cC&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii%20volume%202&hl=fr&pg=PA1#v=onepage&q&f=true <u>Seneque Des Qvestions Natvrelles</u>], [https://books.google.fr/books?id=gEzVYlz3c3cC&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii%20volume%202&hl=fr&pg=PA141#v=onepage&q&f=true ''Livre Sixiesme. Des tremblemens de terre.''], [https://books.google.fr/books?id=gEzVYlz3c3cC&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii%20volume%202&hl=fr&pg=PA164#v=onepage&q&f=true ''chap. VI.''], traduction par [[w:Pierre_Du_Ryer|Pierre Du Ryer]], A Lyon, Chez Christofle Fovrmy, 1663</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Pline_l%27Ancien|'''Pline l’Ancien''']] [[#Pline|<span id="Pline_back"><sup>'''I'''</sup></span>]] == <p style="text-align: right;">([[w:23|23]]/[[w:24|24]], à [[w:Côme|''Novum Comum'']] ou [[w:Vérone|Vérone]] — [[w:79|79]], à [[w:Stabies|Stabies]], [[w:Mort_de_Pline_l%27Ancien|mort]] par asphyxie près de [[w:Pompéi|Pompéi]], lors de l’éruption du [[w:Vésuve|Vésuve]], en voulant observer le phénomène au plus près et en désirant porter secours aux victimes, alors en poste à [[w:Misène|''Misène'']] en tant que Préfet commandant la flotte militaire ''romaine'') <sup>[[w:Ier_siècle|⏳]]</sup> [[s:Auteur:Pline_l’Ancien|<sup>📚</sup>]] [https://books.google.fr/books?id=tRsuD3WJT-UC&newbks=1&newbks_redir=0&lpg=PA3&dq=bibliogroup%3A%22Dictionnaire%20des%20philosophes%20antiques%22&hl=fr&pg=PA876#v=onepage&q&f=true {{Info|<sup>🔍</sup>|Dictionnaire des Philosophes Antiques, publié sous la direction de Richard Goulet, Volume Va, §204 - Plinius Secundus (Caius —)}}] <div style="text-align: justify; margin: 0 1em; text-indent: 15px">Haut fonctionnaire militaire et civique, issu de l’[[w:Chevalier_romain|''orde équestre'']], et écrivain prolifique dans de très nombreux domaines.</div> {{Boîte déroulante début|titre=NdA Pline l’Ancien|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Pline_back|<span id="Pline"><sup>I</sup></span>]] [[w:Nom_romain|Tria Nomina]] en latin {{Info|Caius|praenomen, nom individuel du citoyen romain}} {{Info|Plinius|nomen, nom de famille}} {{Info|Secundus|cognomen, surnom héréditaire, servant à distinguer les diverses branches d’une même gens}}'''<br/><br/></div> {{Boîte déroulante fin}} === [[w:Histoire_naturelle_(Pline_l'Ancien)|Histoire naturelle]] === <p style="text-align: right;">[[s:Histoire_naturelle_(Pline)|📚]] <div style="text-align: justify; margin: 0 1em; text-indent: 15px">Ouvrage de 37 livres dédié à l’empereur [[w:Titus_(empereur_romain)|'''Titus''']] [[#Titus|<span id="Titus_back"><sup>'''I'''</sup></span>]], dont il a été le ''{{Lang|la|contubernium}}'' pendant son service en tant que commandant des armées du ''Rhin'' en ''Germanie'' en [[w:47|47]]. '''Pline''' définit lui-même son enquête [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Histoire/Enquête_I|<sup>🔄</sup>]] sur la nature comme une reproduction de la vie — ''{{Lang|la|rerum natura, hoc est uita narratur}}'' (Livre I, Préface, 10), qu’il inscrit dans la tradition encyclopédique [[#encyclopédie_back|<sup>⤴️</sup>]] grecque mais s’en différencie par son exhaustivité : ''{{Lang|la|Jam omnia attingenda, quæ Græci}}'' ''{{Lang|grc|τάς έγχυχλοπαιδείας}}'' ''{{Lang|la|vocant : et tamen ignota aut incerta ingeniis facta; alia vero ita multis prodita, ut in fastidium sint adducta}}'' (Préface, 11). Il a, dans ce but, compilé « vingt mille faits dignes d’intérêt, tirés de la lecture d’environ deux mille volumes, [...] provenant de cent auteurs de choix » — ''{{Lang|la|Viginti millia rerum dignarum cura ex lectione voluminum circiter duum millium, [...] ex exquisitis auctoribus centum}}'' (Préface, 13).</div> {{Boîte déroulante début|titre=NdA Titus|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Titus_back|<span id="Titus"><sup>I</sup></span>]] Du nom propre latin Titus [[wikt:en:Titus#Latin|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;">Commandant militaire, notamment pendant la [[w:Premi%C3%A8re_guerre_jud%C3%A9o-romaine|''première guerre judéo-romaine'']], au cours de laquelle il prend ''Jérusalem'' que ses troupes mettent à sac et fait détruire le [[w:Second_temple_de_Jérusalem#Destruction|''Second Temple'']], et empereur ''romain'', de la dynastie des [[w:Flaviens|''Flaviens'']], de [[w:79|79]] à [[w:81|81]].<br /><p style="text-align: right; margin: 0 2em;">(30 décembre [[w:39|39]] , ''Rome'' — 13 septembre [[w:81|81]], mort par fièvre selon [[w:Suétone|Suétone]] [http://remacle.org/bloodwolf/historiens/suetone/titus.htm <sup>VdDC, Titus</sup>] ou par empoisonnement avec du venin de [[w:Aplysia|''lièvre marin'']] par son propre frère [[w:Domitien|Domitien]] selon [[w:Philostrate_d%27Ath%C3%A8nes|Philostrate]] [https://remacle.org/bloodwolf/roman/philiostrate/apollonius6.htm <sup>AdT, l. VI, chap. 32</sup>])<sup>[[w:Ier_siècle|⏳]]</sup>'''<br/><br/></div> {{Boîte déroulante fin}} ==== Livre II ==== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Enquête sur l’astronomie et la physique du monde, basée sur les quatre éléments : air, terre, eau et feu.</div> ===== <div style="text-align: center;">Chapitre IX.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage de la première prédiction grecque d’une éclipse solaire (ou lunaire selon les traductions) par '''Thalès'''.</div> :'''Texte latin''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''IX.''' Et rationem quidem defectus utriusque primus ''Romani'' generis in vulgus extulit '''Sulpicius Gallus''', qui consul cum '''Marcello''' fuit, sed tum tribunus militum, sollicitudine exercitu liberato, pridie quam '''Perseus''' rex superatus a '''Paulo''' est, in concionem ab imperatore productus ad prædicendam eclipsim, mox et composito volumine. Apud Græcos autem investigavit primus omnium '''Thales''' ''Milesius'', Olympiadis XLVIII anno quarto, prædicto solis defectu, qui '''Alyatte''' rege factus est, Urbis conditæ; anno CLXX. Post eos utriusque sideris cursum in sexcentos annos præcinuit '''Hipparchus''', menses gentium, diesque et horas, ac situs locorum, et visus populorum complexus, ævo teste, haud alio modo, quam consiliorum naturæ particeps. Viri ingentes supraque mortalium naturam, tantorum numinum lege deprehensa, et misera hominum mente absoluta, in defectibus scelera aut mortem aliquam siderum pavente (quo in metu fuisse '''Stesichori''' et '''Pindari''' vatum sublimia ora palam est deliquio Solis), et in Luna veneficia arguente mortalitate, et ob id crepitu dissono auxiliante. Quo pavore, ignarus causæ, '''Nicias''' ''Atheniensium'' imperator, veritus classem portu educere, opes eorum afflixit. Macti ingenio este, cæli interpretes, rerumque naturæ capaces, argumenti repertores, quo deos hominesque vinxistis. Quis enim hæc cernens, et statos siderum (quoniam ita placuit appellare) labores, non suæ necessitati mortalis genitus ignoscat ? Nunc confessa de iisdem breviter atque capitulatim attingam, ratione admodum necessariis locis strictimque reddita : nam neque instituti operis talis argumentatio est : neque omnium rerum afferri posse causas, minus mirum est, quam consfare in aliquibus.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/b24875958_0001/page/n7/mode/2up <u>Histoire Naturelle de Pline.</u>], [https://archive.org/details/b24875958_0001/page/98/mode/2up ''Livre II.''], [https://archive.org/details/b24875958_0001/page/106/mode/2up ''chap. IX.''], texte corrigé par [[w:Émile_Littré|M. É. Littré]], à partir de celui de [[w:Jean_Hardouin|Hardouin]], Librairie de Firmin-Didot et C<sup>ie</sup>, Paris, 1883<br />(également disponible une édition 1848 [[s:Page:Pline_l'ancien_-_Histoire_naturelle,_Littré,_T1_-_1848.djvu/130|ici]] et 1829 [https://gallica.bnf.fr/ark:/12148/bpt6k5773334c/f45.item là])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''IX.''' Le premier ''Romain'' qui exposa publiquement la théorie des éclipses du soleil et de la lune est [[w:Caius_Sulpicius_Gallus|'''Sulpicius Gallus''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Caius_Sulpicius_Gallus_back|<sup>🔄</sup>]], qui fut consul avec [[w:Marcus_Claudius_Marcellus_(consul_en_-166)|'''Marcellus''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Marcellus-166_back|<sup>🔄</sup>]], mais qui alors était tribun militaire. La veille du jour où [[w:Persée_(roi)|'''Persée''']] [[#Persée_(roi)|<span id="Persée_(roi)_back"><sup>'''I'''</sup></span>]] fut défait par [[w:Lucius_Æmilius_Paullus_Macedonicus|'''Paul-Emile''']] [[#Lucius_Æmilius_Paullus_Macedonicus|<span id="Lucius_Æmilius_Paullus_Macedonicus_back"><sup>'''II'''</sup></span>]] il parut par ordre du général, afin de prévenir les alarmes de l’armée, devant les troupes assemblées pour annoncer l’éclipse qui allait survenir; peu de temps après, il composa un livre sur ce sujet. Le premier qui s’en occupa chez les ''Grecs'' fut '''Thalès''' de ''Milet'', dans la quatrième année de la quarante-huitième olympiade (an 585 av. J. C. [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#éclipse_back|<sup>🔄</sup>]]), l’an 170 de la fondation de ''Rome'', et prédit une éclipse de lune qui arriva sous le roi [[w:Alyatte_II|'''Alyatte''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Alyatte_back|<sup>🔄</sup>]]. Après eux, [[w:Hipparque_(astronome)|'''Hipparque''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Hipparque_back|<sup>🔄</sup>]] dressa pour six cents ans la table du cours du soleil et de la lune, déterminant les mois des divers calendriers, les jours, les heures, les localités et les aspects, suivant les contrées. Le cours des ans ne lui a donné aucun démenti, et il semble avoir été admis aux conseils de la nature. Génies puissants et élevés au dessus de l’humanité, ils ont découvert la loi qui régit ces grandes divinités, et ils ont délivré de ses craintes l’esprit misérable des hommes, qui dans les éclipses, tantôt croyaient voir une influence malfaisante ou une espèce de mort des astres, crainte qui, comme on sait, a, pour l’éclipse du soleil, troublé [[w:Stésichore|'''Stésichore''']] [[#Stésichore|<span id="Stésichore_back"><sup>'''III'''</sup></span>]] et [[w:Pindare|'''Pindare''']] [[#Pindare|<span id="Pindare_back"><sup>'''IV'''</sup></span>]], poètes sublimes, et tantôt attribuaient l’obscurcissement de la lune à des maléfices, et lui venaient en aide par un bruit dissonnant. Redoutant ce phénomène, dont il ignorait la cause, [[w:Nicias|'''Nicias''']] [[#Nicias|<span id="Nicias_back"><sup>'''V'''</sup></span>]], général des ''Athéniens'', n’osa pas faire sortir la flotte du port de [[w:Syracuse#Antiquité|''Syracuse'']], et ruina la puissance de sa patrie. Redoublez de génie, interprètes du ciel, vous dont l’intelligence, embrassant la nature, a inventé des théories qui ont créé un lien entre les dieux et les hommes [[#Vicistis_JH|<span id="Vicistis_JH_back"><sup>'''1'''</sup></span>]] ! A la vue de ce spectacle, à la vue des labeurs (puisque c’est le nom qu’on a voulu donner aux éclipses), des labeurs réguliers auxquels les astres sont soumis, quel mortel ne pardonnerait à la nécessité sous laquelle il est né ? Maintenant je vais parler, d’une manière brève et sommaire, des points sur lesquels on est d’accord en cette matière. Je ne donnerai que de courtes explications, et là où il sera tout à fait nécessaire; car les explications n’entrent pas dans le plan de cet ouvrage, et il n’y a pas moins de mérite à énumérer les causes de toutes choses qu’à s’appesantir sur quelques-unes.</div> <table cellspacing=15 align=center style="margin: 0 4em; font-size:85%;"> <tr> <td style="text-align: justify; margin: 0 4em;">'''[[#Vicistis_JH_back|<span id="Vicistis_JH"><sup>1</sup></span>]] Vicistis Vulg. — Vinxistis cod. Dalech. — Vinxistis me parait meilleur. Comp. ce que dit Pline plus loin, ch. 24, sur l’affinité de l’esprit humain avec les astres.'''</td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/b24875958_0001/page/n7/mode/2up <u>Histoire Naturelle de Pline.</u>], [https://archive.org/details/b24875958_0001/page/98/mode/2up ''Livre II.''], [https://archive.org/details/b24875958_0001/page/106/mode/2up ''chap. IX.''], texte corrigé par [[w:Émile_Littré|M. É. Littré]], à partir de celui de [[w:Jean_Hardouin|Hardouin]], Librairie de Firmin-Didot et C<sup>ie</sup>, Paris, 1883<br />(édition 1848 également disponible [[s:Page:Pline_l'ancien_-_Histoire_naturelle,_Littré,_T1_-_1848.djvu/130|ici]])</div> {{Boîte déroulante début|titre=NdA de trad. Jean Hardouin 1883|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Persée_(roi)_back|<span id="Persée_(roi)"><sup>I</sup></span>]] Du nom propre grec ancien Περσεύς / Perseús[[wikt:en:Περσεύς#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">Dernier roi de [[w:Royaume_de_Mac%C3%A9doine|''Macédoine'']] de la dynastie des [[w:Antigonides|''Antigonides'']], vaincu en [[w:-168|-168]] à la [[w:bataille de Pydna|bataille de ''Pydna'']] à l’issue de la [[w:troisième guerre macédonienne|''troisième guerre macédonienne'']], causant la disparition du ''Royaume de Macédoine''.<br /><p style="text-align: right; margin: 0 2em;">([[w:Années_212_av._J.-C.|-212]]<sup>[[w:IIIe_siècle_av._J.-C.|⏳]]</sup>, [[w:Pella_(cité_antique)|''Pella'']], au nord de l’actuelle ''Grèce'' — [[w:Années_166_av._J.-C.|-166]]<sup>[[w:IIe_siècle_av._J.-C.|⏳]]</sup>, [[w:Alba_Fucens|''Alba Fucens'']], au centre de l’actuelle ''Italie'') <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Lucius_Æmilius_Paullus_Macedonicus_back|<span id="Lucius_Æmilius_Paullus_Macedonicus"><sup>II</sup></span>]] [[w:Nom_romain|Tria Nomina]] en latin {{Info|Lucius|praenomen, nom individuel du citoyen romain}} {{Info|Æmilius|nomen, nom de famille}} {{Info|Paullus|cognomen, surnom héréditaire, servant à distinguer les diverses branches d’une même gens}}, surnommé [[wikt:Macedonicus#Latin|Macedonicus]] par le [[w:Sénat_romain|''Sénat'']] à la suite de sa victoire;<br /><p style="margin: 0 2em; text-indent: 15px">Homme politique ''romain'', consul à 2 reprises en [[w:Années_182_av._J.-C.|-182]] et [[w:Années_169_av._J.-C.|-169]]. Il remporta la victoire contre le ''royaume de Macédoine'' à ''Pydna'' en battant le roi Persée [[#Persée_(roi)|<sup>I</sup>]], ce qui mit fin à la dynastie des ''Antigonides''.<br /><p style="text-align: right; margin: 0 2em;">([[w:Circa|{{Info|''ca.''|Circa, locution latine que l’on emploie pour indiquer l’approximation d’une date}}]] [[w:Années_230_av._J.-C.|-230]]<sup>[[w:IIIe_siècle_av._J.-C.|⏳]]</sup>, ''Rome'' — ''ca.'' [[w:Années_160_av._J.-C.|-160]]<sup>[[w:IIe_siècle_av._J.-C.|⏳]]</sup>, ''Rome'') <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Stésichore_back|<span id="Stésichore"><sup>III</sup></span>]] Du nom propre grec ancien Στησίχορος /Stēsíkhoros [[wikt:en:Στησίχορος#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;">➥ du verbe ἵστημι /hístēmi, « 1. (voix transitive, active des temps présent, imparfait, futur et 1er aoriste) : • Faire se tenir debout, se tenir debout; • Arrêter, rester, vérifier; • Mettre en place : - Faire monter, élever, réveiller, remuer; - Nommer, désigner; - Établir, instituer; • Mettre dans la balance, peser. 2. (voix intransitive, moyenne et passive, voix active du 2e aoriste, parfait et plus-que-parfait) : • Se tenir debout; • Se tenir immobile : (au sens figuré) Rester ferme; • Être dressé ou debout, se lever, s’élever : - (en général) Se lever, commencer; - (en marquant le pas) Être; - Être désigné. »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ +‎ du nom commun χορός / khorós, « 1. Danse en rond. 2. Danse accompagnée de chant, danse chorale. 3. Chœur, chorale, groupe de chanteurs et de danseurs. 4. Groupe, troupe. 5. Rangée. 6. Lieu de danse. 7. (théâtre) Chœur »;<br /><p style="margin: 0 2em; text-indent: 15px">Poète lyrique grec, considéré comme l’un des [[w:Neuf_lyriques_grecs|''neuf poètes lyriques'']] de la Grèce antique.<br /><p style="text-align: right; margin: 0 2em;">([[w:Circa|{{Info|''ca.''|Circa, locution latine que l’on emploie pour indiquer l’approximation d’une date}}]] [[w:Années_630_av._J.-C.|-630]]<sup>[[w:VIIe_siècle_av._J.-C.|⏳]]</sup>, [[w:Metauria|''Metauria'']], colonie de la [[w:Grande-Grèce|''Grande-Grèce'']], au sud de la région de [[w:Calabre|''Calabre'']], au sud de l’Italie — ''ca.'' [[w:Années_555_av._J.-C.|-555]]<sup>[[w:VIe_siècle_av._J.-C.|⏳]]</sup>, [[w:Catane|''Catane'']], colonie de la ''Grande-Grèce'', à l’est de la [[w:Sicile|''Sicile'']]) <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Pindare_back|<span id="Pindare"><sup>IV</sup></span>]] Du nom propre grec ancien Πίνδᾰρος /Píndaros [[wikt:en:Πίνδαρος#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">Poète lyrique grec, considéré comme l’un des [[w:Neuf_lyriques_grecs|''neuf poètes lyriques'']] de la Grèce antique.<br /><p style="text-align: right; margin: 0 2em;">([[w:Années_518_av._J.-C.|-518]]<sup>[[w:VIe_siècle_av._J.-C.|⏳]]</sup>, [[w:Cynocéphales|''Cynocéphales'']], cité grecque située près de [[w:Thèbes_(Grèce)|''Thèbes'']], en [[w:Béotie|''Béotie'']] — [[w:Années_438_av._J.-C.|-438]]<sup>[[w:Ve_siècle_av._J.-C.|⏳]]</sup>, [[w:Árgos|''Árgos'']], cité grecque de la région de l’[[w:Argolide|''Argolide'']], à l’est de la [[w:Péloponnèse|''péninsule du Péloponnèse'']]) <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Nicias_back|<span id="Nicias"><sup>V</sup></span>]] Du nom propre grec ancien Νῑκίᾱς /Nīkíās [[wikt:en:Νικίας#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;">➥ du nom commun νίκη / níkē [[wikt:en:νίκη#Ancient_Greek|(en)]], « 1. Le fait de gagner : la victoire, le succès [avec le génitif "sur, dans quelque chose"] : • Les choses gagnées dans la victoire, les fruits de la victoire; • La supériorité, l’avantage. »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ + du suffixe nominal masculin -ίας / -ías [[wikt:en:-ίας#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">Homme politique et général ''athénien'' durant la [[w:Guerre_du_Péloponnèse|''guerre du Péloponnèse'']], qui oppose la [[w:Ligue_de_Délos|''ligue de Délos'']], menée par ''Athènes'', et la [[w:Ligue_du_Péloponnèse|''ligue du Péloponnèse'']], sous l’[[w:Hégémonie|hégémonie]] de ''Sparte'' de [[w:Années_431_av._J.-C.|-431]] à [[w:Années_404_av._J.-C.|-404]]. Sa supersition liée à une éclipse lunaire, s’étant produite lors de l’[[w:Expédition_de_Sicile|''expédition de Sicile'']], est également relatée par [[w:Thucydide|Thucydide]] [http://remacle.org/bloodwolf/historiens/thucydide/livre7.htm#L <sup>{{Info|HdlgdP|Histoire de la guerre du Péloponnèse}} l.VII, §.L</sup>] et [[w:Plutarque|Plutarque]] [[#Plutarque_back|<sup>⤵️</sup>]] [http://remacle.org/bloodwolf/historiens/Plutarque/supestition.htm#23 <sup>{{Info|DlS|De la Superstition}} l.I</sup>].<br /><p style="text-align: right; margin: 0 2em;">([[w:Circa|{{Info|''ca.''|Circa, locution latine que l’on emploie pour indiquer l’approximation d’une date}}]] [[w:Années_470_av._J.-C.|-470]], ''Athènes'' — ''ca.'' [[w:Années_413_av._J.-C.|-413]], ''Syracuse'')<sup>[[w:Ve_siècle_av._J.-C.|⏳]]</sup>'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: center; margin: 0 2em;">Des découvertes astronomiques : part de chaque observateur dans la science.<br /><p style="text-align: justify; text-indent: 15px;">'''IX.''' '''Sulpicius Gallus''' [[#Sulpicius_Gallus_AdG|<span id="Sulpicius_Gallus_AdG_back"><sup>'''1'''</sup></span>]] fut le premier ''Romain'' qui expliqua au vulgaire la raison des éclipses de soleil et de lune. Il fut consul avec '''Marcus Marcellus''' ; mais il n’était que tribun militaire lorsque la veille de la victoire que '''Paul Emile''' remporta sur '''Persée''' [[#Pridie_quam_Perses_rex_AdG|<span id="Pridie_quam_Perses_rex_AdG_back"><sup>'''2'''</sup></span>]], son général le fit paraître devant l’armée assemblée, pour lui annoncer l’éclipse qui allait arriver, et la délivrer de l’alarme qu’elle aurait pu en concevoir. Il composa bientôt après un volume sur ce sujet. Parmi les ''Grecs'', '''Thalès''' de ''Milet'' [[#Primus_omnium_Thales_AdG|<span id="Primus_omnium_Thales_AdG_back"><sup>'''3'''</sup></span>]] dirigea le premier ses recherches sur ce phénomène, et la quatrième année de la 48e olympiade, qui répond à l’an 170 [[#Anno_CLXX_AdG|<span id="Anno_CLXX_AdG_back"><sup>'''4'''</sup></span>]] de ''Rome'', il prédit l’éclipse de soleil qui eut lieu sous le règne d’'''Alyatte''' [[#Alyatte_rege_AdG|<span id="Alyatte_rege_AdG_back"><sup>'''5'''</sup></span>]]. Après eux, '''Hipparque''' dressa des tables du cours de ces deux astres pour six cents ans [[#In_sexcentos_annos_AdG|<span id="In_sexcentos_annos_AdG_back"><sup>'''6'''</sup></span>]] : mois, heures, jours, situations respectives des lieux, aspects du ciel selon les diverses nations [[#Menses_gentium_etc_AdG|<span id="Menses_gentium_etc_AdG_back"><sup>'''7'''</sup></span>]], tout y est compris, tout a été vérifié par le temps [[#Aevo_teste_AdG|<span id="Aevo_teste_AdG_back"><sup>'''8'''</sup></span>]]; on croirait l’astronome admis au conseil de la nature. Génies vastes et plus qu’humains, d’avoir ainsi surpris la loi de ces deux grandes divinités [[#Numinum_AdG|<span id="Numinum_AdG_back"><sup>'''9'''</sup></span>]], et affranchi d’effroi la malheureuse espèce humaine, qui tremblait en voyant dans chaque éclipse l’annonce de quelque grand crime, ou craignait la mort des astres [[#In_defectibus_scelera_etc_AdG|<span id="In_defectibus_scelera_etc_AdG_back"><sup>'''10'''</sup></span>]] (effroi dont '''Stésichore''' et '''Pindare''' [[#Pindari_AdG|<span id="Pindari_AdG_back"><sup>'''11'''</sup></span>]], ces poètes sublimes, ne furent point exempts dans les éclipses de soleil), ou qui attribuait à des enchantemens celles de la lune, et venait à son secours en faisant un bruit discordant [[#Crepitu_dissono_AdG|<span id="Crepitu_dissono_AdG_back"><sup>'''12'''</sup></span>]]. C’est pour en avoir ignoré la cause, que, frappé de cette même terreur, '''Nicias''' [[#Nicias_AdG|<span id="Nicias_AdG_back"><sup>'''13'''</sup></span>]], général des ''Athéniens'', n’osa pas faire sortir sa flotte du port, et causa la ruine de leur puissance. Gloire à vous, interprètes du ciel, génies aussi étendus que la nature, inventeurs d’une science qui enchaîne à une même destinée les dieux et les mortels ! Quel est donc l’homme qui, voyant les astres en travail (pour me servir du nom qu’il a plu de donner aux crises qu’ils, subissent périodiquement), ne se soumettra pas à sa destinée?<br /><p style="text-align: justify; text-indent: 15px;">Je vais maintenant toucher brièvement et sommairement les points sur lesquels on est d’accord dans cette matière, et j’en rendrai raison en passant, lorsque cela sera tout-à-fait nécessaire; car un développement de preuves n’est pas le but de l’ouvrage que j’ai entrepris, et il n’y a pas, je pense, moins de mérite à pouvoir rendre raison de toutes choses, qu’à s’arrêter à en prouver quelques-unes.</div> {{Boîte déroulante début|titre=Notes du traducteur|alignT=center}} <div style="text-align: justify; border: 2px; border-radius:15px; font-size:85%;"><br/> <table cellspacing=15 align=center style="margin: 0 4em;"> <tr> <td style="text-align: justify; margin: 0 4em; text-indent: 15px">'''[[#Sulpicius_Gallus_AdG_back|<span id="Sulpicius_Gallus_AdG"><sup>1</sup></span>]] [[w:Tite-Live|Tite-Live]], XLIV, 37, [[w:Quintilien|Quintilien]], I, 10, [[w:Plutarque|Plutarque]] [[#Plutarque_back|<sup>⤵️</sup>]], [[w:Vies_parallèles|''Vie de Paul Emile'']], [[w:Frontin|Frontin]], I, etc., prétendent, comme Pline, que Sulpicius Gallus prédit l’éclipse anx soldats romains. [[w:Cicéron|'''Cicéron''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Cicéron_back|<sup>🔄</sup>]] ([[w:De_Republica|''Répub.'']], I, 15 , page 44, ''édit. Maj.'') dit au contraire que l’éclipse était déjà arrivée lorsque Sulpicius Gailus commençait à s’efforcer d’ôter aux soldats romains la terreur qu’ils avaient conçue de cet événement, en leur expliquant les causes des éclipses.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Pridie_quam_Perses_rex_AdG_back|<span id="Pridie_quam_Perses_rex_AdG"><sup>2</sup></span>]] Selon Tite-Live (XLIV, 37), l’éclipse eut lieu dans la soirée du 3 septembre, cent huit ans avant J.-C., entre sept et dix heures (''ab hora secunda usque ad quartam noctis, quam pridie nonas sept, secula est dies''). M. [[w:Christian_Ludwig_Ideler|Ideler]] (''Chronologie'', II, 104) a calculé cette éclipse. Il a trouvé, comme M. de Nauze, que, selon le calendrier Julien, elle arriva dans la soirée du 21 juin de l’an 168 avant J.-C. à Rome, la lune commença à s’éclipser vers 5h.44’ du soir ; depuis 6h.51’ jusqu’à 8h.18’, la lune fut totalement éclipsée, ; à 9h.,24’, la lune ne fut plus obscurcie du tout. En Macédoine, tous ces phénomènes arrivèrent 39 minutes plus tard. Le 21 juin, le soleil se coucha à Rome et en Macédoine vers 7h.33’, et s’y montra alors à 44 1/2’ h. équatoriales. Ainsi, la première heure de la nuit finissait vers 8h.17’, la seconde vers 9h.2’, la troisième vers 9h.46’, la quatrième vers 10h.31’. La lune fut donc éclipsée totalement au moment où elle se leva dans la Macédoine, et cette éclipse totale y finit dans la seconde heure de la nuit ; au milieu de la quatrième, la lune ne fut plus obscurcie du tout. S’il est vrai, que cette éclipse lunaire, comme Pline, Tite-Live et d’autres le disent, fut prédite par Sulpicius Gallus, l’on devrait avouer que ce Romain s’entendait très-bien au calcul des éclipses lunaires. Mais les récits de Cicéron et de [[w:Valère_Maxime|Valère-Maxime]] ne seraient-ils pas plus vrais que ceux de Pline et de Tite-Live ?''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Primus_omnium_Thales_AdG_back|<span id="Primus_omnium_Thales_AdG"><sup>3</sup></span>]] Le même fait est rapporté par [[w:Hérodote|Hérodote]] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Hérodote_back|<sup>🔄</sup>]], I, 74, par [[w:Diogène_Laërce|Diogène Laërce]] [[#Diogène_Laërce_back|<sup>⤵️</sup>]], I, 6 , par [[w:Clément_d'Alexandrie|Clément d’Alexandrie]] [[#Clément_d'Alexandrie_back|<sup>⤵️</sup>]], ''Strom.'', I, page 302 , par Plutarque, ''Opinions des Philosophes'', II, 24, par [[w:Jean_Tzétzès|Tzetzès]], ''Chil.'' II, v. 869, et par Hardouin.<br /><p style="text-align: justify; text-indent: 15px;">Oltmann a publié une dissertation dans laquelle, à l’aide des tables astronomiques les plus modernes, il est arrivé à ce résultat, que l’éclipse solaire dont il est question ici eut lieu le 3o septembre 610 ans avant J.-C. L’éclipse était totale pour les environs de la ville d’[[w:Erzurum|Érzerum]] sur le [[w:Kızılırmak_(fleuve)|Halys]] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Halys_back|<sup>🔄</sup>]], où [[w:Volney|Volney]] place le champ de bataille des rois [[w:Alyatte_II|Halyattes]] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Alyatte_back|<sup>🔄</sup>]] et [[w:Cyaxare|Cyaxare]] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Cyaxare_back|<sup>🔄</sup>]]. La quatre-vingtième partie du disque solaire seule ne fut pas éclipsée pour le lieu de la terre où Oltmann place le champ de bataille, qui est situé, selon lui, sous 36° long. à l’est de Terro et sous 40° lat. sept. Dans le pays des Ioniens où Thalès prédit l’éclipse, selon Hérodote, l’éclipse se monta à 11 1/2’. M. [[w:Alphonse_Des_Vignoles|Desvignolles]] (''Chronologie de l’histoire sainte'', t. II, pag. 245 et suiv.) fixe l’éclipsé prédite par Thales au 38 mai de l’an 585 avant J.-C. ; son opinion a été adoptée depuis par presque tous les chronologistes et historiens, et par [[w:Gabriel_Brotier|Brotier]] et M. Alexandre. Elle a été réfutée avec succès par Oltmann, qui s’est servi de tables astronomiques bien plus exactes que celles de M. Desvignolles ; en effet, celui-ci a démontré par ses calculs que l’éclipse totale du soleil du 28 mai de l’an 585 avant J.-C., ne fut pas totale dans les lieux où les troupes du roi lydien Halyatte combattirent contre celles du roi Cyaxare ; que, dans ces régions, elle ne se monta pas à plus de 7 1/2 pouces, et que, d’ailleurs, le soleil ne s’était pas encore levé lorsque Féclipse était le plus forte pour les habitans des pays nommés. Mais Hérodote dit positivement que l’éclipse prédite par Thalès fut totale dans ces contrées, et qu’elle eut lieu en plein jour. (Voyez IDELER, ''Chronologie'', t. I, pag. 209 et 210.) Nous remarquerons pourtant avant de finir cette note que la date de Desvignolles est plus conforme que celle d’Oltmann à l’année dans laquelle l’éclipse prédite par Thalès, arriva selon Pline. En effet, le naturaliste romain dit que cette année est la six cent quatre-vingt-cinquième avant J.—C., et c’est justement le 28 mai de cette année que l’éclipse prédite par Thalès arriva, selon M. Desvignolles.<br /><p style="text-align: justify; text-indent: 15px;">Volney pense que l’éclipse en question arriva le 3 février de de l’an 626. Oltman a démontré, dans son Mémoire sur l’éclipse de Thalès, que celle de Volney était déjà passée lorsque le soleil se leva sur le champ de bataille des rois Halyattes et Cyaxare.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Anno_CLXX_AdG_back|<span id="Anno_CLXX_AdG"><sup>4</sup></span>]] L’an 170. C’est ainsi que l’on doit lire, et non CLX, comme l’ont fait Hardouin et Poinsinet; la quatrième année de la quarante-huitième olympiade, correspondant à l’an 170 de Rome, si l’on suppose avec [[w:Varron_(écrivain)|Varron]] que cette ville a été fondée dans la deuxième année de la 6e olympiade.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Alyatte_rege_AdG_back|<span id="Alyatte_rege_AdG"><sup>5</sup></span>]] Le nom de ce roi est écrit avec un esprit rude dans Hérodote, ce qui a donné lieu à [[w:Louis_Poinsinet_de_Sivry|Poinsinet]] et à d’autres traducteurs de Pline de substituer le mot Halyatte à celui d’Alyatte.<br /><p style="text-align: justify; text-indent: 15px;">Alyatte ou Halyatte fut roi de la Lydie et père de Crésus. Il faisait la guerre à Cyaxare, roi des Mèdes, lorsque l’éclipse solaire en question interrompit le combat.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#In_sexcentos_annos_AdG_back|<span id="In_sexcentos_annos_AdG"><sup>6</sup></span>]] On lit dans [[w:Georges_le_Syncelle|le Syncelle]] (''Chronolog.'', pag. 17) que les Chaldéens ont connu une période de six cents années solaires. [[w:Flavius_Josèphe|Josèphe]] [[#Flavius_Josèphe_back|<sup>⤵️</sup>]] ([[w:Antiquités_judaïques|''Ant. jud.'']], I, page 17 et 18, édit. Havercamp) dit que Dieu donna une longue vie aux patriarches pour qu’ils pussent cultiver avec succès les sciences astronomiques et géométriques, ce qu’ils n’auraient pu faire s’ils n’avaient pas vécu au moins six cents ans ; car la grande année ne finit pas plus tôt. Ainsi, il est certain qu’avant Hipparque les Chaldéens et d’autres peuples asiatiques ont connu une période de six cents années solaires. Mais [[w:Jean-Dominique_Cassini|Cassini]] ([[w:Jean-Dominique_Cassini#Mémoires_de_l’Académie_royale_des_sciences|''Anciens mém. de l’Acad.'']], t. VIII, pag. 4 et 5) et [[w:Jean_Sylvain_Bailly|Bailly]] (''Hist. de l’astr. ancienne'', t. II, liv. 3, Eclairciss.) ont prouvé que tous les six cents ans les nouvelles et pleines lunes n’arrivent pas seulement au même jour et à la même heure qu’auparavant, mais encore à la même minute. Ne serait-il donc pas probable qu’Hipparque, comme le dit Ideler (''Historische untersuchungen uber die astronomischen beobachtungen der alten'', Berlin 1806, page 417) a connu cette période chaldéenne, et que delà résulte l’étendue de six cents ans donnée à son calendrier selon Pline.<br /><p style="text-align: justify; text-indent: 15px;">[[w:Abel_Burja|Abel-Burja]] de Leipzig a tâché d’expliquer d’une autre manière la durée du calendrier d’Hipparque (''Astronomisches Jahrbuch'', 1797, pag. 233 et 234). [[w:Claude_Ptolémée|Ptolémée]] et [[w:Censorin_(grammairien)|Censorin]] racontent qu’Hipparque est auteur d’une période soli-lunaire de trois cent quatre années solaires. En la prenant deux fois, on obtient une période de six cent huit ans. Celle-ci fut abrégée par Hipparque de huit ans, afin d’obtenir un nombre entier de siècles pour son calendrier. Ideler a fait une objection très-juste contre cette opinion de Burja ; c’est que la période de six cent huit ans n’a aucun avantage sur celle de trois cent quatre ans. On ne voit donc pas ce qui a pu engager Hipparque à préférer le nombre de six cents ans à celui de trois cents, lorsqu’il composait son calendrier.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Menses_gentium_etc_AdG_back|<span id="Menses_gentium_etc_AdG"><sup>7</sup></span>]] C’est-à-dire il écrivit des éphémérides dans lesquelles il avait calculé d’avance les néomenies et les pleines lunes. Il fit aussi entrer dans son calendrier les longueurs des jours et des heures variables, [[w:ὧραι|ὧραι]] καιρικαι, ainsi que les aspects du ciel, ''visus populorum'', tels qu’ils eurent lieu chez les habitans de différentes contrées de la terre. Il ajouta une table des longitudes et des latitudes des principaux pays et villes du globe. Ptolémée (''Géogr.'', I, ch. 4) en dit autant d’Hipparque.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Aevo_teste_AdG_back|<span id="Aevo_teste_AdG"><sup>8</sup></span>]] Les tables d’Hipparque étaient dressées pour six cents ans. Cet astronome florissait vers cent cinquante ans avant J.-C. Ainsi, du temps de Pline, on avait encore à jouir de ces tables pour quatre cents ans environ. POINSINET.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Numinum_AdG_back|<span id="Numinum_AdG"><sup>9</sup></span>]] Pline donne souvent l’épithète de divinités aux planètes, à la lune, au soleil, à la terre et aux étoiles fixes.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#In_defectibus_scelera_etc_AdG_back|<span id="In_defectibus_scelera_etc_AdG"><sup>10</sup></span>]] Nous transcrivons ici ce beau passage de l’Uranographie de M. [[w:Louis-Benjamin_Francœur|Francoeur]], qui mérite d’être mis en parallèle avec celui de Pline pour l’élégance du style et les pensées, et qui renferme le meilleur commentaire que nous puissions donner de tout ce que Pline dit des terreurs que les éclipses causaient autrefois aux hommes ignorans. « L’histoire, dit M. Francoeur (page 93), est pleine des exemples de l’effroi causé par les éclipses, et des dangers que produisent l’ignorance et la superstition. Nicias avait résolu de quitter la Sicile avec son armée ; effrayé par une éclipse de lune, et voulant temporiser plusieurs jours pour s’assurer si l’astre n’avait rien perdu après cet évènenement, il manqua ainsi l’occasion de sa retraite; son armée fut détruite ; Nicias périt, et ce malheur commença la ruine d’Athènes.<br /><p style="text-align: justify; text-indent: 15px;">« Souvent on a vu des hommes adroits tirer parti de la frayeur du peuple pour l’amener à remplir leurs desseins. Christophe Colomb, réduit à faire subsister ses soldats des dons volontaires d’une nation sauvage et indigente, était prêt à voir tarir cette ressource et à périr de faim ; il annonce qu’il va priver le monde de la lumière de la lune. L’éclipse commence et la terreur s’empare des Indiens, qui reviennent apporter aux pieds de Colomb les tributs accoutumés.<br /><p style="text-align: justify; text-indent: 15px;">« Drusus (TACITE , Annales, I, 28) apaisa une sédition dans son armée, en prédisant une éclipse de lune, et, selon Tite-Live, Sulpicius Gallus, dans la guerre de Paul-Emile contre Persée, usa du même stratagème. Periclès, [[w:Agathocle_de_Syracuse|Agathocles de Syracuse]], [[w:Dion_de_Syracuse|Dion]], roi de Sicile, ont failli être victimes de l’ignorance de leurs soldats. [[w:Alexandre_le_Grand|Alexandre]], près d’[[w:Bataille_de_Gaugamèles|Arbelles]], est réduit à user de toute son adresse pour calmer la terreur qu’une éclipse avait jetée parmi ses troupes. Les hommes supérieurs, plutôt que de plier sous les circonstances qui les maîtrisent, mettent leur art à les tourner à leur profit.<br /><p style="text-align: justify; text-indent: 15px;">« Combien de fables établies d’après l’opinion que les éclipses sont l’effet du courroux céleste qui se venge des iniquités de l’homme en le privant de la lumière! Tantôt [[w:Diane_(mythologie)|Diane]] va trouver [[w:Endymion|Endymion]] dans les montagnes de Carie; tantôt les magiciennes de Thessalie font descendre la lune sur les herbes qu’elles destinent aux enchantemens. »<br /><br /><p style="text-align: center;">''Carmina vel cælo possunt deducere lunam.''<br /><p style="text-align: right; text-indent: 15px;">Virg., ''Eclog.'' VIII.<br /><br /><p style="text-align: justify; text-indent: 15px;">« Ici c’est un dragon qui dévore l’astre, et qu’on cherche à épouvanter par des cris ; le dieu tient le soleil enfermé dans un tuyau, et nous ôte ou nous rend la vue de cet astre à l’aide d’un volet, etc. Les progrès des sciences ont fait connaître le ridicule de ces opinions et de ces craintes, depuis qu’on a vu qu’il était possible de calculer par les tables astronomiques, et de prévoir long-temps d’avance l’instant où la colère du ciel devait éclater.<br /><p style="text-align: justify; text-indent: 15px;">« Cependant, naguère encore, l’épouvante a causé les revers des armées de Louis XIV, près de Barcelone, lors de l’éclipse totale de l’an 1706 [[w:en:Solar_eclipse_of_May_12,_1706|(en)]], et la devise, ''nec pluribus impar'', a prêté aux allusions injurieuses ! »''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Pindari_AdG_back|<span id="Pindari_AdG"><sup>11</sup></span>]] Pindare était le plus fameux poète de la Grèce après Homère. Il vint au monde l’an 134 avant l’ère chrétienne. POINSINET.<br /><p style="text-align: justify; text-indent: 15px;">Plutarque (''De la face de la lune'', pag. 931) dit aussi que Stésichore et Pindare craignaient beaucoup les éclipses. Le dernier poète a peint les terreurs que lui causaient ces phénomènes dans son poëme sur le soleil. HARDOUIN et DALECHAMP.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Crepitu_dissono_AdG_back|<span id="Crepitu_dissono_AdG"><sup>12</sup></span>]] Cet usage superstitieux dont Plutarque parle au long dans sa vie de Paul-Émile, a fourni un vers fort plaisant à Juvénal, lorsqu’après avoir épuisé toute sorte d’exagération pour représenter le bruit qu’une femme fait en criant, il finit par dire :<br /><br /><p style="text-align: center;">''Una laboranti poterit succurrere lunæ.''<br /><br /><p style="text-align: justify; text-indent: 15px;">« Elle seule, au besoin, décharmerait la lune. » POINSINET.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Nicias_AdG_back|<span id="Nicias_AdG"><sup>13</sup></span>]] Le même fait est raconté par Plutarque dans la vie de Nicias, par Quintilien, I, 10, et par d’autres écrivains anciens. HARDOUIN.''' </td> </tr> </table><br/><br/></div>{{Boîte déroulante fin}} <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k5773334c/f10.item <u>Histoire Naturelle de Pline. Tome Second</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k5773334c/f14.item ''Livre II.''], [https://gallica.bnf.fr/ark:/12148/bpt6k5773334c/f46.item ''chap. IX.''], traduction nouvelle par M. [[w:Stéphane_Ajasson_de_Grandsagne|Ajasson de Grandsagne]] [https://gallica.bnf.fr/ark:/12148/bpt6k5773334c/f311.item <sup>NOTES</sup>], C. L. F. Panckoucke, Paris, 1829</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: center; margin: 0 2em;">''Des inventions a[[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki />tronomiques, & de leurs Auteurs.''<br /><p style="text-align: justify; text-indent: 15px;">'''L'''E PREMIER d’entre les ''Romains'' qui rendit publique la théorie des éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oleil & de lune, fut '''Sulpicius Gallus''' [[#Sulpicius_Gallus_LPdS|<span id="Sulpicius_Gallus_LPdS_back"><sup>'''1'''</sup></span>]], celui que '''Marcus Marcellus''' eut pour Collegue au Con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ulat : mais il n’étoit que Tribun Militaire [[#Tribun_Militaire_LPdS|<span id="Tribun_Militaire_LPdS_back"><sup>'''2'''</sup></span>]], lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’il di{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ipa l’allarme qu’auroient pu prendre nos troupes la veille de la victoire remportée {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur '''Per{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ée''' par '''Paul Emile''' ; car ce Général l’ayant produit devant les {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oldats a{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}emblés, il leur prédit une éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e qui devoit arriver [[#éclipse_LPdS|<span id="éclipse_LPdS_back"><sup>'''3'''</sup></span>]] ; il compo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}a même en{{Info|ſ|forme ancienne longue de la lettre s minuscule}}uite un Ouvrage {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur ce {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ujet. Parmi les ''Grecs'', '''Thalès''' de ''Milet'' prédit l’an quatrieme de la quarante-huitieme olympiade l’éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oleil qui arriva {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous le regne de '''Halyattes''' [[#Halyattes_LPdS|<span id="Halyattes_LPdS_back"><sup>'''4'''</sup></span>]], l’an cent {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oixante de la fondation de [[#cent_soixante_LPdS|<span id="cent_soixante_LPdS_back"><sup>'''5'''</sup></span>]] ''Rome''. Après eux, Hipparque [[#Hipparque_LPdS|<span id="Hipparque_LPdS_back"><sup>'''6'''</sup></span>]] dre{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}a des Tables en vers [[#En_vers_LPdS|<span id="En_vers_LPdS_back"><sup>'''7'''</sup></span>]] du cours de ces deux aftres pour fix cents ans. Dans ces Tables , de l’exactitude deſquelles notre âge rend encore témoignage [[#témoignage_LPdS|<span id="témoignage_LPdS_back"><sup>'''8'''</sup></span>]], il embra{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}e les éphémérides propres à chaque nation [[#chaque_nation_LPdS|<span id="chaque_nation_LPdS_back"><sup>'''9'''</sup></span>]], les jours, les heures, le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ite re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pectif de chaque lieu, & les divers a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pects du ciel relativement aux divers peuples, comme {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i la Nature l’eût admis à {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}eil intime. Per{{Info|ſ|forme ancienne longue de la lettre s minuscule}}onnages vraiment grands! génies plus qu’humains, d’avoir ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i {{Info|ſ|forme ancienne longue de la lettre s minuscule}}urpris les loix qui font mouvoir ces va{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tes pui{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ances du ciel ; & d’avoir guéri de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}es allarmes l’imagination malade des hommes, qui ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’alors, ou avoient toujours vu dans les éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es l’annonce effrayante de quelque grand crime & de quelque mort (terreur dont Sté{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ikhore [[#Stésikhore_LPdS|<span id="Stésikhore_LPdS_back"><sup>'''10'''</sup></span>]] & Pindare [[#Pindare_LPdS|<span id="Pindare_LPdS_back"><sup>'''11'''</sup></span>]], ces Poètes {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ublimes, ne furent point exempts à l’égard des éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es {{Info|ſ|forme ancienne longue de la lettre s minuscule}}olaires), ou attribuoient les ténebres dont {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e couvre la lune à des maléfices opérés par le mêlange de certaines herbes magiques ; & croyoient devoir la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ecourir par un bruit di{{Info|ſ|forme ancienne longue de la lettre s minuscule}}cordant [[#bruit_discordant_LPdS|<span id="bruit_discordant_LPdS_back"><sup>'''12'''</sup></span>]]. Cette même terreur fut cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e que le Général Nicias [[#Nicias_LPdS|<span id="Nicias_LPdS_back"><sup>'''13'''</sup></span>]], peu au fait des cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es phy{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iques, & n’o{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ant pas, par {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uper{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tition, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ortir {{Info|ſ|forme ancienne longue de la lettre s minuscule}}a flotte du Port, mit Athenes à deux doigts de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}a perte. Honneur [[#Honneur_LPdS|<span id="Honneur_LPdS_back"><sup>'''14'''</sup></span>]] à vous, Interpretes du Ciel ! E{{Info|ſ|forme ancienne longue de la lettre s minuscule}}prits [[#Esprits_LPdS|<span id="Esprits_LPdS_back"><sup>'''15'''</sup></span>]] dont l’étendue {{Info|ſ|forme ancienne longue de la lettre s minuscule}}urpa{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}e celle de la Nature ; Inventeurs d’une méthode qui a{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ujettit les dieux comme les hommes, à une même de{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tinée ! Eh! qui pourroit, en voyant les a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tres même ''en cri{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e'' (pour me {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervir de l’expre{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ion commune), ne pas {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oumettre à la néce{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ité où {{Info|ſ|forme ancienne longue de la lettre s minuscule}}a condition mortelle l’enchaîne.<br /><p style="text-align: justify; text-indent: 15px;">Pré{{Info|ſ|forme ancienne longue de la lettre s minuscule}}entement je vais toucher par articles fort courts & fort précis les points {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur le{{Info|ſ|forme ancienne longue de la lettre s minuscule}}quels on s’accorde le plus. Je ré{{Info|ſ|forme ancienne longue de la lettre s minuscule}}oudrai, chemin fai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ant, quelques que{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tions, lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que le cas l’exigera, mais toujours d’une maniere très {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ommaire ; car une analy{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e en forme d’arguments {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivis excéderoit le but de cet Ouvrage : & puis, je pen{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e qu’il n’y a pas moins de mérite à rendre une rai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}on plau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ible de toutes cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es, qu’à rendre une rai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}on bien {{Info|ſ|forme ancienne longue de la lettre s minuscule}}olide de deux ou trois cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement.</div> {{Boîte déroulante début|titre=Notes du traducteur|alignT=center}} <div style="text-align: justify; border: 2px; border-radius:15px; font-size:85%;"><br/> <table cellspacing=15 align=center style="margin: 0 4em;"> <tr> <td style="text-align: justify; margin: 0 4em; text-indent: 15px">'''[[#Sulpicius_Gallus_LPdS_back|<span id="Sulpicius_Gallus_LPdS"><sup>1</sup></span>]] Son premier prénom étoit Caïus. Voyez à {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ujet Tite-Live, l. 44. Valere maxime, l. 8. Quintilien, l. I. ch. 10. Plutarque, vie de Paul-Emile, &c.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Tribun_Militaire_LPdS_back|<span id="Tribun_Militaire_LPdS"><sup>2</sup></span>]] Ce grade répond à celui de Major-général des Troupes.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#éclipse_LPdS_back|<span id="éclipse_LPdS"><sup>3</sup></span>]] Cette éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon Tite-Live, fut annoncée aux {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oldats pour la nuit {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivante. Sulpicius Gallus leur prédit que la lune s’éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit entre la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}econde heure de la nuit & la quatrieme. Plutarque ajoute qu’on étoit alors à l’i{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ue de l’été (''{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ub exitum a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tatis''). [[w:Paulin_II_d'Aquilée|Paul d’Aquilée]] écrit que cette éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e arriva aux nones de Septembre (''nonas Septembris''), c’est-à-dire au 4 Septembre : c’étoit l’an 168 avant J.C. {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon le calcul d’[[w:James_Ussher|U{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}erius]].''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Halyattes_LPdS_back|<span id="Halyattes_LPdS"><sup>4</sup></span>]] Il paroît que Ciceron & Eu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ebe {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e trompent lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’ils placent cet événement {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous ''A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tiages'' : [[w:Hermolaos_(Macédoine)|Hermolaüs]] s’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t trompé d’après eux, en {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ub{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tituant ''A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tiages'' à ''Halyattes'' dans le texte de Pline, contre la foi des manu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}crits, & contre le témoignage d’Herodote qui place cet événement dans une guerre entre Halyattes, Roi de Sardes, & Cyaxare, Roi des Medes, pere d’A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tiages.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#cent_soixante_LPdS_back|<span id="cent_soixante_LPdS"><sup>5</sup></span>]] Les deux manu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}crits royaux portent ''anno CLX'' : c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t la leçon qu’il faut {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivre. En effet, Rome, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon Varron, fut fondée l’an 2 de la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ixieme olympiade, c’est-à-dire, dans l’année olympiadique 22. Mais comme chaque olympiade, depuis leur premiere in{{Info|ſ|forme ancienne longue de la lettre s minuscule}}titution, commençoit après le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ol{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tice d’été, & comme l’année Romaine avoit toujours commencé au plus tard en Mars {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous Romulus, & depuis en Janvier {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous Numa, il s’en{{Info|ſ|forme ancienne longue de la lettre s minuscule}}uit que la premiere année de Rome, qui répondoit à l’année olympiadique 22, répondoit en même-tems, de quatre mois au moins, à l’année olympíadique 23. Selon ce calcul, la quatrieme année de la quarante-huitieme olympiade, répond en partie à l’an 160, & en partie à l’an 161 de la fondation de Rome, pui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que 48 olympiades font cent quatre-vingt-douze années, de{{Info|ſ|forme ancienne longue de la lettre s minuscule}}quelles {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i vous ôtez 22 ans écoulés, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon Varron, entre la premiere olympiade & la fondation de Rome, il re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tera 160 ans, & 161 ans {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i l’on a égard à l’enjambement réciproque des années olympiadiques {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur les années Romaines, & des années Romaines {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur les années olympiadiques. Il e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t donc évident que le calcul de Pline (''anno CLX'') e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te, en admettant l’hypothe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e chronologique de Varron, à laquelle on voit bien que notre Auteur s’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t conformé en cette occa{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ion particuliere encore qu’en plu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ieurs autres rencontres il paroi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}e affecter de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivre le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}y{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tême de Caton : vici{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}itude pardonnable dans un ouvrage de compilation où Pline a dû, comme malgré lui, adopter tantôt le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}tyle d’un Auteur, tantôt celui d’un autre, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ource où il pui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}oit pour l’heure. Si Pline eût {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivi l’hypothe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e de Caton qui place la fondation de Rome deux ans plus tard que Varron, il eût fait tomber le rapport {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur l’année 157 ou 158 de la fondation de Rome. C’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t le parti que prend le Pere Hardouin, & c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t de là qu’il part pour propo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}er une correction dans le texte. Mais encore une fois, c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t commettre {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oi-même une faute que d’en trouver une chez Pline en cette occa{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ion ; pui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que cet Auteur a été en droit de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervir du {{Info|ſ|forme ancienne longue de la lettre s minuscule}}y{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tème Varronien, ou ce qui revient au même, de con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}erver la date Varronienne dont s’étoit {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervi l’Auteur de qui il emprunte le fait hi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}torique en que{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tion.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Hipparque_LPdS_back|<span id="Hipparque_LPdS"><sup>6</sup></span>]] Voyez les notes {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur le premier livre au mot ''Hipparque'' : HIPPARCHUS (de Nicée, en Bithinie comme l’ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}erve [[w:Souda|Suidas]]), flori{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}oit dans la quatre-vingt-quatorzieme olympiade. Nous avons {{Info|ſ|forme ancienne longue de la lettre s minuscule}}es trois livres d’Enarrations {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur les Phénomenes d’[[w:Aratos_de_Soles|Aratus]] & d’[[w:Eudoxe_de_Cnide|Eudoxe]], traduits par le [[w:Paul_Petau|P. Petau]]. Il avoit compo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}é un autre livre ''De {{Info|ſ|forme ancienne longue de la lettre s minuscule}}tellarum inerrantium Con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}titutione'', {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon Suidas. Son livre du mois lunaire e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t cité par [[w:Claude_Galien|Galien]].''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#En_vers_LPdS_back|<span id="En_vers_LPdS"><sup>7</sup></span>]] ''En Vers.'' Je préfume que c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t-là le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ens de ''præcinere'', qui ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ignifie pas {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement prédire, mais prédire en chant, c’est-à-dire en Vers. Sur ce pied-là, ce {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit d’un Poëme dans le genre de celui d’[[w:Aratos_de_Soles|Aratus]], dont il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit ici que{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tion. Si par hazard Pline n’a point prétendu parler d’un Poëme, au-moins s’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t-il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervi d’une expre{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ion propre à dé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}igner ce genre d’écrire. Pour décider la que{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tion, il faudroit avoir tous les ouvrages d’Hipparque, & {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur-tout celui-ci.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#témoignage_LPdS_back|<span id="témoignage_LPdS"><sup>8</sup></span>]] Ces tables étoient dre{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ées pour {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ix cents ans. Or Hipparque flori{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}oit 150 ans avant J.C. Ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i du tems de Pline, on avoit encore à jouir de ces tables pour quatre cents ans ou environ.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#chaque_nation_LPdS_back|<span id="chaque_nation_LPdS"><sup>9</sup></span>]] La lune ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e levant pas & ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e couchant pas à la même heure pour toutes les nations, les diver{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es époques & pha{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es qu’elle forme n’appartiennent pas non plus au même point de tems pour tous les peuples, pui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que les uns ont la nuit quand les autres ont le jour; & que même lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que la lune s’éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e, la partie de l’heure où ce phénomene e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t {{Info|ſ|forme ancienne longue de la lettre s minuscule}}en{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ible, n’a pas la même évaluation pour tous les climats qui l’apperçoivent. Hipparque avoit donc eu égard à cette différence d’époques, relativement aux diver{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es longitudes, &par-con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}équent aux diver{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es nations, tellement que les tables de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}es éphémérides étoient accommodées à l’u{{Info|ſ|forme ancienne longue de la lettre s minuscule}}age de tous les peuples : ouvrage dont on ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}auroit trop regretter la perte, & qui jetteroit le plus grand jour {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur l’ancienne géographie.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Stésikhore_LPdS_back|<span id="Stésikhore_LPdS"><sup>10</sup></span>]] Ste{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ikhore, l’un des plus fameux Poètes de la Grece, dont, par malheur, nous avons perdu tous les ouvrages, à l’exception d’une vingtaine de lignes décou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ues. Il vivoit dans la quarante-deuxieme olympiade, c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t-à-dire, vers l’an {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ix cents dix avant J.C.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Pindare_LPdS_back|<span id="Pindare_LPdS"><sup>11</sup></span>]] Pindare, le plus fameux Poète de la Grece après Homere. Il vint au monde l’an 134 avant l’ere chrétienne.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#bruit_discordant_LPdS_back|<span id="bruit_discordant_LPdS"><sup>12</sup></span>]] Cet u{{Info|ſ|forme ancienne longue de la lettre s minuscule}}age {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uper{{Info|ſ|forme ancienne longue de la lettre s minuscule}}titieux a fourni un Vers fort plai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ant à Juvenal, lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’après avoir épui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}é toute {{Info|ſ|forme ancienne longue de la lettre s minuscule}}orte d’exagération pour repré{{Info|ſ|forme ancienne longue de la lettre s minuscule}}enter le bruit qu’une femme fait en criant, il finit par dire :<br /><p style="text-align: justify; text-indent: 15px;">''Una laboranti poterit {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uccurrere luna.''<br /><p style="text-align: justify; text-indent: 15px;">Elle {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eule au be{{Info|ſ|forme ancienne longue de la lettre s minuscule}}oin décharmeroit la lune.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Nicias_LPdS_back|<span id="Nicias_LPdS"><sup>13</sup></span>]] C’étoit un Général Athénien, qui fut malheureux dans pre{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que toutes {{Info|ſ|forme ancienne longue de la lettre s minuscule}}es expéditions. Les Athéniens finirent par le condamner à mort. Il étoit contemporain d’[[w:Alcibiade|Alcibiade]] & de [[w:Lamachos|Lamachus]], & leur collegue dans le commandement. Voyez {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur le fait dont parle ici Pline, Quintilien, l. I. ch. 10, & Plutarque à l’article Nicias.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Honneur_LPdS_back|<span id="Honneur_LPdS"><sup>14</sup></span>]] Au lieu de ''macte ingenio'', le Pere Hardouin lit ''macti'' ; mais {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon les meilleurs Latini{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tes ''macte'' e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t indéclinable, ou pour mieux dire, c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t un adverbe qui répond au ''bravò'' des Italiens. Fe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tus prétend que ''macte'' e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t un compo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}é de ''magis auctus''.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Esprits_LPdS_back|<span id="Esprits_LPdS"><sup>15</sup></span>]] Cette apo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}trophe de Pline aux A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tronomes rappelle ces beaux Vers d'Ovide {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur le même {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ujet :<br />Felices animos quibus hæc cogno{{Info|ſ|forme ancienne longue de la lettre s minuscule}}cere primise<br /><p style="text-align: justify; text-indent: 15px;">Inque Domos {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uperas {{Info|ſ|forme ancienne longue de la lettre s minuscule}}candere cura fuit!<br />Credibile e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t illos pariter vitli{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que joci{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que<br /><p style="text-align: justify; text-indent: 15px;">Altius humanis ex{{Info|ſ|forme ancienne longue de la lettre s minuscule}}eruifle caput,<br />Non Venus aut Vinum {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ublimia pectora fregit<br /><p style="text-align: justify; text-indent: 15px;">Officiumve {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ori, militiæve labor :<br />Nec levis ambitio, perfu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}aque gloria fuco,<br /><p style="text-align: justify; text-indent: 15px;">Magnarumve fames {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ollicitavit opum.<br />Admovere oculis di{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tantia {{Info|ſ|forme ancienne longue de la lettre s minuscule}}idera no{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tris,<br /><p style="text-align: justify; text-indent: 15px;">Ætheraque ingenio {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uppo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}uere {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uo.<br />Sic petitur cœlum: non ut ferat O{{Info|ſ|forme ancienne longue de la lettre s minuscule}}lan Olympus<br /><p style="text-align: justify; text-indent: 15px;">Summaque Peliacus {{Info|ſ|forme ancienne longue de la lettre s minuscule}}idera tangat apex, &c.<br /><p style="text-align: right; text-indent: 15px;">Ovid. {{Info|ſ|forme ancienne longue de la lettre s minuscule}}a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t. l. I.''' </td> </tr> </table><br/><br/></div> {{Boîte déroulante fin}} <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=UnhluychtF8C&newbks=1&newbks_redir=0&dq=Histoire%20naturelle%20Pline&hl=fr&pg=PP7#v=onepage&q&f=true <u>Histoire Naturelle de Pline. Tome Premier</u>], [https://books.google.fr/books?id=UnhluychtF8C&newbks=1&newbks_redir=0&dq=Histoire%20naturelle%20Pline&hl=fr&pg=RA1-PA3#v=onepage&q&f=true ''Livre Second.''], [https://books.google.fr/books?id=UnhluychtF8C&newbks=1&newbks_redir=0&dq=Histoire%20naturelle%20Pline&hl=fr&pg=RA1-PA59#v=onepage&q&f=true ''Des inventions astronomiques, & de leurs Auteurs.''], traduction en françois, avec le texte latin rétabli d’après les meilleures leçons manu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}crites ; accompagnée de Notes critiques pour l’éclairci{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ement du texte, & d’Ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervations {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur les connoi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ances des Anciens comparées avec les découvertes des Modernes, par M. [[w:Louis_Poinsinet_de_Sivry|Louis Poinsinet de Sivry]], Chez la veuve Desaint, Paris, 1771</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div> </div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ==== Livre XVIII ==== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Enquête sur l’agriculture</div> ===== <div style="text-align: center;">Chapitre LVII.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage d’une théorie astronomique de '''Thalès''', du [[w:Lever_héliaque|''coucher matinal'']] des [[w:Pléiades_(astronomie)|''Pléiades'']] 25 jours après l’[[w:Équinoxe_de_septembre|''équinoxe d’automne'']].</div> :'''Texte latin''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''LVII.''' Primum omnium dierum ipsorum anni solisque motus prope inexplicabilis ratio est. Ad CCCLXV adjiciunt etiamnum intercalarios diei noctisque quadrantes. Ita fit, ut tradi non possint certa siderum tempora. Accedit confessa rerum obscuritas, nunc præcurrenle, nec paucis diebus, tempestatum significatu, quod προϰειμασιν Græci vocant : nunc postveniente, quod ἐπιϰεἰμασιν : et plerumque alias citius, alias tardius cæli effectu ad terram deciduo : vulgo serenitate reddita, confectum sidus audimus. Præterea quum omnia hæc statis sideribus cæloque affixis constent, interveniunt motu stellarum grandines, imbres, et ipsi non levi effectu, ut docuimus, turbantque conceptæ spei ordinem. ldque ne nobis tantum putemus accidere, et reliqua fallit animalia sagaciora circa hoc, ut quo vita eorum constet : æstivasque alites præposteri aut præproperi rigores necant, hibernas æstus. Ideo '''Virgilius''' errantium quoque siderum rationem ediscendam præcipit, admonens observandum frigidæ Saturni stellæ transitum. Sunt qui certissimum veris indicium arbitrentur ob infirmitatem animalis, papilionis proventum. Id eo ipso anno, quum commentaremur hæc, notatum est, proventum eorum ter repetito frigore exstinctum, advenasque volucres a. d. VI kalendas februarii spem veris attulisse, mox sævissima hieme conflictatas. Res anceps : primum omnium a cælo peti legem : deinde eam argumentis esse quærendam. Super omnia est mundi convexitas, terrarumque globi differentia, eodem sidere alio tempore aliis aperiente se gentibus : quo fit ut causa ejus non lisdem diebus ubique valeat. Addidere difficultatem et auclores diversis in locis observando, mox etiam in iisdem diversa prodendo. Très autem fuere sectæ : ''Chaldæa'', ''Ægyptia'', ''Græca''. His addidit apud nos quartam Cæsar dictator, annos ad solis cursum redigens singulos, '''Sosigene''' perito scientiæ ejus adhibito. Et ea ipsa ratio postea comperto errore correcta est : ita ut XII annis continuis non intercalaretur, quia cœperat sidera annus morari, qui prius antecedebat. Et '''Sosigenes''' ipse trinis commentationibus, quanquam diligentior cæteris, non cessavit tamen addubitare, ipse semet corrigendo. Auctores prodidere ea, quos prætexuimus volumini huic, raro ullius sententia cum alio congruente. Minus hoc in reliquis mirum, quos diversi excusaverint tractus. Eorum qui in eadem regione dissedere, unam discordiam ponemus exempli gratia : occasum matutinum Vergiliarum '''Hesiodus''' (nam hujus quoque nomine exstat Astrologia) tradidit fieri, quum æquinoctium autumni conficeretur, '''Thales''' vigesimo quinto die ab æquinoctio, '''Anaximander''' vigesimo nono, '''Euctemon''' XLVIII. Nos sequemur observationem Cæsaris : maximeque hæc erit ''Italiæ'' ratio. Dicemus tamen et aliorum placita : quoniam non unius terræ, sed totius naturæ interpretes sumus, non auctoribus positis (id enim verbosum est), sed regionibus : legentes tantum meminerint, brevitatis gratia, quum ''Altica'' nominata fuerit, simul intelligere ''Cycladas'' insulas ; quum ''Macedonia'', ''Magnesiam'', ''Thraciam'' ; quum ''Ægyptus'', ''Phœnicen'', ''Cyprum'', ''Ciliciam'' ; quum ''Bœotia'', ''Locridem'', ''Phocidem'', et finitimos semper tractus ; quum ''Hellespontus'', ''Cherronesum'', et continentia usque ''Atho'' montem ; quum ''Ionia'', ''Asiam'', et insulas ''Asiæ'' ; quum ''Peloponnesus'', ''Achaiam'', et ad ''Hesperum'' jacentes terras. ''Chaldæi Assyriam'' et ''Babyloniam'' demonstrabunt. ''Africam'', ''Hispanias'', ''Gallias'' sileri non erit mirum. Nemo enim observavit in iis, qui siderum proderet exortus. Non tamen difficili ratione dignoscentur in illis quoque terris digestione circulorum, quam in sexto volumine fecimus : qua cognatio cæli, non gentium modo, verum urbium quoque singularum intelligitur, nota ex his terris, quas nominavimus, sumta convexitate circuli, pertinentis ad quas quisque quæret terras, et ad earum siderum exortus, per omnium circulorum pares umbras. Indicandum et illud, tempestates ipsas ardores suos habere quadrinis annis : et easdem non magna differentia reverti ratione solis : octonis vero augeri easdem, centesima revolvente se luna.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/b24875958_0001/page/n7/mode/2up <u>Histoire Naturelle de Pline.</u>], [https://archive.org/details/b24875958_0001/page/652/mode/2up ''Livre XVIII.''], [https://archive.org/details/b24875958_0001/page/684/mode/2up ''Chap. LVII.''], texte corrigé par [[w:Émile_Littré|M. É. Littré]], à partir de celui de [[w:Jean_Hardouin|Hardouin]], Librairie de Firmin-Didot et C<sup>ie</sup>, Paris, 1883<br />(également disponible une édition de 1831 [https://gallica.bnf.fr/ark:/12148/bpt6k5804072n/f339.item ici] et de 1848 [[s:Page:Pline_l'ancien_-_Histoire_naturelle,_Littré,_T1_-_1848.djvu/708|là]])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''LVII.''' Avant tout, le calcul des jours même de l’année et du mouvement solaire est d’une difficulté presque insurmontable. Aux trois cent soixante-cinq jours on ajoute des jours intercalaires, produits de quarts de jour et de nuit ; de là vient qu’on ne peut indiquer des époques fixes pour les astres. Ajoutez une obscurité des choses avouée de tous : tantôt en effet la mauvaise saison, s’annonçant, anticipe même de plusieurs jours, ce que les Grecs appellent προϰεἰμασις (avant-hiver), et la belle saison retarde, ce qui est nommé ἐπιϰεἰμασις (arriere-hiver) : l’effet du ciel tombe sur la terre tantôt plus vite, tantôt plus tardivement ; et d’ordinaire c’est quand la sérénité est rétablie que nous entendons dire que l’action de l’astre est accomplie. En outre, car tous ces phénomènes dépendent d’astres réglés et fixés au ciel, le mouvement des étoiles amène intercurremment des grêles, des pluies qui ne sont pas non plus d’une faible action, comme nous l’avons enseigné (XVII, 2), et qui troublent l’ordre espéré. Et ne pensons pas que ces méprises n’arrivent qu’à nous; les autres animaux s’y trompent, bien que plus sagaces que nous sur ce point, vu que leur vie en dépend : l’on voit les oiseaux d’été tués par des froids hâtifs ou tardifs, et les oiseaux d’hiver par des chaleurs hâtives ou tardives. Aussi [[w:Virgile|'''Virgile''']] [[#Virgile|<span id="Virgile_back"><sup>'''I'''</sup></span>]] ([[w:Géorgiques|''Georg.'']], I, 335) recommande-t-il d’étudier encore le cours des astres errants, avertissant d’observer le passage de Saturne, planète froide. Il en est qui regardent comme l’indice le plus sûr du printemps l’apparition des papillons, à cause de la délicatesse de cet insecte. Or, l’année même où nous écrivions ceci (an 830 de ''Rome''), il a été noté que les papillons, ayant éclos, furent détruits à trois reprises par le froid, et que les oiseaux étrangers, ayant apporté l’espérance du printemps avant le 6 des calendes de février (27 janvier), eurent bientôt après à essuyer un hiver très-rigoureux. La double difficulté est d’abord d’avoir à demander au ciel la règle de toute chose, puis d’être obligé de contrôler cette règle par des faits apparents. Avant tout signalons la convexité du monde et les différences du globe terrestre, qui font que le même astre se montre à des temps divers suivant les nations, de sorte que l’influence ne s’en fait pas sentir partout aux mêmes jours. La difficulté a été encore accrue par les auteurs qui ont observé en des lieux différents, ou même qui, ayant observé dans les mêmes lieux, ont publié des résultats divergents. Il y a eu trois écoles, la ''Chaldéenne'', l’Égyptienne, la ''Grecque''. Une quatrième a été formée chez nous par le dictateur [[w:Jules_César|'''César''']], qui ramena l’année à la révolution solaire avec l’aide de [[w:Sosigène_d'Alexandrie|'''Sosigène''']] [[#Sosigène|<span id="Sosigène_back"><sup>'''II'''</sup></span>]], astronome habile. Et ce calcul même, où l’on découvrit une erreur, a été corrigé : pendant douze années consécutives on ne fit pas d’intercalation, attendu que l’année, qui auparavant anticipait, maintenant retardait sur les astres. '''Sosigène''' lui-même, quoique plus exact que les autres, n’a pas cessé, dans trois mémoires, de témoigner de ses doutes en se corrigeant lui-même. Les auteurs que nous avons indiqués au commencement de ce livre [[#auteurs_JH|<span id="auteurs_JH_back"><sup>'''1'''</sup></span>]] ont révélé ces discordances, l’avis de l’un s’accordant rarement avec l’avis de l’autre. Cela est moins étonnant dans ceux qui s’excuseront par la différence des lieux. Parmi ceux qui dans le même pays sont en désaccord, nous choisirons un exemple de dissidence : [[w:Hésiode|'''Hésiode''']] [[#Hésiode|<span id="Hésiode_back"><sup>'''III'''</sup></span>]] (car nous avons aussi sous son nom un livre sur les astres) a rapporté que le [[w:Lever_héliaque|''coucher matinal'']] des [[w:Pléiades_(astronomie)|''Pléiades'']] se faisait au moment de l’[[w:Équinoxe_de_septembre|''équinoxe d’automne'']] ; '''Thalès''', qu’il se faisait vingt-cinq jours après cet équinoxe; [[w:Anaximandre|'''Anaximandre''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Anaximandre_back|<sup>🔄</sup>]], vingt-neuf; [[w:Euctémon|'''Euctémon''']] [[#Euctémon|<span id="Euctémon_back"><sup>'''IV'''</sup></span>]], quarante-huit. Quant à nous, nous suivrons les calculs de '''César''' : ils se rapportent spécialement à l’Italie. Toutefois, nous relaterons aussi les opinions des autres ; car nous sommes les interprètes, non d’un seul pays, mais de la nature entière. Nous nommerons, non pas les auteurs, ce qui serait trop long, mais les pays. Les lecteurs auront seulement à se souvenir que, pour abréger, sous le nom d’[[w:Attique|''Attique'']] nous entendons aussi les [[w:Cyclades|''Cyclades'']]; sous celui de [[w:Macédoine_(province_romaine)|''Macédoine'']], la [[w:Magnésie_antique|''Magnésie'']] et la [[w:Thrace_(province_romaine)|''Thrace'']]; sous celui d’[[w:Égypte_romaine_et_byzantine|''Égypte'']], la [[w:Syrie-Phénicie_(province_romaine)|''Phénicie'']], [[w:Chypre_(province_romaine)|''Chypre'']] et la [[w:Cilicie|''Cilicie'']]; sous celui de [[w:Béotie#Antiquité|''Béotie'']], la [[w:Locride_(Grèce)|''Locride'']], la [[w:Phocide#Antiquité_et_période_byzantine|''Phocide'']] et les contrées limitrophes ; sous celui d’[[w:Hellespontique|''Hellespont'']], la [[w:Chersonèse_(cité_grecque)|''Chersonèse'']] et le continent jusqu’au [[w:Mont_Athos|''mont Athos'']]; sous celui d’[[w:Ionie|''Ionie'']], l’Asie et les îles ''Asiatiques'' ; sous celui de [[w:Péloponnèse#Antiquité|''Péloponnèse'']], l’[[w:Achaïe|''Achaïe'']] et les terres situées à l’occident; la [[w:Chaldée|''Chaldée'']] indiquera la [[w:Histoire_de_la_Syrie#Antiquité|''Syrie'']] et la [[w:Babylone_(civilisation)|''Babylonie'']]. On ne s’étonnera pas que je passe sous silence l’[[w:Afrique_romaine|''Afrique'']], l’[[w:Hispanie_romaine|''Espagne'']] et les [[w:Gaule|''Gaules'']], car personne dans ces contrées n’a laissé d’observations sur le lever des astres. Toutefois, il ne sera pas difficile de le calculer, même dans ces contrées, en étudiant la disposition des cercles que nous avons présentés dans le sixième livre (VI, 39). Grâce à cette étude, on connaît les relations astronomiques nou-seulement des nations, mais encore des villes en particulier : étant donnés les cercles déterminés par l’égalité des ombres, on choisit, dans les terres que nous avons nommées, le cercle qui a rapport à la localité objet du problème, et qui détermine en même temps le lever des astres pour cette localité. Il faut encore remarquer (II, 48) que tous les quatre ans les saisons ont leurs excès, et qu’elles reviennent les mêmes sans grande différence, en raison du soleil ; mais que tous les huit ans elles ont un redoublement, à la révolution de la centième lune.</div> <table cellspacing=15 align=center style="margin: 0 4em; font-size:85%;"> <tr> <td style="text-align: justify; margin: 0 4em;">'''[[#auteurs_JH_back|<span id="auteurs_JH"><sup>1</sup></span>]] Ce passage porte à croire que les auteurs dont Pline s’était servi pour composer chacun des livres de son ouvrage avaient été placés en tête du livre auquel ils se rapportaient. Les éditions mettent cette liste d’auteurs à la suite de la table de chaque livre, dans la table générale dressée par Pline lui-même.'''</td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/b24875958_0001/page/n7/mode/2up <u>Histoire Naturelle de Pline.</u>], [https://archive.org/details/b24875958_0001/page/652/mode/2up ''Livre XVIII.''], [https://archive.org/details/b24875958_0001/page/684/mode/2up ''Chap. LVII.''], texte corrigé par [[w:Émile_Littré|M. É. Littré]], à partir de celui de [[w:Jean_Hardouin|Hardouin]] [https://archive.org/details/b24875958_0001/page/708/mode/2up <sup>NOTES</sup>], Librairie de Firmin-Didot et C<sup>ie</sup>, Paris, 1883<br />(également disponible une édition 1848 [[s:Page:Pline_l'ancien_-_Histoire_naturelle,_Littré,_T1_-_1848.djvu/708|ici]])</div> {{Boîte déroulante début|titre=NdA de trad. Jean Hardouin 1883|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Virgile_back|<span id="Virgile"><sup>I</sup></span>]] [[w:Nom_romain|Tria Nomina]] en latin {{Info|Publius|praenomen, nom individuel du citoyen romain}} {{Info|Vergilius|nomen, nom de famille}} {{Info|Maro|cognomen, surnom héréditaire, servant à distinguer les diverses branches d’une même gens}};<br /><p style="margin: 0 2em; text-indent: 15px">Poète latin renommé dans les styles [[w:Épopée|''épique'']] (l’[[w:Énéide|''Énéide'']]), [[w:Poésie_pastorale|''pastorale'']] (les [[w:Bucoliques|''Bucoliques'']]) et [[w:Poésie_didactique|''didactique'']] (les [[w:Géorgiques|''Géorgiques'']]).<br /><p style="text-align: right; margin: 0 2em;">(15 octobre [[w:Années_70_av._J.-C.|-70]], [[w:Virgilio_(Lombardie)#Histoire|''Andes'']], au sud-est de l’actuelle [[w:Lombardie#Histoire|''Lombardie'']], au nord de l’Italie — 21 septembre [[w:Années_19_av._J.-C.|-19]], [[w:Brindisi#Histoire|''Brundisium'']], au sud-est des actuelles [[w:Pouilles#Domination_romaine|''Pouilles'']], au sud-est de l’Italie)<sup>[[w:Ier_siècle_av._J.-C.|⏳]]</sup> <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Sosigène_back|<span id="Sosigène"><sup>II</sup></span>]] Du nom propre grec ancien Σωσῐγένης / Sōsigénēs [[wikt:en:Σωσιγένης#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;">➥ du verbe σῴζω / sṓizō, « 1. Sauver : • Guérir ; • (rare chez Homère) Garder en sécurité, préserver ; • Garder, observer, maintenir ; • (généralement au milieu) Garder à l’esprit, se souvenir ; • Conduire en toute sécurité (à) ; • Secourir ; • Conserver pour. »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ + du nom commun‎ γένος / génos [[wikt:en:γένος#Ancient_Greek|(en)]], « 1. Race, souche, parenté : Descendance directe, par opposition à une relation collatérale. 2. Progéniture, descendant : (collectif) progéniture, postérité. 3. (en général) Race d’êtres : • Famille, clan, maison ; • Tribu, nation, race, en tant que subdivision de ἔθνος / éthnos [[wikt:en:ἔθνος#Ancient_Greek|(en)]] ; • Caste ; • Race d’animaux. 4. Âge, génération, période de la vie. 5. Sexe, genre : (grammaire) Genre grammatical. 6. Classe, sorte, genre : • (logique) L’opposé de εἶδος / eîdos [[wikt:en:εἶδος#Ancient_Greek|(en)]] ; • (taxonomie) Classe : • (taxonomie) Genre ; • Espèce de plante ; culture, produit ; matériau ; • Élément. »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ +‎ du suffixe nominal propre -ης / -ēs [[wikt:en:-ης#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;"> Astronome grec, connu pour avoir participer à la conception du [[w:Calendrier_julien|''calendrier julien'']] (instauré par Jules César en [[w:Années_46_av._J.-C.|-46]]/[[w:Années_45_av._J.-C.|-45]], lorsqu’il était [[w:Pontifex_maximus|''pontifex maximus'']]), avec une année commune de 365 jours divisée en 12 mois, et un jour intercalaire ajouté tous les 4 ans, lors des années bissextiles.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:Ier_siècle_av._J.-C.|I<sup>er</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]]) <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Hésiode_back|<span id="Hésiode"><sup>III</sup></span>]] Du nom propre grec ancien Ἡσῐ́οδος / Hēsíodos;<br /><p style="margin: 0 2em; text-indent: 15px">Poète ''grec'', renommé pour 2 ouvrages :<br /><p style="margin: 0 2em; text-indent: 15px;">• [[w:Théogonie_(Hésiode)|''la Théogonie'']], une généalogie des dieux (dans laquelle il présente la multitude des dieux célébrés par les mythes grecs où trois générations divines se succèdent : celle d’Ouranos, celle de Cronos, celle de Zeus qui sort triomphant) et une cosmogonie (qui retrace la création du monde à partir du Chaos) ;<br /><p style="margin: 0 2em; text-indent: 15px;">• et [[w:Les_Travaux_et_les_Jours|''les Travaux et les Jours'']], un almanac sur l’agriculture à destination de son frère Perses.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:VIIIe_siècle_av._J.-C.|VIII<sup>ème</sup>]] — [[w:VIIe_siècle_av._J.-C.|VII<sup>ème</sup>]] siècles {{Info|AEC|Avant l’Ère Commune}}) <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Euctémon_back|<span id="Euctémon"><sup>IV</sup></span>]] Du nom propre grec ancien Ευκτήμων / Euktémōn;<br /><p style="margin: 0 2em; text-indent: 15px;">Astronome ''athénien'', contemporain et collègue de l’astronome [[w:Méton|Méton]], avec qui, il a fait une série d’observations des [[w:Solstice|''solstices'']] afin de déterminer la durée de l’[[w:Année_tropique|''année tropique'']] [https://ecliptiqc.ca/Almageste_Livre3.php#III1 <sup>Ptolémée, Almageste, liv. III, chap. 1</sup>].<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:Ve_siècle_av._J.-C.|V<sup>ème</sup>]] siècle {{Info|AEC|Avant l’Ère Commune}})'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: center; margin: 0 2em;">Des découvertes astronomiques : part de chaque observateur dans la science.<br /><p style="text-align: justify; text-indent: 15px;">'''LVII.''' D’abord, il est presque impossible de déterminer d’une manière précise le nombre des jours de l’année et le cours du soleil [[#Primum_omnium_dierum_AdG|<span id="Primum_omnium_dierum_AdG_back"><sup>'''1'''</sup></span>]]. Aux trois cent soixante-cinq jours qui composent l’année, on ajoute le quart d’un jour et d’une nuit, pour en faire ensuite un jour intercalaire ; de là il suit qu’on ne saurait indiquer avec précision le moment du lever et du coucher des astres. On convient qu’il y a encore dans cette théorie beaucoup d’obscurité ; en effet, les saisons quelquefois commencent plusieurs jours avant le terme qui leur a été fixé, ce que les ''Grecs'' appellent ''procheimasis'' ; d’autres fois, plusieurs jours après, ce qu’ils appellent ''épicheimasis'' [[#Accedit_confessa_rerum_obscuritas_AdG|<span id="Accedit_confessa_rerum_obscuritas_AdG_back"><sup>'''2'''</sup></span>]]. Presque toujours l’action des astres se fait sentir sur la terre ou plus tôt ou plus tard qu’il ne devrait ; aussi dit-on communément, lorsque le beau temps est revenu, que tel astre a produit son effet. Ces phénomènes dépendent des astres fixés à la voûte des cieux, ainsi que des étoiles, dont les mouvemens particuliers excitent des grêles et des pluies qui sont d’une très-grande conséquence pour les biens de la terre, comme nous l’avons observé, et amènent dans la température des changemens sur lesquels le laboureur ne pouvait compter. Non-seulement les hommes y sont trompés, mais aussi les animaux, bien plus habiles que nous à prévoir ces vicissitudes, puisque d’ailleurs leur vie en dépend ; en effet, on a vu des oiseaux d’été périr par des froids arrivés trop tôt ou trop tard, et des oiseaux d’hiver par des chaleurs également imprévues. Aussi '''Virgile''' veut-il qu’on étudie aussi le cours des ''planètes'', et qu’on observe avec soin le passage du froid ''Saturne'' [[#Ideo_Virgilius_errantium_quoque_siderum_rationem_ediscendam_prœcipit_AdG|<span id="Ideo_Virgilius_errantium_quoque_siderum_rationem_ediscendam_prœcipit_AdG_back"><sup>'''3'''</sup></span>]].<br /><p style="text-align: justify; text-indent: 15px;">Quelques-uns fixent le commencement du printemps à l’apparition des papillons, parce que ces insectes sont fort délicats. Néanmoins on a observé, dans l’année même où j’écris cette partie de mon ouvrage, que le froid, ayant repris trois fois, a fait périr autant de fois les papillons, et que les hirondelles qui, s’étaient montrées dès le 6 des [[w:Calendes|''kalendes'']] de février, et semblaient annoncer le retour du printemps, ont eu à essuyer un rigoureux hiver.<br /><p style="text-align: justify; text-indent: 15px;">C’est donc une science très-problématique que celle de l’influence des astres, et les inductions qu’elle fournit sont fort douteuses [[#Res_anceps_AdG|<span id="Res_anceps_AdG_back"><sup>'''4'''</sup></span>]]. Ce qui augmente la difficulté, c’est la convexité du ciel et la différence des climats de la terre : le même astre se montre ici dans un temps, et là dans un autre ; d’où il suit que son influence ne se fait pas sentir en même temps partout. Pour surcroît d’embarras, les observations recueillies par les auteurs ont été faites dans des lieux différens, et ceux du même pays ne s’accordent pas même entre eux. On compte trois écoles astronomiques, la ''chaldéenne'', l’égyptienne et la ''grecque''. Le dictateur '''César''' en a fondé, chez les ''Romains'', une quatrième, lorsqu’aidé de '''Sosigène''', habile astronome, il fixa la longueur de l’année à une révolution du soleil. On trouva dans la suite que son calendrier était défectueux, parce que l’année, auparavant plus courte, se trouvait alors plus longue que le cours du soleil. Pour y remédier, il fallut, pour douze années consécutives, supprimer les jours intercalaires. '''Sosigène''' lui-même, le mathématicien le plus exact de son temps, après avoir revu jusqu’à trois fois ses calculs, sembla toujours douter de leur justesse, et ne cessa jamais de se corriger lui-même. De tous les auteurs qui ont traité ce sujet, et que nous avons cités au commencement de ce livre, il en est rarement deux qui soient de même avis. Cette divergence d’opinions est moins surprenante et plus excusable chez ceux qui écrivaient en des pays différens. Mais que dire de ceux qui, habitant le même pays, sont néanmoins d’avis différens ? En voici un exemple : '''Hésiode''', qui nous a laissé aussi un ouvrage sur le cours des astres, fixe le coucher matutinal des ''Pléiades'' au moment de l’équinoxe d’automne ; '''Thales''' prétend qu’il n’arrive que vingt-cinq jours après ; '''Anaximandre''' en met vingt-neuf ; '''Euctémon''', quarante-huit.<br /><p style="text-align: justify; text-indent: 15px;">Quant à nous, nous suivrons les calculs de '''César''', qui se rapportent spécialement à l’Italie ; mais nous rapporterons aussi les observations étrangères, car notre plan n’est pas de traiter d’un seul pays, mais de la nature entière. Pour être moins longs, nous citerons les pays, et non les auteurs ; et, pour abréger davantage encore, les lecteurs se souviendront que, sous le nom d’Attique, il faut aussi entendre les ''Cyclades'' ; sous le nom de ''Macédoine'', la ''Magnésie'' et la ''Thrace'' ; sous le nom d’Égypte , la ''Phénicie'', l’île de ''Cypre'' et la ''Cilicie'' ; sous celui de ''Béotie'', la ''Locride'', la ''Phocide'' et les contrées voisines ; sous le nom d’Hellespont, la ''Chersonèse'' et partie du continent jusqu’au mont ''Athos'' ; sous le nom de l’Ionie, l’Asie et les îles ''Asiatiques'' ; sous le nom du ''Péloponnèse'', l’Achaïe et les pays adjacens au couchant ; enfin sous le nom de ''Chaldée'', l’Assyrie et la ''Babylonie''. On ne sera pas étonné que nous ne parlions ni de l’Afrique, ni de l’Espagne, ni des ''Gaules''. Aucun auteur dans ces contrées n’a laissé d’observations sur le lever ou le coucher des astres. Il ne sera pas difficile néanmoins de déterminer l’époque de ces phénomènes dans ces contrées, en étudiant la disposition des cercles, telle que nous l’avons présentée dans le sixième livre. Par ce moyen, on déterminera la position astronomique, non-seulement de chaque pays, mais encore de chaque ville dont nous avons pu parler, en prenant par les ombres égales de tous les cercles, une portion du cercle de telle contrée qu’on voudra choisir, et en calculant son rapport avec le lever des astres. Il faut faire observer encore que tous les quatre ans les chaleurs reviennent à peu près les mêmes pour chaque saison, en raison du mouvement du soleil, et que toutes les huitièmes années elles sont plus fortes, à cause de la centième lunaison.</div> <table cellspacing=15 align=center style="margin: 0 4em; font-size:85%;"> <tr> <td style="text-align: justify; margin: 0 4em;">'''[[#Primum_omnium_dierum_AdG_back|<span id="Primum_omnium_dierum_AdG"><sup>1</sup></span>]] Cf. sur la plupart des difficultés que le texte de notre auteur révèle, les notes relatives à l’astronomie, au livre II. L’année romaine fut d’abord celle des [[w:Albe_la_Longue|''Albains'']], c’est-à-dire lunaire ; dix mois la composaient, mars en était le premier : elle avait cinquante jours de moins que l’année lunaire réelle, et soixante-un de moins que l’année solaire, c’est-à-dire trois cent quatre jours seulement ; c’était là l’[[w:Calendrier_romain|{{Info|''année de Romulus''|le calendrier dit romuléen}}]]. [[w:Calendrier_romain|{{Info|''Numa''|le calendrier dit pompilien}}]] ajouta deux mois à cette année, janvier et février, et elle se trouva être composée de trois cent cinquante-cinq jours. Elle demeura ainsi jusqu’à Jules César, où commence l’[[w:Calendrier_julien|''année julienne'']], qui se compose de trois cent soixante-cinq jours, huit heures, auxquels [[w:Calendrier_grégorien|''Grégoire le Grand'']] ajouta onze minutes, pour arriver à la plus grande exactitude possible.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Accedit_confessa_rerum_obscuritas_AdG_back|<span id="Accedit_confessa_rerum_obscuritas_AdG"><sup>2</sup></span>]] L’entrée du soleil dans tel ou tel signe du zodiaque, son passage à l’équateur, etc., ne sont pas toujours le signal d’un changement dans la température. [[w:Végèce|Végèce]] a parlé des jours prokéimasiques et épikéiniasiques :''' {{Info|''Aut enim circa diem statutum, aut ante, vel postea, tempestates fieri, compertum est : unde præcedentes, ωροϰεἰμασιν : nascentes die solenni, επιϰεἰμασιν : subsequentes, μεταϰεἰμασιν, græco vocabulo nuncuperaverunt''|Car on a constaté que les tempêtes se produisent soit vers le jour fixé, soit avant, soit après : d’où les précédents, ωροϰεἰμασιν : nés le jour solennel, επιϰεἰμασιν : les suivants, μεταϰεἰμασιν, étaient appelés par le mot grec. TdA.}} '''(IV, 40).''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Ideo_Virgilius_errantium_quoque_siderum_rationem_ediscendam_prœcipit_AdG_back|<span id="Ideo_Virgilius_errantium_quoque_siderum_rationem_ediscendam_prœcipit_AdG"><sup>3</sup></span>]] <p style="margin: 0 6em; text-indent: 0px">'''{{Info|Hoc metuens, cæli menses et sidera serva,<br />Frigida Saturni sese quo stella receptet.|Craignant cela, gardez les lunes et les étoiles du ciel, le froid de Saturne lui-même, où l’étoile les recevra. TdA.}}'''<p style="text-align: right; margin: 0 6em; text-indent: 0px">''Georg.'', I, 335.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Res_anceps_AdG_back|<span id="Res_anceps_AdG"><sup>4</sup></span>]] Voici enfin quelques idées philosophiques qui se trouvent sous la plume de Pline ; malheureusement la cause par laquelle notre auteur explique l’influence des astres est problématique, et montre que les sciences astronomiques des anciens laissaient beaucoup à désirer. Les Grecs croyaient qu’il y avait autant de cieux que de planètes ; le huitième ciel, ou le firmament, était celui dès étoiles fixés.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Occasum_matutinum_Vergiliarum_Hesiodus_AdG_back|<span id="Occasum_matutinum_Vergiliarum_Hesiodus_AdG"><sup>5</sup></span>]] L’ouvrage auquel Pline fait allusion a été mentionné par [[w:Théon_d'Alexandrie|Théon]] qui le nomme Αστριϰὴ βίϐλος [[w:en:Astronomia_(poem)|(en)]]. Cet ouvrage est perdu.'''</td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k5804072n <u>Histoire Naturelle de Pline. Tome Onzième</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k5804072n/f196.item ''Livre XVIII.''], [https://gallica.bnf.fr/ark:/12148/bpt6k5804072n/f340.item ''chap. LVII.''], traduction nouvelle par M. [[w:Stéphane_Ajasson_de_Grandsagne|Ajasson de Grandsagne]] [https://gallica.bnf.fr/ark:/12148/bpt6k5804072n/f453.item <sup>NOTES</sup>], C. L. F. Panckoucke, Paris, 1829</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: center; margin: 0 2em;">''Divi[[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki />ion des jours & des nuits [[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki />uivant le cours du Soleil ; lever & coucher des étoiles ; ordre des [[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki />ai[[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki />ons ; tems où l’on [[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki />eme les bleds d’hiver.''<br /><p style="text-align: justify; text-indent: 15px;">'''D'''’ABORD il e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t pre{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que impo{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ible de déterminer au ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te le nombre des jours de l’année, & le cours du Soleil ; car comme aux trois cents {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oixante & cinq jours dont l’année e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t compo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ée, on ajoute le quart d’un jour & d’une nuit, autrement {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ix heures, qui, au bout de quatre ans, font un jour intercalaire [[#jour_intercalaire_LPdS|<span id="jour_intercalaire_LPdS_back"><sup>'''1'''</sup></span>]], il arrive qu’on ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}auroit a{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}igner avec certitude le tems du lever & du coucher des a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tres. En {{Info|ſ|forme ancienne longue de la lettre s minuscule}}econd lieu, l’on convient qu’il y a dans cette théorie beaucoup d’ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}curité ; car quelquefois les {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ons [[#quelques_les_saisons_LPdS|<span id="quelques_les_saisons_LPdS_back"><sup>'''2'''</sup></span>]] commencent plu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ieurs jours avant le terme qui leur a été fixé, ce que les Grecs appellent ''prokheïma{{Info|ſ|forme ancienne longue de la lettre s minuscule}}is'' ; & d’autres fois plu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ieurs jours après, ce que ces mêmes Grecs expriment par le mot ''epikheïma{{Info|ſ|forme ancienne longue de la lettre s minuscule}}is'' : & l’on éprouve très {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ouvent que l’action des a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tres {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ait {{Info|ſ|forme ancienne longue de la lettre s minuscule}}entir {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur la terre, tantôt plutôt, tantôt plus tard. Au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i dit-on communément, lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que le beau tems e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t revenu, que tel a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tre a produit {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on effet. D’ailleurs comme tout cela dépend des globes céle{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tes, leur mouvement relatif excite quelquefois des grêles & des pluies, qui, comme nous l’avons déja [[#déjà_fait_observer_LPdS|<span id="déjà_fait_observer_LPdS_back"><sup>'''3'''</sup></span>]] fait ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}erver, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont de la plus grande con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}équence pour les biens de la terre, & qui renver{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ent l’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pérance qu’on avoit du beau tems. Et non {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement les hommes y {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont trompés, mais au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i les animaux, quoiqu’ils aient bien plus de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}agacité que nous pour pre{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}entir ces vici{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}itudes du ciel, d’autant que leur vie en dépend. En effet, on voit quelquefois les oi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}eaux d’été mourir par des froids qui viennent trop tard ou trop tôt, & les oi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}eaux d’hiver par des chaleurs qui arrivent de même. C’est pourquoi '''Virgile''' veut qu’on étudie au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i le cours des planetes, & qu’on ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}erve à quelle partie du zodiaque répond la planete du froid Saturne [[#Saturne_LPdS|<span id="Saturne_LPdS_back"><sup>'''4'''</sup></span>]]. Quelques-uns croient que le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}igne le plus certain du printems commencé, c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’on voit des papillons, & cela parceque ces in{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ectes {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont fort délicats. Néanmoins on a remarqué que dans l’année même [[#lAnnée_dÉcriture_LPdS|<span id="lAnnée_dÉcriture_LPdS_back"><sup>'''5'''</sup></span>]] où j’écris ceci, le froid ayant recommencé ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’à trois fois, a fait mourir autant de fois les papillons ; & que les hirondelles, qui, s’étant montrées dès le vingt-{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ept de Janvier, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}embloient annoncer le retour du printems, ont en{{Info|ſ|forme ancienne longue de la lettre s minuscule}}uite e{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}uyé un très cruel hiver.<br /><p style="text-align: justify; text-indent: 15px;">C’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t donc une {{Info|ſ|forme ancienne longue de la lettre s minuscule}}cience très problématique que celle de l’influence des a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tres, & les inductions que l’on en tire {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont fort douteuses. Mais ce qui cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e le plus d’incertitude, c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t cette convexité du ciel & la différence des climats de la terre, parceque le même a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tre {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e montre ici dans un tems, & là dans un autre, d’où il ré{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ulte que {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on influence ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e fait pas {{Info|ſ|forme ancienne longue de la lettre s minuscule}}entir en même tems par-tout. Un autre {{Info|ſ|forme ancienne longue de la lettre s minuscule}}urcroît de difficulté, c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t que les ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervations recueillies par les Auteurs ont été faites en différents lieux, & que ceux même qui ont écrit dans le même endroit ne s’accordent nullement entre eux dans ce qu’ils écrivent. On compte ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’à trois différentes {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ortes de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ectes en A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tronomie ; {{Info|ſ|forme ancienne longue de la lettre s minuscule}}avoir, celle des Chaldéens [[#secte_des_Chaldéens_LPdS|<span id="secte_des_Chaldéens_LPdS_back"><sup>'''5*'''</sup></span>]], celle des Egyptiens & celle des Grecs. On peut même dire que le Dictateur Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar [[#Dictateur_César_LPdS|<span id="Dictateur_César_LPdS_back"><sup>'''6'''</sup></span>]] en produi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}it, chez les Romains, une quatrieme, lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’il rédui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}it chaque année au cours du {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oleil, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervant à cet effet du travail de So{{Info|ſ|forme ancienne longue de la lettre s minuscule}}igene, très habile A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tronome. Néanmoins on découvrit en{{Info|ſ|forme ancienne longue de la lettre s minuscule}}uite que le calendrier de Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar étoit défectueux [[#calendrier_César_défectueux_LPdS|<span id="calendrier_César_défectueux_LPdS_back"><sup>'''7'''</sup></span>]], parceque l’année qui auparavant étoit plus courte que le cours du {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oleil, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e trouvoit alors plus longue : & pour corriger cette erreur, on ordonna que pendant douze années de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uite, il n’y auroit point de jour intercalaire [[#correction_erreur_LPdS|<span id="correction_erreur_LPdS_back"><sup>'''8'''</sup></span>]]. So{{Info|ſ|forme ancienne longue de la lettre s minuscule}}igene lui-même, quoique Mathématicien plus exact que les autres, ne lai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}a pas de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e conduire con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tamment en homme qui doutoit de la ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}e de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on propre calcul, pui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’il en fit ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’à trois différentes corrections. De tous les Auteurs [[#Auteurs_calendrier_LPdS|<span id="Auteurs_calendrier_LPdS_back"><sup>'''9'''</sup></span>]] qui ont écrit {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur cette matiere, & que nous avons allégués au commencement de ce livre, il s’en trouve rarement deux qui {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oient de même {{Info|ſ|forme ancienne longue de la lettre s minuscule}}entiment. Cette variété e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t moins {{Info|ſ|forme ancienne longue de la lettre s minuscule}}urprenante, comme au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i plus excu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}able, chez ceux qui écrivoient en des pays différents. Mais que dire de ceux qui, écrivant dans le même pays, n’ont pas lai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}é d’être partagés d’opinion ? En voici un exemple. '''Hé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iode''', dont il y a au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i un ouvrage [[#ouvrage_astronomique_Hésiode_LPdS|<span id="ouvrage_astronomique_Hésiode_LPdS_back"><sup>'''10'''</sup></span>]] {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur le cours des a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tres, dit que les Pléiades {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e couchent le matin dans le tems même de l’équinoxe d’automne. '''Thalès''' [[#opinion_Thalès_Hésiode_Anaximandre_LPdS|<span id="opinion_Thalès_Hésiode_Anaximandre_LPdS_back"><sup>'''11'''</sup></span>]] dit que cela arrive vingt-cinq jours après. '''Anaximandre''' en met vingt-neuf ; '''Euctémon''' [[#Euctémon_LPdS|<span id="Euctémon_LPdS_back"><sup>'''12'''</sup></span>]] quarante-huit.<br /><p style="text-align: justify; text-indent: 15px;">Quant à nous, nous {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivrons le calcul de Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar, ayant principalement égard à l’Italie. Nous ne lai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}erons néanmoins de rapporter les opinions étrangeres, parceque notre objet n’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t pas de traiter d’un {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eul pays, mais de la Nature entiere. Seulement, pour éviter les longueurs, nous n’indiquerons que les pays où chaque opinion a lieu, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ans faire mention des auteurs de ces a{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ertions : & pour abréger encore davantage, les Lecteurs voudront bien {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ouvenir que quand il e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t parlé de l’Attique, il faut, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous ce nom, entendre au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i les Cyclades ; que {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous le nom de Macédoine, il faut entendre au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i la Magné{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ie & la Thrace ; {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous le nom de l’Egypte, la Phénicie, l’i{{Info|ſ|forme ancienne longue de la lettre s minuscule}}le de Chypre & la Cilicie; {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous celui de la Béotie, la Locride, la Phocide & les contrées voi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ines ; {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous le nom de l’Hel le{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pont, la pre{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’i{{Info|ſ|forme ancienne longue de la lettre s minuscule}}le de Thrace & le pays de terre ferme, ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’au mont Athos ; {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous le nom de l’Ionie, l’A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ie & les i{{Info|ſ|forme ancienne longue de la lettre s minuscule}}les A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iatiques ; {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous le nom du Péloponne{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e, l’Achaïe & les contrées [[#contrées_adjacentes_ouest_Péloponnese_LPdS|<span id="contrées_adjacentes_ouest_Péloponnese_LPdS_back"><sup>'''13'''</sup></span>]] adjacentes qu’elle a à {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on couchant ; {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous le nom des Chaldéens, l’Assyrie & la Babylonie. Il ne faudra pas s’étonner {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i je ne parle ici ni de l’Afrique, ni de l’Espagne, ni des Gaules, pui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que ces pays n’ont eu aucun Auteur qui ait écrit du cours des a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tres, ni de leur lever. Toutefois il ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}era pas difficile de connoître le tems où ils {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e levent dans ces pays-là même, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i l’on e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t in{{Info|ſ|forme ancienne longue de la lettre s minuscule}}truit de l’arrangement des cercles céle{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tes, tel que nous l’avons expliqué au {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ixieme livre de cet ouvrage ; car, par ce moyen, & par les {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eules notions que nous avons expo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ées en donnant une nomenclature des lieux, on {{Info|ſ|forme ancienne longue de la lettre s minuscule}}aura la po{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ition, non {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement de chaque pays, mais encore de chaque ville, en prenant par les ombres égales de tous les cercles, un {{Info|ſ|forme ancienne longue de la lettre s minuscule}}egment du cercle de tel pays qu’on voudra choi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ir, & en cherchant {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on rapport avec le lever des a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tres. Il faut remarquer au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i que de quatre [[#Columelle_LPdS|<span id="Columelle_LPdS_back"><sup>'''14'''</sup></span>]] en quatre ans les {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ons & les chaleurs reviennent à peu près les mêmes, & cela à cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e du mouvement du Soleil ; & que de huit en huit ans ces mêmes chaleurs reviennent plus con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}idérables, en vertu de la centieme lunai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}on.</div> {{Boîte déroulante début|titre=Notes du traducteur|alignT=center}} <div style="text-align: justify; border: 2px; border-radius:15px; font-size:85%;"><br/> <table cellspacing=15 align=center style="margin: 0 4em;"> <tr> <td style="text-align: justify; margin: 0 4em; text-indent: 15px">'''[[#jour_intercalaire_LPdS_back|<span id="jour_intercalaire_LPdS"><sup>1</sup></span>]] Con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ultez, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur toute cette que{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tion, nos notes 13 & 14 {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur le huitieme chapitre du {{Info|ſ|forme ancienne longue de la lettre s minuscule}}econd livre de Pline, tome 1, p. 41 & 42 :<br /><p style="text-align: justify; text-indent: 15px; margin: 0 5em;">(13) [[w:Suétone|Suétone]] s’exprime mieux, lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’il écrit : chaque quatrieme année ''quarto quoque anno''. Il est vrai que, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon le [[w:Jean_Hardouin|Pere Hardouin]], il faut comprendre dans la période de cinq ans, dont parle Pline, la premiere & la cinquieme année comme Bi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}extiles ; ce qui revient aux quatre années de Suétone, dont la quatrieme avoit un ''bi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ex'' ; mais en vérité cette explication est des plus forcées. Je {{Info|ſ|forme ancienne longue de la lettre s minuscule}}erois donc d’avis qu’il faudroit lire dans Pline comme dans Suétone, ''quarto anno'', {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i nous n’apprenions d’ailleurs de cet Hi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}torien, que dès le regne d’Augu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te il s’étoit déja gli{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}é plu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ieurs abus & altérations dans l’année Julienne. On voit du moins qu’il y réforma plu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ieurs cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es, sous prétexte de la remettre {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur le pied où Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar l’avoit in{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tituée. Cela me donneroit à pen{{Info|ſ|forme ancienne longue de la lettre s minuscule}}er qu’on fit dès-lors attention à la fau{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eté & à l’excédence du calcul Julien ; mais qu’Augu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te, par respect pour la mémoire de Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar, affecta d’imputer la faute à la négligence des Prêtres chargés à Rome de l’in{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pection du Calendrier ; qu’au demeurant, on découvrit l’abus, & qu’on e{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}aya d’y remédier, en n’ajoûtant un jour entier à l’année ordinaire que chaque ''cinquieme année'' comme Pline paroît l’articuler ici expre{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ement. Mais d’ailleurs il e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t évident qu’à la longue le période bi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}extile de quatre années en quatre années prévalut {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur celui de chaque cinquieme année, dont parle Pline ; & même il paroît que ceux qui, par la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uite, voulurent {{Info|ſ|forme ancienne longue de la lettre s minuscule}}upputer les tems, récapitulerent, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ans exception, toutes les bi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}extiles quartenaires écoulées depuis l’in{{Info|ſ|forme ancienne longue de la lettre s minuscule}}titution Julienne ; car en 1582, on trouva par ce moyen que l’année étoit reculée de dix jours & plus; d’autant que l’excédence du calcul Julien, qui {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uppo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e à l’année révolue 365 jours & {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ix heures, au lieu de 365 jours 5 heures 49 minutes, 8 {{Info|ſ|forme ancienne longue de la lettre s minuscule}}econdes 17 tierces & 13 quarts qu’elle a réellement, forme tous les ans environ 11 minutes de trop, & tous les cent trente-quatre ans un jour entier d’excès. Le Pape Grégoire XIII trouvant donc l’année reculée de plus de dix jours ; ce qui dérangeoit l’économie annuelle des {{Info|ſ|forme ancienne longue de la lettre s minuscule}}olemnités, remédia à cet inconvénient en retranchant de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on autorité dix jours au mois d’Octobre de l’année 1582, où l’on étoit alors ; & en réglant qu’à l’avenir tous les quatre cents ans on omettroit trois années bi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}extiles. Ce réglement devint une loi pour pre{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que toute l’Europe chrétienne. L’autre maniere de compter fut appellée l’ancien {{Info|ſ|forme ancienne longue de la lettre s minuscule}}tyle. La Grande-Bretagne a long-tems per{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i{{Info|ſ|forme ancienne longue de la lettre s minuscule}}té à s’en {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervir malgré {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on abus manife{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te. Enfin le Parlement d’Angleterre, par acte du mois de Septembre 1752, a adopté la réforme Grégorienne.<br /><p style="text-align: justify; text-indent: 15px; margin: 0 4em;">(14) Le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oleil, en fai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ant le tour du cercle oblique, parcourt réellement 360 degrés ou {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ections ; pui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que tout cercle {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e divi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e en 360 parties appellées degrés : mais la me{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ure de chaque degré du cercle parcouru annuellement par le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oleil, excede tant {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oit peu, c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t-à-dire de quelques légeres fractions de tems, la durée de chacun de nos jours révolus ; durée qui n’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t, comme on {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ait, que de 24 heures préci{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es ; le{{Info|ſ|forme ancienne longue de la lettre s minuscule}}quelles, comparées à un degré, en produi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ent, au bout de l’année, 365 & plus pour le cercle, au lieu de 360 {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement que le cercle requerroit. D’après une connoi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ance con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}u{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e de ces principes, Jules Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e voyant Dictateur, Grand-Pontife, & maître du monde, entreprit, l’an 140 avant J. C. de réformer les abus qui s’étoient gli{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}és, tant dans l’année Pompilienne, ou de Numa, que dans celle des Pontifes, encore plus irréguliere que celle de Numa. A cet effet, il fit venir d’Alexandrie le Philo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ophe So{{Info|ſ|forme ancienne longue de la lettre s minuscule}}igenes. Celui-ci décida fau{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ement que le cercle des jours de l’année révolue excédoit du nombres 5 joint au quart de 1 les 360 degrés du cercle oblique parcouru par le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oleil : expo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}é faux, auquel le Dictateur, occupé d’autres {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oins, déféra {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ans autre examen. Jules Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar régla donc, de l’avis de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tronome, que l’année {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit divisée en 365 jours ; & quant au quart de jour re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tant, qui produit {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ix heures, il ordonna qu’on n’y auroit aucun égard pour chaque année particuliere ; mais que chaque quatrieme année on réuniroit la totalité de quatre fois {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ix heures, qui en font vingt-quatre, pour en compo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}er un jour entier; & qu’ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i cette quatrieme année auroit 366 jours. Il régla de plus, que ce jour intercalaire, ou ajoûté à chaque quatrieme année, seroit le 24 Février. Les Romains nommoient ce jour-là ''bis {{Info|ſ|forme ancienne longue de la lettre s minuscule}}exto calendas Martii'', c’est-à-dire, le ''{{Info|ſ|forme ancienne longue de la lettre s minuscule}}econd {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ixieme avant les calendes de Mars'' ; d’où il arriva que l’année où tomboit ce jour intercalaire fut appellée bis-{{Info|ſ|forme ancienne longue de la lettre s minuscule}}extile.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#quelques_les_saisons_LPdS_back|<span id="quelques_les_saisons_LPdS"><sup>2</sup></span>]] Végece dit pareillement, liv. 4, chap. 40 : ''Aut enim circa diem {{Info|ſ|forme ancienne longue de la lettre s minuscule}}tatutum, aut ante, vel po{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tea, tempe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tates fieri compertum e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t : unde præcedentes, ωροϰεἰμασιν : na{{Info|ſ|forme ancienne longue de la lettre s minuscule}}centes die {{Info|ſ|forme ancienne longue de la lettre s minuscule}}olenni, επιϰεἰμασιν : {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ub{{Info|ſ|forme ancienne longue de la lettre s minuscule}}equentes, μεταϰεἰμασιν, Græco vocabulo nuncuperaverunt'' [[#Accedit_confessa_rerum_obscuritas_AdG_back|<sup>⤴️</sup>]]. On lit au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i chez [[w:Columelle|Columelle]], dans {{Info|ſ|forme ancienne longue de la lettre s minuscule}}a Préface :''' {{Info|''Neque enim ſemper eumdem, cælum & annus, velut ex præſcripto habitum gerunt : nec omnibus annis eodem vultu venit aſtas, aut hyems, &c.''|Car le ciel et l’année ne portent pas toujours le même habit, comme par un précepte : ni l’automne n’arrive chaque année avec la même apparence, ni l’hiver, etc. TdA}} </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#déjà_fait_observer_LPdS_back|<span id="déjà_fait_observer_LPdS"><sup>3</sup></span>]] Au liv. 17, chap. 2.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Saturne_LPdS_back|<span id="Saturne_LPdS"><sup>4</sup></span>]] Ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i qu’il l’in{{Info|ſ|forme ancienne longue de la lettre s minuscule}}inue dans {{Info|ſ|forme ancienne longue de la lettre s minuscule}}es ''Géorg.'' liv. I, v. 335 :'''<br /><p style="margin: 0 6em; text-indent: 0px">{{Info|Hoc metuens, cæli menses et sidera serva,<br />Frigida Saturni sese quo stella receptet.|Craignant cela, gardez les lunes et les étoiles du ciel, le froid de Saturne lui-même, où l’étoile les recevra. TdA.}} </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#lAnnée_dÉcriture_LPdS_back|<span id="lAnnée_dÉcriture_LPdS"><sup>5</sup></span>]] Pline, au quatorzieme livre, chap. 4, comptoit deux cents trente ans depuis la mort de [[w:Cicéron|Cicéron]] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Cicéron_I|<sup>🔄</sup>]], arrivée l’an de Rome 600. L’année qu’il indique ici, & où il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e trouvoit avoir compo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}é quatre livres de plus, e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t probablement la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivante, c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t-à-dire l’année 831 de la fondation de Rome.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#secte_des_Chaldéens_LPdS_back|<span id="secte_des_Chaldéens_LPdS"><sup>5*</sup></span>]] Sur l’année Chaldéenne, qui étoit la même que la Judaïque, con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ultez [[w:Eusèbe_de_Césarée|Eu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ebe]], ''Præpar. Evang.'' liv. 9, chap. 17, où il fait Abraham inventeur de l’a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tronomie chez les Chaldéens. Les A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}trologues Chaldéens étoient ordinairement des Prêtres des Dieux, tels que [[w:Bérose|Béro{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e]], auquel les Athéniens éleverent dans leur Gymna{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e une {{Info|ſ|forme ancienne longue de la lettre s minuscule}}tatue à langue dorée. Sur quoi voyez Pline, liv. 7, chap. 37. Ce Béro{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e étoit un Prêtre de [[w:Bēl|Belus]] ; il e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t cité par [[w:Clément_d'Alexandrie|Clément d’Alexandrie]], & par [[w:Flavius_Josèphe|Jo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}eph]] [[#Flavius_Josèphe_I|<sup>⤵️</sup>]], contre Apion, liv. 1. Sur l’année Egyptienne, & {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur l’ancienne année Grecque, con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ultez [[w:Hérodote|Hérodote]] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Hérodote_I|<sup>🔄</sup>]] liv. 2, n°. 4. Cicéron rend ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tice à l’étude que firent des a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tres les Egyptiens & les Babyloniens, liv. 1, de ''Divinat.'' n°. 16 :''' {{Info|''Ægyptii, & Babylonii, in camporum patentium aquoribus habitantes, cùm ex terra nihil emineret, quod contemplationi cæli officere poſſet, omnem curam in ſiderum cognitione poſuerunt''|Les Égyptiens et les Babyloniens, vivant dans les eaux des plaines découvertes, alors que rien ne dépassait de la terre qui pût gêner la contemplation du ciel, mettaient tous leurs soins dans la connaissance des étoiles. TdA}}. </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Dictateur_César_LPdS_back|<span id="Dictateur_César_LPdS"><sup>6</sup></span>]] Voyez les notes 13 & 14 {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur le chap. 8 du liv. 2, tome 1, p. 41 & 42.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#calendrier_César_défectueux_LPdS_back|<span id="calendrier_César_défectueux_LPdS"><sup>7</sup></span>]] Voyez les notes indiquées dans la note précédente ; & joignez-y les ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervations {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivantes, qui {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont de M. De{{Info|ſ|forme ancienne longue de la lettre s minuscule}}places, p. 339 : « Le calendrier chrétien, ayant {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivi la réformation de Jules Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar, il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e trouva qu’en l’année 1582, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous le Pape Grégoire XIII, l’équinoxe étoit remontée ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’au 11 de Mars, au lieu du 21, où elle devoit être. Ce Pape, après avoir con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ulté Clavius & Ciaconius, les plus habiles A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tronomes du tems, ordonna qu’en cette même année 1582, on compteroit le 5 du mois d’Octobre, au lieu du 15, afin de retrancher les dix jours qui s’étoient gli{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}és de trop, en {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivant la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}upputation Julienne, depuis le Concile de Nicée, tenu en 325 : on convint encore de continuer l’intercalation d’un jour tous les quatre ans ; & qu’en outre, pour éviter dans la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uite pareille erreur, il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit fait un retranchement de trois jours intercalaires, dans l’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pace de quatre {{Info|ſ|forme ancienne longue de la lettre s minuscule}}iecles, à cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e des onze minutes qui manquent aux {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ix heures des années, dont on compo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e l’année intercalaire, ou bi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}extile ; ces trois jours {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e retranchent en l’année qui finit les trois premiers {{Info|ſ|forme ancienne longue de la lettre s minuscule}}iecles. De célebres A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tronomes modernes ont fait voir que, malgré cette précaution, il y auroit encore, au bout de quatre cents ans, plu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ieurs jours de variation dans l’équinoxe ».''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#correction_erreur_LPdS_back|<span id="correction_erreur_LPdS"><sup>8</sup></span>]] Etabli par Jules Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar, & qui revenoit tous les quatre ans. Ecoutons Suétone, vie de ce Dictateur, chap. 40 : {{Info|''Faſtos correxit, jampridem vitio Pontiſicum, per intercalandi licentiam adeo turbatos, ut neque meſſium feria aſtati, neque vindemiarum autumno competerent, annumque ad curſum ſolis accommodevit, ut CCCLXV dierum eſſet, & intercalario menſe ſublato, unus dies quarto quoque anno intercalaretur, &c''|Il corrigea les jeûnes, qui avaient toujours été une faute pontique, si perturbés par la permission de l’intercalation, que ni les fêtes du mois ne tenaient, ni les récoltes ne correspondaient à l’automne, et il ajusta l’année à la course du soleil, de sorte que c’était 365 jours, et après le mois intercalaire, un jour était intercalé tous les quatre ans, etc. TdA}}. On s’apperçut que cette correction de Jules Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar étoit elle-même fautive. On tenta de nouveau de remédier au vice du calendrier ; {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur quoi con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ultez Solin, chapitre 1, p. 5 ; le P. Petau, ''de Doctr. temp.'' chap. 3 ; mais {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur-tout [[w:Macrobe|Macrobe]], qui s’exprime ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i, liv. 1, ''Saturn.'' chap. 14, p. 255 :''' {{Info|''Sacerdotes ſibi errorem novum ex ipſa emendatione ſecerunt. Nam cùm oporteret diem, qui ex quadrantibus conſit, quarto quoque anno conſecto, antequam quintus inciperet, intercalare, illi quarto non peracto ſed incipiente, intercalabant. Hic error ſex & triginta annis permanſit : quibus annis intercalati ſunt dies duodecim, cùm deberent intercalari novem. Sed hunc quoque errorem ſerò deprehenſum correxit Auguſtus, qui annos duodecim ſine intercalari die tranſigi juſſit : ut illi tres dies, qui per annos triginta & ſex vitio ſacerdotalis ſeſtinationis excreverant, ſequentibus annis duodecim, nullo die intercalato, devorarentur. Poſt hoc unum diem, ſecundùm ordinationem Caſaris, quinto quoque incipiente anno intercalari juſſit : & omnem hunc ordinem area tabula ad aternam cuſtodiam inciſione mandavit.''|Les prêtres retranchèrent une nouvelle erreur de leur correction. Car lorsqu’il fallait intercaler le jour qui est composé de quadrants, la quatrième année consécutive, avant que la cinquième ne commence, on intercalait ceux lorsque la quatrième n’était pas terminée mais commençait. Cette erreur a duré trente-six ans : années au cours desquelles douze jours ont été intercalés, alors qu’il aurait fallu en intercaler neuf. Mais cette erreur fut également détectée par Auguste, qui ordonna que douze années s’écoulèrent sans jour intercalaire : afin que ces trois jours, qui avaient été excrétés pendant les trente-six années du vice sacerdotal de cessation, soient dévorés dans le douze années suivantes, sans jour intercalaire. Après ce jour, selon l’ordonnance de César, il décréta que la cinquième année serait également intercalée : et tout l’ordre fut ordonné d’être gravé par le conseil du domaine pour la garde éternelle. TdA}}. </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Auteurs_calendrier_LPdS_back|<span id="Auteurs_calendrier_LPdS"><sup>9</sup></span>]] Ces Auteurs {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont Hiéron, Philomêtor, Attale, Archelaüs, Xénophon, Magon, Caton, Silanus, Varron, &c. dont Pline a fait mention {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur la fin du chapitre 3.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#ouvrage_astronomique_Hésiode_LPdS_back|<span id="ouvrage_astronomique_Hésiode_LPdS"><sup>10</sup></span>]] Nous apprenons de Théon que cet ouvrage {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e nommoit l’A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}trique, Ἀςριϰὴ ϐίϐλος. Voyez au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur ce même ouvrage, une Epigramme de [[w:Callimaque_de_Cyr%C3%A8ne|Callimaque]] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Callimaque_I_de_Cyrène_II|<sup>🔄</sup>]], citée dans la vie d’Aratus, qui fait partie de l’Uranologie de [[w:Denis_Pétau|Petau]], liv. 2, ''Var. Di{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ert.'' chap. 9, p. 97.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#opinion_Thalès_Hésiode_Anaximandre_LPdS_back|<span id="opinion_Thalès_Hésiode_Anaximandre_LPdS"><sup>11</sup></span>]] Con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ultez, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur cette opinion de Thalès, ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i que {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur celles d’Hé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iode & d’Anaximandre, l’Uranologie citée note précédente.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Euctémon_LPdS_back|<span id="Euctémon_LPdS"><sup>12</sup></span>]] ''Euctemon'' ; ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i portent les manu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}crits, & non pas ''Eudemon''. J’ai traité d’Euctêmon (en Grec Εὐϰτημον) dans les notes alphabétiques du premier livre, & plus récemment dans la note 21 du chapitre précédent.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#contrées_adjacentes_ouest_Péloponnese_LPdS_back|<span id="contrées_adjacentes_ouest_Péloponnese_LPdS"><sup>13</sup></span>]] Telles que l’Elide, l’Arcadie, la Me{{Info|ſ|forme ancienne longue de la lettre s minuscule}}lénie.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Columelle_LPdS_back|<span id="Columelle_LPdS"><sup>14</sup></span>]] Columelle, liv. 3, chap. 6 :''' {{Info|''Quo tempore ſol in eamdem partem ſigniſeri per eoſdem numeros redit, per quos cursus ſui principium cæperat : quem circuitum meatus dierum integrorum mille quadringentorum ſexaginta unius [[w:Apocatastase|ὰ τοκατάςασιν]] vocant ſtudioſi rerum cæleſtium''|A ce moment-là, le soleil revient dans la même direction au moyen des mêmes nombres par lesquels il a commencé sa course : laquelle course de mille quatre cent soixante et un jours entiers est appelée ὰ τοκατάςασιν par ceux qui étudient les choses célestes. TdA}}.</td> </tr> </table><br/><br/></div> {{Boîte déroulante fin}} <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=JeyFTzG771cC&newbks=1&newbks_redir=0&dq=Louis%20Poinsinet%20de%20Sivry%20Pline%20l'ancien&hl=fr&pg=PP9#v=onepage&q&f=true <u>Histoire Naturelle de Pline. Tome Sixieme</u>], [https://books.google.fr/books?id=JeyFTzG771cC&newbks=1&newbks_redir=0&dq=Louis%20Poinsinet%20de%20Sivry%20Pline%20l'ancien&hl=fr&pg=PA257#v=onepage&q&f=true ''Livre Dix-huitieme.''], [https://books.google.fr/books?id=JeyFTzG771cC&newbks=1&newbks_redir=0&dq=Louis%20Poinsinet%20de%20Sivry%20Pline%20l'ancien&hl=fr&pg=PA455#v=onepage&q&f=true ''Diviſion des jours & des nuits ſuivant le cours du Soleil ; lever & coucher des étoiles ; ordre des ſaiſons ; tems où l’on ſeme les bleds d’hiver.''], traduction en françois, avec le texte latin rétabli d’après les meilleures leçons manu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}crites ; accompagnée de Notes critiques pour l’éclairci{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ement du texte, & d’Ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervations {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur les connoi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ances des Anciens comparées avec les découvertes des Modernes, par M. [[w:Louis_Poinsinet_de_Sivry|Louis Poinsinet de Sivry]], Chez la veuve Desaint, Paris, 1771</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Flavius_Josèphe|'''Flavius Josèphe''']] [[#Flavius_Josèphe|<span id="Flavius_Josèphe_back"><sup>'''I'''</sup></span>]] == <p style="text-align: right;">([[w:37|37]]/[[w:38|38]], à [[w:Histoire_de_Jérusalem#Période_romaine_et_byzantine_(63_av._J.-C._-_638)|''Jérusalem'']] — vers [[w:100|100]], à [[w:Rome_antique|''Rome'']]) [[w:Ier_siècle|<sup>⏳</sup>]] [[s:Auteur:Flavius_Josèphe|<sup>📚</sup>]] <div style="text-align: justify; margin: 0 1em; text-indent: 15px">[[w:historiographe|Historiographe]] ''romain'' [[w:Juifs|''juif'']] d’origine [[w:Judée_(province romaine)|''judéenne'']], il participe activement au début de la ''première guerre judéo-romaine'' en tant que commandant militaire de ''Galilée'' contre les Romains, avant de se rendre à [[w:Vespasien|'''Vespasien''']] [[#Vespasien|<span id="Vespasien_back"><sup>'''II'''</sup></span>]] lors de la prise de la garnison juive de la forteresse de [[w:Jotapata|''Jotapata'']] en juillet 67, et de devenir intermédiaire, interprète et négociateur entre les ''romains'' et les ''Juifs'' lors du siège de ''Jérusalem'' conduit par '''Titus''' [[#Titus_back|<sup>⤴️</sup>]] en 70. Après la fin de la grande révolte ''judéenne'', en 71, il s’établit auprès de son protecteur à ''Rome'' où il obtient la [[w:citoyenneté_romaine|''citoyenneté romaine'']].</div> {{Boîte déroulante début|titre=NdA Flavius Josèphe|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Flavius_Josèphe_back|<span id="Flavius_Josèphe"><sup>I</sup></span>]] De son nom de naissance Joseph ben (fils de) Matthatias, de l’hébreu יוסף בן מתתיהו / Yossef [[wikt:en:יוסף#Hebrew|(en)]] ben [[wikt:en:בן#Noun|(en)]] Matityahou [[wikt:en:מתתיהו#Hebrew|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;">• de la troisième personne du singulier [[w:Jussif|''jussive'']], signifiant ainsi « peut-il ajouter », du verbe הוֹסִיף / hosíf [[wikt:en:הוסיף#Hebrew|(en)]], « 1. Ajouter (quelque chose) à (quelque chose d'autre). 2. (littéraire) Continuer (à faire quelque chose). 3. (archaïque) Coordonné avec un autre verbe pour indiquer que l’action de ce verbe "ajoute" d’une manière ou d’une autre. »;<br /><p style="margin: 0 2em; text-indent: 15px;">• du nom commun בֵּן / bén, « 1. Fils. 2. (ne produit plus de mot ou d’expression) Un descendant mâle direct. 3. Un mec, un garçon. 4. (n’est plus productif, état de construction) Possesseur de (connaissance, capacité, etc.). 5. (État construit) Utilisé pour exprimer l’âge d’un homme, d’un garçon ou le référent d’un nom masculin : âge, âgé. »;<br /><p style="margin: 0 2em; text-indent: 15px;">• de la contraction du nom commun מַתָּנַת / mataná [[wikt:en:מתנה#Hebrew|(en)]], « cadeau, présent, don »;<br /><p style="margin: 0 2em; text-indent: 30px;">➥ du verbe נתן / natán [[wikt:en:נתן#Verb|(en)]], « 1. Donner. 2. Autoriser, permettre, laisser. 3. (archaïque) Mettre, placer. 4. (archaïque, hébreu biblique) Se transformer en. »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ et du nom propre יהוה / YHWH [[wikt:en:יהוה#Hebrew|(en)]], « (Judaïsme) Tétragramme : mot en quatre lettres hébraïques utilisé comme nom [[wikt:ineffable#Français|''ineffable'']] de Dieu dans la Bible hébraïque, diversement rendu par Yahweh ou Jéhovah. »;<br /><p style="margin: 0 2em; text-indent: 15px;">Son tria nomina à l’obtention de sa ''citoyenneté romaine'' est {{Info|Titus|praenomen, nom individuel du citoyen romain}} {{Info|Flavius|nomen, nom de famille}} {{Info|Josephus|cognomen, surnom héréditaire, servant à distinguer les diverses branches d’une même gens}}, prenant ainsi le nom de son bienfaiteur :<br /><br /><p style="margin: 0 2em; text-indent: 15px;">[[#Vespasien_back|<span id="Vespasien"><sup>II</sup></span>]] [[w:Nom_romain|Tria Nomina]] en latin {{Info|Titus|praenomen, nom individuel du citoyen romain}} {{Info|Flavius|nomen, nom de famille}} {{Info|Vespasianus|cognomen, surnom héréditaire, servant à distinguer les diverses branches d’une même gens}};<br /><p style="margin: 0 2em; text-indent: 15px;">[[w:L%C3%A9gat_(Rome_antique)|''Légat'']] lors de la [[w:Conqu%C3%AAte_romaine_de_la_Grande-Bretagne|''conquête de la Bretagne en 43'']] et lors de la [[w:Premi%C3%A8re_guerre_jud%C3%A9o-romaine|''rébellion juive de 66'']] en [[w:Jud%C3%A9e_(province_romaine)|''Judée'']]. Fin décembre 69, il est couronné empereur par le [[w:S%C3%A9nat_romain|''Sénat'']] après la guerre civile de l’[[w:Ann%C3%A9e_des_quatre_empereurs|''année des quatre empereurs'']], et fonde la dynastie des [[w:Flaviens|''Flaviens'']].<br /><p style="text-align: right; margin: 0 2em;">(17 novembre [[w:9|9]], près de [[w:Reate|''Reate'']] dans la région centrale italienne du [[w:Latium|''Latium'']] — 23/24 juin [[w:79|79]], à la station thermale de [[w:Aquae_Cutiliae|''Aquae Cutiliae'']], à l’est de ''Reate'')<sup>[[w:Ier_siècle|⏳]]</sup><br/><br/></div> ''' {{Boîte déroulante fin}} === [[w:Contre_Apion|Contre Apion]] === <p style="text-align: right;">[[s:Contre_Apion|📚]] {| cellpadding="0" align="{{{align|right}}}" style="margin-left: 2em; width:40%; border-spacing:3px; text-align:center; background-color:#F8F9FA; border:2px solid #C8CCD1" |- | style="border:solid 1px #F8F9FA" | [https://archive.org/details/contreapiontexte0000jose/page/n156/mode/1up {{Info|'''Éditions & Manuscrits'''|Flavius Josèphe Contre Apion, Théodore Reinach & Léon Blum, 1930}}] |- style="font-size:8pt; line-height:10pt; vertical-align:middle" | align="center" | <div style="margin-right: 1em; padding:0 0 4px 0; text-align:justify;">{{{légende| * La traduction ''latine'' a été imprimée dès 1480 à [[w:Vérone#Époque_moderne|''Vérone'']] par '''Pierre Maufer''' [[w:en:Petrus_Maufer|(en)]]. L’édition de cette traduction, due à [[w:Sigismund_Gelenius|'''Sigismond Gelenius''']] (''Paris'', 1535), qui constitue la « [[w:Vulgate|Vulgate]] », présente un texte souvent « amélioré » de façon arbitraire. La seule édition critique est celle de '''Ch. Boysen''' (''Vienne'', 1898) qui fait partie du [[w:Corpus_scriptorum_ecclesiasticorum_latinorum|{{Info|''Corpus scriptorum ecclesiasticorum latinorum''|Le corpus des écrits ecclésiastiques latins}}]]. Elle repose principalement sur les manuscrits L(aurentianus LXVI, 2), B(odleianus Canonicianus 148), R(egius Parisinus 5049) de la I<sup>re</sup> classe, C(heltenhamensis Phillipicus 12311), P(arisinus 1615), Pa(rsinus 5054) de la seconde. * Le texte grec est édité pour la première fois dans l’édition complète de '''Josèphe''' à [[w:Bâle#XVIe_siècle|''Bâle'']], chez [[w:Johann_Froben|''Froben'']], en 1544 par [[w:Arnoldus_Arlenius|'''Arlenius''']] qui a peut-être fait usage du ''Schleusingensis'' (un des fils du Laurentianus), mais a introduit grand nombre de corrections tantôt heureuses, et tantôt arbitraires. Par la suite notre traité n’a guère été imprimé que comme partie intégrante d’éditions complètes des œuvres de '''Josèphe'''. Les plus importantes sont celles de '''E. Bernard''' (1700), de [[w:John_Hudson_(classiciste)|'''Hudson''']] (1720) — le premier qui ait utilisé L —, de [[w:Sigebert_Havercamp|'''Havercamp''']] (1726), simple compilateur, de [[w:Karl_Wilhelm_Dindorf|'''L. Dindorf''']] (1847), de [[w:Immanuel_Bekker|'''Imm. Bekker''']] (1856), tout à fait manquée. L’édition critique de '''Niese''' [[w:en:Benedikt_Niese|(en)]] (1889) est la base de tous les travaux ultérieurs, notamment des éditions de '''Naber''' (1896) et de [[w:Henry_St._John_Thackeray|'''H. St. J. Thackeray''']] (coll. Loeb, 1926 : il n’a encore paru que le ''C. Apion'', la ''Vita'' et le commencement de la ''Guerre'') qui ont pu profiter aussi des conjectures de '''Cobet''', de '''Holwerda''', et de '''Herwerden'''.}}}</div> |} <div style="text-align: justify; margin: 0 1em; text-indent: 15px">Dernière œuvre écrite par '''Flavius Josèphe''', vers [[w:93|93]], dont l’objectif est de répondre aux critiques qu’ont soulevées ses [[w:Antiquit%C3%A9s_juda%C3%AFques|''Antiquités judaïques'']], de défendre l’ancienneté du peuple ''juif'' et du [[w:Judaïsme#Judaïsme_antique|''judaïsme'']] (Livre I) et les accusations d’[[w:Apion_(grammairien)|'''Apion''']] [[#Apion|<span id="Apion_back"><sup>'''I'''</sup></span>]] (Livre II).</div> {{Boîte déroulante début|titre=NdA Apion|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Apion_back|<span id="Apion"><sup>I</sup></span>]] Du nom propre grec ancien [[wikt:Apion#Latin|Ἀπίων / Apíôn]]; <br/><br /><p style="margin: 0 2em; text-indent: 15px;">'''[[w:Grammaticus|''Grammairien'']] [[#grammairien|<span id="grammairien_back"><sup>II</sup></span>]] et [[w:Polygraphe_(auteur)|''polygraphe'']] [[#polygraphe|<span id="Grammairien_back"><sup>III</sup></span>]] ''grec'' d’Alexandrie.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] seconde moitié du [[w:Ier_siècle_av._J.-C.|I<sup>er</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]] — première moitié du [[w:Ier_siècle|I<sup>er</sup> siècle {{Info|EC|de l’Ère Commune}}]]) <br /><br /><p style="margin: 0 2em; text-indent: 15px;">'''[[#grammairien_back|<span id="grammairien"><sup>II</sup></span>]] Du nom commun latin grammaticus [[wikt:en:grammaticus#Latin|(en)]]; du nom commun grec ancien γραμματικός / grammatikós [[wikt:en:γραμματικός#Noun|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">➥ du nom commun γρᾰ́μμᾰ / grámma [[wikt:en:γράμμα#Noun|(en)]], « 1. Ce qui est écrit, ce qui est dessiné. 2. Lettre. 3. (au pluriel) Alphabet. 4. Écriture, livre. »;<br /><p style="margin: 0 2em; text-indent: 30px">➥ du verbe γράφω / gráphō [[wikt:en:γράφω#Ancient_Greek|(en)]], « 1. (Homérique) égratigner, couper en dedans. 2. Dessiner, esquisser, peindre. 3. Écrire. 4. Écrire, proposer une loi. 5. ([[w:Diathèse#Moyen|''voix moyenne'']]) : • (''[[w:Réflexivité_(grammaire)|réflexif]] indirect'') Écrire pour soi, noter ; • Accuser, poursuivre. 6. ([[w:Conjugaison_latine|''passif parfait'']]) Être écrit, être sous forme écrite. »;<br /><p style="margin: 0 2em; text-indent: 30px">➥ + du suffixe nominal de résultat‎ -μα / -ma [[wikt:en:-μα#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ du suffixe adjectival -ῐκός / -ikós, de ou se rapportant à, de la manière de ; « -ique »;<br /><p style="margin: 0 2em; text-indent: 15px">Enseignant responsable de la deuxième étape du système éducatif traditionnel, après l’apprentissage de l’alphabet, la lecture et l’écriture, et l’initiation au calcul avec un abaque chez un ''magister ludi'' [[w:en:Ludi_magister|(en)]] et avant celle de l’art du discours chez un [[w:Rhétorique#Rhétorique_dans_l'Antiquité_grecque|''rhéteur'']]. Le travail du grammairien était d’enseigner la lecture, l’analyse de textes des poètes antiques tels qu’Homère, Tite-Live et Virgile, et la grammaire [https://archive.wikiwix.com/cache/index2.php?url=http%3A%2F%2Fwww.antiquite.ac-versailles.fr%2Feducatio%2Fedrom2.htm#federation=archive.wikiwix.com&tab=url {{Info|<sup>➕</sup>|« L’école du grammaticus », ac-Versailles}}] [https://philo-lettres.fr/latin/rome_vie-quotidienne/ecole-romaine/ {{Info|<sup>➕➕</sup>|« L’École dans l’antiquité romaine, philo-lettres}}]. <br /><br /><p style="margin: 0 2em; text-indent: 15px;">'''[[#polygraphe_back|<span id="polygraphe"><sup>III</sup></span>]] Du nom commun grec ancien [[wikt:polygraphe|πολύγραφος / polýgraphos]], « qui écrit beaucoup de sujets »;<br /><p style="margin: 0 2em; text-indent: 15px">➥ de l’adjectif πολῠ́ς / polús [[wikt:en:πολύς#Ancient_Greek|(en)]], « (de nombre, au pluriel) Beaucoup de : • (avec des noms de multitude) Grand ; • (de quantité, avec des noms de masse) beaucoup de ; • (rare, d'une personne) Grand, puissant ; • (de son) Fort ; • (attributivement, adverbial) Fortement, pleinement ; • (d'espace) Large, grand ; • (de distance) Loin ; • (de temps) Long, en retard. »;<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ du verbe γράφω / gráphō [[wikt:en:γράφω#Ancient_Greek|(en)]], « 1. (Homérique) égratigner, couper en dedans. 2. Dessiner, esquisser, peindre. 3. Écrire. 4. Écrire, proposer une loi. 5. (''voix moyenne'') : • (''réflexif indirect'') Écrire pour soi, noter ; • Accuser, poursuivre. 6. (''passif parfait'') Être écrit, être sous forme écrite. »;<br /><p style="margin: 0 2em; text-indent: 15px;">Le terme semble avoir été employé au cours de l’Antiquité dans un sens différent de celui que nous l’entendons aujourd’hui, pas dans le sens de diversité mais, de façon restreinte, le fait de composer un grand nombre de textes [https://eriac.univ-rouen.fr/la-polygraphie-comme-norme/ {{Info|<sup>➕</sup>|Isabelle Gassino, Université de Rouen et Dimitri Kasprzyk, université de Brest, « Colloque "La polygraphie comme norme" », 16 et 17 novembre 2017.}}].'''<br/><br/></div> {{Boîte déroulante fin}} ==== Livre I ==== ===== <div style="text-align: center;">Chapitre II.</div> ===== <div style="text-align: justify; margin: 0 1em;">Témoignage de '''Thales''' comme : * l’un des premiers ''philosophes grecs'' ayant traité des choses célestes et divines ; * disciple des ''Égyptiens'' et des ''Chaldéens'' (premier témoignage) ; * auteur de court(s)/rare(s) ouvrages (supposément unanimement admis), que les ''Grecs'' considéreraient comme les plus anciens, et douteraient, selon '''Flavius Josèphe''', de leur authenticité.</div> :'''Texte latin''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">qui autem historias apud eos conscribere temptauerunt, id est hi, qui circa '''Cadmum''' ''Milesium'', et '''Acusilaus''' ''Argiuus'' et post hunc quicumque alii fuisse referuntur, paululum tempus ''Persicam'' apud ''Helladium'' militiam praecesserunt. sed etiam eos, qui de caelestibus et diuinis primitus apud ''Graecos philosophati'' sund, id est '''Pherecydem''' ''Syrum'' et '''Pythagoram''' et '''Thaletem''' omnes concorditer confidentur ''Aegyptiorum'' et ''Chaldaeorum'' fuisse discipulos et breuiter conscripsisse quae a ''Graecis'' omnium antiquissima iudicantur ita ut uix ea credant ab illis fuisse conscripta.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[[w:Corpus_scriptorum_ecclesiasticorum_latinorum|<u>Corpus scriptorum ecclesiasticorum latinorum</u>]], [https://verlag.oeaw.ac.at/produkt/flavii-iosephi-opera-ex-versione-latina-antiqua-pars-vi-de-iudaeorum-vetustate-sive-contra-apionem-libri-ii/601067?name=flavii-iosephi-opera-ex-versione-latina-antiqua-pars-vi-de-iudaeorum-vetustate-sive-contra-apionem-libri-ii&product_form=5107 <u>Tome XXXVII, Flavius Iosephus, Contra Apionem</u>], ''Livre I'', ''chap. II.'', ''l.13, 14'', p.64, 1898</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">Οἱ μέντοι τὰς ἱστορίας ἐπιχειρήσαντες συγγράφειν παρ' αὐτοῖς, λέγω δὲ τοὺς περὶ '''Κάδμον''' τε τὸν ''Μιλήσιον'' καὶ τὸν ''Ἀργεῖον'' '''Ἀκουσίλαον''' καὶ μετὰ τοῦτον εἴ τινες ἄλλοι λέγονται γενέσθαι, βραχὺ τῆς ''Περσῶν'' ἐπὶ τὴν ''Ἑλλάδα'' στρατείας τῷ χρόνῳ προύλαβον. Ἀλλὰ μὴν καὶ τοὺς περὶ τῶν οὐρανίων τε καὶ θείων πρώτους παρ' ''Ἕλλησι φιλοσοφήσαντας'', οἷον '''Φερεκύδην''' τε τὸν ''Σύριον'' καὶ '''Πυθαγόραν''' καὶ '''Θάλητα''', πάντες συμφώνως ὁμολογοῦσιν ''Αἰγυπτίων'' καὶ ''Χαλδαίων'' γενομένους μαθητὰς ὀλίγα συγγράψαι, καὶ ταῦτα τοῖς ''Ἕλλησιν'' εἶναι δοκεῖ πάντων ἀρχαιότατα καὶ μόλις αὐτὰ πιστεύουσιν ὑπ' ἐκείνων γεγράφθαι.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://remacle.org/bloodwolf/historiens/Flajose/Apion1gr.htm <u>Φλαίίου Ἰωσήπου, περὶ ἀρχαιότητος Ἰουδαίων</u>, ''λόγος α''], ''chap. II.'', ''l.13, 14'', 1898</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">Quant aux Grecs qui ont entrepris d’écrire l’histoire, comme [[w:Cadmos_de_Milet|'''Cadmos''' de ''Milet'']], [[w:Acousilaos|'''Acousilaos''' d’Argos]] et ceux qu’on cite après lui, ils n’ont vécu que peu de temps [[#Cadmos_NdT_LB|<span id="Cadmos_NdT_LB_back"><sup>1</sup></span>]] avant [[w:Guerres_médiques|''l’expédition des Perses contre la Grèce'']]. Mais bien certainement les premiers ''philosophes grecs'' qui aient traité des choses célestes et divines, comme [[w:Phérécyde_de_Syros|'''Phérécyde''' de ''Syros'']] [[#Phérécyde_de_Syros_NdT_LB|<span id="Phérécyde_de_Syros_NdT_LB_back"><sup>2</sup></span>]], '''Pythagore''' et '''Thalès'''[[#Thales_NdT_LB|<span id="Thales_NdT_LB_back"><sup>3</sup></span>]] furent, tout le monde s’accorde là-dessus, les disciples des ''Égyptiens'' et des ''Chaldéens'' avant de composer leurs courts ouvrages, et ces écrits sont aux yeux des ''Grecs'' les plus anciens de tous ; à peine même les croient-ils authentiques.</div> <table cellspacing=15 style="margin: 0 4em; font-size:85%;"> <tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Cadmos_NdT_LB_back|<span id="Cadmos_NdT_LB"><sup>1.</sup></span>]] En réalité, Cadmos paraît avoir fleuri vers le milieu [[w:VIe_siècle_av._J.-C.|VI<sup>ème</sup> siècle]] [{{Info|AEC|Avant l’Ère Commune}}].''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Phérécyde_de_Syros_NdT_LB_back|<span id="Phérécyde_de_Syros_NdT_LB"><sup>2</sup></span>]] Seul texte qui attribue une origine égyptienne ou chaldéenne aux doctrines de Phérécyde de Syros. Cependant [[w:Theodor_Gomperz|Gompers]], [https://archive.org/details/bub_gb_QrfVAAAAMAAJ/page/n434/mode/1up Griechische Denker, I, 430], identifie ᾿Ογηνός avec l’Ouginna babylonien.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Thales_NdT_LB_back|<span id="Thales_NdT_LB"><sup>3</sup></span>]] On retrouve chez [[w:Apollonios_de_Tyane|Apollonios de Tyane]] ([[w:Jamblique|Jamblique]] [[#Jamblique_back|<sup>⤵️</sup>]], Vit. Pyth. [[#Vie_de_Pythagore_back|<sup>⤵️</sup>]], 12) et [[w:Plutarque|Plutarque]] [[#Plutarque_back|<sup>⤵️</sup>]] l’idée que Thalès de Milet fut disciple des Égyptiens ; l’adjonction des Chaldéens est propre Josèphe.''' </td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/contreapiontexte0000jose/page/n6/mode/1up?view=theater <u>Flavius Josèphe, Contre Apion</u>], ''Livre I'', [https://archive.org/details/contreapiontexte0000jose/page/n49/mode/1up?view=theater&q=Thales ''chap. 2''], traduction du grec ancien par Léon Blum, agrégé des Lettres, professeur au lycée Janson-de-Sailly, texte établi et annotée par [[w:Théodore_Reinach|Théodore Reinach]] Membre de l’[[w:Institut_de_France|Institut]], professeur au Collège de France, 1930<br />(édition bilingue de 1911 également disponible [https://remacle.org/bloodwolf/historiens/Flajose/Apion1.htm ici])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">Quant aux Grecs qui ont entrepris d’écrire l’histoire, comme '''Cadmos''' de ''Milet'', '''Acousilaos''' d’''Argos'' et ceux qu’on nomme après lui, ils n’ont vécu que peu de temps[2] avant l’expédition des ''Perses'' contre la ''Grèce''. [14]. De même, les premiers ''philosophes grecs'' qui aient traité des choses célestes et divines, comme '''Phérécyde''' de ''Syros''[3], '''Pythagore''' et '''Thalès'''[4] furent, tout le monde s’accorde là dessus, les disciples des ''Égyptiens'' et des ''Chaldéens'' avant de composer leurs rares ouvrages, et ces écrits sont aux yeux des ''Grecs'' les plus anciens de tous ; à peine même les croient-ils authentiques.</div> <table cellspacing=15 style="margin: 0 4em; font-size:85%;"> <tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Cadmos_NdT_LB_back|<span id="Cadmos_NdT_LB"><sup>1.</sup></span>]] En réalité, Cadmos paraît avoir fleuri vers le milieu [[w:VIe_siècle_av._J.-C.|VI<sup>ème</sup> siècle]] [{{Info|AEC|Avant l’Ère Commune}}].''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Phérécyde_de_Syros_NdT_LB_back|<span id="Phérécyde_de_Syros_NdT_LB"><sup>2</sup></span>]] Seul texte qui attribue une origine égyptienne ou chaldéenne aux doctrines de Phérécyde de Syros. Cependant [[w:Theodor_Gomperz|Gompers]], [https://archive.org/details/bub_gb_QrfVAAAAMAAJ/page/n434/mode/1up Griechische Denker, I, 430], identifie ᾿Ογηνός avec l’Ouginna babylonien.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Thales_NdT_LB_back|<span id="Thales_NdT_LB"><sup>3</sup></span>]] On retrouve chez [[w:Apollonios_de_Tyane|Apollonios de Tyane]] ([[w:Jamblique|Jamblique]] [[#Jamblique_back|<sup>⤵️</sup>]], Vit. Pyth. [[#Vie_de_Pythagore_back|<sup>⤵️</sup>]], 12) et [[w:Plutarque|Plutarque]] [[#Plutarque_back|<sup>⤵️</sup>]] l’idée que Thalès de Milet fut disciple des Égyptiens ; l’adjonction des Chaldéens est propre Josèphe.''' </td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Flavius Josèphe, De l’ancienneté du peuple juif (Contre Apion)</u>, ''Livre I'', [[s:Page:Flavius_Josephe_-_Leon_Blum_-_Contre_Apion,_Leroux,_Paris,_1902.djvu/17|''Chap. 2'']], traduction de Léon Blum, agrégé des lettres, professeur au lycée du Havre, sous la direction de [[w:Théodore_Reinach|Théodore Reinach]], 1902.</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div> </div> <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Plutarque|'''Plutarque''']] [[#Plutarque|<span id="Plutarque_back"><sup>'''I'''</sup></span>]] == <p style="text-align: right;">([[w:Circa|{{Info|''ca.''|Circa, locution latine que l’on emploie pour indiquer l’approximation d’une date}}]] [[w:45|45]]'' <sup>[[w:Ier_siècle|⏳]]</sup>'', à [[w:Chéronée|Chéronée]] en [[w:Béotie|Béotie]] — {{Info|''ca.''|Circa, locution latine que l’on emploie pour indiquer l’approximation d’une date}} [[w:125|125]]'' <sup>[[w:IIe_siècle|⏳]]</sup>)[[s:Auteur:Plutarque|<sup>📚</sup>]] [[Fichier:Plutarch at Delphi.jpg|vignette|<p style="text-align: justify; text-indent: 15px;">Buste probable de Plutarque du [[w:IIe_siècle|II<sup>ème</sup>]] ou [[w:IIIe_siècle|III<sup>ème</sup>]] siècles {{Info|EC|de l’Ère Commune}}, en marbre de [[w:Marbre_de_Paros|''Paros'']].<br /><p style="text-align: justify; text-indent: 15px;">Provenance : découvert lors de fouilles près de l’angle sud-est du [[w:Temple d'Apollon (Delphes)|''temple d’Apollon'']] de [[w:Delphes|''Delphes'']], au côté d'une [[w:Fichier:Plutarch_stele_inscription_100_AD,_AM_of_Delphi_4070060092.jpg|''stèle'']] portant une inscription gravée : ΔΕΛΦΟΙ ΧΑΙΡΩΝΕΥΣΙΝ ΟΜΟΥ ΠΛΟΥΤΑΡΧΟΝ ΕΘΗΚΑΝ ΤΟΙΣ ΑΜΦΙΚΤΥΟΝΩΝ ΔΟΓΜΑΣΙ ΠΕΙΘΟΜΕΝΟΙ — Les ''Delphiens'', avec les ''Chéronéens'', dédièrent ce(tte image de) Plutarque, suivant les préceptes de l’[[w:Amphictyonie|''Amphictyonie'']].<br /><p style="text-align: justify; text-indent: 15px;">Exposition : Salle XIV, [[w:Mus%C3%A9e_arch%C3%A9ologique_de_Delphes|''Musée archéologique de Delphes'']].]] <div style="text-align: justify; margin: 0 1em; text-indent: 15px">Biographe, philosophe et moraliste grec, auteur d’une œuvre importante, comportant un ensemble varié de traités et de dialogues consacrés à des questions de philosophie morale, mais abordant aussi des sujets littéraires, politiques, scientifiques, religieux.</div> {{Boîte déroulante début|titre=NdA Plutarque|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Plutarque_back|<span id="Plutarque"><sup>I</sup></span>]] Du nom propre grec ancien πλούταρχος / ploútarkhos [[wikt:en:Πλούταρχος#Ancient_Greek|(en)]], « maître des richesses » ; <br /><p style="margin: 0 2em; text-indent: 15px">➥ du nom commun πλοῦτος / ploûtos [[wikt:en:πλοῦτος#Ancient_Greek|(en)]], « richesses » ;<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ du nom commun ἀρχός / arkhós, « souverain, chef, prince »)'''<br/><br/></div> {{Boîte déroulante fin}} {{Boîte déroulante début|titre=Remarque|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>''' Dans la ''Vie de [[w:Lycurgue_(législateur)|Lycurgue]]'' et la ''Vie d’Agis et Cléomène'' (''Vies parallèles''), et le traité ''Un philosophe doit surtout converser avec les princes'' (''Œuvres morales''), il est fait mention d’un Thalès : il s’agit de [[w:Thalétas|Thalétas]], aussi appelé Thalès de [[w:Crète|''Crète'']], un musicien et poète, originaire de la cité de [[w:Gortyne|''Gortyne'']] en ''Crète'', et actif à la fin du [[w:VIIIe_siècle_av._J.-C.|VIII<sup>ème</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]] et au début du siècle suivant.'''<br/><br/></div> {{Boîte déroulante fin}} === [[w:Vies_parallèles|Vies parallèles]] [[#Vies_parallèles|<span id="Vies_parallèles_back"><sup>'''I'''</sup></span>]] === <div style="text-align: center; margin: 0 1em;">Recueil de 50 biographies de grands hommes de l’histoire, dont 46 présentées par paires : un ''Grec'' mis en parallèle avec un ''Romain''.</div> {{Boîte déroulante début|titre=NdA Vies parallèles|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Vies_parallèles_back|<span id="Vies_parallèles"><sup>I</sup></span>]] Du grec ancien Βίοι Παράλληλοι / Bíoi Parállêloi'''<br/><br/></div> {{Boîte déroulante fin}} ==== Vie de [[w:Solon|'''Solon''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Solon|<sup>🔄</sup>]] ==== <div style="text-align: center; margin: 0 1em;">Biographie de '''Solon''', qui précède celle de [[w:Publius_Valerius_Publicola_(consul_en_-509)|'''Publicola''']] [[#Publicola|<span id="Publicola_back"><sup>'''I'''</sup></span>]], et avec laquelle '''Plutarque''' la compare.</div> {{Boîte déroulante début|titre=NdA Vie de Solon|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Publicola_back|<span id="Publicola"><sup>I</sup></span>]] [[w:Nom_romain|Tria Nomina]] en latin {{Info|Publius|praenomen, nom individuel du citoyen romain}} {{Info|Valerius|nomen, nom de famille}} {{Info|Publicola ou Poplicola|cognomen, surnom héréditaire, servant à distinguer les diverses branches d’une même gens}}, « celui qui prend soin de l’armée. »[https://academic.oup.com/bics/advance-article/doi/10.1093/bics/qbaf002/8117642?login=false {{Info|<sup>🔍</sup>|M. Gallo, « Misinterpreting a compound name. The origin of the agnomen Publicola in Dionysius of Halicarnassus and Plutarch », Bulletin of the Institute of Classical Studies,‎ 22 avril 2025}}].<br /><p style="margin: 0 2em; text-indent: 15px">[[w:Consul_(Rome_antique)|Consul]] de la [[w:république_romaine|''République Romaine'']], à quatre reprises : en [[w:-509|-509]], [[w:-508|-508]], [[w:-507|-507]] et [[w:-504|-504]], et l’un des instaurateurs légendaires de la ''République Romaine'' en -509, suite au viol et au suicide de [[w:Lucrèce_(dame_romaine)|Lucrèce]], une femme aristocratique ''romaine'', par [[w:Sextus_Tarquin|Sextus Tarquin]], le fils du dernier [[w:Roi_de_Rome|roi de ''Rome'']] [[w:Tarquin_le_Superbe|Tarquin le Superbe]].<br /><p style="text-align: right; margin: 0 2em;">(date et lieu de naissance inconnu.e.s — [[w:-503|-503]], soit sur le champ de bataille pendant les [[w:Guerres_romano-sabelliennes|''guerres romano-sabelliennes'']], soit de maladie)<sup>[[w:VIe_siècle_av._J.-C.|⏳]]</sup> '''<br/><br/></div> {{Boîte déroulante fin}} ===== <div style="text-align: center;">Chapitre II.</div> ===== ====== <div style="text-align: center;">Paragraphe III.</div> ====== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage de '''Thalès''' ''commerçant''</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''III.''' Κωλύει δὲ οὐδὲν τὸν ἀγαθὸν καὶ πολιτικὸν ἄνδρα μήτε τῶν περιττῶν τὴν κτῆσιν ἐν σπουδῇ τίθεσθαι μήτε τῆς χρείας τῶν ἀναγκαίων καὶ ἱκανῶν καταφρονεῖν. Ἐν δὲ τοῖς τότε χρόνοις, καθ' Ἡσίοδον, ἔργον οὐδὲν ἦν ὄνειδος, οὐδὲ τέχνη διαφορὰν ἔφερεν, ἐμπορία δὲ καὶ δόξαν εἶχεν οἰκειουμένη τὰ βαρβαρικὰ καὶ προξενοῦσα φιλίας βασιλέων καὶ πραγμάτων ἐμπείρους ποιοῦσα πολλῶν. Ἔνιοι δὲ καὶ πόλεων οἰκισταὶ γεγόνασι μεγάλων, ὡς καὶ Μασσαλίας Πρῶτις ὑπὸ Κελτῶν τῶν περὶ τὸν Ῥοδανὸν ἀγαπηθείς. Καὶ Θαλῆν δέ φασιν ἐμπορίᾳ χρήσασθαι καὶ Ἱπποκράτην τὸν μαθηματικόν, καὶ Πλάτωνι τῆς ἀποδημίας ἐφόδιον ἐλαίου τινὸς ἐν Αἰγύπτῳ διάθεσιν γενέσθαι.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm <u>Plutarque, Vie de Solon</u>], ''chap. II'', ''§3'', traduction par [[w:Dominique_Ricard|Dominique Ricard]], 1844<br />(également disponible une édition de 1853 [https://remacle.org/bloodwolf/historiens/Plutarque/solonpierrron.htm ici] et de 1862 [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f16.item là])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 390px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''III.''' Mais rien n’empêche l’homme de bien, le citoyen dévoué à son pays, de garder un juste milieu : il peut ne point s’attacher à la poursuite du superflu, sans pour cela mépriser le nécessaire et ce qui suffit à ses besoins.<br />Dans ce temps-là, pour parler comme [[w:Hésiode|'''Hésiode''']] [[#Hésiode|<span id="Hésiode_back"><sup>'''I'''</sup></span>]] [[#Hésiode_NdT_AP|<span id="Hésiode_NdT_AP_back"><sup>1</sup></span>]], il n’y avait pas de travail qui fût honteux; aucun art ne mettait de différence entre les hommes : le négoce surtout était honoré, qui met en possession des avantages dont jouissent les étrangers, gagne l’amitié des rois, et donne une grande expérience. On a même vu des trafiquants fonder de grandes villes : ainsi [[w:Mythe_fondateur_de_Marseille|'''Protis''']] bâtit [[w:Marseille_antique|''Marseille'']], après s'être concilié l’amitié des ''Gaulois'' qui habitent les bords du [[w:Rhône#Histoire|''Rhône'']]. '''Thales''' se livra, dit-on, au négoce, ainsi qu’[[w:Hippocrate_de_Chios|'''Hippocrate''']] [[#Hippocrate|<span id="Hippocrate_back"><sup>'''II'''</sup></span>]] le mathématicien[[#Hippocrate_NdT_AP|<span id="Hippocrate_NdT_AP_back"><sup>2</sup></span>]] ; et [[w:Platon|'''Platon''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Platon|<sup>🔄</sup>]] vendit de l’huile en [[w:Basse_Époque|''Égypte'']] , pour fournir aux frais de son voyage.</div> <table cellspacing=15 style="margin: 0 4em; font-size:85%;"> <tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Hésiode_NdT_AP_back|<span id="Hésiode_NdT_AP"><sup>1.</sup></span>]] Œuvres et Jours, vers 309.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Hippocrate_NdT_AP_back|<span id="Hippocrate_NdT_AP"><sup>2</sup></span>]] Cet Hippocrate n’est point connu d’ailleurs.''' </td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/viesdeshommesill01plut/page/n6/mode/1up?view=theater <u>Vie des Hommes Illustres de Plutarque</u>], [https://archive.org/details/viesdeshommesill01plut/page/182/mode/1up?view=theater ''Solon''], ''Chap. II'', ''§3'', [https://archive.org/details/viesdeshommesill01plut/page/184/mode/1up?view=theater p.184], traduit par [[w:Alexis_Pierron|Alexis Pierron]], professeur au lycée Louis-le-Grand, 1877<br />(également disponible une édition de 1853 [[s:Vies_des_hommes_illustres/Solon|ici]])</div> {{Boîte déroulante début|titre=NdA trad. par Alexis Pierron de 1877|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Hésiode_back|<span id="Hésiode"><sup>I</sup></span>]] Du nom propre grec ancien Ἡσῐ́οδος / Hēsĭ́odos [[wikt:en:Ἡσίοδος#Ancient_Greek|(en)]].<br /><p style="margin: 0 2em; text-indent: 15px">Berger sur les pentes du Mont [[w:Mont_Hélicon|Hélicon]] et un des plus grands poètes grecs. Il s’agit plus précisément d’un ''aède'' (il « chante » ses vers avec sa lyre) et un ''rhapsode'' (il « coud » des chants entre eux)[https://odysseum.eduscol.education.fr/hesiode-un-des-premiers-poetes-grecs {{Info|<sup>🔍</sup>|Hésiode, un des premiers poètes grecs - Odysseum, la maison numérique des Humanités}}]. <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Hippocrate_back|<span id="Hippocrate"><sup>II</sup></span>]] Du nom propre grec ancien Ῐ̔πποκρᾰ́της / Hĭppokrắtēs [[wikt:en:Ἱπποκράτης#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">➥ du nom commun ῐ̔́ππος / hĭ́ppos [[wikt:en:ἵππος#Ancient_Greek|(en)]], « cheval »;<br /><p style="margin: 0 2em; text-indent: 15px">➥ + du nom commun‎ κρᾰ́τος / krắtos [[wikt:en:κράτος#Ancient_Greek|(en)]], « 1. Puissance, force. 2. Acte de force, acte de bravoure. 3. (au pluriel) Actes de violence. 4. Domination, pouvoir. »;<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ du suffixe nominal -ης / -ēs.<br /><p style="margin: 0 2em; text-indent: 15px"> Mathématicien (géomètre) et astronome « para-pythagoricien », dont l’œuvre ne nous est pas parvenue.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] milieu du [[w:Ve_siècle_av._J.-C.|V<sup>ème</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]]) [https://books.google.fr/books?id=DrvWAAAAMAAJ&newbks=1&newbks_redir=0&lpg=PA764&vq=Hippocrate&dq=bibliogroup%3A%22Dictionnaire%20des%20philosophes%20antiques%22&hl=fr&pg=PA764#v=onepage&q&f=true {{Info|<sup>🔍</sup>|Dictionnaire des Philosophes Antiques, publié sous la direction de Richard Goulet, Volume III, §151 - Hippocrate de Chios}}]'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: center; margin: 0 2em;">'''II. Dans sa jeunesse il se livre au commerce maritime; la modicité de sa fortune et son goût pour la sagesse l’y décident. Faveur du commerce à cette époque ; grands noms qui l’ont illustré.'''<br /><br /><p style="text-align: justify; text-indent: 15px;">Mais rien n’empêche qu’un homme de bien, un sage politique tienne à cet égard un juste milieu, et que sans rechercher des richesses superflues, il ne méprise pas celles qui sont nécessaires et qui suffisent. Dans ce temps-là, comme dit [[w:Hésiode|'''Hésiode''']], aucun travail n’était regardé comme honteux; aucun art ne mettait de différence entre les hommes. Le commerce maritime surtout était honorable; il ouvrait des communications utiles avec les nations étrangères, procurait des alliances avec les rois, et donnait une grande expérience. On a même vu des commerçants fonder de grandes villes. Ainsi '''Protus''' gagna l’amitié des Gaulois qui habitaient les bords du ''Rhône'', et bâtit ''Marseille''. '''Thalès''' et '''Hippocrate''' le mathématicien firent aussi le commerce ; et '''Platon''' vendit de l’huile en ''Égypte'' pour fournir aux frais de son voyage.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f16.item ''chap. II''], traduction correcte et précédée du texte grec, par une société de professeurs et d’helléniste, 1862<br />(également disponible une édition de 1844 [https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm#1a ici] et de 1829 [[s:Les_Vies_des_hommes_illustres/Vie_de_Solon|là]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">Mais rien n’empêche l’homme de-bien et l’homme politique ni se mettre en souci (rechercher) l’acquisition des choses superflues, ni mépriser l’usage des choses nécessaires et suffisantes. Or dans les temps d’alors, selon '''Hésiode''', aucun travail n’était sujet-de-honte, ni aucun métier n’apportait de différence entre les citoyens mais même le commerce-maritime avait de la gloire, rendant-amies les nations-barbares, et procurant des amitiés de rois, et faisant les hommes expérimentés d’affaires nombreuses. Et quelques-uns aussi sont devenus fondateurs de grandes villes, comme aussi le '''Protus''' de ''Marseille'' ayant été aimé par les ''Celtes'' ceux autour du ''Rhône''. Et on dit aussi '''Thalès''', avoir fait-usage du commerce-maritime et '''Hippocrate''' le mathématicien, et la vente d'une certaine huile en ''Égypte'' avoir été pour '''Platon''' ressource du voyage.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f16.item ''chap. II''], traduction littérale et juxtalinéaire présentant le mot à mot français en regard des mots grecs correspondants, par une société de professeurs et d’helléniste, 1862</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ====== <div style="text-align: center;">Paragraphe IV.</div> ====== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage de la sagesse de '''Thalès''' en ''philosophie naturelle''</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''IV.''' Φιλοσοφίας δὲ τοῦ ἠθικοῦ μάλιστα τὸ πολιτικόν, ὥσπερ οἱ πλεῖστοι τῶν σοφῶν, ἠγάπησεν. Ἐν δὲ τοῖς φυσικοῖς ἁπλοῦς ἐστι λίαν καὶ ἀρχαῖος, ὡς δῆλον ἐκ τούτων· [...].<br /><p style="text-indent: 15px">Καὶ ὅλως ἔοικεν ἡ Θάλεω μόνου σοφία τότε περαιτέρω τῆς χρείας ἐξικέσθαι τῇ θεωρίᾳ· τοῖς δὲ ἄλλοις ἀπὸ τῆς πολιτικῆς ἀρετῆς τοὔνομα τῆς σοφίας ὑπῆρξε.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm <u>Plutarque, Vie de Solon</u>], ''chap. II'', ''§4'', traduction par [[w:Dominique_Ricard|Dominique Ricard]], 1844<br />(également disponible une édition de 1853 [https://remacle.org/bloodwolf/historiens/Plutarque/solonpierrron.htm ici] et de 1862 [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f20.item là])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 390px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''IV.''' Il s’attacha, comme presque tous les sages d’alors, à cette partie de la philosophie morale qui traite de la politique. Pour la philosophie naturelle, il en était aux rudiments, et aux notions du vieux temps sans plus; [...].<br /><p style="text-indent: 15px;">Aussi bien n’y eut-il, en somme, que '''Thalès''' dont la science dépassât alors les notions d’un usage vulgaire : tous les autres ne durent qu’à leurs connaissances politiques leur réputation de sagesse.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/viesdeshommesill01plut/page/n6/mode/1up?view=theater <u>Vie des Hommes Illustres de Plutarque</u>], [https://archive.org/details/viesdeshommesill01plut/page/182/mode/1up?view=theater ''Solon''], ''Chap. II'', ''§4'', [https://archive.org/details/viesdeshommesill01plut/page/185/mode/1up?view=theater p.185], traduit par [[w:Alexis_Pierron|Alexis Pierron]], professeur au lycée Louis-le-Grand, 1877<br />(également disponible une édition de 1853 [[s:Vies_des_hommes_illustres/Solon|ici]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">A l’exemple des sages de son temps, il cultiva principalement cette partie de la morale qui traite de la politique. Il n’avait en physique que des connaissances très-superficielles, et en était aux premiers éléments de cette science, [...].<br/><p style="text-indent: 15px">En général '''Thalès''' fut, de tous les sages d’alors, le seul qui porta au delà des besoins de la vie la théorie des sciences ; tous les autres ne durent qu’à leurs connaissances politiques leur réputation de sagesse.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f20.item ''chap. II''], traduction correcte et précédée du texte grec, par une société de professeurs et d’helléniste, 1862<br />(également disponible une édition de 1844 [https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm#1a ici] et de 1829 [[s:Les_Vies_des_hommes_illustres/Vie_de_Solon|là]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">Mais de la partie morale de la philosophie il embrassa surtout la partie politique, comme la plupart des sages d’alors. Mais dans les sciences physiques il est extrêmement simple (ignorant) et primitif, [...]. Et en-un-mot la science de '''Thalès''' seul paraît s’être avancée alors par la théorie plus loin que le besoin ; et le nom de la science a appartenu aux autres par-suite des qualités politiques.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f21.item ''chap. II''], traduction littérale et juxtalinéaire présentant le mot à mot français en regard des mots grecs correspondants, par une société de professeurs et d’helléniste, 1862</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ====== <div style="text-align: center;">Paragraphe V.</div> ====== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Version alternative du récit de la coupe de [[w:Bathyclès_de_Magnésie|'''Bathyclès''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Bathyclès_back|<sup>🔄</sup>]] par [[w:Callimaque_de_Cyrène|'''Callimaque''']] de [[w:Cyrène|''Cyrène'']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Callimaque_back|<sup>🔄</sup>]].</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''V.''' Γενέσθαι δὲ μετ' ἀλλήλων ἔν τε Δελφοῖς ὁμοῦ λέγονται καὶ πάλιν ἐν Κορίνθῳ, Περιάνδρου σύλλογόν τινα κοινὸν αὐτῶν καὶ συμπόσιον κατασκευάσαντος. Ἔτι δὲ μᾶλλον εἰς ἀξίωμα καὶ δόξαν αὐτοὺς κατέστησεν ἡ τοῦ [[w:τρίπους#Grec_ancien|'''τρίποδος''']] περίοδος καὶ διὰ πάντων ἀνακύκλησις καὶ ἀνθύπειξις μετ' εὐμενείας φιλοτίμου γενομένη. Κῴων γάρ, ὥς φασι, καταγόντων σαγήνην, καὶ ξένων ἐκ Μιλήτου πριαμένων τὸν βόλον οὔπω φανερὸν ὄντα, χρυσοῦς ἐφάνη τρίπους ἑλκόμενος, ὃν λέγουσιν Ἑλένην πλέουσαν ἐκ Τροίας αὐτόθι καθεῖναι χρησμοῦ τινος ἀναμνησθεῖσαν παλαιοῦ. Γενομένης δὲ τοῖς ξένοις πρῶτον ἀντιλογίας πρὸς τοὺς ἁλιέας περὶ τοῦ τρίποδος, εἶτα τῶν πόλεων ἀναδεξαμένων τὴν διαφορὰν ἄχρι πολέμου προελθοῦσαν, ἀνεῖλεν ἀμφοτέροις ἡ Πυθία τῷ σοφωτάτῳ τὸν τρίποδα ἀποδοῦναι. Καὶ πρῶτον μὲν ἀπεστάλη πρὸς Θαλῆν εἰς Μίλητον, ἑκουσίως τῶν Κῴων ἑνὶ δωρουμένων ἐκείνῳ περὶ οὗ πρὸς ἅπαντας ὁμοῦ Μιλησίους ἐπολέμησαν. Θάλεω δὲ Βίαντα σοφώτερον ἀποφαίνοντος αὑτοῦ πρὸς ἐκεῖνον ἧκεν· ἀπ' ἐκείνου δ' αὖθις ἀπεστάλη πρὸς ἄλλον ὡς σοφώτερον. Εἶτα περιϊὼν καὶ ἀναπεμπόμενος οὕτως ἐπὶ Θαλῆν τὸ δεύτερον ἀφίκετο, καὶ τέλος εἰς Θήβας ἐκ Μιλήτου κομισθεὶς τῷ Ἰσμηνίῳ Ἀπόλλωνι καθιερώθη. Θεόφραστος δέ φησι,πρῶτον μὲν εἰς Πριήνην Βίαντι τὸν τρίποδα πεμφθῆναι, δεύτερον δ' εἰς Μίλητον Θαλῇ Βίαντος ἀποπέμψαντος· οὕτω δὲ διὰ πάντων πάλιν εἰς Βίαντα περιελθεῖν, τέλος δὲ εἰς Δελφοὺς ἀποσταλῆναι. Ταῦτα μὲν οὖν ὑπὸ πλειόνων τεθρύληται, πλὴν ὅτι τὸ δῶρον ἀντὶ τοῦ τρίποδος οἱ μὲν φιάλην ὑπὸ Κροίσου πεμφθεῖσαν, οἱ δὲ ποτήριον Βαθυκλέους ἀπολιπόντος εἶναι λέγουσιν.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm <u>Plutarque, Vie de Solon</u>], ''chap. II'', ''§5'', traduction par [[w:Dominique_Ricard|Dominique Ricard]], 1844<br />(également disponible une édition de 1853 [https://remacle.org/bloodwolf/historiens/Plutarque/solonpierrron.htm ici] et de 1862 [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f22.item là])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 390px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''V.''' On raconte que les sept sages se réunirent une fois à [[w:Delphes|''Delphes'']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Delphes_back|<sup>🔄</sup>]], et une autre fois à [[w:Histoire_de_Corinthe_dans_l%27Antiquité|''Corinthe'']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Corinthe_back|<sup>🔄</sup>]], où [[w:Périandre|'''Périandre''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Périandre_back|<sup>🔄</sup>]] les avait convoqués pour leur offrir un banquet. Rien ne contribua tant à leur réputation et à leur gloire, que le renvoi qu’ils se firent successivement l’un à l’autre du trépied d’or, et l’honorable humilité avec laquelle ils refusèrent le prix tour à tour. Des hommes de [[w:Kos_(Dodécanèse)#Kos_à_l'époque_hellénistique|''Cos'']] [[#Cos|<span id="Cos_back"><sup>'''I'''</sup></span>]] venaient, dit-on, de jeter leur filet en mer : des étrangers de ''Milet'' achetèrent le coup, avant que les pêcheurs y eussent regardé. Il se trouva, dans le filet, un trépied d’or qu’[[w:Hélène_(mythologie)|'''Hélène''']] [[#Hélène|<span id="Hélène_back"><sup>'''II'''</sup></span>]], à ce qu’on prétend, pour obéir à un ancien oracle, avait jeté dans la mer à son retour de [[w:Troie|''Troie'']] [[#Troie|<span id="Troie_back"><sup>'''III'''</sup></span>]]. Ce fut un sujet de débat, d’abord entre les pêcheurs et les étrangers, ensuite entre les deux villes, qui prirent parti dans la querelle : la guerre allait s’allumer, lorsque la [[w:Pythie|''Pythie'']] [[#Pythie|<span id="Pythie_back"><sup>'''IV'''</sup></span>]], que les deux partis avaient consultée, commanda de donner le trépied au plus sage. On l’envoya d’abord à ''Milet'', pour '''Thalès''', et ceux de ''Cos'' cédèrent sans peine à un seul particulier ce qu’ils allaient disputer par les armes à tous les ''Milésiens'' ensemble. '''Thalès''' déclara que [[w:Bias_de_Priène|'''Bias''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Bias_back|<sup>🔄</sup>]] était plus sage que lui, et le lui fit passer. '''Bias''', avec la même modestie, le fit passer à un autre; et le trépied, après avoir été envoyé successivement à tous les sept, revint une seconde fois à '''Thalès'''. Enfin, il fut transporté de ''Milet'' à [[w:Thèbes_(Grèce)|''Thèbes'']] [[#Thèbes|<span id="Thèbes_back"><sup>'''V'''</sup></span>]], et consacré à Apollon [[w:en:Ismenus|''Isménien'']]. Cependant [[w:Théophaste|'''Théophaste''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Théophaste_back|<sup>🔄</sup>]] dit qu’on envoya le trépied d’abord à '''Bias''', dans ''Priène'' ; que '''Bias''' le fit porter à '''Thalès''' ; qu’après avoir passé alternativement chez tous les sages, il revint à '''Bias''', et qu’il finit par être envoyé à ''Delphes''. Telle est la tradition commune : seulement quelques-uns prétendent qu’il s’agissait de décerner non point un trépied, mais un vase que [[w:Crésus|'''Crésus''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Crésus_back|<sup>🔄</sup>]] avait envoyé ; et, suivant d’autres, c’était une coupe, héritage de '''Bathyclès'''.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/viesdeshommesill01plut/page/n6/mode/1up?view=theater <u>Vie des Hommes Illustres de Plutarque</u>], [https://archive.org/details/viesdeshommesill01plut/page/182/mode/1up?view=theater ''Solon''], ''Chap. II'', ''§5'', [https://archive.org/details/viesdeshommesill01plut/page/185/mode/1up?view=theater p.185], traduit par [[w:Alexis_Pierron|Alexis Pierron]], professeur au lycée Louis-le-Grand, 1877<br />(également disponible une édition de 1853 [[s:Vies_des_hommes_illustres/Solon|ici]])</div> {{Boîte déroulante début|titre=NdA trad. par Alexis Pierron de 1877|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Cos_back|<span id="Cos"><sup>I</sup></span>]] Du nom propre grec ancien Κῶς / Kôs [[wikt:en:Κῶς#Ancient_Greek|(en)]] ;<br /><p style="margin: 0 2em; text-indent: 15px">Île grecque l’archipel du [[w:Dodécanèse|''Dodécanèse'']], au Sud-Est de la [[w:Mer_Égée|''mer Égée'']], au large des côtes ''turques''. <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Hélène_back|<span id="Hélène"><sup>II</sup></span>]] Du nom propre grec ancien Ἑλένη / Helénē [[wikt:en:Ἑλένη#Ancient_Greek|(en)]] ;<br /><p style="margin: 0 2em; text-indent: 15px">Fille de [[w:Zeus|Zeus]] et de [[w:Léda (mythologie)|Léda]], considérée comme la plus belle femme du monde, uniquement surpassée par la déesse [[w:Aphrodite|Aphrodite]]. Elle est mariée à [[w:Ménélas|Ménélas]], roi de [[w:Sparte|Sparte]], et est enlevée par [[w:Pâris|Pâris]], prince [[w:Troie|''troyen'']] [[#Troie|<sup>'''III'''</sup>]], ce qui déclencha la [[w:guerre de Troie|guerre de Troie]] qui opposa ''Grecs'' et ''Troyens''. <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Troie_back|<span id="Troie"><sup>III</sup></span>]] Du nom propre grec ancien Τροίᾱ / Troíā [[wikt:en:Τροία#Ancient_Greek|(en)]] ; [[w:Troie#Toponymie|''toponymie incertaine'']] ;<br /><p style="margin: 0 2em; text-indent: 15px"> Cité semi-légendaire, située sur la colline d’''[[w:site archéologique de Troie|{{lang|tr|Hisarlık}}]]'', à l’entrée de l’''[[w:Hellespont|Hellespont]]'', non loin de la ''[[w:mer Égée|mer Égée]]'', au nord-ouest de la ''péninsule anatolienne'', dans la région ''[[w:Troade|Troade]]'' en ''[[w:Asie Mineure|Asie Mineure]]''.<br /><p style="margin: 0 2em; text-indent: 15px"> Le site a fait l’objet de nombreuses campagnes de fouilles, à la suite de celles entreprises par [[w:Heinrich Schliemann|Heinrich Schliemann]] en 1870, ponctuées par des découvertes fortement médiatisées, qui ont popularisé son identification avec la Troie homérique (qui reste un sujet de débat en l’absence de preuve décisive), le lieu principal des événements du ''[[w:cycle troyen|cycle troyen]]'' rapportés dans les ''[[w:Épopée|poèmes épiques]]'' ''[[w:Homère|homériques]]'' l’''[[w:Iliade|Iliade]]'' et l’''[[w:Odyssée|Odyssée]]''. <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Pythie_back|<span id="Pythie"><sup>IV</sup></span>]] Du nom commun grec ancien Πῡθῐ́ᾱ / Pūthĭ́ā,<br /><p style="margin: 0 2em; text-indent: 15px">➥ du nom propre Πῡθώ / Pūthṓ, « [[w:Delphes#Histoire_du_site|''Pythô'']], ancien nom de ''Delphes'' » ;<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ du suffixe adjectival féminin -ῐος / -ĭos [[wikt:en:-ιος#Ancient_Greek|(en)]], « relatif à, appartenant à (de) ».<br /><p style="margin: 0 2em; text-indent: 15px">[[w:Divination_dans_la_Grèce_antique|''Oracle'']] du [[w:Temple_d%27Apollon_(Delphes)|''temple d’Apollon'']] à ''Delphes''.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:XIVe_siècle_av._J.-C.|XIV<sup>ème</sup>]]/[[w:VIIIe_siècle_av._J.-C.|VIII<sup>ème</sup>]] siècles {{Info|AEC|Avant l’Ère Commune}} — [[w:IVe_siècle_av._J.-C.|IV<sup>ème</sup> siècle {{Info|EC|de l’Ère Commune}}]]) <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Thèbes_back|<span id="Thèbes"><sup>V</sup></span>]] Du nom propre grec ancien Θῆβαι / Thêbai [[w:Θῆβαι#Ancient_Greek|(en)]], désigne indistinctement la cité ''grecque'' comme [[w:Thèbes_(Égypte)|celle ''égyptienne'']] ; mais leur étymologie diffère : pour celle de la cité grecque, de l’[[w:Ionien-attique|''ionien-attique'']] Θήβη / Thḗbē ; du grec mycénien 𐀳𐀣 / te-qa (/Tʰēgʷā/) ;<br /><p style="margin: 0 2em; text-indent: 15px">Cité grecque de la région de [[w:Béotie#Antiquité|''Béotie'']], au centre de la ''Grèce''.'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">On raconte que les sept sages se trouvèrent un jour ensemble à ''Delphes'', et une autre fois à ''Corinthe'', chez '''Périandre''', qui les avait réunis pour un banquet. Rien ne contribua autant à leur réputation et à leur gloire, que la modestie empressée avec laquelle ils se renvoyèrent l’un à l’autre le trépied d’or. Des ''Milésiens'' qui se trouvaient à l’île de ''Cos'', avaient acheté d’avance de quelques pêcheurs ce que retirerait de l’eau le filet qu’ils allaient y jeter. Quand on l’eut tiré, il s’y trouva un trépied d’or qu’'''Hélène''', à ce qu’on prétend, pour obéir à un oracle, avait jeté dans la mer, à son retour de ''Troie''. Cet incident donna lieu à une vive dispute d’abord entre les pêcheurs et les étrangers, ensuite entre les deux villes, qui prirent parti dans la querelle et étaient près d’en venir aux mains, lorsque la ''Pythie'' consultée leur ordonna de porter ce trépied au plus sage. On l’envoya d’abord à '''Thalès''', et ceux de ''Cos'' cédèrent sans peine à un seul particulier ce qu’ils allaient disputer par les armes à tous les ''Milésiens'' ensemble. '''Thalès''' le renvoya à '''Bias''', qui, disait-il, était plus sage que lui ; '''Bias''', avec la même modestie, le fit passer à un autre ; et après avoir été envoyé successivement à tous les sept, il revint une seconde fois à '''Thalès''' : enfin il fut porté à ''Thèbes'', et consacré à ''Apollon Isménien''. '''Théophraste''' dit qu’on l’envoya d’abord à '''Bias''', qui demeurait à ''Priène'' ; que '''Bias''' le fit porter à '''Thalès''' ; qu’après avoir été envoyé alternativement à tous les sages, il revint à '''Bias''', et qu’enfin il fut porté à ''Delphes''. Telle est la tradition la plus commune sur ce fait ; seulement quelques auteurs disent que ce n’était pas un trépied, mais un vase que '''Crésus''' envoyait à ''Delphes''; suivant d’autres, c’était une coupe que '''Bathyclès''' avait laissée.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f22.item ''chap. II''], traduction correcte et précédée du texte grec, par une société de professeurs et d’helléniste, 1862<br />(également disponible une édition de 1844 [https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm#1a ici] et de 1829 [[s:Les_Vies_des_hommes_illustres/Vie_de_Solon|là]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">Or ils (les sept sages) sont dits s’être trouvés aussi ensemble les uns avec les autres et à ''Delphes'' et de nouveau à ''Corinthe'', '''Périandre''' ayant préparé une certaine réunion commune d’eux et un banquet. Or le tour du trépied, et sa circulation à travers tous et sa cession se faisant avec une bienveillance pleine-d’émulation mit eux encore davantage en considération et renommée. Car des ''habitants-de-Cos'', comme on dit, jetant le filet, et des hôtes venus de ''Milet'' ayant acheté le coup qui n’était pas encore apparent, un trépied d’-or apparut étant retiré, lequel on dit '''Hélène''' naviguant pour revenir de ''Troie'' avoir jeté là, s’étant souvenue d’un certain oracle ancien. Mais une contestation ayant eu lieu d’abord aux hôtes vis-à-vis des pécheurs au sujet du trépied, ensuite les villes ayant pris-sur-elles le différend qui alla jusqu'à une guerre, la ''Pythie'' répondit aux-uns-et-aux-autres de donner le trépied au plus sage des hommes. Et d’abord il fut envoyé à '''Thalès''' à ''Milet'', les ''habitants-de-Cos'' donnant volontairement à celui-là seul le trépied, au sujet duquel ils avaient fait-la-guerre contre tous les ''Milésiens'' à-la-fois. Mais '''Thalès''' déclarant '''Bias''' plus sage que lui-même, il renvoya vers celui-là. Et de nouveau il fut envoyé par celui-là vers un autre, comme plus sage. Ensuite faisant-le-tour et étant envoyé-successivement ainsi il arriva pour la seconde fois à '''Thalès''' ; et à la fin transporté de ''Milet'' à ''Thèbes'', il fut consacré à ''Apollon Isménien''. Mais '''Théophraste''' dit le trépied avoir été envoyé d’abord à la vérité à ''Priène'' à '''Bias''', mais en-second-lieu à ''Milet'' à '''Thalès''', '''Bias''' l’ayant renvoyé ; et ainsi à travers tous (de l’un à l’autre) être venu-en-faisant-le-tour de nouveau à '''Bias''', et à la fin avoir été envoyé à ''Delphes''. Ces choses donc ont été répandues par plusieurs, excepté qu’ils disent le présent au lieu du trépied les uns être un vase à boire envoyé par '''Crésus''', les autres une coupe. '''Bathyclès''' rayant laissée (laissée par '''Bathyclès'''). </div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f23.item ''chap. II''], traduction littérale et juxtalinéaire présentant le mot à mot français en regard des mots grecs correspondants, par une société de professeurs et d’helléniste, 1862</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Chapitre VI.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;"> Récit d’une entrevue de '''Thalès''' avec '''Solon''', de son stoïcisme, de son célibat et de l’adoption du fils de sa sœur, '''Cybistus'''.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;"> '''VI.''' Ἰδίᾳ δ' Ἀναχάρσεώς τε πρὸς Σόλωνα καὶ πάλιν Θάλεω συνουσίαν τινὰ καὶ λόγους ἀναγράφουσι τοιούτους. [...]<br /><p style="text-indent: 15px"> '''VII.''' Πρὸς Θαλῆν δ' εἰς Μίλητον ἐλθόντα τὸν Σόλωνα θαυμάζειν ὅτι γάμου καὶ παιδοποιΐας τὸ παράπαν ἠμέληκε. Καὶ τὸν Θαλῆν τότε μὲν σιωπῆσαι, διαλιπόντα δ' ὀλίγας ἡμέρας ἄνδρα παρασκευάσαι ξένον, ἀρτίως ἥκειν φάσκοντα δεκαταῖον ἐξ Ἀθηνῶν. Πυθομένου δὲ τοῦ Σόλωνος εἰ δή τι καινὸν ἐν ταῖς Ἀθήναις, δεδιδαγμένον ἃ χρὴ λέγειν τὸν ἄνθρωπον, « οὐδέν,» εἰπεῖν, « ἕτερον, εἰ μὴ νὴ Δία νεανίσκου τινὸς ἦν ἐκφορὰ καὶ προὔπεμπεν ἡ πόλις. Ἦν γὰρ υἱός, ὡς ἔφασαν, ἀνδρὸς ἐνδόξου καὶ πρωτεύοντος ἀρετῇ τῶν πολιτῶν· οὐ παρῆν δέ, ἀλλ' ἀποδημεῖν ἔφασαν αὐτὸν ἤδη πολὺν χρόνον.» « Ὡς δυστυχὴς ἐκεῖνος,» φάναι τὸν Σόλωνα. « Τίνα δὲ ὠνόμαζον αὐτόν;» « ἤκουσα,» φάναι, « τοὔνομα,» τὸν ἄνθρωπον, « ἀλλ' οὐ μνημονεύω· πλὴν ὅτι πολὺς λόγος ἦν αὐτοῦ σοφίας καὶ δικαιοσύνης.» Οὕτω δὴ καθ' ἑκάστην ἀπόκρισιν τῷ φόβῳ προσαγόμενον τὸν Σόλωνα καὶ τέλος ἤδη συντεταραγμένον αὐτὸν ὑποβάλλειν τοὔνομα τῷ ξένῳ, πυνθανόμενον μὴ Σόλωνος ὁ τεθνηκὼς υἱὸς ὠνομάζετο. Φήσαντος δὲ τοῦ ἀνθρώπου, τὸν μὲν ὁρμῆσαι παίειν τὴν κεφαλὴν καὶ τἆλλα ποιεῖν καὶ λέγειν ἃ συμβαίνει τοῖς περιπαθοῦσι, τὸν δὲ Θαλῆν ἐπιλαβόμενον αὐτοῦ καὶ γελάσαντα, « ταῦτά τοι,» φάναι, « ὦ Σόλων, ἐμὲ γάμου καὶ παιδοποιΐας ἀφίστησιν, ἃ καὶ σὲ κατερείπει τὸν ἐρρωμενέστατον. Ἀλλὰ θάρρει τῶν λόγων ἕνεκα τούτων· οὐ γάρ εἰσιν ἀληθεῖς.» ταῦτα μὲν οὖν Ἕρμιππος ἱστορεῖν φησι Πάταικον, ὃς ἔφασκε τὴν Αἰσώπου ψυχὴν ἔχειν.<br /><p style="text-indent: 15px">'''VIII.''' Ἄτοπος δὲ καὶ ἀγεννὴς ὁ τῷ φόβῳ τῆς ἀποβολῆς τὴν κτῆσιν ὧν χρὴ προϊέμενος· οὕτω γὰρ ἄν τις οὐ πλοῦτον, οὐ δόξαν, οὐ σοφίαν ἀγαπήσειε παραγενομένην, δεδιὼς στέρεσθαι. Καὶ γὰρ ἀρετήν, ἧς κτῆμα μεῖζον οὐδὲν οὐδ' ἥδιον, ἐξισταμένην ὑπὸ νόσων καὶ φαρμάκων ὁρῶμεν· αὐτῷ τε '''Θαλῇ''' μὴ γήμαντι πλέον οὐδὲν εἰς ἀφοβίαν, εἰ μὴ καὶ φίλων κτῆσιν ἔφυγε καὶ οἰκείων καὶ πατρίδος. Ἀλλὰ καὶ παῖδα θετὸν ἔσχε ποιησάμενος αὐτὸς τὸν τῆς ἀδελφῆς, ὥς φασι, '''Κύβισθον'''.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm <u>Plutarque, Vie de Solon</u>], ''chap. II'', ''§§6-8'', traduction par [[w:Dominique_Ricard|Dominique Ricard]], 1844<br />(également disponible une édition de 1853 [https://remacle.org/bloodwolf/historiens/Plutarque/solonpierrron.htm ici] et de 1862 [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f26.item là])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 390px; border: 2px solid; text-indent: 15px"><br /><div style="margin: 0 2em; text-align: justify; direction: ltr;">'''VI.''' '''Solon''' connut [[w:Anacharsis|'''Anacharsis''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Anacharsis_back|<sup>🔄</sup>]] et '''Thalès''', et l’on cite des mots qui s’étaient dits dans leurs entrevues. <br /><p style="text-align: center"> [...]<br /><p style="text-indent: 15px; text-align: justify;">'''Solon''' alla à ''Milet'', pour voir '''Thalès''' : là, il lui témoigna sa surprise dans ce qu’il n’avait jamais voulu se marier et avoir des enfants. '''Thalès''' ne répondit rien sur l’heure; mais, quelques jours après, il fit paraître un étranger, qui disait arriver d’''Athènes'', et qu’il n’en était parti que depuis dix jours. '''Solon''' demanda à cet homme s’il n’y avait rien de nouveau à ''Athènes''. Celui-ci, à qui '''Thalès''' avait fait la leçon, répondit qu’il n’y avait rien de nouveau , sinon la mort d’un jeune homme dont toute la ville menait les funérailles. C’était, en effet, à ce qu’on disait, le fils d’un personnage considérable, d’une vertu éprouvée : le père n’était pas alors à ''Athènes'', et il voyageait depuis longtemps. « L’infortuné père! s’écria '''Solon'''. Mais comment s’appelait-il? — Je l’ai entendu nommer, répondit l’étranger, mais j’ai oublié son nom ; je me souviens seulement qu’on ne parlait que de sa sagesse et de sa justice. » A chacune de ces réponses, '''Solon''' sentait augmenter ses craintes; enfin, ne se possédant plus , il suggéra le nom à l’étranger, et lui demanda si le mort n’était pas le fils de '''Solon'''. « Oui. » répondit l’étranger. A cette parole, '''Solon''' se frappa la tête, et il se mit à faire et à dire tout ce qu’inspire une douleur violente. Alors '''Thalès''' lui prit la main, et lui dit en riant : « Voilà, '''Solon''', ce qui m’éloigne de me marier et d’avoir des enfants. J’ai redouté le coup sous lequel tu fléchis, toi le plus ferme des hommes. Mais rassure-toi; car il n’y a rien de vrai dans tout ce qu’on vient de te dire. » [[w:Hermippe_de_Smyrne|'''Hermippus''']] [[#Hermippe|<span id="Hermippe_back"><sup>'''I'''</sup></span>]] rapporte cette histoire d’après '''Patécus''', celui qui prétendait avoir hérité de l’âme d’[[w:Ésope|'''Ésope''']] [[#Ésope|<span id="Ésope_back"><sup>'''II'''</sup></span>]].<br /><p style="text-indent: 15px">Pourtant il y a faute de sens et de cœur à refuser d’acquérir les choses nécessaires, par la crainte de les perdre. A ce compte, on devra n’aimer ni la richesse, ni la gloire, ni la sagesse, quand on les possède, de peur d’en être privé. En effet, la vertu, le plus grand des biens et le plus doux, nous quitte quelquefois par l’action de certaines maladies ou de certains breuvages. '''Thalès''' lui-même, en ne se mariant point, n’était pas pour cela à l’abri de la crainte, à moins qu’il n'eût renoncé aussi à ses parents, à ses amis, à sa patrie. Mais il n’en était rien : il avait adopté, dit-on, '''Cybisthus''', le fils de sa sœur. </div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/viesdeshommesill01plut/page/n6/mode/1up?view=theater <u>Vie des Hommes Illustres de Plutarque</u>], [https://archive.org/details/viesdeshommesill01plut/page/182/mode/1up?view=theater ''Solon''], ''Chap. II'', ''§6'', [https://archive.org/details/viesdeshommesill01plut/page/185/mode/1up?view=theater p.185], traduit par [[w:Alexis_Pierron|Alexis Pierron]], professeur au lycée Louis-le-Grand, 1877<br />(également disponible une édition de 1853 [[s:Vies_des_hommes_illustres/Solon|ici]])</div> {{Boîte déroulante début|titre=NdA trad. par Alexis Pierron de 1877|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Hermippe_back|<span id="Hermippe"><sup>I</sup></span>]] Du nom propre [[w:Nom_théophore|''théophore'']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#théophore_back|<sup>🔄</sup>]] grec ancien Ἕρμιππος / Hérmippos [[wikt:en:Ἕρμιππος#Ancient_Greek|(en)]] ;<br /><p style="margin: 0 2em; text-indent: 15px">➥ du nom propre Ἑρμῆς / Hermês [[wikt:en:Ἑρμῆς#Ancient_Greek|(en)]], « Hermès » ;<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ du nom commun ἵππος / híppos [[wikt:en:ἵππος#Ancient_Greek|(en)]], « cheval » ;<br /><p style="margin: 0 2em; text-indent: 15px">« Péripatéticien » grec, disciple de [[w:Callimaque_de_Cyr%C3%A8ne|Callimaque de ''Cyrène'']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Callimaque_back|<sup>🔄</sup>]], auteur de nombreuses biographies toutes perdues, mais listées par plusieurs auteurs.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] seconde moitié du [[w:IIIe_siècle_av._J.-C.|III<sup>ème</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]]) [https://books.google.fr/books?id=DrvWAAAAMAAJ&newbks=1&newbks_redir=0&lpg=PA497&dq=bibliogroup%3A%22Dictionnaire%20des%20philosophes%20antiques%22&hl=fr&pg=PA655#v=onepage&q&f=false {{Info|<sup>🔍</sup>|Dictionnaire des Philosophes Antiques, publié sous la direction de Richard Goulet, Volume III, §86 - Hermippe de Smyrne}}] <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Ésope_back|<span id="Ésope"><sup>II</sup></span>]] Du nom propre grec ancien Αἴσωπος / Aísōpos [[wikt:en:Αἴσωπος#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">➥ du nom commun αἶσα / aîsa, « destin »;<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ du nom commun ὄψ / óps, « voix »;<br /><br /><p style="margin: 0 2em; text-indent: 15px">Auteur grec de fable.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] seconde moitié du [[w:VIe_siècle_av._J.-C.|VI<sup>ème</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]]) [https://books.google.fr/books?id=DrvWAAAAMAAJ&newbks=1&newbks_redir=0&lpg=PA497&dq=bibliogroup%3A%22Dictionnaire%20des%20philosophes%20antiques%22&hl=fr&pg=PA240#v=onepage&q&f=false {{Info|<sup>🔍</sup>|Dictionnaire des Philosophes Antiques, publié sous la direction de Richard Goulet, Volume III, §60 - Ésope(Αἴσωπος)}}]'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">'''V.''' Voici les particularités qu’on raconte d’une entrevue de '''Solon''' avec '''Anacharsis''', et d’un entretien qu’il eut avec '''Thalès'''.<br /><p style="text-align: center"> [...]<br /><p style="text-indent: 15px; text-align: justify;">'''VI.''' '''Solon''', étant allé à ''Milet'' pour voir '''Thalès''', lui témoigna sa surprise de ce qu’il n’avait jamais voulu se marier et avoir des enfants. '''Thalès''' ne lui répondit rien dans le moment; mais ayant laissé passer quelques jours, il fit paraître un étranger qui disait arriver d’''Athènes'', d’où il était parti depuis dix jours. '''Solon''' lui demanda s’il n’y avait rien de nouveau, lorsqu’il en était parti. Cet homme, à qui '''Thalès''' avait fait la leçon, lui répondit qu’il n’y avait autre chose que la mort d’un jeune homme dont toute la ville accompagnait le convoi. C’était, disait-on, le fils d’un des premiers et des plus vertueux citoyens, qui n'’était pas alors à ''Athènes'' et qui voyageait depuis longtemps, « Le malheureux père! s’écria Solon. Comment s’appelle-t-il? ― Je l’ai entendu nommer, répondit l’étranger; mais j’ai oublié son nom; je me souviens seulement qu’on ne parlait que de sa sagesse et de sa justice. » A chacune de ces réponses, les craintes de '''Solon''' augmentaient; enfin, troublé, hors de lui-même, il suggéra le nom à l’étranger, et lui demanda si ce jeune homme n’était pas le fils de '''Solon'''. « C’est lui-même, » dit l’autre. A cette parole, '''Solon''', se frappant la tête, se mit à faire et à dire tout ce que la douleur la plus violente peut inspirer. Alors '''Thalès''' l’arrêta et lui dit en souriant : « Voilà, '''Solon''', ce qui m’a éloigné de me marier et d’avoir des enfants; j’ai redouté le coup qui vous accable aujourd’hui, et contre lequel toute votre fermeté est impuissante. Mais rassurez-vous ; il n’y a rien de vrai dans tout ce qu’on vient de vous dire. » '''Hermippus''' rapporte cette histoire d’après le récit qu’en fait '''Patécus''', qui prétendait avoir hérité de l’âme d’'''Ésope'''.<br /><p style="text-indent: 15px; text-align: justify;">'''VII.''' Cependant c’est manquer de sens et de courage que de renoncer à acquérir des choses nécessaires par la crainte de les perdre. A ce compte, il ne faudrait aimer ni la richesse, ni la gloire, ni la sagesse, quand on les possède, de peur d’en être privé. La vertu même, le plus grand et le plus agréable des biens, se perd souvent par l’effet. de quelques maladies ou de certains breuvages. '''Thalès''' lui-même, en ne se mariant point, n’était pas à l’abri de toute crainte, à moins qu’il ne renonçât aussi à ses parents, à ses amis et à sa patrie. Mais au contraire, il avait adopté '''Cybistus''', le fils de sa sœur. </div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f26.item ''chap. II''], traduction correcte et précédée du texte grec, par une société de professeurs et d’helléniste, 1862<br />(également disponible une édition de 1844 [https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm#1a ici] et de 1829 [[s:Les_Vies_des_hommes_illustres/Vie_de_Solon|là]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">'''V.''' Mais en particulier on rapporte une certaine entrevue et de tels discours et d’'''Anacharsis''' à '''Solon''' et une-autre-fois de '''Thalès'''.<br /><p style="text-align: center"> [...]<br /><p style="text-indent: 15px; text-align: justify;">'''VI.''' Et on raconte '''Solon''' étant venu vers '''Thalès''' à ''Milet'' s’étonner de ce qu’il avait négligé absolument le mariage et la création-d’enfants. Et '''Thalès''' alors à la vérité s’être tu, mais ayant laissé-d’intervalle peu-de jours, avoir aposté un homme étranger, disant être arrivé récemment parti-depuis-dix-jours d’''Athènes''. Et '''Solon''' s’étant informé si donc il y a quelque chose de nouveau à ''Athènes'', l’homme instruit des choses qu’il faut dire n’avoir dit aucune autre chose, si ce n’est :<br /><p style="text-indent: 15px"> « Par '''Jupiter''', il y avait le convoi d’un certain jeune-homme, et la ville l’accompagnait. Car il était fils, comme on disait, d’un homme illustre et étant-le-premier des citoyens par la vertu; mais il n’était-pas-présent, mais on disait lui être-en-voyage depuis un temps déjà long.<br /><p style="text-align: left; text-indent: 15px">― Combien cet homme-là est malheureux! avoir dit '''Solon'''. Mais quel (comment) appelaient-ils lui ?<br /><p style="text-align: left; text-indent: 15px">― J’ai entendu le nom, avoir dit l’homme (répondit l’étranger), mais je ne me le rappelle pas; excepté qu’un discours fréquent était de la sagesse et de la justice de lui. »<br /><p style="text-indent: 15px">'''Solon''' donc étant-approché ainsi de-la crainte à chaque réponse, et à la fin déjà étant tout-troublé, lui-même avoir suggéré le nom à l’étranger, demandant si le mort n’était pas nommé fils de '''Solon'''. Et l’homme ayant dit-oui, celui-ci ('''Solon''') avoir commencé à frapper sa tête, et à faire et à dire les autres choses, qu’il arrive de faire et de dire à ceux affligés-à-l’excès. Mais '''Thalès''' ayant arrêté lui, et ayant ri, avoir dit :<br /><p style="text-indent: 15px">« Ces choses donc, ô '''Solon''', écartent moi du mariage et de la création-d’enfants, lesquelles abattent même toi le très-fort. Mais aie-confiance quant-à ces discours: car ils ne sont pas vrais. »<br /><p style="text-indent: 15px">'''Hermippe''' donc dit '''Patécus''', qui disait-souvent avoir l’âme d’'''Ésope''', raconter ces choses. <br /><p style="text-indent: 15px">'''VII.''' Or il est absurde et dépourvu de courage celui rejetant par la crainte de la perte l’acquisition des choses qu’il faut; car ainsi quelqu’un n’aimerait pas la richesse, n’aimerait pas la gloire, n’aimerait pas la sagesse étant survenue à lui, craignant (par crainte) d’en être privé. Et en effet nous voyons la vertu, au prix de laquelle aucune possession n’est plus grande, ni plus agréable, déplacée (chassée) par des maladies et des breuvages; et rien de plus n’être pour l’exemption-de-crainte à '''Thalès''' lui-même ne s’étant pas marié, s’il n’avait pas évité la possession et d’amis et de parents et de patrie. Mais même il eut un fils adoptif se l’étant fait tel lui-même, celui de sa sœur, comme on dit '''Cybisthe'''.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f27.item ''chap. II''], traduction littérale et juxtalinéaire présentant le mot à mot français en regard des mots grecs correspondants, par une société de professeurs et d’helléniste, 1862</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ====== <div style="text-align: center;">Paragraphe XV.</div> ====== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;"> Testament d’inhumation de '''Thalès'''.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''XV.''' Καὶ φόβοι τινὲς ἐκ δεισιδαιμονίας ἅμα καὶ φάσματα κατεῖχε τὴν πόλιν, οἵ τε μάντεις ἄγη καὶ μιασμοὺς δεομένους καθαρμῶν προφαίνεσθαι διὰ τῶν ἱερῶν ἠγόρευον. Οὕτω δὴ μετάπεμπτος αὐτοῖς ἧκεν ἐκ Κρήτης Ἐπιμενίδης ὁ Φαίστιος, ὃν ἕβδομον ἐν τοῖς σοφοῖς καταριθμοῦσιν ἔνιοι τῶν οὐ προσιεμένων τὸν Περίανδρον. Ἐδόκει δέ τις εἶναι θεοφιλὴς καὶ σοφὸς περὶ τὰ θεῖα τὴν ἐνθουσιαστικὴν καὶ τελεστικὴν σοφίαν, διὸ καὶ παῖδα νύμφης ὄνομα Βάλτης καὶ Κούρητα νέον αὐτὸν οἱ τότε ἄνθρωποι προσηγόρευον. <br /><p style="text-align: center">[...]<br /><p style="text-indent: 15px; text-align: justify;">Τὸ δὲ μέγιστον, ἱλασμοῖς τισι καὶ καθαρμοῖς καὶ ἱδρύσεσι κατοργιάσας καὶ καθοσιώσας τὴν πόλιν ὑπήκοον τοῦ δικαίου καὶ μᾶλλον εὐπειθῆ πρὸς ὁμόνοιαν κατέστησε. Λέγεται δὲ τὴν Μουνυχίαν ἰδὼν καὶ καταμαθὼν πολὺν χρόνον, εἰπεῖν πρὸς τοὺς παρόντας ὡς τυφλόν ἐστι τοῦ μέλλοντος ἄνθρωπος· ἐκφαγεῖν γὰρ ἂν Ἀθηναίους τοῖς αὑτῶν ὀδοῦσιν, εἰ προῄδεσαν ὅσα τὴν πόλιν ἀνιάσει τὸ χωρίον· ὅμοιον δέ τι καὶ Θαλῆν εἰκάσαι λέγουσι· κελεῦσαι γὰρ αὐτὸν ἔν τινι τόπῳ τῆς Μιλησίας φαύλῳ καὶ παρορωμένῳ τελευτήσαντα θεῖναι, προειπὼν ὡς ἀγορά ποτε τοῦτο Μιλησίων ἔσται τὸ χωρίον. Ἐπιμενίδης μὲν οὖν μάλιστα θαυμασθείς, καὶ χρήματα διδόντων πολλὰ καὶ τιμὰς μεγάλας τῶν Ἀθηναίων, οὐδὲν ἢ θαλλὸν ἀπὸ τῆς ἱερᾶς ἐλαίας αἰτησάμενος καὶ λαβὼν ἀπῆλθεν. </div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm <u>Plutarque, Vie de Solon</u>], ''chap. II'', ''§15'', traduction par [[w:Dominique_Ricard|Dominique Ricard]], 1844<br />(également disponible une édition de 1853 [https://remacle.org/bloodwolf/historiens/Plutarque/solonpierrron.htm ici] et de 1862 [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f26.item là])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 390px; border: 2px solid; text-indent: 15px"><br /><div style="margin: 0 2em; text-align: justify; direction: ltr;">'''XV.''' Au chagrin que ces pertes causèrent à ceux-ci [les ''Athéniens''], se joignirent des craintes superstitieuses dont la ville [''Athènes''] fut frappée, et qui venaient d’apparitions de spectres et de fantômes. Les devins déclarèrent aussi que l’état des victimes qu’ils avaient offertes annonçait des crimes et des profanations qu’il fallait expier. On fit donc venir de ''Crète'' [[w:Épiménide|'''Épiménide''']] [[#Épiménide|<span id="Épiménide_back"><sup>'''I'''</sup></span>]] le [[w:Phaistos|''Phestien'']] [[#Phaistos|<span id="Phaistos_back"><sup>'''II'''</sup></span>]], qui est mis au nombre des sept sages par ceux qui n’y comptent pas '''Périandre'''. Il passait pour un homme chéri des dieux, doué d’une grande sagesse, fort instruit des choses divines, surtout versé dans la science des inspirations et dans la connaissance des mystères; on l’appelait, même de son vivant, le nouveau [[w:Curètes|'''Curète''']], le fils de la nymphe '''Balté'''.<br /><p style="text-align: center">[...]<br /><p style="text-indent: 15px; text-align: justify;">Mais ce qui était plus important, il fit un grand nombre d’expiations et de sacrifices, il fonda plusieurs temples; et par ces différentes cérémonies il purifia entièrement la ville, en bannit l’impiété et l’injustice, et la rendit plus soumise, plus disposée à l’union et à la paix. On rapporte aussi que lorsqu’il vit le fort de [[w:Munichie|''Munychium'']] [[#Munichie|<span id="Munichie_back"><sup>'''III'''</sup></span>]], il le considéra longtemps, et dit à ceux qui l’accompagnaient : Que les hommes sont aveugles sur l’avenir ! Si les ''Athéniens'' pouvaient prévoir tous les maux que ce lieu doit un jour causer à leur ville, ils l’emporteraient à belles dents ». '''Thalès''' eut aussi, dit-on, un pressentiment à peu près semblable. Il ordonna qu’on l’enterrât dans le lieu le plus sauvage et le plus désert du territoire de ''Milet''; et il prédit aux ''Milésiens'' qu’un jour leur marché public y serait transporté. Les ''Athéniens'', pleins de reconnaissance et d’admiration pour '''Épiménide''', voulurent le combler d’honneurs et de présents; mais il ne demanda qu’une branche de l’olivier sacré, qui lui fut accordée, et il s’en retourna en ''Crète''.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/viesdeshommesill01plut/page/n6/mode/1up?view=theater <u>Vie des Hommes Illustres de Plutarque</u>], [https://archive.org/details/viesdeshommesill01plut/page/182/mode/1up?view=theater ''Solon''], ''Chap. II'', ''§15'',[https://archive.org/details/viesdeshommesill01plut/page/185/mode/1up?view=theater p.185], traduit par [[w:Alexis_Pierron|Alexis Pierron]], professeur au lycée Louis-le-Grand, 1877<br />(également disponible une édition de 1853 [[s:Vies_des_hommes_illustres/Solon|ici]])</div> {{Boîte déroulante début|titre=NdA trad. par Alexis Pierron de 1877|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Épiménide_back|<span id="Épiménide"><sup>I</sup></span>]] Du nom propre grec ancien Ἐπιμενίδης / Epimenídēs [[wikt:en:Ἐπιμενίδης#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">Poète, philosophe et [[w:Iatromante|''iatromante'']] crétois.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] milieu du [[w:VIe_siècle_av._J.-C.|VI<sup>ème</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]]) <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Phaistos_back|<span id="Phaistos"><sup>II</sup></span>]] Du nom propre grec ancien Φαιστός / Phaistós [[wikt:en:Φαιστός#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">Ancienne ville du Sud de la [[w:Histoire_de_la_Crète#Antiquité|''Crète'']].<br /><br /><p style="margin: 0 2em; text-indent: 15px">[[#Munichie_back|<span id="Munichie"><sup>III</sup></span>]] Du nom propre grec ancien Μουνιχία / Mounikhia [[wikt:en:Μουνυχία#Grec_ancien|(en)]] ;<br /><p style="margin: 0 2em; text-indent: 15px">Nom d’une colline du [[w:Le_Pirée|''Pirée'']] et de l’[[w:Port_de_Munichie|un des ports du ''Pirée'']].'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">'''XII.''' Au chagrin que ces pertes causèrent à ceux-ci, se joignirent des craintes superstitieuses dont la ville fut frappée, et qui venaient d’apparitions de spectres et de fantômes. Les devins déclarèrent aussi que l’état des victimes annonçait des crimes et des profanations qu’il fallait expier. On fit donc venir de ''Crète'' '''Épiménide''' le ''Phestien'' qui est mis au nombre des sept sages par ceux qui n’y comptent pas '''Périandre'''. Il passait pour un homme chéri des dieux, doué d’une grande sagesse, fort instruit des choses divines, surtout versé dans la science des inspirations et dans la connaissance des mystères; on l’appelait, même de son vivant, le nouveau '''Curète''', le fils de la nymphe '''Balté'''.<br /><p style="text-align: center">[...]<br /><p style="text-indent: 15px; text-align: justify;">Mais ce qui était plus important, il fit un grand nombre d’expiations et de sacrifices; il fonda plusieurs temples; et par ces différentes cérémonies, il purifia entièrement la ville, en bannit l’impiété et l’injustice, et la rendit plus soumise, plus disposée à l’union et à la paix. On rapporte aussi que lorsqu’il vit ''Munychie'', il la considéra longtemps, et dit à ceux qui l’accompagnaient :<br /><p style="text-align: justify; text-indent: 15px"> « Que les hommes sont aveugles sur l’avenir! Si les ''Athéniens'' pouvaient prévoir tous les maux que ce lieu doit un jour causer à leur ville, il l’emporteraient à belles dents. »<br /><p style="text-align: justify; text-indent: 15px"> '''Thalès''' eut aussi, dit-on, un pressentiment à peu près semblable. Il ordonna qu’on l’enterrât dans le lieu le plus sauvage et le plus désert du territoire de ''Milet''; et il prédit aux ''Milésiens'' qu’un jour leur marché public y serait transporté. Les ''Athéniens'', pleins de reconnaissance et d’admiration pour '''Épiménide''', voulurent le combler d’honneurs et de présents; mais il ne demanda qu’une branche de l’olivier sacré, qui lui fut accordée, et il s’en retourna en ''Crète''.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f58.item ''chap. II''], traduction correcte et précédée du texte grec, par une société de professeurs et d’helléniste, 1862<br />(également disponible une édition de 1844 [https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm#1a ici] et de 1829 [[s:Les_Vies_des_hommes_illustres/Vie_de_Solon|là]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">Et certaines craintes nées de la superstition en-même-temps aussi des apparitions occupaient la ville; et les devins disaient des impiétés et des souillures ayant-besoin de purifications être indiquées par les victimes. Et ainsi vint à eux mandé (ils firent venir) de ''Crète'' '''Épiménide''' le ''Phestien'', que quelques-uns de ceux n’admettant pas '''Périandre''' comptent le septième parmi les sages. Or il avait-la-réputation d’être un homme ami-des-dieux, et habile dans la science de-l’inspiration et des-mystères. C’est-pourquoi les hommes d’alors appelaient lui et fils de la nymphe de nom (nommée) '''Balté''', et nouveau '''Curète'''.<br /><p style="text-align: center">[...]<br /><p style="text-indent: 15px; text-align: justify;">Mais le plus grand (le plus important), ayant initié-aux-mystères et ayant purifié la ville par certaines expiations et purifications et fondations, il la rendit prêtant-l’oreille à la justice et plus obéissante pour la concorde. Et il est dit, ayant vu ''Munychie'' et l’ayant examinée un temps long, avoir dit à ceux présents, que l’homme est un être aveugle sur l’avenir ; car les ''Athéniens'' avoir dû manger ''Munychie'' avec les dents d’eux-mêmes, s’ils avaient prévu en combien de choses cette place affligera la ville. Et on dit aussi '''Thalès''' avoir conjecturé quelque chose de semblable; lui avoir ordonné en effet de placer lui ayant cessé de vivre dans un certain lieu de la ''Milésie'' méprisé et dédaigné, ayant prédit que cet endroit sera (serait) un jour le marché des ''Milésiens''. '''Épiménide''' donc ayant été admiré très-grandement, et les ''Athéniens'' lui donnant des sommes nombreuses et des honneurs grands, n’ayant demandé rien qu’un rameau détaché de l’olivier sacré et l’ayant pris (reçu) s’en alla.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f59.item ''chap. II''], traduction littérale et juxtalinéaire présentant le mot à mot français en regard des mots grecs correspondants, par une société de professeurs et d’helléniste, 1862</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">═✳═</div> === [[w:Œuvres_morales|Œuvres morales]] === <div style="text-align: center; margin: 0 1em;">Ensemble de 78 textes de traitant de sujets extrêmement variés (religieux, éthiques, politiques, philosophiques, littéraires, historiques), et s'inscrivant dans des genres littéraires également divers (traité, différentes sortes de dialogues, lettres, réponses à des Questions ([[wikt:ζήτημα#Grec_ancien|''zetemata'']]), « dits » ([[w:Apophtegme|''apophtegmes'']])).</div> ==== Le Banquet des Sept Sages ==== <div style="text-align: center; margin: 0 1em;">Dialogue faisant intervenir 20 personnages, dont une liste des sept sages : '''Thalès''', [[w:Solon|'''Solon''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Solon_back|<sup>🔄</sup>]], [[w:Bias_de_Priène|'''Bias''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Bias_back|<sup>🔄</sup>]], [[w:Chilon|'''Chilon''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Chilon_back|<sup>🔄</sup>]], [[w:Cléobule|'''Cléobule''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Cléobule_back|<sup>🔄</sup>]], [[w:Pittacos_de_Mytil%C3%A8ne|'''Pittacos''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Pittacos_back|<sup>🔄</sup>]], [[w:Périandre|'''Périandre''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Périandre_back|<sup>🔄</sup>]].<br />À ceux-ci se rajoutent : [[w:Anacharsis|'''Anacharsis''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Anacharsis_back|<sup>🔄</sup>]], '''Ésope''', '''Dioclès''', '''Nicarque''', [[w:Cléobuline|'''Cléobuline''']] [[#Cléobuline|<span id="Cléobuline_back"><sup>'''I'''</sup></span>]], '''Mélissa''', '''Niloxène''', '''Alexidème''', '''Ardalus''', '''Cléodème''', '''Mnésiphile''', '''Chersias''', [[w:Gorgias|'''Gorgias''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Gorgias_back|<sup>🔄</sup>]].</div> {{Boîte déroulante début|titre=NdA Le Banquet des Septs Sages|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Cléobuline_back|<span id="Cléobuline"><sup>I</sup></span>]] Du nom propre grec ancien Κλεοβουλίνη / Kleoboulinè ;<br /><p style="margin: 0 2em; text-indent: 15px">➥ de Κλεόβουλος / Kleóboulos [[wikt:en:Κλεόβουλος#Ancient_Greek|(en)]], « Cléobule, le père de Cléobuline » <br /><p style="margin: 0 2em; text-indent: 15px">➥ du suffixe adjectival féminin -ῑ́νη / -ī́nē [[wikt:en:-ίνη#Ancient_Greek|(en)]], relatif à la matière, au temps, etc. : « fait de, pendant la durée de » ;<br /><p style="margin: 0 2em; text-indent: 15px">Philosophe et poétesse grecque, célèbre pour ses énigmes, fille du [[w:Tyran|''tyran'']] Cléobule, qui la surnommerait Εὔμητις / Eúmētis, « la Prudente » selon Plutarque. '''<br/><br/></div> {{Boîte déroulante fin}} ===== <div style="text-align: center;">Paragraphe I.</div> ===== :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§1. Ἦ που προϊὼν ὁ χρόνος, ὦ '''Νίκαρχε''', πολὺ σκότος ἐπάξει τοῖς πράγμασι καὶ πᾶσαν ἀσάφειαν, εἰ νῦν ἐπὶ προσφάτοις οὕτω καὶ νεαροῖς λόγοι ψευδεῖς συντεθέντες ἔχουσι πίστιν. οὔτε γὰρ μόνων, ὡς ὑμεῖς ἀκηκόατε, τῶν ἑπτὰ γέγονε τὸ συμπόσιον, ἀλλὰ πλειόνων ἢ δὶς τοσούτων (ἐν οἷς καὶ αὐτὸς ἤμην, συνήθης μὲν ὢν '''Περιάνδρῳ''' διὰ τὴν τέχνην, ξένος δὲ '''Θάλεω'''· παρ´ ἐμοὶ γὰρ κατέλυσεν ὁ ἀνὴρ '''Περιάνδρου''' κελεύσαντος), οὔτε τοὺς λόγους ὀρθῶς ἀπεμνημόνευσεν ὅστις ἦν ὑμῖν ὁ διηγούμενος· ἦν δ´ ὡς ἔοικεν οὐδεὶς τῶν παραγεγονότων. ἀλλ´ ἐπεὶ σχολή τε πάρεστι πολλὴ καὶ τὸ γῆρας οὐκ ἀξιόπιστον ἐγγυήσασθαι τὴν ἀναβολὴν τοῦ λόγου, προθυμουμένοις ὑμῖν ἀπ´ ἀρχῆς ἅπαντα διηγήσομαι. </div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §1'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§1. '''D<span style ="font-size:85%;">IOCLÈS</span>'''. Certainement le long cours des âges, mon cher '''Nicarque''', jettera sur les faits d’épaisses ténèbres et une complète incertitude, puisque dès aujourd’hui, à propos de choses si récentes et si nouvelles, des relations mensongères et controuvées obtiennent crédit. Car d’abord le banquet en question ne se composait pas seulement des sept sages, comme vous autres l’avez ouï dire. Les convives étaient plus du double de ce nombre. J’en faisais moi-même partie, comme familier de '''Périandre''' en raison de notre profession commune, et comme hôte de '''Thalès''' : ce dernier était en effet descendu chez moi sur la recommandation de '''Périandre'''. Ensuite, on ne vous en a pas rapporté fidèlement les entretiens lorsqu’on vous a fait ce récit. Il faut que celui de qui vous le tenez n’ait pas été un des convives. Mais puisque nous avons un ample loisir et que la vieillesse est un garant trop peu sûr pour nous autoriser à remettre cet entretien, je vais, suivant votre désir unanime, vous en raconter tous les détails à partir du commencement. </div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §1'', traduction par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870<br/>(également disponible [[s:Page:Plutarque_-_Œuvres_complètes_de_Plutarque_-_Œuvres_morales_et_œuvres_diverses,_tome_1,_1870.djvu/424|ici]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">'''D<span style ="font-size:85%;">IOCLÈS</span>'''. Quelle incertitude et quelle obscurité la succession des temps ne doit-elle pas répandre sur l’histoire, mon cher '''Nicarque''', puisque, dans des faits récents, et qui se sont passés presque sous nos yeux, le faux prend la place du vrai ? Ce banquet n’était pas, comme on vous l’a dit, composé seulement des sept sages ; les convives étaient plus du double de ce nombre. J’y assistai moi-même, et comme ami de '''Périandre''', avec qui ma profession ma lié depuis longtemps [[#Dioclès_NdT_DR|<span id="Dioclès_NdT_DR_back"><sup>1</sup></span>]], et comme hôte de '''Thalès''', à qui '''Périandre''' avait fait marquer son logement chez moi. Celui qui vous a fait le récit de ce qui s’y est passé n’en était sûrement pas, et vous a trompé sur presque tous les points. Mais, puisque nous en avons le loisir, et que notre âge avancé ne nous permet guère de différer, je vais vous satisfaire et vous en raconter tous les détails.</div> <table cellspacing=15 style="margin: 0 4em; font-size:85%;"> <tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Dioclès_NdT_DR_back|<span id="Dioclès_NdT_DR"><sup>1.</sup></span>]] Dioclès était devin.''' </td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe II.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage de la simplicité de '''Thalès''', de sa mesure de la pyramide d’''Égypte'', et de son aversion des [[w:Tyran|''tyrans'']] et des rois.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§2. Παρεσκευάκει μὲν γὰρ οὐκ ἐν τῇ πόλει τὴν ὑποδοχὴν ὁ Περίανδρος, ἀλλ´ ἐν τῷ περὶ τὸ Λέχαιον ἑστιατορίῳ παρὰ τὸ τῆς Ἀφροδίτης ἱερόν, ἧς ἦν καὶ ἡ θυσία. μετὰ γὰρ τὸν ἔρωτα τῆς μητρὸς αὐτοῦ προεμένης τὸν βίον ἑκουσίως οὐ τεθυκὼς τῇ Ἀφροδίτῃ, τότε πρῶτον ἔκ τινων ἐνυπνίων τῆς Μελίσσης ὥρμησε τιμᾶν καὶ θεραπεύειν τὴν θεόν. Τῶν δὲ κεκλημένων ἑκάστῳ συνωρὶς ἱκανῶς κεκοσμημένη προσήχθη· καὶ γὰρ ὥρα θέρους ἦν, καὶ τὴν ὁδὸν ἅπασαν ὑπὸ πλήθους ἁμαξῶν καὶ ἀνθρώπων ἄχρι θαλάττης κονιορτὸς καὶ θόρυβος κατεῖχεν. ὁ μέντοι Θαλῆς τὸ ζεῦγος ἐπὶ ταῖς θύραις ἰδὼν καὶ μειδιάσας ἀφῆκεν. ἐβαδίζομεν οὖν ἐκτραπόμενοι διὰ τῶν χωρίων, καθ´ ἡσυχίαν, καὶ μεθ´ ἡμῶν τρίτος ὁ Ναυκρατίτης Νειλόξενος, ἀνὴρ ἐπιεικὴς καὶ τοῖς περὶ Σόλωνα καὶ Θαλῆν γεγονὼς ἐν Αἰγύπτῳ συνήθης. ἐτύγχανε δὲ πρὸς Βίαντα πάλιν ἀπεσταλμένος· ὧν δὲ χάριν οὐδ´ αὐτὸς ᾔδει, πλὴν ὑπενόει πρόβλημα δεύτερον αὐτῷ κομίζειν ἐν βιβλίῳ κατασεσημασμένον· εἴρητο γάρ, εἰ Βίας ἀπαγορεύσειεν, ἐπιδεῖξαι τοῖς σοφωτάτοις Ἑλλήνων τὸ βιβλίον. « Ἕρμαιον » ὁ Νειλόξενος ἔφη « μοι γέγονεν ἐνταῦθα λαβεῖν ἅπαντας ὑμᾶς, καὶ κομίζω τὸ βιβλίον ὡς ὁρᾷς ἐπὶ τὸ δεῖπνον. » ἅμα δ´ ἡμῖν ἐπεδείκνυε. Καὶ ὁ Θαλῆς γελάσας « εἴ τι κακόν, » εἶπεν, « αὖθις εἰς Πριήνην· διαλύσει γὰρ ὁ Βίας, ὡς διέλυσεν αὐτὸς τὸ πρῶτον. » « Τί δ´ ἦν, » ἔφην ἐγώ, « τὸ πρῶτον; » « Ἱερεῖον, » εἶπεν, « ἔπεμψεν αὐτῷ, κελεύσας τὸ πονηρότατον ἐξελόντα καὶ χρηστότατον ἀποπέμψαι κρέας. ὁ δ´ ἡμέτερος εὖ καὶ καλῶς τὴν γλῶτταν ἐξελὼν ἔπεμψεν· ὅθεν εὐδοκιμῶν δῆλός ἐστι καὶ θαυμαζόμενος. » « Οὐ διὰ ταῦτ´ » ἔφη « μόνον » ὁ Νειλόξενος, « ἀλλ´ οὐ φεύγει τὸ φίλος εἶναι καὶ λέγεσθαι βασιλέων καθάπερ ὑμεῖς, ἐπεὶ σοῦ γε καὶ τἄλλα θαυμάζει, καὶ τῆς [[wikt:en:πυραμίδος#Ancient_Greek|πυραμίδος]] τὴν μέτρησιν ὑπερφυῶς ἠγάπησεν, ὅτι πάσης ἄνευ πραγματείας καὶ μηδενὸς ὀργάνου δεηθεὶς ἀλλὰ τὴν βακτηρίαν στήσας ἐπὶ τῷ πέρατι τῆς σκιᾶς ἣν ἡ πυραμὶς ἐποίει, γενομένων τῇ ἐπαφῇ τῆς ἀκτῖνος δυεῖν τριγώνων, ἔδειξας ὃν ἡ σκιὰ πρὸς τὴν σκιὰν λόγον εἶχε τὴν πυραμίδα πρὸς τὴν βακτηρίαν ἔχουσαν. ἀλλ´, ὅπερ ἔφην, διεβλήθης μισοβασιλεὺς εἶναι, καί τινες ὑβριστικαί σου περὶ τυράννων ἀποφάσεις ἀνεφέροντο πρὸς αὐτόν, ὡς ἐρωτηθεὶς ὑπὸ Μολπαγόρου τοῦ Ἴωνος τί παραδοξότατον εἴης ἑωρακώς, ἀποκρίναιο ‘τύραννον γέροντα,’ καὶ πάλιν ἔν τινι πότῳ, περὶ τῶν θηρίων λόγου γενομένου, φαίης κάκιστον εἶναι τῶν μὲν ἀγρίων θηρίων τὸν τύραννον, τῶν δ´ ἡμέρων τὸν κόλακα· ταῦτα γάρ, εἰ καὶ πάνυ προσποιοῦνται διαφέρειν οἱ βασιλεῖς τῶν τυράννων, οὐκ εὐμενῶς ἀκούουσιν. » « Ἀλλὰ τοῦτο μέν, » εἶπεν ὁ Θαλῆς, « Πιττακοῦ ἐστιν, εἰρημένον ἐν παιδιᾷ ποτε πρὸς Μυρσίλον· ἐγὼ δὲ θαυμάσαιμ´ ἄν, » ἔφη, « οὐ τύραννον ἀλλὰ [[wikt:κυβερνήτης#Grec_ancien|'''κυβερνήτην''']] γέροντα θεασάμενος. πρὸς δὲ τὴν μετάθεσιν τὸ τοῦ νεανίσκου πέπονθα τοῦ βαλόντος μὲν ἐπὶ τὴν κύνα πατάξαντος δὲ τὴν μητρυιὰν καὶ εἰπόντος ‘οὐδ´ οὕτω κακῶς.’ διὸ καὶ Σόλωνα σοφώτατον ἡγησάμην οὐ δεξάμενον τυραννεῖν. καὶ Πιττακὸς οὗτος εἰ μοναρχίᾳ μὴ προσῆλθεν, οὐκ ἂν εἶπεν ὡς ‘χαλεπὸν ἐσθλὸν ἔμμεναι.’ Περίανδρος δ´ ἔοικεν ὥσπερ ἐν νοσήματι πατρῴῳ τῇ τυραννίδι κατειλημμένος οὐ φαύλως ἐξαναφέρειν, χρώμενος ὁμιλίαις ὑγιειναῖς ἄχρι γε νῦν καὶ συνουσίας ἀνδρῶν νοῦν ἐχόντων ἐπαγόμενος, ἃς δὲ '''Θρασύβουλος''' αὐτῷ κολούσεις τῶν ἄκρων οὑμὸς πολίτης ὑφηγεῖται μὴ προσιέμενος. γεωργοῦ γὰρ [[wikt:en:αἶρα#Ancient_Greek|αἴρας]] καὶ [[wikt:ononis|ὀνώνιδας]] ἀντὶ [[wikt:πυρός#Grec_ancien|πυρῶν]] καὶ [[wikt:κριθή#Grec_ancien|κριθῶν]] συγκομίζειν ἐθέλοντος οὐδὲν διαφέρει τύραννος ἀνδραπόδων μᾶλλον ἄρχειν ἢ ἀνδρῶν βουλόμενος· ἓν γὰρ ἀντὶ πολλῶν κακῶν ἀγαθὸν αἱ δυναστεῖαι τὴν τιμὴν ἔχουσι καὶ τὴν δόξαν, ἄνπερ ἀγαθῶν ὡς κρείττονες ἄρχωσι καὶ μεγάλων μείζονες εἶναι δοκῶσι· τὴν δ´ ἀσφάλειαν ἀγαπῶντας ἄνευ τοῦ καλοῦ προβάτων ἔδει πολλῶν καὶ ἵππων καὶ βοῶν ἄρχειν, μὴ ἀνθρώπων. ἀλλὰ γὰρ εἰς οὐδὲν προσήκοντας ἐμβέβληκεν ἡμᾶς, » ἔφη, « ὁ ξένος οὑτοσὶ λόγους, ἀμελήσας λέγειν τε καὶ ζητεῖν ἃ ἁρμόττει ἐπὶ δεῖπνον βαδίζουσιν. ἦ γὰρ οὐκ οἴει, καθάπερ ἑστιάσοντος ἔστι τις παρασκευή, καὶ δειπνήσοντος εἶναι; Συβαρῖται μὲν γὰρ ὡς ἔοικε πρὸ ἐνιαυτοῦ τὰς κλήσεις ποιοῦνται τῶν γυναικῶν, ὅπως ἐκγένοιτο κατὰ σχολὴν παρασκευασαμέναις ἐσθῆτι καὶ χρυσῷ φοιτᾶν ἐπὶ τὸ δεῖπνον· ἐγὼ δὲ πλείονος οἶμαι χρόνου δεῖσθαι τὴν ἀληθινὴν τοῦ δειπνήσοντος ὀρθῶς παρασκευήν, ὅσῳ χαλεπώτερόν ἐστιν ἤθει τὸν πρέποντα κόσμον ἢ σώματι τὸν περιττὸν ἐξευρεῖν καὶ ἄχρηστον. οὐ γὰρ ὡς ἀγγεῖον ἥκει κομίζων ἑαυτὸν ἐμπλῆσαι πρὸς τὸ δεῖπνον ὁ νοῦν ἔχων, ἀλλὰ καὶ σπουδάσαι τι καὶ παῖξαι καὶ ἀκοῦσαι καὶ εἰπεῖν ὡς ὁ καιρὸς παρακαλεῖ τοὺς συνόντας, εἰ μέλλουσι μετ´ ἀλλήλων ἡδέως ἔσεσθαι. καὶ γὰρ καὶ ὄψον πονηρὸν ἔστι παρώσασθαι, κἂν οἶνος ᾖ φαῦλος, ἐπὶ τὰς νύμφας καταφυγεῖν· σύνδειπνος δὲ κεφαλαλγὴς καὶ βαρὺς καὶ ἀνάγωγος παντὸς μὲν οἴνου καὶ ὄψου πάσης δὲ μουσουργοῦ χάριν ἀπόλλυσι καὶ λυμαίνεται, καὶ οὐδ´ ἀπεμέσαι τὴν τοιαύτην ἀηδίαν ἕτοιμόν ἐστιν, ἀλλ´ ἐνίοις εἰς ἅπαντα τὸν βίον ἐμμένει τὸ πρὸς ἀλλήλους δυσάρεστον, ὥσπερ ἑωλοκρασία τις ὕβρεως ἢ ὀργῆς ἐν οἴνῳ γενομένης. ὅθεν ἄριστα Χίλων, καλούμενος ἐχθές, οὐ πρότερον ὡμολόγησεν ἢ πυθέσθαι τῶν κεκλημένων ἕκαστον. ἔφη γὰρ ὅτι σύμπλουν ἀγνώμονα δεῖ φέρειν καὶ σύσκηνον οἷς πλεῖν ἀνάγκη καὶ στρατεύεσθαι· τὸ δὲ συμπόταις ἑαυτὸν ὡς ἔτυχε καταμιγνύειν οὐ νοῦν ἔχοντος ἀνδρός ἐστιν. ὁ δ´ Αἰγύπτιος σκελετός, ὃν ἐπιεικῶς εἰσφέροντες εἰς τὰ συμπόσια προτίθενται καὶ παρακαλοῦσι μεμνῆσθαι τάχα δὴ τοιούτους ἐσομένους, καίπερ ἄχαρις καὶ ἄωρος ἐπίκωμος ἥκων, ὅμως ἔχει τινὰ καιρόν, καὶ εἰ μὴ πρὸς τὸ πίνειν καὶ ἡδυπαθεῖν ἀλλὰ πρὸς φιλίαν καὶ ἀγάπησιν ἀλλήλων προτρέπεται, καὶ παρακαλεῖ τὸν βίον μὴ τῷ χρόνῳ βραχὺν ὄντα πράγμασι κακοῖς μακρὸν ποιεῖν. » </div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §2'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§2. La réception avait été préparée par '''Périandre''', non pas dans la ville même, mais dans son [[w:Cénacle|''cénacle'']] du port de [[w:Léchaion|''Léchée'']], près du temple de '''Vénus''' en l’honneur de laquelle il y avait même un sacrifice. Car depuis l’incestueux amour à la suite duquel sa mère avait volontairement abandonné la vie, '''Périandre''' n’avait pas sacrifié à '''Vénus''' ; et c’était alors la première fois que, d’après certains songes de '''Mélissa''' il s’était décidé à honorer la déesse et à lui rendre des hommages. Pour chacun des invités on avait amené un attelage approprié convenablement. Nous étions en été, et tout le long de la route, en raison du grand nombre de chariots et de piétons, ce n’était jusqu’à la mer que poussière et que bruit. Pourtant '''Thalès''', ayant vu l’attelage à notre porte, se mit à sourire et le renvoya. Nous partîmes donc à pied en faisant un détour, et à travers champs nous cheminâmes à loisir. Un troisième compagnon s’était joint à nous, '''Niloxène''' de ''Naucratie'', homme plein de mérite, que '''Thalès''' et '''Solon''' avaient autrefois beaucoup connu en ''Égypte''. Il se trouvait envoyé de nouveau vers '''Bias''' ; mais pour quelle mission ? Il n’en savait rien lui-même, hormis qu’il se soupçonnait porteur d’une seconde question à résoudre, contenue dans un pli cacheté; et il lui avait été dit, au cas où '''Bias''' renoncerait, de la présenter aux plus sages d’entre les Grecs. « C’est », dit '''Niloxène''', « une chance heureuse que de vous trouver ici tous, et j’apporte, comme vous voyez, cette lettre pour le banquet. » En même temps, il nous la faisait voir. '''Thalès''' se mit à rire : « Si c’est une question épineuse », dit-il, « qu’on aille encore à ''Priène'' : '''Bias''' la résoudra comme il a résolu la première. » — « Quelle était donc cette première question ? » lui demandai-je. — « Le roi d’Égypte », dit '''Thalès''', « avait envoyé à '''Bias''' une victime, en lui faisant dire d’en couper ce qu’il y avait de plus mauvais et de meilleur, et de le lui renvoyer. Notre sage, avec un discernement merveilleux, en ôta la langue et la fit porter au Roi. Voilà ce qui lui a valu une estime et une admiration si déclarée ». — « Cette raison n’est pas la seule », ajouta '''Niloxène''' ; « c’est encore, que '''Bias''' ne fuit pas, comme vous autres, l’amitié des rois eux-mêmes. Ainsi, vous, '''Thalès''', le roi d’Égypte vous admire beaucoup, et, entre autres choses, il a été, au-delà de ce qu’on peut dire, ravi de la manière dont vous avez mesuré la pyramide sans le moindre embarras et sans avoir eu besoin d’aucun instrument. Après avoir dressé votre bâton à l’extrémité de l’ombre que projetait la pyramide, vous construisîtes deux triangles par la tangence d’un rayon, et vous démontrâtes qu’il y avait la même proportion entre la hauteur du bâton et la hauteur de la pyramide qu’entre la longueur des deux ombres. Mais, comme j’ai dit, on vous accuse de détester les rois ; quelques boutades injurieuses prononcées par vous contre des ''tyrans'' ont été rapportées à [[w:Ahmôsis_II|'''Amasis''']]. Par exemple, l’Ionien '''Molpagore''' vous ayant demandé ce que vous aviez jamais vu de plus extraordinaire, vous lui auriez répondu : « C’est un tyran parvenu à la vieillesse. » Une autre fois, dans un festin, la conversation étant venue à tomber sur les bêtes féroces, vous auriez dit : « La plus méchante bête parmi les animaux sauvages, c’est le tyran, et parmi les animaux apprivoisés le flatteur. » De tels propos ne sont pas de ceux que les rois entendent avec plaisir, lors même qu’ils affectent de n’avoir rien de commun avec les tyrans. » Pour cette dernière réponse, dit '''Thalès''', elle est de '''Pittacus''' : il l’avait adressée un jour en plaisantant à '''Myrsile'''. Quant au premier propos, ce n’était pas « un tyran » que j’avais dit, mais « un [[wikt:κυβερνήτης#Grec_ancien|''pilote'']] », qui soit parvenu à la vieillesse. Toutefois, puisqu’on a changé la destination du mot, je fais comme le jeune homme qui, ayant jeté une pierre à un chien, atteignit sa belle-mère et s’écria : Même ainsi, ce n’est pas mal. » C’est pourquoi je regardai '''Solon''' comme éminemment sage lorsqu’il n’accepta pas la tyrannie ; et '''Pittacus''', s’il n’eût approché de la monarchie, n’aurait pas eu à dire : « Il est difficile d’être homme de bien. » Quant à '''Périandre''', il semble qu’ayant été saisi par le souverain pouvoir comme par une maladie de famille, il ne s’en tire pas trop mal. Il use, au moins jusqu’à présent, de sociétés salutaires. Il réunit, pour entretenir commerce avec eux, ses hommes remplis de sens ; et le conseil que lui a donné mon compatriote [[w:Thrasybule_de_Milet|'''Thrasybule''']] [[#Thrasybule|<span id="Thrasybule_back"><sup>'''I'''</sup></span>]], de décapiter l’aristocratie, il ne l’a pas accepté. Entre un laboureur qui aimerait mieux voir dans son champ de l’[[w:Ivraie|''ivraie'']] ou de l’[[w:Orobanche|''orobanche'']] que de l’orge ou du blé, et un tyran qui veut régner sur des esclaves plutôt que sur des hommes de coeur, je ne vois aucune différence. Un seul bien compense les maux nombreux attachés au pouvoir des tyrans : c’est la gloire et l’honneur qui leur sont réservés lorsque, commandant à des hommes vertueux, ils sont plus vertueux eux-mêmes, et qu’au milieu de grands ils se montrent plus grands. Ceux qui préfèrent leur sûreté en renonçant à ce beau rôle, étaient faits pour réunir sous leur main beaucoup de moutons, de chevaux et de boeufs, mais non des hommes. » « Du reste », continua '''Thalès''', « ce sont propos sans portée aucune que ceux où nous a jetés cet étranger, et nous avons omis de dire et de chercher les choses qui conviennent bien à des gens partis pour un banquet. Ne croyez-vous pas, '''Nicarque''', qu’il y ait des préparatifs à faire quand on vient prendre place à un festin, comme il y en a pour celui qui doit le donner ? Les [[w:Sybaris|''Sybarites'']] [[#Sybaris|<span id="Sybaris_back"><sup>'''II'''</sup></span>]], à ce qu’il paraît, s’y prennent un an d’avance pour adresser leurs invitations aux femmes, afin qu’elles puissent à loisir préparer leur toilette et leurs bijoux en or avant de se rendre au festin; et, selon moi, il faut plus de temps encore à un convive pour les préparatifs vraiment nécessaires, parce qu’il est plus difficile de trouver un ajustement convenable pour son moral que la vaine et inutile parure dont on s’inquiète pour son corps. Un homme sensé ne se transporte pas à un festin comme un bocal qu’il s’agit d’y remplir. Il songe à trouver là une occasion de passer tour à tour du sérieux au badinage, d’entendre et de tenir lui-même ces propos auxquels la circonstance invite les convives s’ils veulent se rendre la réunion agréable les uns aux autres. En effet on est libre de repousser un mauvais ragoût, et si le vin ne vaut rien on peut « recourir aux [[w:Naïades|''Naïades'']] »; mais un convive qui vous donne mal à la tête, qui est lourd, qui ne sait pas se conduire, vous fait perdre et vous gâte le plaisir de tout vin, de toute bonne chère, de toute musique. On n’est même pas le maître de se débarrasser aussi complétement qu’on le voudrait d’un tel désagrément. Quelques-uns en gardent tant qu’ils vivent du mécontentement les uns contre les autres : il leur semble qu’il leur reste comme un arrière-goût de viandes mal digérées, parce qu’ils conservent le souvenir d’injures ou de colères échangées dans le vin. C’est pour cela que '''Chilon''', invité hier, n’a pas voulu promettre avant d’avoir su le nom de chacun des convives : « Car on est bien obligé, a-t-il dit, de supporter un désagréable compagnon de traversée, de tente, quand il faut être sur terre ou à l’armée ; mais se mêler indifféremment à table avec les premiers venus, n’est pas le propre d’un homme sensé. » Le squelette des ''Égyptiens'', qu’ils ont la sage coutume de produire et de placer dans la salle du festin afin d’engager à se souvenir que l’on sera bientôt comme lui, survient là comme un convive assez désagréable et intempestif, mais enfin la présence s’en explique. Si cette vue n’excite pas à boire et à se réjouir, elle engage du moins à s’aimer, à se chérir les uns les autres, et elle exhorte à ne pas allonger par des tracas pénibles une existence dont la durée est si courte. </div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §2'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> {{Boîte déroulante début|titre=NdA trad. par Victor Bétolaud de 1870|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Thrasybule_back|<span id="Thrasybule"><sup>I</sup></span>]] Du nom propre grec ancien Θρᾰσῠ́βουλος / Thrăsŭ́boulos [[wikt:en:Θρασύβουλος#Ancient_Greek|(en)]] ;<br /><p style="margin: 0 2em; text-indent: 15px">➥ de l’adjectif [[wikt:θρασύς#Grec_ancien|θρᾰσύς / thrăsús]], « confiant, audacieux » ;<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ du nom commun [[wikt:βουλή#Grec_ancien|βουλή / boulế]], « Volonté. Décision, conseil. Conseil, sénat athénien. »; du verbe [[wikt:βούλομαι#Grec_ancien|βούλομαι / boúlomai]], « Vouloir, désirer, souhaiter. Vouloir bien, consentir à. » ;<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ -ος (-os).<br /><br /><p style="margin: 0 2em; text-indent: 15px">[[#Sybaris_back|<span id="Sybaris"><sup>II</sup></span>]] Du nom propre grec ancien Σῠ́βᾰρῐς / Sŭ́bărĭs [[wikt:en:Σύβαρις#Ancient_Greek|(en)]] ;<br /><p style="margin: 0 2em; text-indent: 15px">[[w:Colonisation grecque|Colonie grecque]] du sud de l’Italie (en [[w:Calabre|Calabre]] actuelle), fondée au [[w:VIIIe_siècle_av._J.-C.|VIII<sup>ème</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]] dans le cadre du mouvement d’établissement et d’[[w:Colonisation_grecque|''essaimage'']] des Grecs vers l’Occident, particulièrement en [[w:Grande-Grèce|''Grande-Grèce'']]. Réputée dès l’Antiquité pour sa richesse devenue proverbiale, ainsi que pour son emprise sur les peuples voisins et différentes cités grecques de son voisinage, elle est détruite à l’issue d’une [[w:Guerre entre Sybaris et Crotone|guerre]] qui l’oppose à [[w:Crotone|''Crotone'']] à la fin du [[w:VIe_siècle_av._J.-C.|VI<sup>ème</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]], et enfouie sous les eaux du fleuve ''Crathis'' (aujourd’hui [[Crati]]), avant de voir son site réoccupé, soixante ans plus tard, par la colonie [[w:Panhellénisme|''panhellénique'']] de [[w:Thourioï|''Thourioï'']].'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">'''Périandre''' avait fait préparer le banquet, non à la ville même, mais au ''port de Léchée'' [[#Léchée_NdT_DR|<span id="Léchée_NdT_DR_back"><sup>1</sup></span>]], dans une salle voisine du ''temple de Vénus'', à qui l’on devait offrir un sacrifice. Depuis que sa mère, victime d’un malheureux amour [[#Cratée_NdT_DR|<span id="Cratée_NdT_DR_back"><sup>2</sup></span>]], s’était donné la mort, il n’avait pas encore sacrifié à cette déesse, et c’était la première fois qu’il y pensait, d’après un songe de '''Mélisse''' [[#Mélisse_NdT_DR|<span id="Mélisse_NdT_DR_back"><sup>3</sup></span>]]. Nous étions dans les plus grandes chaleurs de l’été. Le grand nombre des voitures et des gens de pied qui fréquentaient le chemin qui conduit à la mer, l’avaient couvert de poussière et le rendaient fort incommode pour les voyageurs. On avait amené, pour chaque convive, un char commode et proprement orné. '''Thalès''', en voyant le sien à ma porte, se mit à sourire et le refusa. Nous primes donc, à travers les champs, un sentier détourné, et nous allâmes, en nous promenant, suivis de '''Niloxène''' de ''Naucrate'' [[#Niloxène_NdT_DR|<span id="Niloxène_NdT_DR_back"><sup>4</sup></span>]], homme du plus grand mérite, que '''Thalès''' et '''Solon''' avaient autrefois beaucoup connu en ''Égypte''. Il était envoyé, pour la seconde fois, vers '''Bias''', sans savoir lui-même quel était l’objet de sa mission. Il se doutait seulement que la lettre dont '''Amasis''' l’avait chargé contenait une seconde question à résoudre. Il avait ordre, en cas que '''Bias''' refusât d’y répondre, de la proposer aux plus sages d’entre les ''Grecs''. Dès qu’il m’eut aperçu, il me dit en me montrant sa lettre : « J’ai du bonheur aujourd’hui. Cette lettre vous trouve tous réunis. Je la porte au banquet, comme vous voyez. - Si c’est une question épineuse, dit '''Thalès''' en souriant, retournez à ''Priene'' [[#Priene_NdT_DR|<span id="Priene_NdT_DR_back"><sup>5</sup></span>]], '''Bias''' la résoudra, comme il a résolu la première. - Quelle était cette première question, demandai-je à '''Thalès''' ? - Le roi d’Égypte, me répondit-il, avait envoyé une victime à '''Bias''', en lui faisant dire d’en couper ce qu’il y avait de meilleur et de plus mauvais, et de le lui renvoyer. Notre sage, fort habilement en ôta la langue, qu’il lui fit porter. Voilà ce qui lui a mérité l’estime et l’admiration de ce prince. - Ajoutez encore à cette première raison, dit '''Niloxène''', que '''Bias''' ne dédaigne pas, comme vous, l’amitié des rois ; car '''Amasis''' n’a pas moins d’estime pour vous ; il admire surtout la manière dont vous mesurâtes, avec la plus grande facilité et sans aucun instrument mathématique, la hauteur de la pyramide. En dressant votre bâton à l’extrémité de l’ombre qu’elle faisait sur la terre, le rayon solaire qui touchait le sommet de la pyramide et l’extrémité du bâton forma deux triangles ; et vous démontrâtes qu’il y avait la même proportion entre la hauteur du bâton et celle de la pyramide qu’entre la longueur des ombres projetées par l’une et par l’autre. Mais, comme je viens de le dire, on vous accuse, auprès de lui, d’être l’ennemi des rois, et on lui a rapporté plusieurs propos injurieux que vous avez tenus contre les tyrans [[#tyrans_NdT_DR|<span id="tyrans_NdT_DR_back"><sup>6</sup></span>]] ; entre autres que l’''Ionien'' '''Molpagore''' [[#Molpagore_NdT_DR|<span id="Molpagore_NdT_DR_back"><sup>7</sup></span>]] vous ayant demandé ce qui vous paraîtrait plus extraordinaire dans la vie, vous lui répondîtes : de voir vieillir un tyran. Une autre fois, comme on vint à parler, dans un repas, du naturel des animaux, vous dîtes que le plus méchant des animaux sauvages était le tyran, et des animaux domestiques, le flatteur. Les rois, quoiqu’ils affectent de ne rien avoir de commun avec les tyrans, n’aiment pas cependant ces sortes de discours. Cette dernière réponse, dit '''Thalès''', est de '''Pittacus''' ; il la fit un jour, en plaisantant, à ''Myrsile'' [[#Myrsile_NdT_DR|<span id="Myrsile_NdT_DR_back"><sup>8</sup></span>]]. Dans la première, je parlais d’un pilote, et non pas d’un tyran. Mais puisqu’on en a fait application au tyran, je dirai comme ce jeune homme qui, jetant une pierre à son chien, en avait atteint sa belle-mère : « Le coup n’est pas perdu. » Aussi jamais '''Solon''' ne montra-t-il plus de sagesse, à mon gré, que lorsqu’il refusa la tyrannie ; et si '''Pittacus''' n’eût pas été contraint de l’accepter, il n’eût point dit qu’il est à charge d’être vertueux [[#Pittacus_NdT_DR|<span id="Pittacus_NdT_DR_back"><sup>9</sup></span>]]. Il est vrai que '''Périandre''', qui a succédé à l’autorité des tyrans, paraît jusqu’ici opposer à ce mal héréditaire un remède puissant, par le soin qu’il a de rechercher les entretiens et les avis salutaires des hommes vertueux , et par l’horreur qu’il a témoignée pour le conseil barbare que notre compatriote '''Thrasybule''' lui donnait de faire mourir les grands. Un tyran qui veut commander à des esclaves, plutôt qu’à des hommes, ressemble à un laboureur qui aimerait mieux voir son champ couvert de passereaux et de sauterelles que d’orge et de froment. Le seul bien qui puisse compenser tant de maux attachés au pouvoir des tyrans, c’est d’avoir, même sur les plus grands et les plus vertueux de leurs sujets, la supériorité de l’honneur et de la vertu. Ceux qui préfèrent la sûreté à la gloire sont faits pour commander à des troupeaux, et non pour gouverner des hommes. « Mais '''Niloxène''' nous a jetés dans une conversation absolument étrangère à notre objet, et nous a fait négliger ce qui devait nous occuper en allant au banquet. Ne pensez-vous pas que les conviés ont, aussi bien que leur hôte, des apprêts à faire. Les ''Sybarites'', dit-on, prient les femmes à souper un an d’avance, afin qu’elles puissent préparer à loisir leurs habits et leurs bijoux [[#Sybarites_NdT_DR|<span id="Sybarites_NdT_DR_back"><sup>10</sup></span>]]. Pour moi, je pense qu’il faut encore plus de temps à un convive pour faire tous les préparatifs convenables, parcequ’il est bien plus difficile d’orner son esprit comme il faut, que de donner à son corps une parure vaine et superflue. Un homme sensé doit aller à un festin, non pour y remplir son estomac, comme un vase, mais pour écouter et tenir à son tour des propos utiles ou amusants, suivant les circonstances. C’est le seul moyen de rendre le repas agréable aux convives. En effet, on peut laisser un mauvais ragoût, et recourir à l’eau quand le vin n’est pas bon ; mais un convive désagréable, importun et fatigant, fait perdre tout le plaisir de la bonne chère et de la musique. On ne peut se délivrer de l’ennui qu’il cause, et souvent même une parole vive ou offensante qu’il se sera permise dans la liberté de la table, fait naître des aversions et des ressentiments qui ne finissent qu’avec la vie. Aussi '''Chilon''', invité hier à ce banquet, ne voulut-il accepter qu’après qu’on lui eut nommé tous les convives. Il disait avec raison, que quand on est sur mer ou dans un camp, il faut nécessairement supporter les compagnons qui nous sont associés, quelque fâcheux qu’ils soient ; mais dans un festin, il n’est pas d’un homme sensé de se mêler indifféremment avec toutes sortes de personnes. Le squelette que les ''Égyptiens'' placent ordinairement à côté d’eux dans leurs repas, en s’exhortant à penser qu’ils seront bientôt dans le même état, est, à la vérité, un compagnon de table assez triste et assez déplacé. Il est néanmoins utile, sinon pour les exciter au plaisir, du moins pour les porter à la bienveillance et à l’amitié réciproque, et pour les avertir de ne pas remplir d’aigreur et de querelles le temps si court de la vie [[#squelette_NdT_DR|<span id="squelette_NdT_DR_back"><sup>11</sup></span>]]. » </div> <table cellspacing=15 style="margin: 0 4em; font-size:85%;"> <tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Léchée_NdT_DR_back|<span id="Léchée_NdT_DR"><sup>1</sup></span>]] L’isthme de ''Corinthe'' avait deux ports, l’un sur la côte orientale, appelé ''Cenchrées'' ; et l’autre sur la côte occidentale, nommé ''Léchée''. Pausanias, qui a donné une description si détaillée de la ''Grèce'', parle d’un ''temple de Vénus'', bâti sur le port de ''Cenchrées'', et dont la statue était de marbre ; mais il ne fait pas mention de celui que cite Plutarque, et qu’il place près du port occidental. ''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Cratée_NdT_DR_back|<span id="Cratée_NdT_DR"><sup>2</sup></span>]] La mère de Périandre se nommait Cratée. On peut voir dans Parthenius la manière dont elle conçut et nourrit une passion incestueuse pour son fils, les moyens qu'elle prit pour la satisfaire sans être connue, et comment elle fut découverte. Les remords qu’elle en eut l’obligèrent de se donner la mort.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Mélisse_NdT_DR_back|<span id="Mélisse_NdT_DR"><sup>3</sup></span>]] Mélisse était fille de Proclès, roi d’[[w:Épidaure_(cité_antique)|''Épidaure'']]. On prétend que Périandre en devint éperdument amoureux pour l’avoir vue dans l’habillement ordinaire aux femmes du ''Péloponnèse''. Cette passion toutefois ne l’empêcha pas de partager son cœur entre elle et plusieurs concubines. Elles parvinrent à l’irriter contre elle au point qu’un jour, par un mouvement de jalousie, il la frappa d’un coup de pied, sans songer qu’elle était enceinte, et la fit mourir.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Niloxène_NdT_DR_back|<span id="Niloxène_NdT_DR"><sup>4</sup></span>]] Niloxène signifie hôte du ''Nil'' : ce nom semble indiquer que c’est un personnage supposé.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Priene_NdT_DR_back|<span id="Priene_NdT_DR"><sup>5</sup></span>]] Ville d’''Ionie'', colonie des ''Thébains'' et patrie de Bias.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#tyrans_NdT_DR_back|<span id="tyrans_NdT_DR"><sup>6</sup></span>]] Par le mot [[wikt:τύραννος#Grec_ancien|τύραννος]], que nous ne pouvons rendre en français que par celui de tyran, les ''Grecs'' entendaient, non pas seulement, comme nous, un prince injuste et cruel ; mais, en général, tout homme qui s’était emparé de l’autorité monarchique dans un état libre, sans qu’elle lui fût légitimement acquise.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Molpagore_NdT_DR_back|<span id="Molpagore_NdT_DR"><sup>7</sup></span>]] Ce Molpagore est peut-être le père d’Aristagore, que Darius établit tyran à ''Milet''.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Myrsile_NdT_DR_back|<span id="Myrsile_NdT_DR"><sup>8</sup></span>]] Myrsile n’est guère mieux connu que Molpagore. Strabon le met au nombre de ces ''Lesbiens'' ambitieux, qui, du temps de Pittacus, s’étaient emparés de l’autorité souveraine à ''Lesbos'', et dont le poète [[w:Alcée_de_Mytilène|Alcée]] avait flétri la mémoire.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Pittacus_NdT_DR_back|<span id="Pittacus_NdT_DR"><sup>9</sup></span>]] Pittacus en se voyant forcé, dans sa vieillesse, de reprendre le gouvernement des affaires, prononça cette maxime.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Sybarites_NdT_DR_back|<span id="Sybarites_NdT_DR"><sup>10</sup></span>]] Cet usage des ''Sybarites'' n’avait lieu que dans les festins publics.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#squelette_NdT_DR_back|<span id="squelette_NdT_DR"><sup>11</sup></span>]] Cet usage, d'’abord particulier aux ''Egyptiens'', avait ensuite passé chez les ''Grecs'', de qui les ''Romains'' l'’empruntèrent. ''' </td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe III.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage de la reconnaissance de la sagesse de '''Cléobuline''' ''« Eumétis »'' par '''Thalès''', de l’humilité de ce dernier et de son [[w:Cynisme|''cynisme'']].</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§3. Ἐν τοιούτοις λόγοις γενόμενοι κατὰ τὴν ὁδὸν ἀφικόμεθα πρὸς τὴν οἰκίαν, καὶ λούσασθαι μὲν ὁ Θαλῆς οὐκ ἠθέλησεν, ἀληλιμμένοι γὰρ ἦμεν· ἐπιὼν δὲ τούς τε δρόμους ἐθεᾶτο καὶ τὰς παλαίστρας καὶ τὸ ἄλσος τὸ παρὰ τὴν θάλατταν ἱκανῶς διακεκοσμημένον, ὑπ´ οὐδενὸς ἐκπληττόμενος τῶν τοιούτων, ἀλλ´ ὅπως μὴ καταφρονεῖν δοκοίη μηδ´ ὑπερορᾶν τοῦ Περιάνδρου τῆς φιλοτιμίας. τῶν δ´ ἄλλων τὸν ἀλειψάμενον ἢ λουσάμενον οἱ θεράποντες εἰσῆγον εἰς τὸν ἀνδρῶνα διὰ τῆς στοᾶς. Ὁ δ´ Ἀνάχαρσις ἐν τῇ στοᾷ καθῆστο, καὶ παιδίσκη προειστήκει τὴν κόμην ταῖς χερσὶ διακρίνουσα. ταύτην ὁ Θαλῆς ἐλευθεριώτατά πως αὐτῷ προσδραμοῦσαν ἐφίλησε καὶ γελάσας « οὕτως, » ἔφη, « ποίει καλὸν τὸν ξένον, ὅπως ἡμερώτατος ὢν μὴ φοβερὸς ᾖ τὴν ὄψιν ἡμῖν μηδ´ ἄγριος. » Ἐμοῦ δ´ ἐρομένου περὶ τῆς παιδὸς ἥτις εἴη, « τὴν σοφήν, » ἔφη, « καὶ περιβόητον ἀγνοεῖς Εὔμητιν; οὕτω γὰρ ταύτην ὁ πατὴρ αὐτός, οἱ δὲ πολλοὶ πατρόθεν ὀνομάζουσι Κλεοβουλίνην. » Καὶ ὁ Νειλόξενος εἶπεν « ἦ που τὴν περὶ τὰ αἰνίγματα δεινότητα καὶ σοφίαν, » ἔφη, « τῆς κόρης ἐπαινεῖς· καὶ γὰρ εἰς Αἴγυπτον ἔνια τῶν προβαλλομένων ὑπ´ αὐτῆς διῖκται. » « Οὐκ ἔγωγ´, » εἶπεν ὁ Θαλῆς· « τούτοις γὰρ ὥσπερ ἀστραγάλοις, ὅταν τύχῃ, παίζουσα χρῆται καὶ διαβάλλεται πρὸς τοὺς ἐντυχόντας. ἀλλὰ καὶ φρόνημα θαυμαστὸν καὶ νοῦς ἔνεστι πολιτικὸς καὶ φιλάνθρωπον ἦθος, καὶ τὸν πατέρα τοῖς πολίταις πραότερον ἄρχοντα παρέχει καὶ δημοτικώτερον. » « Εἶεν, » ὁ Νειλόξενος ἔφη, « καὶ φαίνεται βλέποντι πρὸς τὴν λιτότητα καὶ ἀφέλειαν αὐτῆς· Ἀνάχαρσιν δὲ πόθεν οὕτω τημελεῖ φιλοστόργως; » « Ὅτι, » ἔφη, « σώφρων ἀνήρ ἐστι καὶ πολυμαθής, καὶ τὴν δίαιταν αὐτῇ καὶ τὸν καθαρμόν, ᾧ χρῶνται Σκύθαι περὶ τοὺς κάμνοντας, ἀφθόνως καὶ προθύμως παραδέδωκε. καὶ νῦν οἶμαι περιέπειν αὐτὴν τὸν ἄνδρα καὶ φιλοφρονεῖσθαι, μανθάνουσάν τι καὶ προσδιαλεγομένην. » Ἤδη δὲ πλησίον οὖσιν ἡμῖν τοῦ ἀνδρῶνος ἀπήντησεν Ἀλεξίδημος ὁ Μιλήσιος (ἦν δὲ Θρασυβούλου τοῦ τυράννου νόθος) καὶ ἐξῄει τεταραγμένος καὶ σὺν ὀργῇ τινι πρὸς αὑτὸν οὐδὲν ἡμῖν γε σαφὲς διαλεγόμενος. ὡς δὲ τὸν Θαλῆν εἶδε, μικρὸν ἀνενεγκὼν καὶ καταστάς « οἵαν ὕβριν, » εἶπεν, « εἰς ἡμᾶς Περίανδρος ὕβρικεν, ἐκπλεῦσαι μὲν οὐκ ἐάσας ὡρμημένον ἀλλὰ προσμεῖναι δεηθεὶς τὸ δεῖπνον, ἐλθόντι δὲ νέμων κλισίαν ἄτιμον, Αἰολεῖς δὲ καὶ νησιώτας (καὶ τίνας γὰρ οὐχί;) Θρασυβούλου προτιμῶν· Θρασύβουλον γὰρ ἐν ἐμοὶ τὸν πέμψαντα προπηλακίσαι βουλόμενος καὶ καταβαλεῖν ὡς δὴ περιορῶν δῆλός ἐστιν. » « Εἶτ´, » ἔφη, « σὺ δέδιας μὴ καθάπερ Αἰγύπτιοι τοὺς ἀστέρας ὑψώματα καὶ ταπεινώματα λαμβάνοντας ἐν τοῖς τόποις οὓς διεξίασι γίγνεσθαι βελτίονας ἢ χείρονας ἑαυτῶν λέγουσιν, οὕτως ἡ περὶ σὲ διὰ τὸν τόπον ἀμαύρωσις ἢ ταπείνωσις γένηται; καὶ τοῦ Λάκωνος ἔσῃ φαυλότερος, ὃς ἐν χορῷ τινι κατασταθεὶς εἰς τὴν ἐσχάτην χώραν ὑπὸ τοῦ ἄρχοντος ‘εὖ γ´,’ εἶπεν, ‘ἐξεῦρες, ὡς καὶ αὕτα ἔντιμος γένηται.’ οὐ καταλαβόντας, » ἔφη, « τόπον μετὰ τίνας κατακείμεθα δεῖ ζητεῖν, μᾶλλον δ´ ὅπως εὐάρμοστοι τοῖς συγκατακειμένοις ὦμεν, ἀρχὴν καὶ λαβὴν φιλίας εὐθὺς ἐν αὐτοῖς ζητοῦντες, μᾶλλον δ´ ἔχοντες τὸ μὴ δυσκολαίνειν ἀλλ´ ἐπαινεῖν ὅτι τοιούτοις συγκατεκλίθημεν· ὡς ὅ γε τόπῳ κλισίας δυσχεραίνων δυσχεραίνει τῷ συγκλίτῃ μᾶλλον ἢ τῷ κεκληκότι, καὶ πρὸς ἀμφοτέρους ἀπεχθάνεται. » « Λόγος, » ἔφη, « ταῦτ´ ἄλλως ἐστίν » ὁ Ἀλεξίδημος, « ἔργῳ δὲ καὶ τοὺς σοφοὺς ὑμᾶς ὁρῶ τὸ τιμᾶσθαι διώκοντας, » καὶ ἅμα παραμειψάμενος ἡμᾶς ἀπῆλθε. Καὶ ὁ Θαλῆς πρὸς ἡμᾶς τὴν ἀτοπίαν τοῦ ἀνθρώπου θαυμάζοντας, « ἔμπληκτος, » ἔφη, « καὶ ἀλλόκοτος φύσει, ἐπεὶ καὶ μειράκιον ὢν ἔτι, μύρου σπουδαίου Θρασυβούλῳ κομισθέντος, εἰς ψυκτῆρα κατεράσας μέγαν καὶ προσεγχέας ἄκρατον ἐξέπιεν, ἔχθραν ἀντὶ φιλίας Θρασυβούλῳ διαπεπραγμένος. » Ἐκ τούτου περιελθὼν ὑπηρέτης « κελεύει σε Περίανδρος, » ἔφη, « καὶ Θαλῆν παραλαβόντα τοῦτον ἐπισκέψασθαι τὸ κεκομισμένον ἀρτίως αὐτῷ πότερον ἄλλως γέγονεν ἤ τι σημεῖόν ἐστι καὶ τέρας· αὐτὸς μὲν γὰρ ἔοικε τεταράχθαι σφόδρα, μίασμα καὶ κηλῖδα τῆς θυσίας ἡγούμενος. » ἅμα δ´ ἀπῆγεν ἡμᾶς εἴς τι οἴκημα τῶν περὶ τὸν κῆπον. ἐνταῦθα νεανίσκος ὡς ἐφαίνετο νομευτικός, οὔπω γενειῶν ἄλλως τε τὸ εἶδος οὐκ ἀγεννής, ἀναπτύξας τινὰ διφθέραν ἔδειξεν ἡμῖν βρέφος ὡς ἔφη γεγονὸς ἐξ ἵππου, τὰ μὲν ἄνω μέχρι τοῦ τραχήλου καὶ τῶν χειρῶν ἀνθρωπόμορφον, τὰ λοιπὰ δ´ ἔχον ἵππου, τῇ δὲ φωνῇ καθάπερ τὰ νεογνὰ παιδάρια κλαυθμυριζόμενον. ὁ μὲν οὖν Νειλόξενος, « Ἀλεξίκακε » εἰπών, ἀπεστράφη τὴν ὄψιν, ὁ δὲ Θαλῆς προσέβλεπε τῷ νεανίσκῳ πολὺν χρόνον, εἶτα μειδιάσας (εἰώθει δ´ ἀεὶ παίζειν πρὸς ἐμὲ περὶ τῆς τέχνης) « ἦ που τὸν καθαρμόν, ὦ Διόκλεις, » ἔφη, « κινεῖν διανοῇ καὶ παρέχειν πράγματα τοῖς ἀποτροπαίοις, ὥς τινος δεινοῦ καὶ μεγάλου συμβάντος; » « Τί δ´, » εἶπον, « οὐ μέλλω; στάσεως γάρ, ὦ Θαλῆ, καὶ διαφορᾶς τὸ σημεῖόν ἐστι, καὶ δέδια μὴ μέχρι γάμου καὶ γενεᾶς ἐξίκηται, πρὶν ἢ τὸ πρῶτον ἐξιλάσασθαι μήνιμα, τῆς θεοῦ δεύτερον ὡς ὁρᾷς προφαινούσης. » Πρὸς τοῦτο μηδὲν ἀποκρινάμενος ὁ Θαλῆς ἀλλὰ γελῶν ἀπηλλάττετο. καὶ τοῦ Περιάνδρου πρὸς τὰς θύρας ἀπαντήσαντος ἡμῖν καὶ διαπυθομένου περὶ ὧν εἴδομεν, ἀφεὶς ὁ Θαλῆς με καὶ λαβόμενος τῆς ἐκείνου χειρὸς ἔφη, « ἃ μὲν Διοκλῆς κελεύει δράσεις καθ´ ἡσυχίαν· ἐγὼ δέ σοι παραινῶ νέοις οὕτω μὴ χρῆσθαι νομεῦσιν ἵππων, ἢ διδόναι γυναῖκας αὐτοῖς. » Ἔδοξε μὲν οὖν μοι τῶν λόγων ἀκούσας ὁ Περίανδρος ἡσθῆναι σφόδρα· καὶ γὰρ ἐξεγέλασε καὶ τὸν Θαλῆν περιβαλὼν κατησπάσατο. κἀκεῖνος « οἶμαι δ´, » εἶπεν, « ὦ Διόκλεις, καὶ πέρας ἔσχε τὸ σημεῖον· ὁρᾷς γὰρ ἡλίκον κακὸν γέγονεν ἡμῖν, Ἀλεξιδήμου συνδειπνεῖν μὴ θελήσαντος. » </div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §3'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§3. Ce fut en tenant de tels propos chemin faisant, que nous arrivâmes à la maison. '''Thalès''' ne voulut pas se baigner : « Je me suis frotté d’huile. » dit-il. Il se promena donc de côté et d’autre, regardant les champs de course, les palestres, et le bois sacré, voisin de la mer, que l’on avait bien convenablement disposé. Ce n’était pas qu’il fût frappé par aucun de ces préparatifs, mais il voulait ne pas avoir l’air de mépriser '''Périandre''' et de faire peu de cas de l’empressement avec lequel celui-ci honorait ses hôtes. Pour les autres convives, à mesure qu’ils s’étaient parfumés ou baignés, les serviteurs les introduisaient par la galerie dans la salle du banquet. Or '''Anacharsis''' s’était installé dans cette galerie, et devant lui une jeune fille se tenait, lui séparant les cheveux avec ses mains. Lorsqu’entra '''Thalès''', elle s’élança très librement à sa rencontre, et '''Thalès''', après l’avoir embrassée, lui dit en riant : « Continue à rendre bien beau notre étranger, afin qu’étant devenu la douceur même il ne conserve pas au milieu de nous une mine à faire peur et un aspect sauvage. » Je lui demandai quelle était cette jeune enfant : « Quoi ! » me dit-il, « vous ne connaissez pas la savante et célèbre '''Eumétis''' ! car c’est ainsi que son père la nomme : le plus communément on l’appelle '''Cléobuline''', du nom paternel. » Et '''Niloxène''' : « C’est sans doute à cause de son talent et de son habileté pour les énigmes, que vous faites l’éloge de cette jeune fille : car quelques-unes de celles qu’elle a proposées sont parvenues jusqu’en ''Égypte''. » — « Ce n’est pas à cause de cela », répondit '''Thalès''' : « les énigmes sont pour elle des joujoux dont elle s’amuse à l’occasion pour faire sa partie avec ceux qui se rencontrent. Mais ce qui est admirable en elle c’est sa profondeur d’esprit, son sens politique, l’aménité de son caractère, et le talent qu’elle a de rendre plus douce l’autorité de son père et d’inspirer à celui-ci des sentiments plus humains à l’égard du peuple. » — « Soit », dit '''Niloxène''' ; « et cela se reconnaît à voir sa modestie et sa simplicité. Mais d’où vient qu’elle prend un soin si amoureux de la toilette d’'''Anacharsis''' ? » — Parce que c’est, répondit '''Thalès''', « un sage, un homme des plus instruits, et parce qu’il lui a communiqué, avec de nombreux détails et de grand coeur, l’ensemble des pratiques sanitaires et des purifications que les ''Scythes'' appliquent au traitement des malades. Et dans ce moment je suppose qu’elle l’entoure de soins et d’amitiés parce qu’elle s’instruit de quelque chose en conversant avec lui. » Comme nous étions déjà près de la salle, '''Alexidème''' le ''Milésien'' vint à notre rencontre. C’était un bâtard du tyran '''Thrasybule'''. Il était sorti tout troublé, et avec une sorte de fureur il se parlait à lui-même, mais ses paroles n’avaient rien de clair pour nous. Quand il eut vu '''Thalès''', il se remit un peu ; puis, s’arrêtant tout court : « Quel affront '''Périandre''' vient de nous faire ! Je voulais mettre à la voile : il ne l’a pas permis ; il m’a supplié de rester à son festin, et quand j’arrive, il me donne une des dernières places, faisant passer des [[w:Éoliens|''Éoliens'']], des insulaires (je ne sais qui il ne me préfère pas), les faisant passer, dis je, avant '''Thrasybule''', car c’est '''Thrasybule''' en ma personne, c’est celui par lequel je suis envoyé qu’il a l’intention de traîner dans la boue et de ravaler comme le méprisant : la chose est bien claire. » — « Eh quoi ! » lui dit '''Thalès''', « êtes-vous comme les ''Égyptiens'', qui prétendent que les astres, suivant qu’ils prennent une position élevée ou basse en parcourant leur orbite, ont une condition meilleure ou pire qu’ils ne l’avaient ? Craignez-vous, pareillement, qu’autour de vous, en raison de la place où vous serez, il ne se produise obscurité ou dépression ? Serez-vous moins résigné que certain ''Spartiate'' ? À je ne sais quelle représentation il avait été placé au dernier rang par le maître des cérémonies : « Voilà qui va bien », lui dit-il : « tu as trouvé moyen de rendre honorable ce lieu même. Quand nous avons pris une place nous ne devons pas chercher au-dessous de qui nous sommes installés, mais plutôt comment nous nous mettrons en bon accord avec nos voisins. À leur occasion nous ferons voir tout d’abord, ou plutôt nous l’éprouverons réellement, un désir d’initiative et de prise de possession en matière d’amitié, et nous manifesterons ce désir en nous félicitant, loin d’en montrer du dépit, de ce que l’on nous a placés en une telle compagnie. Mais celui qui se plaint du rang qu’on lui donne à table montre plus de mécontentement contre son commensal que contre son hôte, et il se rend odieux à l’un et à l’autre. » — « Paroles que tout cela, » dit '''Alexidème''', « et paroles sans portée ! Mais je vois que de fait, vous autres sages, vous recherchez aussi les honneurs. » En même temps il s’éloigna de nous et disparut. Une conduite si étrange nous semblait étonnante. « C’est », nous dit '''Thalès''', « un homme écervelé et naturellement bizarre. Vous allez en juger. Il était encore tout jeune ; on avait apporté à '''Thrasybule''' un parfum d’un très haut prix. '''Alexidème''' le versa dans un grand vase à rafraîchir, y mêla du vin pur, et avala le tout, rendant son père odieux au lieu de le faire aimer. » Au même moment parut un serviteur : « Vous êtes invité par '''Périandre''' », me dit-il, « à venir, en vous faisant accompagner de '''Thalès''' que voici, examiner l’objet qu’on lui a récemment apporté, afin que vous disiez si c’est une création toute fortuite, ou bien un présage et une monstruosité; car, pour ce qui est de '''Périandre''', il a l’air grandement troublé, pensant que c’est une souillure et une profanation pour son sacrifice. » En même temps, il nous emmena vers une des salles qui donnaient sur le jardin. Là un jeune homme paraissant appartenir à la classe des bergers, qui n’avait pas encore de barbe et dont la physionomie ne manquait pas de noblesse, déploya une espèce de couverture en cuir, et nous montra un petit enfant né, disait-il, d’une cavale. Par le haut, jusqu’au cou et aux mains, cette créature était de forme humaine ; mais le reste était d’un cheval, et sa voix avait quelque chose des vagissements poussés par les petits enfants qui viennent de naître. « Dieu préservateur ! » s’écria '''Niloxène''', et il détourna les yeux. Mais '''Thalès''' fixa longtemps son regard sur le jeune pâtre; puis s’étant mis à sourire, (car il avait l’habitude de plaisanter toujours avec moi sur ma profession) : « Eh bien, '''Dioclès''', » dit-il, « songez-vous à préparer quelque expiation, et à donner de la besogne aux dieux préservateurs, comme vous trouvant en présence de quelque événement grave et considérable ? » — « Pourquoi non ? » répondis-je : « j’y vois le présage de troubles et de discordes qui s’étendront, j’en ai peur, jusqu’à un mariage et une génération avant que le courroux de la déesse ait été apaisé, puisqu’elle fait, vous le savez, une seconde manifestation ». À ces paroles '''Thalès''' ne répondit rien : il se contenta de rire et de s’en aller. Et comme '''Périandre''' était à la porte, s’avançant pour nous interroger sur ce que nous venions de voir, '''Thalès''' me quitta et le prit par la main : « Ce que '''Dioclès''' prescrira, vous l’exécuterez à loisir », lui dit-il ; « mais moi j’ai un conseil à vous donner : pour faire paître vos juments ne prenez pas de jeunes garçons, ou bien à ceux-ci donnez des femmes. » Ces paroles me semblèrent causer, des qu’il les eut entendues, une vive satisfaction à '''Périandre''', car il éclata de rire et serra très affectueusement '''Thalès''' dans ses bras. '''Thalès''' alors : « '''Dioclès''' », me dit-il, « si je conjecture bien, le prodige reçoit déjà son accomplissement. Car vous voyez quel grand malheur nous est arrivé, '''Alexidème''' n’ayant pas voulu souper avec nous. »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §3'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe IV.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage du caractère désinvolte de '''Thalès'''.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§4. Ἐπεὶ δ´ εἰσήλθομεν, ἤδη μεῖζον ὁ Θαλῆς φθεγξάμενος « ποῦ δ´ » εἶπεν « ὁ ἀνὴρ κατακλινάμενος ἐδυσχέρανεν; » ἀποδειχθείσης δὲ τῆς χώρας περιελθὼν ἐκεῖ κατέκλινεν ἑαυτὸν καὶ ἡμᾶς « ἀλλὰ κἂν ἐπριάμην » εἰπών « Ἀρδάλῳ κοινωνεῖν μιᾶς τραπέζης. » ἦν δὲ Τροιζήνιος ὁ Ἄρδαλος, αὐλῳδὸς καὶ ἱερεὺς τῶν Ἀρδαλείων Μουσῶν, ἃς ὁ παλαιὸς Ἄρδαλος ἱδρύσατο ὁ Τροιζήνιος.<br /><p style="text-align: centre">[...]<br /><p style="text-align: justify; text-indent: 15px">καὶ ὁ Θαλῆς ἐμὲ προσαγορεύσας ἐπάνω τοῦ Βίαντος κατακείμενον « τί οὐκ ἔφρασας, » εἶπεν, « ὦ Διόκλεις, Βίαντι τὸν Ναυκρατίτην ξένον ἥκοντα μετὰ προβλημάτων βασιλικῶν αὖθις ἐπ´ αὐτόν, ὅπως νήφων καὶ προσέχων ἑαυτῷ τὸν λόγον δέχηται; » Καὶ ὁ Βίας « ἀλλ´ οὗτος μέν, » ἔφη, « πάλαι δεδίττεται ταῦτα παρακελευόμενος, ἐγὼ δὲ τὸν Διόνυσον οἶδα τά τ´ ἄλλα δεινὸν ὄντα καὶ Λύσιον ἀπὸ σοφίας προσαγορευόμενον, ὥστ´ οὐ δέδια τοῦ θεοῦ μεστὸς γενόμενος μὴ ἀθαρσέστερον ἀγωνίσωμαι. » Τοιαῦτα μὲν ἐκεῖνοι πρὸς ἀλλήλους ἅμα δειπνοῦντες ἔπαιζον·</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §4'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§4. Après que nous fûmes entrés, '''Thalès''' ayant déjà élevé plus haut la voix: « Où donc », dit-il, « l’avait-on placé, cet homme qui s’en est formalisé ? » Quand on lui eut montré l’endroit il fit le tour de la salle, et ce fut là-même qu’il se plaça et nous installa. « En vérité », ajouta-t-il, « j’aurais payé pour partager la même table qu’'''Ardalus'''. » Cet '''Ardalus''' était un joueur de flûte [[w:Trézène_(ville)|''Trézénien'']] [[#Trézène|<span id="Trézène_back"><sup>'''I'''</sup></span>]], prêtre des ''muses Ardalides'' auxquelles l’antique [[w:Ardalos|'''Ardalus''']] de ''Trézène'' avait dressé des statues.<br /><p style="text-align: centre">[...]<br /><p style="text-indent: 15px">Moi, j’étais au-dessus de '''Bias''', et '''Thalès''' m’ayant interpellé : « '''Dioclès''' », me dit-il, « pourquoi n’avez-vous pas dit à '''Bias''' que l’étranger de ''Naucratie'' est venu une seconde fois le trouver avec des questions de la part de son prince, afin que ce soit à jeun qu’il reçoive ces communications et qu’il y applique son esprit ? » Et '''Bias''' : « Il y a longtemps », dit-il, « que '''Dioclès''' me menace de m’y contraindre ; mais je sais que '''Bacchus''', entre autres attributions merveilleuses, possède une sagacité qui l’a fait surnommer le dieu qui délie, de sorte que je ne crains pas, étant rempli de la divinité, que la confiance m’abandonne au moment de la lutte. » C’est ainsi que, pendant le repas, ils échangeaient entre eux des plaisanteries.</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §4'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> {{Boîte déroulante début|titre=NdA trad. par Victor Bétolaud de 1870|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Trézène_back|<span id="Trézène"><sup>I</sup></span>]] Du nom propre grec ancien Τροιζήν / Troizḗn [[wikt:en:Τροιζήν#Ancient_Greek|(en)]] ;<br /><p style="margin: 0 2em; text-indent: 15px">[[w:polis|Cité grecque]] du [[w:Péloponnèse|''Péloponnèse'']], sur la côte nord de l’[[w:Argolide|Argolide]].'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe VII.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Réflexions de '''Thalès''' sur le défi de sagacité posé par le roi des ''Éthiopiens'' au roi d’''Égypte'', [[w:Ahmôsis_II|'''Amasis''']], consistant à boire la mer. Ce dernier fait appel à '''Bias''' pour la résoudre, et celui-ci souhaite l’examiner en commun avec les sages. '''Chilon''' explique qu’il ne s’agit pas de faire disparaître tant d’eau salée, mais de rendre la domination d’'''Amasis''' potable et douce à ses sujets (§6).</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§7. [...] Ἐπὶ τούτῳ δ´ ὁ '''Θαλῆς''' ἔφησεν, εὐδαιμονίαν ἄρχοντος νομίζειν, εἰ τελευτήσειε γηράσας κατὰ φύσιν.</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §7'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§7. [...] Après lui '''Thalès''' prit la parole : « J’estime que le bonheur pour un souverain, c’est s’il meurt de vieillesse et naturellement. ».</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §7'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe IX.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Réflexions de '''Thalès''' sur le défi de sagacité posé par le roi d’''Égypte'', [[w:Ahmôsis_II|'''Amasis''']], au roi des ''Éthiopiens'', consistant en une série de questions : « Qu’y a-t-il de plus ancien ? Le temps. — De plus grand ? Le monde. — De plus habile ? La vérité. — De plus beau ? La lumière. — De plus commun ? La mort. — De plus utile ? Dieu. — De plus nuisible ? Le mauvais Génie. — De plus puissant ? La Fortune. — De plus facile ? Le plaisir. ». '''Amasis''' fait encore appel à '''Bias''' pour analyser les réponses du roi des ''Éthiopiens'', qui les examinent également en commun avec les sages.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§9. Τούτων πάλιν ἀναγνωσθέντων, ὦ Νίκαρχε, γενομένης σιωπῆς Θαλῆς ἠρώτησε τὸν Νειλόξενον εἰ προσήκατο τὰς λύσεις ὁ Ἄμασις. ἐκείνου δ´ εἰπόντος ὅτι τὰς μὲν ἀπεδέξατο ταῖς δ´ ἐδυσκόλαινε, « καὶ μὴν οὐδέν, » εἶπεν ὁ Θαλῆς, « ἀνεπίληπτόν ἐστιν, ἀλλ´ ἔχει πάντα διαμαρτίας μεγάλας καὶ ἀγνοίας. οἷον εὐθὺς ὁ χρόνος πῶς ἂν εἴη πρεσβύτατον, εἰ τὸ μὲν αὐτοῦ γεγονὸς τὸ δ´ ἐνεστώς ἐστι τὸ δὲ μέλλον; ὁ γὰρ μεθ´ ἡμᾶς ἐσόμενος χρόνος καὶ πραγμάτων τῶν νῦν καὶ ἀνθρώπων νεώτερος ἂν φανείη. τὸ δὲ τὴν ἀλήθειαν ἡγεῖσθαι σοφίαν οὐδὲν ἐμοὶ δοκεῖ διαφέρειν τοῦ τὸ φῶς ὀφθαλμὸν ἀποφαίνειν. εἰ δὲ τὸ φῶς καλόν, ὥσπερ ἐστὶν, ἐνόμιζε, πῶς τὸν ἥλιον αὐτὸν παρεῖδε; τῶν δ´ ἄλλων ἡ μὲν περὶ θεῶν καὶ δαιμόνων ἀπόκρισις θράσος ἔχει καὶ κίνδυνον, ἀλογίαν δὲ καὶ πολλὴν ἡ περὶ τῆς τύχης· οὐ γὰρ ἂν μετέπιπτε ῥᾳδίως οὕτως, ἰσχυρότατον οὖσα τῶν ὄντων καὶ ῥωμαλεώτατον. οὐ μὴν οὐδ´ ὁ θάνατος κοινότατόν ἐστιν· οὐ γάρ ἐστι πρὸς τοὺς ζῶντας. ἀλλ´ ἵνα μὴ δοκῶμεν εὐθύνειν τὰς τῶν ἑτέρων ἀποφάσεις, ἰδίας ταῖς ἐκείνου παραβάλωμεν· ἐμαυτὸν δὲ παρέχω πρῶτον, εἰ βούλεται Νειλόξενος, ἐρωτᾶν καθ´ ἕκαστον. ὡς οὖν ἐγένοντο τότε, κἀγὼ νῦν διηγήσομαι τὰς ἐρωτήσεις καὶ τὰς ἀποκρίσεις· ‘Τί πρεσβύτατον;’ [[wikt:en:θεός#Ancient_Greek|‘θεός,’]] » ἔφη Θαλῆς· « ‘ἀγέν νητον γάρ ἐστι.’ ‘Τί μέγιστον;’ ‘τόπος· τἄλλα μὲν γὰρ ὁ κόσμος, τὸν δὲ κόσμον οὗτος περιέχει.’ ‘Τί κάλλιστον;’ ‘κόσμος· πᾶν γὰρ τὸ κατὰ τάξιν τούτου μέρος ἐστί.’ ‘Τί σοφώτατον;’ ‘χρόνος· τὰ μὲν γὰρ εὕρηκεν οὗτος ἤδη, τὰ δ´ εὑρήσει.’ ‘Τί κοινότατον;’ ‘ἐλπίς· καὶ γὰρ οἷς ἄλλο μηδέν, αὕτη πάρεστι.’ ‘Τί ὠφελιμώτατον;’ ‘ἀρετή· καὶ γὰρ τἄλλα τῷ χρῆσθαι καλῶς ὠφέλιμα ποιεῖ.’ ‘Τί βλαβερώτατον;’ ‘κακία· καὶ γὰρ τὰ πλεῖστα βλάπτει παραγενομένη.’ ‘Τί ἰσχυρότατον;’ ‘ἀνάγκη· μόνον γὰρ ἀνίκητον.’ ‘Τί ῥᾷστον;’ ‘τὸ κατὰ φύσιν, ἐπεὶ πρὸς ἡδονάς γε πολλάκις ἀπαγορεύουσιν.’ » </div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §9'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§9. Cette lecture ainsi reproduite, mon cher '''Nicarque''', il se fit un moment de silence. Après quoi '''Thalès''' demanda à '''Niloxène''' si '''Amasis''' avait accepté de telles solutions. Il répondit que ce monarque avait accepté les unes et qu’il avait été mécontent des autres. « C’est qu’en effet », dit '''Thalès''', « il n’en est aucune qui soit irréprochable, et toutes sont grandement entachées d’erreur et d’ignorance. Ainsi, d’abord, comment le temps pourrait-il être ce qu’il y a de plus ancien, puisque, une partie étant écoulée, je le veux bien, une autre est le présent, une autre est l’avenir ? Le temps qui doit venir après nous est évidemment plus jeune que les hommes d’aujourd’hui, que les événements actuels. Croire que ce qu’il y a de plus habile, ce soit la vérité, c’est, à mon avis, ne pas émettre une autre opinion que celle-ci : l’oeil et la lumière sont tout un. Si du reste l’''Éthiopien'' a cru, ce qui est réel, la lumière plus belle que tout, pourquoi a-t-il négligé de nommer le soleil lui-même ? Des autres réponses, celle qui concerne la Divinité et le Génie est aussi téméraire que dangereuse ; et ce qu’il dit de la Fortune est tout à fait déraisonnable : car elle ne changerait pas avec tant de facilité, si elle était ce qu’il y a de plus puissant et de plus fort au monde. De même, la mort n’est pas ce qu’il y a de plus commun, puisqu’elle n’est pas commune aux vivants. Mais pour que nous ne semblions pas nous borner à redresser les réponses des autres, il faut y opposer nos propres solutions. Je m’y offre le premier, si '''Niloxène''' veut reprendre chaque question ». Telles que furent faites alors et les demandes et les réponses, je vais vous les reproduire aujourd’hui : Qu’y a-t-il de plus ancien ? C’est dieu, répondit '''Thalès''', attendu qu’il est incréé. — De plus grand ? L’espace : car si le monde contient le reste, à son tour il est contenu dans l’espace. — De plus beau ? Le monde : car tout ce qui est bien ordonné en fait partie. ― De plus habile ? Le temps : car c’est lui qui a découvert et qui découvrira tout. — De plus commun ? L’espérance : car ceux même qui n’ont rien autre chose la possèdent. — De plus utile ? La vertu : car elle rend toutes les autres choses utiles par le bon usage qu’elle en fait. — De plus nuisible ? Le vice : car il corrompt tout par sa présence. — De plus puissant ? La nécessité : car elle est seule invincible. De plus facile ? Ce qui est selon la nature : car, pour ce qui est du plaisir, il amène souvent la lassitude.</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §9'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe XI.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Réflexion de '''Thalès''' sur les gouvernements où la loi est égale pour tous.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§11. Ἐπὶ τούτῳ '''Θαλῆς''' τὴν μήτε πλουσίους ἄγαν μήτε πένητας ἔχουσαν πολίτας.</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §11'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§11. Après lui '''Thalès''' : « que c’est celle qui n’a ni des citoyens trop riches, ni des citoyens trop pauvres. »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §11'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe XII.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Réflexion de '''Thalès''' sur la manière dont une maison doit être réglée.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§12. Τοῦτον οὖν ἄριστον ὁ '''Σόλων''' εἶπεν αὑτῷ δοκεῖν οἶκον, ὅπου τὰ χρήματα μήτε κτωμένοις ἀδικία μήτε φυλάττουσιν ἀπιστία μήτε δαπανῶσι μετάνοια πρόσεστιν. Ὁ δὲ '''Βίας''' ἐν ᾧ τοιοῦτός ἐστιν ὁ δεσπότης δι´ αὑτὸν οἷος ἔξω διὰ τὸν νόμον. Ὁ δὲ '''Θαλῆς''' ἐν ᾧ πλείστην ἄγειν τῷ δεσπότῃ σχολὴν ἔξεστιν.</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §12'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§12. '''Solon''' déclara que, selon lui, « la meilleure maison est celle où le bien qui s’y trouve est possédé sans injustice, conservé sans défiance, dépensé sans repentir. » '''Bias''' : « celle où, à l’intérieur, le maître est, par respect pour lui-même, ce qu’il est au dehors par respect pour la loi. » '''Thalès''' : « celle où le maître peut avoir un très grand loisir. »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §12'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe XIV.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage de l’''espièglerie'' de '''Thalès'''.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§14. [...] '''Ἐπιστήσαντος''' δὲ τοῦ λόγου τὸ συμπόσιον ὁ μὲν '''Θαλῆς''' ἐπισκώπτων εὖ φρονεῖν ἔφη τὸν '''Ἐπιμενίδην''' ὅτι μὴ βούλεται πράγματα ἔχειν ἀλῶν τὰ σιτία καὶ πέττων ἑαυτῷ, καθάπερ '''Πιττακός'''. « ἐγὼ γάρ, » εἶπε, « τῆς ξένης ἤκουον ᾀδούσης πρὸς τὴν μύλην, ἐν [[w:Eresós|''Ἐρέσῳ'']] γενόμενος, ἄλει, μύλα, ἄλει· καὶ γὰρ '''Πιττακὸς''' ἄλει μεγάλας ''Μυτιλάνας'' βασιλεύων. »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §14'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§14. [...] Ces paroles ayant mis en arrêt les convives, '''Thalès''' dit en raillant qu’'''Epiménide''' avait bien raison de ne pas vouloir se donner l’embarras de moudre et de cuire lui-même son manger, comme faisait '''Pittacus''' : « Car je me souviens », ajouta-t-il, « qu’étant à ''Lesbos'', j’entendis mon hôtesse chanter à sa meule : Va ton train, meule, va ton train, puisque '''Pittacus''', le roi de la grande ''Mitylène'', s’occupe bien à moudre. »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §14'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe XV.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage d’une doctrine de '''Thalès''' sur l’importance vitale de l’agriculture.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§15. [...] « Οὐδαμῶς, » ὁ '''Κλεόδωρος''', « ἔμοιγ´, » εἶπεν, « εἰ δεῖ τὸ φαινόμενον εἰπεῖν, καὶ μάλιστα παρακειμένης τραπέζης, ἣν ἀναιροῦσιν αἰρομένης τροφῆς φιλίων θεῶν βωμὸν οὖσαν καὶ ξενίων. ὡς δὲ '''Θαλῆς''' λέγει τῆς γῆς ἀναιρεθείσης σύγχυσιν τὸν ὅλον ἕξειν κόσμον, οὕτως οἴκου διάλυσις ἐστι· συναναιρεῖται γὰρ αὐτῇ πῦρ ἑστιοῦχον ἑστία κρατῆρες ὑποδοχαὶ ξενισμοί, φιλανθρωπότατα καὶ πρῶτα κοινωνήματα πρὸς ἀλλήλους, μᾶλλον δὲ σύμπας ὁ βίος, εἴ γε διαγωγή τίς ἐστιν ἀνθρώπου πράξεων ἔχουσα διέξοδον, ὧν ἡ τῆς τροφῆς χρεία καὶ παρασκευὴ τὰς πλείστας παρακαλεῖ. [...] »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §15'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§15. [...] « S’il faut dire ce que je pense », reprit '''Cléodème''', « ce n’est nullement mon avis, et surtout quand est dressée la table, que l’on supprime si la nourriture est supprimée et qui est l’autel des dieux amis et hospitaliers. Et s’il est vrai, comme dit '''Thalès''', que la suppression de la terre dût entraîner le désordre et la ruine du monde entier, de même anéantir la table ce serait anéantir la maison. Avec la table disparaîtraient le feu qui consacre le foyer, le foyer lui-même, les coupes, les réceptions, les hospitalités, qui sont les plus affectueux et les premiers rapports de communauté entre les hommes; ou plutôt disparaîtrait la vie entière, s’il est vrai que la vie soit une sorte de courant formé par la série des actes de l’homme, actes dont le plus grand nombre est commandé par le besoin et la préparation de la nourriture.</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §15'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe XVII.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage d’une parole sage de '''Thalès''' : Ne croire ni ses ennemis sur les choses croyables, ni ses amis sur les choses incroyables.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§17. τέλος δὲ γελάσας πρὸς ἡμᾶς « βούλομαι μέν, » ἔφη, « πρὸς τὸ παρὸν φράσαι τὸ προσηγγελμένον· ὀκνῶ δ´ ἀκούσας '''Θαλέω''' ποτ´ εἰπόντος ὅτι δεῖ τὰ μὲν εἰκότα λέγειν, τὰ δ´ ἀμήχανα σιωπᾶν. » Ὑπολαβὼν οὖν ὁ '''Βίας''' « ἀλλὰ καὶ τοῦτ´, » ἔφη, « '''Θαλέω''' τὸ σοφόν ἐστιν, ὅτι δεῖ τοῖς μὲν ἐχθροῖς καὶ περὶ τῶν πιστῶν ἀπιστεῖν, τοῖς δὲ φίλοις καὶ τὰ ἄπιστα πιστεύειν, ἐχθροὺς μέν, ἔγωγ´ ἡγοῦμαι, τοὺς πονηροὺς καὶ ἀνοήτους, φίλους δὲ τοὺς χρηστοὺς καὶ φρονίμους αὐτοῦ καλοῦντος. οὐκοῦν, »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §17'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§17. [...] A la fin il s’adressa à nous en éclatant de rire : « Je voudrais vous faire connaître, sans plus attendre, ce que '''Gorgias''' vient de me conter; et pourtant j’hésite, parce que j’ai autrefois entendu dire à '''Thalès''' qu’il faut dire les choses vraisemblables et taire les impossibles. « Mais, reprit '''Bias''', « c’est à '''Thalès''' aussi qu’appartient cette sage parole : qu’il faut ne pas croire ses ennemis même sur les choses croyables, et croire ses amis même sur celles qui ne le sont pas : par ennemis il entendait, je suppose, les méchants et les sots, par amis, les gens vertueux et sensés. »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §17'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe XXI.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage d’une doctrine de '''Thalès''' sur la résidence de l'âme dans toutes les parties du monde les plus essentielles.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§21. Μετὰ δὲ τοῦτον ὁ '''Ἀνάχαρσις''' εἶπεν ὅτι τοῦ '''Θαλέω''' καλῶς ὑπολαμβάνοντος ἐν πᾶσιν εἶναι τοῖς κυριωτάτοις μέρεσι τοῦ κόσμου καὶ μεγίστοις ψυχήν, [...].</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §21'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§21. Après '''Pittacus''', '''Anacharsis''' prit la parole : « Puisque, comme '''Thalès''' l’a magnifiquement établi, une âme réside dans toutes les parties du monde les plus essentielles, [...].</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §21'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">― ✳ ―</div> ==== Du démon de '''Socrate''' ==== <div style="text-align: center; margin: 0 1em;"></div> ===== <div style="text-align: center;">Paragraphe VI.</div> ===== <div style="text-align: center; margin: 0 1em;">Témoignage de l’aversion de '''Thalès''' pour les [[w:Tyran|''tyrans'']].</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid;"><br /><div style="text-align: justify; margin: 0 2em; text-indent: 15px">§6. Ταῦτα τοῦ '''Θεοκρίτου''' λέγοντος ὁ '''Λεοντίδης''' ἐξῄει μετὰ τῶν φίλων, ἡμεῖς δ´ εἰσελθόντες ἠσπαζόμεθα τὸν '''Σιμμίαν''' ἐπὶ τῆς κλίνης καθεζόμενον οὐ κατατετευχότα τῆς δεήσεως, οἶμαι, μάλα σύννουν καὶ διαλελυπημένον· ἀποβλέψας δὲ πρὸς ἅπαντας ἡμᾶς ‘ὦ '''Ἡράκλεις''',’ εἶπεν ‘ἀγρίων καὶ βαρβάρων ἠθῶν· εἶτ´ οὐχ ὑπέρευ '''Θαλῆς''' ὁ παλαιὸς ἀπὸ ξένης ἐλθὼν διὰ χρόνου τῶν φίλων ἐρωτώντων ὅ τι καινότατον ἱστορήκοι ’τύραννον‘ ἔφη ’γέροντα.‘ καὶ γὰρ ᾧ μηδὲν ἰδίᾳ συμβέβηκεν ἀδικεῖσθαι, τὸ βάρος αὐτὸ καὶ τὴν σκληρότητα τῆς ὁμιλίας δυσχεραίνων ἐχθρός ἐστι τῶν ἀνόμων καὶ ἀνυπευθύνων δυναστειῶν.[...]</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome II, [https://remacle.org/bloodwolf/historiens/Plutarque/demonsocrategr.htm Περι του Σωκρατους Δαιμονιου - Le Démon de Socrate], §6'', traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§6. Pendant que [[w:Théocrite|'''Théocritos''']] [[#Théocrite|<span id="Théocrite_back"><sup>'''I'''</sup></span>]] parlait, '''Léontidas''' sortit avec ses amis, et nous entrâmes chez '''Simmias''', que nous saluâmes affectueusement. Il était assis sur son lit, et j’attribuai à l’insuccès de sa demande son air pensif et affligé. Après nous avoir regardés tous : « Par '''Hercule''' ! s’écria-t-il, quelles mœurs sauvages et barbares ! Eh bien ! n’avait-il pas cent fois raison le '''Thalès''' des anciens jours ? Comme il était revenu d’un long voyage à l’étranger, ses amis lui demandaient ce qu’il avait vu de plus curieux : « Un tyran parvenu à la vieillesse », répondit-il. Car ceux même qui n’ont pas éprouvé de la part d’un despote une injustice personnelle, supportent avec peine le poids et la dureté d’un semblable régime. On déteste tout pouvoir qui est en dehors de la loi et qui ne veut rendre de comptes à personne. [...]</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome III, [[s:Page:Plutarque_-_Œuvres_complètes_de_Plutarque_-_Œuvres_morales_et_œuvres_diverses,_tome_3,_1870.djvu/74|Περι του Σωκρατους Δαιμονιου - Le Démon de Socrate]], [[s:Page:Plutarque_-_Œuvres_complètes_de_Plutarque_-_Œuvres_morales_et_œuvres_diverses,_tome_3,_1870.djvu/83|§6]]'', traduites par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> {{Boîte déroulante début|titre=NdA de trad. Victor Bétolaud de 1870|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Théocrite_back|<span id="Théocrite"><sup>I</sup></span>]] Du nom propre grec ancien Θεόκριτος / Theókritos [[wikt:en:Θεόκριτος#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;">➥ de l’adjectif et du nom commun θεός / theós [[wikt:en:θεός#Ancient_Greek|(en)]], « divin, dieu, divinité »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ +‎ du verbe κρίνω / krínō, « 1. (transitif) Séparer, diviser, distinguer entre deux choses ou personnes ou parmi un groupe de choses ou de personnes. 2. (transitif) Commander, organiser. 3. S’enquérir, enquêter. 4. Sélectionner, choisir, préférer. 5. (transitif) Trancher un différend ou un concours ; (intransitif) Porter un jugement, prendre une décision : • (voix moyenne, voix passive) Décider d’un concours ; (voix moyenne et voix passive) Se disputer, se disputer, se quereller. 6. Décider ou juger [+accusatif et infinitif = que quelque chose fait quelque chose], [+accusatif et accusatif = que quelque chose est quelque chose]. 7. Discerner entre le bien et le mal. 8. Juger, prononcer. 9. Traduire en justice, accuser. 10. Condamner, critiquer. 11. Sécréter, cacher, dissimuler. »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ + le suffixe adjectival récessif‎ -τος / -tos [[wikt:en:-τος#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;">''Poète'', auteur de [[w:Mime|''mimes'']] (imitations comiques du langage ou des gestes), d’[[w:Poésie_pastorale|''idylles pastorales'']] et de [[w:Épopée|''contes épiques'']].<br /><p style="text-align: right; margin: 0 2em;">([[w:Circa|{{Info|''ca.''|Circa, locution latine que l’on emploie pour indiquer l’approximation d’une date}}]] [[w:310_av._J.-C.|-310]]<sup>[[w:IVe_siècle_av._J.-C.|⏳]]</sup>, à [[w:Théocrite#cite_ref-2|''Syracuse'']] — {{Info|''ca.''|Circa, locution latine que l’on emploie pour indiquer l’approximation d’une date}} [[w:250_av._J.-C.|-250]]<sup>[[w:IIIe_siècle_av._J.-C.|⏳]]</sup>)'''<br /><br /> </div>{{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">§6. Pendant que '''Théocritos''' discourait ainsi, '''Léontidas''' sortit avec ses amis ; nous entrâmes et saluâmes '''Simmias''', qui était assis sur son lit, tout soucieux et triste, parce que sa demande avait été rejetée sans doute. En nous regardant tous, il s’écria : « '''Héraclès''' ! les moeurs sauvages et barbares ! Ah ! que '''Thalès''' l’ancien avait raison de répondre, lorsqu’après un long voyage à l’étranger ses amis lui demandaient ce qu’il avait remarqué de plus extraordinaire : « Un tyran âgé ». Même un homme qui a eu la chance de n’être pour son compte victime d’aucune injustice exècre déjà le poids et la dureté de ce commerce et est ennemi des dictatures, des dominations arbitraires.[...]</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome II, [https://remacle.org/bloodwolf/historiens/Plutarque/demonsocrate.htm Περι του Σωκρατους Δαιμονιου - Le Démon de Socrate], §6'', traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">― ✳ ―</div> ==== Les [[w:Alimentation_en_Grèce_antique#Banquets|''Symposiaques'']] [[#Symposiaques|<span id="Symposiaques_back"><sup>'''I'''</sup></span>]], ou questions de table ==== <div style="text-align: center; margin: 0 1em;"></div> {{Boîte déroulante début|titre=NdA Symposiaques|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Symposiaques_back|<span id="Symposiaques"><sup>I</sup></span>]] Du nom commun grec ancien συμπόσιον / sympósion [[wikt:en:συμπόσιον#Ancient_Greek|(en)]], « Seconde partie d’un repas pendant laquelle un groupe restreint de convives buvaient et discutaient sur un sujet. » ; <br /><p style="margin: 0 2em; text-indent: 15px;">➥ du nom commun σῠμπότης / sŭmpótēs [[wikt:en:συμπότης#Ancient_Greek|(en)]], « compagnon de boisson » ; <br /><p style="margin: 0 4em; text-indent: 15px;">➥ du préfixe σῠν- / sŭn- [[wikt:en:συν-#Ancient_Greek|(en)]], « avec, ensemble » ;<br /><p style="margin: 0 4em; text-indent: 15px;">➥ +‎ du nom commun ποτής / potḗs [[wikt:en:ποτής#Ancient_Greek|(en)]], « boisson » ;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ +‎ du suffixe -ῐον / -ĭon [[wikt:en:-ιον#Ancient_Greek|(en)]] ;<br /><p style="margin: 0 2em; text-indent: 15px;">Entretiens dans un banquet, propos de table. '''<br /><br /> </div>{{Boîte déroulante fin}} ===== <div style="text-align: center;">Livre III</div> ===== <div style="text-align: center; margin: 0 1em;"></div> ====== <div style="text-align: center;">Question VI. Sur le temps où il est à propos de se rapprocher d’une femme.</div> ====== <div style="text-align: center; margin: 0 1em;">Témoignage du statut marital de '''Thalès''' et de sa relation avec sa mère</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid;"><br /><div style="text-align: justify; margin: 0 2em; text-indent: 15px">Καθάπερ οὖν '''Θαλῆς''' ὁ σοφὸς ὑπὸ τῆς μητρὸς ἐνοχλούμενος γῆμαι κελευούσης πῶς ὑπεξέφυγε παρήγαγε λέγων πρὸς αὐτὴν ἐν ἀρχῇ μέν « οὔπω καιρὸς ὦ μῆτερ, » ὕστερον δ´ « οὐκέτι καιρὸς ὦ μῆτερ », οὕτως ἄρα καὶ πρὸς ἀφροδίσια κράτιστον {ἔσται} ἔχειν ἕκαστον, ὥστε κατακλινόμενον λέγειν «οὔπω καιρός», ἀνιστάμενον δ´ « οὐκέτι καιρός ».</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome III, [https://remacle.org/bloodwolf/historiens/Plutarque/sympos3.htm#VI Προβλημα Ϛ. Περὶ καιροῦ συνουσίας. - Question VI. Quel est le temps le plus propre à l'amour?]'', traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div></div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§3. Ainsi donc, comme le sage '''Thalès''', fatigué par sa mère qui l’engageait à se marier, trouva le moyen de lui échapper et de lui donner le change en lui disant une première fois : « Il n’est pas encore temps, ma mère », et, lorsqu’elle insistait encore après qu’il avait passé l’âge : « Il n’est plus temps » ; de même, pour ce qui regarde les plaisirs de l’amour, le mieux sera que chacun se détermine à dire, en se mettant au lit : « Il n’est pas temps encore », et, en sortant du lit : « il n’est plus temps ».</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome III, [[s:Page:Plutarque_-_Œuvres_complètes_de_Plutarque_-_Œuvres_morales_et_œuvres_diverses,_tome_3,_1870.djvu/268|Question VI. Sur le temps où il est à propos de se rapprocher d’une femme]], [[s:Page:Plutarque_-_Œuvres_complètes_de_Plutarque_-_Œuvres_morales_et_œuvres_diverses,_tome_3,_1870.djvu/271|§3]]'', traduites par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">Le sage '''Thalès''', pressé par sa mère de se marier, lui répondit avec beaucoup d’adresse. Au commencement, il lui dit : Ma mère, il n’est pas encore temps. Quand il eut passé la fleur de son âge, et qu’elle lui fit de nouvelles instances, il lui répondit : Il n’est plus temps. De même, par rapport à la question proposée, le mieux serait que chacun pût se dire le soir en se couchant : Il n'm’est pas encore temps ; et le matin, quand il se lève : Il n’est plus temps. »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome III, [https://remacle.org/bloodwolf/historiens/Plutarque/sympos3.htm#VI Προβλημα Ϛ. Περὶ καιροῦ συνουσίας. - Question VI. Quel est le temps le plus propre à l'amour?]'', traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">― ✳ ―</div> ==== De la malignité d’'''Hérodote''' ==== <div style="text-align: center; margin: 0 1em;"></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">― ✳ ―</div> ==== Les opinions des Philosophes ==== <div style="text-align: center; margin: 0 1em;"></div> ===== <div style="text-align: center;">Livre I</div> ===== <div style="text-align: center; margin: 0 1em;"></div> <div style="text-align: center; margin: 0 auto;">― ● ―</div> ===== <div style="text-align: center;">Livre II</div> ===== <div style="text-align: center; margin: 0 1em;"></div> <div style="text-align: center; margin: 0 auto;">― ● ―</div> ===== <div style="text-align: center;">Livre III</div> ===== <div style="text-align: center; margin: 0 1em;"></div> <div style="text-align: center; margin: 0 auto;">― ● ―</div> ===== <div style="text-align: center;">Livre IV</div> ===== <div style="text-align: center; margin: 0 1em;"></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">― ✳ ―</div> ==== Les animaux de terre ont-ils plus d'adresse que ceux de mer? ==== <div style="text-align: center; margin: 0 1em;"></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">― ✳ ―</div> ==== D’'''Isis''' et d’'''Osiris'''==== <div style="text-align: center; margin: 0 1em;"></div> ===== <div style="text-align: center;">Paragraphe IX.</div> ===== <div style="text-align: center; margin: 0 1em;">Témoignage d’un voyage de '''Thalès''' en ''Égypte'', de rencontres avec des prêtres et de récit sur leur divinités.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid;"><br /><div style="text-align: justify; margin: 0 2em; text-indent: 15px">§9. [...] '''Ἑκαταῖος''' δ´ ὁ ''Ἀβδηρίτης'' φησὶ τούτῳ καὶ πρὸς ἀλλήλους τῷ ῥήματι χρῆσθαι τοὺς ''Αἰγυπτίους'', ὅταν τινὰ προσκαλῶνται· προσκλητικὴν γὰρ εἶναι τὴν φωνήν. Διὸ τὸν πρῶτον θεόν, ὃν τῷ παντὶ τὸν αὐτὸν νομίζουσιν, ὡς ἀφανῆ καὶ κεκρυμμένον ὄντα προσκαλούμενοι καὶ παρακαλοῦντες ἐμφανῆ γενέσθαι καὶ δῆλον αὐτοῖς ''Ἀμοῦν'' λέγουσιν.<br /><p style="text-indent: 15px">§10. Ἡ μὲν οὖν εὐλάβεια τῆς περὶ τὰ θεῖα σοφίας '''Αἰγυπτίων''' τοσαύτη {ἦν}, μαρτυροῦσι δὲ καὶ τῶν ''Ἑλλήνων'' οἱ σοφώτατοι, '''Σόλων''' '''Θαλῆς''' '''Πλάτων''' '''Εὔδοξος''' '''Πυθαγόρας''', ὡς δ´ ἔνιοί φασι, καὶ '''Λυκοῦργος''' εἰς ''Αἴγυπτον'' ἀφικόμενοι καὶ συγγενόμενοι τοῖς ἱερεῦσιν.[...]</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome V, [https://remacle.org/bloodwolf/historiens/Plutarque/isisetosiris.htm Περι Ισιδος και Οσιριδος - Traité d’Isis et d’Osiris], §34'', traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1870<br />(également disponible une édition de 1844 [https://remacle.org/bloodwolf/historiens/Plutarque/isisetosiris1.htm ici])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§9. [...] '''Hécatée''' d’''Abdère'' dit que les ''Égyptiens'' emploient ce mot pour s’appeler les uns les autres, attendu qu’il est essentiellement appellatif. C’est pourquoi, s’adressant au premier Dieu, le même, selon eux, que l’Univers, comme à un être invisible et caché, ils l’exhortent avec supplications, en l’appelant "Amoun", à se faire voir et à se découvrir à eux. Voilà jusqu’à quel point était grande la réserve qui caractérisait la philosophie religieuse des ''Égyptiens''.<br /><p style="text-indent: 15px">§10. C’est ce que témoignent les plus éclairés d’entre les ''Grecs'': '''Solon''', '''Thalès''', '''Platon''', '''Eudoxe''', '''Pythagore''', et aussi, d’après quelques-uns, '''Lycurgue'''. Ils étaient allés en ''Égypte'' et avaient eu des conférences avec les prêtres. [...]</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome V, [https://remacle.org/bloodwolf/historiens/Plutarque/isisetosiris.htm Περι Ισιδος και Οσιριδος - Traité d’Isis et d’Osiris], §§9, 10'', traduites par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870<br/>(également disponible [[s:Sur_Isis_et_Osiris|ici]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">§9. [...] '''Hécatée''' d’''Abdère'' dit que les ''Egyptiens'' s’en servent pour s’appeler les uns les autres; que ce nom est de sa nature appellatif ; que ce peuple , qui croit que le premier des dieux, qu’il confond avec l’univers, est un dieu caché et inconnu, l’invoque et le prie de se découvrir à eux, en lui disant ''Amoun'' ;<br /><p style="text-indent: 15px">§10. tant ce peuple portait de retenue et de réserve dans sa philosophie religieuse ! C’est ce qu'attestent unanimement les plus sages d’entre les ''Grecs'', '''Solon''', '''Thalès''', '''Platon''', '''Eudoxe''', '''Pythagore''', et, suivant quelques uns, '''Lycurgue''' lui-même, qui tous voyagèrent en ''Egypte'', et y conférèrent avec les prêtres du pays.[...]</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome V, [https://remacle.org/bloodwolf/historiens/Plutarque/isisetosiris1.htm Περι Ισιδος και Οσιριδος - Traité d’Isis et d’Osiris], §§9, 10'', traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe XXXIV.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage de la théorie de '''Thalès''' de l’eau principe de tous les êtres.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§34. Ἥλιον δὲ καὶ Σελήνην οὐχ ἅρμασιν ἀλλὰ πλοίοις ὀχήμασι χρωμένους περιπολεῖν φασιν αἰνιττόμενοι τὴν ἀφ´ ὑγροῦ τροφὴν αὐτῶν καὶ γένεσιν. Οἴονται δὲ καὶ '''Ὅμηρον''' ὥσπερ '''Θαλῆν''' μαθόντα παρ´ ''Αἰγυπτίων'' ὕδωρ ἀρχὴν ἁπάντων καὶ γένεσιν τίθεσθαι· τὸν γὰρ '''Ὠκεανὸν''' '''Ὄσιριν''' εἶναι, τὴν δὲ '''Τηθὺν''' '''Ἶσιν''' ὡς τιθηνουμένην πάντα καὶ συνεκτρέφουσαν. [...]</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome V, [https://remacle.org/bloodwolf/historiens/Plutarque/isisetosiris.htm Περι Ισιδος και Οσιριδος - Traité d’Isis et d’Osiris], §34'', traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1870<br />(également disponible une édition de 1844 [https://remacle.org/bloodwolf/historiens/Plutarque/isisetosiris1.htm ici])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§34. Ils disent que le soleil et la lune parcourent leur route perpétuelle non pas sur des chars, mais sur des bâtiments de navigation: signifiant par là, que c’est le principe humide qui les entretient et qui leur a donné naissance. Ils croient aussi que c’est des ''Egyptiens'' qu’'''Homère''', et après lui '''Thalès''', ont appris à établir l’eau comme principe générateur de tous les êtres. Ils veulent qu’'''Osiris''' soit l’'''Océan''', qu’'''Isis''' soit '''Téthys''', laquelle nourrit et entretient tout ce qui existe.</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome V, [https://remacle.org/bloodwolf/historiens/Plutarque/isisetosiris1.htm Περι Ισιδος και Οσιριδος - Traité d’Isis et d’Osiris], §34'', traduites par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870<br/>(également disponible [[s:Sur_Isis_et_Osiris|ici]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">§34. Ils disent que le soleil et la lune parcourent les cieux, portés, non sur des chars, mais sur des vaisseaux, pour signifier que tout est nourri et mis en mouvement par l’eau. Ils pensent que c’est des ''Egyptiens'' qu’'''Homère''' et '''Thalès''' avaient pris cette opinion, que l’eau est le principe de tous les êtres, qu’'''Osiris''' est l’'''Océan''', et qu’'''Isis''' est '''Thétis''', qui nourrit et alimente toutes les substances.</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome V, [https://remacle.org/bloodwolf/historiens/Plutarque/isisetosiris1.htm Περι Ισιδος και Οσιριδος - Traité d’Isis et d’Osiris], §34'', traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Valère_Maxime|'''Valère Maxime''']] ''([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l'on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:Ier_siècle|I<sup>er</sup> siècle {{Info|EC|de l’Ère Commune}}]])'' [[s:Auteur:Valère_Maxime|<sup>📚</sup>]] == === Actions et paroles mémorables, VII, § 2 === :8. Il y a aussi un mot admirable de Thalès. On lui demandait si les actions des hommes échappaient à la connaissance des dieux. "Leurs pensées non plus", répondit-il. Aussi faut-il nous appliquer à avoir, je ne dis pas seulement les mains, mais encore le cœur pur, dans la persuasion que la divinité est témoin des mouvements les plus secrets de nos âmes. <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Tatien_le_Syrien|'''Tatien''']] le [[w:Assyrie_(province_romaine)|''Syrien'']] ''(vers [[w:120|120]], en [[w:Halicarnasse|''Halicarnasse'']] en [[w:Assyrie_(province_romaine)|Assyrie]] — vers [[w:173|173]], en Assyrie)'' <sup>[[w:IIe_siècle|⏳]]</sup> [[s:Auteur:Tatien_le_Syrien|<sup>📚</sup>]] == === Discours aux Grecs, 41 === = [[w:Lucien_de_Samosate|'''Lucien de Samosate''']] ''(vers [[w:120|120]], à [[w:Samosate|Samosate]] — vers [[w:180|180]], en [[w:Égypte_romaine_et_byzantine|Égypte]])'' <sup>[[w:IIe_siècle|⏳]]</sup> [[s:Auteur:Lucien_de_Samosate|<sup>📚</sup>]] = === Dialogues des morts === https://gallica.bnf.fr/ark:/12148/bpt6k6227866x/f7.item https://gallica.bnf.fr/ark:/12148/bpt6k6227866x/f103.double === Hippias ou le bain === :(2) Mon but est de prouver que les constructeurs de machines qui méritent le plus notre admiration sont ceux qui, distingués par leur science théorique, ont laissé en outre à la postérité des monuments de leur art et des œuvres de leur génie, tandis que les hommes, qui se sont seulement exercés dans la parole méritent plutôt le nom de sophistes que celui de savants. C'est sur la liste traditionnelle de ces artistes que nous voyons figurer Archimède et Socrate de Cnide, qui inventèrent, l'un les moyens de soumettre à Ptolémée la ville de Memphis, sans recourir à un siège, mais en détournant et en divisant le cours du Nil ; l'autre, ceux d'incendier les galères des ennemis. Avant eux, Thalès de Milet, ayant promis à Crésus de faire passer à pied sec à son armée les eaux du fleuve Halys, imagina de les détourner en une seule nuit derrière le camp ; et pourtant ce n'était pas un mécanicien de profession, mais un sage d'un esprit inventif et à l'intelligence duquel on pouvait s'en rapporter. === Exemples de longévité === :(18) Solon, Thalès et Pittacus, que l'on compte au nombre des Sept sages, vécurent chacun cent années. <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Clément_d%27Alexandrie|'''Clément''']] d'[[w:Histoire_d%27Alexandrie#Annexion|''Alexandrie'']] ''(vers [[w:150|150]]'' <sup>[[w:IIe_siècle|⏳]]</sup>'', à [[w:Athènes#Antiquité|Athènes]] — vers [[w:215|215]]'' <sup>[[w:IIIe_siècle|⏳]]</sup>'', à [[w:Kayseri|Kayseri]])'' [[s:Auteur:Clément_d’Alexandrie|<sup>📚</sup>]] == === Stromates, I, 65 === <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Claude_Élien|'''Claude Élien''']] ''(vers [[w:175|175]]''<sup>[[w:IIe_siècle|⏳]]</sup>'', à [[w:Préneste|Préneste]] — vers [[w:235|235]]''<sup>[[w:IIIe_siècle|⏳]]</sup>'', en [[w:Rome_antique|Rome]])'' [[s:Auteur:Élien_le_sophiste|<sup>📚</sup>]] == === Histoires diverses === :On a vu des philosophes à la tête des affaires publiques : d'autres, se bornant à cultiver leur raison, ont passé leur vie dans le repos. Entre les premiers sont Zaleucus et Charondas qui réformèrent, l'un, le gouvernement des Locriens, l'autre, d'abord celui des Catanéens, puis, après qu'il eut été exilé de Catane, celui des Rhéginiens. Archytas servit utilement les Tarentins. Les Athéniens durent tout à Solon. Bias et Thalès rendirent les mêmes services à l'Ionie, Chilon à Lacédémone, Pittacus à Mitylène, Cléobule à Rhodes. <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Sextus_Empiricus|'''Sextus Empiricus''']] ''([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l'on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:IIe_siècle|II<sup>ème</sup> siècle {{Info|EC|de l’Ère Commune}}]])'' [[s:Auteur:Sextus_Empiricus|<sup>📚</sup>]] == Hypot III, 30, et Liv I contre les phys., sect. 319 https://gallica.bnf.fr/ark:/12148/bpt6k9796311p/f305.item.r=thales <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Lactance|'''Lactance''']] ''(vers [[w:250|250]]''<sup>[[w:IIIe_siècle|⏳]]</sup>'', à [[w:Henchir_Kssiba#Histoire|Civitas Popthensis]] — vers [[w:325|325]]''<sup>[[w:IVe_siècle|⏳]]</sup>'', en [[w:Gaule#La_Gaule_dans_l'Antiquité_tardive|Gaule]])'' == Épit. 4 (https://gallica.bnf.fr/ark:/12148/bpt6k282068z/f300.image.r=thales) Inst. 111, 16 (https://gallica.bnf.fr/ark:/12148/bpt6k282068z/f621.item.r=thales) <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Jamblique|'''Jamblique''']] ''(vers [[w:250|250]]''<sup>[[w:IIIe_siècle|⏳]]</sup>'', à [[w:Qinnasrīn|Chalcis ad Belum]] — vers [[w:333|333]]''<sup>[[w:IVe_siècle|⏳]]</sup>'')'' == === Vie de Pythagore === ==== chap. II ==== (https://web.archive.org/web/20110721184914/http://www.aurumsolis.info/index.php?option=com_phocadownload&view=category&download=1%3Aiamblichus-the-pythagorean-life&id=19%3Awritings-from-the-founders&Itemid=143&lang=en) <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Eusèbe_de_Césarée|'''Eusèbe''']] de [[w:Césarée#Césarée_au_début_du_christianisme|''Césarée'']] ''(vers [[w:265|265]]'' <sup>[[w:IIIe_siècle|⏳]]</sup>'', à Césarée — [[w:340|340]]'' <sup>[[w:IVe_siècle|⏳]]</sup>'', à Césarée)'' [[s:Auteur:Eusèbe_de_Césarée|<sup>📚</sup>]] == Preparation Évangélique, XI, 2 Prepar. évang. I, 8, page 22-25 https://gallica.bnf.fr/ark:/12148/bpt6k9796311p/f310.image.r=thales <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Diogène_Laërce|'''Diogène Laërce''']] ''([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l'on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:IIIe_siècle|III<sup>ème</sup> siècle {{Info|EC|de l’Ère Commune}}]])'' [[s:Auteur:Diogène_Laërce|<sup>📚</sup>]] == ''Ce texte est un extrait de la traduction de Robert Genaille (1933)'' Thalès[1], au dire d’Hérodote, de Douris et de Démocrite, était fils d’Examios et de Cléobuline, et membre de la famille des Thélides, Phéniciens descendant en droite ligne d’Agénor[2] et de Cadmus[3], s’il faut en croire Platon. Le premier, il porta le nom de sage, au temps où Damasias était archonte à Athènes[4]. C’est sous le même archontat que fut créée l’expression : « les sept sages » (cf. Démocrite de Phalère, Registre des Archontes). Thalès fut inscrit comme citoyen de Milet quand il vint dans cette ville avec Nélée chassé de Phénicie. Une autre tradition très courante veut qu’il soit natif de Milet et qu’il descende d’une bonne famille. Il s’occupa de politique avant d’étudier la nature. On croit qu’il ne laissa aucun écrit, car l’Astrologie nautique qu’on lui attribue est de Phocos de Samos. Callimaque[5] croit qu’il découvrit la Petite Ourse et le raconte en vers iambiques : Il mesura, dit-on, les étoiles du Chariot Sur quoi les Phéniciens règlent leur navigation. D’autres auteurs disent qu’il écrivit seulement deux ouvrages, un sur le solstice et un sur l’équinoxe, car il pensait le reste inaccessible. Il passe pour avoir le premier étudié l’astrologie et prédit les éclipses de soleil et les solstices (cf. Eudème, Histoire de l’astrologie)[6]. Xénophane et Hérodote le louent à ce propos, et leur témoignage est confirmé par celui d’Héraclite et de Démocrite. On dit encore (cf. le poète Choirilos) qu’il fut le premier à affirmer l’immortalité des âmes. Le premier il dessina la course du soleil d’un solstice à l’autre, et démontra que comparée au soleil, la lune en est la cent vingtième partie. C’est encore lui qui fixa à trente jours la durée du mois, et qui écrivit le premier traité sur la Nature. Aristote et Hippias disent aussi qu’il accordait une âme aux choses qu’on croit inanimées ; il en donnait pour preuve l’ambre et la pierre de Magnésie. Selon Pamphile[7], il apprit des Égyptiens la géométrie, inscrivit dans un cercle le triangle rectangle, et pour cette découverte immola un bœuf. D’autres, comme Apollodore le calculateur, attribuent cette invention à Pythagore. Thalès a encore développé et précisé l’invention du Phrygien Euphorbe citée par Callimaque dans ses Iambes et concernant le triangle scalène, et tout ce qui touche aux considérations sur les lignes. Il semble encore avoir été en politique un homme de bon conseil. Ainsi, quand Crésus[8] envoya une ambassade aux Milésiens pour demander leur alliance, il s’y opposa, et son intervention sauva la ville, puisque Cyrus l’emporta. Héraclite cite une opinion de Clytos selon laquelle Thalès aurait eu une vie retirée et solitaire. Les uns disent qu’il se maria et eut un fils nommé Kibissos. D’autres prétendent qu’il resta célibataire et adopta le fils de sa sœur, qu’on lui demanda un jour pourquoi il ne cherchait pas à avoir des enfants, et qu’il répondit : « Par amour pour les enfants. » Sa mère l’exhortait à se marier, il lui répondit : « Non, par Zeus, il n’est pas encore temps. » Elle l’y invita une nouvelle fois quand il eut pris de l’âge, mais il lui dit : « Il n’est plus temps. » D’après Hiéronyme de Rhodes (Notes, livre II), il voulut montrer combien il était facile de s’enrichir ayant prévu pour l’année une abondante récolte d’huile, il prit à loyer une oliveraie et gagna beaucoup d’argent[9]. Il soupçonna que l’eau était le principe des choses, que le monde était animé et rempli de démons. On dit qu’il découvrit les saisons de l’année, et qu’il la divisa en trois cent soixante-cinq jours. Il ne suivit les leçons d’aucun maître, sauf en Égypte, où il fréquenta les prêtres du pays. A ce propos, Hiéronyme dit qu’il mesura les Pyramides en calculant le rapport entre leur ombre et celle de notre corps. Si l’on en croit Minuès, il vivait au temps de Thrasybule, qui fut tyran de Milet[10]. L’histoire du trépied trouvé par des pêcheurs et dédié aux sages par le peuple de Milet est bien connue. Des jeunes gens d’Ionie achetèrent à des pêcheurs milésiens leur coup de filet. Ils tirèrent de l’eau un trépied. On se querella et les Milésiens envoyèrent une ambassade à Delphes. Voici quel fut l’oracle de la divinité : Race de Milet, tu interroges Phébus au sujet d’un trépied ? Au plus sage de tous, je donne ce trépied[11]. Ils le donnent alors à Thalès, qui le donne à un autre, et cet autre à un autre, et ainsi de suite jusqu’à Solon, qui, déclarant que seul le dieu était le plus sage de tous, rendit le trépied à Delphes. Callimaque, dans ses Iambes, rapporte cette histoire autrement ; il la tient de Léandre de Milet. Il dit qu’un certain Bathyclès d’Arcadie laissa en mourant une coupe pour qu’elle fût donnée à l’homme le plus sage. Elle fut donc donnée à Thalès, et après être passée de main en main et avoir fait le tour des sages, elle revint à Thalès. Celui-ci en fit don alors à Apollon de Didyme, en ces termes selon le poème de Callimaque : Thalès me donne au protecteur du peuple du Nil, Thalès qui a reçu deux fois ce présent, ce qui, en prose, se dit ainsi : « Thalès de Milet, fils d’Examios, à Apollon delphien, ce présent qu’il a reçu deux fois des Grecs. » Celui qui portait la coupe de sage en sage, le fils de Bathyclès, s’appelait Thyrion (cf. Éleusis, Livre sur Achille, et Alexon de Mynde, Fables, livre IX). Eudoxe de Cnide et Évanthès de Milet disent de leur côté qu’un ami de Crésus reçut du roi un vase d’or, pour le donner au plus sage des Grecs, qu’il le donna à Thalès et que ce vase parvint jusqu’à Chilon. Celui-ci consulta la Pythie, pour savoir qui était plus sage que lui. Elle répondit que c’était Myson (je parlerai de lui : Eudoxe le met parmi les sages à la place de Cléobule et Platon à la place de Périandre.) Voici la réponse que lui fit la Pythie : Il y a un habitant de l’Oeta, Myson, né à Chénée, Qui plus que toi est riche de sages pensées. L’homme qui consulta l’oracle pour Chilon s’appelait Anacharsis. Dédale le Platonicien et Cléarque disent que la coupe fut envoyée par Crésus à Pittacos, et que c’est ainsi qu’elle passa de main en main. D’après Andron, d’autre part (Livre du trépied), les Argiens décidèrent que le trépied serait attribué comme prix de vertu au plus sage des Grecs. Aristodème de Sparte fut choisi et c’est lui qui donna le trépied à Chilon. Alcée est aussi partisan d’Aristodème dont il parle dans les vers suivants : :Comme jadis Aristodème, dit-on, :Prononça à Sparte cette parole bien juste : :C’est de l’argent, un homme, oui de l’argent, :Car l’homme vertueux n’est jamais pauvre. D’autres disent encore que Périandre envoya à Thrasybule, tyran de Milet, un navire chargé, que ce navire fit naufrage dans la mer de Cos, et que quelque temps après le trépied fut trouvé par des pêcheurs. Phanodicos dit que le trépied fut trouvé dans la mer Attique, porté à la ville, et que l’assemblée du peuple s’étant réunie le fit porter à Bias. Pourquoi cela, je le dirai quand je parlerai de Bias. Selon d’autres auteurs, le trépied avait été fabriqué par Héphaïstos et donné en présent de la part de ce dieu à Pélops lors de son mariage. Il vint ensuite à Ménélas, fut enlevé avec Hélène par Alexandre, jeté dans la mer de Cos à l’instigation de la Spartiate qui prévoyait qu’il serait un sujet de querelle. Plus tard, en ce lieu, des Lébédiens achetèrent le produit d’un coup de filet et c’est le trépied qui fut tiré de l’eau. Il y eut querelle avec les pêcheurs, on vint jusqu’à Cos, et comme on ne s’accordait pas, on s’adressa à Milet, qui était la capitale. Les Milésiens envoyèrent des députés qui ne furent pas écoutés, aussi firent-ils la guerre aux gens de Cos. Comme de chaque côté il mourait beaucoup de gens, l’oracle déclara qu’il fallait donner le trépied au plus sage. Les deux camps s’entendirent alors pour l’attribuer à Thalès, qui par la suite le consacra à Apollon de Didyme. Pour en revenir à la réponse de l’oracle aux gens de Cos, elle disait ceci : La querelle entre Ioniens et Méropes ne cessera pas Avant que le trépied d’or qu’Héphaïstos jeta dans la mer N’ait quitté votre ville pour la maison de l’homme Qui connaît le présent, l’avenir et le passé. La réponse aux Milésiens fut la suivante : Race de Milet, tu interroges Phoebus au sujet d’un trépied... comme il a été dit plus haut. En voilà assez sur ce sujet[12]. Hermippe, dans ses Vies, rapporte à Thalès ce qui est dit par d’autres de Socrate : il aimait à dire qu’il remerciait la fortune de trois choses : d’être un humain et non une bête, d’être un homme et non une femme, enfin d’être un Grec, et non un barbare. On raconte encore qu’étant sorti de chez lui pour contempler les astres, il tomba dans un puits[13]. Une vieille femme survenant se moqua de lui en ces mots : « Comment, Thalès, toi qui n’es pas capable de voir ce qui est à tes pieds, t’imagines-tu pouvoir connaître ce qui est dans le ciel ? » Timon[14] a bien connu aussi la science de Thalès en astronomie, et dans ses Silles, il le loue en ces termes : Comme Thalès, un des sept sages, qui fut savant astronome. L’Argien Lobon dit que ses écrits font un total de quelque deux cents vers, et que sous sa statue on écrivit : Thalès de Milet repose ici dans le sol qui l’a nourri, Il fut un sage, et le premier des astrologues. Voici un de ses poèmes : Le trop parler n’est pas marque d’esprit. Trouvez une seule chose sage, Choisissez une seule chose belle, Et vous clouerez le bec à bien des bavards. On lui attribue encore les sentences suivantes : de tous les êtres, le plus ancien, c’est Dieu, car il n’a pas été engendré ; le plus beau, c’est le monde, car il est l’ouvrage du dieu ; le plus grand, c’est l’espace, car il contient tout ; le plus rapide, c’est l’esprit, car il court partout ; le plus fort, c’est la nécessité, car elle vient à bout de tout ; le plus sage, c’est le temps, parce qu’il découvre tout. La mort, dit-il, ne diffère en rien de la vie. On lui répond : « Pourquoi, alors, ne te donnes-tu pas la mort ? » ; « Parce que vie ou mort, c’est tout un », réplique-t-il. Quelqu’un lui demande ce qui du jour ou de la nuit fut créé d’abord ; il répond : « La nuit est en avance d’un jour. » On lui demande si les mauvaises actions d’un homme échappent au regard des dieux. Il répond : « Ils voient même les mauvaises pensées. » Un homme adultère lui demandait s’il pouvait jurer qu’il n’avait pas commis d’adultère. Il répondit : « Le parjure n’est pas pire que l’adultère. » On lui demandait ce qui était difficile : « Se connaître » dit-il ; ce qui était facile : donner un conseil à autrui ; ce qui était le plus doux : jouir ; ce que c’était que la divinité : un être sans commencement ni fin ; encore une chose difficile : voir un tyran âgé ; comment supporter aisément l’infortune : en voyant ses ennemis plus malheureux encore ; comment vivre vertueusement : en ne faisant pas ce que nous reprochons à autrui ; qui est heureux : l’homme bien portant, riche, courageux et instruit. Il disait encore que l’on doit penser à ses amis aussi bien en leur absence qu’en leur présence, que la beauté ne vient pas d’un beau visage, mais de belles actions. « Ne t’enrichis pas injustement, conseillait-il, et veille à ne pas être cité en justice pour de mauvaises paroles contre tes proches et tes amis. Comme tu traites tes parents, tes enfants te traiteront. » Du Nil[15] il disait qu’il débordait quand ses eaux étaient repoussées par les vents étésiens qui soufflent contre son cours. Apollodore dans ses Chroniques dit que Thalès naquit la première année de la trente-cinquième olympiade[16]. Il mourut dans sa soixante-dix-huitième année ou, comme le dit Sosicrate, dans sa quatre-vingt-dixième année, car ce fut dans la cinquante-huitième olympiade. Il vécut du temps de Crésus, auquel il promit de faire traverser l’Hallys[17] sans pont, en détournant le cours du fleuve. Il y eut cinq autres personnages du nom de Thalès (cf. Démétrios de Magnésie, Homonymes) : un rhéteur de Callatie, au style prétentieux, un peintre de Sicyone, de noble origine, un troisième, très ancien, du temps d’Hésiode, d’Homère et de Lycurgue, un quatrième, mentionné par Douris dans son traité de la peinture, un cinquième, plus jeune et peu connu, cité par Denys dans ses Critiques. Pour en revenir à notre sage, il mourut en regardant les jeux gymniques, pour avoir eu trop chaud et trop soif et par suite de sa fatigue et de son grand âge. Voici son épitaphe : :Ce tombeau, certes, est bien petit, :Mais la renommée de l’homme est allée au ciel. :C’est celui de Thalès le très sage. J’ai écrit sur lui les vers suivants dans le premier livre de mes épigrammes ou « vers de mètres divers[18] : :Tandis qu’il regardait les jeux, ô Zeus Hélios, :Tu as ravi du stade le sage Thalès. :Je te loue de l’avoir rapproché du ciel. Il était si vieux :Que de la terre il ne pouvait plus voir les astres. Thalès est l’auteur du fameux « connais-toi toi-même » qu’Antisthène (Livre des Filiations) attribue à Phémonoé, en déclarant que Chilon se l’appropria mensongèrement. Sur les sept sages, qu’il est juste de citer maintenant l’un après l’autre, voici la tradition. Damon de Cyrène, qui blâme tous les philosophes dans ses écrits, s’attaque surtout aux sept sages. Anaximène dit que tous étaient poètes. Dicéarque dit qu’ils n’étaient ni sages ni philosophes, mais hommes d’esprit et législateurs. Archétimos de Syracuse a décrit leurs assemblées chez Cypsélos[19] et dit qu’il y assista personnellement. Euphoros dit que tous, sauf Thalès, fréquentèrent Crésus. D’autres disent qu’ils se réunirent à Panionium, à Corinthe et à Delphes. On rapporte même leurs paroles, et qui a prononcé telle ou telle. Exemple : Le Spartiate Chilon fut sage, Lui qui dit : Rien de trop, Tout est bien qui vient en son temps ! On n’est pas d’accord sur leur nombre. Léandre, au lieu de Cléobule et de Myson, met Léophante, fils de Gorsias, ou Lébédios d’Éphèse et Épiménide de Crète. Platon, dans le Protagoras[20], met Myson à la place de Périandre. Éphoros met Anacharsis à la place de Myson et d’autres ajoutent Pythagore. Selon Dicéarque, il y en a quatre sur qui tout le monde est d’accord : Thalès, Bias, Pittacos et Solon. Le même auteur en nomme six autres, parmi lesquels il en choisit trois : Aristodème, Pamphile, le Lacédémonien Chilon, Cléobule, Anacharsis et Périandre. D’autres ajoutent Acousilaos, Caba ou Scala, un Argien. Hermippe, dans son livre sur les sages, dit qu’ils furent dix-sept et que chacun en choisit sept selon ses préférences. Ce sont Solon, Thalès, Pittacos, Bias, Chilon, Cléobule, Périandre, Anacharsis, Acousilaos, Épiménide, Léophante, Phérécyde, Aristodème, Pythagore, Lasos, fils de Charmantidas ou de Sisambrinos ou, selon Aristoxène, de Chabrinus, Hermonée, Anaxagore. Hippobotos (Catalogue des Philosophes) les inscrit ainsi : Orphée, Linos, Solon, Périandre, Anacharsis, Cléobule, Myson, Thalès, Bias, Pittacos, Épicharme et Pythagore. Voici des lettres attribuées à Thalès[21] : ==== Thalès à Phérécyde ==== « J’apprends que vous vous disposez à présenter aux Grecs le premier traité ionien des choses divines. Vous agiriez peut-être plus sagement en lisant votre ouvrage à vos amis, qu’en communiquant à n’importe quelles gens des écrits qui ne peuvent guère leur être utiles. « Si cela vous plaît, j’aimerais profiter de vos recherches et, si vous m’y invitez, je viendrai vous trouver au plus tôt. Car Solon d’Athènes et moi, qui avons déjà traversé deux fois la mer pour aller visiter la Crète, et pour aller en Égypte nous entretenir avec les prêtres et les astronomes du lieu, nous sommes assez sages pour ne pas hésiter à la traverser de nouveau pour aller vous voir. « Je parle de Solon, parce qu’il viendra avec moi si vous le permettez. Vous êtes un sédentaire, vous allez rarement en Ionie, vous n’aimez guère aller voir les étrangers, et vous ne songez, j’imagine, qu’à écrire. « Mais nous qui n’écrivons pas, nous parcourons volontiers la Grèce et l’Italie. » ==== Thalès à Solon ==== « Si vous quittez Athènes, vous aurez, je crois, tout avantage à venir vous établir à Milet, parmi les colons athéniens. Il n’y a là pour vous aucun danger. Si vous hésitez, sous prétexte que nous, Milésiens, sommes gouvernés par un tyran (je sais que vous haïssez tout pouvoir absolu), songez du moins que vous aurez plaisir à vivre avec nous qui sommes vos amis. Je sais que Bias vous a écrit et vous invite à aller à Priène. Si vous trouvez préférable d’habiter la ville de Priène, j’irai vivre là-bas avec vous. » <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Ausone|'''Ausone''']] ''([[w:309|309]]/[[w:310|310]], à [[w:Bazas|Bazas]] ou à [[w:Bordeaux#Burdigala,_cité_romaine_(Ier_siècle_-_Ve_siècle)|Bordeaux]] — [[w:394|394]]/[[w:395|395]], entre [[w:Langon_(Gironde)|Langon]] et [[w:La_Réole|La Réole]])'' <sup>[[w:IVe_siècle|⏳]]</sup> [[s:Auteur:Ausone|<sup>📚</sup>]] == === Le Jeu des Sept Sages === :Thalès a trouvé [texte grec] pour nous défendre de nous porter cautions, parce qu'il y a du danger à répondre ainsi pour d'autres[iv]. Nous donnons-là un avis qui ne plaira pas beaucoup aux emprunteurs. :THALÈS : Je suis Thalès de Milet ; j'ai dit, comme le poète Pindare, que l'eau est, le principe de toute chose. C'est à moi que des pêcheurs donnèrent autrefois [un trépied d'or] qu'ils avaient tiré de la mer : ils m'avaient choisi pour obéir au dieu de Délos, qui envoyait ce présent à un sage. Je refusai de le recevoir, je le leur rendis pour le porter à d'autres que je croyais plus dignes. Envoyé à tous les sept Sages, et renvoyé par eux, il nie fut rapporté. Je le reçus alors pour le consacrer à Apollon : car si Phébus a voulu qu'on choisit un sage, ce n'était pas d'un homme, mais d'un dieu qu'il fallait l'entendre. Je suis donc ce Thalès : mais un motif m'amène sur la scène. Comme les deux sages qui m'ont précédé, je viens défendre la sentence dont je suis l'auteur. Elle déplaira, mais non certes aux esprits prudents que l'expérience a instruits et rendus plus avisés. Nous avons dit : [texte grec], ou, en latin : Cautionne, mais tu t'en trouveras mal. Je pourrais parcourir mille exemples pour vous montrer des cautions et des répondants bien et dûment convaincus de repentir. Mais je ne veux nommer personne. Que chacun de, vous ré-fléchisse, et compte en lui-même combien de gens ont perdu ou souffert de s'être ainsi portés cautions pour d'autres. Toutefois, si un pareil service a du charme pour vous, n'y renoncez ni les uns ni les autres. :Alors que les uns applaudissent, et que les autres, si je les blesse, me sifflent. :THALÈS DE MILET. :AVANT d'oser une mauvaise action, à défaut de Témoin redoute ta conscience. La vie s'éteint, mais la gloire de la mort ne meurt point. Ce que tu veux faire, abstiens-toi de le dire. C'est un supplice de craindre ce qu'on ne peut empêcher. Si tu blâmes avec raison, ton hostilité même est profitable ; si tu loues mal à propos, ton amitié même est nuisible. Rien de trop. - Arrêtons-nous, et qu'ici même il n'y ait rien de trop. <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Proclus|'''Proclus''']] ''(le 7 ou 8 février [[w:412|412]], à [[w:Constantinople|Constantinople]] — le 17 avril [[w:485|485]], à [[w:Histoire_d%27Athènes#Antiquité_tardive|Athènes]])''<sup>[[w:Ve_siècle|⏳]]</sup> [[s:Auteur:Proclus|<sup>📚</sup>]] == === Commentaire sur le premier livre d'Euclide, 65, 3 === ὥσπερ οὖν παρὰ τοῖς Φοίνιξιν διὰ τὰς ἐμπορείας καὶ τὰ συναλλάγματα τὴν ἀρχὴν ἔλαβεν ἡ τῶν ἀριθμῶν ἀκριβὴς γνῶσις, οὕτω δὴ καὶ παρ' Αἰγυπτίοις ἡ γεωμετρία διὰ τὴν εἰρημένην αἰτίαν εὕρηται. Θαλῆς δὲ πρῶτον εἰς Αἴγυπτον ἐλθὼν μετήγαγεν εἰς τὴν Ἑλλάδα τὴν θεωρίαν ταύτην καὶ πολλὰ μὲν αὐτὸς εὗρεν, πολλῶν δὲ τὰς ἀρχὰς τοῖς μετ' αὐτὸν ὑφηγήσατο τοῖς μὲν καθολικώτερον ἐπιβάλλων, τοῖς δὲ αἰσθητικώτερον. <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == « [[w:Souda|'''Suidas''']] » ''([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l'on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] fin du [[w:IXe_siècle|IX<sup>ème</sup> siècle {{Info|EC|de l’Ère Commune}}]])'' [[s:Auteur:Suidas|<sup>📚</sup>]] == === La Souda === Θαλῆς, Ἐξαμύου καὶ Κλεοβουλίνης, Μιλήσιος, ὡς δὲ Ἡρόδοτος Φοῖνιξ: γεγονὼς πρὸ Κροίσου, ἐπὶ τῆς λε# ὀλυμπιάδος, κατὰ δὲ Φλέγοντα γνωριζόμενος ἤδη ἐπὶ τῆς ζ#. ἔγραψε περὶ μετεώρων ἐν ἔπεσι, Περὶ ἰσημερίας, καὶ ἄλλα πολλά. ἐτελεύτησε δὲ γηραιός, θεώμενος γυμνικὸν ἀγῶνα, πιληθεὶς δὲ ὑπὸ τοῦ ὄχλου καὶ ἐκλυθεὶς ὑπὸ τοῦ καύματος. πρῶτος δὲ Θαλῆς τὸ τοῦ σοφοῦ ἔσχεν ὄνομα καὶ πρῶτος τὴν ψυχὴν εἶπεν ἀθάνατον ἐκλείψεις τε καὶ ἰσημερίας κατείληφεν. ἀποφθέγματα δὲ αὐτοῦ πλεῖστα: καὶ τὸ θρυλλούμενον: γνῶθι σαυτόν. τὸ γάρ, ἐγγύα, πάρα δ' ἄτα, Χίλωνός ἐστι μᾶλλον, ἰδιοποιησαμένου αὐτό: καὶ τό, μηδὲν ἄγαν. 4m3swzzmzr0i5kacprq6i4f4j70n2hq 767383 767364 2026-06-03T06:57:55Z Alex Mtlr 103840 767383 wikitext text/x-wiki {| border="0" cellpadding="0" width="100%" style="background: #f9f9f9" | colspan="3" height="25"|<div style="text-align: center;">[[Philosophie/Thalès de Milet|'''Thalès de Milet''']]</div> |- | width="33%"|'''[[Philosophie/Thalès de Milet/Textes_et_traductions_période_République_Romaine|Période République Romaine]]''' |- | width="33%"|'''[[Philosophie/Thalès de Milet/Textes_et_traductions_période_Grèce_Hellénistique|Période de la Grèce Hellénistique]]''' |- | width="33%"|'''[[Philosophie/Thalès de Milet/Textes_et_traductions_Ier_millénaire_AEC|Période de la Grèce Classique]]''' |} {{EnTravaux}} <span style="font-size:18pt;">Période du Principat de l’[[w:Empire_romain|''Empire'']] [[#Empire|<span id="Empire_back"><sup>'''I'''</sup></span>]] [[w:Rome_antique|''Romain'']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Rome_back|<sup>🔄</sup>]]</span> <p style="text-align: right;">(16 janvier [[w:27_av._J.-C.|-27]] <sup>[[w:Ier_siècle_av._J.-C.|⏳]]</sup>, nomination de [[w:Auguste|'''Caius Iulius Caesar Octavianus''']] aux titres d’[[w:Auguste_(titre)|''Augustus'']] et de [[w:Princeps_senatus|''Princeps'']] par le [[w:Sénat_romain|''Sénat romain'']] — fin du [[w:IIIe_siècle|III<sup>ème</sup> siècle {{Info|EC|de l’Ère Commune}}]], création du système [[w:Tétrarchie|''tétrarchique'']] [[#tétrarchie|<span id="tétrarchie_back"><sup>'''II'''</sup></span>]] par [[w:Dioclétien|'''Dioclétien''']] [[#Dioclétien|<span id="Dioclétien_back"><sup>'''III'''</sup></span>]] pour faire face aux [[w:Invasions_barbares#Première_période_:_les_mouvements_migratoires_germaniques_du_IIIe_siècle|''incursions barbares'']]) {{Boîte déroulante début|titre=NdA Empire|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Empire_back|<span id="Empire"><sup>I</sup></span>]] Du nom commun latin imperium [[wikt:en:imperium#Latin|(en)]], « 1. L’empire, l’État, le gouvernement impérial, le royaume, la domination. 2. Le droit ou le pouvoir de commander ou d’avoir le contrôle ; domination. 3. Commandement ou autorité absolue sur l’empire (ou un autre régime politique) ; souveraineté ; domination. 4. (militaire) Autorité militaire, commandement (d’une armée). 5. L’exercice de l’autorité, de la règle, de la loi, du contrôle, de la souveraineté. 6. Un commandement, un ordre, une direction, une injonction.) »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ du verbe imperō, « 1. (avec datif) Commander, donner des ordres à, imposer, exiger. 2. Gouverner. »;<br /><p style="margin: 0 2em; text-indent: 30px;">➥ du préfixe prépositionnal in-, « 1. Dans, à l’intérieur. 2. Contre; dans; sur; vers. 3. (utiliser comme un intensifieur). 4. Attaché à des [[w:Aspect_inchoatif|''verbes inchoatifs'']], il peut exprimer le sens d’un changement en cours ou d’un achèvement partiel. »;<br /><p style="margin: 0 2em; text-indent: 30px;">➥ +‎ du verbe parō [[wikt:en:paro#Latin|(en)]], « 1. Arranger, ordonner, concevoir. 2. Fournir, meubler, préparer. 3. Résoudre, viser, décider. 4. Obtenir, acquérir, se procurer, se faire. »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ + du suffixe nominal abstractif‎ -ium [[wikt:en:-ium#Latin|(en)]], désignant parfois des offices et des groupes. »;<br /><p style="margin: 0 2em; text-indent: 15px;">Selon l’historien, spécialiste de l’[[w:Grèce_antique|''antiquité grecque'']], [[w:Moses_Finley|Moses Finley]], définit un empire par tout {{Info|''« exercice durable par un État d’une autorité, d’un pouvoir, ou d’un contrôle sur un ou plusieurs États, communautés ou peuples »''|Moses Finley, Économie et société en Grèce antique, La Découverte, 2007.}}. L’historien [[w:Jean_Tulard|Jean Tulard]], précise cette définition par {{Info|''cinq traits suivants''|Jean Tulard, Les Empires occidentaux de Rome à Berlin, PUF, 1997.}} :<br /><p style="margin: 0 2em; text-indent: 15px;"> • Une volonté expansionniste ;<br /><p style="margin: 0 2em; text-indent: 15px;">• Une organisation centralisée ;<br /><p style="margin: 0 2em; text-indent: 15px;">• Des peuples encadrés par une armature politique et fiscale commune ;<br /><p style="margin: 0 2em; text-indent: 15px;">• La croyance en une supériorité d’essence ;<br /><p style="margin: 0 2em; text-indent: 15px;">• Un début et une fin clairement identifiés. <br /><br /><p style="margin: 0 2em; text-indent: 15px;">'''[[#tétrarchie_back|<span id="tétrarchie"><sup>II</sup></span>]] Du nom commun grec ancien τετραρχία / tetrarkhía;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ du préfixe τετρα- / tétra- [[wikt:en:τετρα-#Ancient_Greek|(en)]], « quatre »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ + du suffixe -αρχία / -arkhía [[wikt:en:-αρχία#Ancient_Greek|(en)]], « -archie (forme de gouvernement ou de règle) »;<br /><p style="margin: 0 2em; text-indent: 15px;"> Système de gouvernement de l’Empire ''romain'' mis en place par Dioclétien à la fin du [[w:IIIe_siècle|III<sup>ème</sup> siècle {{Info|EC|de l’Ère Commune}}]], pour faire face aux invasions barbares. Il consiste en la division de la direction de l’empire entre, d’une part deux [[w:Empereur_romain|''empereurs'']] — les [[w:Auguste_(titre)|''augustes'']] —, d’autre part deux ''lieutenants'' (successeurs désignés des ''augustes'') — les [[w:C%C3%A9sar_(titre)|''césars'']]. <br /><br /><p style="margin: 0 2em; text-indent: 15px;">'''[[#Dioclétien_back|<span id="Dioclétien"><sup>III</sup></span>]] [[w:Nom_romain|Tria Nomina]] en latin {{Info|Gaius|praenomen, nom individuel du citoyen romain}} {{Info|Aurelius|nomen, nom de famille}} {{Info|Valerius|cognomen, surnom héréditaire, servant à distinguer les diverses branches d’une même gens}}, surnommé Dioclētiānus [[wikt:en:Diocletian#English|(en)]] lorsqu’il a été proclamé empereur par ses troupes;<br /><p style="margin: 0 2em; text-indent: 15px;"> Militaire et empereur, connu pour avoir séparé et élargi les services civils et militaires de l’empire, et réorganisé les divisions provinciales de l’empire, établissant le gouvernement le plus vaste et le plus bureaucratique de l’histoire de l’empire. En [[w:286|286]], il nomme son ''césar'', ou adjoint et successeur, [[w:Maximien_Hercule|Maximien]] ''Auguste'', co-empereur, et partage l’Empire entre l’Orient et l’Occident, puis en 293, y nomme respectivement [[w:Galère_(empereur_romain)|Maximien Galère]] et [[w:Constance_Chlore|Constance Chlore]] comme ''césar''.<br/><br/></div> ''' {{Boîte déroulante fin}} == [[w:Sénèque|'''Sénèque''']] [[#Sénèque|<span id="Sénèque_back"><sup>'''I'''</sup></span>]] == <p style="text-align: right;">([[w:5_av._J.-C.|-5]] <sup>[[w:Ier_siècle_av._J.-C.|⏳]]</sup> / [[w:1|1]] <sup>[[w:Ier_siècle|⏳]]</sup>, à [[w:Corduba|Corduba]] — 12 avril [[w:65|65]], à [[w:Rome_antique|''Rome'']], dans une maison de plaisance, la « quatrième pierre milliaire », contraint au [[w:Suicide_forcé|''suicide forcé'']] par l’empereur [[w:Néron|'''Néron''']] après avoir été dénoncé dans la [[w:Conjuration_de_Pison|''Conjuration de Pison'']], sans preuve selon [[w:Tacite|'''Tacite''']] [https://remacle.org/bloodwolf/historiens/tacite/annales15.htm <sup>Annales, l.V, §§LX-LXVI.</sup>]) [[s:Auteur:Sénèque_le_Jeune|<sup>📚</sup>]] [https://books.google.fr/books?id=_HZTvAxN7CIC&newbks=1&newbks_redir=0&lpg=PA3&dq=bibliogroup%3A%22Dictionnaire%20des%20philosophes%20antiques%22&hl=fr&pg=PA177#v=onepage&q&f=true {{Info|<sup>🔍</sup>|Dictionnaire des Philosophes Antiques, publié sous la direction de Richard Goulet, Volume VI, §43 - Seneca (Lucius Annaeus –)}}] [[Fichier:Duble_herma_of_Socrates_and_Seneca_Antikensammlung_Berlin_03_.jpg|vignette|<p style="text-align: justify; text-indent: 15px;">Double-hermès du [[w:IIIe_siècle|III<sup>ème</sup> siècle {{Info|EC|de l’Ère Commune}}]], unique portrait de '''Sénèque''' nommé et authentifié, et associé à celui de '''Socrate''', dont le point commun est celui d’avoir été contraint de se donner la mort. Copie ''romaine'' d’un modèle fait du vivant même du philosophe [https://books.google.fr/books?id=_HZTvAxN7CIC&newbks=1&newbks_redir=0&lpg=PA3&dq=bibliogroup%3A%22Dictionnaire%20des%20philosophes%20antiques%22&hl=fr&pg=PA180#v=onepage&q&f=true {{Info|<sup>➕</sup>|Dictionnaire des Philosophes Antiques, publié sous la direction de Richard Goulet, Volume VI, §43 - Seneca (Lucius Annaeus –), Iconographie}}] [https://books.google.fr/books?id=_HZTvAxN7CIC&newbks=1&newbks_redir=0&lpg=PA3&dq=bibliogroup%3A%22Dictionnaire%20des%20philosophes%20antiques%22&hl=fr&pg=PA201#v=onepage&q&f=true {{Info|<sup>➕➕</sup>|Dictionnaire des Philosophes Antiques, publié sous la direction de Richard Goulet, Volume VI, §43 - Seneca (Lucius Annaeus –), Iconographie - contribution de J. Lang}}].<br /><p style="text-align: justify; text-indent: 15px;">Matériau : Marbre blanc-brunâtre, légèrement veiné, finement cristallin.<br /><p style="text-indent: 15px;">Provenance : ''Rome'', 1813.<br /><p style="text-align: justify; text-indent: 15px;">Exposition : Staatliche Museen zu Berlin, Antikensammlung, SK. 391 [https://recherche.smb.museum/detail/698814/doppelherme-des-sokrates-und-seneca-mit-namensbeischriften-der-dargestellten <sup>🔍</sup>].]] <div style="text-align: justify; margin: 0 1em; text-indent: 15px">Homme politique romain, philosophe stoïcien et dramaturge, il devient tour à tour conseiller à la cour impériale sous '''Caligula''' puis '''Claude''', est exilé en 41 en ''Corse'', où il écrit ses premiers traités philosophiques avant d’être rappelé comme tuteur du jeune '''Néron''' en 49, et enfin, lorsque ce dernier accède au pouvoir, en devient le conseiller et l’un des personnages les plus influents de l’Empire.</div> {{Boîte déroulante début|titre=NdA Sénèque|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Sénèque_back|<span id="Sénèque"><sup>I</sup></span>]] [[w:Nom_romain|Tria Nomina]] en latin {{Info|Lucius|praenomen, nom individuel du citoyen romain}} {{Info|Annaeus|nomen, nom de famille}} {{Info|Seneca|cognomen, surnom héréditaire, servant à distinguer les diverses branches d’une même gens}}'''<br/><br/></div> {{Boîte déroulante fin}} === [[w:Sénèque#Physique|Questions naturelles]] === <p style="text-align: right;">[[s:Questions_naturelles|📚]] <div style="text-align: justify; margin: 0 1em; text-indent: 15px">Ouvrage de philosophie naturelle écrit vers 65. Il ne s’agit pas d’une [[w:Encyclopédie|encyclopédie]] [[#encyclopédie|<span id="encyclopédie_back"><sup>'''I'''</sup></span>]] systématique comme l’[[w:Histoire_naturelle_(Pline_l'Ancien)|''Histoire naturelle'']] [[#Histoire_naturelle|<sup>⤵️</sup>]] de [[w:Pline_l'Ancien|'''Pline l’Ancien''']] [[#Pline_l’Ancien_I|<sup>⤵️</sup>]], bien que ces 2 œuvres représentent les rares ouvrages romains consacrés à l’étude du monde naturel. L’investigation de '''Sénèque''' se déroule principalement à travers la prise en compte des points de vue d’autres penseurs, ''grecs'' et ''romains'', bien qu’elle ne soit pas dénuée de pensées originales, dont éthiques conforment à la pensée ''stoïcienne''.</div> {{Boîte déroulante début|titre=NdA Questions naturelles|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#encyclopédie_back|<span id="encyclopédie"><sup>I</sup></span>]] Du nom commun [[w:Latin#Latin_humaniste|latin Renaissance]] encyclopaedīa [[wikt:en:encyclopaedia#Latin|(en)]]; de l’expression grec ancien ἐγκύκλῐος παιδείᾱ / enkúklios paideíā [https://dumas.ccsd.cnrs.fr/dumas-03927443/file/DONNADILLE-MR2-Pline-VERS-FINALE.pdf {{Info|<sup>🔍</sup>|Lisa Donnadille. Merveilles animalières dans les livres VIII à XI de l’Histoire naturelle de Pline l’Ancien. Littératures. 2020. ffdumas-03927443, p.21}}], « cercle de l’éducation ou des sciences, l’ensemble des sciences qui constituent une éducation complète »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ de l’adjectif ἐγκύκλιος / enkúklios, littéralement « qui est rond ou tourne en rond, circulaire », ou au sens figuré « qui revient en cercle sur soi-même, périodique », « qui embrasse un cercle entier »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ du nom commun παιδεία / paideía, « l’éducation »;'''<br /><p style="margin: 0 2em; text-align: center;">« ''Si à première vue la signification de cette expression semble être sans ambiguïté, sa portée réelle et la compréhension qu’en avaient les auteurs grecs puis latins font l’objet de débats parmi les spécialistes. En effet, deux interprétations sont possibles lorsqu’un auteur de l’Antiquité a recours à cette expression dans l’un de ses textes. Dans le premier cas, cela équivaudrait à parler d’une éducation ordinaire, commune à tous ; et dans le second cas, cela ferait référence à la quantité de connaissances et de sciences qu’il faudrait maîtriser au préalable avant de commencer l’étude d’un sujet précis, qui serait dans ce cas placé en haut d’une hiérarchie dans les savoirs.'' »<br /><p style="margin: 0 2em; text-align: right;">''' Lisa Donnadille. [https://dumas.ccsd.cnrs.fr/dumas-03927443/file/DONNADILLE-MR2-Pline-VERS-FINALE.pdf Merveilles animalières dans les livres VIII à XI de l’Histoire naturelle de Pline l’Ancien. Littératures. 2020. ffdumas-03927443], p.21'''<br/><br/></div> {{Boîte déroulante fin}} ==== Livre III — De l’eau ==== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">En prologue, Sénèque explique pourquoi il est plus important de s’intéresser à l’observation du monde, à sa connaissance et à sa compréhension plutôt qu’à sa conquête. Puis, il développe diverses théories sur la formation des rivières, les eaux souterraines et les propriétés de l’eau. Dans une critique morale aux chapitres XVII à XIX, il fustige la mauvaise pratique consistant à amener à table des poissons, notamment des rougets, vivants et à se délecter de leurs couleurs changeantes à l’agonie avant de les préparer devant les convives. En épilogue, il énonce son [[w:Eschatologie|''eschatologie'']], sa vision de la fin du monde où les êtres vivants seront anéantis par des raz-de-marée, marquant la fin d’un cycle du vivant et le début d’un autre.</div> ===== <div style="text-align: center;">Chapitre XIII.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage de la doctrine de '''Thalès''' faisant de l’eau l’élément à l’origine de la vie et critique d’une autre de la terre flottant dessus.</div> :'''Texte latin''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''13.''' Adiciam, ut '''Thales''' ait, «ualentissimum elementum est». Hoc fuisse primum putat, ex hoc surrexisse omnia. Sed nos quoque aut in eadem sententia, aut in uicinia eius sumus. Dicimus enim ignem esse qui occupet mundum et in se cuncta conuertat; hunc euanidum languentemque considere et nihil relinqui aliud in rerum natura igne restincto quam umoren; in hoc futuri mundi spem latere. Ita ignis exitus mundi est, umor primordium. Miraris ex hoc posse amnes semper exire qui pro omnibus fuit et ex quo sunt omnia? Hic umor in diductione rerum ad quartas redactus est, sic positus ut sufficere fluminibus edendis, ut riuis, ut fontibus posset.<br /><p style="text-indent: 15px;">'''14.''' Quae sequitur '''Thaletis''' inepta sententia est. Ait enim terrarum orbem aqua sustineri et uehi more nauigii mobilitateque eius fluctuare tunc cum dicitur tremere; non est ergo mirum si abundat umor ad flumina profundenda, cum in umore sit totus. Hanc ueterem et rudem sententiam explode. Nec est quod credas in hunc orbem aquam subire per rimas et facere sentinam.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-i-1979/page/n1/mode/2up <u>L. Annaei Senecae, Natvrales Qvaestiones</u>], [https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-i-1979/page/n261/mode/2up ''Liber Tertivs.''], [https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-i-1979/page/n293/mode/2up ''chap. 13.-14.''], texte établi par Carmen Codoñer Merino [[w:es:Carmen_Codoñer_Merino|(es)]], Consejo Superior de Investigaciones Científicas, Madrid, 1979</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''XIII.''' Aqua, ait '''Thales''', valentissimum elementum est : hoc fuisse primum putat, et hoc surrexisse omnia. Sed et nos quoque aut in eadem sententia, aut in ultima sumus. Dicimus enim ignem esse, qui occupet mundum, et in se cuncta convertat ; hunc evanidum considere, et nihil relinqui aliud in rerum natura, igne restincto, quam humorem : in hoc futuri mundi spem latere. Ita ignis exitus mundi est, humor primordium. Miraris amnes ex hoc posse exire semper, qui pro omnibus fuit, et ex quo sunt omnia? Hic humor in diductione rerum ad quartas redactus est, sic positus, ut fluminibus edendis sufficere, ut rivis, ut fontibus posset. Quæ sequitur, '''Thaletis''' inepta sententia est : ait enim , terrarum orbem aqua sustineri, et vehi more navigii, mobilitateque ejus fluctuare, tum quum dicitur tremere. Non est ergo mirum, si abundat humor ad flumina fundenda, quum mundus in humore sit totus. Hanc veterem et rudem sententiam explode : nec est quod credas, in hunc orbem aquam subire per rimas et facere sentiuam.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PP9#v=onepage&q&f=true <u>Œuvres Complètes de Sénèque, Tome Quatrième</u>], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA327#v=onepage&q&f=true ''Questions Naturelles, De Sénèque à Lucilius - Livre Troisième.''], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA342#v=onepage&q&f=true ''chap. XIII.''], traduction française de la collection Panckoucke, nouvelle édition très soigneusement revue par M. Charpentier et M. Félix Lemaistre, 1860</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''XIII.''' L’eau, dit '''Thalès''', est le plus puissant des éléments, le premier en date, celui par qui tout a pris vie. Nous pensons comme '''Thalès''', au moins sur le dernier point. En effet, nous prétendons que le feu doit s’emparer du monde entier et convertir tout en sa propre substance, puis s’évaporer, s’affaisser, s’éteindre et ne rien laisser autre chose dans la nature que l’eau ; qu’enfin l’eau recèle l’espoir du monde futur. Ainsi périra par le feu cette création dont l’eau fut le principe. Es-tu surpris que des fleuves sortent incessamment d’un élément qui a tenu lieu de tout, et duquel tout est sorti ? Quand les éléments furent séparés les uns des autres, l’eau fut réduite au quart de l’univers, et placée de manière à suffire à l’écoulement des fleuves, des ruisseaux, des fontaines. Mais voici une idée absurde de ce même '''Thalès'''. Il dit que la terre est soutenue par l’eau sur laquelle elle vogue comme un navire ; qu’à la mobilité d’un tel support sont dues les fluctuations qu’on appelle tremblements de terre. Ce ne sera donc pas merveille qu’il y ait assez d’eau pour entretenir les fleuves, si tout le globe est dans l’eau. Ce système grossier et suranné n’est que risible ; tu ne saurais admettre que l’eau pénètre notre globe par ses interstices, et que la cale est entr’ouverte.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[[s:Questions_naturelles_(trad._Baillard)|<u>Sénèque le Jeune</u>]], [[s:Questions_naturelles_(trad._Baillard)/Livre_3|''Livre III. chap. 13.'']], traduction par [[s:Auteur:Joseph_Baillard|Joseph Baillard]], Hachette, 1914<br />(également disponible [https://remacle.org/bloodwolf/philosophes/seneque/questionsnaturelles3.htm ici])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''XIII.''' L’eau, dit '''Thalès''', est le plus puissant des éléments : elle existait avant tout, elle est le principe de tout. Nous pensons comme '''Thalès''', au moins sur le dernier point. En effet, nous croyons que le feu, s’emparant du monde entier, convertira tout en sa propre substance : mais il finira par cesser ses ravages, et quand il sera éteint, dans toute la nature il ne restera que l’eau, et cette eau renfermera le germe et l’espérance d’un monde futur. Ainsi par le feu s’accomplira la destruction de l’univers, et par l’eau sa réorganisation. Êtes-vous surpris, maintenant, qu’après avoir tenu lieu de tous les éléments, et les avoir produits tous, l’eau suffise à l’entretien perpétuel des fleuves ? Quand les éléments furent séparés les uns des autres, l’eau fut réduite au quart de l’univers, et dans une proportion convenable pour suffire à l’alimentation des fontaines, des ruisseaux et des rivières. Mais voici une idée absurde du même '''Thalès''' : il dit que la terre est soutenue par l’eau, et qu’elle flotte sur elle comme un navire ; que les tremblements de terre sont causés par les oscillations et les mouvements du fluide qui la soutient. Il n’est donc pas étonnant qu’il y ait assez d’eau pour alimenter les fleuves, puisque tout le globe est dans l’eau. Mais rejetons cette vieille et informe hypothèse, qui assimile les sources aux flots que la cale entr’ouverte laisse pénétrer dans le vaisseau.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PP9#v=onepage&q&f=true <u>Œuvres Complètes de Sénèque, Tome Quatrième</u>], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA327#v=onepage&q&f=true ''Questions Naturelles, De Sénèque à Lucilius - Livre Troisième.''], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA342#v=onepage&q&f=true ''chap. XIII.''], traduction française de la collection Panckoucke, nouvelle édition très soigneusement revue par M. Charpentier et M. Félix Lemaistre, 1860</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''Chap. III.'''<br />''Opiniõ de Thales touchant l’eau.''<br /><p style="text-align: justify; text-indent: 15px;">L’eau , comme dit '''Thales''' , e[[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki>t</nowiki> le plus fort des Elemens. Il croit me{{Info|ſ|forme ancienne longue de la lettre s minuscule}}me qu’elle e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t le premier , & que toutes cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es en ont pris nai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ance. Pour moy ie {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uis de cette opinion , ou du moins de la derniere partie de cette opinion. Car nous [[#nous_stoiciens_NdT_dR|<span id="nous_stoiciens_NdT_dR_back"><sup>1</sup></span>]] di{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ons que c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t le feu qui enueloppera tout le monde , & qui conuertira en {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oy toutes cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es; qu’il deuiendra {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ans force quand il n’aura plus de nourriture , qu’apres que le feu {{Info|ſ|forme ancienne longue de la lettre s minuscule}}era e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}teint il ne demeurera rien de re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te à la nature que l’eau {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement , & que c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t en elle {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eule que con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te l’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}perance d’vn monde futur. Ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i le feu e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t la fin du monde , & l’eau en e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t le commencement. Vous e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tonnez-vous donc que les fleuues pui{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ent tou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iours {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ortir d’vn Element , qui e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t fait pour toutes cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es & dont toutes cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e font ? Lors que la nature fit le departement des Elemens , l’eau fut placée de telle {{Info|ſ|forme ancienne longue de la lettre s minuscule}}orte , qu’elle peut {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uffire pour les fleuues , pour les rui{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eaux , pour les fontaines. Mais ce que '''Thales''' dit en {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uitte e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t ridicule , car il dit que le Globe de la terre e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tenu par les eaux ; qu’elles le portent comme vn vai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eau , & qu’elles l’agitent de la me{{Info|ſ|forme ancienne longue de la lettre s minuscule}}me {{Info|ſ|forme ancienne longue de la lettre s minuscule}}orte , lors que nous croyons qu’il tremble. Il ne faut donc pas s’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tonner , s’il ya tou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iours a{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ez d’eau pour former de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i grands fleuues , puis que tout le monde nage fur l’eau. Mais me{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pri{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ez cette vieille , & cette gro{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}iere opinion , & ne croyez pas que l’eau vienne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur la terre , comme par des fentes & par des creua{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}es , & qu’elle y {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oit {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement comme dans le fond d’vn vai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eau.</div> <table cellspacing=15 style="margin: 0 4em; font-size:85%;"> <tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#nous_stoiciens_NdT_dR_back|<span id="nous_stoiciens_NdT_dR"><sup>1.</sup></span>]] Les Stoïciens.''' </td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=ktOcOg9lr54C&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii&hl=fr&pg=PA1#v=onepage&q&f=true <u>Seneque Des Qvestions Natvrelles</u>], [https://books.google.fr/books?id=ktOcOg9lr54C&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii&hl=fr&pg=PA202#v=onepage&q&f=true ''Livre Troisiesme. Des eaux.''], [https://books.google.fr/books?id=ktOcOg9lr54C&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii&hl=fr&pg=PA234#v=onepage&q&f=true ''chap. XIII.''], traduction par [[w:Pierre_Du_Ryer|Pierre Du Ryer]], A Lyon, Chez Christofle Fovrmy, 1663</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div> </div> <div style="text-align: center; margin: 0 auto;">― ● ―</div> ==== Livre IV — Du Nil ==== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">En prologue, '''Sénèque''' fait l’éloge de [[w:Lucilius_le_Jeune|'''Lucilius''']] [[#Lucilius|<span id="Lucilius_back"><sup>'''I'''</sup></span>]] avant de lui expliquer les dangers de la flatterie. Puis, il décrit la crue du [[w:Nil|''Nil'']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Nil_back|<sup>🔄</sup>]], expose les théories tentant de l’expliquer et les réfute. En épilogue, il fait le procès du luxe, et plus particulièrement celui d’acheter de la neige, et donc de marchandiser l’eau, regrettant qu’on ne puisse faire de même avec l’air et le soleil.</div> {{Boîte déroulante début|titre=NdA Lucilius|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Lucilius_back|<span id="Lucilius"><sup>I</sup></span>]] Du nom propre latin Lucilius [[wikt:en:Lucilius#Latin|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;">Gouverneur ''romain'' de Sicile durant le règne de [[w:Néron|Néron]], ainsi qu’un ami et un correspondant de Sénèque.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:Ier_siècle_av._J.-C.|I<sup>er</sup> siècle {{Info|EC|de l’Ère Commune}}]], [[w:Campanie#Histoire|''Campanie'']], [[w:Quatorze_régions_de_la_Rome_augustéenne#Regio_I_:_Porte_Capène|''Regio I'']])'''<br/><br/></div> {{Boîte déroulante fin}} ===== <div style="text-align: center;">Chapitre II.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Réfutation par '''Sénèque''' d’une théorie explicite de '''Thalès''' sur la crue du ''Nil'' (théorie identique mais supposément implicite rapportée par [[w:Hérodote|'''Hérodote''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Chapitre_XX|<sup>🔄</sup>]]).</div> :'''Texte latin''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''2.''' [...] Si '''Thaleti''' credis, etesiae descendenti ''Nilo'' resistunt et cursum eius acto contra ostia mari sustinent. Ita reuerberatus in se recurrit, nec crescit, sed exitu prohibitus resistit et quacumque mox potuit ui congestus erumpit. '''Euthymenes''' ''Massiliensis'' testimonium dicit: «Nauigaui, inquit, ''Atlanticum'' mare. Inde ''Nilus'' fluit, maior, quamdiu etesiae tempus obseruant; tunc enim eicitur mare instantibus uentis. Cum resederunt, et pelagus conquiescit minorque descendenti inde uis ''Nilo'' est. Ceterum dulcis mari sapor est et similes ''Niloticis'' beluae». Quare ergo, si ''Nilum'' etesiae prouocant, et ante illos incipit incrementum eius et post eos durat? Praeterea non fit maior quo illi flauere uehementius, nec remittitur incitaturque, prout illis impetus fuit; quod fieret, si illorum uiribus cresceret. Quid quod etesiae litus ''Aegyptium'' uerberant et contra illos ''Nilus'' descendit, inde uenturus unde illi, si origo ab illis esset? Praeterea ex mari purus et caeruleus efflueret, non, ut nunc, turbidus ueniret. Adde quod testimonium eius testium turba coarguitur. Tunc erat mendacio locus; cum ignota essent externa, licebat illis fabulas mittere. Nunc uero tota exteri maris ora mercatorum nauibus stringitur, quorum nemo narrat initium ''Nili'' aut mare saporis alterius: quae natura credi uetat, quia dulcissimum quodque et leuissimum sol trahit. Praeterea quare hieme non crescit? Et tunc potest uentis concitari mare, aliquanto quidem majoribus; nam etesiae temperati sunt. Quod si e mari ferretur ''Atlantico'', semel oppleret ''Aegyptum''. At nunc per gradus crescit.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-ii-1979/page/n1/mode/2up <u>L. Annaei Senecae, Natvrales Qvaestiones</u>], [https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-ii-1979/page/n7/mode/2up ''Liber Qvartvs A.''], [https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-ii-1979/page/n41/mode/2up ''chap. 2.''], texte établi par Carmen Codoñer Merino [[w:es:Carmen_Codoñer_Merino|(es)]], Consejo Superior de Investigaciones Científicas, Madrid, 1979</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''II.''' [...] Si '''Thaleti''' credis, Etesiæ descendenti ''Nilo'' resistunt, et cursus ejus acto contra ostia mari sustinent : ita reverberatus in se recurrit : nec crescit, sed exitu prohibitus resistit, et quacumque mox potuit, inconcessus erumpit.<br /><p style="text-align: justify; text-indent: 15px;">'''Euthymenes''' ''Massiliensis'' testimonium dicit : « Navigavi, inquit, ''Atlanticum'' mare. Inde ''Nilus'' fluit major, quamdiu Etesiæ tempus observant : tunc enim ejicitur mare instantibus ventis. Quum resederint, et pelagus conquiescit, minorque descendenti inde vis ''Nilo'' est. Ceterum dulcis maris sapor est, et similes ''Niloticis'' belluæ. » Quare ergo, si ''Nilum'' Etesiæ provocant, et ante illos incipit incrementum ejus, et post eos durat ? Præterea non fit major, quo illi flavere vehementius. Nec remittitur, incitaturque, prout illis impetus fuit : quod fieret, si illorum viribus cresceret. Quid, quod Etesiæ littus ''ægyptium'' verberant, et contra illos ''Nilus'' descendit, inde venturus, unde illi, si origo ab illis esset ? Præterea ex mari purus et cæruleus efflueret, non ut nunc turbidus venit. Adde, quod testimonium ejus testium turba coarguitur. Tunc erat mendacio locus, quum ignota essent externa. Licebat illis fabulas mittere. Nunc vero tota exteri maris ora mercatorum navibus stringitur : quorum nemo narrat nunc cæruleum ''Nilum'', aut mare saporis alterius ; quod et natura credi vetat, quia dulcissimum quodque et levissimum sol trahit. Præterea quare hieme non crescit ? et tunc potest ventis concitari mare, aliquando quidem majoribus ; nam Etesiæ temperati sunt. Quod si e mari ferretur ''Atlantico'', semel oppleret ''Ægyptum''. At nunc per gradus crescit.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PP9#v=onepage&q&f=true <u>Œuvres Complètes de Sénèque, Tome Quatrième</u>], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA371#v=onepage&q&f=true ''Questions Naturelles, De Sénèque à Lucilius - Livre Quatrième.''], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA385#v=onepage&q&f=true ''chap. II.''], traduction française de la collection Panckoucke, nouvelle édition très soigneusement revue par M. Charpentier et M. Félix Lemaistre, 1860</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''II.''' [...] À en croire '''Thalès''', les vents étésiens repoussent le ''Nil'' à sa descente dans la mer, et suspendent son cours en poussant la mer contre ses embouchures. Ainsi refoulé, il revient sur lui-même, sans pour cela grossir ; mais l’issue lui étant barrée, il s’arrête, et bientôt, partout où il le peut, force le passage qui lui est refusé. [[w:Euthymènes|'''Euthymène''']] [[#Euthymènes|<span id="Euthymènes_back"><sup>'''I'''</sup></span>]], de ''Marseille'', en parle comme témoin : « J’ai navigué, dit-il, sur la mer ''Atlantique''. Elle cause le débordement du ''Nil'', tant que les vents étésiens se soutiennent ; car c’est leur souffle qui alors pousse cette mer hors de son lit. Dès qu’ils tombent, la mer aussi redevient calme, et le ''Nil'' à sa descente déploie moins de puissance. Du reste, l’eau de cette mer est douce, et nourrit des animaux semblables à ceux du ''Nil''. » Mais pourquoi, si les vents étésiens font gonfler le ''Nil'', la crue commence-t-elle avant la saison de ces vents, et dure-t-elle encore après ? D’ailleurs le fleuve ne grossit pas à mesure qu’ils soufflent plus violemment. Son plus ou moins de fougue n’est point réglé sur celle des vents étésiens, ce qui aurait lieu, si leur action le faisait hausser. Et puis ils battent la côte ''égyptienne'', le ''Nil'' descend à leur encontre : il faudrait qu’il vînt du même point qu’eux, si son accroissement était leur ouvrage. De plus, il sortirait pur et azuré de la mer, et non pas trouble comme il est. Ajoute que le témoignage d’'''Euthymène''' est réfuté par une foule d’autres. Le mensonge avait libre carrière, quand les plages étrangères étaient inconnues ; on pouvait de là nous envoyer des fables, À présent, la mer extérieure est côtoyée sur tous ses bords par des trafiquants dont pas un ne raconte qu’aujourd’hui le ''Nil'' soit azuré ou que l’eau de la mer soit douce. La nature elle-même repousse cette idée ; car les parties les plus douces et les plus légères sont pompées par le soleil. Et encore pourquoi le ''Nil'' ne croît-il pas en hiver ? Alors aussi la mer peut être agitée par des vents quelque peu plus forts que les étésiens, qui sont modérés. Si le mouvement venait de l’Atlantique, il couvrirait tout d’un coup l’Égypte : or l’inondation est graduelle.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[[s:Questions_naturelles_(trad._Baillard)|<u>Sénèque le Jeune</u>]], [[s:Questions_naturelles_(trad._Baillard)/Livre_4|''Livre IV.'']] ''chap. 2.'', traduction par [[s:Auteur:Joseph_Baillard|Joseph Baillard]], Hachette, 1914<br />(également disponible [https://remacle.org/bloodwolf/philosophes/seneque/questionsnaturelles4.htm ici])</div> {{Boîte déroulante début|titre=NdA trad. par Joseph Baillard de 1914|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Euthymènes_back|<span id="Euthymènes"><sup>I</sup></span>]] Du nom propre grec ancien Εὐθυμένης / Euthuménēs [[wikt:en:Εὐθυμένης#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;"> ➥ de l’adjectif εὐθύς / euthús, « 1. Droit, direct : (au sens moral) direct, ouvert, franc. »;<br /><p style="margin: 0 2em; text-indent: 15px;"> ➥ + du nom commun μενος / ménos, « 1. Esprit. 2. Désir, ardeur, souhait, but. 3. Colère. 4. Courage, esprit, vigueur. 5. Pouvoir, force. 6. Violence. »;<br /><p style="margin: 0 2em; text-indent: 15px;"> ➥ + du suffixe nominal‎ propre -ης / -ēs [[wikt:en:-ης#Suffix_2|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;"> Navigateur et explorateur de la mer Extérieure le long des côtes africaines (actuelle Atlantique sud).<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:VIeme_siècle_av._J.-C.|VI<sup>ème</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]], [[w:Marseille_antique#Massalia,_une_cité_grecque|''Massalia'']], actuelle Marseille)'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''II.''' [...] Selon '''Thalès''', le phénomène a pour cause les vents Étésiens, qui s’opposent au cours du ''Nil'' et font rebrousser ses eaux en sens inverse du mouvement qui le porte vers la mer. Refoulés sur eux-mêmes, les flots refluent sans pour cela grossir ; mais l’issue leur étant fermée, ils s’arrêtent, et bientôt ils s’ouvrent partout où ils peuvent le passage qui leur est refusé.<br /><p style="text-align: justify; text-indent: 15px;">'''Euthymène''' de ''Marseille'' en parle comme témoin : « J’ai navigué, dit-il, sur la mer ''Atlantique''. Le ''Nil'' roule des eaux plus abondantes, tant que durent les vents Étésiens ; car alors ils refoulent la mer sur le fleuve. Dès qu’ils se sont abattus et que la mer est devenue calme, le ''Nil'', qui peut redescendre vers celle-ci, diminue. Au reste, les eaux de cette mer sont douces et contiennent des animaux semblables à ceux du ''Nil''. » Dans cette hypothèse, qui donne les vents Étésiens pour cause des crues du ''Nil'', qu’on me dise pourquoi ces crues précèdent les vents, persistent quand les vents ne sont plus, enfin n’augmentent plus d’intensité et de violence, et ne diminuent pas selon la violence et l’impétuosité du vent même ; c’est pourtant ce qui devrait arriver, si les vents déterminaient la hausse des eaux. De plus, les vents Étésiens battent directement la côte ''égyptienne'' : pourquoi donc le ''Nil'' descend-il contre le souffle de ces vents, tandis qu’il devrait couler dans la même direction, s’il leur devait ses débordements ? Enfin, pourquoi, au lieu d’être diaphanes et azurés, ces flots, qu’on fait venir de la mer, sont-ils chargés de limon ? Ajoutez qu’une foule de témoignages réfutent '''Euthymène'''. On pouvait mentir, quand les plages étrangères étaient inconnues : c’était alors le temps des fables ; mais aujourd’hui mille vaisseaux marchands côtoient la mer extérieure ; personne ne dit que le ''Nil'' ait des flots d’azur ; personne ne donne à la mer une saveur douce, que la nature refuse à ses eaux : car le soleil en pompe sans cesse la partie la plus douce et la plus légère ; ensuite pourquoi le ''Nil'' ne croîtrait-il point pendant l’hiver ? la mer alors peut être battue par les vents, par des vents plus violents que les Étésiens, qui sont modérés. Enfin, si le mouvement venait de l’Atlantique, l’Égypte entière serait inondée tout d’un coup : or, l’inondation est graduelle.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PP9#v=onepage&q&f=true <u>Œuvres Complètes de Sénèque, Tome Quatrième</u>], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA371#v=onepage&q&f=true ''Questions Naturelles, De Sénèque à Lucilius - Livre Quatrième.''], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA385#v=onepage&q&f=true ''chap. II.''], traduction française de la collection Panckoucke, nouvelle édition très soigneusement revue par M. Charpentier et M. Félix Lemaistre, 1860</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''Chap. II.'''<br />''En quelle fai[[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki>ó</nowiki> {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e fait l’accroi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ement du Nil.''<br /><p style="text-align: justify; text-indent: 15px;">[...] Si vous en croyez '''Thales''' , les vents Ethe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iens re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tent au ''Nil'' en de{{Info|ſ|forme ancienne longue de la lettre s minuscule}}cendant dans la mer; & arre{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tent {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on cours, en pou{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ant la mer contre {{Info|ſ|forme ancienne longue de la lettre s minuscule}}es {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ept emboucheures. Si bien qu’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es {{Info|ſ|forme ancienne longue de la lettre s minuscule}}tant repou{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}é de la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}orte il retourne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oy-me{{Info|ſ|forme ancienne longue de la lettre s minuscule}}me , & ne croi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t pas comme l’on pen{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e , mais par ce qu’il trouue vn ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tacle qui l’empe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}che de pa{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}er outre , il e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t contraint de s’arre{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ter , & ne pouuant plus pour{{Info|ſ|forme ancienne longue de la lettre s minuscule}}uiure {{Info|ſ|forme ancienne longue de la lettre s minuscule}}a cour{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e , il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pand par où il peut {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e répandre. '''Euthimenes''' de ''Mar{{Info|ſ|forme ancienne longue de la lettre s minuscule}}eille'' en rend ce te{{Info|ſ|forme ancienne longue de la lettre s minuscule}}moignage. I’ay nauigé, dit il, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur la mer ''Atlantique'' , & c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t par elle que le ''Nil'' deuient plus grand, lors que les vents Ethe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iens {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oufflent ; car alors cette mer {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ort pour ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i dire d’elle-me{{Info|ſ|forme ancienne longue de la lettre s minuscule}}me par la force & par la violence de ces vents. Mais lors qu’ils ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oufflent plus la mer demeure tranquille, & le Nil ne trouue plus rien qui l’empe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}che de de{{Info|ſ|forme ancienne longue de la lettre s minuscule}}cendre , Au re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te l’eau de la mer e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t douce en ce temps-là , & l’on y void des be{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tes {{Info|ſ|forme ancienne longue de la lettre s minuscule}}emblables à celles du Nil. Mais {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i les Ethe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iens {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont enfler le Nil, pourquoy {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on débordement commence il auant qu’ils {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oufflent & pourquoy dure - il encore lors qu’ils ont ce{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}é de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ouffler. Dauantage ils ne s’enfle pas plus que de cou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tume , quand ces vents {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oufflent auecque plus de violence qu’ils ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont ordinairement. Enfim il ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e hau{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}e & ne s’abai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}e pas {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon que leur impetuo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ité e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t plus ou moins grande , ce qui arriveroit {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ans doute s’il s’enfloit par la force de ces véts. Mais comme les Ete{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iens battent directement les bords de l’Egypte, & que le Nil de{{Info|ſ|forme ancienne longue de la lettre s minuscule}}cend contre eux ; il faudroit s’ils e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}toient cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on accroi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ement , qu’il commença{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t par l’endroit d’où ils viennent. Outre cela il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ortiroit tout pur de la mer, & de la couleur de la mer, & ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit pas trouble & limonneux , comme il e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t. Et apres tout le te{{Info|ſ|forme ancienne longue de la lettre s minuscule}}moignage d’'''Euthimene''' , e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t condamné par le plus grand nombre. Il e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}toit permis de mentir quand on n’auoit point de connoi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ance des pays e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}trangers ; & alors on pouuoit facilement nous en enuoyer des fables. Mais aujourd’huy tous les riuages des mers les plus e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}loignées {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont remplis de vai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eaux de marchands, & pas vn ne nous apporte que le ''Nil'' {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oit de la couleur de la mer, ou que la mer ait vn autre gou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t. Quand nous aurions des rai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ons pour nous la per{{Info|ſ|forme ancienne longue de la lettre s minuscule}}uader , la nature nous empe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}cheroit de le croire par ce que le Soleil en attire ce qu’il y a de plus leger & de plus doux. Dauantage pourquoy ne croi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t-il pas en Hyuer , puis que la met en ce temps là peut e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tre agitée par des vents plus violents, que les Ethe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iens qui {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont tou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iours moderez. Que {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i le ''Nil'' venoit de la mer ''Atlantique'' , il couuriroit l’Egypte tout d’vn coup, & neantmoins il ne la couure que peu à peu.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=gEzVYlz3c3cC&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii%20volume%202&hl=fr&pg=PA1#v=onepage&q&f=true <u>Seneque Des Qvestions Natvrelles</u>], [https://books.google.fr/books?id=gEzVYlz3c3cC&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii%20volume%202&hl=fr&pg=PA3#v=onepage&q&f=true ''Livre Qvatriesme. De la Nege, de la Greſle, & de la Pluye.''], [https://books.google.fr/books?id=gEzVYlz3c3cC&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii%20volume%202&hl=fr&pg=PA37#v=onepage&q&f=true ''chap. II.''], traduction par [[w:Pierre_Du_Ryer|Pierre Du Ryer]], A Lyon, Chez Christofle Fovrmy, 1663</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div> </div> <div style="text-align: center; margin: 0 auto;">― ● ―</div> ==== Livre VI — Des tremblements de terre ==== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">En prologue, '''Sénèque''' énonce le plan du livre, des causes des tremblements de terre et des peurs qu’ils provoquent, en s’appuyant sur celui de ''Campanie'' qui a récemment causé d’importants dégâts à ''Pompéi'' et à ''Herculanum''. Des chapitres IV à XX, de nombreuses théories sismiques sont présentées, la plupart liées au nom d’un philosophe qui les prône. Le feu, l’eau et l’air sont cités comme causes, et plusieurs d’entre-elles les combinent. À partir du chapitre XXIV, '''Sénèque''' développe sa propre opinion : l’air pénétrant, qui remplit complètement les cavités souterraines sous une forte pression, en est la cause. En épilogue, il explique à '''Lucilius''' quel comportement adopté en de telles situations, à savoir être courageux en ne craignant pas la mort</div> ===== <div style="text-align: center;">Chapitre VI.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Réfutation d’une théorie de '''Thalès''' de la Terre flottant sur l’eau, et témoignage d’une de ses preuves portant sur les tremblements de terre.</div> :'''Texte latin''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''6.''' In aqua causam esse nec ab uno dictum est nec uno modo. '''Thales''' ''Milesius'' totam terram subiecto iudicat umore portari et innare, siue illud oceanum uocas, siue magnum mare, siue alterius naturae simplicem adhuc aquam et umidum elementum. Hac, inquit, unda sustinetur orbis uelut aliquod grande nauigium et graue his aquis quas premit. Superuacuum est reddere causas propter quas existimat grauissimam partem mundi non posse spiritu tam tenui fugacique gestari; non enim nunc de situ terrarum sed de motu agitur. Illud argumenti loco ponit aquas esse in causa quibus hic orbis agitetur, quod in omni maiore motu erumpunt fere noui fontes, sicut in nauigiis quoque euenit ut, si inclinata sunt et abierunt in latus, aquam sorbeant, quae in omni eorum onere quae uehit, si immodice depressa sunt, aut superfunditur aut certe dextra sinistraque solito magis surgit. Hanc opinionem falsam esse non est diu colligendum. Nam, si terra aqua sustineretur et ea aliquando concuteretur, semper moueretur, nec agitari illam miraremur sed manere; deinde tota concuteretur, non ex parte; numquam enim nauis dimidia iactatur. Nunc uero terrarum non uniuersarum sed ex parte motus est. Quomodo ergo fieri potest ut, quod totum uehitur, totum non agitetur, si eo quo uehitur agitatum est? — At quare aquae erumpunt? — Primum omnium saepe tremuit terra et nihil umoris noui fluxit. Deinde, si ex hac causa unda prorumperet, a lateribus terrae circumfunderetur, sicut in fluminibus ac mari uidemus incidere ut incrementum aquarum, quotiens nauigia desidunt, in lateribus maxime appareat. Ad ultimum non tam exigua fieret quam tu dicis eruptio nec uelut per rimam sentina subreperet, sed fieret ingens inundatio ut ex infinito liquore et ferente uniuersa.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-ii-1979/page/n1/mode/2up <u>L. Annaei Senecae, Natvrales Qvaestiones</u>], [https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-ii-1979/page/n135/mode/2up ''Liber Qvintvs - De terrae motv''], [https://archive.org/details/seneca.-cuestiones-naturales.-naturales-quaestiones.-vol.-ii-1979/page/n155/mode/2up ''chap. 6.''], texte établi par Carmen Codoñer Merino [[w:es:Carmen_Codoñer_Merino|(es)]], Consejo Superior de Investigaciones Científicas, Madrid, 1979</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''VI.''' In aqua causam esse, nec ab uno dictum est, nec uno modo. '''Thales''' ''Milesius'' totam terram subjecto judicat humore portari et innatare : sive illud Oceanum vocas, sive magnum mare, sive alterius naturæ simplicem adhuc aquam et humidum elementum. Hac, inquit, unda sustinetur orbis, velut aliquod grande navigium et grave his aquis, quas premit. Supervacuum est reddere causas, propter quas existimat, gravissimam partem mundi non posse spiritu tam tenui fugacique gestari ; non enim nunc de situ terrarum, sed de motu agitur. Illud argumenti loco ponit, aquas esse in causa, quibus hic orbis agitatur, quod in omui majore motu erumpunt fere novi fontes : sicut in navigiis quoque evenit, ut, si inclinata sunt et abiere in latus, aquam sorbeant, quæ in omni onere eorum quæ vehit, si immodice depressa sunt, aut superfunditur, aut certe dextra sinistraque solito magis surgit. Hanc opinionem falsam esse, non est diu colligendum ; nam, si terram aqua sustineret, et ea aliquando concuteretur : semper moveretur, nec agitari illam miraremur, sed manere. Tum tota concuteretur, non ex parte : nunquam enim navis dimidia jactatur. Nunc vero non terrarum universarum, sed ex parte motus est. Quomodo ergo fieri potest, ut quod totum vehitur, totum non agitetur, si eo quo vehitur, agitatum est ? At quare aquæ erumpunt ? Primum omnium sæpe tremuit terra, et nihil humoris novi fluxit. Deinde si ex hac causa unda prorumperet, a lateribus terræ circumfunderetur : sicut in fluminibus ac mari videmus accidere, ut incrementum aquarum, quoties navigia desidunt, in lateribus maxime appareat. Ad ultimum non tam exigua fieret quam dicit eruptio, nec velut per rimam sentina subreperet, sed fieret ingens inundatio, ut ex infinito liquore, et ferente universa.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PP9#v=onepage&q&f=true <u>Œuvres Complètes de Sénèque, Tome Quatrième</u>], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA420#v=onepage&q&f=true ''Questions Naturelles, De Sénèque à Lucilius - Livre Sixième.''], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA429#v=onepage&q&f=true ''chap. VI.''], traduction française de la collection Panckoucke, nouvelle édition très soigneusement revue par M. Charpentier et M. Félix Lemaistre, 1860</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''VI.''' Que l’eau soit cause des tremblements de terre, c’est ce qu’affirment divers auteurs et avec divers arguments. '''Thalès''' de ''Milet'' estime que le globe entier a pour support une masse d’eaux sur laquelle il flotte, et qu’on peut appeler Océan ou grande mer, ou élément jusqu’ici de nature simple, l’élément humide. Cette eau, dit-il, soutient la terre ; et l’immense navire pèse sur le liquide qu’il comprime. Il est superflu d’exposer les motifs qui font croire à '''Thalès''' que la partie de l’univers la plus pesante ne saurait porter sur une substance aussi ténue, aussi fugace que l’air : il ne s’agit pas maintenant de l’assiette du globe, mais de ses secousses. '''Thalès''' apporte en preuve de son système, que presque toujours les grandes secousses font jaillir des sources nouvelles, comme il arrive dans les navires qui, lorsqu’ils penchent et s’inclinent sur le flanc, sont envahis par l’eau ; toujours, s’il y a surcharge, l’eau vient couvrir le bâtiment, ou du moins s’élève à droite et à gauche plus que de coutume. La fausseté de cette opinion se démontre sans longs raisonnements. Si la terre était soutenue par l’eau, elle tremblerait quelquefois dans toute sa masse et toujours serait en mouvement ; ce ne serait pas son agitation qui étonnerait, mais son repos. Elle s’ébranlerait tout entière, non partiellement ; car ce n’est jamais la moitié seulement d’un navire qui est battue des flots. Or, les tremblements de notre terre ne sont pas universels, mais partiels. Comment serait-il possible qu’un corps porté tout entier par l’eau ne fût pas agité tout entier, quand ce fluide est agité ? « Mais d’où viennent les eaux qu’on a vues jaillir ? » D’abord, souvent la terre tremble, sans qu’il en sorte de nouvelles eaux. Ensuite, si telle était la cause de ces éruptions, elles n’auraient lieu qu’autour des flancs du globe ; ce que nous voyons arriver sur les fleuves et en mer : l’exhaussement de l’onde, à mesure que s’enfonce le navire, se remarque surtout aux flancs du bâtiment. Enfin l’éruption dont on parle ne serait pas si minime, et comme une voie d’eau qui s’infiltre par une fente légère ; l’inondation serait immense en raison de l’abîme infini sur lequel flotterait le monde.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[[s:Questions_naturelles_(trad._Baillard)|<u>Sénèque le Jeune</u>]], [[s:Questions_naturelles_(trad._Baillard)/Livre_6|''Livre VI.'']] ''chap. 6.'', traduction par [[s:Auteur:Joseph_Baillard|Joseph Baillard]], Hachette, 1914<br />(également disponible [https://remacle.org/bloodwolf/philosophes/seneque/questionsnaturelles6.htm ici])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''VI.''' Plusieurs philosophes ont prétendu que l’eau est la cause de ces secousses : ce que chacun explique à sa manière. '''Thalès''' de ''Milet'' prétend que le globe entier a pour support une masse d’eau sur laquelle il flotte ; peu importe qu’on donne à cet amas le nom d’Océan, de grande mer ou d’eau élémentaire, eau simple. Cette eau, dit-il, soutient la terre comme un grand vaisseau pesant sur le liquide qu’il comprime. Il est inutile d’exposer les raisons qui font croire à '''Thalès''' que le corps le plus pesant de la nature ne peut être soutenu par un fluide aussi délié et aussi rare que l’air : car il s’agit ici des tremblements de terre et non de l’assiette du globe. La grande raison de '''Thales''' pour faire de l’eau la cause des secousses de la terre, c’est que, dans tout tremblement considérable, jaillissent des eaux nouvelles ainsi les vaisseaux se remplissent d’eau quand ils penchent d’un côté ; chargés à l’excès, ou ils sont submergés, ou ils s’enfoncent à droite et à gauche plus profondément dans la mer. Il ne faut pas longtemps discuter pour voir la fausseté de cette opinion. Si la terre était soutenue par les eaux, elle serait quelquefois fortement ébranlée, mais de plus elle serait toujours flottante, et il faudrait s’étonner non de son agitation , mais de son repos ; enfin, au lieu d’être ébranlée en partie, elle le serait tout entière : car jamais la moitié d’un vaisseau n’est battue des flots. Or, on sait que les secousses de la terre sont partielles et non universelles : comment se ferait-il donc que ce qui est entièrement porté par les eaux ne fût pas entièrement agité, tandis que les eaux mêmes le sont en totalité ? Mais, dit-on, qui fait jaillir les eaux ? D'abord, souvent la terre tremble sans qu’il se produise des eaux nouvelles ; ensuite, si telle était la cause de ces éruptions, les eaux se répandraient latéralement autour de la terre. Ainsi, par exemple, quand un vaisseau s’enfonce ou dans la mer ou dans les fleuves, c’est vers les bords surtout que l’accroissement devient sensible. Enfin les sources qui jaillissent ne seraient pas si peu considérables ; on ne pourrait pas les comparer à une voie d’eau qui pénètre par les fentes du fond de cale : ce serait une inondation immense comme l’abîme infini sur lequel flotterait le monde.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PP9#v=onepage&q&f=true <u>Œuvres Complètes de Sénèque, Tome Quatrième</u>], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA420#v=onepage&q&f=true ''Questions Naturelles, De Sénèque à Lucilius - Livre Sixième.''], [https://books.google.fr/books?id=xZtfAAAAcAAJ&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles&hl=fr&pg=PA429#v=onepage&q&f=true ''chap. VI.''], traduction française de la collection Panckoucke, nouvelle édition très soigneusement revue par M. Charpentier et M. Félix Lemaistre, 1860</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">'''Chap. VI.'''<br />''Si l’eau e[[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki>t</nowiki> la cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e des tréblemés de terre.''<br /><p style="text-align: justify; text-indent: 15px;">Ce n'e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t pas vn homme {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eul qui a dit , que l’eau e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}toit cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e du tremblement de la terre ; & l’on ne l’a pas dit d’vne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eule façó. '''Thales''' ''Mile{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ien'' a crû que toute la terre e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}toit portée {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur l’eau , & qu’elle y nageoit, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oit que vous appelliez cette eau Ocean, ou que vous l’appelliez grade mer, ou vne eau d’vne autre nature , eau {{Info|ſ|forme ancienne longue de la lettre s minuscule}}imple , element humide. C’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur cette eau, dit-il, que le monde e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tenu, comme quelque vai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eau d’vne grandeur deme{{Info|ſ|forme ancienne longue de la lettre s minuscule}}urée , qui charge les eaux qui le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tiennent. Il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit inutile de rapporter les rai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ons qui luy {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont croire que la plus pe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ante partie du móde ne peut e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tre {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tenuë par l’air qui e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ubtil, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i fluide & {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i delié ; & d’ailleurs, il ne s’agit pas icy de l’a{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}iete de la terre , mais du tremblement de la terre. Ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i pour preuue que les eaux {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e que la terre tremble , il dit qu’il ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e fait pre{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que point de grands tremblemens de terre, qu’on n’en voye {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ortir en{{Info|ſ|forme ancienne longue de la lettre s minuscule}}uitte de nouuelles {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ources; que la terre re{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}emble en cela aux vai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eaux qui ne peuuent pancher d’vn co{{Info|ſ|forme ancienne longue de la lettre s minuscule}}té, qu’ils ne pui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ent de l’eau, qui {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pand {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur toutes les cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es qu’ils portent , {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i elles {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont trop enfoncées; ou qui s’éleue de part & d’autre à la gauche , & à la droite. Il n’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t pas besoin d’vn long di{{Info|ſ|forme ancienne longue de la lettre s minuscule}}cours pour montrer la fau{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eté de cette opinion ; car {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i l’eau {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tenoit la terre, quelquesfois elle trembleroit toute entiere, & {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit tou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iours en mouuement; & nous ne nous e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tonnerions point de la voir remuer, mais de la voir ferme & inébranlable. Elle trembleroit toute entiere , & non pas en partie , car vn vai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eau n’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t iamais agité par vne moitié {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement ; & apres tout nous voyons que le tremblement ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e fait pas de toute la terre , mais {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement d’vne partie. Comment donc {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e peut-il faire que ce qui e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t porté tout entier ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oit pas entierement agité , {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i la cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e me{{Info|ſ|forme ancienne longue de la lettre s minuscule}}me qui porte e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}meuë & agitée ? Mais pourquoy {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ort-il de l’eau apres vn tremblement de terre ? Premierement la terre a {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ouuent tremblé {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ans qu’on en ayt veu {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ortir de nouuelles {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ources. D’ailleurs {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i l’eau {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ortoit par cette rai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}on elle {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pandroit par les co{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tez de la terre , comme nous voyons dans les fleuues & dans la mer , où lors que le vai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eau s’enfonce on remarque que l’eau s'éleue , principalement par les co{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tez. Enfin ces eaux ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ortiroient pas en {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i petite quantité, ny par vne fi petite ouuerture , mais il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit vne grande inondation, comme procedant de cette abondance d’eaux qui {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tiennent tout l’vniuers.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=gEzVYlz3c3cC&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii%20volume%202&hl=fr&pg=PA1#v=onepage&q&f=true <u>Seneque Des Qvestions Natvrelles</u>], [https://books.google.fr/books?id=gEzVYlz3c3cC&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii%20volume%202&hl=fr&pg=PA141#v=onepage&q&f=true ''Livre Sixiesme. Des tremblemens de terre.''], [https://books.google.fr/books?id=gEzVYlz3c3cC&newbks=1&newbks_redir=0&dq=seneque%20questions%20naturelles%20iii%20volume%202&hl=fr&pg=PA164#v=onepage&q&f=true ''chap. VI.''], traduction par [[w:Pierre_Du_Ryer|Pierre Du Ryer]], A Lyon, Chez Christofle Fovrmy, 1663</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Pline_l%27Ancien|'''Pline l’Ancien''']] [[#Pline|<span id="Pline_back"><sup>'''I'''</sup></span>]] == <p style="text-align: right;">([[w:23|23]]/[[w:24|24]], à [[w:Côme|''Novum Comum'']] ou [[w:Vérone|Vérone]] — [[w:79|79]], à [[w:Stabies|Stabies]], [[w:Mort_de_Pline_l%27Ancien|mort]] par asphyxie près de [[w:Pompéi|Pompéi]], lors de l’éruption du [[w:Vésuve|Vésuve]], en voulant observer le phénomène au plus près et en désirant porter secours aux victimes, alors en poste à [[w:Misène|''Misène'']] en tant que Préfet commandant la flotte militaire ''romaine'') <sup>[[w:Ier_siècle|⏳]]</sup> [[s:Auteur:Pline_l’Ancien|<sup>📚</sup>]] [https://books.google.fr/books?id=tRsuD3WJT-UC&newbks=1&newbks_redir=0&lpg=PA3&dq=bibliogroup%3A%22Dictionnaire%20des%20philosophes%20antiques%22&hl=fr&pg=PA876#v=onepage&q&f=true {{Info|<sup>🔍</sup>|Dictionnaire des Philosophes Antiques, publié sous la direction de Richard Goulet, Volume Va, §204 - Plinius Secundus (Caius —)}}] <div style="text-align: justify; margin: 0 1em; text-indent: 15px">Haut fonctionnaire militaire et civique, issu de l’[[w:Chevalier_romain|''orde équestre'']], et écrivain prolifique dans de très nombreux domaines.</div> {{Boîte déroulante début|titre=NdA Pline l’Ancien|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Pline_back|<span id="Pline"><sup>I</sup></span>]] [[w:Nom_romain|Tria Nomina]] en latin {{Info|Caius|praenomen, nom individuel du citoyen romain}} {{Info|Plinius|nomen, nom de famille}} {{Info|Secundus|cognomen, surnom héréditaire, servant à distinguer les diverses branches d’une même gens}}'''<br/><br/></div> {{Boîte déroulante fin}} === [[w:Histoire_naturelle_(Pline_l'Ancien)|Histoire naturelle]] === <p style="text-align: right;">[[s:Histoire_naturelle_(Pline)|📚]] <div style="text-align: justify; margin: 0 1em; text-indent: 15px">Ouvrage de 37 livres dédié à l’empereur [[w:Titus_(empereur_romain)|'''Titus''']] [[#Titus|<span id="Titus_back"><sup>'''I'''</sup></span>]], dont il a été le ''{{Lang|la|contubernium}}'' pendant son service en tant que commandant des armées du ''Rhin'' en ''Germanie'' en [[w:47|47]]. '''Pline''' définit lui-même son enquête [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Histoire/Enquête_I|<sup>🔄</sup>]] sur la nature comme une reproduction de la vie — ''{{Lang|la|rerum natura, hoc est uita narratur}}'' (Livre I, Préface, 10), qu’il inscrit dans la tradition encyclopédique [[#encyclopédie_back|<sup>⤴️</sup>]] grecque mais s’en différencie par son exhaustivité : ''{{Lang|la|Jam omnia attingenda, quæ Græci}}'' ''{{Lang|grc|τάς έγχυχλοπαιδείας}}'' ''{{Lang|la|vocant : et tamen ignota aut incerta ingeniis facta; alia vero ita multis prodita, ut in fastidium sint adducta}}'' (Préface, 11). Il a, dans ce but, compilé « vingt mille faits dignes d’intérêt, tirés de la lecture d’environ deux mille volumes, [...] provenant de cent auteurs de choix » — ''{{Lang|la|Viginti millia rerum dignarum cura ex lectione voluminum circiter duum millium, [...] ex exquisitis auctoribus centum}}'' (Préface, 13).</div> {{Boîte déroulante début|titre=NdA Titus|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Titus_back|<span id="Titus"><sup>I</sup></span>]] Du nom propre latin Titus [[wikt:en:Titus#Latin|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;">Commandant militaire, notamment pendant la [[w:Premi%C3%A8re_guerre_jud%C3%A9o-romaine|''première guerre judéo-romaine'']], au cours de laquelle il prend ''Jérusalem'' que ses troupes mettent à sac et fait détruire le [[w:Second_temple_de_Jérusalem#Destruction|''Second Temple'']], et empereur ''romain'', de la dynastie des [[w:Flaviens|''Flaviens'']], de [[w:79|79]] à [[w:81|81]].<br /><p style="text-align: right; margin: 0 2em;">(30 décembre [[w:39|39]] , ''Rome'' — 13 septembre [[w:81|81]], mort par fièvre selon [[w:Suétone|Suétone]] [http://remacle.org/bloodwolf/historiens/suetone/titus.htm <sup>VdDC, Titus</sup>] ou par empoisonnement avec du venin de [[w:Aplysia|''lièvre marin'']] par son propre frère [[w:Domitien|Domitien]] selon [[w:Philostrate_d%27Ath%C3%A8nes|Philostrate]] [https://remacle.org/bloodwolf/roman/philiostrate/apollonius6.htm <sup>AdT, l. VI, chap. 32</sup>])<sup>[[w:Ier_siècle|⏳]]</sup>'''<br/><br/></div> {{Boîte déroulante fin}} ==== Livre II ==== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Enquête sur l’astronomie et la physique du monde, basée sur les quatre éléments : air, terre, eau et feu.</div> ===== <div style="text-align: center;">Chapitre IX.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage de la première prédiction grecque d’une éclipse solaire (ou lunaire selon les traductions) par '''Thalès'''.</div> :'''Texte latin''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''IX.''' Et rationem quidem defectus utriusque primus ''Romani'' generis in vulgus extulit '''Sulpicius Gallus''', qui consul cum '''Marcello''' fuit, sed tum tribunus militum, sollicitudine exercitu liberato, pridie quam '''Perseus''' rex superatus a '''Paulo''' est, in concionem ab imperatore productus ad prædicendam eclipsim, mox et composito volumine. Apud Græcos autem investigavit primus omnium '''Thales''' ''Milesius'', Olympiadis XLVIII anno quarto, prædicto solis defectu, qui '''Alyatte''' rege factus est, Urbis conditæ; anno CLXX. Post eos utriusque sideris cursum in sexcentos annos præcinuit '''Hipparchus''', menses gentium, diesque et horas, ac situs locorum, et visus populorum complexus, ævo teste, haud alio modo, quam consiliorum naturæ particeps. Viri ingentes supraque mortalium naturam, tantorum numinum lege deprehensa, et misera hominum mente absoluta, in defectibus scelera aut mortem aliquam siderum pavente (quo in metu fuisse '''Stesichori''' et '''Pindari''' vatum sublimia ora palam est deliquio Solis), et in Luna veneficia arguente mortalitate, et ob id crepitu dissono auxiliante. Quo pavore, ignarus causæ, '''Nicias''' ''Atheniensium'' imperator, veritus classem portu educere, opes eorum afflixit. Macti ingenio este, cæli interpretes, rerumque naturæ capaces, argumenti repertores, quo deos hominesque vinxistis. Quis enim hæc cernens, et statos siderum (quoniam ita placuit appellare) labores, non suæ necessitati mortalis genitus ignoscat ? Nunc confessa de iisdem breviter atque capitulatim attingam, ratione admodum necessariis locis strictimque reddita : nam neque instituti operis talis argumentatio est : neque omnium rerum afferri posse causas, minus mirum est, quam consfare in aliquibus.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/b24875958_0001/page/n7/mode/2up <u>Histoire Naturelle de Pline.</u>], [https://archive.org/details/b24875958_0001/page/98/mode/2up ''Livre II.''], [https://archive.org/details/b24875958_0001/page/106/mode/2up ''chap. IX.''], texte corrigé par [[w:Émile_Littré|M. É. Littré]], à partir de celui de [[w:Jean_Hardouin|Hardouin]], Librairie de Firmin-Didot et C<sup>ie</sup>, Paris, 1883<br />(également disponible une édition 1848 [[s:Page:Pline_l'ancien_-_Histoire_naturelle,_Littré,_T1_-_1848.djvu/130|ici]] et 1829 [https://gallica.bnf.fr/ark:/12148/bpt6k5773334c/f45.item là])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''IX.''' Le premier ''Romain'' qui exposa publiquement la théorie des éclipses du soleil et de la lune est [[w:Caius_Sulpicius_Gallus|'''Sulpicius Gallus''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Caius_Sulpicius_Gallus_back|<sup>🔄</sup>]], qui fut consul avec [[w:Marcus_Claudius_Marcellus_(consul_en_-166)|'''Marcellus''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Marcellus-166_back|<sup>🔄</sup>]], mais qui alors était tribun militaire. La veille du jour où [[w:Persée_(roi)|'''Persée''']] [[#Persée_(roi)|<span id="Persée_(roi)_back"><sup>'''I'''</sup></span>]] fut défait par [[w:Lucius_Æmilius_Paullus_Macedonicus|'''Paul-Emile''']] [[#Lucius_Æmilius_Paullus_Macedonicus|<span id="Lucius_Æmilius_Paullus_Macedonicus_back"><sup>'''II'''</sup></span>]] il parut par ordre du général, afin de prévenir les alarmes de l’armée, devant les troupes assemblées pour annoncer l’éclipse qui allait survenir; peu de temps après, il composa un livre sur ce sujet. Le premier qui s’en occupa chez les ''Grecs'' fut '''Thalès''' de ''Milet'', dans la quatrième année de la quarante-huitième olympiade (an 585 av. J. C. [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#éclipse_back|<sup>🔄</sup>]]), l’an 170 de la fondation de ''Rome'', et prédit une éclipse de lune qui arriva sous le roi [[w:Alyatte_II|'''Alyatte''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Alyatte_back|<sup>🔄</sup>]]. Après eux, [[w:Hipparque_(astronome)|'''Hipparque''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Hipparque_back|<sup>🔄</sup>]] dressa pour six cents ans la table du cours du soleil et de la lune, déterminant les mois des divers calendriers, les jours, les heures, les localités et les aspects, suivant les contrées. Le cours des ans ne lui a donné aucun démenti, et il semble avoir été admis aux conseils de la nature. Génies puissants et élevés au dessus de l’humanité, ils ont découvert la loi qui régit ces grandes divinités, et ils ont délivré de ses craintes l’esprit misérable des hommes, qui dans les éclipses, tantôt croyaient voir une influence malfaisante ou une espèce de mort des astres, crainte qui, comme on sait, a, pour l’éclipse du soleil, troublé [[w:Stésichore|'''Stésichore''']] [[#Stésichore|<span id="Stésichore_back"><sup>'''III'''</sup></span>]] et [[w:Pindare|'''Pindare''']] [[#Pindare|<span id="Pindare_back"><sup>'''IV'''</sup></span>]], poètes sublimes, et tantôt attribuaient l’obscurcissement de la lune à des maléfices, et lui venaient en aide par un bruit dissonnant. Redoutant ce phénomène, dont il ignorait la cause, [[w:Nicias|'''Nicias''']] [[#Nicias|<span id="Nicias_back"><sup>'''V'''</sup></span>]], général des ''Athéniens'', n’osa pas faire sortir la flotte du port de [[w:Syracuse#Antiquité|''Syracuse'']], et ruina la puissance de sa patrie. Redoublez de génie, interprètes du ciel, vous dont l’intelligence, embrassant la nature, a inventé des théories qui ont créé un lien entre les dieux et les hommes [[#Vicistis_JH|<span id="Vicistis_JH_back"><sup>'''1'''</sup></span>]] ! A la vue de ce spectacle, à la vue des labeurs (puisque c’est le nom qu’on a voulu donner aux éclipses), des labeurs réguliers auxquels les astres sont soumis, quel mortel ne pardonnerait à la nécessité sous laquelle il est né ? Maintenant je vais parler, d’une manière brève et sommaire, des points sur lesquels on est d’accord en cette matière. Je ne donnerai que de courtes explications, et là où il sera tout à fait nécessaire; car les explications n’entrent pas dans le plan de cet ouvrage, et il n’y a pas moins de mérite à énumérer les causes de toutes choses qu’à s’appesantir sur quelques-unes.</div> <table cellspacing=15 align=center style="margin: 0 4em; font-size:85%;"> <tr> <td style="text-align: justify; margin: 0 4em;">'''[[#Vicistis_JH_back|<span id="Vicistis_JH"><sup>1</sup></span>]] Vicistis Vulg. — Vinxistis cod. Dalech. — Vinxistis me parait meilleur. Comp. ce que dit Pline plus loin, ch. 24, sur l’affinité de l’esprit humain avec les astres.'''</td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/b24875958_0001/page/n7/mode/2up <u>Histoire Naturelle de Pline.</u>], [https://archive.org/details/b24875958_0001/page/98/mode/2up ''Livre II.''], [https://archive.org/details/b24875958_0001/page/106/mode/2up ''chap. IX.''], texte corrigé par [[w:Émile_Littré|M. É. Littré]], à partir de celui de [[w:Jean_Hardouin|Hardouin]], Librairie de Firmin-Didot et C<sup>ie</sup>, Paris, 1883<br />(édition 1848 également disponible [[s:Page:Pline_l'ancien_-_Histoire_naturelle,_Littré,_T1_-_1848.djvu/130|ici]])</div> {{Boîte déroulante début|titre=NdA de trad. Jean Hardouin 1883|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Persée_(roi)_back|<span id="Persée_(roi)"><sup>I</sup></span>]] Du nom propre grec ancien Περσεύς / Perseús[[wikt:en:Περσεύς#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">Dernier roi de [[w:Royaume_de_Mac%C3%A9doine|''Macédoine'']] de la dynastie des [[w:Antigonides|''Antigonides'']], vaincu en [[w:-168|-168]] à la [[w:bataille de Pydna|bataille de ''Pydna'']] à l’issue de la [[w:troisième guerre macédonienne|''troisième guerre macédonienne'']], causant la disparition du ''Royaume de Macédoine''.<br /><p style="text-align: right; margin: 0 2em;">([[w:Années_212_av._J.-C.|-212]]<sup>[[w:IIIe_siècle_av._J.-C.|⏳]]</sup>, [[w:Pella_(cité_antique)|''Pella'']], au nord de l’actuelle ''Grèce'' — [[w:Années_166_av._J.-C.|-166]]<sup>[[w:IIe_siècle_av._J.-C.|⏳]]</sup>, [[w:Alba_Fucens|''Alba Fucens'']], au centre de l’actuelle ''Italie'') <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Lucius_Æmilius_Paullus_Macedonicus_back|<span id="Lucius_Æmilius_Paullus_Macedonicus"><sup>II</sup></span>]] [[w:Nom_romain|Tria Nomina]] en latin {{Info|Lucius|praenomen, nom individuel du citoyen romain}} {{Info|Æmilius|nomen, nom de famille}} {{Info|Paullus|cognomen, surnom héréditaire, servant à distinguer les diverses branches d’une même gens}}, surnommé [[wikt:Macedonicus#Latin|Macedonicus]] par le [[w:Sénat_romain|''Sénat'']] à la suite de sa victoire;<br /><p style="margin: 0 2em; text-indent: 15px">Homme politique ''romain'', consul à 2 reprises en [[w:Années_182_av._J.-C.|-182]] et [[w:Années_169_av._J.-C.|-169]]. Il remporta la victoire contre le ''royaume de Macédoine'' à ''Pydna'' en battant le roi Persée [[#Persée_(roi)|<sup>I</sup>]], ce qui mit fin à la dynastie des ''Antigonides''.<br /><p style="text-align: right; margin: 0 2em;">([[w:Circa|{{Info|''ca.''|Circa, locution latine que l’on emploie pour indiquer l’approximation d’une date}}]] [[w:Années_230_av._J.-C.|-230]]<sup>[[w:IIIe_siècle_av._J.-C.|⏳]]</sup>, ''Rome'' — ''ca.'' [[w:Années_160_av._J.-C.|-160]]<sup>[[w:IIe_siècle_av._J.-C.|⏳]]</sup>, ''Rome'') <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Stésichore_back|<span id="Stésichore"><sup>III</sup></span>]] Du nom propre grec ancien Στησίχορος /Stēsíkhoros [[wikt:en:Στησίχορος#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;">➥ du verbe ἵστημι /hístēmi, « 1. (voix transitive, active des temps présent, imparfait, futur et 1er aoriste) : • Faire se tenir debout, se tenir debout; • Arrêter, rester, vérifier; • Mettre en place : - Faire monter, élever, réveiller, remuer; - Nommer, désigner; - Établir, instituer; • Mettre dans la balance, peser. 2. (voix intransitive, moyenne et passive, voix active du 2e aoriste, parfait et plus-que-parfait) : • Se tenir debout; • Se tenir immobile : (au sens figuré) Rester ferme; • Être dressé ou debout, se lever, s’élever : - (en général) Se lever, commencer; - (en marquant le pas) Être; - Être désigné. »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ +‎ du nom commun χορός / khorós, « 1. Danse en rond. 2. Danse accompagnée de chant, danse chorale. 3. Chœur, chorale, groupe de chanteurs et de danseurs. 4. Groupe, troupe. 5. Rangée. 6. Lieu de danse. 7. (théâtre) Chœur »;<br /><p style="margin: 0 2em; text-indent: 15px">Poète lyrique grec, considéré comme l’un des [[w:Neuf_lyriques_grecs|''neuf poètes lyriques'']] de la Grèce antique.<br /><p style="text-align: right; margin: 0 2em;">([[w:Circa|{{Info|''ca.''|Circa, locution latine que l’on emploie pour indiquer l’approximation d’une date}}]] [[w:Années_630_av._J.-C.|-630]]<sup>[[w:VIIe_siècle_av._J.-C.|⏳]]</sup>, [[w:Metauria|''Metauria'']], colonie de la [[w:Grande-Grèce|''Grande-Grèce'']], au sud de la région de [[w:Calabre|''Calabre'']], au sud de l’Italie — ''ca.'' [[w:Années_555_av._J.-C.|-555]]<sup>[[w:VIe_siècle_av._J.-C.|⏳]]</sup>, [[w:Catane|''Catane'']], colonie de la ''Grande-Grèce'', à l’est de la [[w:Sicile|''Sicile'']]) <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Pindare_back|<span id="Pindare"><sup>IV</sup></span>]] Du nom propre grec ancien Πίνδᾰρος /Píndaros [[wikt:en:Πίνδαρος#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">Poète lyrique grec, considéré comme l’un des [[w:Neuf_lyriques_grecs|''neuf poètes lyriques'']] de la Grèce antique.<br /><p style="text-align: right; margin: 0 2em;">([[w:Années_518_av._J.-C.|-518]]<sup>[[w:VIe_siècle_av._J.-C.|⏳]]</sup>, [[w:Cynocéphales|''Cynocéphales'']], cité grecque située près de [[w:Thèbes_(Grèce)|''Thèbes'']], en [[w:Béotie|''Béotie'']] — [[w:Années_438_av._J.-C.|-438]]<sup>[[w:Ve_siècle_av._J.-C.|⏳]]</sup>, [[w:Árgos|''Árgos'']], cité grecque de la région de l’[[w:Argolide|''Argolide'']], à l’est de la [[w:Péloponnèse|''péninsule du Péloponnèse'']]) <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Nicias_back|<span id="Nicias"><sup>V</sup></span>]] Du nom propre grec ancien Νῑκίᾱς /Nīkíās [[wikt:en:Νικίας#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;">➥ du nom commun νίκη / níkē [[wikt:en:νίκη#Ancient_Greek|(en)]], « 1. Le fait de gagner : la victoire, le succès [avec le génitif "sur, dans quelque chose"] : • Les choses gagnées dans la victoire, les fruits de la victoire; • La supériorité, l’avantage. »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ + du suffixe nominal masculin -ίας / -ías [[wikt:en:-ίας#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">Homme politique et général ''athénien'' durant la [[w:Guerre_du_Péloponnèse|''guerre du Péloponnèse'']], qui oppose la [[w:Ligue_de_Délos|''ligue de Délos'']], menée par ''Athènes'', et la [[w:Ligue_du_Péloponnèse|''ligue du Péloponnèse'']], sous l’[[w:Hégémonie|hégémonie]] de ''Sparte'' de [[w:Années_431_av._J.-C.|-431]] à [[w:Années_404_av._J.-C.|-404]]. Sa supersition liée à une éclipse lunaire, s’étant produite lors de l’[[w:Expédition_de_Sicile|''expédition de Sicile'']], est également relatée par [[w:Thucydide|Thucydide]] [http://remacle.org/bloodwolf/historiens/thucydide/livre7.htm#L <sup>{{Info|HdlgdP|Histoire de la guerre du Péloponnèse}} l.VII, §.L</sup>] et [[w:Plutarque|Plutarque]] [[#Plutarque_back|<sup>⤵️</sup>]] [http://remacle.org/bloodwolf/historiens/Plutarque/supestition.htm#23 <sup>{{Info|DlS|De la Superstition}} l.I</sup>].<br /><p style="text-align: right; margin: 0 2em;">([[w:Circa|{{Info|''ca.''|Circa, locution latine que l’on emploie pour indiquer l’approximation d’une date}}]] [[w:Années_470_av._J.-C.|-470]], ''Athènes'' — ''ca.'' [[w:Années_413_av._J.-C.|-413]], ''Syracuse'')<sup>[[w:Ve_siècle_av._J.-C.|⏳]]</sup>'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: center; margin: 0 2em;">Des découvertes astronomiques : part de chaque observateur dans la science.<br /><p style="text-align: justify; text-indent: 15px;">'''IX.''' '''Sulpicius Gallus''' [[#Sulpicius_Gallus_AdG|<span id="Sulpicius_Gallus_AdG_back"><sup>'''1'''</sup></span>]] fut le premier ''Romain'' qui expliqua au vulgaire la raison des éclipses de soleil et de lune. Il fut consul avec '''Marcus Marcellus''' ; mais il n’était que tribun militaire lorsque la veille de la victoire que '''Paul Emile''' remporta sur '''Persée''' [[#Pridie_quam_Perses_rex_AdG|<span id="Pridie_quam_Perses_rex_AdG_back"><sup>'''2'''</sup></span>]], son général le fit paraître devant l’armée assemblée, pour lui annoncer l’éclipse qui allait arriver, et la délivrer de l’alarme qu’elle aurait pu en concevoir. Il composa bientôt après un volume sur ce sujet. Parmi les ''Grecs'', '''Thalès''' de ''Milet'' [[#Primus_omnium_Thales_AdG|<span id="Primus_omnium_Thales_AdG_back"><sup>'''3'''</sup></span>]] dirigea le premier ses recherches sur ce phénomène, et la quatrième année de la 48e olympiade, qui répond à l’an 170 [[#Anno_CLXX_AdG|<span id="Anno_CLXX_AdG_back"><sup>'''4'''</sup></span>]] de ''Rome'', il prédit l’éclipse de soleil qui eut lieu sous le règne d’'''Alyatte''' [[#Alyatte_rege_AdG|<span id="Alyatte_rege_AdG_back"><sup>'''5'''</sup></span>]]. Après eux, '''Hipparque''' dressa des tables du cours de ces deux astres pour six cents ans [[#In_sexcentos_annos_AdG|<span id="In_sexcentos_annos_AdG_back"><sup>'''6'''</sup></span>]] : mois, heures, jours, situations respectives des lieux, aspects du ciel selon les diverses nations [[#Menses_gentium_etc_AdG|<span id="Menses_gentium_etc_AdG_back"><sup>'''7'''</sup></span>]], tout y est compris, tout a été vérifié par le temps [[#Aevo_teste_AdG|<span id="Aevo_teste_AdG_back"><sup>'''8'''</sup></span>]]; on croirait l’astronome admis au conseil de la nature. Génies vastes et plus qu’humains, d’avoir ainsi surpris la loi de ces deux grandes divinités [[#Numinum_AdG|<span id="Numinum_AdG_back"><sup>'''9'''</sup></span>]], et affranchi d’effroi la malheureuse espèce humaine, qui tremblait en voyant dans chaque éclipse l’annonce de quelque grand crime, ou craignait la mort des astres [[#In_defectibus_scelera_etc_AdG|<span id="In_defectibus_scelera_etc_AdG_back"><sup>'''10'''</sup></span>]] (effroi dont '''Stésichore''' et '''Pindare''' [[#Pindari_AdG|<span id="Pindari_AdG_back"><sup>'''11'''</sup></span>]], ces poètes sublimes, ne furent point exempts dans les éclipses de soleil), ou qui attribuait à des enchantemens celles de la lune, et venait à son secours en faisant un bruit discordant [[#Crepitu_dissono_AdG|<span id="Crepitu_dissono_AdG_back"><sup>'''12'''</sup></span>]]. C’est pour en avoir ignoré la cause, que, frappé de cette même terreur, '''Nicias''' [[#Nicias_AdG|<span id="Nicias_AdG_back"><sup>'''13'''</sup></span>]], général des ''Athéniens'', n’osa pas faire sortir sa flotte du port, et causa la ruine de leur puissance. Gloire à vous, interprètes du ciel, génies aussi étendus que la nature, inventeurs d’une science qui enchaîne à une même destinée les dieux et les mortels ! Quel est donc l’homme qui, voyant les astres en travail (pour me servir du nom qu’il a plu de donner aux crises qu’ils, subissent périodiquement), ne se soumettra pas à sa destinée?<br /><p style="text-align: justify; text-indent: 15px;">Je vais maintenant toucher brièvement et sommairement les points sur lesquels on est d’accord dans cette matière, et j’en rendrai raison en passant, lorsque cela sera tout-à-fait nécessaire; car un développement de preuves n’est pas le but de l’ouvrage que j’ai entrepris, et il n’y a pas, je pense, moins de mérite à pouvoir rendre raison de toutes choses, qu’à s’arrêter à en prouver quelques-unes.</div> {{Boîte déroulante début|titre=Notes du traducteur|alignT=center}} <div style="text-align: justify; border: 2px; border-radius:15px; font-size:85%;"><br/> <table cellspacing=15 align=center style="margin: 0 4em;"> <tr> <td style="text-align: justify; margin: 0 4em; text-indent: 15px">'''[[#Sulpicius_Gallus_AdG_back|<span id="Sulpicius_Gallus_AdG"><sup>1</sup></span>]] [[w:Tite-Live|Tite-Live]], XLIV, 37, [[w:Quintilien|Quintilien]], I, 10, [[w:Plutarque|Plutarque]] [[#Plutarque_back|<sup>⤵️</sup>]], [[w:Vies_parallèles|''Vie de Paul Emile'']], [[w:Frontin|Frontin]], I, etc., prétendent, comme Pline, que Sulpicius Gallus prédit l’éclipse anx soldats romains. [[w:Cicéron|'''Cicéron''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Cicéron_back|<sup>🔄</sup>]] ([[w:De_Republica|''Répub.'']], I, 15 , page 44, ''édit. Maj.'') dit au contraire que l’éclipse était déjà arrivée lorsque Sulpicius Gailus commençait à s’efforcer d’ôter aux soldats romains la terreur qu’ils avaient conçue de cet événement, en leur expliquant les causes des éclipses.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Pridie_quam_Perses_rex_AdG_back|<span id="Pridie_quam_Perses_rex_AdG"><sup>2</sup></span>]] Selon Tite-Live (XLIV, 37), l’éclipse eut lieu dans la soirée du 3 septembre, cent huit ans avant J.-C., entre sept et dix heures (''ab hora secunda usque ad quartam noctis, quam pridie nonas sept, secula est dies''). M. [[w:Christian_Ludwig_Ideler|Ideler]] (''Chronologie'', II, 104) a calculé cette éclipse. Il a trouvé, comme M. de Nauze, que, selon le calendrier Julien, elle arriva dans la soirée du 21 juin de l’an 168 avant J.-C. à Rome, la lune commença à s’éclipser vers 5h.44’ du soir ; depuis 6h.51’ jusqu’à 8h.18’, la lune fut totalement éclipsée, ; à 9h.,24’, la lune ne fut plus obscurcie du tout. En Macédoine, tous ces phénomènes arrivèrent 39 minutes plus tard. Le 21 juin, le soleil se coucha à Rome et en Macédoine vers 7h.33’, et s’y montra alors à 44 1/2’ h. équatoriales. Ainsi, la première heure de la nuit finissait vers 8h.17’, la seconde vers 9h.2’, la troisième vers 9h.46’, la quatrième vers 10h.31’. La lune fut donc éclipsée totalement au moment où elle se leva dans la Macédoine, et cette éclipse totale y finit dans la seconde heure de la nuit ; au milieu de la quatrième, la lune ne fut plus obscurcie du tout. S’il est vrai, que cette éclipse lunaire, comme Pline, Tite-Live et d’autres le disent, fut prédite par Sulpicius Gallus, l’on devrait avouer que ce Romain s’entendait très-bien au calcul des éclipses lunaires. Mais les récits de Cicéron et de [[w:Valère_Maxime|Valère-Maxime]] ne seraient-ils pas plus vrais que ceux de Pline et de Tite-Live ?''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Primus_omnium_Thales_AdG_back|<span id="Primus_omnium_Thales_AdG"><sup>3</sup></span>]] Le même fait est rapporté par [[w:Hérodote|Hérodote]] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Hérodote_back|<sup>🔄</sup>]], I, 74, par [[w:Diogène_Laërce|Diogène Laërce]] [[#Diogène_Laërce_back|<sup>⤵️</sup>]], I, 6 , par [[w:Clément_d'Alexandrie|Clément d’Alexandrie]] [[#Clément_d'Alexandrie_back|<sup>⤵️</sup>]], ''Strom.'', I, page 302 , par Plutarque, ''Opinions des Philosophes'', II, 24, par [[w:Jean_Tzétzès|Tzetzès]], ''Chil.'' II, v. 869, et par Hardouin.<br /><p style="text-align: justify; text-indent: 15px;">Oltmann a publié une dissertation dans laquelle, à l’aide des tables astronomiques les plus modernes, il est arrivé à ce résultat, que l’éclipse solaire dont il est question ici eut lieu le 3o septembre 610 ans avant J.-C. L’éclipse était totale pour les environs de la ville d’[[w:Erzurum|Érzerum]] sur le [[w:Kızılırmak_(fleuve)|Halys]] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Halys_back|<sup>🔄</sup>]], où [[w:Volney|Volney]] place le champ de bataille des rois [[w:Alyatte_II|Halyattes]] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Alyatte_back|<sup>🔄</sup>]] et [[w:Cyaxare|Cyaxare]] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Cyaxare_back|<sup>🔄</sup>]]. La quatre-vingtième partie du disque solaire seule ne fut pas éclipsée pour le lieu de la terre où Oltmann place le champ de bataille, qui est situé, selon lui, sous 36° long. à l’est de Terro et sous 40° lat. sept. Dans le pays des Ioniens où Thalès prédit l’éclipse, selon Hérodote, l’éclipse se monta à 11 1/2’. M. [[w:Alphonse_Des_Vignoles|Desvignolles]] (''Chronologie de l’histoire sainte'', t. II, pag. 245 et suiv.) fixe l’éclipsé prédite par Thales au 38 mai de l’an 585 avant J.-C. ; son opinion a été adoptée depuis par presque tous les chronologistes et historiens, et par [[w:Gabriel_Brotier|Brotier]] et M. Alexandre. Elle a été réfutée avec succès par Oltmann, qui s’est servi de tables astronomiques bien plus exactes que celles de M. Desvignolles ; en effet, celui-ci a démontré par ses calculs que l’éclipse totale du soleil du 28 mai de l’an 585 avant J.-C., ne fut pas totale dans les lieux où les troupes du roi lydien Halyatte combattirent contre celles du roi Cyaxare ; que, dans ces régions, elle ne se monta pas à plus de 7 1/2 pouces, et que, d’ailleurs, le soleil ne s’était pas encore levé lorsque Féclipse était le plus forte pour les habitans des pays nommés. Mais Hérodote dit positivement que l’éclipse prédite par Thalès fut totale dans ces contrées, et qu’elle eut lieu en plein jour. (Voyez IDELER, ''Chronologie'', t. I, pag. 209 et 210.) Nous remarquerons pourtant avant de finir cette note que la date de Desvignolles est plus conforme que celle d’Oltmann à l’année dans laquelle l’éclipse prédite par Thalès, arriva selon Pline. En effet, le naturaliste romain dit que cette année est la six cent quatre-vingt-cinquième avant J.—C., et c’est justement le 28 mai de cette année que l’éclipse prédite par Thalès arriva, selon M. Desvignolles.<br /><p style="text-align: justify; text-indent: 15px;">Volney pense que l’éclipse en question arriva le 3 février de de l’an 626. Oltman a démontré, dans son Mémoire sur l’éclipse de Thalès, que celle de Volney était déjà passée lorsque le soleil se leva sur le champ de bataille des rois Halyattes et Cyaxare.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Anno_CLXX_AdG_back|<span id="Anno_CLXX_AdG"><sup>4</sup></span>]] L’an 170. C’est ainsi que l’on doit lire, et non CLX, comme l’ont fait Hardouin et Poinsinet; la quatrième année de la quarante-huitième olympiade, correspondant à l’an 170 de Rome, si l’on suppose avec [[w:Varron_(écrivain)|Varron]] que cette ville a été fondée dans la deuxième année de la 6e olympiade.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Alyatte_rege_AdG_back|<span id="Alyatte_rege_AdG"><sup>5</sup></span>]] Le nom de ce roi est écrit avec un esprit rude dans Hérodote, ce qui a donné lieu à [[w:Louis_Poinsinet_de_Sivry|Poinsinet]] et à d’autres traducteurs de Pline de substituer le mot Halyatte à celui d’Alyatte.<br /><p style="text-align: justify; text-indent: 15px;">Alyatte ou Halyatte fut roi de la Lydie et père de Crésus. Il faisait la guerre à Cyaxare, roi des Mèdes, lorsque l’éclipse solaire en question interrompit le combat.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#In_sexcentos_annos_AdG_back|<span id="In_sexcentos_annos_AdG"><sup>6</sup></span>]] On lit dans [[w:Georges_le_Syncelle|le Syncelle]] (''Chronolog.'', pag. 17) que les Chaldéens ont connu une période de six cents années solaires. [[w:Flavius_Josèphe|Josèphe]] [[#Flavius_Josèphe_back|<sup>⤵️</sup>]] ([[w:Antiquités_judaïques|''Ant. jud.'']], I, page 17 et 18, édit. Havercamp) dit que Dieu donna une longue vie aux patriarches pour qu’ils pussent cultiver avec succès les sciences astronomiques et géométriques, ce qu’ils n’auraient pu faire s’ils n’avaient pas vécu au moins six cents ans ; car la grande année ne finit pas plus tôt. Ainsi, il est certain qu’avant Hipparque les Chaldéens et d’autres peuples asiatiques ont connu une période de six cents années solaires. Mais [[w:Jean-Dominique_Cassini|Cassini]] ([[w:Jean-Dominique_Cassini#Mémoires_de_l’Académie_royale_des_sciences|''Anciens mém. de l’Acad.'']], t. VIII, pag. 4 et 5) et [[w:Jean_Sylvain_Bailly|Bailly]] (''Hist. de l’astr. ancienne'', t. II, liv. 3, Eclairciss.) ont prouvé que tous les six cents ans les nouvelles et pleines lunes n’arrivent pas seulement au même jour et à la même heure qu’auparavant, mais encore à la même minute. Ne serait-il donc pas probable qu’Hipparque, comme le dit Ideler (''Historische untersuchungen uber die astronomischen beobachtungen der alten'', Berlin 1806, page 417) a connu cette période chaldéenne, et que delà résulte l’étendue de six cents ans donnée à son calendrier selon Pline.<br /><p style="text-align: justify; text-indent: 15px;">[[w:Abel_Burja|Abel-Burja]] de Leipzig a tâché d’expliquer d’une autre manière la durée du calendrier d’Hipparque (''Astronomisches Jahrbuch'', 1797, pag. 233 et 234). [[w:Claude_Ptolémée|Ptolémée]] et [[w:Censorin_(grammairien)|Censorin]] racontent qu’Hipparque est auteur d’une période soli-lunaire de trois cent quatre années solaires. En la prenant deux fois, on obtient une période de six cent huit ans. Celle-ci fut abrégée par Hipparque de huit ans, afin d’obtenir un nombre entier de siècles pour son calendrier. Ideler a fait une objection très-juste contre cette opinion de Burja ; c’est que la période de six cent huit ans n’a aucun avantage sur celle de trois cent quatre ans. On ne voit donc pas ce qui a pu engager Hipparque à préférer le nombre de six cents ans à celui de trois cents, lorsqu’il composait son calendrier.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Menses_gentium_etc_AdG_back|<span id="Menses_gentium_etc_AdG"><sup>7</sup></span>]] C’est-à-dire il écrivit des éphémérides dans lesquelles il avait calculé d’avance les néomenies et les pleines lunes. Il fit aussi entrer dans son calendrier les longueurs des jours et des heures variables, [[w:ὧραι|ὧραι]] καιρικαι, ainsi que les aspects du ciel, ''visus populorum'', tels qu’ils eurent lieu chez les habitans de différentes contrées de la terre. Il ajouta une table des longitudes et des latitudes des principaux pays et villes du globe. Ptolémée (''Géogr.'', I, ch. 4) en dit autant d’Hipparque.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Aevo_teste_AdG_back|<span id="Aevo_teste_AdG"><sup>8</sup></span>]] Les tables d’Hipparque étaient dressées pour six cents ans. Cet astronome florissait vers cent cinquante ans avant J.-C. Ainsi, du temps de Pline, on avait encore à jouir de ces tables pour quatre cents ans environ. POINSINET.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Numinum_AdG_back|<span id="Numinum_AdG"><sup>9</sup></span>]] Pline donne souvent l’épithète de divinités aux planètes, à la lune, au soleil, à la terre et aux étoiles fixes.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#In_defectibus_scelera_etc_AdG_back|<span id="In_defectibus_scelera_etc_AdG"><sup>10</sup></span>]] Nous transcrivons ici ce beau passage de l’Uranographie de M. [[w:Louis-Benjamin_Francœur|Francoeur]], qui mérite d’être mis en parallèle avec celui de Pline pour l’élégance du style et les pensées, et qui renferme le meilleur commentaire que nous puissions donner de tout ce que Pline dit des terreurs que les éclipses causaient autrefois aux hommes ignorans. « L’histoire, dit M. Francoeur (page 93), est pleine des exemples de l’effroi causé par les éclipses, et des dangers que produisent l’ignorance et la superstition. Nicias avait résolu de quitter la Sicile avec son armée ; effrayé par une éclipse de lune, et voulant temporiser plusieurs jours pour s’assurer si l’astre n’avait rien perdu après cet évènenement, il manqua ainsi l’occasion de sa retraite; son armée fut détruite ; Nicias périt, et ce malheur commença la ruine d’Athènes.<br /><p style="text-align: justify; text-indent: 15px;">« Souvent on a vu des hommes adroits tirer parti de la frayeur du peuple pour l’amener à remplir leurs desseins. Christophe Colomb, réduit à faire subsister ses soldats des dons volontaires d’une nation sauvage et indigente, était prêt à voir tarir cette ressource et à périr de faim ; il annonce qu’il va priver le monde de la lumière de la lune. L’éclipse commence et la terreur s’empare des Indiens, qui reviennent apporter aux pieds de Colomb les tributs accoutumés.<br /><p style="text-align: justify; text-indent: 15px;">« Drusus (TACITE , Annales, I, 28) apaisa une sédition dans son armée, en prédisant une éclipse de lune, et, selon Tite-Live, Sulpicius Gallus, dans la guerre de Paul-Emile contre Persée, usa du même stratagème. Periclès, [[w:Agathocle_de_Syracuse|Agathocles de Syracuse]], [[w:Dion_de_Syracuse|Dion]], roi de Sicile, ont failli être victimes de l’ignorance de leurs soldats. [[w:Alexandre_le_Grand|Alexandre]], près d’[[w:Bataille_de_Gaugamèles|Arbelles]], est réduit à user de toute son adresse pour calmer la terreur qu’une éclipse avait jetée parmi ses troupes. Les hommes supérieurs, plutôt que de plier sous les circonstances qui les maîtrisent, mettent leur art à les tourner à leur profit.<br /><p style="text-align: justify; text-indent: 15px;">« Combien de fables établies d’après l’opinion que les éclipses sont l’effet du courroux céleste qui se venge des iniquités de l’homme en le privant de la lumière! Tantôt [[w:Diane_(mythologie)|Diane]] va trouver [[w:Endymion|Endymion]] dans les montagnes de Carie; tantôt les magiciennes de Thessalie font descendre la lune sur les herbes qu’elles destinent aux enchantemens. »<br /><br /><p style="text-align: center;">''Carmina vel cælo possunt deducere lunam.''<br /><p style="text-align: right; text-indent: 15px;">Virg., ''Eclog.'' VIII.<br /><br /><p style="text-align: justify; text-indent: 15px;">« Ici c’est un dragon qui dévore l’astre, et qu’on cherche à épouvanter par des cris ; le dieu tient le soleil enfermé dans un tuyau, et nous ôte ou nous rend la vue de cet astre à l’aide d’un volet, etc. Les progrès des sciences ont fait connaître le ridicule de ces opinions et de ces craintes, depuis qu’on a vu qu’il était possible de calculer par les tables astronomiques, et de prévoir long-temps d’avance l’instant où la colère du ciel devait éclater.<br /><p style="text-align: justify; text-indent: 15px;">« Cependant, naguère encore, l’épouvante a causé les revers des armées de Louis XIV, près de Barcelone, lors de l’éclipse totale de l’an 1706 [[w:en:Solar_eclipse_of_May_12,_1706|(en)]], et la devise, ''nec pluribus impar'', a prêté aux allusions injurieuses ! »''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Pindari_AdG_back|<span id="Pindari_AdG"><sup>11</sup></span>]] Pindare était le plus fameux poète de la Grèce après Homère. Il vint au monde l’an 134 avant l’ère chrétienne. POINSINET.<br /><p style="text-align: justify; text-indent: 15px;">Plutarque (''De la face de la lune'', pag. 931) dit aussi que Stésichore et Pindare craignaient beaucoup les éclipses. Le dernier poète a peint les terreurs que lui causaient ces phénomènes dans son poëme sur le soleil. HARDOUIN et DALECHAMP.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Crepitu_dissono_AdG_back|<span id="Crepitu_dissono_AdG"><sup>12</sup></span>]] Cet usage superstitieux dont Plutarque parle au long dans sa vie de Paul-Émile, a fourni un vers fort plaisant à Juvénal, lorsqu’après avoir épuisé toute sorte d’exagération pour représenter le bruit qu’une femme fait en criant, il finit par dire :<br /><br /><p style="text-align: center;">''Una laboranti poterit succurrere lunæ.''<br /><br /><p style="text-align: justify; text-indent: 15px;">« Elle seule, au besoin, décharmerait la lune. » POINSINET.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Nicias_AdG_back|<span id="Nicias_AdG"><sup>13</sup></span>]] Le même fait est raconté par Plutarque dans la vie de Nicias, par Quintilien, I, 10, et par d’autres écrivains anciens. HARDOUIN.''' </td> </tr> </table><br/><br/></div>{{Boîte déroulante fin}} <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k5773334c/f10.item <u>Histoire Naturelle de Pline. Tome Second</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k5773334c/f14.item ''Livre II.''], [https://gallica.bnf.fr/ark:/12148/bpt6k5773334c/f46.item ''chap. IX.''], traduction nouvelle par M. [[w:Stéphane_Ajasson_de_Grandsagne|Ajasson de Grandsagne]] [https://gallica.bnf.fr/ark:/12148/bpt6k5773334c/f311.item <sup>NOTES</sup>], C. L. F. Panckoucke, Paris, 1829</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: center; margin: 0 2em;">''Des inventions a[[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki />tronomiques, & de leurs Auteurs.''<br /><p style="text-align: justify; text-indent: 15px;">'''L'''E PREMIER d’entre les ''Romains'' qui rendit publique la théorie des éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oleil & de lune, fut '''Sulpicius Gallus''' [[#Sulpicius_Gallus_LPdS|<span id="Sulpicius_Gallus_LPdS_back"><sup>'''1'''</sup></span>]], celui que '''Marcus Marcellus''' eut pour Collegue au Con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ulat : mais il n’étoit que Tribun Militaire [[#Tribun_Militaire_LPdS|<span id="Tribun_Militaire_LPdS_back"><sup>'''2'''</sup></span>]], lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’il di{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ipa l’allarme qu’auroient pu prendre nos troupes la veille de la victoire remportée {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur '''Per{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ée''' par '''Paul Emile''' ; car ce Général l’ayant produit devant les {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oldats a{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}emblés, il leur prédit une éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e qui devoit arriver [[#éclipse_LPdS|<span id="éclipse_LPdS_back"><sup>'''3'''</sup></span>]] ; il compo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}a même en{{Info|ſ|forme ancienne longue de la lettre s minuscule}}uite un Ouvrage {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur ce {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ujet. Parmi les ''Grecs'', '''Thalès''' de ''Milet'' prédit l’an quatrieme de la quarante-huitieme olympiade l’éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oleil qui arriva {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous le regne de '''Halyattes''' [[#Halyattes_LPdS|<span id="Halyattes_LPdS_back"><sup>'''4'''</sup></span>]], l’an cent {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oixante de la fondation de [[#cent_soixante_LPdS|<span id="cent_soixante_LPdS_back"><sup>'''5'''</sup></span>]] ''Rome''. Après eux, Hipparque [[#Hipparque_LPdS|<span id="Hipparque_LPdS_back"><sup>'''6'''</sup></span>]] dre{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}a des Tables en vers [[#En_vers_LPdS|<span id="En_vers_LPdS_back"><sup>'''7'''</sup></span>]] du cours de ces deux aftres pour fix cents ans. Dans ces Tables , de l’exactitude deſquelles notre âge rend encore témoignage [[#témoignage_LPdS|<span id="témoignage_LPdS_back"><sup>'''8'''</sup></span>]], il embra{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}e les éphémérides propres à chaque nation [[#chaque_nation_LPdS|<span id="chaque_nation_LPdS_back"><sup>'''9'''</sup></span>]], les jours, les heures, le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ite re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pectif de chaque lieu, & les divers a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pects du ciel relativement aux divers peuples, comme {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i la Nature l’eût admis à {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}eil intime. Per{{Info|ſ|forme ancienne longue de la lettre s minuscule}}onnages vraiment grands! génies plus qu’humains, d’avoir ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i {{Info|ſ|forme ancienne longue de la lettre s minuscule}}urpris les loix qui font mouvoir ces va{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tes pui{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ances du ciel ; & d’avoir guéri de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}es allarmes l’imagination malade des hommes, qui ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’alors, ou avoient toujours vu dans les éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es l’annonce effrayante de quelque grand crime & de quelque mort (terreur dont Sté{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ikhore [[#Stésikhore_LPdS|<span id="Stésikhore_LPdS_back"><sup>'''10'''</sup></span>]] & Pindare [[#Pindare_LPdS|<span id="Pindare_LPdS_back"><sup>'''11'''</sup></span>]], ces Poètes {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ublimes, ne furent point exempts à l’égard des éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es {{Info|ſ|forme ancienne longue de la lettre s minuscule}}olaires), ou attribuoient les ténebres dont {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e couvre la lune à des maléfices opérés par le mêlange de certaines herbes magiques ; & croyoient devoir la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ecourir par un bruit di{{Info|ſ|forme ancienne longue de la lettre s minuscule}}cordant [[#bruit_discordant_LPdS|<span id="bruit_discordant_LPdS_back"><sup>'''12'''</sup></span>]]. Cette même terreur fut cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e que le Général Nicias [[#Nicias_LPdS|<span id="Nicias_LPdS_back"><sup>'''13'''</sup></span>]], peu au fait des cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es phy{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iques, & n’o{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ant pas, par {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uper{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tition, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ortir {{Info|ſ|forme ancienne longue de la lettre s minuscule}}a flotte du Port, mit Athenes à deux doigts de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}a perte. Honneur [[#Honneur_LPdS|<span id="Honneur_LPdS_back"><sup>'''14'''</sup></span>]] à vous, Interpretes du Ciel ! E{{Info|ſ|forme ancienne longue de la lettre s minuscule}}prits [[#Esprits_LPdS|<span id="Esprits_LPdS_back"><sup>'''15'''</sup></span>]] dont l’étendue {{Info|ſ|forme ancienne longue de la lettre s minuscule}}urpa{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}e celle de la Nature ; Inventeurs d’une méthode qui a{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ujettit les dieux comme les hommes, à une même de{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tinée ! Eh! qui pourroit, en voyant les a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tres même ''en cri{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e'' (pour me {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervir de l’expre{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ion commune), ne pas {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oumettre à la néce{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ité où {{Info|ſ|forme ancienne longue de la lettre s minuscule}}a condition mortelle l’enchaîne.<br /><p style="text-align: justify; text-indent: 15px;">Pré{{Info|ſ|forme ancienne longue de la lettre s minuscule}}entement je vais toucher par articles fort courts & fort précis les points {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur le{{Info|ſ|forme ancienne longue de la lettre s minuscule}}quels on s’accorde le plus. Je ré{{Info|ſ|forme ancienne longue de la lettre s minuscule}}oudrai, chemin fai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ant, quelques que{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tions, lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que le cas l’exigera, mais toujours d’une maniere très {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ommaire ; car une analy{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e en forme d’arguments {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivis excéderoit le but de cet Ouvrage : & puis, je pen{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e qu’il n’y a pas moins de mérite à rendre une rai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}on plau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ible de toutes cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es, qu’à rendre une rai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}on bien {{Info|ſ|forme ancienne longue de la lettre s minuscule}}olide de deux ou trois cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement.</div> {{Boîte déroulante début|titre=Notes du traducteur|alignT=center}} <div style="text-align: justify; border: 2px; border-radius:15px; font-size:85%;"><br/> <table cellspacing=15 align=center style="margin: 0 4em;"> <tr> <td style="text-align: justify; margin: 0 4em; text-indent: 15px">'''[[#Sulpicius_Gallus_LPdS_back|<span id="Sulpicius_Gallus_LPdS"><sup>1</sup></span>]] Son premier prénom étoit Caïus. Voyez à {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ujet Tite-Live, l. 44. Valere maxime, l. 8. Quintilien, l. I. ch. 10. Plutarque, vie de Paul-Emile, &c.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Tribun_Militaire_LPdS_back|<span id="Tribun_Militaire_LPdS"><sup>2</sup></span>]] Ce grade répond à celui de Major-général des Troupes.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#éclipse_LPdS_back|<span id="éclipse_LPdS"><sup>3</sup></span>]] Cette éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon Tite-Live, fut annoncée aux {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oldats pour la nuit {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivante. Sulpicius Gallus leur prédit que la lune s’éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit entre la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}econde heure de la nuit & la quatrieme. Plutarque ajoute qu’on étoit alors à l’i{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ue de l’été (''{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ub exitum a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tatis''). [[w:Paulin_II_d'Aquilée|Paul d’Aquilée]] écrit que cette éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e arriva aux nones de Septembre (''nonas Septembris''), c’est-à-dire au 4 Septembre : c’étoit l’an 168 avant J.C. {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon le calcul d’[[w:James_Ussher|U{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}erius]].''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Halyattes_LPdS_back|<span id="Halyattes_LPdS"><sup>4</sup></span>]] Il paroît que Ciceron & Eu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ebe {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e trompent lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’ils placent cet événement {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous ''A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tiages'' : [[w:Hermolaos_(Macédoine)|Hermolaüs]] s’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t trompé d’après eux, en {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ub{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tituant ''A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tiages'' à ''Halyattes'' dans le texte de Pline, contre la foi des manu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}crits, & contre le témoignage d’Herodote qui place cet événement dans une guerre entre Halyattes, Roi de Sardes, & Cyaxare, Roi des Medes, pere d’A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tiages.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#cent_soixante_LPdS_back|<span id="cent_soixante_LPdS"><sup>5</sup></span>]] Les deux manu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}crits royaux portent ''anno CLX'' : c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t la leçon qu’il faut {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivre. En effet, Rome, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon Varron, fut fondée l’an 2 de la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ixieme olympiade, c’est-à-dire, dans l’année olympiadique 22. Mais comme chaque olympiade, depuis leur premiere in{{Info|ſ|forme ancienne longue de la lettre s minuscule}}titution, commençoit après le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ol{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tice d’été, & comme l’année Romaine avoit toujours commencé au plus tard en Mars {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous Romulus, & depuis en Janvier {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous Numa, il s’en{{Info|ſ|forme ancienne longue de la lettre s minuscule}}uit que la premiere année de Rome, qui répondoit à l’année olympiadique 22, répondoit en même-tems, de quatre mois au moins, à l’année olympíadique 23. Selon ce calcul, la quatrieme année de la quarante-huitieme olympiade, répond en partie à l’an 160, & en partie à l’an 161 de la fondation de Rome, pui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que 48 olympiades font cent quatre-vingt-douze années, de{{Info|ſ|forme ancienne longue de la lettre s minuscule}}quelles {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i vous ôtez 22 ans écoulés, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon Varron, entre la premiere olympiade & la fondation de Rome, il re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tera 160 ans, & 161 ans {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i l’on a égard à l’enjambement réciproque des années olympiadiques {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur les années Romaines, & des années Romaines {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur les années olympiadiques. Il e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t donc évident que le calcul de Pline (''anno CLX'') e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te, en admettant l’hypothe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e chronologique de Varron, à laquelle on voit bien que notre Auteur s’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t conformé en cette occa{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ion particuliere encore qu’en plu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ieurs autres rencontres il paroi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}e affecter de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivre le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}y{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tême de Caton : vici{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}itude pardonnable dans un ouvrage de compilation où Pline a dû, comme malgré lui, adopter tantôt le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}tyle d’un Auteur, tantôt celui d’un autre, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ource où il pui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}oit pour l’heure. Si Pline eût {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivi l’hypothe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e de Caton qui place la fondation de Rome deux ans plus tard que Varron, il eût fait tomber le rapport {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur l’année 157 ou 158 de la fondation de Rome. C’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t le parti que prend le Pere Hardouin, & c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t de là qu’il part pour propo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}er une correction dans le texte. Mais encore une fois, c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t commettre {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oi-même une faute que d’en trouver une chez Pline en cette occa{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ion ; pui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que cet Auteur a été en droit de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervir du {{Info|ſ|forme ancienne longue de la lettre s minuscule}}y{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tème Varronien, ou ce qui revient au même, de con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}erver la date Varronienne dont s’étoit {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervi l’Auteur de qui il emprunte le fait hi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}torique en que{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tion.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Hipparque_LPdS_back|<span id="Hipparque_LPdS"><sup>6</sup></span>]] Voyez les notes {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur le premier livre au mot ''Hipparque'' : HIPPARCHUS (de Nicée, en Bithinie comme l’ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}erve [[w:Souda|Suidas]]), flori{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}oit dans la quatre-vingt-quatorzieme olympiade. Nous avons {{Info|ſ|forme ancienne longue de la lettre s minuscule}}es trois livres d’Enarrations {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur les Phénomenes d’[[w:Aratos_de_Soles|Aratus]] & d’[[w:Eudoxe_de_Cnide|Eudoxe]], traduits par le [[w:Paul_Petau|P. Petau]]. Il avoit compo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}é un autre livre ''De {{Info|ſ|forme ancienne longue de la lettre s minuscule}}tellarum inerrantium Con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}titutione'', {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon Suidas. Son livre du mois lunaire e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t cité par [[w:Claude_Galien|Galien]].''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#En_vers_LPdS_back|<span id="En_vers_LPdS"><sup>7</sup></span>]] ''En Vers.'' Je préfume que c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t-là le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ens de ''præcinere'', qui ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ignifie pas {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement prédire, mais prédire en chant, c’est-à-dire en Vers. Sur ce pied-là, ce {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit d’un Poëme dans le genre de celui d’[[w:Aratos_de_Soles|Aratus]], dont il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit ici que{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tion. Si par hazard Pline n’a point prétendu parler d’un Poëme, au-moins s’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t-il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervi d’une expre{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ion propre à dé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}igner ce genre d’écrire. Pour décider la que{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tion, il faudroit avoir tous les ouvrages d’Hipparque, & {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur-tout celui-ci.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#témoignage_LPdS_back|<span id="témoignage_LPdS"><sup>8</sup></span>]] Ces tables étoient dre{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ées pour {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ix cents ans. Or Hipparque flori{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}oit 150 ans avant J.C. Ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i du tems de Pline, on avoit encore à jouir de ces tables pour quatre cents ans ou environ.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#chaque_nation_LPdS_back|<span id="chaque_nation_LPdS"><sup>9</sup></span>]] La lune ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e levant pas & ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e couchant pas à la même heure pour toutes les nations, les diver{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es époques & pha{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es qu’elle forme n’appartiennent pas non plus au même point de tems pour tous les peuples, pui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que les uns ont la nuit quand les autres ont le jour; & que même lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que la lune s’éclip{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e, la partie de l’heure où ce phénomene e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t {{Info|ſ|forme ancienne longue de la lettre s minuscule}}en{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ible, n’a pas la même évaluation pour tous les climats qui l’apperçoivent. Hipparque avoit donc eu égard à cette différence d’époques, relativement aux diver{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es longitudes, &par-con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}équent aux diver{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es nations, tellement que les tables de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}es éphémérides étoient accommodées à l’u{{Info|ſ|forme ancienne longue de la lettre s minuscule}}age de tous les peuples : ouvrage dont on ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}auroit trop regretter la perte, & qui jetteroit le plus grand jour {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur l’ancienne géographie.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Stésikhore_LPdS_back|<span id="Stésikhore_LPdS"><sup>10</sup></span>]] Ste{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ikhore, l’un des plus fameux Poètes de la Grece, dont, par malheur, nous avons perdu tous les ouvrages, à l’exception d’une vingtaine de lignes décou{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ues. Il vivoit dans la quarante-deuxieme olympiade, c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t-à-dire, vers l’an {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ix cents dix avant J.C.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Pindare_LPdS_back|<span id="Pindare_LPdS"><sup>11</sup></span>]] Pindare, le plus fameux Poète de la Grece après Homere. Il vint au monde l’an 134 avant l’ere chrétienne.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#bruit_discordant_LPdS_back|<span id="bruit_discordant_LPdS"><sup>12</sup></span>]] Cet u{{Info|ſ|forme ancienne longue de la lettre s minuscule}}age {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uper{{Info|ſ|forme ancienne longue de la lettre s minuscule}}titieux a fourni un Vers fort plai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ant à Juvenal, lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’après avoir épui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}é toute {{Info|ſ|forme ancienne longue de la lettre s minuscule}}orte d’exagération pour repré{{Info|ſ|forme ancienne longue de la lettre s minuscule}}enter le bruit qu’une femme fait en criant, il finit par dire :<br /><p style="text-align: justify; text-indent: 15px;">''Una laboranti poterit {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uccurrere luna.''<br /><p style="text-align: justify; text-indent: 15px;">Elle {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eule au be{{Info|ſ|forme ancienne longue de la lettre s minuscule}}oin décharmeroit la lune.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Nicias_LPdS_back|<span id="Nicias_LPdS"><sup>13</sup></span>]] C’étoit un Général Athénien, qui fut malheureux dans pre{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que toutes {{Info|ſ|forme ancienne longue de la lettre s minuscule}}es expéditions. Les Athéniens finirent par le condamner à mort. Il étoit contemporain d’[[w:Alcibiade|Alcibiade]] & de [[w:Lamachos|Lamachus]], & leur collegue dans le commandement. Voyez {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur le fait dont parle ici Pline, Quintilien, l. I. ch. 10, & Plutarque à l’article Nicias.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Honneur_LPdS_back|<span id="Honneur_LPdS"><sup>14</sup></span>]] Au lieu de ''macte ingenio'', le Pere Hardouin lit ''macti'' ; mais {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon les meilleurs Latini{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tes ''macte'' e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t indéclinable, ou pour mieux dire, c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t un adverbe qui répond au ''bravò'' des Italiens. Fe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tus prétend que ''macte'' e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t un compo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}é de ''magis auctus''.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Esprits_LPdS_back|<span id="Esprits_LPdS"><sup>15</sup></span>]] Cette apo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}trophe de Pline aux A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tronomes rappelle ces beaux Vers d'Ovide {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur le même {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ujet :<br />Felices animos quibus hæc cogno{{Info|ſ|forme ancienne longue de la lettre s minuscule}}cere primise<br /><p style="text-align: justify; text-indent: 15px;">Inque Domos {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uperas {{Info|ſ|forme ancienne longue de la lettre s minuscule}}candere cura fuit!<br />Credibile e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t illos pariter vitli{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que joci{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que<br /><p style="text-align: justify; text-indent: 15px;">Altius humanis ex{{Info|ſ|forme ancienne longue de la lettre s minuscule}}eruifle caput,<br />Non Venus aut Vinum {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ublimia pectora fregit<br /><p style="text-align: justify; text-indent: 15px;">Officiumve {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ori, militiæve labor :<br />Nec levis ambitio, perfu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}aque gloria fuco,<br /><p style="text-align: justify; text-indent: 15px;">Magnarumve fames {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ollicitavit opum.<br />Admovere oculis di{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tantia {{Info|ſ|forme ancienne longue de la lettre s minuscule}}idera no{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tris,<br /><p style="text-align: justify; text-indent: 15px;">Ætheraque ingenio {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uppo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}uere {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uo.<br />Sic petitur cœlum: non ut ferat O{{Info|ſ|forme ancienne longue de la lettre s minuscule}}lan Olympus<br /><p style="text-align: justify; text-indent: 15px;">Summaque Peliacus {{Info|ſ|forme ancienne longue de la lettre s minuscule}}idera tangat apex, &c.<br /><p style="text-align: right; text-indent: 15px;">Ovid. {{Info|ſ|forme ancienne longue de la lettre s minuscule}}a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t. l. I.''' </td> </tr> </table><br/><br/></div> {{Boîte déroulante fin}} <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=UnhluychtF8C&newbks=1&newbks_redir=0&dq=Histoire%20naturelle%20Pline&hl=fr&pg=PP7#v=onepage&q&f=true <u>Histoire Naturelle de Pline. Tome Premier</u>], [https://books.google.fr/books?id=UnhluychtF8C&newbks=1&newbks_redir=0&dq=Histoire%20naturelle%20Pline&hl=fr&pg=RA1-PA3#v=onepage&q&f=true ''Livre Second.''], [https://books.google.fr/books?id=UnhluychtF8C&newbks=1&newbks_redir=0&dq=Histoire%20naturelle%20Pline&hl=fr&pg=RA1-PA59#v=onepage&q&f=true ''Des inventions astronomiques, & de leurs Auteurs.''], traduction en françois, avec le texte latin rétabli d’après les meilleures leçons manu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}crites ; accompagnée de Notes critiques pour l’éclairci{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ement du texte, & d’Ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervations {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur les connoi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ances des Anciens comparées avec les découvertes des Modernes, par M. [[w:Louis_Poinsinet_de_Sivry|Louis Poinsinet de Sivry]], Chez la veuve Desaint, Paris, 1771</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div> </div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ==== Livre XVIII ==== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Enquête sur l’agriculture</div> ===== <div style="text-align: center;">Chapitre LVII.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage d’une théorie astronomique de '''Thalès''', du [[w:Lever_héliaque|''coucher matinal'']] des [[w:Pléiades_(astronomie)|''Pléiades'']] 25 jours après l’[[w:Équinoxe_de_septembre|''équinoxe d’automne'']].</div> :'''Texte latin''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''LVII.''' Primum omnium dierum ipsorum anni solisque motus prope inexplicabilis ratio est. Ad CCCLXV adjiciunt etiamnum intercalarios diei noctisque quadrantes. Ita fit, ut tradi non possint certa siderum tempora. Accedit confessa rerum obscuritas, nunc præcurrenle, nec paucis diebus, tempestatum significatu, quod προϰειμασιν Græci vocant : nunc postveniente, quod ἐπιϰεἰμασιν : et plerumque alias citius, alias tardius cæli effectu ad terram deciduo : vulgo serenitate reddita, confectum sidus audimus. Præterea quum omnia hæc statis sideribus cæloque affixis constent, interveniunt motu stellarum grandines, imbres, et ipsi non levi effectu, ut docuimus, turbantque conceptæ spei ordinem. ldque ne nobis tantum putemus accidere, et reliqua fallit animalia sagaciora circa hoc, ut quo vita eorum constet : æstivasque alites præposteri aut præproperi rigores necant, hibernas æstus. Ideo '''Virgilius''' errantium quoque siderum rationem ediscendam præcipit, admonens observandum frigidæ Saturni stellæ transitum. Sunt qui certissimum veris indicium arbitrentur ob infirmitatem animalis, papilionis proventum. Id eo ipso anno, quum commentaremur hæc, notatum est, proventum eorum ter repetito frigore exstinctum, advenasque volucres a. d. VI kalendas februarii spem veris attulisse, mox sævissima hieme conflictatas. Res anceps : primum omnium a cælo peti legem : deinde eam argumentis esse quærendam. Super omnia est mundi convexitas, terrarumque globi differentia, eodem sidere alio tempore aliis aperiente se gentibus : quo fit ut causa ejus non lisdem diebus ubique valeat. Addidere difficultatem et auclores diversis in locis observando, mox etiam in iisdem diversa prodendo. Très autem fuere sectæ : ''Chaldæa'', ''Ægyptia'', ''Græca''. His addidit apud nos quartam Cæsar dictator, annos ad solis cursum redigens singulos, '''Sosigene''' perito scientiæ ejus adhibito. Et ea ipsa ratio postea comperto errore correcta est : ita ut XII annis continuis non intercalaretur, quia cœperat sidera annus morari, qui prius antecedebat. Et '''Sosigenes''' ipse trinis commentationibus, quanquam diligentior cæteris, non cessavit tamen addubitare, ipse semet corrigendo. Auctores prodidere ea, quos prætexuimus volumini huic, raro ullius sententia cum alio congruente. Minus hoc in reliquis mirum, quos diversi excusaverint tractus. Eorum qui in eadem regione dissedere, unam discordiam ponemus exempli gratia : occasum matutinum Vergiliarum '''Hesiodus''' (nam hujus quoque nomine exstat Astrologia) tradidit fieri, quum æquinoctium autumni conficeretur, '''Thales''' vigesimo quinto die ab æquinoctio, '''Anaximander''' vigesimo nono, '''Euctemon''' XLVIII. Nos sequemur observationem Cæsaris : maximeque hæc erit ''Italiæ'' ratio. Dicemus tamen et aliorum placita : quoniam non unius terræ, sed totius naturæ interpretes sumus, non auctoribus positis (id enim verbosum est), sed regionibus : legentes tantum meminerint, brevitatis gratia, quum ''Altica'' nominata fuerit, simul intelligere ''Cycladas'' insulas ; quum ''Macedonia'', ''Magnesiam'', ''Thraciam'' ; quum ''Ægyptus'', ''Phœnicen'', ''Cyprum'', ''Ciliciam'' ; quum ''Bœotia'', ''Locridem'', ''Phocidem'', et finitimos semper tractus ; quum ''Hellespontus'', ''Cherronesum'', et continentia usque ''Atho'' montem ; quum ''Ionia'', ''Asiam'', et insulas ''Asiæ'' ; quum ''Peloponnesus'', ''Achaiam'', et ad ''Hesperum'' jacentes terras. ''Chaldæi Assyriam'' et ''Babyloniam'' demonstrabunt. ''Africam'', ''Hispanias'', ''Gallias'' sileri non erit mirum. Nemo enim observavit in iis, qui siderum proderet exortus. Non tamen difficili ratione dignoscentur in illis quoque terris digestione circulorum, quam in sexto volumine fecimus : qua cognatio cæli, non gentium modo, verum urbium quoque singularum intelligitur, nota ex his terris, quas nominavimus, sumta convexitate circuli, pertinentis ad quas quisque quæret terras, et ad earum siderum exortus, per omnium circulorum pares umbras. Indicandum et illud, tempestates ipsas ardores suos habere quadrinis annis : et easdem non magna differentia reverti ratione solis : octonis vero augeri easdem, centesima revolvente se luna.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/b24875958_0001/page/n7/mode/2up <u>Histoire Naturelle de Pline.</u>], [https://archive.org/details/b24875958_0001/page/652/mode/2up ''Livre XVIII.''], [https://archive.org/details/b24875958_0001/page/684/mode/2up ''Chap. LVII.''], texte corrigé par [[w:Émile_Littré|M. É. Littré]], à partir de celui de [[w:Jean_Hardouin|Hardouin]], Librairie de Firmin-Didot et C<sup>ie</sup>, Paris, 1883<br />(également disponible une édition de 1831 [https://gallica.bnf.fr/ark:/12148/bpt6k5804072n/f339.item ici] et de 1848 [[s:Page:Pline_l'ancien_-_Histoire_naturelle,_Littré,_T1_-_1848.djvu/708|là]])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''LVII.''' Avant tout, le calcul des jours même de l’année et du mouvement solaire est d’une difficulté presque insurmontable. Aux trois cent soixante-cinq jours on ajoute des jours intercalaires, produits de quarts de jour et de nuit ; de là vient qu’on ne peut indiquer des époques fixes pour les astres. Ajoutez une obscurité des choses avouée de tous : tantôt en effet la mauvaise saison, s’annonçant, anticipe même de plusieurs jours, ce que les Grecs appellent προϰεἰμασις (avant-hiver), et la belle saison retarde, ce qui est nommé ἐπιϰεἰμασις (arriere-hiver) : l’effet du ciel tombe sur la terre tantôt plus vite, tantôt plus tardivement ; et d’ordinaire c’est quand la sérénité est rétablie que nous entendons dire que l’action de l’astre est accomplie. En outre, car tous ces phénomènes dépendent d’astres réglés et fixés au ciel, le mouvement des étoiles amène intercurremment des grêles, des pluies qui ne sont pas non plus d’une faible action, comme nous l’avons enseigné (XVII, 2), et qui troublent l’ordre espéré. Et ne pensons pas que ces méprises n’arrivent qu’à nous; les autres animaux s’y trompent, bien que plus sagaces que nous sur ce point, vu que leur vie en dépend : l’on voit les oiseaux d’été tués par des froids hâtifs ou tardifs, et les oiseaux d’hiver par des chaleurs hâtives ou tardives. Aussi [[w:Virgile|'''Virgile''']] [[#Virgile|<span id="Virgile_back"><sup>'''I'''</sup></span>]] ([[w:Géorgiques|''Georg.'']], I, 335) recommande-t-il d’étudier encore le cours des astres errants, avertissant d’observer le passage de Saturne, planète froide. Il en est qui regardent comme l’indice le plus sûr du printemps l’apparition des papillons, à cause de la délicatesse de cet insecte. Or, l’année même où nous écrivions ceci (an 830 de ''Rome''), il a été noté que les papillons, ayant éclos, furent détruits à trois reprises par le froid, et que les oiseaux étrangers, ayant apporté l’espérance du printemps avant le 6 des calendes de février (27 janvier), eurent bientôt après à essuyer un hiver très-rigoureux. La double difficulté est d’abord d’avoir à demander au ciel la règle de toute chose, puis d’être obligé de contrôler cette règle par des faits apparents. Avant tout signalons la convexité du monde et les différences du globe terrestre, qui font que le même astre se montre à des temps divers suivant les nations, de sorte que l’influence ne s’en fait pas sentir partout aux mêmes jours. La difficulté a été encore accrue par les auteurs qui ont observé en des lieux différents, ou même qui, ayant observé dans les mêmes lieux, ont publié des résultats divergents. Il y a eu trois écoles, la ''Chaldéenne'', l’Égyptienne, la ''Grecque''. Une quatrième a été formée chez nous par le dictateur [[w:Jules_César|'''César''']], qui ramena l’année à la révolution solaire avec l’aide de [[w:Sosigène_d'Alexandrie|'''Sosigène''']] [[#Sosigène|<span id="Sosigène_back"><sup>'''II'''</sup></span>]], astronome habile. Et ce calcul même, où l’on découvrit une erreur, a été corrigé : pendant douze années consécutives on ne fit pas d’intercalation, attendu que l’année, qui auparavant anticipait, maintenant retardait sur les astres. '''Sosigène''' lui-même, quoique plus exact que les autres, n’a pas cessé, dans trois mémoires, de témoigner de ses doutes en se corrigeant lui-même. Les auteurs que nous avons indiqués au commencement de ce livre [[#auteurs_JH|<span id="auteurs_JH_back"><sup>'''1'''</sup></span>]] ont révélé ces discordances, l’avis de l’un s’accordant rarement avec l’avis de l’autre. Cela est moins étonnant dans ceux qui s’excuseront par la différence des lieux. Parmi ceux qui dans le même pays sont en désaccord, nous choisirons un exemple de dissidence : [[w:Hésiode|'''Hésiode''']] [[#Hésiode|<span id="Hésiode_back"><sup>'''III'''</sup></span>]] (car nous avons aussi sous son nom un livre sur les astres) a rapporté que le [[w:Lever_héliaque|''coucher matinal'']] des [[w:Pléiades_(astronomie)|''Pléiades'']] se faisait au moment de l’[[w:Équinoxe_de_septembre|''équinoxe d’automne'']] ; '''Thalès''', qu’il se faisait vingt-cinq jours après cet équinoxe; [[w:Anaximandre|'''Anaximandre''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Anaximandre_back|<sup>🔄</sup>]], vingt-neuf; [[w:Euctémon|'''Euctémon''']] [[#Euctémon|<span id="Euctémon_back"><sup>'''IV'''</sup></span>]], quarante-huit. Quant à nous, nous suivrons les calculs de '''César''' : ils se rapportent spécialement à l’Italie. Toutefois, nous relaterons aussi les opinions des autres ; car nous sommes les interprètes, non d’un seul pays, mais de la nature entière. Nous nommerons, non pas les auteurs, ce qui serait trop long, mais les pays. Les lecteurs auront seulement à se souvenir que, pour abréger, sous le nom d’[[w:Attique|''Attique'']] nous entendons aussi les [[w:Cyclades|''Cyclades'']]; sous celui de [[w:Macédoine_(province_romaine)|''Macédoine'']], la [[w:Magnésie_antique|''Magnésie'']] et la [[w:Thrace_(province_romaine)|''Thrace'']]; sous celui d’[[w:Égypte_romaine_et_byzantine|''Égypte'']], la [[w:Syrie-Phénicie_(province_romaine)|''Phénicie'']], [[w:Chypre_(province_romaine)|''Chypre'']] et la [[w:Cilicie|''Cilicie'']]; sous celui de [[w:Béotie#Antiquité|''Béotie'']], la [[w:Locride_(Grèce)|''Locride'']], la [[w:Phocide#Antiquité_et_période_byzantine|''Phocide'']] et les contrées limitrophes ; sous celui d’[[w:Hellespontique|''Hellespont'']], la [[w:Chersonèse_(cité_grecque)|''Chersonèse'']] et le continent jusqu’au [[w:Mont_Athos|''mont Athos'']]; sous celui d’[[w:Ionie|''Ionie'']], l’Asie et les îles ''Asiatiques'' ; sous celui de [[w:Péloponnèse#Antiquité|''Péloponnèse'']], l’[[w:Achaïe|''Achaïe'']] et les terres situées à l’occident; la [[w:Chaldée|''Chaldée'']] indiquera la [[w:Histoire_de_la_Syrie#Antiquité|''Syrie'']] et la [[w:Babylone_(civilisation)|''Babylonie'']]. On ne s’étonnera pas que je passe sous silence l’[[w:Afrique_romaine|''Afrique'']], l’[[w:Hispanie_romaine|''Espagne'']] et les [[w:Gaule|''Gaules'']], car personne dans ces contrées n’a laissé d’observations sur le lever des astres. Toutefois, il ne sera pas difficile de le calculer, même dans ces contrées, en étudiant la disposition des cercles que nous avons présentés dans le sixième livre (VI, 39). Grâce à cette étude, on connaît les relations astronomiques nou-seulement des nations, mais encore des villes en particulier : étant donnés les cercles déterminés par l’égalité des ombres, on choisit, dans les terres que nous avons nommées, le cercle qui a rapport à la localité objet du problème, et qui détermine en même temps le lever des astres pour cette localité. Il faut encore remarquer (II, 48) que tous les quatre ans les saisons ont leurs excès, et qu’elles reviennent les mêmes sans grande différence, en raison du soleil ; mais que tous les huit ans elles ont un redoublement, à la révolution de la centième lune.</div> <table cellspacing=15 align=center style="margin: 0 4em; font-size:85%;"> <tr> <td style="text-align: justify; margin: 0 4em;">'''[[#auteurs_JH_back|<span id="auteurs_JH"><sup>1</sup></span>]] Ce passage porte à croire que les auteurs dont Pline s’était servi pour composer chacun des livres de son ouvrage avaient été placés en tête du livre auquel ils se rapportaient. Les éditions mettent cette liste d’auteurs à la suite de la table de chaque livre, dans la table générale dressée par Pline lui-même.'''</td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/b24875958_0001/page/n7/mode/2up <u>Histoire Naturelle de Pline.</u>], [https://archive.org/details/b24875958_0001/page/652/mode/2up ''Livre XVIII.''], [https://archive.org/details/b24875958_0001/page/684/mode/2up ''Chap. LVII.''], texte corrigé par [[w:Émile_Littré|M. É. Littré]], à partir de celui de [[w:Jean_Hardouin|Hardouin]] [https://archive.org/details/b24875958_0001/page/708/mode/2up <sup>NOTES</sup>], Librairie de Firmin-Didot et C<sup>ie</sup>, Paris, 1883<br />(également disponible une édition 1848 [[s:Page:Pline_l'ancien_-_Histoire_naturelle,_Littré,_T1_-_1848.djvu/708|ici]])</div> {{Boîte déroulante début|titre=NdA de trad. Jean Hardouin 1883|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Virgile_back|<span id="Virgile"><sup>I</sup></span>]] [[w:Nom_romain|Tria Nomina]] en latin {{Info|Publius|praenomen, nom individuel du citoyen romain}} {{Info|Vergilius|nomen, nom de famille}} {{Info|Maro|cognomen, surnom héréditaire, servant à distinguer les diverses branches d’une même gens}};<br /><p style="margin: 0 2em; text-indent: 15px">Poète latin renommé dans les styles [[w:Épopée|''épique'']] (l’[[w:Énéide|''Énéide'']]), [[w:Poésie_pastorale|''pastorale'']] (les [[w:Bucoliques|''Bucoliques'']]) et [[w:Poésie_didactique|''didactique'']] (les [[w:Géorgiques|''Géorgiques'']]).<br /><p style="text-align: right; margin: 0 2em;">(15 octobre [[w:Années_70_av._J.-C.|-70]], [[w:Virgilio_(Lombardie)#Histoire|''Andes'']], au sud-est de l’actuelle [[w:Lombardie#Histoire|''Lombardie'']], au nord de l’Italie — 21 septembre [[w:Années_19_av._J.-C.|-19]], [[w:Brindisi#Histoire|''Brundisium'']], au sud-est des actuelles [[w:Pouilles#Domination_romaine|''Pouilles'']], au sud-est de l’Italie)<sup>[[w:Ier_siècle_av._J.-C.|⏳]]</sup> <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Sosigène_back|<span id="Sosigène"><sup>II</sup></span>]] Du nom propre grec ancien Σωσῐγένης / Sōsigénēs [[wikt:en:Σωσιγένης#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;">➥ du verbe σῴζω / sṓizō, « 1. Sauver : • Guérir ; • (rare chez Homère) Garder en sécurité, préserver ; • Garder, observer, maintenir ; • (généralement au milieu) Garder à l’esprit, se souvenir ; • Conduire en toute sécurité (à) ; • Secourir ; • Conserver pour. »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ + du nom commun‎ γένος / génos [[wikt:en:γένος#Ancient_Greek|(en)]], « 1. Race, souche, parenté : Descendance directe, par opposition à une relation collatérale. 2. Progéniture, descendant : (collectif) progéniture, postérité. 3. (en général) Race d’êtres : • Famille, clan, maison ; • Tribu, nation, race, en tant que subdivision de ἔθνος / éthnos [[wikt:en:ἔθνος#Ancient_Greek|(en)]] ; • Caste ; • Race d’animaux. 4. Âge, génération, période de la vie. 5. Sexe, genre : (grammaire) Genre grammatical. 6. Classe, sorte, genre : • (logique) L’opposé de εἶδος / eîdos [[wikt:en:εἶδος#Ancient_Greek|(en)]] ; • (taxonomie) Classe : • (taxonomie) Genre ; • Espèce de plante ; culture, produit ; matériau ; • Élément. »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ +‎ du suffixe nominal propre -ης / -ēs [[wikt:en:-ης#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;"> Astronome grec, connu pour avoir participer à la conception du [[w:Calendrier_julien|''calendrier julien'']] (instauré par Jules César en [[w:Années_46_av._J.-C.|-46]]/[[w:Années_45_av._J.-C.|-45]], lorsqu’il était [[w:Pontifex_maximus|''pontifex maximus'']]), avec une année commune de 365 jours divisée en 12 mois, et un jour intercalaire ajouté tous les 4 ans, lors des années bissextiles.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:Ier_siècle_av._J.-C.|I<sup>er</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]]) <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Hésiode_back|<span id="Hésiode"><sup>III</sup></span>]] Du nom propre grec ancien Ἡσῐ́οδος / Hēsíodos;<br /><p style="margin: 0 2em; text-indent: 15px">Poète ''grec'', renommé pour 2 ouvrages :<br /><p style="margin: 0 2em; text-indent: 15px;">• [[w:Théogonie_(Hésiode)|''la Théogonie'']], une généalogie des dieux (dans laquelle il présente la multitude des dieux célébrés par les mythes grecs où trois générations divines se succèdent : celle d’Ouranos, celle de Cronos, celle de Zeus qui sort triomphant) et une cosmogonie (qui retrace la création du monde à partir du Chaos) ;<br /><p style="margin: 0 2em; text-indent: 15px;">• et [[w:Les_Travaux_et_les_Jours|''les Travaux et les Jours'']], un almanac sur l’agriculture à destination de son frère Perses.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:VIIIe_siècle_av._J.-C.|VIII<sup>ème</sup>]] — [[w:VIIe_siècle_av._J.-C.|VII<sup>ème</sup>]] siècles {{Info|AEC|Avant l’Ère Commune}}) <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Euctémon_back|<span id="Euctémon"><sup>IV</sup></span>]] Du nom propre grec ancien Ευκτήμων / Euktémōn;<br /><p style="margin: 0 2em; text-indent: 15px;">Astronome ''athénien'', contemporain et collègue de l’astronome [[w:Méton|Méton]], avec qui, il a fait une série d’observations des [[w:Solstice|''solstices'']] afin de déterminer la durée de l’[[w:Année_tropique|''année tropique'']] [https://ecliptiqc.ca/Almageste_Livre3.php#III1 <sup>Ptolémée, Almageste, liv. III, chap. 1</sup>].<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:Ve_siècle_av._J.-C.|V<sup>ème</sup>]] siècle {{Info|AEC|Avant l’Ère Commune}})'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: center; margin: 0 2em;">Des découvertes astronomiques : part de chaque observateur dans la science.<br /><p style="text-align: justify; text-indent: 15px;">'''LVII.''' D’abord, il est presque impossible de déterminer d’une manière précise le nombre des jours de l’année et le cours du soleil [[#Primum_omnium_dierum_AdG|<span id="Primum_omnium_dierum_AdG_back"><sup>'''1'''</sup></span>]]. Aux trois cent soixante-cinq jours qui composent l’année, on ajoute le quart d’un jour et d’une nuit, pour en faire ensuite un jour intercalaire ; de là il suit qu’on ne saurait indiquer avec précision le moment du lever et du coucher des astres. On convient qu’il y a encore dans cette théorie beaucoup d’obscurité ; en effet, les saisons quelquefois commencent plusieurs jours avant le terme qui leur a été fixé, ce que les ''Grecs'' appellent ''procheimasis'' ; d’autres fois, plusieurs jours après, ce qu’ils appellent ''épicheimasis'' [[#Accedit_confessa_rerum_obscuritas_AdG|<span id="Accedit_confessa_rerum_obscuritas_AdG_back"><sup>'''2'''</sup></span>]]. Presque toujours l’action des astres se fait sentir sur la terre ou plus tôt ou plus tard qu’il ne devrait ; aussi dit-on communément, lorsque le beau temps est revenu, que tel astre a produit son effet. Ces phénomènes dépendent des astres fixés à la voûte des cieux, ainsi que des étoiles, dont les mouvemens particuliers excitent des grêles et des pluies qui sont d’une très-grande conséquence pour les biens de la terre, comme nous l’avons observé, et amènent dans la température des changemens sur lesquels le laboureur ne pouvait compter. Non-seulement les hommes y sont trompés, mais aussi les animaux, bien plus habiles que nous à prévoir ces vicissitudes, puisque d’ailleurs leur vie en dépend ; en effet, on a vu des oiseaux d’été périr par des froids arrivés trop tôt ou trop tard, et des oiseaux d’hiver par des chaleurs également imprévues. Aussi '''Virgile''' veut-il qu’on étudie aussi le cours des ''planètes'', et qu’on observe avec soin le passage du froid ''Saturne'' [[#Ideo_Virgilius_errantium_quoque_siderum_rationem_ediscendam_prœcipit_AdG|<span id="Ideo_Virgilius_errantium_quoque_siderum_rationem_ediscendam_prœcipit_AdG_back"><sup>'''3'''</sup></span>]].<br /><p style="text-align: justify; text-indent: 15px;">Quelques-uns fixent le commencement du printemps à l’apparition des papillons, parce que ces insectes sont fort délicats. Néanmoins on a observé, dans l’année même où j’écris cette partie de mon ouvrage, que le froid, ayant repris trois fois, a fait périr autant de fois les papillons, et que les hirondelles qui, s’étaient montrées dès le 6 des [[w:Calendes|''kalendes'']] de février, et semblaient annoncer le retour du printemps, ont eu à essuyer un rigoureux hiver.<br /><p style="text-align: justify; text-indent: 15px;">C’est donc une science très-problématique que celle de l’influence des astres, et les inductions qu’elle fournit sont fort douteuses [[#Res_anceps_AdG|<span id="Res_anceps_AdG_back"><sup>'''4'''</sup></span>]]. Ce qui augmente la difficulté, c’est la convexité du ciel et la différence des climats de la terre : le même astre se montre ici dans un temps, et là dans un autre ; d’où il suit que son influence ne se fait pas sentir en même temps partout. Pour surcroît d’embarras, les observations recueillies par les auteurs ont été faites dans des lieux différens, et ceux du même pays ne s’accordent pas même entre eux. On compte trois écoles astronomiques, la ''chaldéenne'', l’égyptienne et la ''grecque''. Le dictateur '''César''' en a fondé, chez les ''Romains'', une quatrième, lorsqu’aidé de '''Sosigène''', habile astronome, il fixa la longueur de l’année à une révolution du soleil. On trouva dans la suite que son calendrier était défectueux, parce que l’année, auparavant plus courte, se trouvait alors plus longue que le cours du soleil. Pour y remédier, il fallut, pour douze années consécutives, supprimer les jours intercalaires. '''Sosigène''' lui-même, le mathématicien le plus exact de son temps, après avoir revu jusqu’à trois fois ses calculs, sembla toujours douter de leur justesse, et ne cessa jamais de se corriger lui-même. De tous les auteurs qui ont traité ce sujet, et que nous avons cités au commencement de ce livre, il en est rarement deux qui soient de même avis. Cette divergence d’opinions est moins surprenante et plus excusable chez ceux qui écrivaient en des pays différens. Mais que dire de ceux qui, habitant le même pays, sont néanmoins d’avis différens ? En voici un exemple : '''Hésiode''', qui nous a laissé aussi un ouvrage sur le cours des astres, fixe le coucher matutinal des ''Pléiades'' au moment de l’équinoxe d’automne ; '''Thales''' prétend qu’il n’arrive que vingt-cinq jours après ; '''Anaximandre''' en met vingt-neuf ; '''Euctémon''', quarante-huit.<br /><p style="text-align: justify; text-indent: 15px;">Quant à nous, nous suivrons les calculs de '''César''', qui se rapportent spécialement à l’Italie ; mais nous rapporterons aussi les observations étrangères, car notre plan n’est pas de traiter d’un seul pays, mais de la nature entière. Pour être moins longs, nous citerons les pays, et non les auteurs ; et, pour abréger davantage encore, les lecteurs se souviendront que, sous le nom d’Attique, il faut aussi entendre les ''Cyclades'' ; sous le nom de ''Macédoine'', la ''Magnésie'' et la ''Thrace'' ; sous le nom d’Égypte , la ''Phénicie'', l’île de ''Cypre'' et la ''Cilicie'' ; sous celui de ''Béotie'', la ''Locride'', la ''Phocide'' et les contrées voisines ; sous le nom d’Hellespont, la ''Chersonèse'' et partie du continent jusqu’au mont ''Athos'' ; sous le nom de l’Ionie, l’Asie et les îles ''Asiatiques'' ; sous le nom du ''Péloponnèse'', l’Achaïe et les pays adjacens au couchant ; enfin sous le nom de ''Chaldée'', l’Assyrie et la ''Babylonie''. On ne sera pas étonné que nous ne parlions ni de l’Afrique, ni de l’Espagne, ni des ''Gaules''. Aucun auteur dans ces contrées n’a laissé d’observations sur le lever ou le coucher des astres. Il ne sera pas difficile néanmoins de déterminer l’époque de ces phénomènes dans ces contrées, en étudiant la disposition des cercles, telle que nous l’avons présentée dans le sixième livre. Par ce moyen, on déterminera la position astronomique, non-seulement de chaque pays, mais encore de chaque ville dont nous avons pu parler, en prenant par les ombres égales de tous les cercles, une portion du cercle de telle contrée qu’on voudra choisir, et en calculant son rapport avec le lever des astres. Il faut faire observer encore que tous les quatre ans les chaleurs reviennent à peu près les mêmes pour chaque saison, en raison du mouvement du soleil, et que toutes les huitièmes années elles sont plus fortes, à cause de la centième lunaison.</div> <table cellspacing=15 align=center style="margin: 0 4em; font-size:85%;"> <tr> <td style="text-align: justify; margin: 0 4em;">'''[[#Primum_omnium_dierum_AdG_back|<span id="Primum_omnium_dierum_AdG"><sup>1</sup></span>]] Cf. sur la plupart des difficultés que le texte de notre auteur révèle, les notes relatives à l’astronomie, au livre II. L’année romaine fut d’abord celle des [[w:Albe_la_Longue|''Albains'']], c’est-à-dire lunaire ; dix mois la composaient, mars en était le premier : elle avait cinquante jours de moins que l’année lunaire réelle, et soixante-un de moins que l’année solaire, c’est-à-dire trois cent quatre jours seulement ; c’était là l’[[w:Calendrier_romain|{{Info|''année de Romulus''|le calendrier dit romuléen}}]]. [[w:Calendrier_romain|{{Info|''Numa''|le calendrier dit pompilien}}]] ajouta deux mois à cette année, janvier et février, et elle se trouva être composée de trois cent cinquante-cinq jours. Elle demeura ainsi jusqu’à Jules César, où commence l’[[w:Calendrier_julien|''année julienne'']], qui se compose de trois cent soixante-cinq jours, huit heures, auxquels [[w:Calendrier_grégorien|''Grégoire le Grand'']] ajouta onze minutes, pour arriver à la plus grande exactitude possible.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Accedit_confessa_rerum_obscuritas_AdG_back|<span id="Accedit_confessa_rerum_obscuritas_AdG"><sup>2</sup></span>]] L’entrée du soleil dans tel ou tel signe du zodiaque, son passage à l’équateur, etc., ne sont pas toujours le signal d’un changement dans la température. [[w:Végèce|Végèce]] a parlé des jours prokéimasiques et épikéiniasiques :''' {{Info|''Aut enim circa diem statutum, aut ante, vel postea, tempestates fieri, compertum est : unde præcedentes, ωροϰεἰμασιν : nascentes die solenni, επιϰεἰμασιν : subsequentes, μεταϰεἰμασιν, græco vocabulo nuncuperaverunt''|Car on a constaté que les tempêtes se produisent soit vers le jour fixé, soit avant, soit après : d’où les précédents, ωροϰεἰμασιν : nés le jour solennel, επιϰεἰμασιν : les suivants, μεταϰεἰμασιν, étaient appelés par le mot grec. TdA.}} '''(IV, 40).''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Ideo_Virgilius_errantium_quoque_siderum_rationem_ediscendam_prœcipit_AdG_back|<span id="Ideo_Virgilius_errantium_quoque_siderum_rationem_ediscendam_prœcipit_AdG"><sup>3</sup></span>]] <p style="margin: 0 6em; text-indent: 0px">'''{{Info|Hoc metuens, cæli menses et sidera serva,<br />Frigida Saturni sese quo stella receptet.|Craignant cela, gardez les lunes et les étoiles du ciel, le froid de Saturne lui-même, où l’étoile les recevra. TdA.}}'''<p style="text-align: right; margin: 0 6em; text-indent: 0px">''Georg.'', I, 335.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Res_anceps_AdG_back|<span id="Res_anceps_AdG"><sup>4</sup></span>]] Voici enfin quelques idées philosophiques qui se trouvent sous la plume de Pline ; malheureusement la cause par laquelle notre auteur explique l’influence des astres est problématique, et montre que les sciences astronomiques des anciens laissaient beaucoup à désirer. Les Grecs croyaient qu’il y avait autant de cieux que de planètes ; le huitième ciel, ou le firmament, était celui dès étoiles fixés.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Occasum_matutinum_Vergiliarum_Hesiodus_AdG_back|<span id="Occasum_matutinum_Vergiliarum_Hesiodus_AdG"><sup>5</sup></span>]] L’ouvrage auquel Pline fait allusion a été mentionné par [[w:Théon_d'Alexandrie|Théon]] qui le nomme Αστριϰὴ βίϐλος [[w:en:Astronomia_(poem)|(en)]]. Cet ouvrage est perdu.'''</td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k5804072n <u>Histoire Naturelle de Pline. Tome Onzième</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k5804072n/f196.item ''Livre XVIII.''], [https://gallica.bnf.fr/ark:/12148/bpt6k5804072n/f340.item ''chap. LVII.''], traduction nouvelle par M. [[w:Stéphane_Ajasson_de_Grandsagne|Ajasson de Grandsagne]] [https://gallica.bnf.fr/ark:/12148/bpt6k5804072n/f453.item <sup>NOTES</sup>], C. L. F. Panckoucke, Paris, 1829</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: center; margin: 0 2em;">''Divi[[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki />ion des jours & des nuits [[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki />uivant le cours du Soleil ; lever & coucher des étoiles ; ordre des [[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki />ai[[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki />ons ; tems où l’on [[w:S_long|{{Info|ſ|forme ancienne longue de la lettre s minuscule}}]]<nowiki />eme les bleds d’hiver.''<br /><p style="text-align: justify; text-indent: 15px;">'''D'''’ABORD il e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t pre{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que impo{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ible de déterminer au ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te le nombre des jours de l’année, & le cours du Soleil ; car comme aux trois cents {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oixante & cinq jours dont l’année e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t compo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ée, on ajoute le quart d’un jour & d’une nuit, autrement {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ix heures, qui, au bout de quatre ans, font un jour intercalaire [[#jour_intercalaire_LPdS|<span id="jour_intercalaire_LPdS_back"><sup>'''1'''</sup></span>]], il arrive qu’on ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}auroit a{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}igner avec certitude le tems du lever & du coucher des a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tres. En {{Info|ſ|forme ancienne longue de la lettre s minuscule}}econd lieu, l’on convient qu’il y a dans cette théorie beaucoup d’ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}curité ; car quelquefois les {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ons [[#quelques_les_saisons_LPdS|<span id="quelques_les_saisons_LPdS_back"><sup>'''2'''</sup></span>]] commencent plu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ieurs jours avant le terme qui leur a été fixé, ce que les Grecs appellent ''prokheïma{{Info|ſ|forme ancienne longue de la lettre s minuscule}}is'' ; & d’autres fois plu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ieurs jours après, ce que ces mêmes Grecs expriment par le mot ''epikheïma{{Info|ſ|forme ancienne longue de la lettre s minuscule}}is'' : & l’on éprouve très {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ouvent que l’action des a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tres {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ait {{Info|ſ|forme ancienne longue de la lettre s minuscule}}entir {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur la terre, tantôt plutôt, tantôt plus tard. Au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i dit-on communément, lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que le beau tems e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t revenu, que tel a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tre a produit {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on effet. D’ailleurs comme tout cela dépend des globes céle{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tes, leur mouvement relatif excite quelquefois des grêles & des pluies, qui, comme nous l’avons déja [[#déjà_fait_observer_LPdS|<span id="déjà_fait_observer_LPdS_back"><sup>'''3'''</sup></span>]] fait ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}erver, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont de la plus grande con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}équence pour les biens de la terre, & qui renver{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ent l’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pérance qu’on avoit du beau tems. Et non {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement les hommes y {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont trompés, mais au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i les animaux, quoiqu’ils aient bien plus de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}agacité que nous pour pre{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}entir ces vici{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}itudes du ciel, d’autant que leur vie en dépend. En effet, on voit quelquefois les oi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}eaux d’été mourir par des froids qui viennent trop tard ou trop tôt, & les oi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}eaux d’hiver par des chaleurs qui arrivent de même. C’est pourquoi '''Virgile''' veut qu’on étudie au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i le cours des planetes, & qu’on ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}erve à quelle partie du zodiaque répond la planete du froid Saturne [[#Saturne_LPdS|<span id="Saturne_LPdS_back"><sup>'''4'''</sup></span>]]. Quelques-uns croient que le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}igne le plus certain du printems commencé, c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’on voit des papillons, & cela parceque ces in{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ectes {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont fort délicats. Néanmoins on a remarqué que dans l’année même [[#lAnnée_dÉcriture_LPdS|<span id="lAnnée_dÉcriture_LPdS_back"><sup>'''5'''</sup></span>]] où j’écris ceci, le froid ayant recommencé ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’à trois fois, a fait mourir autant de fois les papillons ; & que les hirondelles, qui, s’étant montrées dès le vingt-{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ept de Janvier, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}embloient annoncer le retour du printems, ont en{{Info|ſ|forme ancienne longue de la lettre s minuscule}}uite e{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}uyé un très cruel hiver.<br /><p style="text-align: justify; text-indent: 15px;">C’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t donc une {{Info|ſ|forme ancienne longue de la lettre s minuscule}}cience très problématique que celle de l’influence des a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tres, & les inductions que l’on en tire {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont fort douteuses. Mais ce qui cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e le plus d’incertitude, c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t cette convexité du ciel & la différence des climats de la terre, parceque le même a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tre {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e montre ici dans un tems, & là dans un autre, d’où il ré{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ulte que {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on influence ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e fait pas {{Info|ſ|forme ancienne longue de la lettre s minuscule}}entir en même tems par-tout. Un autre {{Info|ſ|forme ancienne longue de la lettre s minuscule}}urcroît de difficulté, c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t que les ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervations recueillies par les Auteurs ont été faites en différents lieux, & que ceux même qui ont écrit dans le même endroit ne s’accordent nullement entre eux dans ce qu’ils écrivent. On compte ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’à trois différentes {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ortes de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ectes en A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tronomie ; {{Info|ſ|forme ancienne longue de la lettre s minuscule}}avoir, celle des Chaldéens [[#secte_des_Chaldéens_LPdS|<span id="secte_des_Chaldéens_LPdS_back"><sup>'''5*'''</sup></span>]], celle des Egyptiens & celle des Grecs. On peut même dire que le Dictateur Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar [[#Dictateur_César_LPdS|<span id="Dictateur_César_LPdS_back"><sup>'''6'''</sup></span>]] en produi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}it, chez les Romains, une quatrieme, lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’il rédui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}it chaque année au cours du {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oleil, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervant à cet effet du travail de So{{Info|ſ|forme ancienne longue de la lettre s minuscule}}igene, très habile A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tronome. Néanmoins on découvrit en{{Info|ſ|forme ancienne longue de la lettre s minuscule}}uite que le calendrier de Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar étoit défectueux [[#calendrier_César_défectueux_LPdS|<span id="calendrier_César_défectueux_LPdS_back"><sup>'''7'''</sup></span>]], parceque l’année qui auparavant étoit plus courte que le cours du {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oleil, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e trouvoit alors plus longue : & pour corriger cette erreur, on ordonna que pendant douze années de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uite, il n’y auroit point de jour intercalaire [[#correction_erreur_LPdS|<span id="correction_erreur_LPdS_back"><sup>'''8'''</sup></span>]]. So{{Info|ſ|forme ancienne longue de la lettre s minuscule}}igene lui-même, quoique Mathématicien plus exact que les autres, ne lai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}a pas de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e conduire con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tamment en homme qui doutoit de la ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}e de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on propre calcul, pui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’il en fit ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’à trois différentes corrections. De tous les Auteurs [[#Auteurs_calendrier_LPdS|<span id="Auteurs_calendrier_LPdS_back"><sup>'''9'''</sup></span>]] qui ont écrit {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur cette matiere, & que nous avons allégués au commencement de ce livre, il s’en trouve rarement deux qui {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oient de même {{Info|ſ|forme ancienne longue de la lettre s minuscule}}entiment. Cette variété e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t moins {{Info|ſ|forme ancienne longue de la lettre s minuscule}}urprenante, comme au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i plus excu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}able, chez ceux qui écrivoient en des pays différents. Mais que dire de ceux qui, écrivant dans le même pays, n’ont pas lai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}é d’être partagés d’opinion ? En voici un exemple. '''Hé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iode''', dont il y a au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i un ouvrage [[#ouvrage_astronomique_Hésiode_LPdS|<span id="ouvrage_astronomique_Hésiode_LPdS_back"><sup>'''10'''</sup></span>]] {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur le cours des a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tres, dit que les Pléiades {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e couchent le matin dans le tems même de l’équinoxe d’automne. '''Thalès''' [[#opinion_Thalès_Hésiode_Anaximandre_LPdS|<span id="opinion_Thalès_Hésiode_Anaximandre_LPdS_back"><sup>'''11'''</sup></span>]] dit que cela arrive vingt-cinq jours après. '''Anaximandre''' en met vingt-neuf ; '''Euctémon''' [[#Euctémon_LPdS|<span id="Euctémon_LPdS_back"><sup>'''12'''</sup></span>]] quarante-huit.<br /><p style="text-align: justify; text-indent: 15px;">Quant à nous, nous {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivrons le calcul de Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar, ayant principalement égard à l’Italie. Nous ne lai{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}erons néanmoins de rapporter les opinions étrangeres, parceque notre objet n’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t pas de traiter d’un {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eul pays, mais de la Nature entiere. Seulement, pour éviter les longueurs, nous n’indiquerons que les pays où chaque opinion a lieu, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ans faire mention des auteurs de ces a{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ertions : & pour abréger encore davantage, les Lecteurs voudront bien {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ouvenir que quand il e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t parlé de l’Attique, il faut, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous ce nom, entendre au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i les Cyclades ; que {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous le nom de Macédoine, il faut entendre au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i la Magné{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ie & la Thrace ; {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous le nom de l’Egypte, la Phénicie, l’i{{Info|ſ|forme ancienne longue de la lettre s minuscule}}le de Chypre & la Cilicie; {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous celui de la Béotie, la Locride, la Phocide & les contrées voi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ines ; {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous le nom de l’Hel le{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pont, la pre{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’i{{Info|ſ|forme ancienne longue de la lettre s minuscule}}le de Thrace & le pays de terre ferme, ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’au mont Athos ; {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous le nom de l’Ionie, l’A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ie & les i{{Info|ſ|forme ancienne longue de la lettre s minuscule}}les A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iatiques ; {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous le nom du Péloponne{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e, l’Achaïe & les contrées [[#contrées_adjacentes_ouest_Péloponnese_LPdS|<span id="contrées_adjacentes_ouest_Péloponnese_LPdS_back"><sup>'''13'''</sup></span>]] adjacentes qu’elle a à {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on couchant ; {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous le nom des Chaldéens, l’Assyrie & la Babylonie. Il ne faudra pas s’étonner {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i je ne parle ici ni de l’Afrique, ni de l’Espagne, ni des Gaules, pui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que ces pays n’ont eu aucun Auteur qui ait écrit du cours des a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tres, ni de leur lever. Toutefois il ne {{Info|ſ|forme ancienne longue de la lettre s minuscule}}era pas difficile de connoître le tems où ils {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e levent dans ces pays-là même, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i l’on e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t in{{Info|ſ|forme ancienne longue de la lettre s minuscule}}truit de l’arrangement des cercles céle{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tes, tel que nous l’avons expliqué au {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ixieme livre de cet ouvrage ; car, par ce moyen, & par les {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eules notions que nous avons expo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ées en donnant une nomenclature des lieux, on {{Info|ſ|forme ancienne longue de la lettre s minuscule}}aura la po{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ition, non {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement de chaque pays, mais encore de chaque ville, en prenant par les ombres égales de tous les cercles, un {{Info|ſ|forme ancienne longue de la lettre s minuscule}}egment du cercle de tel pays qu’on voudra choi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ir, & en cherchant {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on rapport avec le lever des a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tres. Il faut remarquer au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i que de quatre [[#Columelle_LPdS|<span id="Columelle_LPdS_back"><sup>'''14'''</sup></span>]] en quatre ans les {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ons & les chaleurs reviennent à peu près les mêmes, & cela à cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e du mouvement du Soleil ; & que de huit en huit ans ces mêmes chaleurs reviennent plus con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}idérables, en vertu de la centieme lunai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}on.</div> {{Boîte déroulante début|titre=Notes du traducteur|alignT=center}} <div style="text-align: justify; border: 2px; border-radius:15px; font-size:85%;"><br/> <table cellspacing=15 align=center style="margin: 0 4em;"> <tr> <td style="text-align: justify; margin: 0 4em; text-indent: 15px">'''[[#jour_intercalaire_LPdS_back|<span id="jour_intercalaire_LPdS"><sup>1</sup></span>]] Con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ultez, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur toute cette que{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tion, nos notes 13 & 14 {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur le huitieme chapitre du {{Info|ſ|forme ancienne longue de la lettre s minuscule}}econd livre de Pline, tome 1, p. 41 & 42 :<br /><p style="text-align: justify; text-indent: 15px; margin: 0 5em;">(13) [[w:Suétone|Suétone]] s’exprime mieux, lor{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’il écrit : chaque quatrieme année ''quarto quoque anno''. Il est vrai que, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}elon le [[w:Jean_Hardouin|Pere Hardouin]], il faut comprendre dans la période de cinq ans, dont parle Pline, la premiere & la cinquieme année comme Bi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}extiles ; ce qui revient aux quatre années de Suétone, dont la quatrieme avoit un ''bi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ex'' ; mais en vérité cette explication est des plus forcées. Je {{Info|ſ|forme ancienne longue de la lettre s minuscule}}erois donc d’avis qu’il faudroit lire dans Pline comme dans Suétone, ''quarto anno'', {{Info|ſ|forme ancienne longue de la lettre s minuscule}}i nous n’apprenions d’ailleurs de cet Hi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}torien, que dès le regne d’Augu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te il s’étoit déja gli{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}é plu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ieurs abus & altérations dans l’année Julienne. On voit du moins qu’il y réforma plu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ieurs cho{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es, sous prétexte de la remettre {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur le pied où Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar l’avoit in{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tituée. Cela me donneroit à pen{{Info|ſ|forme ancienne longue de la lettre s minuscule}}er qu’on fit dès-lors attention à la fau{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}eté & à l’excédence du calcul Julien ; mais qu’Augu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te, par respect pour la mémoire de Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar, affecta d’imputer la faute à la négligence des Prêtres chargés à Rome de l’in{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pection du Calendrier ; qu’au demeurant, on découvrit l’abus, & qu’on e{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}aya d’y remédier, en n’ajoûtant un jour entier à l’année ordinaire que chaque ''cinquieme année'' comme Pline paroît l’articuler ici expre{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ement. Mais d’ailleurs il e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t évident qu’à la longue le période bi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}extile de quatre années en quatre années prévalut {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur celui de chaque cinquieme année, dont parle Pline ; & même il paroît que ceux qui, par la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uite, voulurent {{Info|ſ|forme ancienne longue de la lettre s minuscule}}upputer les tems, récapitulerent, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ans exception, toutes les bi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}extiles quartenaires écoulées depuis l’in{{Info|ſ|forme ancienne longue de la lettre s minuscule}}titution Julienne ; car en 1582, on trouva par ce moyen que l’année étoit reculée de dix jours & plus; d’autant que l’excédence du calcul Julien, qui {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uppo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e à l’année révolue 365 jours & {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ix heures, au lieu de 365 jours 5 heures 49 minutes, 8 {{Info|ſ|forme ancienne longue de la lettre s minuscule}}econdes 17 tierces & 13 quarts qu’elle a réellement, forme tous les ans environ 11 minutes de trop, & tous les cent trente-quatre ans un jour entier d’excès. Le Pape Grégoire XIII trouvant donc l’année reculée de plus de dix jours ; ce qui dérangeoit l’économie annuelle des {{Info|ſ|forme ancienne longue de la lettre s minuscule}}olemnités, remédia à cet inconvénient en retranchant de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on autorité dix jours au mois d’Octobre de l’année 1582, où l’on étoit alors ; & en réglant qu’à l’avenir tous les quatre cents ans on omettroit trois années bi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}extiles. Ce réglement devint une loi pour pre{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que toute l’Europe chrétienne. L’autre maniere de compter fut appellée l’ancien {{Info|ſ|forme ancienne longue de la lettre s minuscule}}tyle. La Grande-Bretagne a long-tems per{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i{{Info|ſ|forme ancienne longue de la lettre s minuscule}}té à s’en {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervir malgré {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on abus manife{{Info|ſ|forme ancienne longue de la lettre s minuscule}}te. Enfin le Parlement d’Angleterre, par acte du mois de Septembre 1752, a adopté la réforme Grégorienne.<br /><p style="text-align: justify; text-indent: 15px; margin: 0 4em;">(14) Le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oleil, en fai{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ant le tour du cercle oblique, parcourt réellement 360 degrés ou {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ections ; pui{{Info|ſ|forme ancienne longue de la lettre s minuscule}}que tout cercle {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e divi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e en 360 parties appellées degrés : mais la me{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ure de chaque degré du cercle parcouru annuellement par le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oleil, excede tant {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oit peu, c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t-à-dire de quelques légeres fractions de tems, la durée de chacun de nos jours révolus ; durée qui n’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t, comme on {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ait, que de 24 heures préci{{Info|ſ|forme ancienne longue de la lettre s minuscule}}es ; le{{Info|ſ|forme ancienne longue de la lettre s minuscule}}quelles, comparées à un degré, en produi{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ent, au bout de l’année, 365 & plus pour le cercle, au lieu de 360 {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eulement que le cercle requerroit. D’après une connoi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ance con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}u{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e de ces principes, Jules Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e voyant Dictateur, Grand-Pontife, & maître du monde, entreprit, l’an 140 avant J. C. de réformer les abus qui s’étoient gli{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}és, tant dans l’année Pompilienne, ou de Numa, que dans celle des Pontifes, encore plus irréguliere que celle de Numa. A cet effet, il fit venir d’Alexandrie le Philo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ophe So{{Info|ſ|forme ancienne longue de la lettre s minuscule}}igenes. Celui-ci décida fau{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ement que le cercle des jours de l’année révolue excédoit du nombres 5 joint au quart de 1 les 360 degrés du cercle oblique parcouru par le {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oleil : expo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}é faux, auquel le Dictateur, occupé d’autres {{Info|ſ|forme ancienne longue de la lettre s minuscule}}oins, déféra {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ans autre examen. Jules Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar régla donc, de l’avis de {{Info|ſ|forme ancienne longue de la lettre s minuscule}}on A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tronome, que l’année {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit divisée en 365 jours ; & quant au quart de jour re{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tant, qui produit {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ix heures, il ordonna qu’on n’y auroit aucun égard pour chaque année particuliere ; mais que chaque quatrieme année on réuniroit la totalité de quatre fois {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ix heures, qui en font vingt-quatre, pour en compo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}er un jour entier; & qu’ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i cette quatrieme année auroit 366 jours. Il régla de plus, que ce jour intercalaire, ou ajoûté à chaque quatrieme année, seroit le 24 Février. Les Romains nommoient ce jour-là ''bis {{Info|ſ|forme ancienne longue de la lettre s minuscule}}exto calendas Martii'', c’est-à-dire, le ''{{Info|ſ|forme ancienne longue de la lettre s minuscule}}econd {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ixieme avant les calendes de Mars'' ; d’où il arriva que l’année où tomboit ce jour intercalaire fut appellée bis-{{Info|ſ|forme ancienne longue de la lettre s minuscule}}extile.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#quelques_les_saisons_LPdS_back|<span id="quelques_les_saisons_LPdS"><sup>2</sup></span>]] Végece dit pareillement, liv. 4, chap. 40 : ''Aut enim circa diem {{Info|ſ|forme ancienne longue de la lettre s minuscule}}tatutum, aut ante, vel po{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tea, tempe{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tates fieri compertum e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t : unde præcedentes, ωροϰεἰμασιν : na{{Info|ſ|forme ancienne longue de la lettre s minuscule}}centes die {{Info|ſ|forme ancienne longue de la lettre s minuscule}}olenni, επιϰεἰμασιν : {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ub{{Info|ſ|forme ancienne longue de la lettre s minuscule}}equentes, μεταϰεἰμασιν, Græco vocabulo nuncuperaverunt'' [[#Accedit_confessa_rerum_obscuritas_AdG_back|<sup>⤴️</sup>]]. On lit au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i chez [[w:Columelle|Columelle]], dans {{Info|ſ|forme ancienne longue de la lettre s minuscule}}a Préface :''' {{Info|''Neque enim ſemper eumdem, cælum & annus, velut ex præſcripto habitum gerunt : nec omnibus annis eodem vultu venit aſtas, aut hyems, &c.''|Car le ciel et l’année ne portent pas toujours le même habit, comme par un précepte : ni l’automne n’arrive chaque année avec la même apparence, ni l’hiver, etc. TdA}} </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#déjà_fait_observer_LPdS_back|<span id="déjà_fait_observer_LPdS"><sup>3</sup></span>]] Au liv. 17, chap. 2.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Saturne_LPdS_back|<span id="Saturne_LPdS"><sup>4</sup></span>]] Ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i qu’il l’in{{Info|ſ|forme ancienne longue de la lettre s minuscule}}inue dans {{Info|ſ|forme ancienne longue de la lettre s minuscule}}es ''Géorg.'' liv. I, v. 335 :'''<br /><p style="margin: 0 6em; text-indent: 0px">{{Info|Hoc metuens, cæli menses et sidera serva,<br />Frigida Saturni sese quo stella receptet.|Craignant cela, gardez les lunes et les étoiles du ciel, le froid de Saturne lui-même, où l’étoile les recevra. TdA.}} </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#lAnnée_dÉcriture_LPdS_back|<span id="lAnnée_dÉcriture_LPdS"><sup>5</sup></span>]] Pline, au quatorzieme livre, chap. 4, comptoit deux cents trente ans depuis la mort de [[w:Cicéron|Cicéron]] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Cicéron_I|<sup>🔄</sup>]], arrivée l’an de Rome 600. L’année qu’il indique ici, & où il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e trouvoit avoir compo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}é quatre livres de plus, e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t probablement la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivante, c’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t-à-dire l’année 831 de la fondation de Rome.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#secte_des_Chaldéens_LPdS_back|<span id="secte_des_Chaldéens_LPdS"><sup>5*</sup></span>]] Sur l’année Chaldéenne, qui étoit la même que la Judaïque, con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ultez [[w:Eusèbe_de_Césarée|Eu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ebe]], ''Præpar. Evang.'' liv. 9, chap. 17, où il fait Abraham inventeur de l’a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tronomie chez les Chaldéens. Les A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}trologues Chaldéens étoient ordinairement des Prêtres des Dieux, tels que [[w:Bérose|Béro{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e]], auquel les Athéniens éleverent dans leur Gymna{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e une {{Info|ſ|forme ancienne longue de la lettre s minuscule}}tatue à langue dorée. Sur quoi voyez Pline, liv. 7, chap. 37. Ce Béro{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e étoit un Prêtre de [[w:Bēl|Belus]] ; il e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}t cité par [[w:Clément_d'Alexandrie|Clément d’Alexandrie]], & par [[w:Flavius_Josèphe|Jo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}eph]] [[#Flavius_Josèphe_I|<sup>⤵️</sup>]], contre Apion, liv. 1. Sur l’année Egyptienne, & {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur l’ancienne année Grecque, con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ultez [[w:Hérodote|Hérodote]] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Hérodote_I|<sup>🔄</sup>]] liv. 2, n°. 4. Cicéron rend ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tice à l’étude que firent des a{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tres les Egyptiens & les Babyloniens, liv. 1, de ''Divinat.'' n°. 16 :''' {{Info|''Ægyptii, & Babylonii, in camporum patentium aquoribus habitantes, cùm ex terra nihil emineret, quod contemplationi cæli officere poſſet, omnem curam in ſiderum cognitione poſuerunt''|Les Égyptiens et les Babyloniens, vivant dans les eaux des plaines découvertes, alors que rien ne dépassait de la terre qui pût gêner la contemplation du ciel, mettaient tous leurs soins dans la connaissance des étoiles. TdA}}. </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Dictateur_César_LPdS_back|<span id="Dictateur_César_LPdS"><sup>6</sup></span>]] Voyez les notes 13 & 14 {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur le chap. 8 du liv. 2, tome 1, p. 41 & 42.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#calendrier_César_défectueux_LPdS_back|<span id="calendrier_César_défectueux_LPdS"><sup>7</sup></span>]] Voyez les notes indiquées dans la note précédente ; & joignez-y les ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervations {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivantes, qui {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont de M. De{{Info|ſ|forme ancienne longue de la lettre s minuscule}}places, p. 339 : « Le calendrier chrétien, ayant {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivi la réformation de Jules Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar, il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e trouva qu’en l’année 1582, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ous le Pape Grégoire XIII, l’équinoxe étoit remontée ju{{Info|ſ|forme ancienne longue de la lettre s minuscule}}qu’au 11 de Mars, au lieu du 21, où elle devoit être. Ce Pape, après avoir con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ulté Clavius & Ciaconius, les plus habiles A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tronomes du tems, ordonna qu’en cette même année 1582, on compteroit le 5 du mois d’Octobre, au lieu du 15, afin de retrancher les dix jours qui s’étoient gli{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}és de trop, en {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uivant la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}upputation Julienne, depuis le Concile de Nicée, tenu en 325 : on convint encore de continuer l’intercalation d’un jour tous les quatre ans ; & qu’en outre, pour éviter dans la {{Info|ſ|forme ancienne longue de la lettre s minuscule}}uite pareille erreur, il {{Info|ſ|forme ancienne longue de la lettre s minuscule}}eroit fait un retranchement de trois jours intercalaires, dans l’e{{Info|ſ|forme ancienne longue de la lettre s minuscule}}pace de quatre {{Info|ſ|forme ancienne longue de la lettre s minuscule}}iecles, à cau{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e des onze minutes qui manquent aux {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ix heures des années, dont on compo{{Info|ſ|forme ancienne longue de la lettre s minuscule}}e l’année intercalaire, ou bi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}extile ; ces trois jours {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e retranchent en l’année qui finit les trois premiers {{Info|ſ|forme ancienne longue de la lettre s minuscule}}iecles. De célebres A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}tronomes modernes ont fait voir que, malgré cette précaution, il y auroit encore, au bout de quatre cents ans, plu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ieurs jours de variation dans l’équinoxe ».''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#correction_erreur_LPdS_back|<span id="correction_erreur_LPdS"><sup>8</sup></span>]] Etabli par Jules Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar, & qui revenoit tous les quatre ans. Ecoutons Suétone, vie de ce Dictateur, chap. 40 : {{Info|''Faſtos correxit, jampridem vitio Pontiſicum, per intercalandi licentiam adeo turbatos, ut neque meſſium feria aſtati, neque vindemiarum autumno competerent, annumque ad curſum ſolis accommodevit, ut CCCLXV dierum eſſet, & intercalario menſe ſublato, unus dies quarto quoque anno intercalaretur, &c''|Il corrigea les jeûnes, qui avaient toujours été une faute pontique, si perturbés par la permission de l’intercalation, que ni les fêtes du mois ne tenaient, ni les récoltes ne correspondaient à l’automne, et il ajusta l’année à la course du soleil, de sorte que c’était 365 jours, et après le mois intercalaire, un jour était intercalé tous les quatre ans, etc. TdA}}. On s’apperçut que cette correction de Jules Cé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ar étoit elle-même fautive. On tenta de nouveau de remédier au vice du calendrier ; {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur quoi con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ultez Solin, chapitre 1, p. 5 ; le P. Petau, ''de Doctr. temp.'' chap. 3 ; mais {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur-tout [[w:Macrobe|Macrobe]], qui s’exprime ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i, liv. 1, ''Saturn.'' chap. 14, p. 255 :''' {{Info|''Sacerdotes ſibi errorem novum ex ipſa emendatione ſecerunt. Nam cùm oporteret diem, qui ex quadrantibus conſit, quarto quoque anno conſecto, antequam quintus inciperet, intercalare, illi quarto non peracto ſed incipiente, intercalabant. Hic error ſex & triginta annis permanſit : quibus annis intercalati ſunt dies duodecim, cùm deberent intercalari novem. Sed hunc quoque errorem ſerò deprehenſum correxit Auguſtus, qui annos duodecim ſine intercalari die tranſigi juſſit : ut illi tres dies, qui per annos triginta & ſex vitio ſacerdotalis ſeſtinationis excreverant, ſequentibus annis duodecim, nullo die intercalato, devorarentur. Poſt hoc unum diem, ſecundùm ordinationem Caſaris, quinto quoque incipiente anno intercalari juſſit : & omnem hunc ordinem area tabula ad aternam cuſtodiam inciſione mandavit.''|Les prêtres retranchèrent une nouvelle erreur de leur correction. Car lorsqu’il fallait intercaler le jour qui est composé de quadrants, la quatrième année consécutive, avant que la cinquième ne commence, on intercalait ceux lorsque la quatrième n’était pas terminée mais commençait. Cette erreur a duré trente-six ans : années au cours desquelles douze jours ont été intercalés, alors qu’il aurait fallu en intercaler neuf. Mais cette erreur fut également détectée par Auguste, qui ordonna que douze années s’écoulèrent sans jour intercalaire : afin que ces trois jours, qui avaient été excrétés pendant les trente-six années du vice sacerdotal de cessation, soient dévorés dans le douze années suivantes, sans jour intercalaire. Après ce jour, selon l’ordonnance de César, il décréta que la cinquième année serait également intercalée : et tout l’ordre fut ordonné d’être gravé par le conseil du domaine pour la garde éternelle. TdA}}. </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Auteurs_calendrier_LPdS_back|<span id="Auteurs_calendrier_LPdS"><sup>9</sup></span>]] Ces Auteurs {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ont Hiéron, Philomêtor, Attale, Archelaüs, Xénophon, Magon, Caton, Silanus, Varron, &c. dont Pline a fait mention {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur la fin du chapitre 3.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#ouvrage_astronomique_Hésiode_LPdS_back|<span id="ouvrage_astronomique_Hésiode_LPdS"><sup>10</sup></span>]] Nous apprenons de Théon que cet ouvrage {{Info|ſ|forme ancienne longue de la lettre s minuscule}}e nommoit l’A{{Info|ſ|forme ancienne longue de la lettre s minuscule}}trique, Ἀςριϰὴ ϐίϐλος. Voyez au{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}i {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur ce même ouvrage, une Epigramme de [[w:Callimaque_de_Cyr%C3%A8ne|Callimaque]] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Callimaque_I_de_Cyrène_II|<sup>🔄</sup>]], citée dans la vie d’Aratus, qui fait partie de l’Uranologie de [[w:Denis_Pétau|Petau]], liv. 2, ''Var. Di{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ert.'' chap. 9, p. 97.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#opinion_Thalès_Hésiode_Anaximandre_LPdS_back|<span id="opinion_Thalès_Hésiode_Anaximandre_LPdS"><sup>11</sup></span>]] Con{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ultez, {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur cette opinion de Thalès, ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i que {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur celles d’Hé{{Info|ſ|forme ancienne longue de la lettre s minuscule}}iode & d’Anaximandre, l’Uranologie citée note précédente.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Euctémon_LPdS_back|<span id="Euctémon_LPdS"><sup>12</sup></span>]] ''Euctemon'' ; ain{{Info|ſ|forme ancienne longue de la lettre s minuscule}}i portent les manu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}crits, & non pas ''Eudemon''. J’ai traité d’Euctêmon (en Grec Εὐϰτημον) dans les notes alphabétiques du premier livre, & plus récemment dans la note 21 du chapitre précédent.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#contrées_adjacentes_ouest_Péloponnese_LPdS_back|<span id="contrées_adjacentes_ouest_Péloponnese_LPdS"><sup>13</sup></span>]] Telles que l’Elide, l’Arcadie, la Me{{Info|ſ|forme ancienne longue de la lettre s minuscule}}lénie.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Columelle_LPdS_back|<span id="Columelle_LPdS"><sup>14</sup></span>]] Columelle, liv. 3, chap. 6 :''' {{Info|''Quo tempore ſol in eamdem partem ſigniſeri per eoſdem numeros redit, per quos cursus ſui principium cæperat : quem circuitum meatus dierum integrorum mille quadringentorum ſexaginta unius [[w:Apocatastase|ὰ τοκατάςασιν]] vocant ſtudioſi rerum cæleſtium''|A ce moment-là, le soleil revient dans la même direction au moyen des mêmes nombres par lesquels il a commencé sa course : laquelle course de mille quatre cent soixante et un jours entiers est appelée ὰ τοκατάςασιν par ceux qui étudient les choses célestes. TdA}}.</td> </tr> </table><br/><br/></div> {{Boîte déroulante fin}} <div style="text-align: right; margin: 0 2em 0 1em;">[https://books.google.fr/books?id=JeyFTzG771cC&newbks=1&newbks_redir=0&dq=Louis%20Poinsinet%20de%20Sivry%20Pline%20l'ancien&hl=fr&pg=PP9#v=onepage&q&f=true <u>Histoire Naturelle de Pline. Tome Sixieme</u>], [https://books.google.fr/books?id=JeyFTzG771cC&newbks=1&newbks_redir=0&dq=Louis%20Poinsinet%20de%20Sivry%20Pline%20l'ancien&hl=fr&pg=PA257#v=onepage&q&f=true ''Livre Dix-huitieme.''], [https://books.google.fr/books?id=JeyFTzG771cC&newbks=1&newbks_redir=0&dq=Louis%20Poinsinet%20de%20Sivry%20Pline%20l'ancien&hl=fr&pg=PA455#v=onepage&q&f=true ''Diviſion des jours & des nuits ſuivant le cours du Soleil ; lever & coucher des étoiles ; ordre des ſaiſons ; tems où l’on ſeme les bleds d’hiver.''], traduction en françois, avec le texte latin rétabli d’après les meilleures leçons manu{{Info|ſ|forme ancienne longue de la lettre s minuscule}}crites ; accompagnée de Notes critiques pour l’éclairci{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ement du texte, & d’Ob{{Info|ſ|forme ancienne longue de la lettre s minuscule}}ervations {{Info|ſ|forme ancienne longue de la lettre s minuscule}}ur les connoi{{Info|ſſ|forme ancienne longue de la lettre s minuscule}}ances des Anciens comparées avec les découvertes des Modernes, par M. [[w:Louis_Poinsinet_de_Sivry|Louis Poinsinet de Sivry]], Chez la veuve Desaint, Paris, 1771</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Flavius_Josèphe|'''Flavius Josèphe''']] [[#Flavius_Josèphe|<span id="Flavius_Josèphe_back"><sup>'''I'''</sup></span>]] == <p style="text-align: right;">([[w:37|37]]/[[w:38|38]], à [[w:Histoire_de_Jérusalem#Période_romaine_et_byzantine_(63_av._J.-C._-_638)|''Jérusalem'']] — vers [[w:100|100]], à [[w:Rome_antique|''Rome'']]) [[w:Ier_siècle|<sup>⏳</sup>]] [[s:Auteur:Flavius_Josèphe|<sup>📚</sup>]] <div style="text-align: justify; margin: 0 1em; text-indent: 15px">[[w:historiographe|Historiographe]] ''romain'' [[w:Juifs|''juif'']] d’origine [[w:Judée_(province romaine)|''judéenne'']], il participe activement au début de la ''première guerre judéo-romaine'' en tant que commandant militaire de ''Galilée'' contre les Romains, avant de se rendre à [[w:Vespasien|'''Vespasien''']] [[#Vespasien|<span id="Vespasien_back"><sup>'''II'''</sup></span>]] lors de la prise de la garnison juive de la forteresse de [[w:Jotapata|''Jotapata'']] en juillet 67, et de devenir intermédiaire, interprète et négociateur entre les ''romains'' et les ''Juifs'' lors du siège de ''Jérusalem'' conduit par '''Titus''' [[#Titus_back|<sup>⤴️</sup>]] en 70. Après la fin de la grande révolte ''judéenne'', en 71, il s’établit auprès de son protecteur à ''Rome'' où il obtient la [[w:citoyenneté_romaine|''citoyenneté romaine'']].</div> {{Boîte déroulante début|titre=NdA Flavius Josèphe|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Flavius_Josèphe_back|<span id="Flavius_Josèphe"><sup>I</sup></span>]] De son nom de naissance Joseph ben (fils de) Matthatias, de l’hébreu יוסף בן מתתיהו / Yossef [[wikt:en:יוסף#Hebrew|(en)]] ben [[wikt:en:בן#Noun|(en)]] Matityahou [[wikt:en:מתתיהו#Hebrew|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;">• de la troisième personne du singulier [[w:Jussif|''jussive'']], signifiant ainsi « peut-il ajouter », du verbe הוֹסִיף / hosíf [[wikt:en:הוסיף#Hebrew|(en)]], « 1. Ajouter (quelque chose) à (quelque chose d'autre). 2. (littéraire) Continuer (à faire quelque chose). 3. (archaïque) Coordonné avec un autre verbe pour indiquer que l’action de ce verbe "ajoute" d’une manière ou d’une autre. »;<br /><p style="margin: 0 2em; text-indent: 15px;">• du nom commun בֵּן / bén, « 1. Fils. 2. (ne produit plus de mot ou d’expression) Un descendant mâle direct. 3. Un mec, un garçon. 4. (n’est plus productif, état de construction) Possesseur de (connaissance, capacité, etc.). 5. (État construit) Utilisé pour exprimer l’âge d’un homme, d’un garçon ou le référent d’un nom masculin : âge, âgé. »;<br /><p style="margin: 0 2em; text-indent: 15px;">• de la contraction du nom commun מַתָּנַת / mataná [[wikt:en:מתנה#Hebrew|(en)]], « cadeau, présent, don »;<br /><p style="margin: 0 2em; text-indent: 30px;">➥ du verbe נתן / natán [[wikt:en:נתן#Verb|(en)]], « 1. Donner. 2. Autoriser, permettre, laisser. 3. (archaïque) Mettre, placer. 4. (archaïque, hébreu biblique) Se transformer en. »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ et du nom propre יהוה / YHWH [[wikt:en:יהוה#Hebrew|(en)]], « (Judaïsme) Tétragramme : mot en quatre lettres hébraïques utilisé comme nom [[wikt:ineffable#Français|''ineffable'']] de Dieu dans la Bible hébraïque, diversement rendu par Yahweh ou Jéhovah. »;<br /><p style="margin: 0 2em; text-indent: 15px;">Son tria nomina à l’obtention de sa ''citoyenneté romaine'' est {{Info|Titus|praenomen, nom individuel du citoyen romain}} {{Info|Flavius|nomen, nom de famille}} {{Info|Josephus|cognomen, surnom héréditaire, servant à distinguer les diverses branches d’une même gens}}, prenant ainsi le nom de son bienfaiteur :<br /><br /><p style="margin: 0 2em; text-indent: 15px;">[[#Vespasien_back|<span id="Vespasien"><sup>II</sup></span>]] [[w:Nom_romain|Tria Nomina]] en latin {{Info|Titus|praenomen, nom individuel du citoyen romain}} {{Info|Flavius|nomen, nom de famille}} {{Info|Vespasianus|cognomen, surnom héréditaire, servant à distinguer les diverses branches d’une même gens}};<br /><p style="margin: 0 2em; text-indent: 15px;">[[w:L%C3%A9gat_(Rome_antique)|''Légat'']] lors de la [[w:Conqu%C3%AAte_romaine_de_la_Grande-Bretagne|''conquête de la Bretagne en 43'']] et lors de la [[w:Premi%C3%A8re_guerre_jud%C3%A9o-romaine|''rébellion juive de 66'']] en [[w:Jud%C3%A9e_(province_romaine)|''Judée'']]. Fin décembre 69, il est couronné empereur par le [[w:S%C3%A9nat_romain|''Sénat'']] après la guerre civile de l’[[w:Ann%C3%A9e_des_quatre_empereurs|''année des quatre empereurs'']], et fonde la dynastie des [[w:Flaviens|''Flaviens'']].<br /><p style="text-align: right; margin: 0 2em;">(17 novembre [[w:9|9]], près de [[w:Reate|''Reate'']] dans la région centrale italienne du [[w:Latium|''Latium'']] — 23/24 juin [[w:79|79]], à la station thermale de [[w:Aquae_Cutiliae|''Aquae Cutiliae'']], à l’est de ''Reate'')<sup>[[w:Ier_siècle|⏳]]</sup><br/><br/></div> ''' {{Boîte déroulante fin}} === [[w:Contre_Apion|Contre Apion]] === <p style="text-align: right;">[[s:Contre_Apion|📚]] {| cellpadding="0" align="{{{align|right}}}" style="margin-left: 2em; width:40%; border-spacing:3px; text-align:center; background-color:#F8F9FA; border:2px solid #C8CCD1" |- | style="border:solid 1px #F8F9FA" | [https://archive.org/details/contreapiontexte0000jose/page/n156/mode/1up {{Info|'''Éditions & Manuscrits'''|Flavius Josèphe Contre Apion, Théodore Reinach & Léon Blum, 1930}}] |- style="font-size:8pt; line-height:10pt; vertical-align:middle" | align="center" | <div style="margin-right: 1em; padding:0 0 4px 0; text-align:justify;">{{{légende| * La traduction ''latine'' a été imprimée dès 1480 à [[w:Vérone#Époque_moderne|''Vérone'']] par '''Pierre Maufer''' [[w:en:Petrus_Maufer|(en)]]. L’édition de cette traduction, due à [[w:Sigismund_Gelenius|'''Sigismond Gelenius''']] (''Paris'', 1535), qui constitue la « [[w:Vulgate|Vulgate]] », présente un texte souvent « amélioré » de façon arbitraire. La seule édition critique est celle de '''Ch. Boysen''' (''Vienne'', 1898) qui fait partie du [[w:Corpus_scriptorum_ecclesiasticorum_latinorum|{{Info|''Corpus scriptorum ecclesiasticorum latinorum''|Le corpus des écrits ecclésiastiques latins}}]]. Elle repose principalement sur les manuscrits L(aurentianus LXVI, 2), B(odleianus Canonicianus 148), R(egius Parisinus 5049) de la I<sup>re</sup> classe, C(heltenhamensis Phillipicus 12311), P(arisinus 1615), Pa(rsinus 5054) de la seconde. * Le texte grec est édité pour la première fois dans l’édition complète de '''Josèphe''' à [[w:Bâle#XVIe_siècle|''Bâle'']], chez [[w:Johann_Froben|''Froben'']], en 1544 par [[w:Arnoldus_Arlenius|'''Arlenius''']] qui a peut-être fait usage du ''Schleusingensis'' (un des fils du Laurentianus), mais a introduit grand nombre de corrections tantôt heureuses, et tantôt arbitraires. Par la suite notre traité n’a guère été imprimé que comme partie intégrante d’éditions complètes des œuvres de '''Josèphe'''. Les plus importantes sont celles de '''E. Bernard''' (1700), de [[w:John_Hudson_(classiciste)|'''Hudson''']] (1720) — le premier qui ait utilisé L —, de [[w:Sigebert_Havercamp|'''Havercamp''']] (1726), simple compilateur, de [[w:Karl_Wilhelm_Dindorf|'''L. Dindorf''']] (1847), de [[w:Immanuel_Bekker|'''Imm. Bekker''']] (1856), tout à fait manquée. L’édition critique de '''Niese''' [[w:en:Benedikt_Niese|(en)]] (1889) est la base de tous les travaux ultérieurs, notamment des éditions de '''Naber''' (1896) et de [[w:Henry_St._John_Thackeray|'''H. St. J. Thackeray''']] (coll. Loeb, 1926 : il n’a encore paru que le ''C. Apion'', la ''Vita'' et le commencement de la ''Guerre'') qui ont pu profiter aussi des conjectures de '''Cobet''', de '''Holwerda''', et de '''Herwerden'''.}}}</div> |} <div style="text-align: justify; margin: 0 1em; text-indent: 15px">Dernière œuvre écrite par '''Flavius Josèphe''', vers [[w:93|93]], dont l’objectif est de répondre aux critiques qu’ont soulevées ses [[w:Antiquit%C3%A9s_juda%C3%AFques|''Antiquités judaïques'']], de défendre l’ancienneté du peuple ''juif'' et du [[w:Judaïsme#Judaïsme_antique|''judaïsme'']] (Livre I) et les accusations d’[[w:Apion_(grammairien)|'''Apion''']] [[#Apion|<span id="Apion_back"><sup>'''I'''</sup></span>]] (Livre II).</div> {{Boîte déroulante début|titre=NdA Apion|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Apion_back|<span id="Apion"><sup>I</sup></span>]] Du nom propre grec ancien [[wikt:Apion#Latin|Ἀπίων / Apíôn]]; <br/><br /><p style="margin: 0 2em; text-indent: 15px;">'''[[w:Grammaticus|''Grammairien'']] [[#grammairien|<span id="grammairien_back"><sup>II</sup></span>]] et [[w:Polygraphe_(auteur)|''polygraphe'']] [[#polygraphe|<span id="Grammairien_back"><sup>III</sup></span>]] ''grec'' d’Alexandrie.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] seconde moitié du [[w:Ier_siècle_av._J.-C.|I<sup>er</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]] — première moitié du [[w:Ier_siècle|I<sup>er</sup> siècle {{Info|EC|de l’Ère Commune}}]]) <br /><br /><p style="margin: 0 2em; text-indent: 15px;">'''[[#grammairien_back|<span id="grammairien"><sup>II</sup></span>]] Du nom commun latin grammaticus [[wikt:en:grammaticus#Latin|(en)]]; du nom commun grec ancien γραμματικός / grammatikós [[wikt:en:γραμματικός#Noun|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">➥ du nom commun γρᾰ́μμᾰ / grámma [[wikt:en:γράμμα#Noun|(en)]], « 1. Ce qui est écrit, ce qui est dessiné. 2. Lettre. 3. (au pluriel) Alphabet. 4. Écriture, livre. »;<br /><p style="margin: 0 2em; text-indent: 30px">➥ du verbe γράφω / gráphō [[wikt:en:γράφω#Ancient_Greek|(en)]], « 1. (Homérique) égratigner, couper en dedans. 2. Dessiner, esquisser, peindre. 3. Écrire. 4. Écrire, proposer une loi. 5. ([[w:Diathèse#Moyen|''voix moyenne'']]) : • (''[[w:Réflexivité_(grammaire)|réflexif]] indirect'') Écrire pour soi, noter ; • Accuser, poursuivre. 6. ([[w:Conjugaison_latine|''passif parfait'']]) Être écrit, être sous forme écrite. »;<br /><p style="margin: 0 2em; text-indent: 30px">➥ + du suffixe nominal de résultat‎ -μα / -ma [[wikt:en:-μα#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ du suffixe adjectival -ῐκός / -ikós, de ou se rapportant à, de la manière de ; « -ique »;<br /><p style="margin: 0 2em; text-indent: 15px">Enseignant responsable de la deuxième étape du système éducatif traditionnel, après l’apprentissage de l’alphabet, la lecture et l’écriture, et l’initiation au calcul avec un abaque chez un ''magister ludi'' [[w:en:Ludi_magister|(en)]] et avant celle de l’art du discours chez un [[w:Rhétorique#Rhétorique_dans_l'Antiquité_grecque|''rhéteur'']]. Le travail du grammairien était d’enseigner la lecture, l’analyse de textes des poètes antiques tels qu’Homère, Tite-Live et Virgile, et la grammaire [https://archive.wikiwix.com/cache/index2.php?url=http%3A%2F%2Fwww.antiquite.ac-versailles.fr%2Feducatio%2Fedrom2.htm#federation=archive.wikiwix.com&tab=url {{Info|<sup>➕</sup>|« L’école du grammaticus », ac-Versailles}}] [https://philo-lettres.fr/latin/rome_vie-quotidienne/ecole-romaine/ {{Info|<sup>➕➕</sup>|« L’École dans l’antiquité romaine, philo-lettres}}]. <br /><br /><p style="margin: 0 2em; text-indent: 15px;">'''[[#polygraphe_back|<span id="polygraphe"><sup>III</sup></span>]] Du nom commun grec ancien [[wikt:polygraphe|πολύγραφος / polýgraphos]], « qui écrit beaucoup de sujets »;<br /><p style="margin: 0 2em; text-indent: 15px">➥ de l’adjectif πολῠ́ς / polús [[wikt:en:πολύς#Ancient_Greek|(en)]], « (de nombre, au pluriel) Beaucoup de : • (avec des noms de multitude) Grand ; • (de quantité, avec des noms de masse) beaucoup de ; • (rare, d'une personne) Grand, puissant ; • (de son) Fort ; • (attributivement, adverbial) Fortement, pleinement ; • (d'espace) Large, grand ; • (de distance) Loin ; • (de temps) Long, en retard. »;<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ du verbe γράφω / gráphō [[wikt:en:γράφω#Ancient_Greek|(en)]], « 1. (Homérique) égratigner, couper en dedans. 2. Dessiner, esquisser, peindre. 3. Écrire. 4. Écrire, proposer une loi. 5. (''voix moyenne'') : • (''réflexif indirect'') Écrire pour soi, noter ; • Accuser, poursuivre. 6. (''passif parfait'') Être écrit, être sous forme écrite. »;<br /><p style="margin: 0 2em; text-indent: 15px;">Le terme semble avoir été employé au cours de l’Antiquité dans un sens différent de celui que nous l’entendons aujourd’hui, pas dans le sens de diversité mais, de façon restreinte, le fait de composer un grand nombre de textes [https://eriac.univ-rouen.fr/la-polygraphie-comme-norme/ {{Info|<sup>➕</sup>|Isabelle Gassino, Université de Rouen et Dimitri Kasprzyk, université de Brest, « Colloque "La polygraphie comme norme" », 16 et 17 novembre 2017.}}].'''<br/><br/></div> {{Boîte déroulante fin}} ==== Livre I ==== ===== <div style="text-align: center;">Chapitre II.</div> ===== <div style="text-align: justify; margin: 0 1em;">Témoignage de '''Thales''' comme : * l’un des premiers ''philosophes grecs'' ayant traité des choses célestes et divines ; * disciple des ''Égyptiens'' et des ''Chaldéens'' (premier témoignage) ; * auteur de court(s)/rare(s) ouvrages (supposément unanimement admis), que les ''Grecs'' considéreraient comme les plus anciens, et douteraient, selon '''Flavius Josèphe''', de leur authenticité.</div> :'''Texte latin''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">qui autem historias apud eos conscribere temptauerunt, id est hi, qui circa '''Cadmum''' ''Milesium'', et '''Acusilaus''' ''Argiuus'' et post hunc quicumque alii fuisse referuntur, paululum tempus ''Persicam'' apud ''Helladium'' militiam praecesserunt. sed etiam eos, qui de caelestibus et diuinis primitus apud ''Graecos philosophati'' sund, id est '''Pherecydem''' ''Syrum'' et '''Pythagoram''' et '''Thaletem''' omnes concorditer confidentur ''Aegyptiorum'' et ''Chaldaeorum'' fuisse discipulos et breuiter conscripsisse quae a ''Graecis'' omnium antiquissima iudicantur ita ut uix ea credant ab illis fuisse conscripta.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[[w:Corpus_scriptorum_ecclesiasticorum_latinorum|<u>Corpus scriptorum ecclesiasticorum latinorum</u>]], [https://verlag.oeaw.ac.at/produkt/flavii-iosephi-opera-ex-versione-latina-antiqua-pars-vi-de-iudaeorum-vetustate-sive-contra-apionem-libri-ii/601067?name=flavii-iosephi-opera-ex-versione-latina-antiqua-pars-vi-de-iudaeorum-vetustate-sive-contra-apionem-libri-ii&product_form=5107 <u>Tome XXXVII, Flavius Iosephus, Contra Apionem</u>], ''Livre I'', ''chap. II.'', ''l.13, 14'', p.64, 1898</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">Οἱ μέντοι τὰς ἱστορίας ἐπιχειρήσαντες συγγράφειν παρ' αὐτοῖς, λέγω δὲ τοὺς περὶ '''Κάδμον''' τε τὸν ''Μιλήσιον'' καὶ τὸν ''Ἀργεῖον'' '''Ἀκουσίλαον''' καὶ μετὰ τοῦτον εἴ τινες ἄλλοι λέγονται γενέσθαι, βραχὺ τῆς ''Περσῶν'' ἐπὶ τὴν ''Ἑλλάδα'' στρατείας τῷ χρόνῳ προύλαβον. Ἀλλὰ μὴν καὶ τοὺς περὶ τῶν οὐρανίων τε καὶ θείων πρώτους παρ' ''Ἕλλησι φιλοσοφήσαντας'', οἷον '''Φερεκύδην''' τε τὸν ''Σύριον'' καὶ '''Πυθαγόραν''' καὶ '''Θάλητα''', πάντες συμφώνως ὁμολογοῦσιν ''Αἰγυπτίων'' καὶ ''Χαλδαίων'' γενομένους μαθητὰς ὀλίγα συγγράψαι, καὶ ταῦτα τοῖς ''Ἕλλησιν'' εἶναι δοκεῖ πάντων ἀρχαιότατα καὶ μόλις αὐτὰ πιστεύουσιν ὑπ' ἐκείνων γεγράφθαι.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://remacle.org/bloodwolf/historiens/Flajose/Apion1gr.htm <u>Φλαίίου Ἰωσήπου, περὶ ἀρχαιότητος Ἰουδαίων</u>, ''λόγος α''], ''chap. II.'', ''l.13, 14'', 1898</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">Quant aux Grecs qui ont entrepris d’écrire l’histoire, comme [[w:Cadmos_de_Milet|'''Cadmos''' de ''Milet'']], [[w:Acousilaos|'''Acousilaos''' d’Argos]] et ceux qu’on cite après lui, ils n’ont vécu que peu de temps [[#Cadmos_NdT_LB|<span id="Cadmos_NdT_LB_back"><sup>1</sup></span>]] avant [[w:Guerres_médiques|''l’expédition des Perses contre la Grèce'']]. Mais bien certainement les premiers ''philosophes grecs'' qui aient traité des choses célestes et divines, comme [[w:Phérécyde_de_Syros|'''Phérécyde''' de ''Syros'']] [[#Phérécyde_de_Syros_NdT_LB|<span id="Phérécyde_de_Syros_NdT_LB_back"><sup>2</sup></span>]], '''Pythagore''' et '''Thalès'''[[#Thales_NdT_LB|<span id="Thales_NdT_LB_back"><sup>3</sup></span>]] furent, tout le monde s’accorde là-dessus, les disciples des ''Égyptiens'' et des ''Chaldéens'' avant de composer leurs courts ouvrages, et ces écrits sont aux yeux des ''Grecs'' les plus anciens de tous ; à peine même les croient-ils authentiques.</div> <table cellspacing=15 style="margin: 0 4em; font-size:85%;"> <tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Cadmos_NdT_LB_back|<span id="Cadmos_NdT_LB"><sup>1.</sup></span>]] En réalité, Cadmos paraît avoir fleuri vers le milieu [[w:VIe_siècle_av._J.-C.|VI<sup>ème</sup> siècle]] [{{Info|AEC|Avant l’Ère Commune}}].''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Phérécyde_de_Syros_NdT_LB_back|<span id="Phérécyde_de_Syros_NdT_LB"><sup>2</sup></span>]] Seul texte qui attribue une origine égyptienne ou chaldéenne aux doctrines de Phérécyde de Syros. Cependant [[w:Theodor_Gomperz|Gompers]], [https://archive.org/details/bub_gb_QrfVAAAAMAAJ/page/n434/mode/1up Griechische Denker, I, 430], identifie ᾿Ογηνός avec l’Ouginna babylonien.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Thales_NdT_LB_back|<span id="Thales_NdT_LB"><sup>3</sup></span>]] On retrouve chez [[w:Apollonios_de_Tyane|Apollonios de Tyane]] ([[w:Jamblique|Jamblique]] [[#Jamblique_back|<sup>⤵️</sup>]], Vit. Pyth. [[#Vie_de_Pythagore_back|<sup>⤵️</sup>]], 12) et [[w:Plutarque|Plutarque]] [[#Plutarque_back|<sup>⤵️</sup>]] l’idée que Thalès de Milet fut disciple des Égyptiens ; l’adjonction des Chaldéens est propre Josèphe.''' </td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/contreapiontexte0000jose/page/n6/mode/1up?view=theater <u>Flavius Josèphe, Contre Apion</u>], ''Livre I'', [https://archive.org/details/contreapiontexte0000jose/page/n49/mode/1up?view=theater&q=Thales ''chap. 2''], traduction du grec ancien par Léon Blum, agrégé des Lettres, professeur au lycée Janson-de-Sailly, texte établi et annotée par [[w:Théodore_Reinach|Théodore Reinach]] Membre de l’[[w:Institut_de_France|Institut]], professeur au Collège de France, 1930<br />(édition bilingue de 1911 également disponible [https://remacle.org/bloodwolf/historiens/Flajose/Apion1.htm ici])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-align: justify; margin: 0 2em;">Quant aux Grecs qui ont entrepris d’écrire l’histoire, comme '''Cadmos''' de ''Milet'', '''Acousilaos''' d’''Argos'' et ceux qu’on nomme après lui, ils n’ont vécu que peu de temps[2] avant l’expédition des ''Perses'' contre la ''Grèce''. [14]. De même, les premiers ''philosophes grecs'' qui aient traité des choses célestes et divines, comme '''Phérécyde''' de ''Syros''[3], '''Pythagore''' et '''Thalès'''[4] furent, tout le monde s’accorde là dessus, les disciples des ''Égyptiens'' et des ''Chaldéens'' avant de composer leurs rares ouvrages, et ces écrits sont aux yeux des ''Grecs'' les plus anciens de tous ; à peine même les croient-ils authentiques.</div> <table cellspacing=15 style="margin: 0 4em; font-size:85%;"> <tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Cadmos_NdT_LB_back|<span id="Cadmos_NdT_LB"><sup>1.</sup></span>]] En réalité, Cadmos paraît avoir fleuri vers le milieu [[w:VIe_siècle_av._J.-C.|VI<sup>ème</sup> siècle]] [{{Info|AEC|Avant l’Ère Commune}}].''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Phérécyde_de_Syros_NdT_LB_back|<span id="Phérécyde_de_Syros_NdT_LB"><sup>2</sup></span>]] Seul texte qui attribue une origine égyptienne ou chaldéenne aux doctrines de Phérécyde de Syros. Cependant [[w:Theodor_Gomperz|Gompers]], [https://archive.org/details/bub_gb_QrfVAAAAMAAJ/page/n434/mode/1up Griechische Denker, I, 430], identifie ᾿Ογηνός avec l’Ouginna babylonien.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Thales_NdT_LB_back|<span id="Thales_NdT_LB"><sup>3</sup></span>]] On retrouve chez [[w:Apollonios_de_Tyane|Apollonios de Tyane]] ([[w:Jamblique|Jamblique]] [[#Jamblique_back|<sup>⤵️</sup>]], Vit. Pyth. [[#Vie_de_Pythagore_back|<sup>⤵️</sup>]], 12) et [[w:Plutarque|Plutarque]] [[#Plutarque_back|<sup>⤵️</sup>]] l’idée que Thalès de Milet fut disciple des Égyptiens ; l’adjonction des Chaldéens est propre Josèphe.''' </td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Flavius Josèphe, De l’ancienneté du peuple juif (Contre Apion)</u>, ''Livre I'', [[s:Page:Flavius_Josephe_-_Leon_Blum_-_Contre_Apion,_Leroux,_Paris,_1902.djvu/17|''Chap. 2'']], traduction de Léon Blum, agrégé des lettres, professeur au lycée du Havre, sous la direction de [[w:Théodore_Reinach|Théodore Reinach]], 1902.</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div> </div> <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Plutarque|'''Plutarque''']] [[#Plutarque|<span id="Plutarque_back"><sup>'''I'''</sup></span>]] == <p style="text-align: right;">([[w:Circa|{{Info|''ca.''|Circa, locution latine que l’on emploie pour indiquer l’approximation d’une date}}]] [[w:45|45]]'' <sup>[[w:Ier_siècle|⏳]]</sup>'', à [[w:Chéronée|Chéronée]] en [[w:Béotie|Béotie]] — {{Info|''ca.''|Circa, locution latine que l’on emploie pour indiquer l’approximation d’une date}} [[w:125|125]]'' <sup>[[w:IIe_siècle|⏳]]</sup>)[[s:Auteur:Plutarque|<sup>📚</sup>]] [[Fichier:Plutarch at Delphi.jpg|vignette|<p style="text-align: justify; text-indent: 15px;">Buste probable de Plutarque du [[w:IIe_siècle|II<sup>ème</sup>]] ou [[w:IIIe_siècle|III<sup>ème</sup>]] siècles {{Info|EC|de l’Ère Commune}}, en marbre de [[w:Marbre_de_Paros|''Paros'']].<br /><p style="text-align: justify; text-indent: 15px;">Provenance : découvert lors de fouilles près de l’angle sud-est du [[w:Temple d'Apollon (Delphes)|''temple d’Apollon'']] de [[w:Delphes|''Delphes'']], au côté d'une [[w:Fichier:Plutarch_stele_inscription_100_AD,_AM_of_Delphi_4070060092.jpg|''stèle'']] portant une inscription gravée : ΔΕΛΦΟΙ ΧΑΙΡΩΝΕΥΣΙΝ ΟΜΟΥ ΠΛΟΥΤΑΡΧΟΝ ΕΘΗΚΑΝ ΤΟΙΣ ΑΜΦΙΚΤΥΟΝΩΝ ΔΟΓΜΑΣΙ ΠΕΙΘΟΜΕΝΟΙ — Les ''Delphiens'', avec les ''Chéronéens'', dédièrent ce(tte image de) Plutarque, suivant les préceptes de l’[[w:Amphictyonie|''Amphictyonie'']].<br /><p style="text-align: justify; text-indent: 15px;">Exposition : Salle XIV, [[w:Mus%C3%A9e_arch%C3%A9ologique_de_Delphes|''Musée archéologique de Delphes'']].]] <div style="text-align: justify; margin: 0 1em; text-indent: 15px">Biographe, philosophe et moraliste grec, auteur d’une œuvre importante, comportant un ensemble varié de traités et de dialogues consacrés à des questions de philosophie morale, mais abordant aussi des sujets littéraires, politiques, scientifiques, religieux.</div> {{Boîte déroulante début|titre=NdA Plutarque|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Plutarque_back|<span id="Plutarque"><sup>I</sup></span>]] Du nom propre grec ancien πλούταρχος / ploútarkhos [[wikt:en:Πλούταρχος#Ancient_Greek|(en)]], « maître des richesses » ; <br /><p style="margin: 0 2em; text-indent: 15px">➥ du nom commun πλοῦτος / ploûtos [[wikt:en:πλοῦτος#Ancient_Greek|(en)]], « richesses » ;<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ du nom commun ἀρχός / arkhós, « souverain, chef, prince »)'''<br/><br/></div> {{Boîte déroulante fin}} {{Boîte déroulante début|titre=Remarque|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>''' Dans la ''Vie de [[w:Lycurgue_(législateur)|Lycurgue]]'' et la ''Vie d’Agis et Cléomène'' (''Vies parallèles''), et le traité ''Un philosophe doit surtout converser avec les princes'' (''Œuvres morales''), il est fait mention d’un Thalès : il s’agit de [[w:Thalétas|Thalétas]], aussi appelé Thalès de [[w:Crète|''Crète'']], un musicien et poète, originaire de la cité de [[w:Gortyne|''Gortyne'']] en ''Crète'', et actif à la fin du [[w:VIIIe_siècle_av._J.-C.|VIII<sup>ème</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]] et au début du siècle suivant.'''<br/><br/></div> {{Boîte déroulante fin}} === [[w:Vies_parallèles|Vies parallèles]] [[#Vies_parallèles|<span id="Vies_parallèles_back"><sup>'''I'''</sup></span>]] === <div style="text-align: center; margin: 0 1em;">Recueil de 50 biographies de grands hommes de l’histoire, dont 46 présentées par paires : un ''Grec'' mis en parallèle avec un ''Romain''.</div> {{Boîte déroulante début|titre=NdA Vies parallèles|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Vies_parallèles_back|<span id="Vies_parallèles"><sup>I</sup></span>]] Du grec ancien Βίοι Παράλληλοι / Bíoi Parállêloi'''<br/><br/></div> {{Boîte déroulante fin}} ==== Vie de [[w:Solon|'''Solon''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Solon|<sup>🔄</sup>]] ==== <div style="text-align: center; margin: 0 1em;">Biographie de '''Solon''', qui précède celle de [[w:Publius_Valerius_Publicola_(consul_en_-509)|'''Publicola''']] [[#Publicola|<span id="Publicola_back"><sup>'''I'''</sup></span>]], et avec laquelle '''Plutarque''' la compare.</div> {{Boîte déroulante début|titre=NdA Vie de Solon|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Publicola_back|<span id="Publicola"><sup>I</sup></span>]] [[w:Nom_romain|Tria Nomina]] en latin {{Info|Publius|praenomen, nom individuel du citoyen romain}} {{Info|Valerius|nomen, nom de famille}} {{Info|Publicola ou Poplicola|cognomen, surnom héréditaire, servant à distinguer les diverses branches d’une même gens}}, « celui qui prend soin de l’armée. »[https://academic.oup.com/bics/advance-article/doi/10.1093/bics/qbaf002/8117642?login=false {{Info|<sup>🔍</sup>|M. Gallo, « Misinterpreting a compound name. The origin of the agnomen Publicola in Dionysius of Halicarnassus and Plutarch », Bulletin of the Institute of Classical Studies,‎ 22 avril 2025}}].<br /><p style="margin: 0 2em; text-indent: 15px">[[w:Consul_(Rome_antique)|Consul]] de la [[w:république_romaine|''République Romaine'']], à quatre reprises : en [[w:-509|-509]], [[w:-508|-508]], [[w:-507|-507]] et [[w:-504|-504]], et l’un des instaurateurs légendaires de la ''République Romaine'' en -509, suite au viol et au suicide de [[w:Lucrèce_(dame_romaine)|Lucrèce]], une femme aristocratique ''romaine'', par [[w:Sextus_Tarquin|Sextus Tarquin]], le fils du dernier [[w:Roi_de_Rome|roi de ''Rome'']] [[w:Tarquin_le_Superbe|Tarquin le Superbe]].<br /><p style="text-align: right; margin: 0 2em;">(date et lieu de naissance inconnu.e.s — [[w:-503|-503]], soit sur le champ de bataille pendant les [[w:Guerres_romano-sabelliennes|''guerres romano-sabelliennes'']], soit de maladie)<sup>[[w:VIe_siècle_av._J.-C.|⏳]]</sup> '''<br/><br/></div> {{Boîte déroulante fin}} ===== <div style="text-align: center;">Chapitre II.</div> ===== ====== <div style="text-align: center;">Paragraphe III.</div> ====== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage de '''Thalès''' ''commerçant''</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''III.''' Κωλύει δὲ οὐδὲν τὸν ἀγαθὸν καὶ πολιτικὸν ἄνδρα μήτε τῶν περιττῶν τὴν κτῆσιν ἐν σπουδῇ τίθεσθαι μήτε τῆς χρείας τῶν ἀναγκαίων καὶ ἱκανῶν καταφρονεῖν. Ἐν δὲ τοῖς τότε χρόνοις, καθ' Ἡσίοδον, ἔργον οὐδὲν ἦν ὄνειδος, οὐδὲ τέχνη διαφορὰν ἔφερεν, ἐμπορία δὲ καὶ δόξαν εἶχεν οἰκειουμένη τὰ βαρβαρικὰ καὶ προξενοῦσα φιλίας βασιλέων καὶ πραγμάτων ἐμπείρους ποιοῦσα πολλῶν. Ἔνιοι δὲ καὶ πόλεων οἰκισταὶ γεγόνασι μεγάλων, ὡς καὶ Μασσαλίας Πρῶτις ὑπὸ Κελτῶν τῶν περὶ τὸν Ῥοδανὸν ἀγαπηθείς. Καὶ Θαλῆν δέ φασιν ἐμπορίᾳ χρήσασθαι καὶ Ἱπποκράτην τὸν μαθηματικόν, καὶ Πλάτωνι τῆς ἀποδημίας ἐφόδιον ἐλαίου τινὸς ἐν Αἰγύπτῳ διάθεσιν γενέσθαι.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm <u>Plutarque, Vie de Solon</u>], ''chap. II'', ''§3'', traduction par [[w:Dominique_Ricard|Dominique Ricard]], 1844<br />(également disponible une édition de 1853 [https://remacle.org/bloodwolf/historiens/Plutarque/solonpierrron.htm ici] et de 1862 [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f16.item là])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 390px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''III.''' Mais rien n’empêche l’homme de bien, le citoyen dévoué à son pays, de garder un juste milieu : il peut ne point s’attacher à la poursuite du superflu, sans pour cela mépriser le nécessaire et ce qui suffit à ses besoins.<br />Dans ce temps-là, pour parler comme [[w:Hésiode|'''Hésiode''']] [[#Hésiode|<span id="Hésiode_back"><sup>'''I'''</sup></span>]] [[#Hésiode_NdT_AP|<span id="Hésiode_NdT_AP_back"><sup>1</sup></span>]], il n’y avait pas de travail qui fût honteux; aucun art ne mettait de différence entre les hommes : le négoce surtout était honoré, qui met en possession des avantages dont jouissent les étrangers, gagne l’amitié des rois, et donne une grande expérience. On a même vu des trafiquants fonder de grandes villes : ainsi [[w:Mythe_fondateur_de_Marseille|'''Protis''']] bâtit [[w:Marseille_antique|''Marseille'']], après s'être concilié l’amitié des ''Gaulois'' qui habitent les bords du [[w:Rhône#Histoire|''Rhône'']]. '''Thales''' se livra, dit-on, au négoce, ainsi qu’[[w:Hippocrate_de_Chios|'''Hippocrate''']] [[#Hippocrate|<span id="Hippocrate_back"><sup>'''II'''</sup></span>]] le mathématicien[[#Hippocrate_NdT_AP|<span id="Hippocrate_NdT_AP_back"><sup>2</sup></span>]] ; et [[w:Platon|'''Platon''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Platon|<sup>🔄</sup>]] vendit de l’huile en [[w:Basse_Époque|''Égypte'']] , pour fournir aux frais de son voyage.</div> <table cellspacing=15 style="margin: 0 4em; font-size:85%;"> <tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Hésiode_NdT_AP_back|<span id="Hésiode_NdT_AP"><sup>1.</sup></span>]] Œuvres et Jours, vers 309.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Hippocrate_NdT_AP_back|<span id="Hippocrate_NdT_AP"><sup>2</sup></span>]] Cet Hippocrate n’est point connu d’ailleurs.''' </td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/viesdeshommesill01plut/page/n6/mode/1up?view=theater <u>Vie des Hommes Illustres de Plutarque</u>], [https://archive.org/details/viesdeshommesill01plut/page/182/mode/1up?view=theater ''Solon''], ''Chap. II'', ''§3'', [https://archive.org/details/viesdeshommesill01plut/page/184/mode/1up?view=theater p.184], traduit par [[w:Alexis_Pierron|Alexis Pierron]], professeur au lycée Louis-le-Grand, 1877<br />(également disponible une édition de 1853 [[s:Vies_des_hommes_illustres/Solon|ici]])</div> {{Boîte déroulante début|titre=NdA trad. par Alexis Pierron de 1877|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Hésiode_back|<span id="Hésiode"><sup>I</sup></span>]] Du nom propre grec ancien Ἡσῐ́οδος / Hēsĭ́odos [[wikt:en:Ἡσίοδος#Ancient_Greek|(en)]].<br /><p style="margin: 0 2em; text-indent: 15px">Berger sur les pentes du Mont [[w:Mont_Hélicon|Hélicon]] et un des plus grands poètes grecs. Il s’agit plus précisément d’un ''aède'' (il « chante » ses vers avec sa lyre) et un ''rhapsode'' (il « coud » des chants entre eux)[https://odysseum.eduscol.education.fr/hesiode-un-des-premiers-poetes-grecs {{Info|<sup>🔍</sup>|Hésiode, un des premiers poètes grecs - Odysseum, la maison numérique des Humanités}}]. <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Hippocrate_back|<span id="Hippocrate"><sup>II</sup></span>]] Du nom propre grec ancien Ῐ̔πποκρᾰ́της / Hĭppokrắtēs [[wikt:en:Ἱπποκράτης#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">➥ du nom commun ῐ̔́ππος / hĭ́ppos [[wikt:en:ἵππος#Ancient_Greek|(en)]], « cheval »;<br /><p style="margin: 0 2em; text-indent: 15px">➥ + du nom commun‎ κρᾰ́τος / krắtos [[wikt:en:κράτος#Ancient_Greek|(en)]], « 1. Puissance, force. 2. Acte de force, acte de bravoure. 3. (au pluriel) Actes de violence. 4. Domination, pouvoir. »;<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ du suffixe nominal -ης / -ēs.<br /><p style="margin: 0 2em; text-indent: 15px"> Mathématicien (géomètre) et astronome « para-pythagoricien », dont l’œuvre ne nous est pas parvenue.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] milieu du [[w:Ve_siècle_av._J.-C.|V<sup>ème</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]]) [https://books.google.fr/books?id=DrvWAAAAMAAJ&newbks=1&newbks_redir=0&lpg=PA764&vq=Hippocrate&dq=bibliogroup%3A%22Dictionnaire%20des%20philosophes%20antiques%22&hl=fr&pg=PA764#v=onepage&q&f=true {{Info|<sup>🔍</sup>|Dictionnaire des Philosophes Antiques, publié sous la direction de Richard Goulet, Volume III, §151 - Hippocrate de Chios}}]'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: center; margin: 0 2em;">'''II. Dans sa jeunesse il se livre au commerce maritime; la modicité de sa fortune et son goût pour la sagesse l’y décident. Faveur du commerce à cette époque ; grands noms qui l’ont illustré.'''<br /><br /><p style="text-align: justify; text-indent: 15px;">Mais rien n’empêche qu’un homme de bien, un sage politique tienne à cet égard un juste milieu, et que sans rechercher des richesses superflues, il ne méprise pas celles qui sont nécessaires et qui suffisent. Dans ce temps-là, comme dit [[w:Hésiode|'''Hésiode''']], aucun travail n’était regardé comme honteux; aucun art ne mettait de différence entre les hommes. Le commerce maritime surtout était honorable; il ouvrait des communications utiles avec les nations étrangères, procurait des alliances avec les rois, et donnait une grande expérience. On a même vu des commerçants fonder de grandes villes. Ainsi '''Protus''' gagna l’amitié des Gaulois qui habitaient les bords du ''Rhône'', et bâtit ''Marseille''. '''Thalès''' et '''Hippocrate''' le mathématicien firent aussi le commerce ; et '''Platon''' vendit de l’huile en ''Égypte'' pour fournir aux frais de son voyage.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f16.item ''chap. II''], traduction correcte et précédée du texte grec, par une société de professeurs et d’helléniste, 1862<br />(également disponible une édition de 1844 [https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm#1a ici] et de 1829 [[s:Les_Vies_des_hommes_illustres/Vie_de_Solon|là]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">Mais rien n’empêche l’homme de-bien et l’homme politique ni se mettre en souci (rechercher) l’acquisition des choses superflues, ni mépriser l’usage des choses nécessaires et suffisantes. Or dans les temps d’alors, selon '''Hésiode''', aucun travail n’était sujet-de-honte, ni aucun métier n’apportait de différence entre les citoyens mais même le commerce-maritime avait de la gloire, rendant-amies les nations-barbares, et procurant des amitiés de rois, et faisant les hommes expérimentés d’affaires nombreuses. Et quelques-uns aussi sont devenus fondateurs de grandes villes, comme aussi le '''Protus''' de ''Marseille'' ayant été aimé par les ''Celtes'' ceux autour du ''Rhône''. Et on dit aussi '''Thalès''', avoir fait-usage du commerce-maritime et '''Hippocrate''' le mathématicien, et la vente d'une certaine huile en ''Égypte'' avoir été pour '''Platon''' ressource du voyage.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f16.item ''chap. II''], traduction littérale et juxtalinéaire présentant le mot à mot français en regard des mots grecs correspondants, par une société de professeurs et d’helléniste, 1862</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ====== <div style="text-align: center;">Paragraphe IV.</div> ====== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage de la sagesse de '''Thalès''' en ''philosophie naturelle''</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''IV.''' Φιλοσοφίας δὲ τοῦ ἠθικοῦ μάλιστα τὸ πολιτικόν, ὥσπερ οἱ πλεῖστοι τῶν σοφῶν, ἠγάπησεν. Ἐν δὲ τοῖς φυσικοῖς ἁπλοῦς ἐστι λίαν καὶ ἀρχαῖος, ὡς δῆλον ἐκ τούτων· [...].<br /><p style="text-indent: 15px">Καὶ ὅλως ἔοικεν ἡ Θάλεω μόνου σοφία τότε περαιτέρω τῆς χρείας ἐξικέσθαι τῇ θεωρίᾳ· τοῖς δὲ ἄλλοις ἀπὸ τῆς πολιτικῆς ἀρετῆς τοὔνομα τῆς σοφίας ὑπῆρξε.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm <u>Plutarque, Vie de Solon</u>], ''chap. II'', ''§4'', traduction par [[w:Dominique_Ricard|Dominique Ricard]], 1844<br />(également disponible une édition de 1853 [https://remacle.org/bloodwolf/historiens/Plutarque/solonpierrron.htm ici] et de 1862 [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f20.item là])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 390px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''IV.''' Il s’attacha, comme presque tous les sages d’alors, à cette partie de la philosophie morale qui traite de la politique. Pour la philosophie naturelle, il en était aux rudiments, et aux notions du vieux temps sans plus; [...].<br /><p style="text-indent: 15px;">Aussi bien n’y eut-il, en somme, que '''Thalès''' dont la science dépassât alors les notions d’un usage vulgaire : tous les autres ne durent qu’à leurs connaissances politiques leur réputation de sagesse.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/viesdeshommesill01plut/page/n6/mode/1up?view=theater <u>Vie des Hommes Illustres de Plutarque</u>], [https://archive.org/details/viesdeshommesill01plut/page/182/mode/1up?view=theater ''Solon''], ''Chap. II'', ''§4'', [https://archive.org/details/viesdeshommesill01plut/page/185/mode/1up?view=theater p.185], traduit par [[w:Alexis_Pierron|Alexis Pierron]], professeur au lycée Louis-le-Grand, 1877<br />(également disponible une édition de 1853 [[s:Vies_des_hommes_illustres/Solon|ici]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">A l’exemple des sages de son temps, il cultiva principalement cette partie de la morale qui traite de la politique. Il n’avait en physique que des connaissances très-superficielles, et en était aux premiers éléments de cette science, [...].<br/><p style="text-indent: 15px">En général '''Thalès''' fut, de tous les sages d’alors, le seul qui porta au delà des besoins de la vie la théorie des sciences ; tous les autres ne durent qu’à leurs connaissances politiques leur réputation de sagesse.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f20.item ''chap. II''], traduction correcte et précédée du texte grec, par une société de professeurs et d’helléniste, 1862<br />(également disponible une édition de 1844 [https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm#1a ici] et de 1829 [[s:Les_Vies_des_hommes_illustres/Vie_de_Solon|là]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">Mais de la partie morale de la philosophie il embrassa surtout la partie politique, comme la plupart des sages d’alors. Mais dans les sciences physiques il est extrêmement simple (ignorant) et primitif, [...]. Et en-un-mot la science de '''Thalès''' seul paraît s’être avancée alors par la théorie plus loin que le besoin ; et le nom de la science a appartenu aux autres par-suite des qualités politiques.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f21.item ''chap. II''], traduction littérale et juxtalinéaire présentant le mot à mot français en regard des mots grecs correspondants, par une société de professeurs et d’helléniste, 1862</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ====== <div style="text-align: center;">Paragraphe V.</div> ====== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Version alternative du récit de la coupe de [[w:Bathyclès_de_Magnésie|'''Bathyclès''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Bathyclès_back|<sup>🔄</sup>]] par [[w:Callimaque_de_Cyrène|'''Callimaque''']] de [[w:Cyrène|''Cyrène'']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Callimaque_back|<sup>🔄</sup>]].</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''V.''' Γενέσθαι δὲ μετ' ἀλλήλων ἔν τε Δελφοῖς ὁμοῦ λέγονται καὶ πάλιν ἐν Κορίνθῳ, Περιάνδρου σύλλογόν τινα κοινὸν αὐτῶν καὶ συμπόσιον κατασκευάσαντος. Ἔτι δὲ μᾶλλον εἰς ἀξίωμα καὶ δόξαν αὐτοὺς κατέστησεν ἡ τοῦ [[w:τρίπους#Grec_ancien|'''τρίποδος''']] περίοδος καὶ διὰ πάντων ἀνακύκλησις καὶ ἀνθύπειξις μετ' εὐμενείας φιλοτίμου γενομένη. Κῴων γάρ, ὥς φασι, καταγόντων σαγήνην, καὶ ξένων ἐκ Μιλήτου πριαμένων τὸν βόλον οὔπω φανερὸν ὄντα, χρυσοῦς ἐφάνη τρίπους ἑλκόμενος, ὃν λέγουσιν Ἑλένην πλέουσαν ἐκ Τροίας αὐτόθι καθεῖναι χρησμοῦ τινος ἀναμνησθεῖσαν παλαιοῦ. Γενομένης δὲ τοῖς ξένοις πρῶτον ἀντιλογίας πρὸς τοὺς ἁλιέας περὶ τοῦ τρίποδος, εἶτα τῶν πόλεων ἀναδεξαμένων τὴν διαφορὰν ἄχρι πολέμου προελθοῦσαν, ἀνεῖλεν ἀμφοτέροις ἡ Πυθία τῷ σοφωτάτῳ τὸν τρίποδα ἀποδοῦναι. Καὶ πρῶτον μὲν ἀπεστάλη πρὸς Θαλῆν εἰς Μίλητον, ἑκουσίως τῶν Κῴων ἑνὶ δωρουμένων ἐκείνῳ περὶ οὗ πρὸς ἅπαντας ὁμοῦ Μιλησίους ἐπολέμησαν. Θάλεω δὲ Βίαντα σοφώτερον ἀποφαίνοντος αὑτοῦ πρὸς ἐκεῖνον ἧκεν· ἀπ' ἐκείνου δ' αὖθις ἀπεστάλη πρὸς ἄλλον ὡς σοφώτερον. Εἶτα περιϊὼν καὶ ἀναπεμπόμενος οὕτως ἐπὶ Θαλῆν τὸ δεύτερον ἀφίκετο, καὶ τέλος εἰς Θήβας ἐκ Μιλήτου κομισθεὶς τῷ Ἰσμηνίῳ Ἀπόλλωνι καθιερώθη. Θεόφραστος δέ φησι,πρῶτον μὲν εἰς Πριήνην Βίαντι τὸν τρίποδα πεμφθῆναι, δεύτερον δ' εἰς Μίλητον Θαλῇ Βίαντος ἀποπέμψαντος· οὕτω δὲ διὰ πάντων πάλιν εἰς Βίαντα περιελθεῖν, τέλος δὲ εἰς Δελφοὺς ἀποσταλῆναι. Ταῦτα μὲν οὖν ὑπὸ πλειόνων τεθρύληται, πλὴν ὅτι τὸ δῶρον ἀντὶ τοῦ τρίποδος οἱ μὲν φιάλην ὑπὸ Κροίσου πεμφθεῖσαν, οἱ δὲ ποτήριον Βαθυκλέους ἀπολιπόντος εἶναι λέγουσιν.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm <u>Plutarque, Vie de Solon</u>], ''chap. II'', ''§5'', traduction par [[w:Dominique_Ricard|Dominique Ricard]], 1844<br />(également disponible une édition de 1853 [https://remacle.org/bloodwolf/historiens/Plutarque/solonpierrron.htm ici] et de 1862 [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f22.item là])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 390px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''V.''' On raconte que les sept sages se réunirent une fois à [[w:Delphes|''Delphes'']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Delphes_back|<sup>🔄</sup>]], et une autre fois à [[w:Histoire_de_Corinthe_dans_l%27Antiquité|''Corinthe'']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Corinthe_back|<sup>🔄</sup>]], où [[w:Périandre|'''Périandre''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Périandre_back|<sup>🔄</sup>]] les avait convoqués pour leur offrir un banquet. Rien ne contribua tant à leur réputation et à leur gloire, que le renvoi qu’ils se firent successivement l’un à l’autre du trépied d’or, et l’honorable humilité avec laquelle ils refusèrent le prix tour à tour. Des hommes de [[w:Kos_(Dodécanèse)#Kos_à_l'époque_hellénistique|''Cos'']] [[#Cos|<span id="Cos_back"><sup>'''I'''</sup></span>]] venaient, dit-on, de jeter leur filet en mer : des étrangers de ''Milet'' achetèrent le coup, avant que les pêcheurs y eussent regardé. Il se trouva, dans le filet, un trépied d’or qu’[[w:Hélène_(mythologie)|'''Hélène''']] [[#Hélène|<span id="Hélène_back"><sup>'''II'''</sup></span>]], à ce qu’on prétend, pour obéir à un ancien oracle, avait jeté dans la mer à son retour de [[w:Troie|''Troie'']] [[#Troie|<span id="Troie_back"><sup>'''III'''</sup></span>]]. Ce fut un sujet de débat, d’abord entre les pêcheurs et les étrangers, ensuite entre les deux villes, qui prirent parti dans la querelle : la guerre allait s’allumer, lorsque la [[w:Pythie|''Pythie'']] [[#Pythie|<span id="Pythie_back"><sup>'''IV'''</sup></span>]], que les deux partis avaient consultée, commanda de donner le trépied au plus sage. On l’envoya d’abord à ''Milet'', pour '''Thalès''', et ceux de ''Cos'' cédèrent sans peine à un seul particulier ce qu’ils allaient disputer par les armes à tous les ''Milésiens'' ensemble. '''Thalès''' déclara que [[w:Bias_de_Priène|'''Bias''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Bias_back|<sup>🔄</sup>]] était plus sage que lui, et le lui fit passer. '''Bias''', avec la même modestie, le fit passer à un autre; et le trépied, après avoir été envoyé successivement à tous les sept, revint une seconde fois à '''Thalès'''. Enfin, il fut transporté de ''Milet'' à [[w:Thèbes_(Grèce)|''Thèbes'']] [[#Thèbes|<span id="Thèbes_back"><sup>'''V'''</sup></span>]], et consacré à Apollon [[w:en:Ismenus|''Isménien'']]. Cependant [[w:Théophaste|'''Théophaste''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Théophaste_back|<sup>🔄</sup>]] dit qu’on envoya le trépied d’abord à '''Bias''', dans ''Priène'' ; que '''Bias''' le fit porter à '''Thalès''' ; qu’après avoir passé alternativement chez tous les sages, il revint à '''Bias''', et qu’il finit par être envoyé à ''Delphes''. Telle est la tradition commune : seulement quelques-uns prétendent qu’il s’agissait de décerner non point un trépied, mais un vase que [[w:Crésus|'''Crésus''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Crésus_back|<sup>🔄</sup>]] avait envoyé ; et, suivant d’autres, c’était une coupe, héritage de '''Bathyclès'''.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/viesdeshommesill01plut/page/n6/mode/1up?view=theater <u>Vie des Hommes Illustres de Plutarque</u>], [https://archive.org/details/viesdeshommesill01plut/page/182/mode/1up?view=theater ''Solon''], ''Chap. II'', ''§5'', [https://archive.org/details/viesdeshommesill01plut/page/185/mode/1up?view=theater p.185], traduit par [[w:Alexis_Pierron|Alexis Pierron]], professeur au lycée Louis-le-Grand, 1877<br />(également disponible une édition de 1853 [[s:Vies_des_hommes_illustres/Solon|ici]])</div> {{Boîte déroulante début|titre=NdA trad. par Alexis Pierron de 1877|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Cos_back|<span id="Cos"><sup>I</sup></span>]] Du nom propre grec ancien Κῶς / Kôs [[wikt:en:Κῶς#Ancient_Greek|(en)]] ;<br /><p style="margin: 0 2em; text-indent: 15px">Île grecque l’archipel du [[w:Dodécanèse|''Dodécanèse'']], au Sud-Est de la [[w:Mer_Égée|''mer Égée'']], au large des côtes ''turques''. <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Hélène_back|<span id="Hélène"><sup>II</sup></span>]] Du nom propre grec ancien Ἑλένη / Helénē [[wikt:en:Ἑλένη#Ancient_Greek|(en)]] ;<br /><p style="margin: 0 2em; text-indent: 15px">Fille de [[w:Zeus|Zeus]] et de [[w:Léda (mythologie)|Léda]], considérée comme la plus belle femme du monde, uniquement surpassée par la déesse [[w:Aphrodite|Aphrodite]]. Elle est mariée à [[w:Ménélas|Ménélas]], roi de [[w:Sparte|Sparte]], et est enlevée par [[w:Pâris|Pâris]], prince [[w:Troie|''troyen'']] [[#Troie|<sup>'''III'''</sup>]], ce qui déclencha la [[w:guerre de Troie|guerre de Troie]] qui opposa ''Grecs'' et ''Troyens''. <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Troie_back|<span id="Troie"><sup>III</sup></span>]] Du nom propre grec ancien Τροίᾱ / Troíā [[wikt:en:Τροία#Ancient_Greek|(en)]] ; [[w:Troie#Toponymie|''toponymie incertaine'']] ;<br /><p style="margin: 0 2em; text-indent: 15px"> Cité semi-légendaire, située sur la colline d’''[[w:site archéologique de Troie|{{lang|tr|Hisarlık}}]]'', à l’entrée de l’''[[w:Hellespont|Hellespont]]'', non loin de la ''[[w:mer Égée|mer Égée]]'', au nord-ouest de la ''péninsule anatolienne'', dans la région ''[[w:Troade|Troade]]'' en ''[[w:Asie Mineure|Asie Mineure]]''.<br /><p style="margin: 0 2em; text-indent: 15px"> Le site a fait l’objet de nombreuses campagnes de fouilles, à la suite de celles entreprises par [[w:Heinrich Schliemann|Heinrich Schliemann]] en 1870, ponctuées par des découvertes fortement médiatisées, qui ont popularisé son identification avec la Troie homérique (qui reste un sujet de débat en l’absence de preuve décisive), le lieu principal des événements du ''[[w:cycle troyen|cycle troyen]]'' rapportés dans les ''[[w:Épopée|poèmes épiques]]'' ''[[w:Homère|homériques]]'' l’''[[w:Iliade|Iliade]]'' et l’''[[w:Odyssée|Odyssée]]''. <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Pythie_back|<span id="Pythie"><sup>IV</sup></span>]] Du nom commun grec ancien Πῡθῐ́ᾱ / Pūthĭ́ā,<br /><p style="margin: 0 2em; text-indent: 15px">➥ du nom propre Πῡθώ / Pūthṓ, « [[w:Delphes#Histoire_du_site|''Pythô'']], ancien nom de ''Delphes'' » ;<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ du suffixe adjectival féminin -ῐος / -ĭos [[wikt:en:-ιος#Ancient_Greek|(en)]], « relatif à, appartenant à (de) ».<br /><p style="margin: 0 2em; text-indent: 15px">[[w:Divination_dans_la_Grèce_antique|''Oracle'']] du [[w:Temple_d%27Apollon_(Delphes)|''temple d’Apollon'']] à ''Delphes''.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:XIVe_siècle_av._J.-C.|XIV<sup>ème</sup>]]/[[w:VIIIe_siècle_av._J.-C.|VIII<sup>ème</sup>]] siècles {{Info|AEC|Avant l’Ère Commune}} — [[w:IVe_siècle_av._J.-C.|IV<sup>ème</sup> siècle {{Info|EC|de l’Ère Commune}}]]) <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Thèbes_back|<span id="Thèbes"><sup>V</sup></span>]] Du nom propre grec ancien Θῆβαι / Thêbai [[w:Θῆβαι#Ancient_Greek|(en)]], désigne indistinctement la cité ''grecque'' comme [[w:Thèbes_(Égypte)|celle ''égyptienne'']] ; mais leur étymologie diffère : pour celle de la cité grecque, de l’[[w:Ionien-attique|''ionien-attique'']] Θήβη / Thḗbē ; du grec mycénien 𐀳𐀣 / te-qa (/Tʰēgʷā/) ;<br /><p style="margin: 0 2em; text-indent: 15px">Cité grecque de la région de [[w:Béotie#Antiquité|''Béotie'']], au centre de la ''Grèce''.'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">On raconte que les sept sages se trouvèrent un jour ensemble à ''Delphes'', et une autre fois à ''Corinthe'', chez '''Périandre''', qui les avait réunis pour un banquet. Rien ne contribua autant à leur réputation et à leur gloire, que la modestie empressée avec laquelle ils se renvoyèrent l’un à l’autre le trépied d’or. Des ''Milésiens'' qui se trouvaient à l’île de ''Cos'', avaient acheté d’avance de quelques pêcheurs ce que retirerait de l’eau le filet qu’ils allaient y jeter. Quand on l’eut tiré, il s’y trouva un trépied d’or qu’'''Hélène''', à ce qu’on prétend, pour obéir à un oracle, avait jeté dans la mer, à son retour de ''Troie''. Cet incident donna lieu à une vive dispute d’abord entre les pêcheurs et les étrangers, ensuite entre les deux villes, qui prirent parti dans la querelle et étaient près d’en venir aux mains, lorsque la ''Pythie'' consultée leur ordonna de porter ce trépied au plus sage. On l’envoya d’abord à '''Thalès''', et ceux de ''Cos'' cédèrent sans peine à un seul particulier ce qu’ils allaient disputer par les armes à tous les ''Milésiens'' ensemble. '''Thalès''' le renvoya à '''Bias''', qui, disait-il, était plus sage que lui ; '''Bias''', avec la même modestie, le fit passer à un autre ; et après avoir été envoyé successivement à tous les sept, il revint une seconde fois à '''Thalès''' : enfin il fut porté à ''Thèbes'', et consacré à ''Apollon Isménien''. '''Théophraste''' dit qu’on l’envoya d’abord à '''Bias''', qui demeurait à ''Priène'' ; que '''Bias''' le fit porter à '''Thalès''' ; qu’après avoir été envoyé alternativement à tous les sages, il revint à '''Bias''', et qu’enfin il fut porté à ''Delphes''. Telle est la tradition la plus commune sur ce fait ; seulement quelques auteurs disent que ce n’était pas un trépied, mais un vase que '''Crésus''' envoyait à ''Delphes''; suivant d’autres, c’était une coupe que '''Bathyclès''' avait laissée.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f22.item ''chap. II''], traduction correcte et précédée du texte grec, par une société de professeurs et d’helléniste, 1862<br />(également disponible une édition de 1844 [https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm#1a ici] et de 1829 [[s:Les_Vies_des_hommes_illustres/Vie_de_Solon|là]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">Or ils (les sept sages) sont dits s’être trouvés aussi ensemble les uns avec les autres et à ''Delphes'' et de nouveau à ''Corinthe'', '''Périandre''' ayant préparé une certaine réunion commune d’eux et un banquet. Or le tour du trépied, et sa circulation à travers tous et sa cession se faisant avec une bienveillance pleine-d’émulation mit eux encore davantage en considération et renommée. Car des ''habitants-de-Cos'', comme on dit, jetant le filet, et des hôtes venus de ''Milet'' ayant acheté le coup qui n’était pas encore apparent, un trépied d’-or apparut étant retiré, lequel on dit '''Hélène''' naviguant pour revenir de ''Troie'' avoir jeté là, s’étant souvenue d’un certain oracle ancien. Mais une contestation ayant eu lieu d’abord aux hôtes vis-à-vis des pécheurs au sujet du trépied, ensuite les villes ayant pris-sur-elles le différend qui alla jusqu'à une guerre, la ''Pythie'' répondit aux-uns-et-aux-autres de donner le trépied au plus sage des hommes. Et d’abord il fut envoyé à '''Thalès''' à ''Milet'', les ''habitants-de-Cos'' donnant volontairement à celui-là seul le trépied, au sujet duquel ils avaient fait-la-guerre contre tous les ''Milésiens'' à-la-fois. Mais '''Thalès''' déclarant '''Bias''' plus sage que lui-même, il renvoya vers celui-là. Et de nouveau il fut envoyé par celui-là vers un autre, comme plus sage. Ensuite faisant-le-tour et étant envoyé-successivement ainsi il arriva pour la seconde fois à '''Thalès''' ; et à la fin transporté de ''Milet'' à ''Thèbes'', il fut consacré à ''Apollon Isménien''. Mais '''Théophraste''' dit le trépied avoir été envoyé d’abord à la vérité à ''Priène'' à '''Bias''', mais en-second-lieu à ''Milet'' à '''Thalès''', '''Bias''' l’ayant renvoyé ; et ainsi à travers tous (de l’un à l’autre) être venu-en-faisant-le-tour de nouveau à '''Bias''', et à la fin avoir été envoyé à ''Delphes''. Ces choses donc ont été répandues par plusieurs, excepté qu’ils disent le présent au lieu du trépied les uns être un vase à boire envoyé par '''Crésus''', les autres une coupe. '''Bathyclès''' rayant laissée (laissée par '''Bathyclès'''). </div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f23.item ''chap. II''], traduction littérale et juxtalinéaire présentant le mot à mot français en regard des mots grecs correspondants, par une société de professeurs et d’helléniste, 1862</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Chapitre VI.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;"> Récit d’une entrevue de '''Thalès''' avec '''Solon''', de son stoïcisme, de son célibat et de l’adoption du fils de sa sœur, '''Cybistus'''.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;"> '''VI.''' Ἰδίᾳ δ' Ἀναχάρσεώς τε πρὸς Σόλωνα καὶ πάλιν Θάλεω συνουσίαν τινὰ καὶ λόγους ἀναγράφουσι τοιούτους. [...]<br /><p style="text-indent: 15px"> '''VII.''' Πρὸς Θαλῆν δ' εἰς Μίλητον ἐλθόντα τὸν Σόλωνα θαυμάζειν ὅτι γάμου καὶ παιδοποιΐας τὸ παράπαν ἠμέληκε. Καὶ τὸν Θαλῆν τότε μὲν σιωπῆσαι, διαλιπόντα δ' ὀλίγας ἡμέρας ἄνδρα παρασκευάσαι ξένον, ἀρτίως ἥκειν φάσκοντα δεκαταῖον ἐξ Ἀθηνῶν. Πυθομένου δὲ τοῦ Σόλωνος εἰ δή τι καινὸν ἐν ταῖς Ἀθήναις, δεδιδαγμένον ἃ χρὴ λέγειν τὸν ἄνθρωπον, « οὐδέν,» εἰπεῖν, « ἕτερον, εἰ μὴ νὴ Δία νεανίσκου τινὸς ἦν ἐκφορὰ καὶ προὔπεμπεν ἡ πόλις. Ἦν γὰρ υἱός, ὡς ἔφασαν, ἀνδρὸς ἐνδόξου καὶ πρωτεύοντος ἀρετῇ τῶν πολιτῶν· οὐ παρῆν δέ, ἀλλ' ἀποδημεῖν ἔφασαν αὐτὸν ἤδη πολὺν χρόνον.» « Ὡς δυστυχὴς ἐκεῖνος,» φάναι τὸν Σόλωνα. « Τίνα δὲ ὠνόμαζον αὐτόν;» « ἤκουσα,» φάναι, « τοὔνομα,» τὸν ἄνθρωπον, « ἀλλ' οὐ μνημονεύω· πλὴν ὅτι πολὺς λόγος ἦν αὐτοῦ σοφίας καὶ δικαιοσύνης.» Οὕτω δὴ καθ' ἑκάστην ἀπόκρισιν τῷ φόβῳ προσαγόμενον τὸν Σόλωνα καὶ τέλος ἤδη συντεταραγμένον αὐτὸν ὑποβάλλειν τοὔνομα τῷ ξένῳ, πυνθανόμενον μὴ Σόλωνος ὁ τεθνηκὼς υἱὸς ὠνομάζετο. Φήσαντος δὲ τοῦ ἀνθρώπου, τὸν μὲν ὁρμῆσαι παίειν τὴν κεφαλὴν καὶ τἆλλα ποιεῖν καὶ λέγειν ἃ συμβαίνει τοῖς περιπαθοῦσι, τὸν δὲ Θαλῆν ἐπιλαβόμενον αὐτοῦ καὶ γελάσαντα, « ταῦτά τοι,» φάναι, « ὦ Σόλων, ἐμὲ γάμου καὶ παιδοποιΐας ἀφίστησιν, ἃ καὶ σὲ κατερείπει τὸν ἐρρωμενέστατον. Ἀλλὰ θάρρει τῶν λόγων ἕνεκα τούτων· οὐ γάρ εἰσιν ἀληθεῖς.» ταῦτα μὲν οὖν Ἕρμιππος ἱστορεῖν φησι Πάταικον, ὃς ἔφασκε τὴν Αἰσώπου ψυχὴν ἔχειν.<br /><p style="text-indent: 15px">'''VIII.''' Ἄτοπος δὲ καὶ ἀγεννὴς ὁ τῷ φόβῳ τῆς ἀποβολῆς τὴν κτῆσιν ὧν χρὴ προϊέμενος· οὕτω γὰρ ἄν τις οὐ πλοῦτον, οὐ δόξαν, οὐ σοφίαν ἀγαπήσειε παραγενομένην, δεδιὼς στέρεσθαι. Καὶ γὰρ ἀρετήν, ἧς κτῆμα μεῖζον οὐδὲν οὐδ' ἥδιον, ἐξισταμένην ὑπὸ νόσων καὶ φαρμάκων ὁρῶμεν· αὐτῷ τε '''Θαλῇ''' μὴ γήμαντι πλέον οὐδὲν εἰς ἀφοβίαν, εἰ μὴ καὶ φίλων κτῆσιν ἔφυγε καὶ οἰκείων καὶ πατρίδος. Ἀλλὰ καὶ παῖδα θετὸν ἔσχε ποιησάμενος αὐτὸς τὸν τῆς ἀδελφῆς, ὥς φασι, '''Κύβισθον'''.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm <u>Plutarque, Vie de Solon</u>], ''chap. II'', ''§§6-8'', traduction par [[w:Dominique_Ricard|Dominique Ricard]], 1844<br />(également disponible une édition de 1853 [https://remacle.org/bloodwolf/historiens/Plutarque/solonpierrron.htm ici] et de 1862 [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f26.item là])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 390px; border: 2px solid; text-indent: 15px"><br /><div style="margin: 0 2em; text-align: justify; direction: ltr;">'''VI.''' '''Solon''' connut [[w:Anacharsis|'''Anacharsis''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Anacharsis_back|<sup>🔄</sup>]] et '''Thalès''', et l’on cite des mots qui s’étaient dits dans leurs entrevues. <br /><p style="text-align: center"> [...]<br /><p style="text-indent: 15px; text-align: justify;">'''Solon''' alla à ''Milet'', pour voir '''Thalès''' : là, il lui témoigna sa surprise dans ce qu’il n’avait jamais voulu se marier et avoir des enfants. '''Thalès''' ne répondit rien sur l’heure; mais, quelques jours après, il fit paraître un étranger, qui disait arriver d’''Athènes'', et qu’il n’en était parti que depuis dix jours. '''Solon''' demanda à cet homme s’il n’y avait rien de nouveau à ''Athènes''. Celui-ci, à qui '''Thalès''' avait fait la leçon, répondit qu’il n’y avait rien de nouveau , sinon la mort d’un jeune homme dont toute la ville menait les funérailles. C’était, en effet, à ce qu’on disait, le fils d’un personnage considérable, d’une vertu éprouvée : le père n’était pas alors à ''Athènes'', et il voyageait depuis longtemps. « L’infortuné père! s’écria '''Solon'''. Mais comment s’appelait-il? — Je l’ai entendu nommer, répondit l’étranger, mais j’ai oublié son nom ; je me souviens seulement qu’on ne parlait que de sa sagesse et de sa justice. » A chacune de ces réponses, '''Solon''' sentait augmenter ses craintes; enfin, ne se possédant plus , il suggéra le nom à l’étranger, et lui demanda si le mort n’était pas le fils de '''Solon'''. « Oui. » répondit l’étranger. A cette parole, '''Solon''' se frappa la tête, et il se mit à faire et à dire tout ce qu’inspire une douleur violente. Alors '''Thalès''' lui prit la main, et lui dit en riant : « Voilà, '''Solon''', ce qui m’éloigne de me marier et d’avoir des enfants. J’ai redouté le coup sous lequel tu fléchis, toi le plus ferme des hommes. Mais rassure-toi; car il n’y a rien de vrai dans tout ce qu’on vient de te dire. » [[w:Hermippe_de_Smyrne|'''Hermippus''']] [[#Hermippe|<span id="Hermippe_back"><sup>'''I'''</sup></span>]] rapporte cette histoire d’après '''Patécus''', celui qui prétendait avoir hérité de l’âme d’[[w:Ésope|'''Ésope''']] [[#Ésope|<span id="Ésope_back"><sup>'''II'''</sup></span>]].<br /><p style="text-indent: 15px">Pourtant il y a faute de sens et de cœur à refuser d’acquérir les choses nécessaires, par la crainte de les perdre. A ce compte, on devra n’aimer ni la richesse, ni la gloire, ni la sagesse, quand on les possède, de peur d’en être privé. En effet, la vertu, le plus grand des biens et le plus doux, nous quitte quelquefois par l’action de certaines maladies ou de certains breuvages. '''Thalès''' lui-même, en ne se mariant point, n’était pas pour cela à l’abri de la crainte, à moins qu’il n'eût renoncé aussi à ses parents, à ses amis, à sa patrie. Mais il n’en était rien : il avait adopté, dit-on, '''Cybisthus''', le fils de sa sœur. </div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/viesdeshommesill01plut/page/n6/mode/1up?view=theater <u>Vie des Hommes Illustres de Plutarque</u>], [https://archive.org/details/viesdeshommesill01plut/page/182/mode/1up?view=theater ''Solon''], ''Chap. II'', ''§6'', [https://archive.org/details/viesdeshommesill01plut/page/185/mode/1up?view=theater p.185], traduit par [[w:Alexis_Pierron|Alexis Pierron]], professeur au lycée Louis-le-Grand, 1877<br />(également disponible une édition de 1853 [[s:Vies_des_hommes_illustres/Solon|ici]])</div> {{Boîte déroulante début|titre=NdA trad. par Alexis Pierron de 1877|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Hermippe_back|<span id="Hermippe"><sup>I</sup></span>]] Du nom propre [[w:Nom_théophore|''théophore'']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#théophore_back|<sup>🔄</sup>]] grec ancien Ἕρμιππος / Hérmippos [[wikt:en:Ἕρμιππος#Ancient_Greek|(en)]] ;<br /><p style="margin: 0 2em; text-indent: 15px">➥ du nom propre Ἑρμῆς / Hermês [[wikt:en:Ἑρμῆς#Ancient_Greek|(en)]], « Hermès » ;<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ du nom commun ἵππος / híppos [[wikt:en:ἵππος#Ancient_Greek|(en)]], « cheval » ;<br /><p style="margin: 0 2em; text-indent: 15px">« Péripatéticien » grec, disciple de [[w:Callimaque_de_Cyr%C3%A8ne|Callimaque de ''Cyrène'']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Callimaque_back|<sup>🔄</sup>]], auteur de nombreuses biographies toutes perdues, mais listées par plusieurs auteurs.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] seconde moitié du [[w:IIIe_siècle_av._J.-C.|III<sup>ème</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]]) [https://books.google.fr/books?id=DrvWAAAAMAAJ&newbks=1&newbks_redir=0&lpg=PA497&dq=bibliogroup%3A%22Dictionnaire%20des%20philosophes%20antiques%22&hl=fr&pg=PA655#v=onepage&q&f=false {{Info|<sup>🔍</sup>|Dictionnaire des Philosophes Antiques, publié sous la direction de Richard Goulet, Volume III, §86 - Hermippe de Smyrne}}] <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Ésope_back|<span id="Ésope"><sup>II</sup></span>]] Du nom propre grec ancien Αἴσωπος / Aísōpos [[wikt:en:Αἴσωπος#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">➥ du nom commun αἶσα / aîsa, « destin »;<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ du nom commun ὄψ / óps, « voix »;<br /><br /><p style="margin: 0 2em; text-indent: 15px">Auteur grec de fable.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] seconde moitié du [[w:VIe_siècle_av._J.-C.|VI<sup>ème</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]]) [https://books.google.fr/books?id=DrvWAAAAMAAJ&newbks=1&newbks_redir=0&lpg=PA497&dq=bibliogroup%3A%22Dictionnaire%20des%20philosophes%20antiques%22&hl=fr&pg=PA240#v=onepage&q&f=false {{Info|<sup>🔍</sup>|Dictionnaire des Philosophes Antiques, publié sous la direction de Richard Goulet, Volume III, §60 - Ésope(Αἴσωπος)}}]'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">'''V.''' Voici les particularités qu’on raconte d’une entrevue de '''Solon''' avec '''Anacharsis''', et d’un entretien qu’il eut avec '''Thalès'''.<br /><p style="text-align: center"> [...]<br /><p style="text-indent: 15px; text-align: justify;">'''VI.''' '''Solon''', étant allé à ''Milet'' pour voir '''Thalès''', lui témoigna sa surprise de ce qu’il n’avait jamais voulu se marier et avoir des enfants. '''Thalès''' ne lui répondit rien dans le moment; mais ayant laissé passer quelques jours, il fit paraître un étranger qui disait arriver d’''Athènes'', d’où il était parti depuis dix jours. '''Solon''' lui demanda s’il n’y avait rien de nouveau, lorsqu’il en était parti. Cet homme, à qui '''Thalès''' avait fait la leçon, lui répondit qu’il n’y avait autre chose que la mort d’un jeune homme dont toute la ville accompagnait le convoi. C’était, disait-on, le fils d’un des premiers et des plus vertueux citoyens, qui n'’était pas alors à ''Athènes'' et qui voyageait depuis longtemps, « Le malheureux père! s’écria Solon. Comment s’appelle-t-il? ― Je l’ai entendu nommer, répondit l’étranger; mais j’ai oublié son nom; je me souviens seulement qu’on ne parlait que de sa sagesse et de sa justice. » A chacune de ces réponses, les craintes de '''Solon''' augmentaient; enfin, troublé, hors de lui-même, il suggéra le nom à l’étranger, et lui demanda si ce jeune homme n’était pas le fils de '''Solon'''. « C’est lui-même, » dit l’autre. A cette parole, '''Solon''', se frappant la tête, se mit à faire et à dire tout ce que la douleur la plus violente peut inspirer. Alors '''Thalès''' l’arrêta et lui dit en souriant : « Voilà, '''Solon''', ce qui m’a éloigné de me marier et d’avoir des enfants; j’ai redouté le coup qui vous accable aujourd’hui, et contre lequel toute votre fermeté est impuissante. Mais rassurez-vous ; il n’y a rien de vrai dans tout ce qu’on vient de vous dire. » '''Hermippus''' rapporte cette histoire d’après le récit qu’en fait '''Patécus''', qui prétendait avoir hérité de l’âme d’'''Ésope'''.<br /><p style="text-indent: 15px; text-align: justify;">'''VII.''' Cependant c’est manquer de sens et de courage que de renoncer à acquérir des choses nécessaires par la crainte de les perdre. A ce compte, il ne faudrait aimer ni la richesse, ni la gloire, ni la sagesse, quand on les possède, de peur d’en être privé. La vertu même, le plus grand et le plus agréable des biens, se perd souvent par l’effet. de quelques maladies ou de certains breuvages. '''Thalès''' lui-même, en ne se mariant point, n’était pas à l’abri de toute crainte, à moins qu’il ne renonçât aussi à ses parents, à ses amis et à sa patrie. Mais au contraire, il avait adopté '''Cybistus''', le fils de sa sœur. </div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f26.item ''chap. II''], traduction correcte et précédée du texte grec, par une société de professeurs et d’helléniste, 1862<br />(également disponible une édition de 1844 [https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm#1a ici] et de 1829 [[s:Les_Vies_des_hommes_illustres/Vie_de_Solon|là]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">'''V.''' Mais en particulier on rapporte une certaine entrevue et de tels discours et d’'''Anacharsis''' à '''Solon''' et une-autre-fois de '''Thalès'''.<br /><p style="text-align: center"> [...]<br /><p style="text-indent: 15px; text-align: justify;">'''VI.''' Et on raconte '''Solon''' étant venu vers '''Thalès''' à ''Milet'' s’étonner de ce qu’il avait négligé absolument le mariage et la création-d’enfants. Et '''Thalès''' alors à la vérité s’être tu, mais ayant laissé-d’intervalle peu-de jours, avoir aposté un homme étranger, disant être arrivé récemment parti-depuis-dix-jours d’''Athènes''. Et '''Solon''' s’étant informé si donc il y a quelque chose de nouveau à ''Athènes'', l’homme instruit des choses qu’il faut dire n’avoir dit aucune autre chose, si ce n’est :<br /><p style="text-indent: 15px"> « Par '''Jupiter''', il y avait le convoi d’un certain jeune-homme, et la ville l’accompagnait. Car il était fils, comme on disait, d’un homme illustre et étant-le-premier des citoyens par la vertu; mais il n’était-pas-présent, mais on disait lui être-en-voyage depuis un temps déjà long.<br /><p style="text-align: left; text-indent: 15px">― Combien cet homme-là est malheureux! avoir dit '''Solon'''. Mais quel (comment) appelaient-ils lui ?<br /><p style="text-align: left; text-indent: 15px">― J’ai entendu le nom, avoir dit l’homme (répondit l’étranger), mais je ne me le rappelle pas; excepté qu’un discours fréquent était de la sagesse et de la justice de lui. »<br /><p style="text-indent: 15px">'''Solon''' donc étant-approché ainsi de-la crainte à chaque réponse, et à la fin déjà étant tout-troublé, lui-même avoir suggéré le nom à l’étranger, demandant si le mort n’était pas nommé fils de '''Solon'''. Et l’homme ayant dit-oui, celui-ci ('''Solon''') avoir commencé à frapper sa tête, et à faire et à dire les autres choses, qu’il arrive de faire et de dire à ceux affligés-à-l’excès. Mais '''Thalès''' ayant arrêté lui, et ayant ri, avoir dit :<br /><p style="text-indent: 15px">« Ces choses donc, ô '''Solon''', écartent moi du mariage et de la création-d’enfants, lesquelles abattent même toi le très-fort. Mais aie-confiance quant-à ces discours: car ils ne sont pas vrais. »<br /><p style="text-indent: 15px">'''Hermippe''' donc dit '''Patécus''', qui disait-souvent avoir l’âme d’'''Ésope''', raconter ces choses. <br /><p style="text-indent: 15px">'''VII.''' Or il est absurde et dépourvu de courage celui rejetant par la crainte de la perte l’acquisition des choses qu’il faut; car ainsi quelqu’un n’aimerait pas la richesse, n’aimerait pas la gloire, n’aimerait pas la sagesse étant survenue à lui, craignant (par crainte) d’en être privé. Et en effet nous voyons la vertu, au prix de laquelle aucune possession n’est plus grande, ni plus agréable, déplacée (chassée) par des maladies et des breuvages; et rien de plus n’être pour l’exemption-de-crainte à '''Thalès''' lui-même ne s’étant pas marié, s’il n’avait pas évité la possession et d’amis et de parents et de patrie. Mais même il eut un fils adoptif se l’étant fait tel lui-même, celui de sa sœur, comme on dit '''Cybisthe'''.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f27.item ''chap. II''], traduction littérale et juxtalinéaire présentant le mot à mot français en regard des mots grecs correspondants, par une société de professeurs et d’helléniste, 1862</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ====== <div style="text-align: center;">Paragraphe XV.</div> ====== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;"> Testament d’inhumation de '''Thalès'''.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">'''XV.''' Καὶ φόβοι τινὲς ἐκ δεισιδαιμονίας ἅμα καὶ φάσματα κατεῖχε τὴν πόλιν, οἵ τε μάντεις ἄγη καὶ μιασμοὺς δεομένους καθαρμῶν προφαίνεσθαι διὰ τῶν ἱερῶν ἠγόρευον. Οὕτω δὴ μετάπεμπτος αὐτοῖς ἧκεν ἐκ Κρήτης Ἐπιμενίδης ὁ Φαίστιος, ὃν ἕβδομον ἐν τοῖς σοφοῖς καταριθμοῦσιν ἔνιοι τῶν οὐ προσιεμένων τὸν Περίανδρον. Ἐδόκει δέ τις εἶναι θεοφιλὴς καὶ σοφὸς περὶ τὰ θεῖα τὴν ἐνθουσιαστικὴν καὶ τελεστικὴν σοφίαν, διὸ καὶ παῖδα νύμφης ὄνομα Βάλτης καὶ Κούρητα νέον αὐτὸν οἱ τότε ἄνθρωποι προσηγόρευον. <br /><p style="text-align: center">[...]<br /><p style="text-indent: 15px; text-align: justify;">Τὸ δὲ μέγιστον, ἱλασμοῖς τισι καὶ καθαρμοῖς καὶ ἱδρύσεσι κατοργιάσας καὶ καθοσιώσας τὴν πόλιν ὑπήκοον τοῦ δικαίου καὶ μᾶλλον εὐπειθῆ πρὸς ὁμόνοιαν κατέστησε. Λέγεται δὲ τὴν Μουνυχίαν ἰδὼν καὶ καταμαθὼν πολὺν χρόνον, εἰπεῖν πρὸς τοὺς παρόντας ὡς τυφλόν ἐστι τοῦ μέλλοντος ἄνθρωπος· ἐκφαγεῖν γὰρ ἂν Ἀθηναίους τοῖς αὑτῶν ὀδοῦσιν, εἰ προῄδεσαν ὅσα τὴν πόλιν ἀνιάσει τὸ χωρίον· ὅμοιον δέ τι καὶ Θαλῆν εἰκάσαι λέγουσι· κελεῦσαι γὰρ αὐτὸν ἔν τινι τόπῳ τῆς Μιλησίας φαύλῳ καὶ παρορωμένῳ τελευτήσαντα θεῖναι, προειπὼν ὡς ἀγορά ποτε τοῦτο Μιλησίων ἔσται τὸ χωρίον. Ἐπιμενίδης μὲν οὖν μάλιστα θαυμασθείς, καὶ χρήματα διδόντων πολλὰ καὶ τιμὰς μεγάλας τῶν Ἀθηναίων, οὐδὲν ἢ θαλλὸν ἀπὸ τῆς ἱερᾶς ἐλαίας αἰτησάμενος καὶ λαβὼν ἀπῆλθεν. </div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm <u>Plutarque, Vie de Solon</u>], ''chap. II'', ''§15'', traduction par [[w:Dominique_Ricard|Dominique Ricard]], 1844<br />(également disponible une édition de 1853 [https://remacle.org/bloodwolf/historiens/Plutarque/solonpierrron.htm ici] et de 1862 [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f26.item là])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 390px; border: 2px solid; text-indent: 15px"><br /><div style="margin: 0 2em; text-align: justify; direction: ltr;">'''XV.''' Au chagrin que ces pertes causèrent à ceux-ci [les ''Athéniens''], se joignirent des craintes superstitieuses dont la ville [''Athènes''] fut frappée, et qui venaient d’apparitions de spectres et de fantômes. Les devins déclarèrent aussi que l’état des victimes qu’ils avaient offertes annonçait des crimes et des profanations qu’il fallait expier. On fit donc venir de ''Crète'' [[w:Épiménide|'''Épiménide''']] [[#Épiménide|<span id="Épiménide_back"><sup>'''I'''</sup></span>]] le [[w:Phaistos|''Phestien'']] [[#Phaistos|<span id="Phaistos_back"><sup>'''II'''</sup></span>]], qui est mis au nombre des sept sages par ceux qui n’y comptent pas '''Périandre'''. Il passait pour un homme chéri des dieux, doué d’une grande sagesse, fort instruit des choses divines, surtout versé dans la science des inspirations et dans la connaissance des mystères; on l’appelait, même de son vivant, le nouveau [[w:Curètes|'''Curète''']], le fils de la nymphe '''Balté'''.<br /><p style="text-align: center">[...]<br /><p style="text-indent: 15px; text-align: justify;">Mais ce qui était plus important, il fit un grand nombre d’expiations et de sacrifices, il fonda plusieurs temples; et par ces différentes cérémonies il purifia entièrement la ville, en bannit l’impiété et l’injustice, et la rendit plus soumise, plus disposée à l’union et à la paix. On rapporte aussi que lorsqu’il vit le fort de [[w:Munichie|''Munychium'']] [[#Munichie|<span id="Munichie_back"><sup>'''III'''</sup></span>]], il le considéra longtemps, et dit à ceux qui l’accompagnaient : Que les hommes sont aveugles sur l’avenir ! Si les ''Athéniens'' pouvaient prévoir tous les maux que ce lieu doit un jour causer à leur ville, ils l’emporteraient à belles dents ». '''Thalès''' eut aussi, dit-on, un pressentiment à peu près semblable. Il ordonna qu’on l’enterrât dans le lieu le plus sauvage et le plus désert du territoire de ''Milet''; et il prédit aux ''Milésiens'' qu’un jour leur marché public y serait transporté. Les ''Athéniens'', pleins de reconnaissance et d’admiration pour '''Épiménide''', voulurent le combler d’honneurs et de présents; mais il ne demanda qu’une branche de l’olivier sacré, qui lui fut accordée, et il s’en retourna en ''Crète''.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://archive.org/details/viesdeshommesill01plut/page/n6/mode/1up?view=theater <u>Vie des Hommes Illustres de Plutarque</u>], [https://archive.org/details/viesdeshommesill01plut/page/182/mode/1up?view=theater ''Solon''], ''Chap. II'', ''§15'',[https://archive.org/details/viesdeshommesill01plut/page/185/mode/1up?view=theater p.185], traduit par [[w:Alexis_Pierron|Alexis Pierron]], professeur au lycée Louis-le-Grand, 1877<br />(également disponible une édition de 1853 [[s:Vies_des_hommes_illustres/Solon|ici]])</div> {{Boîte déroulante début|titre=NdA trad. par Alexis Pierron de 1877|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Épiménide_back|<span id="Épiménide"><sup>I</sup></span>]] Du nom propre grec ancien Ἐπιμενίδης / Epimenídēs [[wikt:en:Ἐπιμενίδης#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">Poète, philosophe et [[w:Iatromante|''iatromante'']] crétois.<br /><p style="text-align: right; margin: 0 2em;">([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] milieu du [[w:VIe_siècle_av._J.-C.|VI<sup>ème</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]]) <br /><br /><p style="margin: 0 2em; text-indent: 15px">'''[[#Phaistos_back|<span id="Phaistos"><sup>II</sup></span>]] Du nom propre grec ancien Φαιστός / Phaistós [[wikt:en:Φαιστός#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px">Ancienne ville du Sud de la [[w:Histoire_de_la_Crète#Antiquité|''Crète'']].<br /><br /><p style="margin: 0 2em; text-indent: 15px">[[#Munichie_back|<span id="Munichie"><sup>III</sup></span>]] Du nom propre grec ancien Μουνιχία / Mounikhia [[wikt:en:Μουνυχία#Grec_ancien|(en)]] ;<br /><p style="margin: 0 2em; text-indent: 15px">Nom d’une colline du [[w:Le_Pirée|''Pirée'']] et de l’[[w:Port_de_Munichie|un des ports du ''Pirée'']].'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">'''XII.''' Au chagrin que ces pertes causèrent à ceux-ci, se joignirent des craintes superstitieuses dont la ville fut frappée, et qui venaient d’apparitions de spectres et de fantômes. Les devins déclarèrent aussi que l’état des victimes annonçait des crimes et des profanations qu’il fallait expier. On fit donc venir de ''Crète'' '''Épiménide''' le ''Phestien'' qui est mis au nombre des sept sages par ceux qui n’y comptent pas '''Périandre'''. Il passait pour un homme chéri des dieux, doué d’une grande sagesse, fort instruit des choses divines, surtout versé dans la science des inspirations et dans la connaissance des mystères; on l’appelait, même de son vivant, le nouveau '''Curète''', le fils de la nymphe '''Balté'''.<br /><p style="text-align: center">[...]<br /><p style="text-indent: 15px; text-align: justify;">Mais ce qui était plus important, il fit un grand nombre d’expiations et de sacrifices; il fonda plusieurs temples; et par ces différentes cérémonies, il purifia entièrement la ville, en bannit l’impiété et l’injustice, et la rendit plus soumise, plus disposée à l’union et à la paix. On rapporte aussi que lorsqu’il vit ''Munychie'', il la considéra longtemps, et dit à ceux qui l’accompagnaient :<br /><p style="text-align: justify; text-indent: 15px"> « Que les hommes sont aveugles sur l’avenir! Si les ''Athéniens'' pouvaient prévoir tous les maux que ce lieu doit un jour causer à leur ville, il l’emporteraient à belles dents. »<br /><p style="text-align: justify; text-indent: 15px"> '''Thalès''' eut aussi, dit-on, un pressentiment à peu près semblable. Il ordonna qu’on l’enterrât dans le lieu le plus sauvage et le plus désert du territoire de ''Milet''; et il prédit aux ''Milésiens'' qu’un jour leur marché public y serait transporté. Les ''Athéniens'', pleins de reconnaissance et d’admiration pour '''Épiménide''', voulurent le combler d’honneurs et de présents; mais il ne demanda qu’une branche de l’olivier sacré, qui lui fut accordée, et il s’en retourna en ''Crète''.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f58.item ''chap. II''], traduction correcte et précédée du texte grec, par une société de professeurs et d’helléniste, 1862<br />(également disponible une édition de 1844 [https://remacle.org/bloodwolf/historiens/Plutarque/solon.htm#1a ici] et de 1829 [[s:Les_Vies_des_hommes_illustres/Vie_de_Solon|là]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">Et certaines craintes nées de la superstition en-même-temps aussi des apparitions occupaient la ville; et les devins disaient des impiétés et des souillures ayant-besoin de purifications être indiquées par les victimes. Et ainsi vint à eux mandé (ils firent venir) de ''Crète'' '''Épiménide''' le ''Phestien'', que quelques-uns de ceux n’admettant pas '''Périandre''' comptent le septième parmi les sages. Or il avait-la-réputation d’être un homme ami-des-dieux, et habile dans la science de-l’inspiration et des-mystères. C’est-pourquoi les hommes d’alors appelaient lui et fils de la nymphe de nom (nommée) '''Balté''', et nouveau '''Curète'''.<br /><p style="text-align: center">[...]<br /><p style="text-indent: 15px; text-align: justify;">Mais le plus grand (le plus important), ayant initié-aux-mystères et ayant purifié la ville par certaines expiations et purifications et fondations, il la rendit prêtant-l’oreille à la justice et plus obéissante pour la concorde. Et il est dit, ayant vu ''Munychie'' et l’ayant examinée un temps long, avoir dit à ceux présents, que l’homme est un être aveugle sur l’avenir ; car les ''Athéniens'' avoir dû manger ''Munychie'' avec les dents d’eux-mêmes, s’ils avaient prévu en combien de choses cette place affligera la ville. Et on dit aussi '''Thalès''' avoir conjecturé quelque chose de semblable; lui avoir ordonné en effet de placer lui ayant cessé de vivre dans un certain lieu de la ''Milésie'' méprisé et dédaigné, ayant prédit que cet endroit sera (serait) un jour le marché des ''Milésiens''. '''Épiménide''' donc ayant été admiré très-grandement, et les ''Athéniens'' lui donnant des sommes nombreuses et des honneurs grands, n’ayant demandé rien qu’un rameau détaché de l’olivier sacré et l’ayant pris (reçu) s’en alla.</div> <div style="text-align: right; margin: 0 2em 0 1em;">[https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f7.item <u>Plutarque, Vie de Solon</u>], [https://gallica.bnf.fr/ark:/12148/bpt6k6226675w/f59.item ''chap. II''], traduction littérale et juxtalinéaire présentant le mot à mot français en regard des mots grecs correspondants, par une société de professeurs et d’helléniste, 1862</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">═✳═</div> === [[w:Œuvres_morales|Œuvres morales]] === <div style="text-align: center; margin: 0 1em;">Ensemble de 78 textes de traitant de sujets extrêmement variés (religieux, éthiques, politiques, philosophiques, littéraires, historiques), et s'inscrivant dans des genres littéraires également divers (traité, différentes sortes de dialogues, lettres, réponses à des Questions ([[wikt:ζήτημα#Grec_ancien|''zetemata'']]), « dits » ([[w:Apophtegme|''apophtegmes'']])).</div> ==== Le Banquet des Sept Sages ==== <div style="text-align: center; margin: 0 1em;">Dialogue faisant intervenir 20 personnages, dont une liste des sept sages : '''Thalès''', [[w:Solon|'''Solon''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Solon_back|<sup>🔄</sup>]], [[w:Bias_de_Priène|'''Bias''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Bias_back|<sup>🔄</sup>]], [[w:Chilon|'''Chilon''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Chilon_back|<sup>🔄</sup>]], [[w:Cléobule|'''Cléobule''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Cléobule_back|<sup>🔄</sup>]], [[w:Pittacos_de_Mytil%C3%A8ne|'''Pittacos''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Pittacos_back|<sup>🔄</sup>]], [[w:Périandre|'''Périandre''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Périandre_back|<sup>🔄</sup>]].<br />À ceux-ci se rajoutent : [[w:Anacharsis|'''Anacharsis''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Anacharsis_back|<sup>🔄</sup>]], '''Ésope''', '''Dioclès''', '''Nicarque''', [[w:Cléobuline|'''Cléobuline''']] [[#Cléobuline|<span id="Cléobuline_back"><sup>'''I'''</sup></span>]], '''Mélissa''', '''Niloxène''', '''Alexidème''', '''Ardalus''', '''Cléodème''', '''Mnésiphile''', '''Chersias''', [[w:Gorgias|'''Gorgias''']] [[Philosophie/Thalès_de_Milet/Textes_et_traductions_Ier_millénaire_AEC#Gorgias_back|<sup>🔄</sup>]].</div> {{Boîte déroulante début|titre=NdA Le Banquet des Septs Sages|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Cléobuline_back|<span id="Cléobuline"><sup>I</sup></span>]] Du nom propre grec ancien Κλεοβουλίνη / Kleoboulinè ;<br /><p style="margin: 0 2em; text-indent: 15px">➥ de Κλεόβουλος / Kleóboulos [[wikt:en:Κλεόβουλος#Ancient_Greek|(en)]], « Cléobule, le père de Cléobuline » <br /><p style="margin: 0 2em; text-indent: 15px">➥ du suffixe adjectival féminin -ῑ́νη / -ī́nē [[wikt:en:-ίνη#Ancient_Greek|(en)]], relatif à la matière, au temps, etc. : « fait de, pendant la durée de » ;<br /><p style="margin: 0 2em; text-indent: 15px">Philosophe et poétesse grecque, célèbre pour ses énigmes, fille du [[w:Tyran|''tyran'']] Cléobule, qui la surnommerait Εὔμητις / Eúmētis, « la Prudente » selon Plutarque. '''<br/><br/></div> {{Boîte déroulante fin}} ===== <div style="text-align: center;">Paragraphe I.</div> ===== :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§1. Ἦ που προϊὼν ὁ χρόνος, ὦ '''Νίκαρχε''', πολὺ σκότος ἐπάξει τοῖς πράγμασι καὶ πᾶσαν ἀσάφειαν, εἰ νῦν ἐπὶ προσφάτοις οὕτω καὶ νεαροῖς λόγοι ψευδεῖς συντεθέντες ἔχουσι πίστιν. οὔτε γὰρ μόνων, ὡς ὑμεῖς ἀκηκόατε, τῶν ἑπτὰ γέγονε τὸ συμπόσιον, ἀλλὰ πλειόνων ἢ δὶς τοσούτων (ἐν οἷς καὶ αὐτὸς ἤμην, συνήθης μὲν ὢν '''Περιάνδρῳ''' διὰ τὴν τέχνην, ξένος δὲ '''Θάλεω'''· παρ´ ἐμοὶ γὰρ κατέλυσεν ὁ ἀνὴρ '''Περιάνδρου''' κελεύσαντος), οὔτε τοὺς λόγους ὀρθῶς ἀπεμνημόνευσεν ὅστις ἦν ὑμῖν ὁ διηγούμενος· ἦν δ´ ὡς ἔοικεν οὐδεὶς τῶν παραγεγονότων. ἀλλ´ ἐπεὶ σχολή τε πάρεστι πολλὴ καὶ τὸ γῆρας οὐκ ἀξιόπιστον ἐγγυήσασθαι τὴν ἀναβολὴν τοῦ λόγου, προθυμουμένοις ὑμῖν ἀπ´ ἀρχῆς ἅπαντα διηγήσομαι. </div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §1'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§1. '''D<span style ="font-size:85%;">IOCLÈS</span>'''. Certainement le long cours des âges, mon cher '''Nicarque''', jettera sur les faits d’épaisses ténèbres et une complète incertitude, puisque dès aujourd’hui, à propos de choses si récentes et si nouvelles, des relations mensongères et controuvées obtiennent crédit. Car d’abord le banquet en question ne se composait pas seulement des sept sages, comme vous autres l’avez ouï dire. Les convives étaient plus du double de ce nombre. J’en faisais moi-même partie, comme familier de '''Périandre''' en raison de notre profession commune, et comme hôte de '''Thalès''' : ce dernier était en effet descendu chez moi sur la recommandation de '''Périandre'''. Ensuite, on ne vous en a pas rapporté fidèlement les entretiens lorsqu’on vous a fait ce récit. Il faut que celui de qui vous le tenez n’ait pas été un des convives. Mais puisque nous avons un ample loisir et que la vieillesse est un garant trop peu sûr pour nous autoriser à remettre cet entretien, je vais, suivant votre désir unanime, vous en raconter tous les détails à partir du commencement. </div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §1'', traduction par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870<br/>(également disponible [[s:Page:Plutarque_-_Œuvres_complètes_de_Plutarque_-_Œuvres_morales_et_œuvres_diverses,_tome_1,_1870.djvu/424|ici]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">'''D<span style ="font-size:85%;">IOCLÈS</span>'''. Quelle incertitude et quelle obscurité la succession des temps ne doit-elle pas répandre sur l’histoire, mon cher '''Nicarque''', puisque, dans des faits récents, et qui se sont passés presque sous nos yeux, le faux prend la place du vrai ? Ce banquet n’était pas, comme on vous l’a dit, composé seulement des sept sages ; les convives étaient plus du double de ce nombre. J’y assistai moi-même, et comme ami de '''Périandre''', avec qui ma profession ma lié depuis longtemps [[#Dioclès_NdT_DR|<span id="Dioclès_NdT_DR_back"><sup>1</sup></span>]], et comme hôte de '''Thalès''', à qui '''Périandre''' avait fait marquer son logement chez moi. Celui qui vous a fait le récit de ce qui s’y est passé n’en était sûrement pas, et vous a trompé sur presque tous les points. Mais, puisque nous en avons le loisir, et que notre âge avancé ne nous permet guère de différer, je vais vous satisfaire et vous en raconter tous les détails.</div> <table cellspacing=15 style="margin: 0 4em; font-size:85%;"> <tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Dioclès_NdT_DR_back|<span id="Dioclès_NdT_DR"><sup>1.</sup></span>]] Dioclès était devin.''' </td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe II.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage de la simplicité de '''Thalès''', de sa mesure de la pyramide d’''Égypte'', et de son aversion des [[w:Tyran|''tyrans'']] et des rois.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§2. Παρεσκευάκει μὲν γὰρ οὐκ ἐν τῇ πόλει τὴν ὑποδοχὴν ὁ Περίανδρος, ἀλλ´ ἐν τῷ περὶ τὸ Λέχαιον ἑστιατορίῳ παρὰ τὸ τῆς Ἀφροδίτης ἱερόν, ἧς ἦν καὶ ἡ θυσία. μετὰ γὰρ τὸν ἔρωτα τῆς μητρὸς αὐτοῦ προεμένης τὸν βίον ἑκουσίως οὐ τεθυκὼς τῇ Ἀφροδίτῃ, τότε πρῶτον ἔκ τινων ἐνυπνίων τῆς Μελίσσης ὥρμησε τιμᾶν καὶ θεραπεύειν τὴν θεόν. Τῶν δὲ κεκλημένων ἑκάστῳ συνωρὶς ἱκανῶς κεκοσμημένη προσήχθη· καὶ γὰρ ὥρα θέρους ἦν, καὶ τὴν ὁδὸν ἅπασαν ὑπὸ πλήθους ἁμαξῶν καὶ ἀνθρώπων ἄχρι θαλάττης κονιορτὸς καὶ θόρυβος κατεῖχεν. ὁ μέντοι Θαλῆς τὸ ζεῦγος ἐπὶ ταῖς θύραις ἰδὼν καὶ μειδιάσας ἀφῆκεν. ἐβαδίζομεν οὖν ἐκτραπόμενοι διὰ τῶν χωρίων, καθ´ ἡσυχίαν, καὶ μεθ´ ἡμῶν τρίτος ὁ Ναυκρατίτης Νειλόξενος, ἀνὴρ ἐπιεικὴς καὶ τοῖς περὶ Σόλωνα καὶ Θαλῆν γεγονὼς ἐν Αἰγύπτῳ συνήθης. ἐτύγχανε δὲ πρὸς Βίαντα πάλιν ἀπεσταλμένος· ὧν δὲ χάριν οὐδ´ αὐτὸς ᾔδει, πλὴν ὑπενόει πρόβλημα δεύτερον αὐτῷ κομίζειν ἐν βιβλίῳ κατασεσημασμένον· εἴρητο γάρ, εἰ Βίας ἀπαγορεύσειεν, ἐπιδεῖξαι τοῖς σοφωτάτοις Ἑλλήνων τὸ βιβλίον. « Ἕρμαιον » ὁ Νειλόξενος ἔφη « μοι γέγονεν ἐνταῦθα λαβεῖν ἅπαντας ὑμᾶς, καὶ κομίζω τὸ βιβλίον ὡς ὁρᾷς ἐπὶ τὸ δεῖπνον. » ἅμα δ´ ἡμῖν ἐπεδείκνυε. Καὶ ὁ Θαλῆς γελάσας « εἴ τι κακόν, » εἶπεν, « αὖθις εἰς Πριήνην· διαλύσει γὰρ ὁ Βίας, ὡς διέλυσεν αὐτὸς τὸ πρῶτον. » « Τί δ´ ἦν, » ἔφην ἐγώ, « τὸ πρῶτον; » « Ἱερεῖον, » εἶπεν, « ἔπεμψεν αὐτῷ, κελεύσας τὸ πονηρότατον ἐξελόντα καὶ χρηστότατον ἀποπέμψαι κρέας. ὁ δ´ ἡμέτερος εὖ καὶ καλῶς τὴν γλῶτταν ἐξελὼν ἔπεμψεν· ὅθεν εὐδοκιμῶν δῆλός ἐστι καὶ θαυμαζόμενος. » « Οὐ διὰ ταῦτ´ » ἔφη « μόνον » ὁ Νειλόξενος, « ἀλλ´ οὐ φεύγει τὸ φίλος εἶναι καὶ λέγεσθαι βασιλέων καθάπερ ὑμεῖς, ἐπεὶ σοῦ γε καὶ τἄλλα θαυμάζει, καὶ τῆς [[wikt:en:πυραμίδος#Ancient_Greek|πυραμίδος]] τὴν μέτρησιν ὑπερφυῶς ἠγάπησεν, ὅτι πάσης ἄνευ πραγματείας καὶ μηδενὸς ὀργάνου δεηθεὶς ἀλλὰ τὴν βακτηρίαν στήσας ἐπὶ τῷ πέρατι τῆς σκιᾶς ἣν ἡ πυραμὶς ἐποίει, γενομένων τῇ ἐπαφῇ τῆς ἀκτῖνος δυεῖν τριγώνων, ἔδειξας ὃν ἡ σκιὰ πρὸς τὴν σκιὰν λόγον εἶχε τὴν πυραμίδα πρὸς τὴν βακτηρίαν ἔχουσαν. ἀλλ´, ὅπερ ἔφην, διεβλήθης μισοβασιλεὺς εἶναι, καί τινες ὑβριστικαί σου περὶ τυράννων ἀποφάσεις ἀνεφέροντο πρὸς αὐτόν, ὡς ἐρωτηθεὶς ὑπὸ Μολπαγόρου τοῦ Ἴωνος τί παραδοξότατον εἴης ἑωρακώς, ἀποκρίναιο ‘τύραννον γέροντα,’ καὶ πάλιν ἔν τινι πότῳ, περὶ τῶν θηρίων λόγου γενομένου, φαίης κάκιστον εἶναι τῶν μὲν ἀγρίων θηρίων τὸν τύραννον, τῶν δ´ ἡμέρων τὸν κόλακα· ταῦτα γάρ, εἰ καὶ πάνυ προσποιοῦνται διαφέρειν οἱ βασιλεῖς τῶν τυράννων, οὐκ εὐμενῶς ἀκούουσιν. » « Ἀλλὰ τοῦτο μέν, » εἶπεν ὁ Θαλῆς, « Πιττακοῦ ἐστιν, εἰρημένον ἐν παιδιᾷ ποτε πρὸς Μυρσίλον· ἐγὼ δὲ θαυμάσαιμ´ ἄν, » ἔφη, « οὐ τύραννον ἀλλὰ [[wikt:κυβερνήτης#Grec_ancien|'''κυβερνήτην''']] γέροντα θεασάμενος. πρὸς δὲ τὴν μετάθεσιν τὸ τοῦ νεανίσκου πέπονθα τοῦ βαλόντος μὲν ἐπὶ τὴν κύνα πατάξαντος δὲ τὴν μητρυιὰν καὶ εἰπόντος ‘οὐδ´ οὕτω κακῶς.’ διὸ καὶ Σόλωνα σοφώτατον ἡγησάμην οὐ δεξάμενον τυραννεῖν. καὶ Πιττακὸς οὗτος εἰ μοναρχίᾳ μὴ προσῆλθεν, οὐκ ἂν εἶπεν ὡς ‘χαλεπὸν ἐσθλὸν ἔμμεναι.’ Περίανδρος δ´ ἔοικεν ὥσπερ ἐν νοσήματι πατρῴῳ τῇ τυραννίδι κατειλημμένος οὐ φαύλως ἐξαναφέρειν, χρώμενος ὁμιλίαις ὑγιειναῖς ἄχρι γε νῦν καὶ συνουσίας ἀνδρῶν νοῦν ἐχόντων ἐπαγόμενος, ἃς δὲ '''Θρασύβουλος''' αὐτῷ κολούσεις τῶν ἄκρων οὑμὸς πολίτης ὑφηγεῖται μὴ προσιέμενος. γεωργοῦ γὰρ [[wikt:en:αἶρα#Ancient_Greek|αἴρας]] καὶ [[wikt:ononis|ὀνώνιδας]] ἀντὶ [[wikt:πυρός#Grec_ancien|πυρῶν]] καὶ [[wikt:κριθή#Grec_ancien|κριθῶν]] συγκομίζειν ἐθέλοντος οὐδὲν διαφέρει τύραννος ἀνδραπόδων μᾶλλον ἄρχειν ἢ ἀνδρῶν βουλόμενος· ἓν γὰρ ἀντὶ πολλῶν κακῶν ἀγαθὸν αἱ δυναστεῖαι τὴν τιμὴν ἔχουσι καὶ τὴν δόξαν, ἄνπερ ἀγαθῶν ὡς κρείττονες ἄρχωσι καὶ μεγάλων μείζονες εἶναι δοκῶσι· τὴν δ´ ἀσφάλειαν ἀγαπῶντας ἄνευ τοῦ καλοῦ προβάτων ἔδει πολλῶν καὶ ἵππων καὶ βοῶν ἄρχειν, μὴ ἀνθρώπων. ἀλλὰ γὰρ εἰς οὐδὲν προσήκοντας ἐμβέβληκεν ἡμᾶς, » ἔφη, « ὁ ξένος οὑτοσὶ λόγους, ἀμελήσας λέγειν τε καὶ ζητεῖν ἃ ἁρμόττει ἐπὶ δεῖπνον βαδίζουσιν. ἦ γὰρ οὐκ οἴει, καθάπερ ἑστιάσοντος ἔστι τις παρασκευή, καὶ δειπνήσοντος εἶναι; Συβαρῖται μὲν γὰρ ὡς ἔοικε πρὸ ἐνιαυτοῦ τὰς κλήσεις ποιοῦνται τῶν γυναικῶν, ὅπως ἐκγένοιτο κατὰ σχολὴν παρασκευασαμέναις ἐσθῆτι καὶ χρυσῷ φοιτᾶν ἐπὶ τὸ δεῖπνον· ἐγὼ δὲ πλείονος οἶμαι χρόνου δεῖσθαι τὴν ἀληθινὴν τοῦ δειπνήσοντος ὀρθῶς παρασκευήν, ὅσῳ χαλεπώτερόν ἐστιν ἤθει τὸν πρέποντα κόσμον ἢ σώματι τὸν περιττὸν ἐξευρεῖν καὶ ἄχρηστον. οὐ γὰρ ὡς ἀγγεῖον ἥκει κομίζων ἑαυτὸν ἐμπλῆσαι πρὸς τὸ δεῖπνον ὁ νοῦν ἔχων, ἀλλὰ καὶ σπουδάσαι τι καὶ παῖξαι καὶ ἀκοῦσαι καὶ εἰπεῖν ὡς ὁ καιρὸς παρακαλεῖ τοὺς συνόντας, εἰ μέλλουσι μετ´ ἀλλήλων ἡδέως ἔσεσθαι. καὶ γὰρ καὶ ὄψον πονηρὸν ἔστι παρώσασθαι, κἂν οἶνος ᾖ φαῦλος, ἐπὶ τὰς νύμφας καταφυγεῖν· σύνδειπνος δὲ κεφαλαλγὴς καὶ βαρὺς καὶ ἀνάγωγος παντὸς μὲν οἴνου καὶ ὄψου πάσης δὲ μουσουργοῦ χάριν ἀπόλλυσι καὶ λυμαίνεται, καὶ οὐδ´ ἀπεμέσαι τὴν τοιαύτην ἀηδίαν ἕτοιμόν ἐστιν, ἀλλ´ ἐνίοις εἰς ἅπαντα τὸν βίον ἐμμένει τὸ πρὸς ἀλλήλους δυσάρεστον, ὥσπερ ἑωλοκρασία τις ὕβρεως ἢ ὀργῆς ἐν οἴνῳ γενομένης. ὅθεν ἄριστα Χίλων, καλούμενος ἐχθές, οὐ πρότερον ὡμολόγησεν ἢ πυθέσθαι τῶν κεκλημένων ἕκαστον. ἔφη γὰρ ὅτι σύμπλουν ἀγνώμονα δεῖ φέρειν καὶ σύσκηνον οἷς πλεῖν ἀνάγκη καὶ στρατεύεσθαι· τὸ δὲ συμπόταις ἑαυτὸν ὡς ἔτυχε καταμιγνύειν οὐ νοῦν ἔχοντος ἀνδρός ἐστιν. ὁ δ´ Αἰγύπτιος σκελετός, ὃν ἐπιεικῶς εἰσφέροντες εἰς τὰ συμπόσια προτίθενται καὶ παρακαλοῦσι μεμνῆσθαι τάχα δὴ τοιούτους ἐσομένους, καίπερ ἄχαρις καὶ ἄωρος ἐπίκωμος ἥκων, ὅμως ἔχει τινὰ καιρόν, καὶ εἰ μὴ πρὸς τὸ πίνειν καὶ ἡδυπαθεῖν ἀλλὰ πρὸς φιλίαν καὶ ἀγάπησιν ἀλλήλων προτρέπεται, καὶ παρακαλεῖ τὸν βίον μὴ τῷ χρόνῳ βραχὺν ὄντα πράγμασι κακοῖς μακρὸν ποιεῖν. » </div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §2'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§2. La réception avait été préparée par '''Périandre''', non pas dans la ville même, mais dans son [[w:Cénacle|''cénacle'']] du port de [[w:Léchaion|''Léchée'']], près du temple de '''Vénus''' en l’honneur de laquelle il y avait même un sacrifice. Car depuis l’incestueux amour à la suite duquel sa mère avait volontairement abandonné la vie, '''Périandre''' n’avait pas sacrifié à '''Vénus''' ; et c’était alors la première fois que, d’après certains songes de '''Mélissa''' il s’était décidé à honorer la déesse et à lui rendre des hommages. Pour chacun des invités on avait amené un attelage approprié convenablement. Nous étions en été, et tout le long de la route, en raison du grand nombre de chariots et de piétons, ce n’était jusqu’à la mer que poussière et que bruit. Pourtant '''Thalès''', ayant vu l’attelage à notre porte, se mit à sourire et le renvoya. Nous partîmes donc à pied en faisant un détour, et à travers champs nous cheminâmes à loisir. Un troisième compagnon s’était joint à nous, '''Niloxène''' de ''Naucratie'', homme plein de mérite, que '''Thalès''' et '''Solon''' avaient autrefois beaucoup connu en ''Égypte''. Il se trouvait envoyé de nouveau vers '''Bias''' ; mais pour quelle mission ? Il n’en savait rien lui-même, hormis qu’il se soupçonnait porteur d’une seconde question à résoudre, contenue dans un pli cacheté; et il lui avait été dit, au cas où '''Bias''' renoncerait, de la présenter aux plus sages d’entre les Grecs. « C’est », dit '''Niloxène''', « une chance heureuse que de vous trouver ici tous, et j’apporte, comme vous voyez, cette lettre pour le banquet. » En même temps, il nous la faisait voir. '''Thalès''' se mit à rire : « Si c’est une question épineuse », dit-il, « qu’on aille encore à ''Priène'' : '''Bias''' la résoudra comme il a résolu la première. » — « Quelle était donc cette première question ? » lui demandai-je. — « Le roi d’Égypte », dit '''Thalès''', « avait envoyé à '''Bias''' une victime, en lui faisant dire d’en couper ce qu’il y avait de plus mauvais et de meilleur, et de le lui renvoyer. Notre sage, avec un discernement merveilleux, en ôta la langue et la fit porter au Roi. Voilà ce qui lui a valu une estime et une admiration si déclarée ». — « Cette raison n’est pas la seule », ajouta '''Niloxène''' ; « c’est encore, que '''Bias''' ne fuit pas, comme vous autres, l’amitié des rois eux-mêmes. Ainsi, vous, '''Thalès''', le roi d’Égypte vous admire beaucoup, et, entre autres choses, il a été, au-delà de ce qu’on peut dire, ravi de la manière dont vous avez mesuré la pyramide sans le moindre embarras et sans avoir eu besoin d’aucun instrument. Après avoir dressé votre bâton à l’extrémité de l’ombre que projetait la pyramide, vous construisîtes deux triangles par la tangence d’un rayon, et vous démontrâtes qu’il y avait la même proportion entre la hauteur du bâton et la hauteur de la pyramide qu’entre la longueur des deux ombres. Mais, comme j’ai dit, on vous accuse de détester les rois ; quelques boutades injurieuses prononcées par vous contre des ''tyrans'' ont été rapportées à [[w:Ahmôsis_II|'''Amasis''']]. Par exemple, l’Ionien '''Molpagore''' vous ayant demandé ce que vous aviez jamais vu de plus extraordinaire, vous lui auriez répondu : « C’est un tyran parvenu à la vieillesse. » Une autre fois, dans un festin, la conversation étant venue à tomber sur les bêtes féroces, vous auriez dit : « La plus méchante bête parmi les animaux sauvages, c’est le tyran, et parmi les animaux apprivoisés le flatteur. » De tels propos ne sont pas de ceux que les rois entendent avec plaisir, lors même qu’ils affectent de n’avoir rien de commun avec les tyrans. » Pour cette dernière réponse, dit '''Thalès''', elle est de '''Pittacus''' : il l’avait adressée un jour en plaisantant à '''Myrsile'''. Quant au premier propos, ce n’était pas « un tyran » que j’avais dit, mais « un [[wikt:κυβερνήτης#Grec_ancien|''pilote'']] », qui soit parvenu à la vieillesse. Toutefois, puisqu’on a changé la destination du mot, je fais comme le jeune homme qui, ayant jeté une pierre à un chien, atteignit sa belle-mère et s’écria : Même ainsi, ce n’est pas mal. » C’est pourquoi je regardai '''Solon''' comme éminemment sage lorsqu’il n’accepta pas la tyrannie ; et '''Pittacus''', s’il n’eût approché de la monarchie, n’aurait pas eu à dire : « Il est difficile d’être homme de bien. » Quant à '''Périandre''', il semble qu’ayant été saisi par le souverain pouvoir comme par une maladie de famille, il ne s’en tire pas trop mal. Il use, au moins jusqu’à présent, de sociétés salutaires. Il réunit, pour entretenir commerce avec eux, ses hommes remplis de sens ; et le conseil que lui a donné mon compatriote [[w:Thrasybule_de_Milet|'''Thrasybule''']] [[#Thrasybule|<span id="Thrasybule_back"><sup>'''I'''</sup></span>]], de décapiter l’aristocratie, il ne l’a pas accepté. Entre un laboureur qui aimerait mieux voir dans son champ de l’[[w:Ivraie|''ivraie'']] ou de l’[[w:Orobanche|''orobanche'']] que de l’orge ou du blé, et un tyran qui veut régner sur des esclaves plutôt que sur des hommes de coeur, je ne vois aucune différence. Un seul bien compense les maux nombreux attachés au pouvoir des tyrans : c’est la gloire et l’honneur qui leur sont réservés lorsque, commandant à des hommes vertueux, ils sont plus vertueux eux-mêmes, et qu’au milieu de grands ils se montrent plus grands. Ceux qui préfèrent leur sûreté en renonçant à ce beau rôle, étaient faits pour réunir sous leur main beaucoup de moutons, de chevaux et de boeufs, mais non des hommes. » « Du reste », continua '''Thalès''', « ce sont propos sans portée aucune que ceux où nous a jetés cet étranger, et nous avons omis de dire et de chercher les choses qui conviennent bien à des gens partis pour un banquet. Ne croyez-vous pas, '''Nicarque''', qu’il y ait des préparatifs à faire quand on vient prendre place à un festin, comme il y en a pour celui qui doit le donner ? Les [[w:Sybaris|''Sybarites'']] [[#Sybaris|<span id="Sybaris_back"><sup>'''II'''</sup></span>]], à ce qu’il paraît, s’y prennent un an d’avance pour adresser leurs invitations aux femmes, afin qu’elles puissent à loisir préparer leur toilette et leurs bijoux en or avant de se rendre au festin; et, selon moi, il faut plus de temps encore à un convive pour les préparatifs vraiment nécessaires, parce qu’il est plus difficile de trouver un ajustement convenable pour son moral que la vaine et inutile parure dont on s’inquiète pour son corps. Un homme sensé ne se transporte pas à un festin comme un bocal qu’il s’agit d’y remplir. Il songe à trouver là une occasion de passer tour à tour du sérieux au badinage, d’entendre et de tenir lui-même ces propos auxquels la circonstance invite les convives s’ils veulent se rendre la réunion agréable les uns aux autres. En effet on est libre de repousser un mauvais ragoût, et si le vin ne vaut rien on peut « recourir aux [[w:Naïades|''Naïades'']] »; mais un convive qui vous donne mal à la tête, qui est lourd, qui ne sait pas se conduire, vous fait perdre et vous gâte le plaisir de tout vin, de toute bonne chère, de toute musique. On n’est même pas le maître de se débarrasser aussi complétement qu’on le voudrait d’un tel désagrément. Quelques-uns en gardent tant qu’ils vivent du mécontentement les uns contre les autres : il leur semble qu’il leur reste comme un arrière-goût de viandes mal digérées, parce qu’ils conservent le souvenir d’injures ou de colères échangées dans le vin. C’est pour cela que '''Chilon''', invité hier, n’a pas voulu promettre avant d’avoir su le nom de chacun des convives : « Car on est bien obligé, a-t-il dit, de supporter un désagréable compagnon de traversée, de tente, quand il faut être sur terre ou à l’armée ; mais se mêler indifféremment à table avec les premiers venus, n’est pas le propre d’un homme sensé. » Le squelette des ''Égyptiens'', qu’ils ont la sage coutume de produire et de placer dans la salle du festin afin d’engager à se souvenir que l’on sera bientôt comme lui, survient là comme un convive assez désagréable et intempestif, mais enfin la présence s’en explique. Si cette vue n’excite pas à boire et à se réjouir, elle engage du moins à s’aimer, à se chérir les uns les autres, et elle exhorte à ne pas allonger par des tracas pénibles une existence dont la durée est si courte. </div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §2'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> {{Boîte déroulante début|titre=NdA trad. par Victor Bétolaud de 1870|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Thrasybule_back|<span id="Thrasybule"><sup>I</sup></span>]] Du nom propre grec ancien Θρᾰσῠ́βουλος / Thrăsŭ́boulos [[wikt:en:Θρασύβουλος#Ancient_Greek|(en)]] ;<br /><p style="margin: 0 2em; text-indent: 15px">➥ de l’adjectif [[wikt:θρασύς#Grec_ancien|θρᾰσύς / thrăsús]], « confiant, audacieux » ;<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ du nom commun [[wikt:βουλή#Grec_ancien|βουλή / boulế]], « Volonté. Décision, conseil. Conseil, sénat athénien. »; du verbe [[wikt:βούλομαι#Grec_ancien|βούλομαι / boúlomai]], « Vouloir, désirer, souhaiter. Vouloir bien, consentir à. » ;<br /><p style="margin: 0 2em; text-indent: 15px">➥ +‎ -ος (-os).<br /><br /><p style="margin: 0 2em; text-indent: 15px">[[#Sybaris_back|<span id="Sybaris"><sup>II</sup></span>]] Du nom propre grec ancien Σῠ́βᾰρῐς / Sŭ́bărĭs [[wikt:en:Σύβαρις#Ancient_Greek|(en)]] ;<br /><p style="margin: 0 2em; text-indent: 15px">[[w:Colonisation grecque|Colonie grecque]] du sud de l’Italie (en [[w:Calabre|Calabre]] actuelle), fondée au [[w:VIIIe_siècle_av._J.-C.|VIII<sup>ème</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]] dans le cadre du mouvement d’établissement et d’[[w:Colonisation_grecque|''essaimage'']] des Grecs vers l’Occident, particulièrement en [[w:Grande-Grèce|''Grande-Grèce'']]. Réputée dès l’Antiquité pour sa richesse devenue proverbiale, ainsi que pour son emprise sur les peuples voisins et différentes cités grecques de son voisinage, elle est détruite à l’issue d’une [[w:Guerre entre Sybaris et Crotone|guerre]] qui l’oppose à [[w:Crotone|''Crotone'']] à la fin du [[w:VIe_siècle_av._J.-C.|VI<sup>ème</sup> siècle {{Info|AEC|Avant l’Ère Commune}}]], et enfouie sous les eaux du fleuve ''Crathis'' (aujourd’hui [[Crati]]), avant de voir son site réoccupé, soixante ans plus tard, par la colonie [[w:Panhellénisme|''panhellénique'']] de [[w:Thourioï|''Thourioï'']].'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">'''Périandre''' avait fait préparer le banquet, non à la ville même, mais au ''port de Léchée'' [[#Léchée_NdT_DR|<span id="Léchée_NdT_DR_back"><sup>1</sup></span>]], dans une salle voisine du ''temple de Vénus'', à qui l’on devait offrir un sacrifice. Depuis que sa mère, victime d’un malheureux amour [[#Cratée_NdT_DR|<span id="Cratée_NdT_DR_back"><sup>2</sup></span>]], s’était donné la mort, il n’avait pas encore sacrifié à cette déesse, et c’était la première fois qu’il y pensait, d’après un songe de '''Mélisse''' [[#Mélisse_NdT_DR|<span id="Mélisse_NdT_DR_back"><sup>3</sup></span>]]. Nous étions dans les plus grandes chaleurs de l’été. Le grand nombre des voitures et des gens de pied qui fréquentaient le chemin qui conduit à la mer, l’avaient couvert de poussière et le rendaient fort incommode pour les voyageurs. On avait amené, pour chaque convive, un char commode et proprement orné. '''Thalès''', en voyant le sien à ma porte, se mit à sourire et le refusa. Nous primes donc, à travers les champs, un sentier détourné, et nous allâmes, en nous promenant, suivis de '''Niloxène''' de ''Naucrate'' [[#Niloxène_NdT_DR|<span id="Niloxène_NdT_DR_back"><sup>4</sup></span>]], homme du plus grand mérite, que '''Thalès''' et '''Solon''' avaient autrefois beaucoup connu en ''Égypte''. Il était envoyé, pour la seconde fois, vers '''Bias''', sans savoir lui-même quel était l’objet de sa mission. Il se doutait seulement que la lettre dont '''Amasis''' l’avait chargé contenait une seconde question à résoudre. Il avait ordre, en cas que '''Bias''' refusât d’y répondre, de la proposer aux plus sages d’entre les ''Grecs''. Dès qu’il m’eut aperçu, il me dit en me montrant sa lettre : « J’ai du bonheur aujourd’hui. Cette lettre vous trouve tous réunis. Je la porte au banquet, comme vous voyez. - Si c’est une question épineuse, dit '''Thalès''' en souriant, retournez à ''Priene'' [[#Priene_NdT_DR|<span id="Priene_NdT_DR_back"><sup>5</sup></span>]], '''Bias''' la résoudra, comme il a résolu la première. - Quelle était cette première question, demandai-je à '''Thalès''' ? - Le roi d’Égypte, me répondit-il, avait envoyé une victime à '''Bias''', en lui faisant dire d’en couper ce qu’il y avait de meilleur et de plus mauvais, et de le lui renvoyer. Notre sage, fort habilement en ôta la langue, qu’il lui fit porter. Voilà ce qui lui a mérité l’estime et l’admiration de ce prince. - Ajoutez encore à cette première raison, dit '''Niloxène''', que '''Bias''' ne dédaigne pas, comme vous, l’amitié des rois ; car '''Amasis''' n’a pas moins d’estime pour vous ; il admire surtout la manière dont vous mesurâtes, avec la plus grande facilité et sans aucun instrument mathématique, la hauteur de la pyramide. En dressant votre bâton à l’extrémité de l’ombre qu’elle faisait sur la terre, le rayon solaire qui touchait le sommet de la pyramide et l’extrémité du bâton forma deux triangles ; et vous démontrâtes qu’il y avait la même proportion entre la hauteur du bâton et celle de la pyramide qu’entre la longueur des ombres projetées par l’une et par l’autre. Mais, comme je viens de le dire, on vous accuse, auprès de lui, d’être l’ennemi des rois, et on lui a rapporté plusieurs propos injurieux que vous avez tenus contre les tyrans [[#tyrans_NdT_DR|<span id="tyrans_NdT_DR_back"><sup>6</sup></span>]] ; entre autres que l’''Ionien'' '''Molpagore''' [[#Molpagore_NdT_DR|<span id="Molpagore_NdT_DR_back"><sup>7</sup></span>]] vous ayant demandé ce qui vous paraîtrait plus extraordinaire dans la vie, vous lui répondîtes : de voir vieillir un tyran. Une autre fois, comme on vint à parler, dans un repas, du naturel des animaux, vous dîtes que le plus méchant des animaux sauvages était le tyran, et des animaux domestiques, le flatteur. Les rois, quoiqu’ils affectent de ne rien avoir de commun avec les tyrans, n’aiment pas cependant ces sortes de discours. Cette dernière réponse, dit '''Thalès''', est de '''Pittacus''' ; il la fit un jour, en plaisantant, à ''Myrsile'' [[#Myrsile_NdT_DR|<span id="Myrsile_NdT_DR_back"><sup>8</sup></span>]]. Dans la première, je parlais d’un pilote, et non pas d’un tyran. Mais puisqu’on en a fait application au tyran, je dirai comme ce jeune homme qui, jetant une pierre à son chien, en avait atteint sa belle-mère : « Le coup n’est pas perdu. » Aussi jamais '''Solon''' ne montra-t-il plus de sagesse, à mon gré, que lorsqu’il refusa la tyrannie ; et si '''Pittacus''' n’eût pas été contraint de l’accepter, il n’eût point dit qu’il est à charge d’être vertueux [[#Pittacus_NdT_DR|<span id="Pittacus_NdT_DR_back"><sup>9</sup></span>]]. Il est vrai que '''Périandre''', qui a succédé à l’autorité des tyrans, paraît jusqu’ici opposer à ce mal héréditaire un remède puissant, par le soin qu’il a de rechercher les entretiens et les avis salutaires des hommes vertueux , et par l’horreur qu’il a témoignée pour le conseil barbare que notre compatriote '''Thrasybule''' lui donnait de faire mourir les grands. Un tyran qui veut commander à des esclaves, plutôt qu’à des hommes, ressemble à un laboureur qui aimerait mieux voir son champ couvert de passereaux et de sauterelles que d’orge et de froment. Le seul bien qui puisse compenser tant de maux attachés au pouvoir des tyrans, c’est d’avoir, même sur les plus grands et les plus vertueux de leurs sujets, la supériorité de l’honneur et de la vertu. Ceux qui préfèrent la sûreté à la gloire sont faits pour commander à des troupeaux, et non pour gouverner des hommes. « Mais '''Niloxène''' nous a jetés dans une conversation absolument étrangère à notre objet, et nous a fait négliger ce qui devait nous occuper en allant au banquet. Ne pensez-vous pas que les conviés ont, aussi bien que leur hôte, des apprêts à faire. Les ''Sybarites'', dit-on, prient les femmes à souper un an d’avance, afin qu’elles puissent préparer à loisir leurs habits et leurs bijoux [[#Sybarites_NdT_DR|<span id="Sybarites_NdT_DR_back"><sup>10</sup></span>]]. Pour moi, je pense qu’il faut encore plus de temps à un convive pour faire tous les préparatifs convenables, parcequ’il est bien plus difficile d’orner son esprit comme il faut, que de donner à son corps une parure vaine et superflue. Un homme sensé doit aller à un festin, non pour y remplir son estomac, comme un vase, mais pour écouter et tenir à son tour des propos utiles ou amusants, suivant les circonstances. C’est le seul moyen de rendre le repas agréable aux convives. En effet, on peut laisser un mauvais ragoût, et recourir à l’eau quand le vin n’est pas bon ; mais un convive désagréable, importun et fatigant, fait perdre tout le plaisir de la bonne chère et de la musique. On ne peut se délivrer de l’ennui qu’il cause, et souvent même une parole vive ou offensante qu’il se sera permise dans la liberté de la table, fait naître des aversions et des ressentiments qui ne finissent qu’avec la vie. Aussi '''Chilon''', invité hier à ce banquet, ne voulut-il accepter qu’après qu’on lui eut nommé tous les convives. Il disait avec raison, que quand on est sur mer ou dans un camp, il faut nécessairement supporter les compagnons qui nous sont associés, quelque fâcheux qu’ils soient ; mais dans un festin, il n’est pas d’un homme sensé de se mêler indifféremment avec toutes sortes de personnes. Le squelette que les ''Égyptiens'' placent ordinairement à côté d’eux dans leurs repas, en s’exhortant à penser qu’ils seront bientôt dans le même état, est, à la vérité, un compagnon de table assez triste et assez déplacé. Il est néanmoins utile, sinon pour les exciter au plaisir, du moins pour les porter à la bienveillance et à l’amitié réciproque, et pour les avertir de ne pas remplir d’aigreur et de querelles le temps si court de la vie [[#squelette_NdT_DR|<span id="squelette_NdT_DR_back"><sup>11</sup></span>]]. » </div> <table cellspacing=15 style="margin: 0 4em; font-size:85%;"> <tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Léchée_NdT_DR_back|<span id="Léchée_NdT_DR"><sup>1</sup></span>]] L’isthme de ''Corinthe'' avait deux ports, l’un sur la côte orientale, appelé ''Cenchrées'' ; et l’autre sur la côte occidentale, nommé ''Léchée''. Pausanias, qui a donné une description si détaillée de la ''Grèce'', parle d’un ''temple de Vénus'', bâti sur le port de ''Cenchrées'', et dont la statue était de marbre ; mais il ne fait pas mention de celui que cite Plutarque, et qu’il place près du port occidental. ''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Cratée_NdT_DR_back|<span id="Cratée_NdT_DR"><sup>2</sup></span>]] La mère de Périandre se nommait Cratée. On peut voir dans Parthenius la manière dont elle conçut et nourrit une passion incestueuse pour son fils, les moyens qu'elle prit pour la satisfaire sans être connue, et comment elle fut découverte. Les remords qu’elle en eut l’obligèrent de se donner la mort.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Mélisse_NdT_DR_back|<span id="Mélisse_NdT_DR"><sup>3</sup></span>]] Mélisse était fille de Proclès, roi d’[[w:Épidaure_(cité_antique)|''Épidaure'']]. On prétend que Périandre en devint éperdument amoureux pour l’avoir vue dans l’habillement ordinaire aux femmes du ''Péloponnèse''. Cette passion toutefois ne l’empêcha pas de partager son cœur entre elle et plusieurs concubines. Elles parvinrent à l’irriter contre elle au point qu’un jour, par un mouvement de jalousie, il la frappa d’un coup de pied, sans songer qu’elle était enceinte, et la fit mourir.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Niloxène_NdT_DR_back|<span id="Niloxène_NdT_DR"><sup>4</sup></span>]] Niloxène signifie hôte du ''Nil'' : ce nom semble indiquer que c’est un personnage supposé.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Priene_NdT_DR_back|<span id="Priene_NdT_DR"><sup>5</sup></span>]] Ville d’''Ionie'', colonie des ''Thébains'' et patrie de Bias.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#tyrans_NdT_DR_back|<span id="tyrans_NdT_DR"><sup>6</sup></span>]] Par le mot [[wikt:τύραννος#Grec_ancien|τύραννος]], que nous ne pouvons rendre en français que par celui de tyran, les ''Grecs'' entendaient, non pas seulement, comme nous, un prince injuste et cruel ; mais, en général, tout homme qui s’était emparé de l’autorité monarchique dans un état libre, sans qu’elle lui fût légitimement acquise.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Molpagore_NdT_DR_back|<span id="Molpagore_NdT_DR"><sup>7</sup></span>]] Ce Molpagore est peut-être le père d’Aristagore, que Darius établit tyran à ''Milet''.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Myrsile_NdT_DR_back|<span id="Myrsile_NdT_DR"><sup>8</sup></span>]] Myrsile n’est guère mieux connu que Molpagore. Strabon le met au nombre de ces ''Lesbiens'' ambitieux, qui, du temps de Pittacus, s’étaient emparés de l’autorité souveraine à ''Lesbos'', et dont le poète [[w:Alcée_de_Mytilène|Alcée]] avait flétri la mémoire.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Pittacus_NdT_DR_back|<span id="Pittacus_NdT_DR"><sup>9</sup></span>]] Pittacus en se voyant forcé, dans sa vieillesse, de reprendre le gouvernement des affaires, prononça cette maxime.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#Sybarites_NdT_DR_back|<span id="Sybarites_NdT_DR"><sup>10</sup></span>]] Cet usage des ''Sybarites'' n’avait lieu que dans les festins publics.''' </td> <tr> </tr> <td valign=top style="text-align: justify; text-indent: 15px">'''[[#squelette_NdT_DR_back|<span id="squelette_NdT_DR"><sup>11</sup></span>]] Cet usage, d'’abord particulier aux ''Egyptiens'', avait ensuite passé chez les ''Grecs'', de qui les ''Romains'' l'’empruntèrent. ''' </td> </tr> </table> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe III.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage de la reconnaissance de la sagesse de '''Cléobuline''' ''« Eumétis »'' par '''Thalès''', de l’humilité de ce dernier et de son [[w:Cynisme|''cynisme'']].</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§3. Ἐν τοιούτοις λόγοις γενόμενοι κατὰ τὴν ὁδὸν ἀφικόμεθα πρὸς τὴν οἰκίαν, καὶ λούσασθαι μὲν ὁ Θαλῆς οὐκ ἠθέλησεν, ἀληλιμμένοι γὰρ ἦμεν· ἐπιὼν δὲ τούς τε δρόμους ἐθεᾶτο καὶ τὰς παλαίστρας καὶ τὸ ἄλσος τὸ παρὰ τὴν θάλατταν ἱκανῶς διακεκοσμημένον, ὑπ´ οὐδενὸς ἐκπληττόμενος τῶν τοιούτων, ἀλλ´ ὅπως μὴ καταφρονεῖν δοκοίη μηδ´ ὑπερορᾶν τοῦ Περιάνδρου τῆς φιλοτιμίας. τῶν δ´ ἄλλων τὸν ἀλειψάμενον ἢ λουσάμενον οἱ θεράποντες εἰσῆγον εἰς τὸν ἀνδρῶνα διὰ τῆς στοᾶς. Ὁ δ´ Ἀνάχαρσις ἐν τῇ στοᾷ καθῆστο, καὶ παιδίσκη προειστήκει τὴν κόμην ταῖς χερσὶ διακρίνουσα. ταύτην ὁ Θαλῆς ἐλευθεριώτατά πως αὐτῷ προσδραμοῦσαν ἐφίλησε καὶ γελάσας « οὕτως, » ἔφη, « ποίει καλὸν τὸν ξένον, ὅπως ἡμερώτατος ὢν μὴ φοβερὸς ᾖ τὴν ὄψιν ἡμῖν μηδ´ ἄγριος. » Ἐμοῦ δ´ ἐρομένου περὶ τῆς παιδὸς ἥτις εἴη, « τὴν σοφήν, » ἔφη, « καὶ περιβόητον ἀγνοεῖς Εὔμητιν; οὕτω γὰρ ταύτην ὁ πατὴρ αὐτός, οἱ δὲ πολλοὶ πατρόθεν ὀνομάζουσι Κλεοβουλίνην. » Καὶ ὁ Νειλόξενος εἶπεν « ἦ που τὴν περὶ τὰ αἰνίγματα δεινότητα καὶ σοφίαν, » ἔφη, « τῆς κόρης ἐπαινεῖς· καὶ γὰρ εἰς Αἴγυπτον ἔνια τῶν προβαλλομένων ὑπ´ αὐτῆς διῖκται. » « Οὐκ ἔγωγ´, » εἶπεν ὁ Θαλῆς· « τούτοις γὰρ ὥσπερ ἀστραγάλοις, ὅταν τύχῃ, παίζουσα χρῆται καὶ διαβάλλεται πρὸς τοὺς ἐντυχόντας. ἀλλὰ καὶ φρόνημα θαυμαστὸν καὶ νοῦς ἔνεστι πολιτικὸς καὶ φιλάνθρωπον ἦθος, καὶ τὸν πατέρα τοῖς πολίταις πραότερον ἄρχοντα παρέχει καὶ δημοτικώτερον. » « Εἶεν, » ὁ Νειλόξενος ἔφη, « καὶ φαίνεται βλέποντι πρὸς τὴν λιτότητα καὶ ἀφέλειαν αὐτῆς· Ἀνάχαρσιν δὲ πόθεν οὕτω τημελεῖ φιλοστόργως; » « Ὅτι, » ἔφη, « σώφρων ἀνήρ ἐστι καὶ πολυμαθής, καὶ τὴν δίαιταν αὐτῇ καὶ τὸν καθαρμόν, ᾧ χρῶνται Σκύθαι περὶ τοὺς κάμνοντας, ἀφθόνως καὶ προθύμως παραδέδωκε. καὶ νῦν οἶμαι περιέπειν αὐτὴν τὸν ἄνδρα καὶ φιλοφρονεῖσθαι, μανθάνουσάν τι καὶ προσδιαλεγομένην. » Ἤδη δὲ πλησίον οὖσιν ἡμῖν τοῦ ἀνδρῶνος ἀπήντησεν Ἀλεξίδημος ὁ Μιλήσιος (ἦν δὲ Θρασυβούλου τοῦ τυράννου νόθος) καὶ ἐξῄει τεταραγμένος καὶ σὺν ὀργῇ τινι πρὸς αὑτὸν οὐδὲν ἡμῖν γε σαφὲς διαλεγόμενος. ὡς δὲ τὸν Θαλῆν εἶδε, μικρὸν ἀνενεγκὼν καὶ καταστάς « οἵαν ὕβριν, » εἶπεν, « εἰς ἡμᾶς Περίανδρος ὕβρικεν, ἐκπλεῦσαι μὲν οὐκ ἐάσας ὡρμημένον ἀλλὰ προσμεῖναι δεηθεὶς τὸ δεῖπνον, ἐλθόντι δὲ νέμων κλισίαν ἄτιμον, Αἰολεῖς δὲ καὶ νησιώτας (καὶ τίνας γὰρ οὐχί;) Θρασυβούλου προτιμῶν· Θρασύβουλον γὰρ ἐν ἐμοὶ τὸν πέμψαντα προπηλακίσαι βουλόμενος καὶ καταβαλεῖν ὡς δὴ περιορῶν δῆλός ἐστιν. » « Εἶτ´, » ἔφη, « σὺ δέδιας μὴ καθάπερ Αἰγύπτιοι τοὺς ἀστέρας ὑψώματα καὶ ταπεινώματα λαμβάνοντας ἐν τοῖς τόποις οὓς διεξίασι γίγνεσθαι βελτίονας ἢ χείρονας ἑαυτῶν λέγουσιν, οὕτως ἡ περὶ σὲ διὰ τὸν τόπον ἀμαύρωσις ἢ ταπείνωσις γένηται; καὶ τοῦ Λάκωνος ἔσῃ φαυλότερος, ὃς ἐν χορῷ τινι κατασταθεὶς εἰς τὴν ἐσχάτην χώραν ὑπὸ τοῦ ἄρχοντος ‘εὖ γ´,’ εἶπεν, ‘ἐξεῦρες, ὡς καὶ αὕτα ἔντιμος γένηται.’ οὐ καταλαβόντας, » ἔφη, « τόπον μετὰ τίνας κατακείμεθα δεῖ ζητεῖν, μᾶλλον δ´ ὅπως εὐάρμοστοι τοῖς συγκατακειμένοις ὦμεν, ἀρχὴν καὶ λαβὴν φιλίας εὐθὺς ἐν αὐτοῖς ζητοῦντες, μᾶλλον δ´ ἔχοντες τὸ μὴ δυσκολαίνειν ἀλλ´ ἐπαινεῖν ὅτι τοιούτοις συγκατεκλίθημεν· ὡς ὅ γε τόπῳ κλισίας δυσχεραίνων δυσχεραίνει τῷ συγκλίτῃ μᾶλλον ἢ τῷ κεκληκότι, καὶ πρὸς ἀμφοτέρους ἀπεχθάνεται. » « Λόγος, » ἔφη, « ταῦτ´ ἄλλως ἐστίν » ὁ Ἀλεξίδημος, « ἔργῳ δὲ καὶ τοὺς σοφοὺς ὑμᾶς ὁρῶ τὸ τιμᾶσθαι διώκοντας, » καὶ ἅμα παραμειψάμενος ἡμᾶς ἀπῆλθε. Καὶ ὁ Θαλῆς πρὸς ἡμᾶς τὴν ἀτοπίαν τοῦ ἀνθρώπου θαυμάζοντας, « ἔμπληκτος, » ἔφη, « καὶ ἀλλόκοτος φύσει, ἐπεὶ καὶ μειράκιον ὢν ἔτι, μύρου σπουδαίου Θρασυβούλῳ κομισθέντος, εἰς ψυκτῆρα κατεράσας μέγαν καὶ προσεγχέας ἄκρατον ἐξέπιεν, ἔχθραν ἀντὶ φιλίας Θρασυβούλῳ διαπεπραγμένος. » Ἐκ τούτου περιελθὼν ὑπηρέτης « κελεύει σε Περίανδρος, » ἔφη, « καὶ Θαλῆν παραλαβόντα τοῦτον ἐπισκέψασθαι τὸ κεκομισμένον ἀρτίως αὐτῷ πότερον ἄλλως γέγονεν ἤ τι σημεῖόν ἐστι καὶ τέρας· αὐτὸς μὲν γὰρ ἔοικε τεταράχθαι σφόδρα, μίασμα καὶ κηλῖδα τῆς θυσίας ἡγούμενος. » ἅμα δ´ ἀπῆγεν ἡμᾶς εἴς τι οἴκημα τῶν περὶ τὸν κῆπον. ἐνταῦθα νεανίσκος ὡς ἐφαίνετο νομευτικός, οὔπω γενειῶν ἄλλως τε τὸ εἶδος οὐκ ἀγεννής, ἀναπτύξας τινὰ διφθέραν ἔδειξεν ἡμῖν βρέφος ὡς ἔφη γεγονὸς ἐξ ἵππου, τὰ μὲν ἄνω μέχρι τοῦ τραχήλου καὶ τῶν χειρῶν ἀνθρωπόμορφον, τὰ λοιπὰ δ´ ἔχον ἵππου, τῇ δὲ φωνῇ καθάπερ τὰ νεογνὰ παιδάρια κλαυθμυριζόμενον. ὁ μὲν οὖν Νειλόξενος, « Ἀλεξίκακε » εἰπών, ἀπεστράφη τὴν ὄψιν, ὁ δὲ Θαλῆς προσέβλεπε τῷ νεανίσκῳ πολὺν χρόνον, εἶτα μειδιάσας (εἰώθει δ´ ἀεὶ παίζειν πρὸς ἐμὲ περὶ τῆς τέχνης) « ἦ που τὸν καθαρμόν, ὦ Διόκλεις, » ἔφη, « κινεῖν διανοῇ καὶ παρέχειν πράγματα τοῖς ἀποτροπαίοις, ὥς τινος δεινοῦ καὶ μεγάλου συμβάντος; » « Τί δ´, » εἶπον, « οὐ μέλλω; στάσεως γάρ, ὦ Θαλῆ, καὶ διαφορᾶς τὸ σημεῖόν ἐστι, καὶ δέδια μὴ μέχρι γάμου καὶ γενεᾶς ἐξίκηται, πρὶν ἢ τὸ πρῶτον ἐξιλάσασθαι μήνιμα, τῆς θεοῦ δεύτερον ὡς ὁρᾷς προφαινούσης. » Πρὸς τοῦτο μηδὲν ἀποκρινάμενος ὁ Θαλῆς ἀλλὰ γελῶν ἀπηλλάττετο. καὶ τοῦ Περιάνδρου πρὸς τὰς θύρας ἀπαντήσαντος ἡμῖν καὶ διαπυθομένου περὶ ὧν εἴδομεν, ἀφεὶς ὁ Θαλῆς με καὶ λαβόμενος τῆς ἐκείνου χειρὸς ἔφη, « ἃ μὲν Διοκλῆς κελεύει δράσεις καθ´ ἡσυχίαν· ἐγὼ δέ σοι παραινῶ νέοις οὕτω μὴ χρῆσθαι νομεῦσιν ἵππων, ἢ διδόναι γυναῖκας αὐτοῖς. » Ἔδοξε μὲν οὖν μοι τῶν λόγων ἀκούσας ὁ Περίανδρος ἡσθῆναι σφόδρα· καὶ γὰρ ἐξεγέλασε καὶ τὸν Θαλῆν περιβαλὼν κατησπάσατο. κἀκεῖνος « οἶμαι δ´, » εἶπεν, « ὦ Διόκλεις, καὶ πέρας ἔσχε τὸ σημεῖον· ὁρᾷς γὰρ ἡλίκον κακὸν γέγονεν ἡμῖν, Ἀλεξιδήμου συνδειπνεῖν μὴ θελήσαντος. » </div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §3'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§3. Ce fut en tenant de tels propos chemin faisant, que nous arrivâmes à la maison. '''Thalès''' ne voulut pas se baigner : « Je me suis frotté d’huile. » dit-il. Il se promena donc de côté et d’autre, regardant les champs de course, les palestres, et le bois sacré, voisin de la mer, que l’on avait bien convenablement disposé. Ce n’était pas qu’il fût frappé par aucun de ces préparatifs, mais il voulait ne pas avoir l’air de mépriser '''Périandre''' et de faire peu de cas de l’empressement avec lequel celui-ci honorait ses hôtes. Pour les autres convives, à mesure qu’ils s’étaient parfumés ou baignés, les serviteurs les introduisaient par la galerie dans la salle du banquet. Or '''Anacharsis''' s’était installé dans cette galerie, et devant lui une jeune fille se tenait, lui séparant les cheveux avec ses mains. Lorsqu’entra '''Thalès''', elle s’élança très librement à sa rencontre, et '''Thalès''', après l’avoir embrassée, lui dit en riant : « Continue à rendre bien beau notre étranger, afin qu’étant devenu la douceur même il ne conserve pas au milieu de nous une mine à faire peur et un aspect sauvage. » Je lui demandai quelle était cette jeune enfant : « Quoi ! » me dit-il, « vous ne connaissez pas la savante et célèbre '''Eumétis''' ! car c’est ainsi que son père la nomme : le plus communément on l’appelle '''Cléobuline''', du nom paternel. » Et '''Niloxène''' : « C’est sans doute à cause de son talent et de son habileté pour les énigmes, que vous faites l’éloge de cette jeune fille : car quelques-unes de celles qu’elle a proposées sont parvenues jusqu’en ''Égypte''. » — « Ce n’est pas à cause de cela », répondit '''Thalès''' : « les énigmes sont pour elle des joujoux dont elle s’amuse à l’occasion pour faire sa partie avec ceux qui se rencontrent. Mais ce qui est admirable en elle c’est sa profondeur d’esprit, son sens politique, l’aménité de son caractère, et le talent qu’elle a de rendre plus douce l’autorité de son père et d’inspirer à celui-ci des sentiments plus humains à l’égard du peuple. » — « Soit », dit '''Niloxène''' ; « et cela se reconnaît à voir sa modestie et sa simplicité. Mais d’où vient qu’elle prend un soin si amoureux de la toilette d’'''Anacharsis''' ? » — Parce que c’est, répondit '''Thalès''', « un sage, un homme des plus instruits, et parce qu’il lui a communiqué, avec de nombreux détails et de grand coeur, l’ensemble des pratiques sanitaires et des purifications que les ''Scythes'' appliquent au traitement des malades. Et dans ce moment je suppose qu’elle l’entoure de soins et d’amitiés parce qu’elle s’instruit de quelque chose en conversant avec lui. » Comme nous étions déjà près de la salle, '''Alexidème''' le ''Milésien'' vint à notre rencontre. C’était un bâtard du tyran '''Thrasybule'''. Il était sorti tout troublé, et avec une sorte de fureur il se parlait à lui-même, mais ses paroles n’avaient rien de clair pour nous. Quand il eut vu '''Thalès''', il se remit un peu ; puis, s’arrêtant tout court : « Quel affront '''Périandre''' vient de nous faire ! Je voulais mettre à la voile : il ne l’a pas permis ; il m’a supplié de rester à son festin, et quand j’arrive, il me donne une des dernières places, faisant passer des [[w:Éoliens|''Éoliens'']], des insulaires (je ne sais qui il ne me préfère pas), les faisant passer, dis je, avant '''Thrasybule''', car c’est '''Thrasybule''' en ma personne, c’est celui par lequel je suis envoyé qu’il a l’intention de traîner dans la boue et de ravaler comme le méprisant : la chose est bien claire. » — « Eh quoi ! » lui dit '''Thalès''', « êtes-vous comme les ''Égyptiens'', qui prétendent que les astres, suivant qu’ils prennent une position élevée ou basse en parcourant leur orbite, ont une condition meilleure ou pire qu’ils ne l’avaient ? Craignez-vous, pareillement, qu’autour de vous, en raison de la place où vous serez, il ne se produise obscurité ou dépression ? Serez-vous moins résigné que certain ''Spartiate'' ? À je ne sais quelle représentation il avait été placé au dernier rang par le maître des cérémonies : « Voilà qui va bien », lui dit-il : « tu as trouvé moyen de rendre honorable ce lieu même. Quand nous avons pris une place nous ne devons pas chercher au-dessous de qui nous sommes installés, mais plutôt comment nous nous mettrons en bon accord avec nos voisins. À leur occasion nous ferons voir tout d’abord, ou plutôt nous l’éprouverons réellement, un désir d’initiative et de prise de possession en matière d’amitié, et nous manifesterons ce désir en nous félicitant, loin d’en montrer du dépit, de ce que l’on nous a placés en une telle compagnie. Mais celui qui se plaint du rang qu’on lui donne à table montre plus de mécontentement contre son commensal que contre son hôte, et il se rend odieux à l’un et à l’autre. » — « Paroles que tout cela, » dit '''Alexidème''', « et paroles sans portée ! Mais je vois que de fait, vous autres sages, vous recherchez aussi les honneurs. » En même temps il s’éloigna de nous et disparut. Une conduite si étrange nous semblait étonnante. « C’est », nous dit '''Thalès''', « un homme écervelé et naturellement bizarre. Vous allez en juger. Il était encore tout jeune ; on avait apporté à '''Thrasybule''' un parfum d’un très haut prix. '''Alexidème''' le versa dans un grand vase à rafraîchir, y mêla du vin pur, et avala le tout, rendant son père odieux au lieu de le faire aimer. » Au même moment parut un serviteur : « Vous êtes invité par '''Périandre''' », me dit-il, « à venir, en vous faisant accompagner de '''Thalès''' que voici, examiner l’objet qu’on lui a récemment apporté, afin que vous disiez si c’est une création toute fortuite, ou bien un présage et une monstruosité; car, pour ce qui est de '''Périandre''', il a l’air grandement troublé, pensant que c’est une souillure et une profanation pour son sacrifice. » En même temps, il nous emmena vers une des salles qui donnaient sur le jardin. Là un jeune homme paraissant appartenir à la classe des bergers, qui n’avait pas encore de barbe et dont la physionomie ne manquait pas de noblesse, déploya une espèce de couverture en cuir, et nous montra un petit enfant né, disait-il, d’une cavale. Par le haut, jusqu’au cou et aux mains, cette créature était de forme humaine ; mais le reste était d’un cheval, et sa voix avait quelque chose des vagissements poussés par les petits enfants qui viennent de naître. « Dieu préservateur ! » s’écria '''Niloxène''', et il détourna les yeux. Mais '''Thalès''' fixa longtemps son regard sur le jeune pâtre; puis s’étant mis à sourire, (car il avait l’habitude de plaisanter toujours avec moi sur ma profession) : « Eh bien, '''Dioclès''', » dit-il, « songez-vous à préparer quelque expiation, et à donner de la besogne aux dieux préservateurs, comme vous trouvant en présence de quelque événement grave et considérable ? » — « Pourquoi non ? » répondis-je : « j’y vois le présage de troubles et de discordes qui s’étendront, j’en ai peur, jusqu’à un mariage et une génération avant que le courroux de la déesse ait été apaisé, puisqu’elle fait, vous le savez, une seconde manifestation ». À ces paroles '''Thalès''' ne répondit rien : il se contenta de rire et de s’en aller. Et comme '''Périandre''' était à la porte, s’avançant pour nous interroger sur ce que nous venions de voir, '''Thalès''' me quitta et le prit par la main : « Ce que '''Dioclès''' prescrira, vous l’exécuterez à loisir », lui dit-il ; « mais moi j’ai un conseil à vous donner : pour faire paître vos juments ne prenez pas de jeunes garçons, ou bien à ceux-ci donnez des femmes. » Ces paroles me semblèrent causer, des qu’il les eut entendues, une vive satisfaction à '''Périandre''', car il éclata de rire et serra très affectueusement '''Thalès''' dans ses bras. '''Thalès''' alors : « '''Dioclès''' », me dit-il, « si je conjecture bien, le prodige reçoit déjà son accomplissement. Car vous voyez quel grand malheur nous est arrivé, '''Alexidème''' n’ayant pas voulu souper avec nous. »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §3'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">Après avoir ainsi conversé pendant le chemin, nous ar- rivâmes au lieu destiné pour le banquet. Thalès ne voulut point entrer dans le bain, parcequ'il s'était déja par- fumé, mais il se promena dans les dehors, s'arrêta à voir les luttes et les courses ; il alla voir le bocage voisin de la mer, qu'on avait décoré avec beaucoup de soin, non qu'il fût frappé de tout cet appareil, mais pour ne point paraître mépriser Périandre et dédaigner sa magnifi- cence. Tous les autres convives, à mesure qu'ils sortaient du bain, étaient introduits par des esclaves dans la salle du banquet. Anacharsis seul était assis sous le portique , une jeune fille, debout, lui arrangeait les cheveux. Dès qu'elle vit Thalès, elle accourut très librement au-devant de lui ; ce philosophe l'embrassa, et lui dit en riant : « Parez cet hôte du mieux que vous pourrez, afin que le plus doux des hommes n'ait plus un extérieur sauvage et effrayant. » Je lui demandai quelle était cette jeune personne : « Eh quoi ! me répondit-il, vous ne connais- sez pas la sage et fameuse Eumétis ? C'est le nom que Cléobule lui donne, mais les autres l'appellent Cléobuline, du nom de son père . -Est-ce, dit Niloxène, à cause de sa subtilité et de son adresse à composer des énigmes, que vous faites ainsi son éloge ? Quelques unes de celles qu'on lui attri- bue ont pénétré jusqu'en Egypte. -Non, répliqua Thalès ; ces énigmes ne sont que des jouets dont elle s'amuse dans l'occasion pour éprouver lå perspicacité de ceux qu'elle rencontre. Ce qu'elle a de `vraiment admirable, c'est sa grande prudence, sa capa- cité pour les affaires, son humanité, et l'attention qu'elle a de rendre le gouvernement de son père doux et bien- faisant. Il est vrai, reprit Niloxène, que sa modestie et sa simplicité annoncent combien elle est populaire. Mais d'où viennent ces soins et cet intérêt pour Ana- charsis ? -Parceque c'est un homme sensé et très instruit, ré- pondit Thalès , qu'il s'est fait un plaisir de lui apprendre en détail le régime et le traitement que les Scythes em- ploient dans les maladies. Je suis sûr que dans ce mo- ment même où elle le pare avec tant de soin, elle s'en- tretient utilement avec lui, et cherche à s'instruire . >>> Nous approchions de la salle, lorsque nous rencontra- mes Alexidème de Milet, fils naturel du tyran Thrasybule . Il sortait tout troublé, et d'un ton de colère murmurait quelques mots que nous ne pûmes entendre. Dès qu'il vit Thalès, il se remit un peu ; et en lui adressant la pa- role, il lui dit : « Quel indigne affront Périandre vient de nous faire ! J'allais partir, il me retient, il me prie de res- ter à son festin ; et quand j'arrive, il m'y donne la der- nière place : il préfère un éolien, un insulaire, enfin je ne sais qui, à Thrasybule, car il est évident que c'est Thra- sybule que Périandre méprise , et brave ouvertement dans la personne de son envoyé 1 . -Eh quoi ! lui dit Thalès, craignez-vous que la place que vous occuperez à table ne vous rende plus grand ou plus petit , comme les Égyptiens disent que les astres brillent plus ou moins, suivant que le cercle qu'ils par- courent est plus ou moins élevé ? Et vous estimeriez-vous moins que ce Lacédémonien, qui, dans une assemblée publique, placé par le magistrat au dernier rang, lui dit : Vous avez trouvé le moyen de rendre cette place hono- rable 2 ? Doit-on en effet examiner après qui l'on est placé? Ne faut-il pas plutôt s'accommoder de ceux qu'on a pour voisins, afin d'avoir une occasion naturelle de se lier avec eux, et loin de se fâcher du rang qu'on occupe, té- moigner sa satisfaction de se trouver auprès d'eux ? Celui qui se plaint de la place qu'on lui assigne semble plus mécontent de son voisin que de son hôte, et se rend odieux à l'un et à l'autre . -Belles paroles que cela, repartit Alexidème. Mais , dans le fait, je vois que vous autres sages, vous recher- chezles honneurs aussi bien que nous. » En même temps, il nous quitte brusquement, et s'en va. Une conduite si étrange nous étonna tous : « Ce jeune homme, nous dit Thalès, a montré dès l'enfance un caractère dur et emporté. Unjour qu'on avait fait présent à Thrasybule d'un parfum de grand prix, il le versa dans une coupe mêlé avec du vin, et l'avala, payant ainsi d'in- gratitude la tendresse de son père. >>> Au même instant, un des gens de Périandre vint me prier d'aller avec Thalès voir quelque chose d'extraordi- naire qu'on venait de lui apporter, afin de juger si c'é- tait un jeu de la nature ou un prodige menaçant ; il nous dit qu'il en était tout troublé, et qu'il craignait que son sacrifice n'en fùt souillé. En même temps, il nous con- duit dans une salle qui donnait sur le jardin. Nous y trou- vâmes un jeune homme sans barbe, d'une figure intéres- sante, qui avait l'air d'un berger. Il lève une espèce de peau, et nous fait voir un enfant qu'il disait être né d'une cavale, qui avait la tête, le cou et les mains d'un homme, et dans tout le reste, était fait comme un cheval. Sa voix ressemblait à celle d'un enfant qui vient de naître : « Dieu préservateur ! s'écria Niloxène, en détournant la vue. >>> Mais Thalès, qui a coutume de plaisanter avec moi sur mon art , après avoir longtemps considéré ce jeune homme, me dit en souriant : « Ne pensez-vous pas déja, Dioclès, à faire des expiations ? Et pour détourner un présage si terrible , n'allez-vous pas donner bien de l'ouvrage aux dieux préservateurs ? -Pourquoi non ? lui répondis-je. Ce prodige, Thalès, est un signe menaçant de troubles et de discorde ; et je crains bien que l'épouse et les enfants de Périandre n'en éprouvent les tristes suites, puisque enfin, comme vous voyez, avant que la déesse soit apaisée, elle donne une nouvelle marque de son courroux. » A ces mots, Thalès sourit et sortit sans rien répondre. Il vit , à la porte de la salle, Périandre venir au-devant de nous, pour savoir notre sentiment. Il me quitta, lui prit la main, et lui dit : « Dioclès vous parlera ; vous ferez à loisir ce qu'il vous dira. Pour moi, je pense que vous ne devez pas avoir, pour garder vos juments, des bergers aussi jeunes, ou que vous devez les marier. » Cediscours parut faire grand plaisir à Périandre , car il en rit beaucoup, et embrassa affectueusement Thalès . Celui-ci s'adressant à moi : « Je crois, Dioclès, me dit-il, que le prodige a déja eu son accomplissement. Vous voyez le malheur qui vientde nous arriver ; Alexidème a refusé de souper avec nous. » </div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe IV.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage du caractère désinvolte de '''Thalès'''.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§4. Ἐπεὶ δ´ εἰσήλθομεν, ἤδη μεῖζον ὁ Θαλῆς φθεγξάμενος « ποῦ δ´ » εἶπεν « ὁ ἀνὴρ κατακλινάμενος ἐδυσχέρανεν; » ἀποδειχθείσης δὲ τῆς χώρας περιελθὼν ἐκεῖ κατέκλινεν ἑαυτὸν καὶ ἡμᾶς « ἀλλὰ κἂν ἐπριάμην » εἰπών « Ἀρδάλῳ κοινωνεῖν μιᾶς τραπέζης. » ἦν δὲ Τροιζήνιος ὁ Ἄρδαλος, αὐλῳδὸς καὶ ἱερεὺς τῶν Ἀρδαλείων Μουσῶν, ἃς ὁ παλαιὸς Ἄρδαλος ἱδρύσατο ὁ Τροιζήνιος.<br /><p style="text-align: centre">[...]<br /><p style="text-align: justify; text-indent: 15px">καὶ ὁ Θαλῆς ἐμὲ προσαγορεύσας ἐπάνω τοῦ Βίαντος κατακείμενον « τί οὐκ ἔφρασας, » εἶπεν, « ὦ Διόκλεις, Βίαντι τὸν Ναυκρατίτην ξένον ἥκοντα μετὰ προβλημάτων βασιλικῶν αὖθις ἐπ´ αὐτόν, ὅπως νήφων καὶ προσέχων ἑαυτῷ τὸν λόγον δέχηται; » Καὶ ὁ Βίας « ἀλλ´ οὗτος μέν, » ἔφη, « πάλαι δεδίττεται ταῦτα παρακελευόμενος, ἐγὼ δὲ τὸν Διόνυσον οἶδα τά τ´ ἄλλα δεινὸν ὄντα καὶ Λύσιον ἀπὸ σοφίας προσαγορευόμενον, ὥστ´ οὐ δέδια τοῦ θεοῦ μεστὸς γενόμενος μὴ ἀθαρσέστερον ἀγωνίσωμαι. » Τοιαῦτα μὲν ἐκεῖνοι πρὸς ἀλλήλους ἅμα δειπνοῦντες ἔπαιζον·</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §4'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§4. Après que nous fûmes entrés, '''Thalès''' ayant déjà élevé plus haut la voix: « Où donc », dit-il, « l’avait-on placé, cet homme qui s’en est formalisé ? » Quand on lui eut montré l’endroit il fit le tour de la salle, et ce fut là-même qu’il se plaça et nous installa. « En vérité », ajouta-t-il, « j’aurais payé pour partager la même table qu’'''Ardalus'''. » Cet '''Ardalus''' était un joueur de flûte [[w:Trézène_(ville)|''Trézénien'']] [[#Trézène|<span id="Trézène_back"><sup>'''I'''</sup></span>]], prêtre des ''muses Ardalides'' auxquelles l’antique [[w:Ardalos|'''Ardalus''']] de ''Trézène'' avait dressé des statues.<br /><p style="text-align: centre">[...]<br /><p style="text-indent: 15px">Moi, j’étais au-dessus de '''Bias''', et '''Thalès''' m’ayant interpellé : « '''Dioclès''' », me dit-il, « pourquoi n’avez-vous pas dit à '''Bias''' que l’étranger de ''Naucratie'' est venu une seconde fois le trouver avec des questions de la part de son prince, afin que ce soit à jeun qu’il reçoive ces communications et qu’il y applique son esprit ? » Et '''Bias''' : « Il y a longtemps », dit-il, « que '''Dioclès''' me menace de m’y contraindre ; mais je sais que '''Bacchus''', entre autres attributions merveilleuses, possède une sagacité qui l’a fait surnommer le dieu qui délie, de sorte que je ne crains pas, étant rempli de la divinité, que la confiance m’abandonne au moment de la lutte. » C’est ainsi que, pendant le repas, ils échangeaient entre eux des plaisanteries.</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §4'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> {{Boîte déroulante début|titre=NdA trad. par Victor Bétolaud de 1870|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Trézène_back|<span id="Trézène"><sup>I</sup></span>]] Du nom propre grec ancien Τροιζήν / Troizḗn [[wikt:en:Τροιζήν#Ancient_Greek|(en)]] ;<br /><p style="margin: 0 2em; text-indent: 15px">[[w:polis|Cité grecque]] du [[w:Péloponnèse|''Péloponnèse'']], sur la côte nord de l’[[w:Argolide|Argolide]].'''<br/><br/></div> {{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe VII.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Réflexions de '''Thalès''' sur le défi de sagacité posé par le roi des ''Éthiopiens'' au roi d’''Égypte'', [[w:Ahmôsis_II|'''Amasis''']], consistant à boire la mer. Ce dernier fait appel à '''Bias''' pour la résoudre, et celui-ci souhaite l’examiner en commun avec les sages. '''Chilon''' explique qu’il ne s’agit pas de faire disparaître tant d’eau salée, mais de rendre la domination d’'''Amasis''' potable et douce à ses sujets (§6).</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§7. [...] Ἐπὶ τούτῳ δ´ ὁ '''Θαλῆς''' ἔφησεν, εὐδαιμονίαν ἄρχοντος νομίζειν, εἰ τελευτήσειε γηράσας κατὰ φύσιν.</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §7'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§7. [...] Après lui '''Thalès''' prit la parole : « J’estime que le bonheur pour un souverain, c’est s’il meurt de vieillesse et naturellement. ».</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §7'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe IX.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Réflexions de '''Thalès''' sur le défi de sagacité posé par le roi d’''Égypte'', [[w:Ahmôsis_II|'''Amasis''']], au roi des ''Éthiopiens'', consistant en une série de questions : « Qu’y a-t-il de plus ancien ? Le temps. — De plus grand ? Le monde. — De plus habile ? La vérité. — De plus beau ? La lumière. — De plus commun ? La mort. — De plus utile ? Dieu. — De plus nuisible ? Le mauvais Génie. — De plus puissant ? La Fortune. — De plus facile ? Le plaisir. ». '''Amasis''' fait encore appel à '''Bias''' pour analyser les réponses du roi des ''Éthiopiens'', qui les examinent également en commun avec les sages.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§9. Τούτων πάλιν ἀναγνωσθέντων, ὦ Νίκαρχε, γενομένης σιωπῆς Θαλῆς ἠρώτησε τὸν Νειλόξενον εἰ προσήκατο τὰς λύσεις ὁ Ἄμασις. ἐκείνου δ´ εἰπόντος ὅτι τὰς μὲν ἀπεδέξατο ταῖς δ´ ἐδυσκόλαινε, « καὶ μὴν οὐδέν, » εἶπεν ὁ Θαλῆς, « ἀνεπίληπτόν ἐστιν, ἀλλ´ ἔχει πάντα διαμαρτίας μεγάλας καὶ ἀγνοίας. οἷον εὐθὺς ὁ χρόνος πῶς ἂν εἴη πρεσβύτατον, εἰ τὸ μὲν αὐτοῦ γεγονὸς τὸ δ´ ἐνεστώς ἐστι τὸ δὲ μέλλον; ὁ γὰρ μεθ´ ἡμᾶς ἐσόμενος χρόνος καὶ πραγμάτων τῶν νῦν καὶ ἀνθρώπων νεώτερος ἂν φανείη. τὸ δὲ τὴν ἀλήθειαν ἡγεῖσθαι σοφίαν οὐδὲν ἐμοὶ δοκεῖ διαφέρειν τοῦ τὸ φῶς ὀφθαλμὸν ἀποφαίνειν. εἰ δὲ τὸ φῶς καλόν, ὥσπερ ἐστὶν, ἐνόμιζε, πῶς τὸν ἥλιον αὐτὸν παρεῖδε; τῶν δ´ ἄλλων ἡ μὲν περὶ θεῶν καὶ δαιμόνων ἀπόκρισις θράσος ἔχει καὶ κίνδυνον, ἀλογίαν δὲ καὶ πολλὴν ἡ περὶ τῆς τύχης· οὐ γὰρ ἂν μετέπιπτε ῥᾳδίως οὕτως, ἰσχυρότατον οὖσα τῶν ὄντων καὶ ῥωμαλεώτατον. οὐ μὴν οὐδ´ ὁ θάνατος κοινότατόν ἐστιν· οὐ γάρ ἐστι πρὸς τοὺς ζῶντας. ἀλλ´ ἵνα μὴ δοκῶμεν εὐθύνειν τὰς τῶν ἑτέρων ἀποφάσεις, ἰδίας ταῖς ἐκείνου παραβάλωμεν· ἐμαυτὸν δὲ παρέχω πρῶτον, εἰ βούλεται Νειλόξενος, ἐρωτᾶν καθ´ ἕκαστον. ὡς οὖν ἐγένοντο τότε, κἀγὼ νῦν διηγήσομαι τὰς ἐρωτήσεις καὶ τὰς ἀποκρίσεις· ‘Τί πρεσβύτατον;’ [[wikt:en:θεός#Ancient_Greek|‘θεός,’]] » ἔφη Θαλῆς· « ‘ἀγέν νητον γάρ ἐστι.’ ‘Τί μέγιστον;’ ‘τόπος· τἄλλα μὲν γὰρ ὁ κόσμος, τὸν δὲ κόσμον οὗτος περιέχει.’ ‘Τί κάλλιστον;’ ‘κόσμος· πᾶν γὰρ τὸ κατὰ τάξιν τούτου μέρος ἐστί.’ ‘Τί σοφώτατον;’ ‘χρόνος· τὰ μὲν γὰρ εὕρηκεν οὗτος ἤδη, τὰ δ´ εὑρήσει.’ ‘Τί κοινότατον;’ ‘ἐλπίς· καὶ γὰρ οἷς ἄλλο μηδέν, αὕτη πάρεστι.’ ‘Τί ὠφελιμώτατον;’ ‘ἀρετή· καὶ γὰρ τἄλλα τῷ χρῆσθαι καλῶς ὠφέλιμα ποιεῖ.’ ‘Τί βλαβερώτατον;’ ‘κακία· καὶ γὰρ τὰ πλεῖστα βλάπτει παραγενομένη.’ ‘Τί ἰσχυρότατον;’ ‘ἀνάγκη· μόνον γὰρ ἀνίκητον.’ ‘Τί ῥᾷστον;’ ‘τὸ κατὰ φύσιν, ἐπεὶ πρὸς ἡδονάς γε πολλάκις ἀπαγορεύουσιν.’ » </div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §9'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§9. Cette lecture ainsi reproduite, mon cher '''Nicarque''', il se fit un moment de silence. Après quoi '''Thalès''' demanda à '''Niloxène''' si '''Amasis''' avait accepté de telles solutions. Il répondit que ce monarque avait accepté les unes et qu’il avait été mécontent des autres. « C’est qu’en effet », dit '''Thalès''', « il n’en est aucune qui soit irréprochable, et toutes sont grandement entachées d’erreur et d’ignorance. Ainsi, d’abord, comment le temps pourrait-il être ce qu’il y a de plus ancien, puisque, une partie étant écoulée, je le veux bien, une autre est le présent, une autre est l’avenir ? Le temps qui doit venir après nous est évidemment plus jeune que les hommes d’aujourd’hui, que les événements actuels. Croire que ce qu’il y a de plus habile, ce soit la vérité, c’est, à mon avis, ne pas émettre une autre opinion que celle-ci : l’oeil et la lumière sont tout un. Si du reste l’''Éthiopien'' a cru, ce qui est réel, la lumière plus belle que tout, pourquoi a-t-il négligé de nommer le soleil lui-même ? Des autres réponses, celle qui concerne la Divinité et le Génie est aussi téméraire que dangereuse ; et ce qu’il dit de la Fortune est tout à fait déraisonnable : car elle ne changerait pas avec tant de facilité, si elle était ce qu’il y a de plus puissant et de plus fort au monde. De même, la mort n’est pas ce qu’il y a de plus commun, puisqu’elle n’est pas commune aux vivants. Mais pour que nous ne semblions pas nous borner à redresser les réponses des autres, il faut y opposer nos propres solutions. Je m’y offre le premier, si '''Niloxène''' veut reprendre chaque question ». Telles que furent faites alors et les demandes et les réponses, je vais vous les reproduire aujourd’hui : Qu’y a-t-il de plus ancien ? C’est dieu, répondit '''Thalès''', attendu qu’il est incréé. — De plus grand ? L’espace : car si le monde contient le reste, à son tour il est contenu dans l’espace. — De plus beau ? Le monde : car tout ce qui est bien ordonné en fait partie. ― De plus habile ? Le temps : car c’est lui qui a découvert et qui découvrira tout. — De plus commun ? L’espérance : car ceux même qui n’ont rien autre chose la possèdent. — De plus utile ? La vertu : car elle rend toutes les autres choses utiles par le bon usage qu’elle en fait. — De plus nuisible ? Le vice : car il corrompt tout par sa présence. — De plus puissant ? La nécessité : car elle est seule invincible. De plus facile ? Ce qui est selon la nature : car, pour ce qui est du plaisir, il amène souvent la lassitude.</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §9'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe XI.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Réflexion de '''Thalès''' sur les gouvernements où la loi est égale pour tous.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§11. Ἐπὶ τούτῳ '''Θαλῆς''' τὴν μήτε πλουσίους ἄγαν μήτε πένητας ἔχουσαν πολίτας.</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §11'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§11. Après lui '''Thalès''' : « que c’est celle qui n’a ni des citoyens trop riches, ni des citoyens trop pauvres. »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §11'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe XII.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Réflexion de '''Thalès''' sur la manière dont une maison doit être réglée.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§12. Τοῦτον οὖν ἄριστον ὁ '''Σόλων''' εἶπεν αὑτῷ δοκεῖν οἶκον, ὅπου τὰ χρήματα μήτε κτωμένοις ἀδικία μήτε φυλάττουσιν ἀπιστία μήτε δαπανῶσι μετάνοια πρόσεστιν. Ὁ δὲ '''Βίας''' ἐν ᾧ τοιοῦτός ἐστιν ὁ δεσπότης δι´ αὑτὸν οἷος ἔξω διὰ τὸν νόμον. Ὁ δὲ '''Θαλῆς''' ἐν ᾧ πλείστην ἄγειν τῷ δεσπότῃ σχολὴν ἔξεστιν.</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §12'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§12. '''Solon''' déclara que, selon lui, « la meilleure maison est celle où le bien qui s’y trouve est possédé sans injustice, conservé sans défiance, dépensé sans repentir. » '''Bias''' : « celle où, à l’intérieur, le maître est, par respect pour lui-même, ce qu’il est au dehors par respect pour la loi. » '''Thalès''' : « celle où le maître peut avoir un très grand loisir. »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §12'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe XIV.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage de l’''espièglerie'' de '''Thalès'''.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§14. [...] '''Ἐπιστήσαντος''' δὲ τοῦ λόγου τὸ συμπόσιον ὁ μὲν '''Θαλῆς''' ἐπισκώπτων εὖ φρονεῖν ἔφη τὸν '''Ἐπιμενίδην''' ὅτι μὴ βούλεται πράγματα ἔχειν ἀλῶν τὰ σιτία καὶ πέττων ἑαυτῷ, καθάπερ '''Πιττακός'''. « ἐγὼ γάρ, » εἶπε, « τῆς ξένης ἤκουον ᾀδούσης πρὸς τὴν μύλην, ἐν [[w:Eresós|''Ἐρέσῳ'']] γενόμενος, ἄλει, μύλα, ἄλει· καὶ γὰρ '''Πιττακὸς''' ἄλει μεγάλας ''Μυτιλάνας'' βασιλεύων. »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §14'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§14. [...] Ces paroles ayant mis en arrêt les convives, '''Thalès''' dit en raillant qu’'''Epiménide''' avait bien raison de ne pas vouloir se donner l’embarras de moudre et de cuire lui-même son manger, comme faisait '''Pittacus''' : « Car je me souviens », ajouta-t-il, « qu’étant à ''Lesbos'', j’entendis mon hôtesse chanter à sa meule : Va ton train, meule, va ton train, puisque '''Pittacus''', le roi de la grande ''Mitylène'', s’occupe bien à moudre. »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §14'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe XV.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage d’une doctrine de '''Thalès''' sur l’importance vitale de l’agriculture.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§15. [...] « Οὐδαμῶς, » ὁ '''Κλεόδωρος''', « ἔμοιγ´, » εἶπεν, « εἰ δεῖ τὸ φαινόμενον εἰπεῖν, καὶ μάλιστα παρακειμένης τραπέζης, ἣν ἀναιροῦσιν αἰρομένης τροφῆς φιλίων θεῶν βωμὸν οὖσαν καὶ ξενίων. ὡς δὲ '''Θαλῆς''' λέγει τῆς γῆς ἀναιρεθείσης σύγχυσιν τὸν ὅλον ἕξειν κόσμον, οὕτως οἴκου διάλυσις ἐστι· συναναιρεῖται γὰρ αὐτῇ πῦρ ἑστιοῦχον ἑστία κρατῆρες ὑποδοχαὶ ξενισμοί, φιλανθρωπότατα καὶ πρῶτα κοινωνήματα πρὸς ἀλλήλους, μᾶλλον δὲ σύμπας ὁ βίος, εἴ γε διαγωγή τίς ἐστιν ἀνθρώπου πράξεων ἔχουσα διέξοδον, ὧν ἡ τῆς τροφῆς χρεία καὶ παρασκευὴ τὰς πλείστας παρακαλεῖ. [...] »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §15'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§15. [...] « S’il faut dire ce que je pense », reprit '''Cléodème''', « ce n’est nullement mon avis, et surtout quand est dressée la table, que l’on supprime si la nourriture est supprimée et qui est l’autel des dieux amis et hospitaliers. Et s’il est vrai, comme dit '''Thalès''', que la suppression de la terre dût entraîner le désordre et la ruine du monde entier, de même anéantir la table ce serait anéantir la maison. Avec la table disparaîtraient le feu qui consacre le foyer, le foyer lui-même, les coupes, les réceptions, les hospitalités, qui sont les plus affectueux et les premiers rapports de communauté entre les hommes; ou plutôt disparaîtrait la vie entière, s’il est vrai que la vie soit une sorte de courant formé par la série des actes de l’homme, actes dont le plus grand nombre est commandé par le besoin et la préparation de la nourriture.</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §15'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe XVII.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage d’une parole sage de '''Thalès''' : Ne croire ni ses ennemis sur les choses croyables, ni ses amis sur les choses incroyables.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§17. τέλος δὲ γελάσας πρὸς ἡμᾶς « βούλομαι μέν, » ἔφη, « πρὸς τὸ παρὸν φράσαι τὸ προσηγγελμένον· ὀκνῶ δ´ ἀκούσας '''Θαλέω''' ποτ´ εἰπόντος ὅτι δεῖ τὰ μὲν εἰκότα λέγειν, τὰ δ´ ἀμήχανα σιωπᾶν. » Ὑπολαβὼν οὖν ὁ '''Βίας''' « ἀλλὰ καὶ τοῦτ´, » ἔφη, « '''Θαλέω''' τὸ σοφόν ἐστιν, ὅτι δεῖ τοῖς μὲν ἐχθροῖς καὶ περὶ τῶν πιστῶν ἀπιστεῖν, τοῖς δὲ φίλοις καὶ τὰ ἄπιστα πιστεύειν, ἐχθροὺς μέν, ἔγωγ´ ἡγοῦμαι, τοὺς πονηροὺς καὶ ἀνοήτους, φίλους δὲ τοὺς χρηστοὺς καὶ φρονίμους αὐτοῦ καλοῦντος. οὐκοῦν, »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §17'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§17. [...] A la fin il s’adressa à nous en éclatant de rire : « Je voudrais vous faire connaître, sans plus attendre, ce que '''Gorgias''' vient de me conter; et pourtant j’hésite, parce que j’ai autrefois entendu dire à '''Thalès''' qu’il faut dire les choses vraisemblables et taire les impossibles. « Mais, reprit '''Bias''', « c’est à '''Thalès''' aussi qu’appartient cette sage parole : qu’il faut ne pas croire ses ennemis même sur les choses croyables, et croire ses amis même sur celles qui ne le sont pas : par ennemis il entendait, je suppose, les méchants et les sots, par amis, les gens vertueux et sensés. »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §17'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe XXI.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage d’une doctrine de '''Thalès''' sur la résidence de l'âme dans toutes les parties du monde les plus essentielles.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§21. Μετὰ δὲ τοῦτον ὁ '''Ἀνάχαρσις''' εἶπεν ὅτι τοῦ '''Θαλέω''' καλῶς ὑπολαμβάνοντος ἐν πᾶσιν εἶναι τοῖς κυριωτάτοις μέρεσι τοῦ κόσμου καὶ μεγίστοις ψυχήν, [...].</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §21'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§21. Après '''Pittacus''', '''Anacharsis''' prit la parole : « Puisque, comme '''Thalès''' l’a magnifiquement établi, une âme réside dans toutes les parties du monde les plus essentielles, [...].</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://remacle.org/bloodwolf/historiens/Plutarque/banquet.htm Των επτα σοφων συμποσιον - Le banquet des sept sages], §21'', texte établi par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;"></div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome I, [https://www.google.fr/books/edition/Oeuvres_morales_de_Plutarque/QnRQAAAAcAAJ?hl=fr&gbpv=0 Le banquet des sept sages]'' pp.325, 326, traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">― ✳ ―</div> ==== Du démon de '''Socrate''' ==== <div style="text-align: center; margin: 0 1em;"></div> ===== <div style="text-align: center;">Paragraphe VI.</div> ===== <div style="text-align: center; margin: 0 1em;">Témoignage de l’aversion de '''Thalès''' pour les [[w:Tyran|''tyrans'']].</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid;"><br /><div style="text-align: justify; margin: 0 2em; text-indent: 15px">§6. Ταῦτα τοῦ '''Θεοκρίτου''' λέγοντος ὁ '''Λεοντίδης''' ἐξῄει μετὰ τῶν φίλων, ἡμεῖς δ´ εἰσελθόντες ἠσπαζόμεθα τὸν '''Σιμμίαν''' ἐπὶ τῆς κλίνης καθεζόμενον οὐ κατατετευχότα τῆς δεήσεως, οἶμαι, μάλα σύννουν καὶ διαλελυπημένον· ἀποβλέψας δὲ πρὸς ἅπαντας ἡμᾶς ‘ὦ '''Ἡράκλεις''',’ εἶπεν ‘ἀγρίων καὶ βαρβάρων ἠθῶν· εἶτ´ οὐχ ὑπέρευ '''Θαλῆς''' ὁ παλαιὸς ἀπὸ ξένης ἐλθὼν διὰ χρόνου τῶν φίλων ἐρωτώντων ὅ τι καινότατον ἱστορήκοι ’τύραννον‘ ἔφη ’γέροντα.‘ καὶ γὰρ ᾧ μηδὲν ἰδίᾳ συμβέβηκεν ἀδικεῖσθαι, τὸ βάρος αὐτὸ καὶ τὴν σκληρότητα τῆς ὁμιλίας δυσχεραίνων ἐχθρός ἐστι τῶν ἀνόμων καὶ ἀνυπευθύνων δυναστειῶν.[...]</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome II, [https://remacle.org/bloodwolf/historiens/Plutarque/demonsocrategr.htm Περι του Σωκρατους Δαιμονιου - Le Démon de Socrate], §6'', traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§6. Pendant que [[w:Théocrite|'''Théocritos''']] [[#Théocrite|<span id="Théocrite_back"><sup>'''I'''</sup></span>]] parlait, '''Léontidas''' sortit avec ses amis, et nous entrâmes chez '''Simmias''', que nous saluâmes affectueusement. Il était assis sur son lit, et j’attribuai à l’insuccès de sa demande son air pensif et affligé. Après nous avoir regardés tous : « Par '''Hercule''' ! s’écria-t-il, quelles mœurs sauvages et barbares ! Eh bien ! n’avait-il pas cent fois raison le '''Thalès''' des anciens jours ? Comme il était revenu d’un long voyage à l’étranger, ses amis lui demandaient ce qu’il avait vu de plus curieux : « Un tyran parvenu à la vieillesse », répondit-il. Car ceux même qui n’ont pas éprouvé de la part d’un despote une injustice personnelle, supportent avec peine le poids et la dureté d’un semblable régime. On déteste tout pouvoir qui est en dehors de la loi et qui ne veut rendre de comptes à personne. [...]</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome III, [[s:Page:Plutarque_-_Œuvres_complètes_de_Plutarque_-_Œuvres_morales_et_œuvres_diverses,_tome_3,_1870.djvu/74|Περι του Σωκρατους Δαιμονιου - Le Démon de Socrate]], [[s:Page:Plutarque_-_Œuvres_complètes_de_Plutarque_-_Œuvres_morales_et_œuvres_diverses,_tome_3,_1870.djvu/83|§6]]'', traduites par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> {{Boîte déroulante début|titre=NdA de trad. Victor Bétolaud de 1870|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Théocrite_back|<span id="Théocrite"><sup>I</sup></span>]] Du nom propre grec ancien Θεόκριτος / Theókritos [[wikt:en:Θεόκριτος#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;">➥ de l’adjectif et du nom commun θεός / theós [[wikt:en:θεός#Ancient_Greek|(en)]], « divin, dieu, divinité »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ +‎ du verbe κρίνω / krínō, « 1. (transitif) Séparer, diviser, distinguer entre deux choses ou personnes ou parmi un groupe de choses ou de personnes. 2. (transitif) Commander, organiser. 3. S’enquérir, enquêter. 4. Sélectionner, choisir, préférer. 5. (transitif) Trancher un différend ou un concours ; (intransitif) Porter un jugement, prendre une décision : • (voix moyenne, voix passive) Décider d’un concours ; (voix moyenne et voix passive) Se disputer, se disputer, se quereller. 6. Décider ou juger [+accusatif et infinitif = que quelque chose fait quelque chose], [+accusatif et accusatif = que quelque chose est quelque chose]. 7. Discerner entre le bien et le mal. 8. Juger, prononcer. 9. Traduire en justice, accuser. 10. Condamner, critiquer. 11. Sécréter, cacher, dissimuler. »;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ + le suffixe adjectival récessif‎ -τος / -tos [[wikt:en:-τος#Ancient_Greek|(en)]];<br /><p style="margin: 0 2em; text-indent: 15px;">''Poète'', auteur de [[w:Mime|''mimes'']] (imitations comiques du langage ou des gestes), d’[[w:Poésie_pastorale|''idylles pastorales'']] et de [[w:Épopée|''contes épiques'']].<br /><p style="text-align: right; margin: 0 2em;">([[w:Circa|{{Info|''ca.''|Circa, locution latine que l’on emploie pour indiquer l’approximation d’une date}}]] [[w:310_av._J.-C.|-310]]<sup>[[w:IVe_siècle_av._J.-C.|⏳]]</sup>, à [[w:Théocrite#cite_ref-2|''Syracuse'']] — {{Info|''ca.''|Circa, locution latine que l’on emploie pour indiquer l’approximation d’une date}} [[w:250_av._J.-C.|-250]]<sup>[[w:IIIe_siècle_av._J.-C.|⏳]]</sup>)'''<br /><br /> </div>{{Boîte déroulante fin}} <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">§6. Pendant que '''Théocritos''' discourait ainsi, '''Léontidas''' sortit avec ses amis ; nous entrâmes et saluâmes '''Simmias''', qui était assis sur son lit, tout soucieux et triste, parce que sa demande avait été rejetée sans doute. En nous regardant tous, il s’écria : « '''Héraclès''' ! les moeurs sauvages et barbares ! Ah ! que '''Thalès''' l’ancien avait raison de répondre, lorsqu’après un long voyage à l’étranger ses amis lui demandaient ce qu’il avait remarqué de plus extraordinaire : « Un tyran âgé ». Même un homme qui a eu la chance de n’être pour son compte victime d’aucune injustice exècre déjà le poids et la dureté de ce commerce et est ennemi des dictatures, des dominations arbitraires.[...]</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome II, [https://remacle.org/bloodwolf/historiens/Plutarque/demonsocrate.htm Περι του Σωκρατους Δαιμονιου - Le Démon de Socrate], §6'', traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">― ✳ ―</div> ==== Les [[w:Alimentation_en_Grèce_antique#Banquets|''Symposiaques'']] [[#Symposiaques|<span id="Symposiaques_back"><sup>'''I'''</sup></span>]], ou questions de table ==== <div style="text-align: center; margin: 0 1em;"></div> {{Boîte déroulante début|titre=NdA Symposiaques|fondtitre=#ffffff|alignT=right|styleTitre=color:#3366BB;|styleFrame=border-color:white}} <div style="text-align: justify; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px; font-size:85%;"> <p style="margin: 0 2em; text-indent: 15px;"><br/>'''[[#Symposiaques_back|<span id="Symposiaques"><sup>I</sup></span>]] Du nom commun grec ancien συμπόσιον / sympósion [[wikt:en:συμπόσιον#Ancient_Greek|(en)]], « Seconde partie d’un repas pendant laquelle un groupe restreint de convives buvaient et discutaient sur un sujet. » ; <br /><p style="margin: 0 2em; text-indent: 15px;">➥ du nom commun σῠμπότης / sŭmpótēs [[wikt:en:συμπότης#Ancient_Greek|(en)]], « compagnon de boisson » ; <br /><p style="margin: 0 4em; text-indent: 15px;">➥ du préfixe σῠν- / sŭn- [[wikt:en:συν-#Ancient_Greek|(en)]], « avec, ensemble » ;<br /><p style="margin: 0 4em; text-indent: 15px;">➥ +‎ du nom commun ποτής / potḗs [[wikt:en:ποτής#Ancient_Greek|(en)]], « boisson » ;<br /><p style="margin: 0 2em; text-indent: 15px;">➥ +‎ du suffixe -ῐον / -ĭon [[wikt:en:-ιον#Ancient_Greek|(en)]] ;<br /><p style="margin: 0 2em; text-indent: 15px;">Entretiens dans un banquet, propos de table. '''<br /><br /> </div>{{Boîte déroulante fin}} ===== <div style="text-align: center;">Livre III</div> ===== <div style="text-align: center; margin: 0 1em;"></div> ====== <div style="text-align: center;">Question VI. Sur le temps où il est à propos de se rapprocher d’une femme.</div> ====== <div style="text-align: center; margin: 0 1em;">Témoignage du statut marital de '''Thalès''' et de sa relation avec sa mère</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid;"><br /><div style="text-align: justify; margin: 0 2em; text-indent: 15px">Καθάπερ οὖν '''Θαλῆς''' ὁ σοφὸς ὑπὸ τῆς μητρὸς ἐνοχλούμενος γῆμαι κελευούσης πῶς ὑπεξέφυγε παρήγαγε λέγων πρὸς αὐτὴν ἐν ἀρχῇ μέν « οὔπω καιρὸς ὦ μῆτερ, » ὕστερον δ´ « οὐκέτι καιρὸς ὦ μῆτερ », οὕτως ἄρα καὶ πρὸς ἀφροδίσια κράτιστον {ἔσται} ἔχειν ἕκαστον, ὥστε κατακλινόμενον λέγειν «οὔπω καιρός», ἀνιστάμενον δ´ « οὐκέτι καιρός ».</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome III, [https://remacle.org/bloodwolf/historiens/Plutarque/sympos3.htm#VI Προβλημα Ϛ. Περὶ καιροῦ συνουσίας. - Question VI. Quel est le temps le plus propre à l'amour?]'', traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div></div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§3. Ainsi donc, comme le sage '''Thalès''', fatigué par sa mère qui l’engageait à se marier, trouva le moyen de lui échapper et de lui donner le change en lui disant une première fois : « Il n’est pas encore temps, ma mère », et, lorsqu’elle insistait encore après qu’il avait passé l’âge : « Il n’est plus temps » ; de même, pour ce qui regarde les plaisirs de l’amour, le mieux sera que chacun se détermine à dire, en se mettant au lit : « Il n’est pas temps encore », et, en sortant du lit : « il n’est plus temps ».</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome III, [[s:Page:Plutarque_-_Œuvres_complètes_de_Plutarque_-_Œuvres_morales_et_œuvres_diverses,_tome_3,_1870.djvu/268|Question VI. Sur le temps où il est à propos de se rapprocher d’une femme]], [[s:Page:Plutarque_-_Œuvres_complètes_de_Plutarque_-_Œuvres_morales_et_œuvres_diverses,_tome_3,_1870.djvu/271|§3]]'', traduites par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">Le sage '''Thalès''', pressé par sa mère de se marier, lui répondit avec beaucoup d’adresse. Au commencement, il lui dit : Ma mère, il n’est pas encore temps. Quand il eut passé la fleur de son âge, et qu’elle lui fit de nouvelles instances, il lui répondit : Il n’est plus temps. De même, par rapport à la question proposée, le mieux serait que chacun pût se dire le soir en se couchant : Il n'm’est pas encore temps ; et le matin, quand il se lève : Il n’est plus temps. »</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome III, [https://remacle.org/bloodwolf/historiens/Plutarque/sympos3.htm#VI Προβλημα Ϛ. Περὶ καιροῦ συνουσίας. - Question VI. Quel est le temps le plus propre à l'amour?]'', traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">― ✳ ―</div> ==== De la malignité d’'''Hérodote''' ==== <div style="text-align: center; margin: 0 1em;"></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">― ✳ ―</div> ==== Les opinions des Philosophes ==== <div style="text-align: center; margin: 0 1em;"></div> ===== <div style="text-align: center;">Livre I</div> ===== <div style="text-align: center; margin: 0 1em;"></div> <div style="text-align: center; margin: 0 auto;">― ● ―</div> ===== <div style="text-align: center;">Livre II</div> ===== <div style="text-align: center; margin: 0 1em;"></div> <div style="text-align: center; margin: 0 auto;">― ● ―</div> ===== <div style="text-align: center;">Livre III</div> ===== <div style="text-align: center; margin: 0 1em;"></div> <div style="text-align: center; margin: 0 auto;">― ● ―</div> ===== <div style="text-align: center;">Livre IV</div> ===== <div style="text-align: center; margin: 0 1em;"></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">― ✳ ―</div> ==== Les animaux de terre ont-ils plus d'adresse que ceux de mer? ==== <div style="text-align: center; margin: 0 1em;"></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">― ✳ ―</div> ==== D’'''Isis''' et d’'''Osiris'''==== <div style="text-align: center; margin: 0 1em;"></div> ===== <div style="text-align: center;">Paragraphe IX.</div> ===== <div style="text-align: center; margin: 0 1em;">Témoignage d’un voyage de '''Thalès''' en ''Égypte'', de rencontres avec des prêtres et de récit sur leur divinités.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid;"><br /><div style="text-align: justify; margin: 0 2em; text-indent: 15px">§9. [...] '''Ἑκαταῖος''' δ´ ὁ ''Ἀβδηρίτης'' φησὶ τούτῳ καὶ πρὸς ἀλλήλους τῷ ῥήματι χρῆσθαι τοὺς ''Αἰγυπτίους'', ὅταν τινὰ προσκαλῶνται· προσκλητικὴν γὰρ εἶναι τὴν φωνήν. Διὸ τὸν πρῶτον θεόν, ὃν τῷ παντὶ τὸν αὐτὸν νομίζουσιν, ὡς ἀφανῆ καὶ κεκρυμμένον ὄντα προσκαλούμενοι καὶ παρακαλοῦντες ἐμφανῆ γενέσθαι καὶ δῆλον αὐτοῖς ''Ἀμοῦν'' λέγουσιν.<br /><p style="text-indent: 15px">§10. Ἡ μὲν οὖν εὐλάβεια τῆς περὶ τὰ θεῖα σοφίας '''Αἰγυπτίων''' τοσαύτη {ἦν}, μαρτυροῦσι δὲ καὶ τῶν ''Ἑλλήνων'' οἱ σοφώτατοι, '''Σόλων''' '''Θαλῆς''' '''Πλάτων''' '''Εὔδοξος''' '''Πυθαγόρας''', ὡς δ´ ἔνιοί φασι, καὶ '''Λυκοῦργος''' εἰς ''Αἴγυπτον'' ἀφικόμενοι καὶ συγγενόμενοι τοῖς ἱερεῦσιν.[...]</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome V, [https://remacle.org/bloodwolf/historiens/Plutarque/isisetosiris.htm Περι Ισιδος και Οσιριδος - Traité d’Isis et d’Osiris], §34'', traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1870<br />(également disponible une édition de 1844 [https://remacle.org/bloodwolf/historiens/Plutarque/isisetosiris1.htm ici])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§9. [...] '''Hécatée''' d’''Abdère'' dit que les ''Égyptiens'' emploient ce mot pour s’appeler les uns les autres, attendu qu’il est essentiellement appellatif. C’est pourquoi, s’adressant au premier Dieu, le même, selon eux, que l’Univers, comme à un être invisible et caché, ils l’exhortent avec supplications, en l’appelant "Amoun", à se faire voir et à se découvrir à eux. Voilà jusqu’à quel point était grande la réserve qui caractérisait la philosophie religieuse des ''Égyptiens''.<br /><p style="text-indent: 15px">§10. C’est ce que témoignent les plus éclairés d’entre les ''Grecs'': '''Solon''', '''Thalès''', '''Platon''', '''Eudoxe''', '''Pythagore''', et aussi, d’après quelques-uns, '''Lycurgue'''. Ils étaient allés en ''Égypte'' et avaient eu des conférences avec les prêtres. [...]</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome V, [https://remacle.org/bloodwolf/historiens/Plutarque/isisetosiris.htm Περι Ισιδος και Οσιριδος - Traité d’Isis et d’Osiris], §§9, 10'', traduites par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870<br/>(également disponible [[s:Sur_Isis_et_Osiris|ici]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">§9. [...] '''Hécatée''' d’''Abdère'' dit que les ''Egyptiens'' s’en servent pour s’appeler les uns les autres; que ce nom est de sa nature appellatif ; que ce peuple , qui croit que le premier des dieux, qu’il confond avec l’univers, est un dieu caché et inconnu, l’invoque et le prie de se découvrir à eux, en lui disant ''Amoun'' ;<br /><p style="text-indent: 15px">§10. tant ce peuple portait de retenue et de réserve dans sa philosophie religieuse ! C’est ce qu'attestent unanimement les plus sages d’entre les ''Grecs'', '''Solon''', '''Thalès''', '''Platon''', '''Eudoxe''', '''Pythagore''', et, suivant quelques uns, '''Lycurgue''' lui-même, qui tous voyagèrent en ''Egypte'', et y conférèrent avec les prêtres du pays.[...]</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome V, [https://remacle.org/bloodwolf/historiens/Plutarque/isisetosiris1.htm Περι Ισιδος και Οσιριδος - Traité d’Isis et d’Osiris], §§9, 10'', traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto;">― • ―</div> ===== <div style="text-align: center;">Paragraphe XXXIV.</div> ===== <div style="text-align: justify; text-indent: 15px; margin: 0 1em;">Témoignage de la théorie de '''Thalès''' de l’eau principe de tous les êtres.</div> :'''Texte grec''' <div style="text-align: justify; margin-top: 2em; overflow: auto; height: 270px; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§34. Ἥλιον δὲ καὶ Σελήνην οὐχ ἅρμασιν ἀλλὰ πλοίοις ὀχήμασι χρωμένους περιπολεῖν φασιν αἰνιττόμενοι τὴν ἀφ´ ὑγροῦ τροφὴν αὐτῶν καὶ γένεσιν. Οἴονται δὲ καὶ '''Ὅμηρον''' ὥσπερ '''Θαλῆν''' μαθόντα παρ´ ''Αἰγυπτίων'' ὕδωρ ἀρχὴν ἁπάντων καὶ γένεσιν τίθεσθαι· τὸν γὰρ '''Ὠκεανὸν''' '''Ὄσιριν''' εἶναι, τὴν δὲ '''Τηθὺν''' '''Ἶσιν''' ὡς τιθηνουμένην πάντα καὶ συνεκτρέφουσαν. [...]</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome V, [https://remacle.org/bloodwolf/historiens/Plutarque/isisetosiris.htm Περι Ισιδος και Οσιριδος - Traité d’Isis et d’Osiris], §34'', traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1870<br />(également disponible une édition de 1844 [https://remacle.org/bloodwolf/historiens/Plutarque/isisetosiris1.htm ici])</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> :'''Traductions''' <div style="text-align: justify; margin-top: 2em; height: 520px; overflow: auto; border: 2px solid; text-indent: 15px"><br /><div style="text-align: justify; margin: 0 2em;">§34. Ils disent que le soleil et la lune parcourent leur route perpétuelle non pas sur des chars, mais sur des bâtiments de navigation: signifiant par là, que c’est le principe humide qui les entretient et qui leur a donné naissance. Ils croient aussi que c’est des ''Egyptiens'' qu’'''Homère''', et après lui '''Thalès''', ont appris à établir l’eau comme principe générateur de tous les êtres. Ils veulent qu’'''Osiris''' soit l’'''Océan''', qu’'''Isis''' soit '''Téthys''', laquelle nourrit et entretient tout ce qui existe.</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome V, [https://remacle.org/bloodwolf/historiens/Plutarque/isisetosiris1.htm Περι Ισιδος και Οσιριδος - Traité d’Isis et d’Osiris], §34'', traduites par [[w:Victor_Bétolaud|Victor Bétolaud]], 1870<br/>(également disponible [[s:Sur_Isis_et_Osiris|ici]])</div> <div class="center" style="border-bottom: 1px solid #444; width: 30%; margin: 0 auto;"></div> <div style="text-indent: 15px; text-align: justify; margin: 0 2em;">§34. Ils disent que le soleil et la lune parcourent les cieux, portés, non sur des chars, mais sur des vaisseaux, pour signifier que tout est nourri et mis en mouvement par l’eau. Ils pensent que c’est des ''Egyptiens'' qu’'''Homère''' et '''Thalès''' avaient pris cette opinion, que l’eau est le principe de tous les êtres, qu’'''Osiris''' est l’'''Océan''', et qu’'''Isis''' est '''Thétis''', qui nourrit et alimente toutes les substances.</div> <div style="text-align: right; margin: 0 2em 0 1em;"><u>Œuvres complètes de Plutarque, Œuvres Morales</u>, ''Tome V, [https://remacle.org/bloodwolf/historiens/Plutarque/isisetosiris1.htm Περι Ισιδος και Οσιριδος - Traité d’Isis et d’Osiris], §34'', traduites par [[w:Dominique_Ricard|Dominique Ricard]], 1844</div> <div class="center" style="border-bottom: 1px solid #FFF; width: 30%; margin: 0 auto;"></div></div> <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Valère_Maxime|'''Valère Maxime''']] ''([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l'on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:Ier_siècle|I<sup>er</sup> siècle {{Info|EC|de l’Ère Commune}}]])'' [[s:Auteur:Valère_Maxime|<sup>📚</sup>]] == === Actions et paroles mémorables, VII, § 2 === :8. Il y a aussi un mot admirable de Thalès. On lui demandait si les actions des hommes échappaient à la connaissance des dieux. "Leurs pensées non plus", répondit-il. Aussi faut-il nous appliquer à avoir, je ne dis pas seulement les mains, mais encore le cœur pur, dans la persuasion que la divinité est témoin des mouvements les plus secrets de nos âmes. <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Tatien_le_Syrien|'''Tatien''']] le [[w:Assyrie_(province_romaine)|''Syrien'']] ''(vers [[w:120|120]], en [[w:Halicarnasse|''Halicarnasse'']] en [[w:Assyrie_(province_romaine)|Assyrie]] — vers [[w:173|173]], en Assyrie)'' <sup>[[w:IIe_siècle|⏳]]</sup> [[s:Auteur:Tatien_le_Syrien|<sup>📚</sup>]] == === Discours aux Grecs, 41 === = [[w:Lucien_de_Samosate|'''Lucien de Samosate''']] ''(vers [[w:120|120]], à [[w:Samosate|Samosate]] — vers [[w:180|180]], en [[w:Égypte_romaine_et_byzantine|Égypte]])'' <sup>[[w:IIe_siècle|⏳]]</sup> [[s:Auteur:Lucien_de_Samosate|<sup>📚</sup>]] = === Dialogues des morts === https://gallica.bnf.fr/ark:/12148/bpt6k6227866x/f7.item https://gallica.bnf.fr/ark:/12148/bpt6k6227866x/f103.double === Hippias ou le bain === :(2) Mon but est de prouver que les constructeurs de machines qui méritent le plus notre admiration sont ceux qui, distingués par leur science théorique, ont laissé en outre à la postérité des monuments de leur art et des œuvres de leur génie, tandis que les hommes, qui se sont seulement exercés dans la parole méritent plutôt le nom de sophistes que celui de savants. C'est sur la liste traditionnelle de ces artistes que nous voyons figurer Archimède et Socrate de Cnide, qui inventèrent, l'un les moyens de soumettre à Ptolémée la ville de Memphis, sans recourir à un siège, mais en détournant et en divisant le cours du Nil ; l'autre, ceux d'incendier les galères des ennemis. Avant eux, Thalès de Milet, ayant promis à Crésus de faire passer à pied sec à son armée les eaux du fleuve Halys, imagina de les détourner en une seule nuit derrière le camp ; et pourtant ce n'était pas un mécanicien de profession, mais un sage d'un esprit inventif et à l'intelligence duquel on pouvait s'en rapporter. === Exemples de longévité === :(18) Solon, Thalès et Pittacus, que l'on compte au nombre des Sept sages, vécurent chacun cent années. <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Clément_d%27Alexandrie|'''Clément''']] d'[[w:Histoire_d%27Alexandrie#Annexion|''Alexandrie'']] ''(vers [[w:150|150]]'' <sup>[[w:IIe_siècle|⏳]]</sup>'', à [[w:Athènes#Antiquité|Athènes]] — vers [[w:215|215]]'' <sup>[[w:IIIe_siècle|⏳]]</sup>'', à [[w:Kayseri|Kayseri]])'' [[s:Auteur:Clément_d’Alexandrie|<sup>📚</sup>]] == === Stromates, I, 65 === <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Claude_Élien|'''Claude Élien''']] ''(vers [[w:175|175]]''<sup>[[w:IIe_siècle|⏳]]</sup>'', à [[w:Préneste|Préneste]] — vers [[w:235|235]]''<sup>[[w:IIIe_siècle|⏳]]</sup>'', en [[w:Rome_antique|Rome]])'' [[s:Auteur:Élien_le_sophiste|<sup>📚</sup>]] == === Histoires diverses === :On a vu des philosophes à la tête des affaires publiques : d'autres, se bornant à cultiver leur raison, ont passé leur vie dans le repos. Entre les premiers sont Zaleucus et Charondas qui réformèrent, l'un, le gouvernement des Locriens, l'autre, d'abord celui des Catanéens, puis, après qu'il eut été exilé de Catane, celui des Rhéginiens. Archytas servit utilement les Tarentins. Les Athéniens durent tout à Solon. Bias et Thalès rendirent les mêmes services à l'Ionie, Chilon à Lacédémone, Pittacus à Mitylène, Cléobule à Rhodes. <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Sextus_Empiricus|'''Sextus Empiricus''']] ''([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l'on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:IIe_siècle|II<sup>ème</sup> siècle {{Info|EC|de l’Ère Commune}}]])'' [[s:Auteur:Sextus_Empiricus|<sup>📚</sup>]] == Hypot III, 30, et Liv I contre les phys., sect. 319 https://gallica.bnf.fr/ark:/12148/bpt6k9796311p/f305.item.r=thales <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Lactance|'''Lactance''']] ''(vers [[w:250|250]]''<sup>[[w:IIIe_siècle|⏳]]</sup>'', à [[w:Henchir_Kssiba#Histoire|Civitas Popthensis]] — vers [[w:325|325]]''<sup>[[w:IVe_siècle|⏳]]</sup>'', en [[w:Gaule#La_Gaule_dans_l'Antiquité_tardive|Gaule]])'' == Épit. 4 (https://gallica.bnf.fr/ark:/12148/bpt6k282068z/f300.image.r=thales) Inst. 111, 16 (https://gallica.bnf.fr/ark:/12148/bpt6k282068z/f621.item.r=thales) <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Jamblique|'''Jamblique''']] ''(vers [[w:250|250]]''<sup>[[w:IIIe_siècle|⏳]]</sup>'', à [[w:Qinnasrīn|Chalcis ad Belum]] — vers [[w:333|333]]''<sup>[[w:IVe_siècle|⏳]]</sup>'')'' == === Vie de Pythagore === ==== chap. II ==== (https://web.archive.org/web/20110721184914/http://www.aurumsolis.info/index.php?option=com_phocadownload&view=category&download=1%3Aiamblichus-the-pythagorean-life&id=19%3Awritings-from-the-founders&Itemid=143&lang=en) <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Eusèbe_de_Césarée|'''Eusèbe''']] de [[w:Césarée#Césarée_au_début_du_christianisme|''Césarée'']] ''(vers [[w:265|265]]'' <sup>[[w:IIIe_siècle|⏳]]</sup>'', à Césarée — [[w:340|340]]'' <sup>[[w:IVe_siècle|⏳]]</sup>'', à Césarée)'' [[s:Auteur:Eusèbe_de_Césarée|<sup>📚</sup>]] == Preparation Évangélique, XI, 2 Prepar. évang. I, 8, page 22-25 https://gallica.bnf.fr/ark:/12148/bpt6k9796311p/f310.image.r=thales <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Diogène_Laërce|'''Diogène Laërce''']] ''([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l'on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:IIIe_siècle|III<sup>ème</sup> siècle {{Info|EC|de l’Ère Commune}}]])'' [[s:Auteur:Diogène_Laërce|<sup>📚</sup>]] == ''Ce texte est un extrait de la traduction de Robert Genaille (1933)'' Thalès[1], au dire d’Hérodote, de Douris et de Démocrite, était fils d’Examios et de Cléobuline, et membre de la famille des Thélides, Phéniciens descendant en droite ligne d’Agénor[2] et de Cadmus[3], s’il faut en croire Platon. Le premier, il porta le nom de sage, au temps où Damasias était archonte à Athènes[4]. C’est sous le même archontat que fut créée l’expression : « les sept sages » (cf. Démocrite de Phalère, Registre des Archontes). Thalès fut inscrit comme citoyen de Milet quand il vint dans cette ville avec Nélée chassé de Phénicie. Une autre tradition très courante veut qu’il soit natif de Milet et qu’il descende d’une bonne famille. Il s’occupa de politique avant d’étudier la nature. On croit qu’il ne laissa aucun écrit, car l’Astrologie nautique qu’on lui attribue est de Phocos de Samos. Callimaque[5] croit qu’il découvrit la Petite Ourse et le raconte en vers iambiques : Il mesura, dit-on, les étoiles du Chariot Sur quoi les Phéniciens règlent leur navigation. D’autres auteurs disent qu’il écrivit seulement deux ouvrages, un sur le solstice et un sur l’équinoxe, car il pensait le reste inaccessible. Il passe pour avoir le premier étudié l’astrologie et prédit les éclipses de soleil et les solstices (cf. Eudème, Histoire de l’astrologie)[6]. Xénophane et Hérodote le louent à ce propos, et leur témoignage est confirmé par celui d’Héraclite et de Démocrite. On dit encore (cf. le poète Choirilos) qu’il fut le premier à affirmer l’immortalité des âmes. Le premier il dessina la course du soleil d’un solstice à l’autre, et démontra que comparée au soleil, la lune en est la cent vingtième partie. C’est encore lui qui fixa à trente jours la durée du mois, et qui écrivit le premier traité sur la Nature. Aristote et Hippias disent aussi qu’il accordait une âme aux choses qu’on croit inanimées ; il en donnait pour preuve l’ambre et la pierre de Magnésie. Selon Pamphile[7], il apprit des Égyptiens la géométrie, inscrivit dans un cercle le triangle rectangle, et pour cette découverte immola un bœuf. D’autres, comme Apollodore le calculateur, attribuent cette invention à Pythagore. Thalès a encore développé et précisé l’invention du Phrygien Euphorbe citée par Callimaque dans ses Iambes et concernant le triangle scalène, et tout ce qui touche aux considérations sur les lignes. Il semble encore avoir été en politique un homme de bon conseil. Ainsi, quand Crésus[8] envoya une ambassade aux Milésiens pour demander leur alliance, il s’y opposa, et son intervention sauva la ville, puisque Cyrus l’emporta. Héraclite cite une opinion de Clytos selon laquelle Thalès aurait eu une vie retirée et solitaire. Les uns disent qu’il se maria et eut un fils nommé Kibissos. D’autres prétendent qu’il resta célibataire et adopta le fils de sa sœur, qu’on lui demanda un jour pourquoi il ne cherchait pas à avoir des enfants, et qu’il répondit : « Par amour pour les enfants. » Sa mère l’exhortait à se marier, il lui répondit : « Non, par Zeus, il n’est pas encore temps. » Elle l’y invita une nouvelle fois quand il eut pris de l’âge, mais il lui dit : « Il n’est plus temps. » D’après Hiéronyme de Rhodes (Notes, livre II), il voulut montrer combien il était facile de s’enrichir ayant prévu pour l’année une abondante récolte d’huile, il prit à loyer une oliveraie et gagna beaucoup d’argent[9]. Il soupçonna que l’eau était le principe des choses, que le monde était animé et rempli de démons. On dit qu’il découvrit les saisons de l’année, et qu’il la divisa en trois cent soixante-cinq jours. Il ne suivit les leçons d’aucun maître, sauf en Égypte, où il fréquenta les prêtres du pays. A ce propos, Hiéronyme dit qu’il mesura les Pyramides en calculant le rapport entre leur ombre et celle de notre corps. Si l’on en croit Minuès, il vivait au temps de Thrasybule, qui fut tyran de Milet[10]. L’histoire du trépied trouvé par des pêcheurs et dédié aux sages par le peuple de Milet est bien connue. Des jeunes gens d’Ionie achetèrent à des pêcheurs milésiens leur coup de filet. Ils tirèrent de l’eau un trépied. On se querella et les Milésiens envoyèrent une ambassade à Delphes. Voici quel fut l’oracle de la divinité : Race de Milet, tu interroges Phébus au sujet d’un trépied ? Au plus sage de tous, je donne ce trépied[11]. Ils le donnent alors à Thalès, qui le donne à un autre, et cet autre à un autre, et ainsi de suite jusqu’à Solon, qui, déclarant que seul le dieu était le plus sage de tous, rendit le trépied à Delphes. Callimaque, dans ses Iambes, rapporte cette histoire autrement ; il la tient de Léandre de Milet. Il dit qu’un certain Bathyclès d’Arcadie laissa en mourant une coupe pour qu’elle fût donnée à l’homme le plus sage. Elle fut donc donnée à Thalès, et après être passée de main en main et avoir fait le tour des sages, elle revint à Thalès. Celui-ci en fit don alors à Apollon de Didyme, en ces termes selon le poème de Callimaque : Thalès me donne au protecteur du peuple du Nil, Thalès qui a reçu deux fois ce présent, ce qui, en prose, se dit ainsi : « Thalès de Milet, fils d’Examios, à Apollon delphien, ce présent qu’il a reçu deux fois des Grecs. » Celui qui portait la coupe de sage en sage, le fils de Bathyclès, s’appelait Thyrion (cf. Éleusis, Livre sur Achille, et Alexon de Mynde, Fables, livre IX). Eudoxe de Cnide et Évanthès de Milet disent de leur côté qu’un ami de Crésus reçut du roi un vase d’or, pour le donner au plus sage des Grecs, qu’il le donna à Thalès et que ce vase parvint jusqu’à Chilon. Celui-ci consulta la Pythie, pour savoir qui était plus sage que lui. Elle répondit que c’était Myson (je parlerai de lui : Eudoxe le met parmi les sages à la place de Cléobule et Platon à la place de Périandre.) Voici la réponse que lui fit la Pythie : Il y a un habitant de l’Oeta, Myson, né à Chénée, Qui plus que toi est riche de sages pensées. L’homme qui consulta l’oracle pour Chilon s’appelait Anacharsis. Dédale le Platonicien et Cléarque disent que la coupe fut envoyée par Crésus à Pittacos, et que c’est ainsi qu’elle passa de main en main. D’après Andron, d’autre part (Livre du trépied), les Argiens décidèrent que le trépied serait attribué comme prix de vertu au plus sage des Grecs. Aristodème de Sparte fut choisi et c’est lui qui donna le trépied à Chilon. Alcée est aussi partisan d’Aristodème dont il parle dans les vers suivants : :Comme jadis Aristodème, dit-on, :Prononça à Sparte cette parole bien juste : :C’est de l’argent, un homme, oui de l’argent, :Car l’homme vertueux n’est jamais pauvre. D’autres disent encore que Périandre envoya à Thrasybule, tyran de Milet, un navire chargé, que ce navire fit naufrage dans la mer de Cos, et que quelque temps après le trépied fut trouvé par des pêcheurs. Phanodicos dit que le trépied fut trouvé dans la mer Attique, porté à la ville, et que l’assemblée du peuple s’étant réunie le fit porter à Bias. Pourquoi cela, je le dirai quand je parlerai de Bias. Selon d’autres auteurs, le trépied avait été fabriqué par Héphaïstos et donné en présent de la part de ce dieu à Pélops lors de son mariage. Il vint ensuite à Ménélas, fut enlevé avec Hélène par Alexandre, jeté dans la mer de Cos à l’instigation de la Spartiate qui prévoyait qu’il serait un sujet de querelle. Plus tard, en ce lieu, des Lébédiens achetèrent le produit d’un coup de filet et c’est le trépied qui fut tiré de l’eau. Il y eut querelle avec les pêcheurs, on vint jusqu’à Cos, et comme on ne s’accordait pas, on s’adressa à Milet, qui était la capitale. Les Milésiens envoyèrent des députés qui ne furent pas écoutés, aussi firent-ils la guerre aux gens de Cos. Comme de chaque côté il mourait beaucoup de gens, l’oracle déclara qu’il fallait donner le trépied au plus sage. Les deux camps s’entendirent alors pour l’attribuer à Thalès, qui par la suite le consacra à Apollon de Didyme. Pour en revenir à la réponse de l’oracle aux gens de Cos, elle disait ceci : La querelle entre Ioniens et Méropes ne cessera pas Avant que le trépied d’or qu’Héphaïstos jeta dans la mer N’ait quitté votre ville pour la maison de l’homme Qui connaît le présent, l’avenir et le passé. La réponse aux Milésiens fut la suivante : Race de Milet, tu interroges Phoebus au sujet d’un trépied... comme il a été dit plus haut. En voilà assez sur ce sujet[12]. Hermippe, dans ses Vies, rapporte à Thalès ce qui est dit par d’autres de Socrate : il aimait à dire qu’il remerciait la fortune de trois choses : d’être un humain et non une bête, d’être un homme et non une femme, enfin d’être un Grec, et non un barbare. On raconte encore qu’étant sorti de chez lui pour contempler les astres, il tomba dans un puits[13]. Une vieille femme survenant se moqua de lui en ces mots : « Comment, Thalès, toi qui n’es pas capable de voir ce qui est à tes pieds, t’imagines-tu pouvoir connaître ce qui est dans le ciel ? » Timon[14] a bien connu aussi la science de Thalès en astronomie, et dans ses Silles, il le loue en ces termes : Comme Thalès, un des sept sages, qui fut savant astronome. L’Argien Lobon dit que ses écrits font un total de quelque deux cents vers, et que sous sa statue on écrivit : Thalès de Milet repose ici dans le sol qui l’a nourri, Il fut un sage, et le premier des astrologues. Voici un de ses poèmes : Le trop parler n’est pas marque d’esprit. Trouvez une seule chose sage, Choisissez une seule chose belle, Et vous clouerez le bec à bien des bavards. On lui attribue encore les sentences suivantes : de tous les êtres, le plus ancien, c’est Dieu, car il n’a pas été engendré ; le plus beau, c’est le monde, car il est l’ouvrage du dieu ; le plus grand, c’est l’espace, car il contient tout ; le plus rapide, c’est l’esprit, car il court partout ; le plus fort, c’est la nécessité, car elle vient à bout de tout ; le plus sage, c’est le temps, parce qu’il découvre tout. La mort, dit-il, ne diffère en rien de la vie. On lui répond : « Pourquoi, alors, ne te donnes-tu pas la mort ? » ; « Parce que vie ou mort, c’est tout un », réplique-t-il. Quelqu’un lui demande ce qui du jour ou de la nuit fut créé d’abord ; il répond : « La nuit est en avance d’un jour. » On lui demande si les mauvaises actions d’un homme échappent au regard des dieux. Il répond : « Ils voient même les mauvaises pensées. » Un homme adultère lui demandait s’il pouvait jurer qu’il n’avait pas commis d’adultère. Il répondit : « Le parjure n’est pas pire que l’adultère. » On lui demandait ce qui était difficile : « Se connaître » dit-il ; ce qui était facile : donner un conseil à autrui ; ce qui était le plus doux : jouir ; ce que c’était que la divinité : un être sans commencement ni fin ; encore une chose difficile : voir un tyran âgé ; comment supporter aisément l’infortune : en voyant ses ennemis plus malheureux encore ; comment vivre vertueusement : en ne faisant pas ce que nous reprochons à autrui ; qui est heureux : l’homme bien portant, riche, courageux et instruit. Il disait encore que l’on doit penser à ses amis aussi bien en leur absence qu’en leur présence, que la beauté ne vient pas d’un beau visage, mais de belles actions. « Ne t’enrichis pas injustement, conseillait-il, et veille à ne pas être cité en justice pour de mauvaises paroles contre tes proches et tes amis. Comme tu traites tes parents, tes enfants te traiteront. » Du Nil[15] il disait qu’il débordait quand ses eaux étaient repoussées par les vents étésiens qui soufflent contre son cours. Apollodore dans ses Chroniques dit que Thalès naquit la première année de la trente-cinquième olympiade[16]. Il mourut dans sa soixante-dix-huitième année ou, comme le dit Sosicrate, dans sa quatre-vingt-dixième année, car ce fut dans la cinquante-huitième olympiade. Il vécut du temps de Crésus, auquel il promit de faire traverser l’Hallys[17] sans pont, en détournant le cours du fleuve. Il y eut cinq autres personnages du nom de Thalès (cf. Démétrios de Magnésie, Homonymes) : un rhéteur de Callatie, au style prétentieux, un peintre de Sicyone, de noble origine, un troisième, très ancien, du temps d’Hésiode, d’Homère et de Lycurgue, un quatrième, mentionné par Douris dans son traité de la peinture, un cinquième, plus jeune et peu connu, cité par Denys dans ses Critiques. Pour en revenir à notre sage, il mourut en regardant les jeux gymniques, pour avoir eu trop chaud et trop soif et par suite de sa fatigue et de son grand âge. Voici son épitaphe : :Ce tombeau, certes, est bien petit, :Mais la renommée de l’homme est allée au ciel. :C’est celui de Thalès le très sage. J’ai écrit sur lui les vers suivants dans le premier livre de mes épigrammes ou « vers de mètres divers[18] : :Tandis qu’il regardait les jeux, ô Zeus Hélios, :Tu as ravi du stade le sage Thalès. :Je te loue de l’avoir rapproché du ciel. Il était si vieux :Que de la terre il ne pouvait plus voir les astres. Thalès est l’auteur du fameux « connais-toi toi-même » qu’Antisthène (Livre des Filiations) attribue à Phémonoé, en déclarant que Chilon se l’appropria mensongèrement. Sur les sept sages, qu’il est juste de citer maintenant l’un après l’autre, voici la tradition. Damon de Cyrène, qui blâme tous les philosophes dans ses écrits, s’attaque surtout aux sept sages. Anaximène dit que tous étaient poètes. Dicéarque dit qu’ils n’étaient ni sages ni philosophes, mais hommes d’esprit et législateurs. Archétimos de Syracuse a décrit leurs assemblées chez Cypsélos[19] et dit qu’il y assista personnellement. Euphoros dit que tous, sauf Thalès, fréquentèrent Crésus. D’autres disent qu’ils se réunirent à Panionium, à Corinthe et à Delphes. On rapporte même leurs paroles, et qui a prononcé telle ou telle. Exemple : Le Spartiate Chilon fut sage, Lui qui dit : Rien de trop, Tout est bien qui vient en son temps ! On n’est pas d’accord sur leur nombre. Léandre, au lieu de Cléobule et de Myson, met Léophante, fils de Gorsias, ou Lébédios d’Éphèse et Épiménide de Crète. Platon, dans le Protagoras[20], met Myson à la place de Périandre. Éphoros met Anacharsis à la place de Myson et d’autres ajoutent Pythagore. Selon Dicéarque, il y en a quatre sur qui tout le monde est d’accord : Thalès, Bias, Pittacos et Solon. Le même auteur en nomme six autres, parmi lesquels il en choisit trois : Aristodème, Pamphile, le Lacédémonien Chilon, Cléobule, Anacharsis et Périandre. D’autres ajoutent Acousilaos, Caba ou Scala, un Argien. Hermippe, dans son livre sur les sages, dit qu’ils furent dix-sept et que chacun en choisit sept selon ses préférences. Ce sont Solon, Thalès, Pittacos, Bias, Chilon, Cléobule, Périandre, Anacharsis, Acousilaos, Épiménide, Léophante, Phérécyde, Aristodème, Pythagore, Lasos, fils de Charmantidas ou de Sisambrinos ou, selon Aristoxène, de Chabrinus, Hermonée, Anaxagore. Hippobotos (Catalogue des Philosophes) les inscrit ainsi : Orphée, Linos, Solon, Périandre, Anacharsis, Cléobule, Myson, Thalès, Bias, Pittacos, Épicharme et Pythagore. Voici des lettres attribuées à Thalès[21] : ==== Thalès à Phérécyde ==== « J’apprends que vous vous disposez à présenter aux Grecs le premier traité ionien des choses divines. Vous agiriez peut-être plus sagement en lisant votre ouvrage à vos amis, qu’en communiquant à n’importe quelles gens des écrits qui ne peuvent guère leur être utiles. « Si cela vous plaît, j’aimerais profiter de vos recherches et, si vous m’y invitez, je viendrai vous trouver au plus tôt. Car Solon d’Athènes et moi, qui avons déjà traversé deux fois la mer pour aller visiter la Crète, et pour aller en Égypte nous entretenir avec les prêtres et les astronomes du lieu, nous sommes assez sages pour ne pas hésiter à la traverser de nouveau pour aller vous voir. « Je parle de Solon, parce qu’il viendra avec moi si vous le permettez. Vous êtes un sédentaire, vous allez rarement en Ionie, vous n’aimez guère aller voir les étrangers, et vous ne songez, j’imagine, qu’à écrire. « Mais nous qui n’écrivons pas, nous parcourons volontiers la Grèce et l’Italie. » ==== Thalès à Solon ==== « Si vous quittez Athènes, vous aurez, je crois, tout avantage à venir vous établir à Milet, parmi les colons athéniens. Il n’y a là pour vous aucun danger. Si vous hésitez, sous prétexte que nous, Milésiens, sommes gouvernés par un tyran (je sais que vous haïssez tout pouvoir absolu), songez du moins que vous aurez plaisir à vivre avec nous qui sommes vos amis. Je sais que Bias vous a écrit et vous invite à aller à Priène. Si vous trouvez préférable d’habiter la ville de Priène, j’irai vivre là-bas avec vous. » <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Ausone|'''Ausone''']] ''([[w:309|309]]/[[w:310|310]], à [[w:Bazas|Bazas]] ou à [[w:Bordeaux#Burdigala,_cité_romaine_(Ier_siècle_-_Ve_siècle)|Bordeaux]] — [[w:394|394]]/[[w:395|395]], entre [[w:Langon_(Gironde)|Langon]] et [[w:La_Réole|La Réole]])'' <sup>[[w:IVe_siècle|⏳]]</sup> [[s:Auteur:Ausone|<sup>📚</sup>]] == === Le Jeu des Sept Sages === :Thalès a trouvé [texte grec] pour nous défendre de nous porter cautions, parce qu'il y a du danger à répondre ainsi pour d'autres[iv]. Nous donnons-là un avis qui ne plaira pas beaucoup aux emprunteurs. :THALÈS : Je suis Thalès de Milet ; j'ai dit, comme le poète Pindare, que l'eau est, le principe de toute chose. C'est à moi que des pêcheurs donnèrent autrefois [un trépied d'or] qu'ils avaient tiré de la mer : ils m'avaient choisi pour obéir au dieu de Délos, qui envoyait ce présent à un sage. Je refusai de le recevoir, je le leur rendis pour le porter à d'autres que je croyais plus dignes. Envoyé à tous les sept Sages, et renvoyé par eux, il nie fut rapporté. Je le reçus alors pour le consacrer à Apollon : car si Phébus a voulu qu'on choisit un sage, ce n'était pas d'un homme, mais d'un dieu qu'il fallait l'entendre. Je suis donc ce Thalès : mais un motif m'amène sur la scène. Comme les deux sages qui m'ont précédé, je viens défendre la sentence dont je suis l'auteur. Elle déplaira, mais non certes aux esprits prudents que l'expérience a instruits et rendus plus avisés. Nous avons dit : [texte grec], ou, en latin : Cautionne, mais tu t'en trouveras mal. Je pourrais parcourir mille exemples pour vous montrer des cautions et des répondants bien et dûment convaincus de repentir. Mais je ne veux nommer personne. Que chacun de, vous ré-fléchisse, et compte en lui-même combien de gens ont perdu ou souffert de s'être ainsi portés cautions pour d'autres. Toutefois, si un pareil service a du charme pour vous, n'y renoncez ni les uns ni les autres. :Alors que les uns applaudissent, et que les autres, si je les blesse, me sifflent. :THALÈS DE MILET. :AVANT d'oser une mauvaise action, à défaut de Témoin redoute ta conscience. La vie s'éteint, mais la gloire de la mort ne meurt point. Ce que tu veux faire, abstiens-toi de le dire. C'est un supplice de craindre ce qu'on ne peut empêcher. Si tu blâmes avec raison, ton hostilité même est profitable ; si tu loues mal à propos, ton amitié même est nuisible. Rien de trop. - Arrêtons-nous, et qu'ici même il n'y ait rien de trop. <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == [[w:Proclus|'''Proclus''']] ''(le 7 ou 8 février [[w:412|412]], à [[w:Constantinople|Constantinople]] — le 17 avril [[w:485|485]], à [[w:Histoire_d%27Athènes#Antiquité_tardive|Athènes]])''<sup>[[w:Ve_siècle|⏳]]</sup> [[s:Auteur:Proclus|<sup>📚</sup>]] == === Commentaire sur le premier livre d'Euclide, 65, 3 === ὥσπερ οὖν παρὰ τοῖς Φοίνιξιν διὰ τὰς ἐμπορείας καὶ τὰ συναλλάγματα τὴν ἀρχὴν ἔλαβεν ἡ τῶν ἀριθμῶν ἀκριβὴς γνῶσις, οὕτω δὴ καὶ παρ' Αἰγυπτίοις ἡ γεωμετρία διὰ τὴν εἰρημένην αἰτίαν εὕρηται. Θαλῆς δὲ πρῶτον εἰς Αἴγυπτον ἐλθὼν μετήγαγεν εἰς τὴν Ἑλλάδα τὴν θεωρίαν ταύτην καὶ πολλὰ μὲν αὐτὸς εὗρεν, πολλῶν δὲ τὰς ἀρχὰς τοῖς μετ' αὐτὸν ὑφηγήσατο τοῖς μὲν καθολικώτερον ἐπιβάλλων, τοῖς δὲ αἰσθητικώτερον. <div style="text-align: center; margin: 0 auto; color: #3366BB">⁂</div> == « [[w:Souda|'''Suidas''']] » ''([[w:Floruit|{{Info|''fl.''|Floruit, locution latine que l'on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] fin du [[w:IXe_siècle|IX<sup>ème</sup> siècle {{Info|EC|de l’Ère Commune}}]])'' [[s:Auteur:Suidas|<sup>📚</sup>]] == === La Souda === Θαλῆς, Ἐξαμύου καὶ Κλεοβουλίνης, Μιλήσιος, ὡς δὲ Ἡρόδοτος Φοῖνιξ: γεγονὼς πρὸ Κροίσου, ἐπὶ τῆς λε# ὀλυμπιάδος, κατὰ δὲ Φλέγοντα γνωριζόμενος ἤδη ἐπὶ τῆς ζ#. ἔγραψε περὶ μετεώρων ἐν ἔπεσι, Περὶ ἰσημερίας, καὶ ἄλλα πολλά. ἐτελεύτησε δὲ γηραιός, θεώμενος γυμνικὸν ἀγῶνα, πιληθεὶς δὲ ὑπὸ τοῦ ὄχλου καὶ ἐκλυθεὶς ὑπὸ τοῦ καύματος. πρῶτος δὲ Θαλῆς τὸ τοῦ σοφοῦ ἔσχεν ὄνομα καὶ πρῶτος τὴν ψυχὴν εἶπεν ἀθάνατον ἐκλείψεις τε καὶ ἰσημερίας κατείληφεν. ἀποφθέγματα δὲ αὐτοῦ πλεῖστα: καὶ τὸ θρυλλούμενον: γνῶθι σαυτόν. τὸ γάρ, ἐγγύα, πάρα δ' ἄτα, Χίλωνός ἐστι μᾶλλον, ἰδιοποιησαμένου αὐτό: καὶ τό, μηδὲν ἄγαν. 4a6tuihj37w7e2kq2ehmlzpktytuaaa Le mouvement Wikimédia/Cosmographie du mouvement Wikimédia 0 79278 767370 766988 2026-06-02T19:35:16Z Lionel Scheepmans 20012 767370 wikitext text/x-wiki <noinclude>{{Le mouvement Wikimédia}}</noinclude> [[Fichier:Strategy Graphic.pdf|vignette|400x400px|<small>Figure 25. Graphique en anglais illustrant la complexité de l’écosystème Wikimédia.</small>]] Voici venu le moment de présenter la « cosmographie » de Wikimédia, ou pour le dire autrement, de présenter l’organisation d'un mouvement, que certains et certaines ont comparé à une galaxie, lors du dixième anniversaire du projet Wikipédia<ref>{{Article|langue=|prénom1=Nathalie|nom1=Savary|titre=La galaxie Wikimédia|périodique=Le Débat|volume=170|numéro=3|date=2012|issn=0246-2346|pages=138}}.</ref>. Pour ce faire, il faut d'abord circuler dans l’ombre de Wikipédia, pour y découvrir les nombreux projets et sites web qui y sont cachés. Par la suite, il faut encore parcourir l'organisation hors ligne du mouvement, en s'intéressant aux nombreux groupes d'utilisateurs et associations, regroupées autour des projets et de la fondation en charge de leurs hébergements. On y découvre que les activités hors ligne et en ligne au sein du mouvement évoluaient dans deux sphères et environnements différents, dans lesquels s'observent des organisations et des comportements parfois très divergents<ref>{{Lien web|auteur=Lionel Scheepmans|titre=Wikimania et les différences entre les cultures en ligne et hors ligne|url=https://web.archive.org/web/20210526053609/https://diff.wikimedia.org/fr/2015/05/12/wikimania-et-les-differences-entre-les-cultures-en-ligne-et-hors-ligne/|site=Diff|année=05/05/2015|consulté le=}}.</ref>. Certaines [[w:fr:Dissonance cognitive|dissonances cognitives]] peuvent même y apparaitre, mais sans que cela remette en doute la cohérence d'un mouvement, emprunt d'une forte adhésion générale à ce projet commun, que représente le libre partage de la somme des connaissances<ref>{{Lien web|langue=|auteur=Wikimédia|titre=Wikimedia|url=https://web.archive.org/web/20201102041842/https://www.wikimedia.org/|site=|date=|consulté le=}}.</ref>. Le plus fascinant dans cette découverte, c'est que Wikimédia apparait comme une sorte de représentation miniature de cette hypercomplexité<ref>{{Ouvrage|langue=|prénom1=Lars|nom1=Qvortrup|titre=The hypercomplex Society|éditeur=Peter Lang|date=2003|isbn=978-0-8204-5704-8|oclc=59322051}}.</ref> qui caractérise notre société globale et numérique aujourd'hui. De manière concrète, on y retrouve les nouveaux enjeux de la mondialisation structurelle et de la globalisation économique<ref>{{Lien web|auteur=Cynthia Ghorra-Gobin|titre=Notion en débat : mondialisation et globalisation|url=https://web.archive.org/web/20210127234505/http://geoconfluences.ens-lyon.fr/informations-scientifiques/a-la-une/notion-a-la-une/mondialisation-globalisation|site=Géoconfluences|lieu=|date=20/12/2017|consulté le=}}.</ref>, apparus suite au développement d’Internet. Cette deuxième partie d’ouvrage, devrait donc aider les membres de ce mouvement international complexe à mieux s’y retrouver, pendant que les autres, découvriront à quoi peut ressembler, aujourd’hui, une organisation cosmopolite, internationale, interculturelle, et fortement liée à l’usage d’Internet. {| class="wikitable"style="margin: auto;" "text-align:center;" |+ ![[Fichier:QR code graphique écosystème Wikimédia.png|sans_cadre|100x100px|centré|lien=https://upload.wikimedia.org/wikipedia/commons/5/55/Strategy_Graphic.pdf]] ![[Fichier:QR code graphique galaxy Wikimédia.svg|sans_cadre|100x100px|centré|lien=https://upload.wikimedia.org/wikipedia/commons/c/c1/Galaxie_wikimedia.jpg]] |- |QR 13. Écosystème Wikimédia |QR 14. Galaxie Wikimédia |} {{Autocat}} jz0hf9oixr8zxi3kc5mhgl5vtjy1rmh 767372 767370 2026-06-02T19:42:18Z Lionel Scheepmans 20012 767372 wikitext text/x-wiki <noinclude>{{Le mouvement Wikimédia}}</noinclude> [[Fichier:Strategy Graphic.pdf|vignette|400x400px|<small>Figure 25. Graphique en anglais illustrant la complexité de l’écosystème Wikimédia.</small>]] Voici venu le moment de présenter la « cosmographie » de Wikimédia, ou pour le dire autrement, de présenter l’organisation d'un mouvement, que certains et certaines ont comparé à une galaxie, lors du dixième anniversaire du projet Wikipédia<ref>{{Article|langue=|prénom1=Nathalie|nom1=Savary|titre=La galaxie Wikimédia|périodique=Le Débat|volume=170|numéro=3|date=2012|issn=0246-2346|pages=138}}.</ref>. Pour ce faire, il faut d'abord circuler dans l’ombre de Wikipédia, pour y découvrir les nombreux projets et sites web qui y sont cachés. Par la suite, il faut encore parcourir l'organisation hors ligne du mouvement, et s'intéresser aux nombreux groupes d'utilisateurs et associations, regroupés autour des projets en ligne et d'une fondation en charge de leurs hébergements. On y découvre que les activités hors ligne et en ligne au sein du mouvement évoluent dans deux sphères et environnements différents, où s'observent parfois des comportements parfois très divergents<ref>{{Lien web|auteur=Lionel Scheepmans|titre=Wikimania et les différences entre les cultures en ligne et hors ligne|url=https://web.archive.org/web/20210526053609/https://diff.wikimedia.org/fr/2015/05/12/wikimania-et-les-differences-entre-les-cultures-en-ligne-et-hors-ligne/|site=Diff|année=05/05/2015|consulté le=}}.</ref>. Certaines [[w:fr:Dissonance cognitive|dissonances cognitives]] peuvent même y apparaitre, mais sans que cela remette en question la cohérence du mouvement, qui repose sur une forte adhésion globale à ce projet commun, que représente le libre partage de la somme des connaissances<ref>{{Lien web|langue=|auteur=Wikimédia|titre=Wikimedia|url=https://web.archive.org/web/20201102041842/https://www.wikimedia.org/|site=|date=|consulté le=}}.</ref>. Wikimédia apparait ainsi comme une sorte de représentation miniature de cette hypercomplexité<ref>{{Ouvrage|langue=|prénom1=Lars|nom1=Qvortrup|titre=The hypercomplex Society|éditeur=Peter Lang|date=2003|isbn=978-0-8204-5704-8|oclc=59322051}}.</ref> qui caractérise notre société globale et numérique contemporaine. De manière concrète, on y retrouve les nouveaux enjeux d'une mondialisation structurelle et de la globalisation économique<ref>{{Lien web|auteur=Cynthia Ghorra-Gobin|titre=Notion en débat : mondialisation et globalisation|url=https://web.archive.org/web/20210127234505/http://geoconfluences.ens-lyon.fr/informations-scientifiques/a-la-une/notion-a-la-une/mondialisation-globalisation|site=Géoconfluences|lieu=|date=20/12/2017|consulté le=}}.</ref>, liées au développement d’Internet. Une deuxième partie d’ouvrage, qui devrait donc aider les membres du mouvement à mieux s’y retrouver, pendant que les autres, découvriront à quoi peut ressembler, aujourd’hui, une organisation cosmopolite, internationale, interculturelle, et fortement liée à l’usage d’Internet. {| class="wikitable"style="margin: auto;" "text-align:center;" |+ ![[Fichier:QR code graphique écosystème Wikimédia.png|sans_cadre|100x100px|centré|lien=https://upload.wikimedia.org/wikipedia/commons/5/55/Strategy_Graphic.pdf]] ![[Fichier:QR code graphique galaxy Wikimédia.svg|sans_cadre|100x100px|centré|lien=https://upload.wikimedia.org/wikipedia/commons/c/c1/Galaxie_wikimedia.jpg]] |- |QR 13. Écosystème Wikimédia |QR 14. Galaxie Wikimédia |} {{Autocat}} 60k4u4bjcjjfwzbbo6uxlth8vurxj9s 767373 767372 2026-06-02T19:47:30Z Lionel Scheepmans 20012 767373 wikitext text/x-wiki <noinclude>{{Le mouvement Wikimédia}}</noinclude> [[Fichier:Strategy Graphic.pdf|vignette|400x400px|<small>Figure 25. Graphique en anglais illustrant la complexité de l’écosystème Wikimédia.</small>]] Voici venu le moment de présenter la « cosmographie » de Wikimédia, ou pour le dire autrement, de présenter l’organisation d’un mouvement, que certains et certaines ont comparé à une galaxie, lors du dixième anniversaire du projet Wikipédia<ref>{{Article|langue=|prénom1=Nathalie|nom1=Savary|titre=La galaxie Wikimédia|périodique=Le Débat|volume=170|numéro=3|date=2012|issn=0246-2346|pages=138}}.</ref>. Pour ce faire, il faut d’abord circuler dans l’ombre de Wikipédia, pour y découvrir les nombreux projets et sites web qui y sont cachés. Après quoi, il faut encore parcourir l’organisation hors ligne du mouvement, et s’intéresser aux nombreux groupes d’utilisateurs et associations, regroupés autour des projets et de la fondation en charge de leurs hébergements. On y découvre que les activités hors ligne et en ligne au sein du mouvement évoluent dans deux sphères et environnements différents, où s’observent parfois des comportements divergents<ref>{{Lien web|auteur=Lionel Scheepmans|titre=Wikimania et les différences entre les cultures en ligne et hors ligne|url=https://web.archive.org/web/20210526053609/https://diff.wikimedia.org/fr/2015/05/12/wikimania-et-les-differences-entre-les-cultures-en-ligne-et-hors-ligne/|site=Diff|année=05/05/2015|consulté le=}}.</ref>. Certaines [[w:fr:Dissonance cognitive|dissonances cognitives]] peuvent même y apparaitre, mais sans que cela remette en question la cohérence du mouvement, qui repose sur une forte adhésion globale à ce projet commun, que représente le libre partage des connaissances<ref>{{Lien web|langue=|auteur=Wikimédia|titre=Wikimedia|url=https://web.archive.org/web/20201102041842/https://www.wikimedia.org/|site=|date=|consulté le=}}.</ref>. Wikimédia apparait aussi comme une sorte de représentation miniature de cette hypercomplexité<ref>{{Ouvrage|langue=|prénom1=Lars|nom1=Qvortrup|titre=The hypercomplex Society|éditeur=Peter Lang|date=2003|isbn=978-0-8204-5704-8|oclc=59322051}}.</ref> qui caractérise notre société globale et numérique contemporaine. De manière concrète, on y retrouve les nouveaux enjeux d’une mondialisation structurelle et de la globalisation économique<ref>{{Lien web|auteur=Cynthia Ghorra-Gobin|titre=Notion en débat : mondialisation et globalisation|url=https://web.archive.org/web/20210127234505/http://geoconfluences.ens-lyon.fr/informations-scientifiques/a-la-une/notion-a-la-une/mondialisation-globalisation|site=Géoconfluences|lieu=|date=20/12/2017|consulté le=}}.</ref>, liées au développement d’Internet. Cette deuxième partie d’ouvrage devrait donc aider les membres du mouvement à mieux s’y retrouver, pendant que les autres découvriront à quoi peut ressembler, aujourd’hui, une organisation cosmopolite, internationale, interculturelle, et fortement liée à l’usage d’Internet. {| class="wikitable"style="margin: auto;" "text-align:center;" |+ ![[Fichier:QR code graphique écosystème Wikimédia.png|sans_cadre|100x100px|centré|lien=https://upload.wikimedia.org/wikipedia/commons/5/55/Strategy_Graphic.pdf]] ![[Fichier:QR code graphique galaxy Wikimédia.svg|sans_cadre|100x100px|centré|lien=https://upload.wikimedia.org/wikipedia/commons/c/c1/Galaxie_wikimedia.jpg]] |- |QR 13. Écosystème Wikimédia |QR 14. Galaxie Wikimédia |} {{Autocat}} hz17qfmwzo1j9m0qrb31ug8gdwuy8li Le mouvement Wikimédia 0 80088 767368 766984 2026-06-02T18:16:51Z Lionel Scheepmans 20012 767368 wikitext text/x-wiki <!--<noinclude>{{NavDébut|book={{PAGENAME}}|page=Avant-propos|pageText=Démarrer}}</noinclude>--> <noinclude>{{NavDébut|book=Le mouvement Wikimédia|page=Avant-propos|pageText=Démarrer}}</noinclude> {{Page de garde |image=Photo de couverture du wikilivre Le mouvement Wikimédia.jpg |description=<big>'''{{Centrer|Dernier lieu de partage<br/>d'une connaissance libre et authentique ?}}'''</big><br/> En lien avec la révolution numérique et la [[W:Contre-culture des années 1960|contre-culture des années 1960]], ce livre retrace les origines du [[W:Mouvement Wikimédia|mouvement Wikimédia]], avant d’en présenter l’organisation. Issu de la première partie d’une [[v:fr:recherche:Imagine_un_monde|thèse de doctorat rédigée sur Wikiversité]], il est accessible sur Wikilivres, chapitre par chapitre, ou [[Le mouvement Wikimédia/Version complète| en version complète sur une seule page]] que l’on peut imprimer avec son navigateur web. Cet ouvrage est également disponible au format [https://upload.wikimedia.org/wikipedia/commons/8/88/Le_mouvement_Wikim%C3%A9dia_%E2%80%94_Wikilivres.pdf PDF] et bientôt aux formats [https://upload.wikimedia.org/wikipedia/commons/1/15/Le_mouvement_Wikim%C3%A9dia.oga audio], EPUB et livre de poche. Dans le but d’améliorer son contenu, les questions et les commentaires sont les bienvenus sur [[discussion:Le mouvement Wikimédia|cette page de discussion]]. |avancement=Terminé |cdu= * {{CDU item|3/31/316|316.3/316.35}} {{Moteur}} {{Version complète}} {{Statistiques}} }} == Quatrième de couverture == {{/Quatrième de couverture}} == Sommaire == {{/Sommaire}} [[Catégorie:Livres]] [[Catégorie:Étude du cyber-mouvement du logiciel libre (livre)]] [[Catégorie:Anthropologie]] [[Catégorie:Sciences humaines]] [[Catégorie:Livres terminés]] [[Catégorie:Le mouvement Wikimédia (livre)]] [[Catégorie:Livres en vitrine]] [[Catégorie:Le mouvement Wikimédia]] 93pf75x77yc74ku6tfc8n9mx28jmdjn 767369 767368 2026-06-02T18:43:17Z Lionel Scheepmans 20012 767369 wikitext text/x-wiki <!--<noinclude>{{NavDébut|book={{PAGENAME}}|page=Avant-propos|pageText=Démarrer}}</noinclude>--> <noinclude>{{NavDébut|book=Le mouvement Wikimédia|page=Avant-propos|pageText=Démarrer}}</noinclude> {{Page de garde |image=Photo de couverture du wikilivre Le mouvement Wikimédia.jpg |description=<big>'''{{Centrer|Dernier lieu de partage<br/>d'une connaissance libre et authentique ?}}'''</big><br/> En lien avec la révolution numérique et la [[W:Contre-culture des années 1960|contre-culture des années 1960]], ce livre retrace les origines du [[W:Mouvement Wikimédia|mouvement Wikimédia]], avant d’en présenter l’organisation et les perspectives. Issu de la première partie d’une [[v:fr:recherche:Imagine_un_monde|thèse de doctorat rédigée sur Wikiversité]], il est accessible sur Wikilivres, chapitre par chapitre, ou [[Le mouvement Wikimédia/Version complète| en version complète sur une seule page]] que l’on peut imprimer avec son navigateur web. Cet ouvrage est également disponible au format [https://upload.wikimedia.org/wikipedia/commons/8/88/Le_mouvement_Wikim%C3%A9dia_%E2%80%94_Wikilivres.pdf PDF] et bientôt aux formats [https://upload.wikimedia.org/wikipedia/commons/1/15/Le_mouvement_Wikim%C3%A9dia.oga audio], EPUB et livre de poche. Dans le but d’améliorer son contenu, les questions et les commentaires sont les bienvenus sur [[discussion:Le mouvement Wikimédia|cette page de discussion]]. |avancement=Terminé |cdu= * {{CDU item|3/31/316|316.3/316.35}} {{Moteur}} {{Version complète}} {{Statistiques}} }} == Quatrième de couverture == {{/Quatrième de couverture}} == Sommaire == {{/Sommaire}} [[Catégorie:Livres]] [[Catégorie:Étude du cyber-mouvement du logiciel libre (livre)]] [[Catégorie:Anthropologie]] [[Catégorie:Sciences humaines]] [[Catégorie:Livres terminés]] [[Catégorie:Le mouvement Wikimédia (livre)]] [[Catégorie:Livres en vitrine]] [[Catégorie:Le mouvement Wikimédia]] tovzjwwvyw6fn3zfhm30934me95oodp Analyse/Sommaire 0 83919 767329 2026-06-02T15:02:17Z DavidL 1746 Page créée avec « ;Introduction * [[Analyse/Introduction|Introduction]] ;Notions de base *[[Analyse/Généralités Et Formules|Généralités et formules]] *[[Analyse/Suites|Suites]] *[[Analyse/Fonctions|Fonctions]] *[[Analyse/Limites|Limites]] *[[Analyse/Dérivation|Dérivation]] {{25}} *[[Analyse/Intégration|Intégration]] *[[Analyse/Vectorielle|Vectorielle]] *[[Analyse/Équation différentielle|Équation différentielle]] ;Notions avancées *Analyse/Formules de Taylor|Form... » 767329 wikitext text/x-wiki ;Introduction * [[Analyse/Introduction|Introduction]] ;Notions de base *[[Analyse/Généralités Et Formules|Généralités et formules]] *[[Analyse/Suites|Suites]] *[[Analyse/Fonctions|Fonctions]] *[[Analyse/Limites|Limites]] *[[Analyse/Dérivation|Dérivation]] {{25}} *[[Analyse/Intégration|Intégration]] *[[Analyse/Vectorielle|Vectorielle]] *[[Analyse/Équation différentielle|Équation différentielle]] ;Notions avancées *[[Analyse/Formules de Taylor|Formules de Taylor]] *[[Analyse/Développements limités|Développements limités]] *[[Analyse/Séries|Séries]] {{Autocat}} 35uzy257fo6ktxdaoh69waf0x0wumu1 Modèle:Analyse 10 83920 767331 2026-06-02T15:04:04Z DavidL 1746 [[WL:RD]] : Initialisation de la page 767331 wikitext text/x-wiki {{ModèleLivre|2=Nuvola apps kmplot.svg}}<noinclude>[[Catégorie:Modèles non imprimables spécifiques à un livre|{{SUBPAGENAME}}]]</noinclude> 7m6o8fcag8l4crle6lcxw6kkozzk7am Modèle:Hélices de navires à déplacement 10 83921 767346 2026-06-02T15:17:44Z DavidL 1746 Page créée avec « {{ModèleLivre|2=Screw-Konpira.jpg}}<noinclude>[[Catégorie:Modèles non imprimables spécifiques à un livre|{{SUBPAGENAME}}]]</noinclude> » 767346 wikitext text/x-wiki {{ModèleLivre|2=Screw-Konpira.jpg}}<noinclude>[[Catégorie:Modèles non imprimables spécifiques à un livre|{{SUBPAGENAME}}]]</noinclude> 0e0epxvxjn6c6mem6phck5v1ruqigcv Wikilivres:Vitrine/Hélices de navires à déplacement 4 83922 767358 2026-06-02T15:24:41Z DavidL 1746 [[WL:RD]] : Initialisation de la page 767358 wikitext text/x-wiki <noinclude>[[Catégorie:Livres en vitrine]]</noinclude>{{VitrineLivre{{{1|}}}| image=Screw-Konpira.jpg| lien=Hélices de navires à déplacement| texte=Ce livre propose une application de la théorie thermodynamique à l'hélice marine en utilisant une méthode de calcul basé sur la mécanique newtonienne et le concept thermodynamique de l'hélice.}} 5qa4ia4bsr72jwty4jigvdl8c4wiplw Wikilivres:Vitrine/81 4 83923 767366 2026-06-02T17:51:58Z DavidL 1746 Page créée avec « <noinclude>[[Catégorie:Livres en vitrine]]</noinclude>{{Wikilivres:Vitrine/Hélices de navires à déplacement|{{{1|}}}}} » 767366 wikitext text/x-wiki <noinclude>[[Catégorie:Livres en vitrine]]</noinclude>{{Wikilivres:Vitrine/Hélices de navires à déplacement|{{{1|}}}}} lj40b1j0n0yd5urhvg7dlpbben3diq9 Dictionnaire de philosophie/Version imprimable 0 83924 767378 2026-06-03T05:35:34Z PandaMystique 119061 Page créée avec « {{imprimable}} » 767378 wikitext text/x-wiki {{imprimable}} tqnwxo9j8ualh5dikp6cedpsb1i6zh3 Accordéon chromatique/Sommaire 0 83925 767384 2026-06-03T07:23:11Z DavidL 1746 [[WL:RD]] : Initialisation de la page 767384 wikitext text/x-wiki <noinclude> {{RemarqueIndex| Ce modèle est le sommaire du livre [[Accordéon chromatique]]. Il possède un paramètre permettant d'inclure des commentaires supplémentaires quand sa valeur est 1, non inclus par défaut.}} </noinclude> {{Bloc solidaire| ;<strong>Avant-propos</strong> *[[Accordéon chromatique/Préface|Préface]] *[[Accordéon chromatique/Objectifs|Objectifs de cette méthode]] }} {{Bloc solidaire| ;<strong>Découverte de l'instrument</strong> *[[Accordéon chromatique/Historique|Histoire de l'accordéon]] *[[Accordéon chromatique/Présentation|Présentation générale]] }} {{Bloc solidaire| ;<strong>Apprentissage débutant</strong>{{#if:{{{1|}}}| :Ici, nous apprendrons comment jouer à la main droite, et quelques rudiments du jeu main gauche.}} *[[Accordéon chromatique/Tenue de l'instrument|Tenue de l'instrument]] *[[Accordéon chromatique/Clavier main droite|L'organisation du clavier à la main droite]] *[[Accordéon chromatique/Montons la gamme de Do majeur|Montons la gamme de Do majeur]] *[[Accordéon chromatique/Exercices pour la main droite|Exercices pour la main droite]] *[[Accordéon chromatique/Clavier main gauche|L'organisation du clavier à la main gauche]] *[[Accordéon chromatique/Exercices pour la main gauche|Exercices pour la main gauche]] *[[Accordéon chromatique/Point de méthode : comment travailler un morceau main droite-main gauche ?|Point de méthode : comment travailler un morceau main droite-main gauche ?]] *[[Accordéon chromatique/Exercices de jeu main droite-main gauche|Exercices de jeu main droite-main gauche]] *[[Accordéon chromatique/Suggestions de morceaux (débutant)|Suggestion de morceaux]] ;Pause en cours de route *[[Accordéon chromatique/Récréation 1|Première récréation]] }} {{Bloc solidaire| ;<strong>Apprentissage intermédiaire</strong>{{#if:{{{1|}}}| :Il est désormais temps de s'intéresser au jeu main gauche plus en détail.}} *[[Accordéon chromatique/Une autre approche du clavier main gauche|Une autre approche du clavier main gauche]] *[[Accordéon chromatique/Exercices intermédiaires pour la main gauche|Exercices pour la main gauche]] *[[Accordéon chromatique/Travail de l'indépendance des doigts|Travaillez l'indépendance des doigts]] *[[Accordéon chromatique/Les valses|Les valses]] *[[Accordéon chromatique/Améliorer l'utilisation du soufflet|Améliorer l'utilisation du soufflet]] *[[Accordéon chromatique/Les accords|Travaillons les accords]] *[[Accordéon chromatique/Point de méthode : comment placer le doigté ?|Point de méthode : comment placer le doigté ?]] *[[Accordéon chromatique/Suggestions de morceaux (intermédiaire)|Suggestion de morceaux]] ;Pause en cours de route *[[Accordéon chromatique/Le papillon|Le papillon (bourrée auvergnate)]] *[[Accordéon chromatique/Récréation 2|Deuxième récréation]] }} {{Bloc solidaire| ;<strong>Apprentissage avancé</strong>{{#if:{{{1|}}}| :Allons un peu plus loin avec les gammes et les arpèges.}} *[[Accordéon chromatique/Rappels de solfège|Rappels de solfège]] *[[Accordéon chromatique/Les accords|Jouons avec les accords]] *[[Accordéon chromatique/Exercices d'accords|Exercices d'accords]] *[[Accordéon chromatique/Exercices sur la gamme de ré majeur|Exercices sur la gamme de ré majeur]] *[[Accordéon chromatique/Le principe de la pompe|Le principe de la pompe]] *[[Accordéon chromatique/Exercices de pompe|Exercices de pompe]] *[[Accordéon chromatique/Les liaisons|Travailler les liaisons]] *[[Accordéon chromatique/Suggestions de morceaux (avancé)|Suggestion de morceaux]] ;Pause en cours de route *[[Accordéon chromatique/Récréation 3|Troisième récréation]] }} {{Bloc solidaire| ;<strong>Apprentissage supérieur</strong>{{#if:{{{1|}}}| :Des exercices plus techniques, effets de jeu.}} *[[Accordéon chromatique/Jouer en surface|Jouer en surface]] *[[Accordéon chromatique/Point de méthode : comment travailler un morceau à plusieurs voix ?|Point de méthode : comment travailler un morceau à plusieurs voix ?]] *[[Accordéon chromatique/Suggestions de morceaux (supérieur)|Suggestion de morceaux]] ;Pause en cours de route *[[Accordéon chromatique/Récréation 3|Troisième récréation]] *[[Accordéon chromatique/BWV 1007 (Bach)|BWV 1007, Prélude pour violoncelle (Johan Sebastien Bach)]] }} {{Bloc solidaire| ;<strong>...Et ensuite ?</strong> *[[Accordéon chromatique/Quelques idées pour continuer|Quelques idées pour continuer]] *[[Accordéon chromatique/Suggestion de morceaux difficiles|Suggestion de morceaux]] ;<strong>Annexes</strong> *[[Accordéon chromatique/Entretien|Entretenir son instrument]] *[[Accordéon chromatique/Basses chromatiques|Présentation des basses chromatiques]] *[[Accordéon chromatique/Choisir son accordéon|Choisir son accordéon]] *[[Accordéon chromatique/Concours|Concours]] }} {{Autocat}} 8m939hch7nmr90b6yizg69xbo6nasl6 767390 767384 2026-06-03T07:40:51Z DavidL 1746 767390 wikitext text/x-wiki <noinclude> {{RemarqueIndex| Ce modèle est le sommaire du livre [[Accordéon chromatique]]. Il possède un paramètre nommé {{g|<code>étendu</code>}} permettant d'inclure des commentaires supplémentaires quand sa valeur est 1, non inclus par défaut.}} </noinclude> {{Bloc solidaire| ;<strong>Avant-propos</strong> *[[Accordéon chromatique/Préface|Préface]] *[[Accordéon chromatique/Objectifs|Objectifs de cette méthode]] }} {{Bloc solidaire| ;<strong>Découverte de l'instrument</strong> *[[Accordéon chromatique/Historique|Histoire de l'accordéon]] *[[Accordéon chromatique/Présentation|Présentation générale]] }} {{Bloc solidaire| ;<strong>Apprentissage débutant</strong>{{#if:{{{étendu|}}}| :Ici, nous apprendrons comment jouer à la main droite, et quelques rudiments du jeu main gauche.}} *[[Accordéon chromatique/Tenue de l'instrument|Tenue de l'instrument]] *[[Accordéon chromatique/Clavier main droite|L'organisation du clavier à la main droite]] *[[Accordéon chromatique/Montons la gamme de Do majeur|Montons la gamme de Do majeur]] *[[Accordéon chromatique/Exercices pour la main droite|Exercices pour la main droite]] *[[Accordéon chromatique/Clavier main gauche|L'organisation du clavier à la main gauche]] *[[Accordéon chromatique/Exercices pour la main gauche|Exercices pour la main gauche]] *[[Accordéon chromatique/Point de méthode : comment travailler un morceau main droite-main gauche ?|Point de méthode : comment travailler un morceau main droite-main gauche ?]] *[[Accordéon chromatique/Exercices de jeu main droite-main gauche|Exercices de jeu main droite-main gauche]] *[[Accordéon chromatique/Suggestions de morceaux (débutant)|Suggestion de morceaux]] ;Pause en cours de route *[[Accordéon chromatique/Récréation 1|Première récréation]] }} {{Bloc solidaire| ;<strong>Apprentissage intermédiaire</strong>{{#if:{{{étendu|}}}| :Il est désormais temps de s'intéresser au jeu main gauche plus en détail.}} *[[Accordéon chromatique/Une autre approche du clavier main gauche|Une autre approche du clavier main gauche]] *[[Accordéon chromatique/Exercices intermédiaires pour la main gauche|Exercices pour la main gauche]] *[[Accordéon chromatique/Travail de l'indépendance des doigts|Travaillez l'indépendance des doigts]] *[[Accordéon chromatique/Les valses|Les valses]] *[[Accordéon chromatique/Améliorer l'utilisation du soufflet|Améliorer l'utilisation du soufflet]] *[[Accordéon chromatique/Les accords|Travaillons les accords]] *[[Accordéon chromatique/Point de méthode : comment placer le doigté ?|Point de méthode : comment placer le doigté ?]] *[[Accordéon chromatique/Suggestions de morceaux (intermédiaire)|Suggestion de morceaux]] ;Pause en cours de route *[[Accordéon chromatique/Le papillon|Le papillon (bourrée auvergnate)]] *[[Accordéon chromatique/Récréation 2|Deuxième récréation]] }} {{Bloc solidaire| ;<strong>Apprentissage avancé</strong>{{#if:{{{étendu|}}}| :Allons un peu plus loin avec les gammes et les arpèges.}} *[[Accordéon chromatique/Rappels de solfège|Rappels de solfège]] *[[Accordéon chromatique/Les accords|Jouons avec les accords]] *[[Accordéon chromatique/Exercices d'accords|Exercices d'accords]] *[[Accordéon chromatique/Exercices sur la gamme de ré majeur|Exercices sur la gamme de ré majeur]] *[[Accordéon chromatique/Le principe de la pompe|Le principe de la pompe]] *[[Accordéon chromatique/Exercices de pompe|Exercices de pompe]] *[[Accordéon chromatique/Les liaisons|Travailler les liaisons]] *[[Accordéon chromatique/Suggestions de morceaux (avancé)|Suggestion de morceaux]] ;Pause en cours de route *[[Accordéon chromatique/Récréation 3|Troisième récréation]] }} {{Bloc solidaire| ;<strong>Apprentissage supérieur</strong>{{#if:{{{étendu|}}}| :Des exercices plus techniques, effets de jeu.}} *[[Accordéon chromatique/Jouer en surface|Jouer en surface]] *[[Accordéon chromatique/Point de méthode : comment travailler un morceau à plusieurs voix ?|Point de méthode : comment travailler un morceau à plusieurs voix ?]] *[[Accordéon chromatique/Suggestions de morceaux (supérieur)|Suggestion de morceaux]] ;Pause en cours de route *[[Accordéon chromatique/Récréation 3|Troisième récréation]] *[[Accordéon chromatique/BWV 1007 (Bach)|BWV 1007, Prélude pour violoncelle (Johan Sebastien Bach)]] }} {{Bloc solidaire| ;<strong>...Et ensuite ?</strong> *[[Accordéon chromatique/Quelques idées pour continuer|Quelques idées pour continuer]] *[[Accordéon chromatique/Suggestion de morceaux difficiles|Suggestion de morceaux]] ;<strong>Annexes</strong> *[[Accordéon chromatique/Entretien|Entretenir son instrument]] *[[Accordéon chromatique/Basses chromatiques|Présentation des basses chromatiques]] *[[Accordéon chromatique/Choisir son accordéon|Choisir son accordéon]] *[[Accordéon chromatique/Concours|Concours]] }} {{Autocat}} 8ox70h8sk87dnyukqa6kls5ugopctm3 Modèle:Accordéon chromatique 10 83926 767389 2026-06-03T07:39:27Z DavidL 1746 [[WL:RD]] : Initialisation de la page 767389 wikitext text/x-wiki {{ModèleLivre|2=Akordeon guzikowy Special 87 120 IV 11 5 Piccolo firmy Weltmeister.jpg}}<noinclude>[[Catégorie:Modèles non imprimables spécifiques à un livre|{{SUBPAGENAME}}]]</noinclude> dv6f3wka02pvn3xz42hsbil7hs0p1jk 767396 767389 2026-06-03T07:46:06Z DavidL 1746 767396 wikitext text/x-wiki {{Sous-pages|2=Akordeon guzikowy Special 87 120 IV 11 5 Piccolo firmy Weltmeister.jpg}}<noinclude>[[Catégorie:Modèles non imprimables spécifiques à un livre|{{SUBPAGENAME}}]]</noinclude> 7b80ggfymcme794qozyiqvuadhquhex