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 Faire son film 0 3746 767579 733179 2026-06-08T07:51:49Z ~2026-33924-87 123959 767579 wikitext text/x-wiki {{ébauche}} Bienvenue sur le wikilivre en français consacré à la production et à la réalisation audiovisuelle. Ce guide a pour but de guider chaque étape nécessaire. == Développement == === Projet scénaristique === *[[Faire son film/Protection intellectuelle|Protéger ses œuvres]] *[[Faire son film/Licences numériques|Licences numériques]] *[[Faire son film/Écrire un scénario|Écrire son scénario]] *[[Faire son film/Le synopsis|Le synopsis]] === Financement === *[[Faire son film-trouver-financement|Démarche pour le financement]] *[[Faire son film-financement-carnet|Carnet d'adresse]] === Écriture Contrat === == Pré production == === Matériel/Stock === === Storyboard === *[[Faire son film-storyboard|Le storyboard]] === Casting === === Locations === === Budget === *[[Faire son film-Budget|Mettre en place son budget]] === Emploi du temps === === Bureautique papier === == Production == === Prise d'image === *[[Faire son film/Métiers de l'image|Les métiers de l'image]] *[[Faire son film/L'échelle des plans|Échelle des plans]] *[[Faire son film/Les angles de prise de vue |Angles de prise de vue]] *[[Faire son film/Les mouvements de caméra|Mouvements de caméra]] *[[Faire son film/Avant de filmer : les réglages de la caméra|Réglages de la caméra avant de filmer]] === Prise de son === *[[Faire son film/Les Métiers du son|Métiers du son]] *[[Faire son film/Le son|Son]] *[[Faire son film/Micros|Micros]] === Mise en scène === == Post-production == === Sons === === Image === == Diffusion et vente == === Vente / Marketing === === Bande annonces === == Annexe == === Outils Numériques === *[[Faire son film/Linux|Sous Linux]] *[[Faire son film/Windows|Sous Windows]] *[[Faire son film/Mac|Sous Mac]] === Études === *[[Faire son film-sans études|Sans études]] *[[Faire son film/Étude niveau bac|Niveau Bac]] *[[Faire son film/Étude Bac2|Bac + 2]] *[[Faire son film/Bibliographie|Livres conseillés]] === Associations / Festivals === *[[Faire son film-Carnet-association|Les Associations]] *[[Faire son film-Carnet-festival|Les Festivals]] *[[Faire son film-Asso-mode-demploi|Comment s'investir dans une association de ciné]] *[[Faire son film-faire-son-asso Comment Créer son association]] *[[Faire son film-faire-son-festiv|Comment faire son festival / soirée projection]] === Musique / Bande Originale === * [http://web.archive.org/web/20060103075530/http://fgimello.free.fr/documents/livre_musique_film.pdf Media:La musique, la dimension cachée du film] * [http://fgimello.free.fr/enseignements/autres_enseignements/jerry_goldsmith.htm musique de film : Jerry Goldsmith] * Vous pouvez contacter {{U'|Hérisson grognon}} pour toute question concernant ce domaine. == Références == * Largement inspiré de [[:en:Movie Making Manual|la version anglaise]] g9tmp5rv5wkypxa8wjf08v2f53qxv83 Photographie/Fabricants/Canon 0 6140 767577 767566 2026-06-07T18:06:44Z ROCKY 61469 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Canon EF 600mmm F4 L IS II USM cutaway 2012 CP+.jpg]] → [[File:Canon EF 600mm F4 L IS II USM cutaway 2012 CP+.jpg]] [[c:COM:FR#FR3|Criterion 3]] (obvious error) · Model name has two 'm' letters instead of 3, as visible at bottom-right of picture 767577 wikitext text/x-wiki {{Ph s Fabricants}} La société japonaise '''Canon Inc.''' a son siège à Tokyo, elle est spécialisée dans les équipements d'optique et d'imagerie, les photocopieurs et les imprimantes. Sa fondation remonte à 1933, sous le nom de ''Seiki Kōgaku Kenkyūjo'', ce qui signifie ''Optique de Précision et Instruments de Laboratoire''. Son but original était la conception et la fabrication d'appareils photographiques de qualité. Le premier appareil reçut un nom d'inspiration religieuse, le ''Kwanon'' (prononcé kanon), mais l'année suivante il fut rebaptisé ''Canon'' (prononcé kianon). La société prit le nom de ''Canon Camera'' en 1947, puis son nom actuel, ''Canon'' en 1969. Les appareils du début étaient inspirés des Leica dont ils reprenaient la monture vissante et le viseur. Juste après la guerre la production s'orienta vers la copie, puis très vite vers des modèles originaux. Les premiers objectifs étaient fournis par [[Nikon]] mais la société commença très tôt à fabriquer ses propres optiques sous la marque ''Serenar'', bientôt renommés ''Canon''. L'année 2009 est pour la société Canon un anniversaire important, puisque le premier appareil reflex commercialisé l'a été en 1959. = Appareils pour la photographie argentique = Les données sur les appareils argentiques Canon ont été transférées dans un article spécialisé. {{T|[[/Appareils argentiques Canon|Voir les appareils Canon pour la photographie argentique]]}} = Appareils pour la photographie numérique = == Appareils numériques sans visée reflex == {{Début cadre|vert}} <div style="text-align: center;">'''Série Ixus'''</div> Les appareils de cette série sont appelés '''Ixus''' en Europe et en Asie du Sud-est, '''PowerShot Digital ELPH''' aux États-Unis et '''IXY Digital''' au Japon. Les références des photos sont dans l'ordre : * Référence Digital Ixus * Référence PowerShot * Référence IXY Digital * n° d'identification Canon PCxxxx gravé sur les appareils quel que soit le pays. {{Fin cadre}} === année 1988 === <gallery> File:Canon Q-Pic RC-250 CP+ 2011.jpg|Canon Q-Pic RC-250 File:Canon RC-470 CP+ 2011.jpg|Canon RC-470 </gallery> === année 1996 === <gallery> File:Canon PowerShot 600 CP+ 2011.jpg|[[/Canon PowerShot 600|Canon PowerShot 600]] (13&nbsp;mai&nbsp;1996) {{75}} </gallery> === année 1997 === <gallery> Image:IMG.svg|[[/Canon PowerShot 350|Canon PowerShot 350]] {{50}} (16 juillet 1997) File:Canon IXY 310.jpg|[[/Canon Ixus L-1|Canon Ixus L-1]] = Canon IXY 310 (septembre 1997) </gallery> === année 1998 === <gallery> File:Canon PowerShot Pro70 CP+ 2011.jpg|[[/Canon PowerShot Pro 70|Canon PowerShot Pro 70]] (27 mars 1998) {{75}} Image:IMG.svg|[[/Canon PowerShot A5|Canon PowerShot A5]] (27 mars 1998) {{50}} </gallery> === année 1999 === <gallery> Image:IMG.svg|[[/Canon PowerShot A5 Zoom|Canon PowerShot A5 Zoom]] {{50}} (18&nbsp;février 1999) File:Canon Powershot A50.jpg|[[/Canon PowerShot A50|Canon PowerShot A50]] {{50}} (30 mars 1999) Image:IMG.svg|[[/Canon PowerShot S10|Canon PowerShot S10]] {{50}} (27 août 1999) </gallery> === année 2000 === <gallery> Image:IMG.svg|[[/Canon PowerShot S20|Canon PowerShot S20]] (6&nbsp;janvier&nbsp;2000) Image:Ixus-p1010137.jpg|[[/Canon Digital Ixus|Canon Digital Ixus]] {{50}}<br/>PS S100<br/>IXY Digital Digital<br/>PC1001 (17&nbsp;mai&nbsp;2000) Image:Canon PS G1 front.jpg|[[/Canon PowerShot G1|Canon PowerShot G1]] (18&nbsp;septembre&nbsp;2000) File:Canon PowerShot G1.jpg|G1 File:Canon G1 PowerShot.jpg|G1 </gallery> === année 2001 === <gallery> Image:IMG.svg|[[/Canon PowerShot Pro90 IS|Canon PowerShot Pro90 IS]] (6&nbsp;janvier&nbsp;2001) Image:IMG.svg|[[/Canon PowerShot A20|Canon PowerShot A20]] (11&nbsp;février&nbsp;2001) Image:IMG.svg|[[/Canon PowerShot A10|Canon PowerShot A10]] (11&nbsp;février&nbsp;2001) Image:IMG.svg|[[/Canon Digital Ixus 300|Canon Digital Ixus 300]] {{25}}<br/>PS S300<br/>IXY Digital 300<br/>PC ? (11&nbsp;février&nbsp;2001) Image:IxyD200-0030.jpg|[[/Canon Digital Ixus v|Canon Digital Ixus v]] {{50}}<br/>PS S110<br/>IXY Digital 200<br/>PC1012 (10&nbsp;mai&nbsp;2001) Image:Canon G2 img 1318.jpg|[[/Canon PowerShot G2|Canon PowerShot G2]] (17&nbsp;août&nbsp;2001) Image:Canon PowerShot G2.jpg|G2 Image:Canon PowerShot S40 (front, open).jpg|[[/Canon PowerShot S40|Canon PowerShot S40]] {{25}} (2&nbsp;octobre&nbsp;2001) Image:CanonPowerShotS30Silver.jpg|[[/Canon PowerShot S30|Canon PowerShot S30]] (2&nbsp;octobre&nbsp;2001) File:Canon PowerShot S30-ar 5to4-fs PNr°0269b.jpg|S 30 File:Canon PowerShot S30-ar 4to3-fs PNr°0269a.jpg|S 30 </gallery> === année 2002 === <gallery> Image:IMG.svg|[[/Canon PowerShot A100|Canon PowerShot A100]] (22&nbsp;février&nbsp;2002) Image:IMG.svg|[[/Canon PowerShot A30|Canon PowerShot A30]] (22&nbsp;février&nbsp;2002) Image:Powershot A40.jpg|[[/Canon PowerShot A40|Canon PowerShot A40]] (22&nbsp;février&nbsp;2002) Image:Canon Powershot A40.jpg Image:Canon ixus 330.jpg|[[/Canon Digital Ixus 330|Canon Digital Ixus 330]] {{25}}<br/>PS S330<br/>IXY Digital 300a<br/>PC1026 (13&nbsp;mars&nbsp;2002) Image:Canon Digital IXUS v2 front.jpg|[[/Canon Digital Ixus vII|Canon Digital Ixus vII]] {{50}}<br/>PS S200<br/>IXY Digital 200a<br/>PC1022 (13&nbsp;mars&nbsp;2002) Image:Canon PowerShot A200.jpg|[[/Canon PowerShot A200|Canon PowerShot A200]] (6&nbsp;juin&nbsp;2002) Image:Canon Digital Ixus V3.jpg|[[/Canon Digital Ixus vIII|Canon Digital Ixus vIII]] {{50}}<br/>PS S230<br/>IXY Digital 320<br/>PC ? {{25}} (16&nbsp;septembre&nbsp;2002) Image:Canon PowerShot S45.jpg|[[/Canon PowerShot S45|Canon PowerShot S45]] {{25}}(16&nbsp;septembre&nbsp;2002) Image:Canon powershot g3 front.jpg|[[/Canon PowerShot G3|Canon PowerShot G3]] {{25}} (19&nbsp;septembre&nbsp;2002) </gallery> === année 2003 === <gallery> File:Canon Digital IXUS i silver front.jpg|[[/Canon Digital Ixus i|Canon Digital Ixus i]] {{50}}<br/>PS SD10<br/>IXY Digital L<br/>PC1060 (2003) Image:Canon Digital IXUS 400 front.jpg|[[/Canon Digital Ixus 400|Canon Digital Ixus 400]] {{50}}<br/>PS S400<br/>IXY Digital 400<br/>PC1038 (27&nbsp;février&nbsp;2003) Image:Canon powershot a300 5mm camera.png|[[/Canon PowerShot A300|Canon PowerShot A300]] {{25}} (27&nbsp;février&nbsp;2003) File:CanonPowerShotS50Black.jpg|[[/Canon PowerShot S50|Canon PowerShot S50]] (27&nbsp;février&nbsp;2003) Image:Canon Powerhot S50 1.jpg Image:Canon Powerhot S50 2.jpg Image:Canon Powerhot S50 3.jpg File:Canon PowerShot A70 (side view).JPG|[[/Canon PowerShot A70|Canon PowerShot A70]] (27&nbsp;février&nbsp;2003) File:Canon PowerShot A70 (front).JPG Image:A60.jpg|[[/Canon PowerShot A60|Canon PowerShot A60]] {{75}} (27&nbsp;février&nbsp;2003) Image:Canon Ixus II front.jpg|[[/Canon Digital Ixus II|Canon Digital Ixus II]] {{25}}<br/>PS SD100<br/>IXY Digital 30<br/>PC ? (2&nbsp;mai&nbsp;2003) File:Canon PowerShot G5 front.jpg|[[/Canon PowerShot G5|Canon PowerShot G5]] {{25}} (2&nbsp;juin&nbsp;2003) Image:Canon PowerShot A80.jpg|[[/Canon PowerShot A80|Canon PowerShot A80]] (20&nbsp;août&nbsp;2003) </gallery> === année 2004 === <gallery> Image:Canon PowerShot A310, front.jpg|[[/Canon PowerShot A310|Canon PowerShot A310]] {{25}} (9&nbsp;février&nbsp;2004) Image:Canon PowerShot A75.JPG|[[/Canon PowerShot A75|Canon PowerShot A75]] {{25}} (9&nbsp;février&nbsp;2004) Image:Kamera-Canon1-Asio.JPG|[[/Canon Digital Ixus 500|Canon Digital Ixus 500]] {{50}}<br/>PS S500<br/>IXY Digital 500<br/>PC1084 (9&nbsp;février&nbsp;2004) Image:CanonDigitalIXUSIIsCrop gobeirne.jpg|[[/Canon Digital Ixus IIs|Canon Digital Ixus IIs]] {{50}}<br/>PS SD110<br/>IXY Digital 30a<br/>PC1085 (9&nbsp;février&nbsp;2004) Image:Canon_Digital_Ixus_430.jpg|[[/Canon Digital Ixus 430|Canon Digital Ixus 430]]{{25}}<br/>PS S410<br/>IXY Digital 450<br/>PC1086 (9&nbsp;février&nbsp;2004) Image:Canon Powershot S1 IS Front View 3000px.jpg|[[/Canon PowerShot S1 IS|Canon PowerShot S1 IS]] {{25}} (9&nbsp;février&nbsp;2004) Image:Canon Pro1.jpg|[[/Canon PowerShot Pro 1|Canon PowerShot Pro 1]] {{25}} (9&nbsp;février&nbsp;2004) File:Canon S60.jpg|[[/Canon PowerShot S60|Canon PowerShot S60]] (10&nbsp;mai&nbsp;2004) Image:IMG.svg|[[/Canon PowerShot A85|Canon PowerShot A85]] (20&nbsp;juillet&nbsp;2004) Image:IMG.svg|[[/Canon PowerShot S70|Canon PowerShot S70]] (19&nbsp;août&nbsp;2004) File:Canon PowerShot G6.jpg|[[/Canon PowerShot G6|Canon PowerShot G6]] (19&nbsp;août&nbsp;2004) Image:Canon powershot a95.jpg|[[/Canon PowerShot A95|Canon PowerShot A95]] {{25}} (19&nbsp;août&nbsp;2004) Image:Canon PowerShot A400 front 02.jpg|[[/Canon PowerShot A400|Canon PowerShot A400]] (19&nbsp;août&nbsp;2004) Image:Canon PowerShot A400 02.jpg Image:Canon PowerShot A400 01.jpg Image:Canon PowerShot A400 batt 02.jpg Image:Canon PowerShot A400 batt 01.jpg Image:Canon PowerShot A400 base 01.jpg Image:Canon PowerShot A400 back 01.jpg Image:Canon PowerShot A400 top 01.jpg Image:Canon PowerShot A400 front 01.jpg File:Canon PowerShot A400 2010.jpg Image:IMG.svg|[[/Canon Digital Ixus i5|Canon Digital Ixus i5]]<br/>PS SD20<br/>IXY Digital L2<br/>PC1108 (21&nbsp;septembre&nbsp;2004) Image:Canon Digital Ixus 40.jpg|[[/Canon Digital Ixus 40|Canon Digital Ixus 40]] {{50}}<br/>PS SD300<br/>IXY Digital 50<br/>PC1101 (21&nbsp;septembre&nbsp;2004) Image:Canon SD200.jpg|[[/Canon Digital Ixus 30|Canon Digital Ixus 30]]<br/>PS SD200<br/>IXY Digital 40<br/>PC1102 (21&nbsp;septembre&nbsp;2004) File:Canon IXY 30a front.jpg|Ixus 30 File:Canon IXY 30a back.jpg|Ixus 30 </gallery> === année 2005 === <gallery> Image:Canon PowerShot A510 - 2.JPG|[[/Canon PowerShot A510|Canon PowerShot A510]] {{25}} (20&nbsp;janvier&nbsp;2005) Image:CanonPSA520.jpg|[[/Canon PowerShot A520|Canon PowerShot A520]] (1er&nbsp;février&nbsp;2005) Image:Canon PowerShot A520 top 01.jpg Image:Canon PowerShot A520 front 03.jpg Image:Canon PowerShot A520 front 02.jpg Image:Canon PowerShot A520 front 01.jpg Image:Canon PowerShot A520 back 01.jpg Image:Canon PowerShot A520 13.jpg Image:Canon PowerShot A520 12.jpg Image:Canon PowerShot A520 11.jpg Image:Canon PowerShot A520 10.jpg Image:Canon PowerShot A520 09.jpg Image:Canon PowerShot A520 08.jpg Image:Canon PowerShot A520 07.jpg Image:Canon PowerShot A520 06.jpg Image:Canon Digital Ixus 50 front.png|[[/Canon Digital Ixus 50|Canon Digital Ixus 50]] {{75}}<br/>PS SD400<br/>IXY Digital 55<br/>PC1150 (17&nbsp;février&nbsp;2005) Image:Canon ixus 700.jpg|[[/Canon Digital Ixus 700|Canon Digital Ixus 700]] {{50}} <br/>PS SD500<br/>IXY Digital 600<br/>PC1114 (17&nbsp;février&nbsp;2005) Image:CanonS2IS.jpg|[[/Canon PowerShot S2 IS|Canon PowerShot S2 IS]] {{75}} (22&nbsp;avril&nbsp;2005) Image:Canon_PowerShot_A620_(01327).jpg|[[/Canon PowerShot A620|Canon PowerShot A620]] (22&nbsp;août&nbsp;2005) Image:Canon_PowerShot_A620_(01326).jpg File:Canon-a-620.jpg|Canon PowerShot A620 File:Canon Powershot A620 (3768102159).jpg Image:CanonDigitalIXUS750Orig gobeirne.jpg|[[/Canon Digital Ixus 750|Canon Digital Ixus 750]] {{50}}<br/>PS SD550<br/>IXY Digital 700<br/>PC1169 (22&nbsp;août&nbsp;2005) Image:Canon Powershot A610.JPG|[[/Canon PowerShot A610|Canon PowerShot A610]] {{25}} (22&nbsp;août&nbsp;2005) Image:IMG.svg|[[/Canon Digital Ixus 55|Canon Digital Ixus 55]] {{50}}<br/>PS SD450<br/>IXY Digital 60<br/>PC ? (22&nbsp;août&nbsp;2005) Image:IMG.svg|[[/Canon Digital Ixus i Zoom|Canon Digital Ixus i Zoom]]<br/>PS SD30<br/>IXY Digital L3<br/>PC ? (22&nbsp;août&nbsp;2005) Canon PowerShot A410.jpg|[[/Canon PowerShot A410|Canon PowerShot A410]] (22&nbsp;août&nbsp;2005) Canon PowerShot A410 (13625396654).jpg Canon PowerShot A410 (13625067865).jpg Canon PowerShot A410 (13625067093).jpg Canon PowerShot A410 (11790936466).jpg Canon PowerShot A410 (11790411453).jpg Image:IMG.svg|[[/Canon PowerShot S80|Canon PowerShot S80]] (22&nbsp;août&nbsp;2005) Image:IMG.svg|[[/Canon Digital Ixus Wireless|Canon Digital Ixus Wireless]]<br/>PS SD430 Wireless<br/>IXY Digital Wireless<br/>PC ? (25&nbsp;octobre&nbsp;2005) </gallery> === année 2006 === <gallery> IMG.svg|[[/Canon PowerShot A420|Canon PowerShot A420]] (21&nbsp;février&nbsp;2006) Canon Digital IXUS 800 IS.jpg|[[/Canon Digital Ixus 800 IS|Canon Digital Ixus 800 IS]]<br/>PS SD700 IS<br/>IXY Digital 850 IS<br/>PC1176 (21&nbsp;février&nbsp;2006) {{75}} Canon Digital IXUS 65 (04).jpg|[[/Canon Digital Ixus 65|Canon Digital Ixus 65]] {{50}}<br/>PS SD630<br/>IXY Digital 80<br/>PC1147 (21&nbsp;février&nbsp;2006) Canon Digital IXUS 60.jpg|[[/Canon Digital Ixus 60|Canon Digital Ixus 60]] {{75}}<br/>PS SD600<br/>IXY Digital 70<br/>PC1193 (21&nbsp;février&nbsp;2006) Canon Powershot S3 IS.jpg|[[/Canon PowerShot S3 IS|Canon PowerShot S3 IS]] (21&nbsp;février&nbsp;2006) {{100}} Canon power shot a430IMG 2608.jpg|[[/Canon PowerShot A430|Canon PowerShot A430]] (21&nbsp;février&nbsp;2006) {{50}} Canon_Powershot_A540.jpg|[[/Canon PowerShot A540|Canon PowerShot A540]] (21&nbsp;février&nbsp;2006) {{50}} Canon PowerShot A530 - 2.JPG|[[/Canon PowerShot A530|Canon PowerShot A530]] (21&nbsp;février&nbsp;2006) {{50}} Canon PowerShot A700.jpg|[[/Canon PowerShot A700|Canon PowerShot A700]] (21&nbsp;février&nbsp;2006) {{25}} Canon PowerShot A710 IS 02.JPG|[[/Canon PowerShot A710 IS|Canon PowerShot A710 IS]] (24&nbsp;août&nbsp;2006) {{25}} Canon PowerShot A640 img 0782.jpg|[[/Canon PowerShot A640|Canon PowerShot A640]] (24&nbsp;août&nbsp;2006) {{25}} Canon A630.jpg|[[/Canon PowerShot A630|Canon PowerShot A630]] (24&nbsp;août&nbsp;2006) {{50}} IMG.svg|[[/Canon Digital Ixus i7 Zoom|Canon Digital Ixus i7 Zoom]]<br/>PS SD40 IS<br/>IXY Digital L4<br/>PC ? (14&nbsp;septembre&nbsp;2006) Canon Digital IXUS 850 IS-ar 4to3-fs PNr°0268a.jpg|[[/Canon Digital Ixus 850 IS|Canon Digital Ixus 850 IS]]<br/>PS SD800 IS<br/>IXY Digital 900IS<br/>PC ? {{75}} (14&nbsp;septembre&nbsp;2006) 20070416 Canon IXUS 900Ti 2.JPG|[[/Canon Digital Ixus 900 Ti|Canon Digital Ixus 900 Ti]]<br/>PS SD900<br/>IXY Digital 1000<br/>PC ? (14&nbsp;septembre&nbsp;2006) {{75}} Canon G7 mg 2529.jpg|[[/Canon PowerShot G7|Canon PowerShot G7]] (14&nbsp;septembre&nbsp;2006) {{50}} </gallery> === année 2007 === <gallery> Canon PowerShot A460 3.JPG|[[/Canon PowerShot A460|Canon PowerShot A460]] (18&nbsp;janvier&nbsp;2007) {{75}} Canon PowerShot A550, -20 Jan. 2011 a.jpg|[[/Canon PowerShot A550|Canon PowerShot A550]] (18&nbsp;janvier&nbsp;2007) {{100}} Canon A450 front.jpg|[[/Canon PowerShot A450|Canon PowerShot A450]] (18&nbsp;janvier&nbsp;2007) {{75}} Canon A560 camera.jpg|[[/Canon PowerShot A560|Canon PowerShot A560]] (22&nbsp;février&nbsp;2007) Canon PowerShot A570 IS (uitgesneden), -13 januari 2008 a.jpg|[[/Canon PowerShot A570 IS|Canon PowerShot A570 IS]] (22&nbsp;février&nbsp;2007) {{100}} IMG.svg|[[/Canon PowerShot TX1|Canon PowerShot TX1]] (22&nbsp;février&nbsp;2007) {{75}} CanonDigitalIxus70 (cropped).jpg|[[/Canon PowerShot SD1000|Canon PowerShot SD1000 = Digital IXUS 70]] (22&nbsp;février&nbsp;2007) {{100}} Canon Ixus 75 img 0753.jpg|[[/Canon PowerShot SD750|Canon PowerShot SD750 = Digital IXUS 75]] (22&nbsp;février&nbsp;2007) Canon PowerShot S5 IS-face.png|[[/Canon PowerShot S5 IS|Canon PowerShot S5 IS]] (7&nbsp;mai&nbsp;2007) {{50}} IMG.svg|[[/Canon PowerShot SD870 IS|Canon PowerShot SD870 IS]] (20&nbsp;août&nbsp;2007) {{75}} IMG.svg|[[/Canon PowerShot SD950 IS|Canon PowerShot SD950 IS]] (20&nbsp;août&nbsp;2007) {{75}} My Canon SX100 IS (4334973743).jpg|[[/Canon PowerShot SX100 IS|Canon PowerShot SX100 IS]] (20&nbsp;août&nbsp;2007) {{100}} Canon PowerShot G9 Body.jpg|[[/Canon PowerShot G9|Canon PowerShot G9]] (20&nbsp;août&nbsp;2007) {{75}} PowerShot A650 IS.jpg|[[/Canon PowerShot A650 IS|Canon PowerShot A650 IS]] (20&nbsp;août&nbsp;2007) {{75}} Powershot A720is.jpg|[[/Canon PowerShot A720 IS|Canon PowerShot A720 IS]] (20&nbsp;août&nbsp;2007) {{75}} IXUS 860is.JPG|[[/Canon Digital Ixus 860 IS|Canon Digital Ixus 860 IS]] (septembre 2007) {{00}} </gallery> === année 2008 === <gallery> Canon PowerShot A590 IS.jpg|[[/Canon PowerShot A590 IS|Canon PowerShot A590 IS]] (24&nbsp;janvier&nbsp;2008) Canon Powershot A590.JPG|A590 CanonPowerShotA590IS.jpg Canon PowerShot SX110 IS, -13 november 2011 a.jpg|[[/Canon PowerShot SX110 IS|Canon PowerShot SX110 IS]] (2008) {{100}} IMG.svg|[[/Canon PowerShot E1|Canon PowerShot E1]] (2008) {{25}} Canon PowerShot A1000 IS 2009 G4.jpg|[[/Canon PowerShot A1000 IS|Canon PowerShot A1000 IS]] (26&nbsp;août&nbsp;2008) {{100}} IMG.svg|[[/Canon PowerShot A2000 IS|Canon PowerShot A2000 IS]] (26&nbsp;août&nbsp;2008) {{75}} Canon PowerShot SD880 IS front.jpg|[[/Canon PowerShot SD880 IS|Canon PowerShot SD880 IS = Digital Ixus 870 IS]] (17&nbsp;septembre&nbsp;2008) {{100}} Canon PowerShot SX1 IS Lens Extended (Martyx).jpg|[[/Canon PowerShot SX1 IS|Canon PowerShot SX1 IS]] (17&nbsp;septembre&nbsp;2008) {{100}} Kamera-CanonDigitalIxus980IS-1-Asio.jpg|[[/Canon PowerShot SD990 IS|Canon PowerShot SD990 IS = Digital Ixus 980 IS]] (17&nbsp;septembre&nbsp;2008) {{100}} Canon G10 IMG 2195.jpg|[[/Canon PowerShot G10|Canon PowerShot G10]] (17&nbsp;septembre&nbsp;2008) {{75}} CanonPwrShotSX10.jpg|[[/Canon PowerShot SX10 IS|Canon PowerShot SX10 IS]] (17&nbsp;septembre&nbsp;2008) {{75}} </gallery> === année 2009 === <gallery> File:Canon PowerShot A480 selfshot.jpg|[[/Canon PowerShot A480|Canon PowerShot A480]] (15&nbsp;janvier&nbsp;2009) File:Canon PowerShot SX200 IS.jpg|[[/Canon PowerShot SX200 IS|Canon PowerShot SX200 IS]] (18&nbsp;février&nbsp;2009) {{100}} File:CanonSD1200IS.JPG|[[/Canon PowerShot SD 1200 IS|Canon PowerShot SD 1200 IS = Canon Digital IXUS 95 IS]] (18&nbsp;février&nbsp;2009) {{100}} File:Ixus 110.JPG|[[/Canon Ixus 110 IS|Canon Ixus 110 IS]] (18&nbsp;février&nbsp;2009) {{100}} File:Canon PowerShot D10.jpg|[[/Canon PowerShot D10|Canon PowerShot D10]] File:Canon powershot sx120 is.jpg|[[/Canon PowerShot SX120 IS|Canon PowerShot SX120 IS]] (19&nbsp;août&nbsp;2009) {{100}} File:Canon s90 size.JPG|[[/Canon Powershot S90|Canon Powershot S90]] (19&nbsp;août&nbsp;2009) {{75}} File:Canon PowerShot S90 02.jpg|S 90 File:Canon PowerShot S90 01.jpg|S 90 File:Canon PowerShot S90 03.jpg|S 90 File:Canon-s90-front.jpg|S 90 File:Canon G11 img 3544.jpg|[[/Canon PowerShot G11|Canon PowerShot G11]] (19&nbsp;août&nbsp;2009) {{100}} File:IMG.svg|Canon Powershot A1100 IS </gallery> === année 2010 === <gallery> File:CannonPowerShot1300Lens.JPG|[[/Canon PowerShot SD1300 IS|Canon PowerShot SD1300 IS = Canon Digital IXUS 105 IS = Canon IXY 200F]] (8&nbsp;février&nbsp;2010) File:CannonPowerShot1300Front.JPG File:CannonPowerShot1300Back.JPG File:Canon PowerShot SD1300 IS.jpg File:Canon Powershow S95.png|[[/Canon PowerShot S95|Canon PowerShot S95]] (19&nbsp;août&nbsp;2010) {{75}} Image:IMG.svg|[[/Canon PowerShot SD4500 IS|Canon PowerShot SD4500 IS = Digital Ixus 1000 HS = IXY 50S]] (19&nbsp;août&nbsp;2010) {{75}} File:Canon G12.jpg|[[/Canon PowerShot G12|Canon PowerShot G12]] (14&nbsp;septembre&nbsp;2010) {{75}} File:Canon PowerShot SX30 IS 01 (fcm).jpg|[[/Canon PowerShot SX30 IS|Canon PowerShot SX30 IS]] File:Canon PowerShot SX30 IS 02 fcm.jpg File:Canon PowerShot SX30 IS 03 (fcm).jpg Canon SX30, 2011-? (14996976598).jpg File:Powershot A490.jpg|[[/Canon PowerShot A490|Canon PowerShot A490]] </gallery> === année 2011 === <gallery> File:IXY 210F.jpg|[[/Canon Ixus 115 HS|Canon Ixus 115 HS]] (7&nbsp;février&nbsp;2011) File:IXUS 115 HS three quarter view.JPG File:Ixus 220.JPG|[[/Canon Ixus 220 HS|Canon Ixus 220 HS]] (7&nbsp;février&nbsp;2011) File:Canon IXUS 220 HS.jpg|220 HS 14-08-01-kameravergleich-7.jpg Unterwassergehaeuse-Test-RalfR-N3S 7808-1.jpg Unterwassergehaeuse-Test-RalfR-N3S 7814-7.jpg Unterwassergehaeuse-Test-RalfR-N3S 7813-6.jpg Unterwassergehaeuse-Test-RalfR-N3S 7812-5.jpg Unterwassergehaeuse-Test-RalfR-N3S 7811-4.jpg File:Canon PowerShot S100 20120121.jpg|[[/Canon Powershot S100|Canon Powershot S100]] (15&nbsp;septembre&nbsp;2011) {{75}} </gallery> === année 2012 === <gallery> Canon IXUS 990 IS.jpg|Canon IXUS 990 IS 20161119 Canon Digital Ixus 990 IS 4.jpg 20161119 Canon Digital Ixus 990 IS 3.jpg 20161119 Canon Digital Ixus 990 IS 2.jpg 20161119 Canon Digital Ixus 990 IS 1.jpg Canon PowerShot SX210IS rear.jpg|Canon PowerShot SX210IS Canon PowerShot G1X Mark II 2014 CP+.jpg|Canon PowerShot G1X Mark II Canon PowerShot G1x Mark II (14064931277).jpg Canon PowerShot G1x Mark II (14064846118).jpg Canon PowerShot G1x Mark II (14271690003).jpg Canon PowerShot G1x Mark II (14251156564).jpg Canon PowerShot G1x Mark II (14064853649).jpg Canon PowerShot G1x Mark II (14271695523).jpg Canon PowerShot G1x Mark II (14064849468).jpg File:Canon Powershot SX 260 HS Front.JPG|[[/Canon PowerShot SX260 HS|Canon PowerShot SX260 HS]] (7 février 2012) {{100}} Image:IMG.svg|[[/Canon PowerShot D20|Canon PowerShot D20]] (7&nbsp;février 2012) {{75}} </gallery> === année 2013 === <gallery> Canon Digital IXUS 135 8x optical zoom 6578.jpg|[[/Canon IXUS 135/]] (29&nbsp;janvier&nbsp;2013) Canon PowerShot ELPH 115 IS.jpg|Canon PowerShot ELPH 115 IS (29&nbsp;janvier&nbsp;2013) Canon PowerShot Elph 115 IS (13968736497).jpg Canon PowerShot Elph 115 IS (14132220826).jpg </gallery> === année 2014 === === année 2015 === <gallery> Canon PowerShot SX510 HS (13337456934).jpg|Canon PowerShot SX510 HS Canon PowerShot SX510 HS (13625031355).jpg Canon PowerShot SX510 HS (13337193023).jpg Canon PowerShot A2500 (14421803632).jpg|Canon PowerShot A2500 Canon PowerShot A2500 (14421950664).jpg Canon PowerShot A2500 (14443267403).jpg Canon PowerShot A2500 (14236491560).jpg Canon EOS M3.jpg|[[/Canon EOS M3/]] (6&nbsp;février&nbsp;2015) {{100}} Canon g3x.jpeg|[[/Canon PowerShot G3 X/]] (18&nbsp;juin&nbsp;2015) {{100}} IMG.svg|[[/Canon EOS M10/]] (13&nbsp;octobre&nbsp;2015) {{75}} </gallery> === photos à classer === <gallery> Canon EOS M2 02.jpg|Canon EOS M2 Canon EOS M2.jpg Canon EOS Kiss X9i front-left 2017 CP+.jpg|Canon EOS Kiss X9i Canon EOS M5 rear-right LCD-tilt 2017 CP+.jpg|Canon EOS M5 Canon EOS M5 rear-right 2017 CP+.jpg Canon EOS M5 front-left 2017 CP+.jpg Canon EOS M5 front 2017 CP+.jpg EOS M5 on red paper in CPplus2017.jpg Canon EOS M6 front-left 2017 CP+.jpg|Canon EOS M6 Canon EOS M6 EVF front-left 2017 CP+.jpg CP+ 2017 (32944881910).jpg CP+ 2017 (32944890920).jpg CP+ 2017 (33199752041).jpg CP+ 2017 (32944886240).jpg CP+ 2017 (33172259472).jpg CP+ 2017 (33327473475).jpg CP+ 2017 (32513232663).jpg CP+ 2017 (33199753471).jpg CP+ 2017 (33172261262).jpg CP+ 2017 (33172257972).jpg Canon IXUS 170BK 20160827f.jpg|Canon IXUS 170BK Canon IXUS 170BK 20160827e.jpg Canon IXUS 170BK 20160827d.jpg Canon IXUS 170BK 20160827b.jpg Canon IXUS 170BK 20160827c.jpg Canon IXUS 170BK 20160827a.jpg Canon PowerShot SX400 IS 01.jpg|[[/Canon PowerShot SX400 IS/]] Canon PowerShot SX60 HS 001.JPG|Canon PowerShot SX60 HS Canon PowerShot SX60 HS 002.JPG Canon PowerShot SX60 HS 003.JPG Canon PowerShot SX60 HS 004.JPG Canon PowerShot SX60 HS 005.JPG Canon PowerShot SX60 HS 006.JPG Canon PowerShot SX60 HS 007.JPG Canon PowerShot SX60 HS.jpg Canon SX700 HS - 2015-04-02.jpg|Canon Powershot SX700 HS Canon Powershot G7 X.jpg|Canon Powershot G7X Canon PowerShot S110 with lens extended.jpg|Canon PowerShot S110 Canon PowerShot S110 (14236431239).jpg Canon PowerShot S110 (14419725391).jpg Canon PowerShot S110 (14443262183).jpg Canon PowerShot S110 (14423072925).jpg Canon PowerShot S120.jpg|Canon PowerShot S120 Canon PowerShot S200.jpg|Canon PowerShot S200 Canon Powershot ELPH330HS.jpg|Canon Powershot ELPH330HS Canon PowerShot A3100 IS.JPG|Canon PowerShot A3100 IS Canon PowerShot G15-001.jpg|Canon PowerShot G15 Canon PowerShot G15.jpg Canon Digital IXUS 970IS front.jpg|Canon Digital IXUS 970IS Canon Digital IXUS 970IS rear.jpg Canon PowerShot SX210IS rear.jpg|Canon PowerShot SX210IS Canon PowerShot SX210IS front.jpg Canon PowerShot SX270 HS (2).jpg|Canon PowerShot SX270 HS Canon PowerShot SX270 HS.JPG IMG.svg|Canon A810 A canon a1200 camera.jpg|Canon A1200 Canon Powershot SX500 IS Front Cropped.png|Canon Powershot SX500 IS Canon EOS-5D vs EOS-M.JPG|EOS 5D et EOS-M Canon sx50 hs.jpg|Canon PowerShot SX50 HS Canon PowerShot SX50 HS zoom.JPG Canon PowerShot SX50 HS upper.JPG Canon PowerShot SX50 HS s2.JPG Canon PowerShot SX50 HS s3.JPG Canon PowerShot SX50 HS rear.JPG Canon PowerShot SX50 HS.JPG Canon PowerShot sx50 HS.jpg Canon sx50 hs.jpg IMG.svg|Canon PowerShot G16 Canon PowerShot A2300.jpg|Canon PowerShot A2300 Canon PowerShot SX160 IS.JPG|Canon PowerShot SX160 IS Camara PowerShot SX 160IS Lente.JPG Canon Powershot G1 X camera - 1.jpg|Canon Powershot G1 X Canon PowerShot G1 X Mark II (12475407225).jpg|Canon PowerShot G1 X Mark II Canon PowerShot G1 X Mark II (12475878394).jpg Canon PowerShot G1 X Mark II (12475881004).jpg Canon PowerShot G1 X Mark II (12475405035).jpg Canon PowerShot SX280 HS.jpg|Canon PowerShot SX280 HS Canon PowerShot SX280 HS DSCN5924 01.jpg Canon PowerShot SX280 HS DSCN5924 02.jpg Canon PowerShot SX280 HS DSCN5924 03.jpg Canon PowerShot A2200 HD.jpg|Canon PowerShot A2200 Canon Digital IXUS 555 20070106.jpg|Ixus 555 Canon Powershot SX230 HS Kamera vorne.JPG|Canon Powershot SX230 HS Canon Powershot SX230 HS Kamera hinten.JPG|Canon Powershot SX230 HS Canon sx230.jpg My new toys (8017558802).jpg|SX240 HS Ixus 240 HS.JPG|Canon Ixus 240 HS Canon Powershot A495.JPG|Canon Powershot A495 Canon PowerShot A495 (Lit).JPG Canon PowerShot A495 GM 01.jpg Canon PowerShot A495 GM 02.jpg Canon PowerShot A495 GM 03.jpg Canon PowerShot A495 GM 04.jpg Canon PowerShot A495 GM 05.jpg Canon PowerShot A495 GM 06.jpg Canon RowerShot A580 фото1.JPG|PowerShot A580 Canon RowerShot A580 фото2.JPG|PowerShot A580 Canon RowerShot A580 фото3.JPG|PowerShot A580 Canon PowerShot A470 unboxing (2).jpg|Powershot A470 Canon powershot a470 unboxing.jpg|Powershot A470 Canon PowerShot A470 unboxing.jpg|Powershot A470 Canon PowerShot A470.jpg|Powershot A470 Canon EOS M Blogger Event 01.jpg|Canon EOS M Canon EOS M Blogger Event 02.jpg|Canon EOS M Canon EOS M Blogger Event 02 cropped.jpg|Canon EOS M Canon EOS M Blogger Event 03.jpg|Canon EOS M Canon EOS M Blogger Event 04.jpg|Canon EOS M Canon EOS M Blogger Event 05.jpg|Canon EOS M Canon EOS M Blogger Event 06.jpg|Canon EOS M Canon EOS M Blogger Event 07.jpg|Canon EOS M Canon EOS M Blogger Event 08.jpg|Canon EOS M Canon EOS M Blogger Event 09.jpg|Canon EOS M EOS M weiss Frontal mit Speedlite 90EX.jpg EOS M weiss - Frontal mit Speedlite 90EX.JPG EOS M weiss Rueckseite.jpg EOS M weiss EF-M Bajonett.jpg Canon EOS M vs. Canon EOS 600D.jpg Canon EOS M vs. Canon EOS 600D (top view).jpg EOS M weiss mit EF-M 22mm.JPG Canon EOS M white rear 20140708.jpg Canon EOS M white face 20140708.jpg Canon EOS M white top 20140708.jpg Canon Powershot G1X.jpg|[[/Canon Powershot G1 X/]] Canon PowerShot G1 X 01.jpg Canon PowerShot G1 X 02.jpg Canon PowerShot G1 X 03.jpg Canon PowerShot G1 X 04.jpg Canon PowerShot G1 X 05.jpg Canon PowerShot G1 X 06.jpg Canon PowerShot G1 X 07.jpg Canon PowerShot G1 X 08.jpg Canon PowerShot G1 X 09.jpg Canon IXY Digital 930 IS.jpg|Canon IXY Digital 930 IS Canon SX130 IS.JPG|Canon PowerShot SX130 IS Canon SX130 IS, back.JPG Canon pc1473 2.jpeg|IXY 30S Canon pc1473.jpeg|IXY 30S Canon powershot sx20 is jm 2010-07-21 009 1.jpg|SX 20 IS CanonSX210IS.png|Canon 210 IS Canon IMG 2166.jpg|Canon Digital Ixus 300 HS Image:SD890IS.jpg|SD 890 IS Canon Ixus nach Tubusmotorschaden zerlegt DSC00027.jpg Canon Ixus nach Tubusmotorschaden zerlegt DSC00030.jpg Canon Ixus nach Tubusmotorschaden zerlegt DSC00035.jpg Canon Ixus nach Tubusmotorschaden zerlegt DSC00036.jpg 2011-11-19 Canon IXUS 80 IS.JPG|[[/Canon PowerShot SD 1100 IS|Canon PowerShot SD 1100 IS = Digital Ixus 80 IS]] CanonPowershotA1100IS.jpg|A 1100 IS Canon Digital IXUS 100 IS-front - oblique.jpg|Ixus 100 IS IXY DIGITAL 210IS.jpg|Ixus 100 IS Canon IXUS 100 IS - SD780 IS (5355484936).jpg Canon IXUS 100 IS - SD780 IS (5355485642).jpg Canon IXUS 100 IS - SD780 IS (5354871009).jpg Ixus 117.JPG|Ixus 117 HS Canon IXUS 120 IS - SD940 IS (5906678114).jpg|Ixus 120 IS Canon IXUS 150 (12473648264).jpg|Canon IXUS 150 Canon IXUS 155 (12473376313).jpg|Canon IXUS 155 Canon IXUS 265 HS (12473705284).jpg|Canon IXUS 265 HS Canon IXUS 265 HS (12473225415).jpg Canon IXUS 265 HS (12473309103).jpg Canon IXUS 265 HS (12473378813).jpg Canon IXUS 265 HS (12473671304).jpg Canon IXUS 265 HS (12473665474).jpg Canon IXUS 265 HS (12473677224).jpg Canon IXUS 265 HS (12473695924).jpg Canon IXUS 265 HS (12473364893).jpg Canon IXUS 265 HS (12473216075).jpg Canon IXUS 265 HS (12473186585).jpg Canon IXUS 265 HS (12473220005).jpg Canon IXUS 265 HS (12473192405).jpg Ixus 300.JPG|Ixus 300 HS Canon PowerShot SX40 HS.jpg|Canon PowerShot SX40 HS IMG.svg|Canon PowerShot SX40 HS Canon PowerShot SX600 HS (12473718574).jpg|Canon PowerShot SX600 HS Canon PowerShot SX600 HS (12473715964).jpg Canon PowerShot SX600 HS (12473640854).jpg Canon PowerShot SX600 HS (12473238235).jpg </gallery> == Appareils numériques reflex == === année 1986 === <gallery> File:Canon RC-701 img 0829.jpg|[[/Canon RC-701|Canon RC-701]] (5&nbsp;août&nbsp;1986) </gallery> === année 2001 === <gallery> Image:EOS D30 with Pentacon lens.JPG|[[/Canon EOS D30|Canon EOS D30]] (17&nbsp;mai&nbsp;2001) File:Canon EOS D30 CP+ 2011.jpg|Canon EOS D30 File:EOS D30 body.JPG|Canon EOS D30 Image:Canon EOS-1D.jpg|[[/Canon EOS 1D|Canon EOS 1D]] (25&nbsp;septembre&nbsp;2001) File:EOS1D.jpg </gallery> === année 2002 === <gallery> Image:Canon D60 brighterorange.jpg|[[/Canon EOS D60|Canon EOS D60]] (22&nbsp;février&nbsp;2002) Fichier:Canon eos d60.jpg|D60 Image:EOS-1Ds IMG 0090.JPG|[[/Canon EOS 1Ds|Canon EOS 1Ds]] (24&nbsp;septembre&nbsp;2002) File:1Ds 50mm.jpg|EOS 1Ds File:Canon EOS-1Ds 01.jpg File:Canon EOS-1Ds 02.jpg File:Canon EOS-1Ds 03.jpg File:Canon EOS-1Ds 04.jpg </gallery> === année 2003 === <gallery> Canon EOS 10D.jpg|[[/Canon EOS 10D|Canon EOS 10D]] (27&nbsp;février&nbsp;2003) Eos 300d v sst.jpg|[[/Canon EOS 300D (Digital Rebel)|Canon EOS 300D (Digital Rebel)]] (20&nbsp;août&nbsp;2003) </gallery> === année 2004 === <gallery> Image:Canon EOS Kiss Digital.jpg Image:Canon 1D II img 0496.jpg|[[/Canon EOS 1D Mark II|Canon EOS 1D Mark II]] (29&nbsp;janvier&nbsp;2004) Image:Canon 1D II img 0495.jpg File:EOS1D 2.jpg Image:Eos 20d v sst.jpg|[[/Canon EOS 20D|Canon EOS 20D]] {{50}} (19&nbsp;août&nbsp;2004) Image:EOS-1Ds IMG 0090.JPG|[[/Canon EOS 1Ds Mark II|Canon EOS 1Ds Mark II]] (21&nbsp;septembre&nbsp;2004) Image:Canon EOS-1Ds Mark II img 0756.jpg Image:Canon EOS 1Ds Mark II img 1043.jpg Image:Canon EOS 1Ds Mark II img 1042.jpg Image:Canon EOS 1Ds Mk II.jpg Image:Canon EOS-1Ds Mark II img 1347.jpg File:Canon EOS-1Ds Mark II (camera body front view).jpg Image:EOS 1D mkII mg 3361.jpg Image:EOS 1D mkII mg 3360.jpg Image:EOS 1D mkII mg 3359.jpg Image:EOS 1D mkII mg 3358.jpg Image:EOS 1D mkII mg 3357.jpg Image:EOS 1D mkII mg 3356.jpg Image:EOS 1D mkII mg 3355.jpg Image:EOS 1D mkII mg 3354.jpg Image:EOS 1D mkII mg 3353.jpg Image:EOS 1D mkII mg 3352.jpg Image:EOS 1D mkII mg 3351.jpg Image:EOS 1D mkII mg 3348.jpg Image:EOS 1D mkII mg 3346.jpg Image:EOS 1D mkII mg 3345.jpg </gallery> === année 2005 === <gallery> Image:Canon EOS 350D front (aka).jpg|[[/Canon EOS 350D|Canon EOS 350D = Canon Digital Rebel XT]] (17&nbsp;février&nbsp;2005) {{100}} Image:Canon EOS 20Da.jpg|[[/Canon EOS 20Da|Canon EOS 20Da]] (1er&nbsp;juin&nbsp;2005) {{50}} File:1D mark II N.jpg|[[/Canon EOS 1D Mark II N|Canon EOS 1D Mark II N]] (22&nbsp;août&nbsp;2005) Image:EOS5D-img 0064.jpg|[[/Canon EOS 5D|Canon EOS 5D]] (22&nbsp;août&nbsp;2005) {{25}} </gallery> === année 2006 === <gallery> EOS-30D front.jpg|[[/Canon EOS 30D|Canon EOS 30D]] {{75}} (21&nbsp;février&nbsp;2006) Canon 400D.jpg|[[/Canon EOS 400D (Digital Rebel XTi)|Canon EOS 400D = Canon Digital Rebel XTi]] (24&nbsp;août&nbsp;2006) Kjetils kamera 1,5.png|400D Canon EOS 400D with EF 28 f1.8 and battery grip.jpg|400 D Canon EOS 400D shot with Panasonic FZ5.jpg|400 D Canon EOS 400D 9510.jpg|400D Canon EOS 400D with EF 28mm f1.8.jpg|400 D CanonEOS400D(2).jpg|400D Canon EOS 400D 9506.jpg|400 D 400D-18-55kit.jpg|400 D Canon EOS 400D (3D view).png|400 D Canon-EOS-400D-back.jpg|400 D Canon400d.JPG|400 D Canon EOS 400D.jpg|400 D Canon EOS 400D with Canon EF-S 18-55mm F3.5-5.6 and Canon EF 75-300mm F4-5.6 II USM-flickr - by - Michel Filion.jpg|400D Canon EOS 400D Rückseite.jpg|400 D Xti1.jpg|400D CanonRebelXTi.jpg Canon Digital Rebel XTi.jpg Canon EOS 400D and Canon EF-S 10-22mm F3.5-4.5 USM, Canon EF-S 17-55mm F2.8 IS USM and Canon EF-S 60mm F2.8 Macro USM-flickr - by-sa - eirikso.jpg Canon Rebel XTi (8415682396).jpg Canon Rebel XTi (8414588075).jpg New camera! (1183572650).jpg Canon EOS 400D + Canon EF 50mm F1.4.jpg </gallery> === année 2007 === <gallery> Image:Eos-1D Mark III Front View.jpg|[[/Canon EOS 1D Mark III|Canon EOS 1D Mark III]] (22&nbsp;février&nbsp;2007) Image:Eos-1D Mark III Top View.jpg Image:Eos-1D Mark III Right Side.jpg Image:Eos-1D Mark III Left Side.jpg Image:Eos-1D Mark III Rear View.jpg File:Canon 1ds3 04082009.jpg Image:Canon EOS 40D img 1325.jpg|[[/Canon EOS 40D|Canon EOS 40D]] {{75}} (20 août 2007) Image:EOS 1Ds Mark III img 0828.jpg|[[/Canon EOS 1Ds Mark III|Canon EOS 1Ds Mark III]] {{75}} (20&nbsp;août&nbsp;2007) </gallery> === année 2008 === <gallery> File:Canon-EOS-450D-7.JPG|[[/Canon EOS 450D|Canon EOS 450D = EOS Digital Rebel XSi]] (24&nbsp;janvier&nbsp;2008) {{75}} Image:Canon EOS 1000D IMG 2000.jpg|[[/Canon EOS 1000D|Canon EOS 1000D = EOS Digital Rebel XS]] (10&nbsp;juin&nbsp;2008) {{75}} Image:Canon EOS 50D.jpg|[[/Canon EOS 50D/]] (26&nbsp;août&nbsp;2008) Image:Canon EOS 50D Top.jpg|EOS 50D File:Canon EOS 50D black.jpg|EOS 50D File:Canon EOS 50D back.jpg Image:Canon EOS 50D Back.jpg|EOS 50D File:Canon EOS 50D front.jpg|EOS 50D File:Canon EOS 50D Canon EOS 400D.jpg|50D et 400D File:Canon EOS 50D with EF-S 18-55 mm IS.jpg|50D File:Canon EOS 50D-IMG 2440.jpg|50D CANON EOS 50D ボディ (3493506135).jpg EOS 50D (6559050121).jpg File:Canon EOS 5DmkII.jpg|[[/Canon EOS 5D Mark II]] (17&nbsp;septembre&nbsp;2008) {{75}} </gallery> === année 2009 === <gallery> Canon Rebel 500d T1i.jpg|[[/Canon EOS 500D|Canon EOS 500D = Digital Rebel T1i = Kiss X3 Digital]] (25&nbsp;mars&nbsp;2009) {{25}} Canon EOS 7D img 3487.jpg|[[/Canon EOS 7D|Canon EOS 7D]] (1&nbsp;septembre&nbsp;2009) Feb2015 Canon EOS 7D Mark II img2 - with Canon50.jpg Feb2015 Canon EOS 7D Mark II img1 - with Tamron17-50.jpg Jan2015 Canon EOS 7D Mark II Body02.jpg Jan2015 Canon EOS 7D Mark II Body01.jpg Jan2015 Canon EOS 7D Mark II Body-Crop.jpg FS WMDE Canon Normal 01.JPG FS WMDE Canon Normal 02.JPG FS WMDE Canon Tele 01.JPG FS WMDE Canon Tele 02.JPG FS WMDE Canon Tele 03.JPG FS WMDE Canon Tele 04.JPG FS WMDE Canon Normal 01.JPG FS WMDE Canon Normal 02.JPG FS WMDE Canon Normal 03.JPG FS WMDE Canon Normal 04.JPG EOS7D BG-E7 10.jpg EOS7D BG-E7 09.jpg EOS7D BG-E7 08.jpg EOS7D BG-E7 07.jpg EOS7D BG-E7 06.jpg EOS7D BG-E7 05.jpg EOS7D BG-E7 04.jpg EOS7D BG-E7 03.jpg EOS7D BG-E7 02.jpg EOS7D BG-E7 01.jpg Canon_EOS-1D_Mark_IV.jpg|1D mk4 Canon EOS-1D Mark IV fotographix.ca.jpg|1D mk4 </gallery> === année 2010 === <gallery> File:Canon EOS 550D.jpg|[[/Canon EOS 550D|Canon EOS 550D]] (8&nbsp;février&nbsp;2010) {{100}} File:Canon eos d60.jpg|[[/Canon EOS 60D|Canon EOS 60D]] (26&nbsp;août&nbsp;2010) {{100}} </gallery> === année 2011 === <gallery> </gallery> === année 2012 === <gallery> </gallery> === année 2013 === <gallery> </gallery> === année 2014 === <gallery> </gallery> === année 2015 === <gallery> Canon EOS 5Ds R 2015 CP+.jpg|[[/Canon EOS 5DSR|Canon EOS 5DSR]] (6&nbsp;février&nbsp;2015) {{100}} </gallery> === à classer === <gallery> Canon_EOS_5D_Mark_III.jpg|[[Photographie/Fabricants/Canon/Canon EOS 5D Mark III|Canon EOS 5D Mark III]] CP+ 2017 (32944923010).jpg|Canon EOS 800D = EOS Kiss X9i CP+ 2017 (33286974906).jpg CP+ 2017 (33199755691).jpg CP+ 2017 (33199733361).jpg CP+ 2017 (33199736101).jpg Canon EOS 9000D top 2017 CP+.jpg|Canon EOS 9000D Canon EOS 9000D front-left 2017 CP+.jpg Canon EOS 5D Mark IV with 24-105mm f-4L by Trung.ttvn.jpg|Canon EOS 5D Mark IV Canon EOS 5D Mark IV mit Objektiv 16-35mm F4L IS USM.JPG Canon EOS-5D-Mark-IV-01.jpg Canon EOS-5D-Mark-IV-02.jpg Canon EOS-5D-Mark-IV-03.jpg Canon EOS-5D-Mark-IV-04.jpg Canon EOS 5D Mark IV (EF24-70mm F4L IS USM).jpg Canon EOS 5D Mark IV, Rückseite.JPG Canon EOS 5D Mark-IV and EF24-105mm F4L IS USM.jpg Canon EOS-1D X Mark II (01).jpg|Canon EOS-1D X Mark II Canon EOS-1D X Mark II.jpg Canon 80D 1.jpg|Canon EOS 80D Canon 80D-2.jpg Canon EOS 80D 5.JPG Canon EOS 80D 4.JPG Canon EOS 80D 3.JPG Canon EOS 80D 2.JPG Canon EOS 80D 1.JPG Canon 1300D.jpg|[[/Canon EOS 1300D/]] EOS750 front right.jpg|[[/Canon EOS 750D/]] WikiGrenier - Canon EOS 7D Mark II 01.jpg|[[/Canon EOS 7D Mark II/]] EOS760-4.jpg|[[/Canon EOS 760D/]] Canon EOS 6D (WG) with EF 24-70mm F4L IS USM.jpg|Canon EOS 6D Canon EOS 6D (WG) with EF 24-70mm F4L IS USM 02.jpg Canon EOS 5Ds 2015 CP+.jpg|Canon EOS 5Ds Canon EOS 5DS 01.jpg Canon EOS 5DS.jpg Canon EOS 8000D 2015 CP+.jpg|Canon EOS 8000D Canon EOS Kiss X8i 2015 CP+.jpg|Canon EOS Kiss X8i Canon EOS Kiss X8i s5.jpg Canon EOS Kiss X8i s4.jpg Canon EOS Kiss X8i s3.jpg Canon EOS Kiss X8i.jpg Canon EOS Kiss X8i s2.jpg Canon EOS 1200D 01.jpg|Canon EOS 1200D Canon EOS 1200D 02.jpg Canon EOS 1200D 03.jpg Canon EOS 1200D 04.jpg Canon EOS 1200D 05.jpg Canon EOS 1200D.jpg Camera EOS.jpg Canon EOS 1200D (12473443853).jpg Canon EOS 1200D (12473431463).jpg Canon EOS 1200D (12473767784).jpg Canon EOS 1200D (12473437733).jpg Canon EOS 1200D (12473411153).jpg Canon EOS 1200D (12473440983).jpg Canon EOS 1200D (12473254225).jpg Canon EOS 1200D (12473753654).jpg Canon EOS 1200D (12473428503).jpg Canon EOS 1200D (12473425803).jpg Canon EOS 1200D (12473408043).jpg Canon EOS 100D in a show-case.jpg|Canon EOS 100D Canon EOS 6D - Canon EF 24-105mm F4L IS USM.jpg|Canon EOS 6D Canon EOS 6D - Tamron SP 90mm F2.8 Di MACRO 1-1 VC USD (F004).jpg Canon EOS 6D body.jpg Canon EOS 6D digital SLR camera.jpg Canon EOS 6D front.JPG Canon EOS 6D body with Canon EF lenses.jpg Canon EOS 6D, rückseitig.JPG Canon EOS 6D, Front.JPG Canon EOS 6D, Draufsicht.JPG Canon EOS 6D front.JPG Canon 6D.jpg IMG.svg|Canon EOS 70D EOS70D 18-135STM top.jpg EOS70D 18-135STM display.jpg EOS70D 18-135STM.jpg EOS70D 18-135STM flash.jpg EOS70D 18-135STM front.jpg EOS70D top.jpg EOS70D left.jpg EOS70D right.jpg EOS70D front.jpg EOS70D back.jpg Canon EOS 70D (camera body front view).jpg Canon EOS 70D (camera body side view).jpg Canon EOS 70D (detail) (3).jpg Canon EOS 70D (detail) (2).jpg Canon EOS 70D (front view).jpg Canon EOS 70D (detail) (4).jpg Canon EOS 70D - Display (2).jpg Canon EOS 70D in live view mode.jpg Canon EOS 70D - Display.jpg Canon EOS 70D - Live view.jpg Canon EOS 70D (down).jpg Canon EOS 70D (detail).jpg Canon EOS 70D (side view).jpg Canon EOS 70D - (6).jpg Canon EOS 70D in live view mode (2).jpg Canon EOS 70D (rear view).jpg Canon EOS 70D (back view).jpg Canon EOS 70D - (3).jpg Canon EOS 70D - (1).jpg Canon EOS 70D - (5).jpg Canon EOS 70D - (2).jpg Canon EOS 70D - (4).jpg EOS70D 18-135STM flash crop.jpg Canon eos 70D med kvit blitstopp.jpg Canon EOS-1D X body.JPG|Canon EOS-1D X Canon EOS Rebl T5i 18-135mm Lens.jpg|[[/Canon EOS 700D|Canon EOS 700D = Canon Rebel T5i]] 700D Front.jpg Canon EOS 700D 18-55 Kit.jpg Canon 22.JPG Canon 14.JPG Canon 13.JPG Canon 11.JPG Canon 12.JPG Canon 21.JPG Canon 20.JPG Canon 19.JPG Canon 18.JPG Canon 23.JPG Canon 17.JPG Canon 16.JPG Canon 15.JPG MJH 1489.jpg MJH 1485.jpg MJH 1484 копия.jpg MJH 1483.jpg MJH 1480.jpg MJH 1475.jpg MJH 1477.jpg MJH 1474.jpg Canon EOS Rebel T5i.jpg Canon EOS Kiss X5.jpg|[[/Canon EOS 600D|Canon EOS 600D = Canon Rebel T3i]] EOS 650D Side.jpg|Canon EOS 650D EOS 650D display opened.jpg EOS 650D Top View.jpg EOS 650D Front.jpg EOS 650D.jpg Canon EOS 1100D cropped.jpg|[[/Canon EOS 1100D|Canon EOS 1100D = EOS Kiss 50]] Canon EOS Kiss X50 red.jpg Canon 1100d.jpg Canon EOS 1100D and Canon EOS 550D.jpg|Canon EOS 1100D and Canon EOS 550D Canon EOS 1100D with Canon EF-S 18-55mm F3.5-5.6 IS II.jpg 2012 Canon EOS 1D X 2012 CP+.jpg|[[/Canon EOS-1D X/]] 2012 Canon EOS 1D X 2013 CP+.jpg Canon EOS-1D X Canon EOS-1D X.jpg CANON NEW EOS kiss.jpg 2012 Canon EOS 1D C 2013 CP+.jpg|Canon EOS-1D C Canon EOS-1Ds 03.jpg|Canon EOS-1Ds Canon5d0195.jpg|EOS 5D Canon EOS 6D at Photokina.jpg|EOS 6D Canon EOS 6D.jpg|EOS 6D Canon EOS 6D, Front.JPG|EOS 6D Canon EOS 6D, Draufsicht.JPG|EOS 6D Canon EOS 6D, rückseitig.JPG|EOS 6D MJH 1387.jpg MJH 1398.jpg MJH 1390.jpg Canon EOS 1D Mark IV.jpg|Canon EOS 1D Mark IV EOS1D 4.jpg </gallery> = Objectifs à mise au point manuelle = '''Images à classer''' <gallery> Canon 17-40 f4 L lens02.jpg Canon 24mm MG 2022.jpg|24 mm FG Canon FT QL - lens.jpg|FL 50 mm f/1,4 Canon 50mm-macro MG 2024.jpg Canon FL 58mm.jpg|Canon FL 58 mm f/1,2 Canon FL 100mm F3.5 (48215608).jpg|[[/Canon FL 100 mm f/3,5/]] Canon 100mm macro MG 1959.JPG FL135mm f-2.5 (4759661142).jpg|[[/Canon FL 135 mm f/2,5/]] Canon 135mm F3.5 (14162169).jpg|Canon 135 mm f/3,5 Canon FL 200mm.jpg|FL 200 mm Canon-200mm MG 1077.JPG|200 mm FG EF 400 28 AH.jpg|Canon EF 400 </gallery> == Monture R (1959-1963) == <gallery> R35mm f-2.5 (4759024675).jpg|[[/Canon Super-Canomatic 35&nbsp;mm f/2,5 R/]] </gallery> == Monture FD == === Focales fixes === <gallery> Canon FD mount.jpg|Monture Canon FD Canon FD lens, manual.jpg|manuel Canon FD lens, automatic.jpg|automatique IMG.svg|[[/Canon FD 7,5 mm f/5,6/]] New Fisheye 7.5mm f-5.6 (4547482052).jpg|[[/Canon New Fisheye 7,5 mm f/5,6/]] New FD14mm f-2.8L (4315003359).jpg|[[/Canon New FD 14&nbsp;mm f/5,6 L/]] New FD14mm f-2.8L (4315740652).jpg IMG.svg|[[/Canon FD 15 mm f/2,8 Fisheye/]] IMG.svg|[[/Canon FD 17 mm f/4/]] Canon FD 20mm f-2.8 S.S.C. Lens (5783982195).jpg|[[/Canon FD 20 mm f/2,8/]] {{50}} IMG.svg|[[/Canon FD 24 mm f/1,4 L/]] New FD24mm f-1.4L (4625298369).jpg|[[/Canon New FD 24&nbsp;mm f/1,4 L/]] IMG.svg|[[/Canon FD 24 mm f/2/]] Canon FD lens DenisBarthel 2015 01.JPG|[[/Canon FD 24 mm f/2,8/]] {{75}} FD28mm f-2 S.S.C. (15248984717).jpg|[[/Canon FD 28 mm f/2 SSC/]] Canon 28mm f2.8 lens.jpeg|[[/Canon FD 28 mm f/2,8/]] Canon FD lens DenisBarthel 2015 08.JPG FD35mm f-2 (Yellowed Lens) (5455447683).jpg|[[/Canon FD 35 mm f/2/]] Canon FD 35mm f-2 S.S.C. Lens (5784536666).jpg IMG.svg|[[/Canon FD 35 mm f/2,8/]] Canon FD 35mm f-3.5 (8767195059).jpg|[[/Canon FD 35 mm f/3,5/]] IMG.svg|[[/Canon FD 50 mm f/1,2/]] IMG.svg|[[/Canon FD 50 mm f/1,2 L/]] Canon FD50mm F14.jpg|[[/Canon FD 50 mm f/1,4/]] Canon FD50mmF14 SSC.jpg|[[/Canon FD 50 1,4 SSC/]] Canon FD 50mm f-1.4 S.S.C. Lens (5778074077).jpg Canon NewFD 50mmF1.4.jpg|[[/Canon New FD 50 mm f/1,4/]] Canon NewFD 50mmF1.4 rear.jpg|New FD 50 mm f/1,4 Canon 50mm f1.8.jpeg|Canon 50 mm f/1,8 Canon FD lens rear.jpg|Canon FD 50 mm f/1.8 lens rear Normalobjektiv sst.jpg|50 mm f/1,8 CanonFDf1.8.jpg|50 mm f/1,8 Canon FD 50mm f-1.8 (8771964334).jpg Canon FD lens DenisBarthel 2015 13.jpg Canon FD lens DenisBarthel 2015 10.JPG Canon FD 50mm f-1.8 S.C. Lens (5778615656).jpg New FD50mm f-1.8 (5477953940).jpg|[[/Canon New FD 50 mm f/1,8/]] IMG.svg|[[/Canon FD 50 mm f/3,5 macro/]] FD55mm f-1.2 S.S.C. (4450337620).jpg|[[/Canon FD 55&nbsp;mm f/1,2 SSC/]] FD55mm f-1.2 S.S.C. Aspherical (4314998555).jpg|[[/Canon FD 55&nbsp;mm f/1,2 SSC Aspherical/]] FD55mm f-1.2 S.S.C. Aspherical (4315733996).jpg Canon FD 55mm f-1.2 S.S.C. Aspherical Lens (radioactive) (5770714676).jpg IMG.svg|[[/Canon 85 mm f/1,2 L|Canon 85 mm f/1,2 L]] Canon FD lens DenisBarthel 2015 02.JPG|[[/Canon FD 85 mm f/1,8/]] Canon FD 85mm f1.8 (7181834006).jpg A new acquisition (7171869118).jpg Canon FD 85mm f1.8 (7181836006).jpg Canon FD 85mm f-1.8 S.S.C. Lens (5770176081).jpg IMG.svg|[[/Canon FD 100 mm f/2/]] IMG.svg|[[/Canon FD 100 mm f/2,8/]] Canon FD 100mm f-2.8 S.S.C. Lens (5770715554).jpg Canon-FD-100mm-01.JPG|100 macro NewFD 100mmF2.jpg|[[/Canon New FD 100 mm f/2/]] IMG.svg|[[/Canon FD 100 mm f/4 macro/]] IMG.svg|[[/Canon FD 135 mm f/2/]] Canon FD lens DenisBarthel 2015 06.JPG|[[/Canon FD 135 mm f/2,8/]] Canon FD 135mm f3.5.jpeg|[[/Canon FD 135 mm f/3,5/]] Canon FD 135mm f3.5 S.C. I.jpg Canon FD lens DenisBarthel 2015 09.JPG IMG.svg|[[/Canon FD 200 mm f/2,8/]] IMG.svg|[[/Canon FD 200 mm f/4/]] IMG.svg|[[/Canon FD 200 mm f/4 macro/]] IMG.svg|[[/Canon FD 300 mm f/2,8 L/]] IMG.svg|[[/Canon FD 300 mm f/4 L/]] IMG.svg|[[/Canon FD 300 mm f/4/]] New FD 300mm F4 (264302274).jpg|[[/Canon New FD 300&,nsp:mm f/4/]] IMG.svg|[[/Canon FD 300 mm f/5,6/]] IMG.svg|[[/Canon FD 400 mm f/2,8 L/]] IMG.svg|[[/Canon FD 400 mm f/4,5 SSC/]] IMG.svg|[[/Canon FD 500 mm f/4,5 L/]] IMG.svg|[[/Canon FD 500 mm f/8 SSC à miroir/]] IMG.svg|[[/Canon FD 600 mm f/4,5/]] IMG.svg|[[/Canon FD 800 mm f/5,6 L/]] IMG.svg|[[/Canon FL 1 200 mm f/11 SSC/]] Canon Old FD Mount.jpg IMG.svg|[[/Canon TV-5.200 mm f/14/]] </gallery> === Focales variables === <gallery> New FD20-35mm f-3.5L (4547527276).jpg|[[/Canon New FD 20-35&nbsp;mm f/3,5 L/]] IMG.svg|[[/Canon FD 24-35 mm f/3,5 L|Canon FD 24-35 mm f/3,5 L]] IMG.svg|[[/Canon FD 28-50 mm f/3,5|Canon FD 28-50 mm f/3,5]] IMG.svg|[[/Canon FD 35-70 mm f/2,8-3,5|Canon FD 35-70 mm f/2,8-3,5]] Canon FD lens 35-70mm f3.5-4.5.jpg|[[/Canon FD 35-70 mm f/3,5-4,5|Canon FD 35-70 mm f/3,5-4,5]] Canon FD lens DenisBarthel 2015 05.JPG|[[/Canon FD 35-70 mm f/4|Canon FD 35-70 mm f/4]] Canon FD lens DenisBarthel 2015 07.JPG|[[/Canon FD 35-105 mm f/3,5|Canon FD 35-105 mm f/3,5]] New FD35-105mm f-3.5 (4631137678).jpg|[[/Canon New FD 35-105&nbsp;mm f/3,5/]] IMG.svg|[[/Canon FD 50-135 mm f/3,5|Canon FD 50-135 mm f/3,5]] Canon FD lens DenisBarthel 2015 04.JPG|[[/Canon FD 70-150 mm f/4,5|Canon FD 70-150 mm f/4,5]] IMG.svg|[[/Canon FD 70-210 mm f/4|Canon FD 70-210 mm f/4]] IMG.svg|[[/Canon FD 80-200 mm f/4|Canon FD 80-200 mm f/4]] New FD80-200mm f-4L (4547529206).jpg|[[/Canon New FD 80-200&nbsp;mm f/4 L/]] Canon FD lens DenisBarthel 2015 12.JPG|[[/Canon FD 100-200 f/5,6|Canon FD 100-200 f/5,6]] Canon FD lens DenisBarthel 2015 11.JPG IMG.svg|[[/Canon FD 85-300 mm f/5,6 SSC|Canon FD 85-300 mm f/5,6 SSC]] IMG.svg|[[/Canon FD 100-300 mm f/5,6|Canon FD 100-300 mm f/5,6]] </gallery> === Objectifs spéciaux === ==== Objectifs macro spéciaux ==== Ces objectifs dépourvus de bague hélicoïdale doivent être montés sur un soufflet. <gallery> IMG.svg|[[/Canon macro 20 mm f/3,5|Canon macro 20 mm f/3,5]] IMG.svg|[[/Canon macro 35 mm f/2,8|Canon macro 35 mm f/2,8]] </gallery> ==== Objectifs TS ==== Les objectifs ''Tilt-Shift'' (TS) permettent le décentrement et la bascule. <gallery> Canon Tiltshift-lens-Canon TS-E 17 mm F4L-01.jpg|[[/Canon TS-E 17 mm f/4|Canon TS-E 17 mm f/4]] TS35mm f-2.8 S.S.C. -Tilt- (4546921239).jpg|[[/Canon TS 35 mm f/2,8 SSC|Canon TS 35 mm f/2,8 SSC]] TS35mm f-2.8 S.S.C. (4546920199).jpg </gallery> = Objectifs à mise au point autofocus = == Objectifs Canon EF et convertisseurs de focale associés == === Généralités === Le sigle '''EF''', abréviation de ''Electronic focus'', signifie que le moteur de mise au point se situe à l'intérieur de l'objectif, ce qui est le cas pour tous les objectifs Canon modernes. Le premier objectif muni d'un moteur de mise au point ultrasonique est sorti en 1987. Le 29 janvier 2010 Canon a produit son 50 000 000e objectif EF, ce chiffre a été atteint avec la sortie d'un EF 100mm f/2.8L Macro IS USM. Les objectifs EF sont conçus pour couvrir le « plein format » 24 x 36. Ils ont été commercialisés pour remplacer la gamme FD lorsque sont apparus les appareils reflex 24 x 36 à mise au point automatique, les EOS. Ils peuvent aujourd'hui être utilisés sur les appareils reflex numériques plein format, mais aussi sur ceux qui sont munis d'un capteur dit « APS-C », avec un coefficient de correspondance de focale de 1,6 (un 50 mm utilisé en APS-C cadre comme ferait un 80 mm en 24 x 36). <gallery> Image:Canon EF lens distance scale.jpg Image:Canon EF lens FDRLS FMS.jpg|limitation de l'étendue de mise au point Image:EF-lens-mount-gel-holder.jpg|Monture Canon EF File:Canon EF L pins.jpg Image:Canon EF telephoto lens mount.jpg Image:Canon EF Zoom Lenses.jpg|Objectifs Canon EF Image:Canon EF 135mm f2L and 24-70mm f2.8L.jpg Image:EF bodymount EOS650.png|Monture Canon EF côté boîtier File:Canon EF EMD.jpg File:Canon EF USM lenses.jpg </gallery> ==== Focales fixes ==== <gallery> IMG.svg|[[/Canon EF 14 mm f/2,8 L USM|Canon EF 14 mm f/2,8 L USM]] (décembre&nbsp;1991 --> 2007) {{75}} Canon-14mm MG 2029.jpg|[[/Canon EF 14 mm f/2,8 L II USM|Canon EF 14 mm f/2,8 L II USM]] (20&nbsp;août&nbsp;2007) {{50}} Ef15mm.jpg|[[/Canon EF 15 mm f/2,8 Fisheye|Canon EF 15 mm f/2,8 Fisheye]] (1987-2011) {{100}} Canon-20mm MG 2033.jpg|[[/Canon EF 20 mm f/2,8 USM|Canon EF 20 mm f/2,8 USM]] (1992) {{100}} Canon EF 24 f1.4.jpg|[[/Canon EF 24 mm f/1,4 L II USM|Canon EF 24 mm f/1,4 L II USM]] (17 septembre 2008) {{25}} Canon 24mm MG 2022.jpg|[[/Canon EF 24 mm f/2,8|Canon EF 24 mm f/2,8]] (1988) Canon EF 24 IS USM.jpg|[[/Canon EF 24mm f/2,8 IS USM|Canon EF 24mm f/2,8 IS USM]] (7&nbsp;février&nbsp;2012) Canon EF 28mm f1.8 USM.jpg|[[/Canon EF 28 mm f/1,8 USM|Canon EF 28 mm f/1,8 USM]] Canon28mmf2-8.jpg|[[/Canon EF 28 mm f/2,8|Canon EF 28 mm f/2,8]] Canon EF 28mm.jpg Canon EF 28 IS.jpg|[[/Canon EF 28 mm f/2,8 IS USM|Canon EF 28 mm f/2,8 IS USM]] (7&nbsp;février&nbsp;2012) 35L.jpg|[[/Canon EF 35 mm f/1,4 L USM|Canon EF 35 mm f/1,4 L USM]] IMG.svg|[[/Canon EF 35 mm f/1,4 L II USM|Canon EF 35 mm f/1,4 L II USM]] (27 août 2015) {{75}} Canon 35mm f2.jpg|[[/Canon EF 35 mm f/2|Canon EF 35 mm f/2]] Canon 35mm f2 II.jpg|[[/Canon EF 35 mm f/2 II|Canon EF 35 mm f/2 II]] Canon EF35mm F2 IS USM.jpg|[[/Canon EF 35 mm f/2 IS USM|Canon EF 35 mm f/2 IS USM]] (6&nbsp;novembre&nbsp;2012) {{100}} Canon EF 40mm with cap.jpg|[[/Canon EF 40 mm f/2,8 Pancake|Canon EF 40 mm f/2,8 Pancake]] (8&nbsp;juin&nbsp;2012) {{75}} Canon EF 50mm f 1.0L.JPG|[[/Canon EF 50 mm f/1 L Ultrasonic|Canon EF 50 mm f/1 L Ultrasonic]] Canon-50mm-f12 MG 2028.jpg|[[/Canon EF 50 mm f/1,2 L USM|Canon EF 50 mm f/1,2 L USM]] (24&nbsp;août&nbsp;2006) Canon EF50mm F1.4 USM.jpg|[[/Canon EF 50 mm f/1,4 USM|Canon EF 50 mm f/1,4 USM]] {{75}} Canon EF 50mm f18.jpg|[[/Canon EF 50 mm f/1,8|Canon EF 50 mm f/1,8]] Canon EF 50mm 18 II.JPG|[[/Canon EF 50 mm f/1,8 II|Canon EF 50 mm f/1,8 II]] {{25}} Ef 50mm stm.JPG|[[/Canon EF 50 mm f/1,8 STM|Canon EF 50 mm f/1,8 STM]] (11&nbsp;mai&nbsp;2015) {{100}} Canon EF 50mm f2.5 Compact Macro, 2013 November.jpg|[[/Canon EF 50 mm f/2,5 Compact Macro|Canon EF 50 mm f/2,5 Compact Macro]] (1987) {{100}} Canon EF 85mm f12L horizontal.jpg|[[/Canon EF 85 mm f/1,2 L USM|Canon EF 85 mm f/1,2 L USM]] Canon 85mm f12L II.jpg|[[/Canon EF 85 mm f/1,2 L II USM|Canon EF 85 mm f/1,2 L II USM]] {{25}} Canon 85mm f1.8.jpg|[[/Canon EF 85 mm f/1,8 USM|Canon EF 85 mm f/1,8 USM]] Canon EF 100mm f2.0 lens, vertical.JPG|[[/Canon EF 100 mm f/2 USM|Canon EF 100 mm f/2 USM]] Canon 100mm Macro Lens non-USM.jpg|[[/Canon EF 100 mm f/2,8 Macro|Canon EF 100 mm f/2,8 Macro]] Canon EF100mm 2 8 macro.jpg|[[/Canon EF 100 mm f/2,8 Macro USM|Canon EF 100 mm f/2,8 Macro USM]] {{25}} Canon EF 100 f2.8 L Macro IS USM.jpg|[[/Canon EF 100 mm f/2,8 L Macro IS USM|Canon EF 100 mm f/2,8 L Macro IS USM]] (1er&nbsp;septembre&nbsp;2009) Canon EF135mm F2.0L USM.jpg|[[/Canon EF 135 mm f/2,0 L USM|Canon EF 135 mm f/2,0 L USM]] {{25}} Canon EF 135mm softfocus.jpg|[[/Canon EF 135 mm f/2,8 Softfocus|Canon EF 135 mm f/2,8 Softfocus]] Canon EF 180mm f3.5L Macro USM front angled with tripod ring rotated.jpg|[[/Canon EF 180 mm f/3,5 L Macro USM|Canon EF 180 mm f/3,5 L Macro USM]] {{25}} Canon EF 200mm f1.8 L USM.jpg|[[/Canon EF 200 mm f/1,8 L USM|Canon EF 200 mm f/1,8 L USM]] Canon EF 200mm f2 L IS USM.jpg|[[/Canon EF 200 mm f/2 L IS USM|Canon EF 200 mm f/2 L IS USM]] (24&nbsp;janvier&nbsp;2008) {{100}} Canon-200mm-2.8-L.jpg|[[/Canon EF 200 mm f/2,8 L II Macro USM|Canon EF 200 mm f/2,8 L II Macro USM]] Canon EF 300mm f2.8 img 1355.jpg|[[/Canon EF 300 mm f/2,8 L USM|Canon EF 300 mm f/2,8 L USM]] Canon EF 300mm f2.8L IS USM Lens.jpg|Canon EF 300 mm f/2,8 L IS USM Canon EF 300mm F2.8.jpg Canon EF 300 f2.8.jpg|[[/EF 300 mm f/2,8 L IS II USM|EF 300 mm f/2,8 L IS II USM]] (26&nbsp;août&nbsp;2010) Canon EF 300mm f4L IS USM.JPG|[[/Canon EF 300 mm f/4 L IS USM|Canon EF 300 mm f/4 L IS USM]] Canon 400mm f28 img 1243.jpg|[[/Canon EF 400 mm f/2,8 L IS USM|Canon EF 400 mm f/2,8 L IS USM]] Canon EF 400mm f2.8L IS II USM lens.jpg|[[/Canon EF 400 mm f/2,8 L IS II USM|Canon EF 400 mm f/2,8 L IS II USM]] (26&nbsp;août&nbsp;2010) {{25}} IMG.svg|[[/Canon EF 400 mm f/4 DO IS USM|Canon EF 400 mm f/4 DO IS USM]] 6&nbsp;septembre&nbsp;2000) Canon EF 400 DO II.jpg|[[/Canon EF 400 mm f/4 DO IS II USM|Canon EF 400 mm f/4 DO IS II USM]] Canon EF 400 f5.6.jpg|[[/Canon EF 400 mm f/5,6L USM|/Canon EF 400 mm f/5,6L USM]] Muss ich haben -) Canon EOS 1D.jpg|[[/Canon EF 500 mm f/4 L IS USM|Canon EF 500 mm f/4 L IS USM]] Canon EF 500.jpg|[[/Canon EF 500 mm f/4 L IS II USM|Canon EF 500 mm f/4 L IS II USM]] (7&nbsp;février&nbsp;2011) IMG.svg|[[/Canon EF 600 mm f/4 L IS USM|Canon EF 600 mm f/4 L IS USM]] Canon EF 600.jpg|[[/Canon EF 600 mm f/4 L IS II USM|Canon EF 600 mm f/4 L IS II USM]] (7&nbsp;février&nbsp;2011) Canon EF 600mm F4 L IS II USM cutaway 2012 CP+.jpg Canon EF 600mm cut.jpg Canon EF 800.jpg|[[/Canon EF 800 mm f/5,6 L IS USM|Canon EF 800 mm f/5,6 L IS USM]] (24&nbsp;janvier&nbsp;2008) IMG.svg|[[/Canon 1 200 mm f/5,6 L|Canon 1 200 mm f/5,6 L]] </gallery> ==== Focales variables ==== <gallery> Canon EF 8-15.jpg|[[/Canon EF 8-15 mm f/4 L Fisheye USM|Canon EF 8-15 mm f/4 L Fisheye USM]] (26&nbsp;août&nbsp;2010) {{100}} Canon EF 11-24mm F4L USM 01.jpg|[[/Canon EF 11-24 mm f/4 L USM|Canon EF 11-24 mm f/4 L USM]] (6 février 2015) {{100}} Canon 16-35 L IMG 0153.JPG|[[/Canon EF 16-35 mm f/2,8 L USM|Canon EF 16-35 mm f/2,8 L USM]] (26&nbsp;septembre&nbsp;2001) {{100}} Canon EF 16-35mm f2.8L USM II.jpg|[[/Canon EF 16-35 mm f/2,8 L II USM|Canon EF 16-35 mm f/2,8 L II USM]] (22&nbsp;février&nbsp;2007) {{100}} CP+ 2017 (33172365192).jpg|Canon EF 16-35 mm f/2,8 L III USM CP+ 2017 (33172367702).jpg Canon EF 16-35 f4.jpg|[[/Canon EF 16-35 mm f/4 L IS USM|Canon EF 16-35 mm f/4 L IS USM]] (13&nbsp;mai&nbsp;2014) {{100}} Canon EF 17-40mm f4L USM.jpg|[[/Canon EF 17-40 mm f/4 L USM|Canon EF 17-40 mm f/4 L USM]] (27&nbsp;février&nbsp;2003) {{100}} Canon EF 20-35mm f3.5-4.5 lens.JPG|[[/Canon EF 20-35 mm f/3,5-4,5 USM|Canon EF 20-35 mm f/3,5-4,5 USM]] (1993) {{100}} Fichier:Canon EF 22 55 mm f 4 5,6 USM.JPG|[[/Canon EF 22-55 mm f/4-5,6 USM|Canon EF 22-55 mm f/4-5,6 USM]] {{100}} Canon 24-70mm Lens.jpg|[[/Canon EF 24-70 mm f/2,8 L USM|Canon EF 24-70 mm f/2,8 L USM]] (29&nbsp;septembre&nbsp;2002) {{100}} Canon EF 24-70mm II.jpg|[[/Canon EF 24-70 f/2,8 L II USM|Canon EF 24-70 f/2,8 L II USM]] (7&nbsp;février&nbsp;2012) {{100}} Canon EF 24-70mm f4 IS.JPG|[[/Canon EF 24-70 mm f/4 L IS USM|Canon EF 24-70 mm f/4 L IS USM]] (6&nbsp;novembre&nbsp;2012) {{100}} Canon EF 24-85 f3.5-4.5 USM.jpg|[[/Canon EF 24-85 mm f/3,5-4,5 USM|Canon EF 24-85 mm f/3,5-4,5 USM]] (1996-c.2007) {{100}} Canon-24-105-f4L-lens-upright-uncapped-unhooded.jpg|[[/Canon EF 24-105 mm f/4 L IS USM|Canon EF 24-105 mm f/4 L IS USM]] (22&nbsp;août&nbsp;2005) {{100}} Canon- EF 24-105 STM.jpg|Canon EF 24–105 mm f/3,5-5,6 IS STM File:Canon EF 28-70 f2.8L USM.jpg|[[/Canon EF 28-70 mm f/2,8 L USM|Canon EF 28-70 mm f/2,8 L USM]] Canon EF 28-80mm f28-4 L.JPG|[[/Canon EF 28-80 mm f/2,8-4 L USM|Canon EF 28-80 mm f/2,8-4 L USM]] (avril 1989) File:Canon 28-80 v1.png|[[/Canon EF 28-80 mm f/3,5-5,6|Canon EF 28-80 mm f/3,5-5,6 1ère version]] Canon 28 80 small.jpg|[[/Canon EF 28-80 mm f/3,5-5,6|Canon EF 28-80 mm f/3,5-5,6]] {{50}} IMG.svg|[[/Canon EF 28-80 mm f/3,5-5,6 USM|Canon EF 28-80 mm f/3,5-5,6 USM]] (octobre&nbsp;1991) IMG.svg|[[/Canon EF 28-80 mm f/3,5-5,6 II|Canon EF 28-80 mm f/3,5-5,6 II]] (avril&nbsp;1999) IMG.svg|[[/Canon EF 28-80 mm f/3,5-5,6 II USM|Canon EF 28-80 mm f/3,5-5,6 II USM]] (octobre&nbsp;1993) IMG.svg|[[/Canon EF 28-80 mm f/3,5-5,6 III USM|Canon EF 28-80 mm f/3,5-5,6 III USM]] (août&nbsp;1995) IMG.svg|[[/Canon EF 28-80 mm f/3,5-5,6 IV USM|Canon EF 28-80 mm f/3,5-5,6 IV USM]] (septembre&nbsp;1996) IMG.svg|[[/Canon EF 28-80 mm f/3,5-5,6 V USM|Canon EF 28-80 mm f/3,5-5,6 V USM]] (avril&nbsp;1999) Canon EF 28-90mm F4-5.6 II USM.jpg|[[/Canon EF 28-90 mm f/4-5,6 II USM|Canon EF 28-90 mm f/4-5,6 II USM]] Canon EF 28-105mm.png|[[/Canon EF 28-105 mm f/3,5-4,5 USM|Canon EF 28-105 mm f/3,5-4,5 USM]] Canon EF 28-105mm F3.5-4.5 II USM.jpg|[[/Canon EF 28-105 mm f/3,5-4,5 II USM|Canon EF 28-105 mm f/3,5-4,5 II USM]] (30&nbsp;août&nbsp;2000) {{25}} IMG.svg|[[/Canon EF 28-105 mm f/4-5,6 USM|Canon EF 28-105 mm f/4-5,6 USM]] Canon EF28-135mm F3.5-5.6 IS USM.jpg|[[/Canon EF 28-135 mm f/3,5-5,6 IS USM|Canon EF 28-135 mm f/3,5-5,6 IS USM]] {{100}} IMG.svg|[[/Canon EF 28-200 mm f/3,5-5,6|Canon EF 28-200 mm f/3,5-5,6]] (30&nbsp;août&nbsp;2000) IMG.svg|[[/Canon EF 28-200 mm f/3,5-5,6 USM|Canon EF 28-200 mm f/3,5-5,6 USM]] (30&nbsp;août&nbsp;2000) Canon EF 28-300 L IS horizontal-view.jpg|[[/Canon EF 28-300 mm f/3,5-5,6 L IS USM|Canon EF 28-300 mm f/3,5-5,6 L IS USM]] (29&nbsp;janvier&nbsp;2004) {{75}} Canon EF 35-70mm F3.5-4.5 lens.jpg|[[/Canon EF 35-70 mm f/3,5-4,5|Canon EF 35-70 mm f/3,5-4,5]] Canon EF 35-70mm F3.5-4.5.jpg Canon Zoom Lens EF 35-70mm 1to3.5-4.5.jpg File:Canon EF 35-80 USM.jpg|[[/Canon EF 35-80 mm f/4,0-5,6 USM|Canon EF 35-80 mm f/4,0-5,6 USM]] Canon EF 35-80 III.jpg|[[/Canon EF 35-80 mm f/4,0-5,6 III|Canon EF 35-80 mm f/4,0-5,6 III]] Canon EF 35-350mm L USM.jpg|[[/Canon EF 35-350 mm f/3,5-5,6 L USM|Canon EF 35-350 mm f/3,5-5,6 L USM]] (1993) Canon EF 35-350mm f3.5-5.6L.jpg Canon EF-M f4.5-6.3 55-200mm.jpg|[[/Canon EF 55-200 mm f/4,5-5,6 II USM|Canon EF 55-200 mm f/4,5-5,6 II USM]] (20&nbsp;août&nbsp;2003) Canon EF 70-200 mm f2.8 L USM.jpg|[[/Canon EF 70-200 mm f/2,8 L USM|Canon EF 70-200 mm f/2,8 L USM]] (1995) {{100}} Canon EF 70-200mm f2.8 L IS USM.jpg|[[/Canon EF 70-200 mm f/2,8 L IS USM|Canon EF 70-200 mm f/2,8 L IS USM]] (1er&nbsp;août&nbsp;2001) {{75}} Pack Fañch - Canon EF 70-200 mm f-2.8 IS II USM - Facing right.jpg|[[/Canon EF 70-200 mm f/2,8 L IS II USM|Canon EF 70-200 mm f/2,8 L IS II USM]] (5&nbsp;janvier&nbsp;2010) {{100}} Canon EF70-200mm F4.0L USM.jpg|[[/Canon EF 70-200 mm f/4 L USM|Canon EF 70-200 mm f/4 L USM]] (septembre&nbsp;1999) {{100}} Canon EF 70-200mm f4 IS USM.jpg|[[/Canon EF 70-200 mm f/4 L IS USM|Canon EF 70-200 mm f/4 L IS USM]] (24&nbsp;août&nbsp;2006) {{100}} Canon EF 70-210mm f3.5-4.5 USM.JPG|[[/Canon EF 70-210 mm f/3,5-4,5 USM|Canon EF 70-210 mm f/3,5-4,5 USM]] Canon 70-210mm f4 7303.jpg|[[/Canon EF 70-210 mm f/4|Canon EF 70-210 mm f/4]] {{75}} Canon 70-300mm f4-5.6 is usm.jpg|[[/Canon EF 70-300 mm f/4-5,6 IS USM|Canon EF 70-300 mm f/4-5,6 IS USM]] (22&nbsp;août&nbsp;2005) Canon EF 70-300mm F4-5.6 L IS USM.jpg|[[/Canon EF 70-300 mm f/4-5,6 L IS USM|Canon EF 70-300 mm f/4-5,6 L IS USM]] (26&nbsp;août&nbsp;2010) Canon 70-300 DO MG 2020.jpg|[[/Canon EF 70-300 mm f/4,5-5,6 DO IS USM|Canon EF 70-300 mm f/4,5-5,6 DO IS USM]] (29&nbsp;janvier&nbsp;2004) Canon EF 75-300mm Lens.png|[[/Canon EF 75-300 mm f/4-5,6|Canon EF 75-300 mm f/4-5,6]] Canon EF 75-300 USM.jpg|[[/Canon EF 75-300 mm f/4-5,6 USM|Canon EF 75-300 mm f/4-5,6 USM]] Canon EF 75-300mm F4-5.6 II-flickr - by - MiNe (sfmine79).jpg|[[/Canon EF 75-300 mm f/4-5,6 II|Canon EF 75-300 mm f/4-5,6 II]] Canon EF 75-300 f-4-5.6 III.jpg|[[/Canon EF 75-300 mm f/4-5,6 III|Canon EF 75-300 mm f/4-5,6 III]] (avril 1999) {{50}} IMG.svg|[[/Canon EF 75-300 mm f/4-5,6 III USM|Canon EF 75-300 mm f/4-5,6 III USM]] Canon 75-300 IS.jpg|[[/Canon EF 75-300 mm f/4-5,6 IS USM|Canon EF 75-300 mm f/4-5,6 IS USM]] IMG.svg|[[/Canon EF 80-200 mm f/4,5-5,6|Canon EF 80-200 mm f/4,5-5,6]] IMG.svg|[[/Canon EF 80-200 mm f/4,5-5,6|Canon EF 80-200 mm f/4,5-5,6]] Canon 80-200mm.jpg|[[/Canon EF 80-200 mm f/4,5-5,6 II|Canon EF 80-200 mm f/4,5-5,6 II]] Canon80-200mm.jpg|[[/Canon EF 80-200 mm f/2,8 L|Canon EF 80-200 mm f/2,8 L]] (1989) {{75}} Canon 90 300 small.jpg|[[/Canon EF 90-300 mm f/4,5-5,6|Canon EF 90-300 mm f/4,5-5,6]] {{50}} IMG.svg|[[/Canon EF 90-300 mm f/4,5-5,6 USM|Canon EF 90-300 mm f/4,5-5,6 USM]] 100300mmf4.5.jpg|[[/Canon EF 100-300 mm f/4,5-5,6|Canon EF 100-300 mm f/4,5-5,6]] Canon 100-300.jpg|[[/Canon EF 100-300 mm f/4,5-5,6 USM|Canon EF 100-300 mm f/4,5-5,6 USM]] IMG.svg|[[/Canon EF 100-400 mm f/4,5-5,6 L|Canon EF 100-400 mm f/4,5-5,6 L]] Canon EF 100-400mm L USM lens.jpg|[[/Canon EF 100-400 mm f/4,5-5,6 L USM|Canon EF 100-400 mm f/4,5-5,6 L USM]] Canon EF 100-400mm f4.5-5.6L IS USM.jpg|[[/Canon EF 100-400 mm f/4,5-5,6 L IS USM|Canon EF 100-400 mm f/4,5-5,6 L IS USM]] Canon EF 100-400 F4.5-5.6L IS II USM.JPG|[[/Canon EF 100-400 mm f/4,5-5,6 L IS II USM|Canon EF 100-400 mm f/4,5-5,6 L IS II USM]] Canon EF 100-400mm F4.5-5.6L IS II USM.jpg Canon 200-400 1Dc-1.jpg|[[/Canon EF 200-400 mm f/4 L IS USM|Canon EF 200-400 mm f/4 L IS USM]] </gallery> ==== Convertisseurs de focale associés aux objectifs EF ==== <gallery> Canon Extender EF 1.4x II.JPG|[[/Canon Extender EF 1,4x II|Canon Extender EF 1,4x II]] {{50}} IMG.svg|[[/Canon Extender EF 1,4x III|Canon Extender EF 1,4x III]] (26&nbsp;août&nbsp;2010) IMG.svg|[[/Canon Extender EF 2x II|Canon Extender EF 2x II]] {{25}} Canon EXT 2.jpg|[[/Canon Extender EF 2x III|Canon Extender EF 2x III]] (26&nbsp;août&nbsp;2010) {{100}} Canon LIFE-SIZE Converter.jpg|[[/Canon EF Life-Size Converter|Canon EF Life-Size Converter]] </gallery> == Objectifs EF-S == Contrairement aux objectifs EF, les objectifs EF-S ne permettent pas de couvrir le « plein format » 24 x 36 mm, mais seulement le demi-format baptisé, de façon très discutable, APS-C. <gallery> Image:Canon EF 50mm F1.8 II and Canon EF-S 18-55mm F3.5-5.6 lenses.jpg|montures EF et EF-S Image:Canon EF-S lens mount.jpg|Monture EF-S File:Canon EF-S camera mount.jpg </gallery> === Focales fixes === <gallery> Canon EFS 24.jpg|[[/Canon EF-S 24 mm f/2,8 STM|Canon EF-S 24 mm f/2,8 STM]] Canon EF-S 24mm F2.8 STM 1.jpg Canon EF-S 24mm F2.8 STM 2.jpg EF-S 60mm Macro USM.jpg|[[/Canon EF-S 60 mm f/2,8 Macro USM|Canon EF-S 60 mm f/2,8 Macro USM]] (février&nbsp;2005) {{25}} </gallery> === Focales variables === <gallery> Canon EFS 10-18.jpg|[[/Canon EF-S 10-18 mm f/4,5-5,6 IS STM|Canon EF-S 10-18 mm f/4,5-5,6 IS STM]] (13&nbsp;mai&nbsp;2014) {{100}} Canon EF-S10-22mm F3.5-4.5 USM lens-cut out.png|[[/Canon EF-S 10-22 mm f/3,5-4,5 USM|Canon EF-S 10-22 mm f/3,5-4,5 USM]] Canon 10-22mm f3.5-4.5 USM EF-S.jpg|10-22 Canon EF-S 10-22.JPG|10-22 Canon EF-S 10-22mm f3.5-4.5 USM Hooded.jpg Canon 10-22 (11755426353).jpg Canon EF-S 10-22mm F3.5-4.5 USM (left) - Tamron AF18-250mm F3.5-6.3 Di-II LD Aspherical (IF) Macro (right).png|10-22 Eine Kleine Lightbox (3524454273).jpg Canon 15 85 DSCF1009EC.jpg|[[/Canon EF-S 15-85 mm f/3,5-5,6 IS USM|Canon EF-S 15-85 mm f/3,5-5,6 IS USM]] (1&nbsp;septembre&nbsp;2009) {{100}} Canon EF-S 15-85mm on Canon EOS 500d.jpg|15-85 Canon EF-S 17-55mm 02.JPG|[[/Canon EF-S 17-55 mm f/2,8 IS USM|Canon EF-S 17-55 mm f/2,8 IS USM]] (2006) {{25}} Canon 17-85mm is lens.jpg|Canon EF-S 17-85 mm Canon EF-S 17-85mm f4-5.6 IS USM.jpg|[[/Canon EF-S 17-85 mm f/4-5,6 IS USM|Canon EF-S 17-85 mm f/4-5,6 IS USM]] (19&nbsp;août&nbsp;2004) {{100}} Canon 18 55 small.jpg|[[/Canon EF-S 18-55 mm f/3,5-5,6 I USM|Canon EF-S 18-55 mm f/3,5-5,6 I USM]] Canon EF-S 18-55mm.png Canon EF-S 18-55mm F3.5-5.6 II 01 cropped.jpg|Canon EF-S 18-55 mm f/3,5-5,6 II Canon EF-S18-55mm F3.5-5.6 II USM.jpg|[[/Canon EF-S 18-55 mm f/3,5-5,6 II USM|Canon EF-S 18-55 mm f/3,5-5,6 II USM]] {{75}} Canon EF-S 18-55mm F3.5-5.6 IS lens.JPG|[[/Canon EF-S 18-55 mm f/3,5-5,6 IS|Canon EF-S 18-55 mm f/3,5-5,6 IS]] (20&nbsp;août&nbsp;2007) {{25}} Canon EF-S 18-55 mm F3.5-5.6 IS II lens.jpg|Canon EF-S 18-55 mm f/3,5-5,6 IS II Canon EFS 18-55 IS II.jpg Canon EF-S 18-55mm III.jpg|Canon EF-S 18-55 mm III Canon EFS 18-55 III.jpg Canon EFS 18-55 STM.jpg|[[/Canon EF-S 18–55 mm f/3,5-5,6 IS STM|Canon EF-S 18–55 mm f/3,5-5,6 IS STM]] Canon EF-S 18-135mm IS.JPG|[[/EF-S 18-135 mm f/3,5-5,6 IS|EF-S 18-135 mm f/3,5-5,6 IS]] (1&nbsp;septembre&nbsp;2009) Canon EFS 18-135 STM.jpg|[[/Canon EF-S 18–135 mm f/3,5–5,6 IS STM|Canon EF-S 18–135 mm f/3,5–5,6 IS STM]] Canon Zoom Lens EF-S 18-200 mm 1-3.5-5.6, 72mm.jpg|Canon EF-S 18-200 mm f/3,5-5,6 Canon EF-S 18-200mm lens side.jpg|[[/Canon EF-S 18-200 mm f/3,5-5,6 IS|Canon EF-S 18-200 mm f/3,5-5,6 IS]] (2008) {{25}} Canon 55-250mm IS.JPG|[[/Canon EF-S 55-250 mm f/4-5,6 IS|Canon EF-S 55-250 mm f/4-5,6 IS]] (20&nbsp;août&nbsp;2007) {{25}} Canon EF-S 55-250 mm F4-5.6 IS II lens.JPG|[[/Canon EF-S 55-250 mm f/4-5,6 IS II|Canon EF-S 55-250 mm f/4-5,6 IS II]] (2011) {{50}} CanonEF-S55-250 IS STM.jpg|[[/Canon EF-S 55-250 mm f/4-5,6 IS STM|Canon EF-S 55-250 mm f/4-5,6 IS STM]] (22&nbsp;août&nbsp;2013) {{75}} </gallery> == Objectifs EF-M == <gallery> Canon EF Bajonett vs EF-M Bajonett.jpg|Baïonnettes EF et EF-M </gallery> === Focales fixes === <gallery> File:Canon EF-M f2.0 22mm.jpg|[[/Canon EF-M 22 mm f/2 STM|Canon EF-M 22 mm f/2 STM]] (23&nbsp;juillet&nbsp;2012) </gallery> === Focales variables === <gallery> Canon EF-M f4.5-5.6 11-22mm.jpg|[[/Canon EF-M 11-22 mm f/4-5,6 IS STM|Canon EF-M 11-22 mm f/4-5,6 IS STM]] (6&nbsp;juin&nbsp;2013) Canon EF-M f3.5-5.6 18-55mm.jpg|[[/Canon EF-M 18-55 mm f/3,5-5,6 IS STM|Canon EF-M 18-55 mm f/3,5-5,6 IS STM]] (23&nbsp;juillet&nbsp;2012) {{100}} Canon EF-M f4.5-6.3 55-200mm.jpg|[[/Canon EF-M 55-200 mm f/4,5-6,3 IS STM|Canon EF-M 55-200 mm f/4,5-6,3 IS STM]] (17&nbsp;juin&nbsp;2014) {{100}} </gallery> === Convertisseurs de focale === <gallery> Canon EF EF-M Converter.jpg|Canon EF EF-M Canon Extender EF 2x III 20140217.jpg|Canon Extender EF 2x III Canon Extender EF 2x III, 2017-02-05, DD FS.jpg </gallery> == Objectifs spéciaux == === MP-E === <gallery> Canon MP-E 65mm 1-5x macro f2.8.jpg|Canon MP-E 65 mm Canon Objektiv MP-E 65mm mit Kamera EOS 600D (fcm).jpg Canon Objektiv MP-E 65mm mit Kamera EOS 600D 02 (fcm).jpg Canon Objektiv MP-E 65mm mit Kamera EOS 600D 03 (fcm).jpg Canon Objektiv MP-E 65mm mit Kamera EOS 600D 04 (fcm).jpg Canon Objektiv MP-E 65mm mit Kamera EOS 600D 05 (fcm).jpg Canon MP-E with Sony VCL-DH1758 in front of it.jpg </gallery> === Série TS === Il s'agit d'objectifs spéciaux dotés de possibilités de [[bascule]] et de [[décentrement]]. <gallery> File:TS-E 17mm f4L.jpg|[[/Canon TS-E 17 mm f/4 L|Canon TS-E 17 mm f/4 L]] (2009) {{75}} Canon TS-E24mm F3.5L.jpg|[[/Canon TS-E 24 mm f/3,5 L|Canon TS-E 24 mm f/3,5 L]] Canon TS-E 24mm f3.5L II.jpg|[[/Canon TS-E 24 mm f/3,5 L II|Canon TS-E 24 mm f/3,5 L II]] (juillet 2009) {{75}} Canon TSE 45.jpg|[[/Canon TS-E 45 mm f/2,8|Canon TS-E 45 mm f/2,8]] Canon TSE 90.jpg|[[/Canon TS-E 90 mm f/2,8|Canon TS-E 90 mm f/2,8]] </gallery> = Flashes = == Flashes magnésiques == <gallery> Canon AT-1 with Quint flash gun (3852706267).jpg|Quint flash gun sur Canon AT-1 </gallery> == Flashes électroniques == <gallery> File:Canon Canonet GIII QL17.jpg|Canolite D IMG.svg|[[/Canon Speedlite 133A|Canon Speedlite 133A]] (avant 1983) {{25}} IMG.svg|[[/Canon Speedlite 155A|Canon Speedlite 155A]] (avant 1983) {{25}} IMG.svg|[[/Canon Speedlite 177A|Canon Speedlite 177A]] (avant 1983) {{25}} File:Speedlite188a vorn.jpg|[[/Canon Speedlite 188A|Canon Speedlite 188A]] (avant 1983) {{25}} IMG.svg|[[/Canon Speedlite 199A|Canon Speedlite 199A]] (avant 1983) {{25}} IMG.svg|[[/Canon Speedlite ML-1|Canon Speedlite ML-1]] (avant 1983) {{25}} File:Canon A-1 mit Speedlite 299T.jpg|Speedlite 299T </gallery> == Série E == <gallery> Image:IMG.svg|[[/Speedlite 200E|Speedlite 200E]] </gallery> == Série EG == <gallery> Image:IMG.svg|[[/Speedlite 480EG|Speedlite 480EG]] </gallery> == Série EX == <gallery> IMG.svg|[[/Canon Speedlite 220EX/]] IMG.svg|[[/Canon Speedlite 270EX/]] (25&nbsp;mars&nbsp;2009) IMG.svg|[[/Canon Speedlite 270EX II/]] (2011, 230 €) IMG.svg|[[/Canon Speedlite 320EX II/]] (2011, 290 €) Canon Speedlite 380EX.jpg|[[/Canon Speedlite 380EX/]] Canon 420EX flash.jpg|[[/Canon Speedlite 420EX/]] Canon 421EX flash.jpg|Canon 421EX Canon 422EX flash on PowerShot G12.jpg|Canon 422EX Canon speedlite 430ex.jpg|[[/Canon Speedlite 430EX/]] Canon Speedlite 430EX First Generation Flash Unit.JPG Canon Speedlite 430EX II front.jpg|Canon Speedlight 430EX II Canon Speedlite 430EX II rear.jpg|Canon Speedlight 430EX II IMG.svg|[[/Canon Speedlite 540EX/]] Canon Speedlite 550EX flash.jpg|[[/Canon Speedlite 550EX/]] Canon 550EX.jpg 0577 Canon EOS 650 body and EZ430EZ strobe (9122100471).jpg|Canon Speedlite 430EZ Canon Speedlite 580EX II Front.jpg|[[/Canon Speedlite 580EX/]] Canon Speedlite 580EX II Front.jpg|580 EX 20150223 2006 WMAT 0999.jpg|Canon Speedlite 600EX-RT Canon Macro Ring Lite MR-14EX 2017-02-05, DD FS.jpg|Canon Macro Ring Lite MR-14EX </gallery> == Série EZ == <gallery> File:Canon 540EZ back.JPG|[[/Speedlite 540EZ|Speedlite 540EZ]] Image:IMG.svg|[[/Speedlite 430EZ|Speedlite 430EZ]] Image:IMG.svg|[[/Speedlite 300EZ|Speedlite 300EZ]] </gallery> == Flashes spéciaux == <gallery> Image:Sigma 150mm with Canon MT 24-EX.jpg|[[/Macro Twin Lite MT-24EX|Macro Twin Lite MT-24EX]] Image:IMG.svg|[[/Macro Ring Lite MR-14EX|Macro Ring Lite MR-14EX]] </gallery> == Télécommande de flash == <gallery> File:Canon ST-E2 rear.jpg|[[/Speedlite Transmitter ST-E2|Speedlite Transmitter ST-E2]] File:Canon ST-E2 front.jpg|Speedlite Transmitter ST-E2 </gallery> = Accessoires et autres matériels = == Batteries == <gallery> Batería Canon LP-E6N, 2017-02-05, DD FS.jpg|LP-E6N </gallery> == Viseurs d'angle == <gallery> IMG.svg|viseur d'angle A2 (avant 1983) IMG.svg|viseur d'angle B (avant 1983) File:Winkelsucher sst.jpg|Canon Angle Finder C </gallery> == Moteurs == <gallery> IMG.svg|Power Winder-A : moteur du [[Canon AE-1]]) et d'autres boîtiers de la série A, 2 images/s, alimentation par 4 piles AA 1,5 V, pas de télécommande ni d'alimentation extérieure, 300 g avec piles (avant 1983) Image:Canon Winder A2.jpg|Power Winder A-2 destiné au [[Canon AE-1]]) et à d'autres boîtiers de la série A, vue par vue ou rafale 2 images/s, alimentation par 4 piles AA 1,5 V, prise mini-jack pour télécommande (avant 1983) IMG.svg|Motor Drive MA, fonctionnement vue par vue ou à cadence variable de 3,5 ou 5 images/s, alimentation par bloc-accus MA ou par boîtier de piles MA (12 piles AA 1,5 V, second déclencheur pour les cadrages verticaux </gallery> == Dos dateurs == <gallery> Wikicommons canon databack.jpg|Canon Data Back A, dos dateur pour Canon séries A sauf AV-1 et F-1 File:Wikicomons canon databack 1.jpg </gallery> == Télécommandes == <gallery> Canon tc 80n3 remote control.jpg|TC 80n3 remote control Cable release (8767343663).jpg Canon RC-6 Wireless Remote Control 01.jpg|Canon RC-6 Wireless Remote Control Canon RC-6 Wireless Remote Control 02.jpg Canon Remote Control RC-6.JPG Control remoto Canon RC-6, 2017-02-05, DD FS.jpg 2007-11-06 Canon EOS Remote Cord.jpg|Câble de télécommande pour appareils EOS CanonRC-1.JPG|Télécommande infrarouge RC-1 Canon Remote Switch RS-60 E3.JPG|Canon Remote Switch RS-60 E3 Canon WL-D89.JPG|Canon WL-D89 20150223 1959 WMAT 0994.jpg|Canon RS-80N3 </gallery> == Colliers de pied == <gallery> Canon Tripod Mount Ring B (B) back angled.jpg Canon Tripod Mount Ring B (B) keying with lens.jpg Canon Tripod Mount Ring B (B) front angled.jpg Canon Tripod Mount Ring B (B) bottom.jpg </gallery> == Bouchons == <gallery> File:Canon EFS 18-55 mm lens cap.jpg </gallery> == Boîtiers étanches == <gallery> Canon WP-DC600 1.jpg|Canon WP-DC600 Canon WP-DC600 2.jpg Canon WP-DC600 3.jpg Canon WP-DC600 4.jpg Canonv2-front hg.jpg Canonv2-back hg.jpg </gallery> == Scanners == <gallery> Scanner fotografico per pellicole a colori - Museo scienza tecnologia Milano 14824.jpg|Canon CanoScan FS2710 (1999) Scanner fotografico per pellicole a colori - Museo scienza tecnologia Milano 14824 02.jpg Scanner fotografico per pellicole a colori - Museo scienza tecnologia Milano 14824 03.jpg Scanner fotografico per pellicole a colori - Museo scienza tecnologia Milano 14824 05.jpg Scanner fotografico per pellicole a colori - Museo scienza tecnologia Milano 14824 07.jpg Scanner fotografico per pellicole a colori - Museo scienza tecnologia Milano 14824 08.jpg Canon CanoScan 9000F Mark II.jpg|Canon CanoScan 9000F Mark II </gallery> == Imprimantes == <gallery> Image:IMG.svg|[[/Canon BJC-210|Canon BJC-210]] Image:IMG.svg|[[/Canon BJC-1000|Canon BJC-1000]] Image:IMG.svg|[[/Canon BJC-6000|Canon BJC-6000]] Image:IMG.svg|[[/Canon BJC-2100|Canon BJC-2100]] Image:IMG.svg|[[/Canon BJC-2110|Canon BJC-2110]] Image:IMG.svg|[[/Canon PIXMA IP1500|Canon PIXMA IP1500]] Image:IMG.svg|[[/Canon PIXMA IP4000|Canon PIXMA IP4000]] Image:IMG.svg|[[/Canon PIXMA IP6000D|Canon PIXMA IP6000D]] Image:IMG.svg|[[/Canon i9950|Canon i9950]] Image:Selphy 7466.jpg|[[/Canon Selphy ES1|Canon Selphy ES1]] Image:Selphy 7465.jpg </gallery> == Bonnettes == Elles sont utilisées pour la [[Photographie/Techniques scientifiques/Photographie rapprochée|proxiphotographie]]. * '''Canon 250D''' : doublet achromatique de 4 dioptries, diamètres 52-58 mm, 100 à 150 € * '''Canon 500D''' : doublet achromatique de 2 dioptries, diamètres 52-58-72-77 mm, 100 à 200 € selon le diamètre * '''Canon 500''' : 2 dioptries, diamètres 52-58-72-77 mm, 50 à 70 € <gallery> Image:Close-Up lens Canon 500D 58 mm.jpg </gallery> == Bagues et tubes allonges == Ces dispositifs sont utilisés pour la [[photographie rapprochée]] et pour la [[macrophotographie]]. Les tubes allonges à vis, au pas Leica, sont aujourd'hui discontinués ; ils existaient en différentes longueurs : 6, 9, 12, 25, 50, 75, 100, 150 et 200 mm. Les tubes allonges FD 25 U et FD 50 U étaient destinés aux objectifs du système FD ; leurs longueurs étaient respectivement de 25 et 50 mm. * '''Canon EF 12 II''' : longueur 12 mm, 120 € * '''Canon EF 25 II''' : longueur 25 mm, 210 € <gallery> File:Set of extension tubes Canon.jpg File:Canon Extension Tubes.JPG </gallery> == Soufflets == <gallery> IMG.svg|Soufflet M (avant 1983) : rail unique, pas de transmission de la commande du diaphragme IMG.svg|Soufflet FL (avant 1983) : équipé d'un rail de mise au point et d'un dispositif de transmission du diaphragme IMG.svg|Soufflet automatique (avant 1983) : mêmes caractéristiques que le soufflet FL, avec en plus la possibilité de monter un objectif en position inversée, sans bague intermédiaire, grâce à une platine porte-objectif réversible. Une platine photographique, sorte de petit statif, pouvait en outre recevoir ce soufflet </gallery> == Duplicateur de diapositives == Canon a fabriqué (avant 1983) un duplicateur de diapositives qui venait se fixer à l'avant du soufflet FL. Il permettait le décentrement vertical == Bagues d'inversion et autres bagues pour la photographie rapprochée == Les '''bagues d'inversion''' classiques permettent de monter les objectifs à l'envers, ce qui peut être utile pour la [[photographie rapprochée]]. Le fonctionnement devient alors entièrement manuel puisque les liaisons qui permettent de faire fonctionner le diaphragme, l'autofocus, etc. Elles n'existent apparemment plus dans la marque Canon pour les objectifs autofocus EF et EF-S mais de nombreux montages plus ou moins exotiques sont possibles vi les bagues d'adaptation proposées par divers fabricants : par exemple, on peut monter une bague Canon vers Minolta MD, puis une bague d'inversion Minolta MD vers un filetage de 55 mm sur lequel on monte alors un objectif Minolta 58 mm f/1,4 ou un objectif macro Tamron Adaptall 90 mm f/2,5 macro. La '''bague spéciale macro''' vendue dans les années 1980 par Canon permettait de conserver la présélection du diaphragme en utilisant un objectif inversé. == Projecteurs de diapositives == <gallery> File:IMG.svg|[[/Canon Autoslide 500 EF|Canon Autoslide 500 EF]](1969) {{25}} </gallery> == Fourre-tout et sacs == Canon fournit des étuis et sacs tout-prêt pour ses appareils, ainsi que le fourre-tout EOS Classic. = Cinéma = == Caméras 8 mm == * Cine 8-T * Cine Canonet 8 * Cine Zoom 512 * Motor Zoom 8 EEE * Reflex Zoom 8 * Reflex Zoom 8-2 * Reflex Zoom 8-3 == Caméras Super 8 == * AF 514 XL-S * AF 310 XL * AF 310 XL-S * Auto Zoom 318 M * Auto Zoom 512 Xl Electronic * Auto Zoom 518 Super 8 * Auto Zoom 518 SV * Auto Zoom 814 Electronic * Auto Zoom 814 Super 8 * Auto Zoom 1014 Electronic * Auto Zoom 1218 Super 8 * Auto Zoom 2018 Electronic (prototype) * Zoom 250 Super 8 * Zoom 318 Super 8 * Zoom 518 Super 8 * Zoom DS-8 (double super 8mm camera) * 310 XL * 312 XL-S * 514 XL * 514 XL-S * 814 XL Electronic * 814 XL-S * 1014 XL-S == Matériels divers == <gallery> Canon F-1 with Magnifier-R (15234460424).jpg|Loupe de visée Magnifier-R Canon Magnifier-R (15857007495).jpg Canon F-1 with Magnifier-R (15234461414).jpg Canon Magnifier-R (15854747671).jpg Baterry grip & 2 cassettes.jpg Adattatore per pellicola - Museo scienza tecnologia Milano 14825.jpg|Adaptateurs pour pellicules sur camescopes ou appareils </gallery> == Camescopes == <gallery> File:2012 Canon EOS C100 2013 CP+.jpg|Canon EOS C100 </gallery> = Annexes = == Bibliographie == == Liens == * http://www.canon.com/camera-museum/camera/index.html {{Ph Fabricants}} 9ccfdwd1jvq214roo0oufmkjbylidrk Python pour le calcul scientifique/Éléments de programmation 0 72883 767584 767496 2026-06-08T10:59:44Z Cdang 1202 /* Substitution de variables */ :ne 767584 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 }} : {{lien web | url = https://docs.python.org/3/library/string.html | titre = <code>string</code> — Common string operations | site = Python Documentation | consulté le = 2026-06-05 }} ==== 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 un nombre en notaiton scientifique (exponentielle), on utilise <code>.''n''e</code>. 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, ou bien <code>-1</code> si la sous-chaîne est absente ; * <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 == === Généralités === 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. === Avec Tk === 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}} === Avec PyQt === Le module PyQt (prononcer \ˈpaɪ.kjut\) permet d'utiliser la bibliothèque Qt dévelopée par Riverbank Computing. Il permet notamment de créer des interfaces graphiques. La communication entre objets Qt se fait par une mécanismes de « signal/emplacement » ''({{lang|en|signal/slot}})''. Un emplacement ''({{lang|en|slot}})'' est une fonction ''({{lang|en|callable}})'' ; un signal est un attribut d'un objet. Si l'attribut signal est défini pour l'emplacement, alors on dit que l'emplacement est relié à un signal. Par exemple, un objet <code>QPushButton</code> dispose du signal <code>clicked</code> qui est émis lorsque l'on clique dessus ; on peut ainsi faire exécuter un emplacement (fonction appelable) <code>action()</code> lorsque l'on clique sur le bouton par le biais du signal <code>clicked</code> : <syntaxhighlight lang="python"> from PyQt5.QtWidgets import QPushButton bouton = QPushButton("Appuies-moi dessus") button.clicked.connect(action()) </syntaxhighlight> {{voir|{{lien web |url=https://www.riverbankcomputing.com/static/Docs/PyQt6/ |titre=Reference guide PyQt6 |site=Riverbank Computing|consulté le=2026-0604}} }} {{...}} == 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éfinition 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. Concernant les séparateurs particuliers : * 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 le séparateur est un nombre arbitraire d'espaces et/ou de tabulation, on ne définit aucun séparateur : <code lang="python">contenu = [item.split() 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> Par défaut, la fonction <code>pd.read_csv()</code> considère que le séparateur est une virgule, et la commande <code>pd.read_table()</code> que c'est une tabulation. On peut définir le séparateur avec le paramètre <code>sep</code> : <syntaxhighlight lang="python"> donnees = pd.read_csv("tableau.csv", sep=";") </syntaxhighlight> On peut utiliser les séparateurs spéciaux : * <code>\t</code> : tabulation ; * <code>\s+</code> : nombre arbitraire d'espaces. On peut par ailleurs utiliser les paramètres suivants : * <code>dialect</code> : syntaxe du fichier, par exemple <code>dialect = "excel"</code> ; * <code>nrows</code> (entier) : nombre de lignes lues ; * <code>skiprows</code> (entier) : nombre de lignes sautées (non lues) en début de fichier ; * <code>header</code> (entier) : numéro de ligne utilisé pour l'en-tête, par exemple <code>header = 0</code> pour la première ligne ; * <code>skip_blank_lines</code> (booléen) : si la valeur est vraie (<code>True</code>), ne lit pas les lignes vide ; sinon, met une valeur <code>nan</code>. Par exemple : <syntaxhighlight lang="python"> donnees1 = pd.read_csv("tableau.csv", nrows=1, sep="\s+").to_numpy() donnees2 = pd.read_csv("tableau.csv", skiprows=3, sep="\s+").to_numpy() </syntaxhighlight> {{voir|{{lien web |url=https://pandas.pydata.org/docs/user_guide/io.html |titre=IO tools (text, CSV, HDF5, …) |site=Pandas |consulté le=2026-05-06}} }} == 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. == Recommandations == Les recommandations de programmation sont générales et ne sont en grande partie pas spécifiques à Python. {{voir|[[Découvrir_Scilab/Programmation#Recommandations]]}} == 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)]] 1l8iwl1r2cy4i8fdjb676py78z8gh3h Python pour le calcul scientifique/Statistiques 0 72914 767580 762138 2026-06-08T09:33:37Z Cdang 1202 /* Avec SciPy */ orth 767580 wikitext text/x-wiki Le module NumPy fournit des fonctions statistiques. Rappelons que dorénavant les programmes commencent tous par : <syntaxhighlight lang="python"> #!/usr/bin/python3 import numpy as np import matplotlib.pyplot as plt </syntaxhighlight> == Méthodes de matrices == Rappel : la classe des matrices ''(ndarray)'' dispose de méthodes permettant de calculer des statistiques sur les éléments des matrices : * <code>.min()</code> : minimum des valeurs ; * <code>.max()</code> : maximum des valeurs ; * <code>.ptp()</code> : écart amplitude « max – min » ''({{lang|en|peak to peak}})'' ; * <code>.mean()</code> : moyenne ; * <code>.std()</code> : écart type ''({{lang|en|standard deviation}})''. == Statistiques descriptives == NumPy fournit la fonction <code>np.quantile()</code> qui détermine les quantiles avec la syntaxe : <syntaxhighlight lang="python"> np.quantile(M, q) </syntaxhighlight> où <code>M</code> est une matrice (ou une liste, un n-uplet, bref un itérable de nombres) et <code>q</code> est un quantile ou un vecteur de quantiles sous la forme d'un nombre entre 0 et 1. Par exemple, pour avoir les quartiles : <syntaxhighlight lang="python"> np.quantile(M, [0, 0.25, 0.5, 0.75, 1]) </syntaxhighlight> Si un des éléments de la matrice est un NaN, le résultat est un NaN. Pour éviter cela, on peut utiliser la fonction <code>np.nanquantile()</code> qui ignore les NaN. Les fonctions <code>np.percentile()</code> et <code>np.nanpercentile()</code> donnent les centiles ; on indique alors le centile que l'on veut sous la forme d'un nombre entier entre 0 et 100. Nous disposons également des fonctions suivantes : * <code>np.amin()</code>, <code>np.nanmin()</code> : minimum ; * <code>np.amax()</code>, <code>np.nanmax()</code> : maximum ; * <code>np.ptp()</code> : amplitude. Notons que pour toutes les fonctions, il est possible d'indiquer l'axe selon lequel on effectue le calcul. Par exemple, <syntaxhighlight lang="python"> M = np.arange(9).reshape(3, 3) # [[0, 1, 2] # [3, 4, 5] # [6, 7, 8]] print(np.quantile(M, [0.25, 0.5], 0)) # [[1.5 2.5 3.5] : 1er quartile des colonnes # [3. 4. 5. ]] : médiane des colonnes print(np.quantile(M, [0.25, 0.5], 1)) # [[0.5 3.5 6.5] : 1er quartile des lignes # [1. 4. 7. ]] : médiane des lignes </syntaxhighlight> == Indicateurs de position et de dispersion == NumPy fournit les indicateurs de tendance centrale suivants : * <code>np.mean()</code> et <code>np.nanmean()</code> : moyenne ; * <code>np.average()</code> et <code>np.nanaverage()</code> : moyenne pondérée ; la syntaxe est <code>np.average(M, axe, poids)</code> ou bien <code>np.average(M, weights = poids)</code> (voir ci-après) ; * <code>np.median()</code> et <code>np.nanmedian()</code> : médiane. En terme de performances, la fonction <code>np.mean()</code> est équivalente à la méthode <code>M.mean()</code> et à la fonction <code>np.average()</code> sans poids (ce qui équivaut donc à la moyenne). En revanche, la fonction <code>np.nanmean()</code> est plus lente, de même que la fonction <code>np.average()</code> lorsque l'on utilise des poids (même s'ils sont tous égaux à 1). Comme précédemment, on peut indiquer l'axe (si l'on veut évaluer les valeurs par colonne ou par ligne). Pour la moyenne pondérée, on utilise une matrice poids P de même dimension que la matrice de valeurs M, <code>P[i, j]</code> étant le poids associé à la valeur <code>M[i, j]</code>. Par exemple, si l'on veut évaluer la moyenne pondérée pour toutes les valeurs de M (pas d'axe), on peut écrire une des deux solutions suivantes : <syntaxhighlight lang="python"> np.average(M, None, P) # l'axe est le 2e paramètre np.average(M, weights = P) </syntaxhighlight> NumPy fournit également les indicateurs de dispersion suivants : * <code>np.std()</code>, <code>np.nanstd()</code> : écart type ''({{lang|en|standard deviation}})'' ; * <code>np.var()</code>, <code>np.np.nanvar()</code> : variance. == Fréquence, histogramme == On peut générer une matrice aléatoire avec les fonctions <code>np.random.rand()</code>, qui utilise une loi uniforme sur [0 ; 1], et <code>np.random.randn()</code> qui utilise une loi normale centrée réduite. Lorsque l'on dispose d'une série de données aléatoires, qu'elles aient été mesurées ou bien générées par une fonction aléatoire, on peut ensuite les mettre dans des classes ''({{lang|en|bins}})''. Les classes sont définies par un vecteur (ou une liste, un n-uplet) <code>[c1, c2,c3, …, cn]</code>. La classe 0 désigne les valeurs inférieures à ''c''<sub>1</sub> ; la classe 1 désigne les valeurs ''c''<sub>1</sub> ≤ ''x'' &lt; ''c''<sub>2</sub> ; la classe ''n'' (<code>n == len(classes)</code>) désigne les valeurs supérieures à ''c<sub>n</sub>''. La fonction <code>np.digitize()</code> indique dans quelle classe se trouve un nombre. Si on lui donne une matrice (ou un vecteur, une liste, un n-uplet), il renvoie une matrice de même dimension, <code>np.digitize(M, classes)[i, j]</code> étant la classe de l'élément <code>M[i, j]</code>. Par exemple : <syntaxhighlight lang="python"> M = np.random.rand(10) classes = (0, 0.2, 0.4, 0.6, 0.8, 1) print(M) print(np.digitize(M, classes)) </syntaxhighlight> On peut changer la « largeur » des inégalités avec le paramètre <code>right = True</code> : ''{{lang|en|right}}'', « droite », est vrai ''({{lang|en|true}})'' lorsque l'inégalité large est à droite, la classe ''i'' désigne les valeurs ''c<sub>i</sub>'' &lt; ''x'' ≤ ''c''<sub>''i'' + 1</sub>. La syntaxe est alors <code>np.digitize(M, classes, True)</code> ou bien <code>np.digitize(M, classes, right = True)</code>. Le sens de l'inégalité ne dépend pas du sens du vecteur de classes ; ainsi, ''{{lang|en|right}}'' désigne la valeur supérieure de l'intervalle même si le vecteur de classes est classé par ordre décroissant. [[Fichier:Histogramme loi normale 50 ech numpy pyplot.png|vignette|Histogramme tracé avec Python/Numpy/Matplotlib.]] La fonction <code>np.histogram()</code> détermine ''n'' classes de même taille et renvoie deux vecteurs : le premier contient le nombre d'éléments dans chaque classe et le second décrit les classes (c'est-à-dire les bornes des classes). Pour tracer l'histogramme, nous disposons de la fonction <code>plt.hist()</code> : <syntaxhighlight lang="python"> M = np.random.randn(50) plt.plot(M, np.ones_like(M), "|") plt.hist(M, bins=10, density=1) </syntaxhighlight> La fonction <code>np.bincount()</code> travaille sur les listes de nombres entiers. Elle renvoie un n-uplet, <code>np.bincount(M)[i]</code> est le nombre de fois que le nombre ''i'' revient dans la matrice M — rappel, le premier élément du n-uplet <code>np.bincount(M)</code> a l'indice 0 donc correspond au nombre de fois que le nombre 0 apparaît dans la matrice M. == Lois de probabilités == === Avec NumPy === NumPy fournit des générateurs de nombres pseudo-aléatoires, avec le module <code lang="python">random</code>. Pour définir un générateur de nombres (pseudo-)aléatoires (GNA), on l'initialise avec la fonction <syntaxhighlight lang="python"> gna = np.random.default_rng() </syntaxhighlight> on peut lui indiquer une graine, qui est un nombre entier, idéalement grand. Par exemple : <syntaxhighlight lang="python"> gna = np.random.default_rng() </syntaxhighlight> On peut ensuite utiliser ce générateur pour effectuer des tirages selon différentes lois de probabilité : * <code>.random()</code> : distribution uniforme dans [0 ; 1[ ; * <code>.standard_normal()</code> : distribution normale centrée réduite ; * <code>.integers(a, b)</code> : nombres entiers répartis uniformément sur [''a'' ; ''b'' [. Par exemple : <syntaxhighlight lang="python"> # loi uniforme A = gna.random() # un nombre aléatoire B = gna.random(5) # vecteur de 5 nombres aléatoires ; équivalent à gna.random(size = 5) # loi normale A = gna.standard_normal() # un nombre aléatoire B = gna.standard_normal(5) # vecteur de 5 nombres aléatoires ; équivalent à gna.standard_normal(size = 5) # loi uniforme sur des entiers A = gna.integers(1, 10) # un nombre aléatoire entre 1 et 9 inclus ; équivalent à gna.integers(low = 1, high = 10) A = gna.integers(1, 10, 5) # 5 nombre aléatoires entre 1 et 9 inclus ; équivalent à gna.integers(low = 1, high = 10, size = 10) </syntaxhighlight> NumPy fournit des générateurs pseudo-aléatoires pour les lois suivantes : : <code lang="python">.beta(a, b)</code>, <code lang="python">.binomial(n, p)</code>, <code lang="python">.chisquare(df)</code>, <code lang="python".>dirichlet(alpha)</code>, <code lang="python">.exponential()</code>, <code lang="python">.f(dnum, dfden)</code> (F), <code lang="python">.gamma(shape)</code>, <code lang="python">.geometric(p)</code>, <code lang="python">.gumbel()</code>, <code lang="python">.hypergeometric(ngood, nbad, nsample)</code>, <code lang="python">.laplace()</code>, <code lang="python">.logisticl()</code>, <code lang="python">.lognormal()</code>, <code lang="python">.logseries(p)</code>, <code lang="python">.multinomial(n, pvals)</code>, <code lang="python">.multivariate_hypergeometric(colors, nsample)</code>, <code lang="python">.multivariate_normal(mean, cov)</code>, <code lang="python">.negative_binomial(n, p)</code>, <code lang="python">.noncentral_chisquare(df, nonc)</code>, <code lang="python">.noncentral_f(dfnum, dfden, nonc)</code>, <code lang="python">.normal()</code>, <code lang="python">.pareto(a)</code>, <code lang="python">.poisson()</code>, <code lang="python">.power(a)</code>, <code lang="python">.rayleigh()</code>, <code lang="python">.standatd_cauchy()</code>, <code lang="python">.standard_exponential()</code>, <code lang="python">.standard_normal()</code>, <code lang="python">.standard_t(df)</code> (Student), <code lang="python">.triangular(left, mode, right)</code>, <code lang="python">.uniform(low, high, size)</code>, <code lang="python">.vonmises(mu, kappa)</code>, <code lang="python">.wald(mean, scale)</code> (Gauss inverse), <code lang="python">.weibull(a) et <code lang="python">.zipf(a)</code></code>. Nous n'avons indiqué que les paramètres obligatoires. Elles possèdent toues des paramètres optionnels, dont <code>size</code> (1 par défaut) qui donne la taille du vecteur généré. ; Voir * {{lien web |url=https://numpy.org/doc/stable/reference/random/generator.html#distributions |titre=Random Generator &gt; Distributions |site=NumPy.org |consuloté le=2026-03-23}} Le module <code>np.random</code> permet également : * de prendre un ou plusieurs éléments au hasard dans une matrice M : <code lang="python">.choice(M)</code><br /><code lang="python">gna.choice(M)</code> pour un élément, <code lang="python">gna.choice(M, n)</code> ou <code lang="python">gna.choice(M, size=n)</code> pour ''n'' éléments ; * de mélanger un matrice M : ** <code lang="python">.shuffle(M)</code> mélange la matrice M, ** <code lang="python">.permutation(M)</code> crée une copie mélangée de la matrice M ; * on peut indiquer l'axe de mélange (axe 0 par défaut), par exemple pour l'axe 1 : <code lang="python">.shuffle(M, 1)</code>, <code lang="python">.shuffle(M, axis = 1)</code>, <code lang="python">.permutation(M, 1)</code>, <code lang="python">.permutation(M, axis=1)</code>. Pour assurer une transition simple avec Matlab, NumPy fournit les générateurs pseudo-aléatoires suivants : * <code lang="python">np.random.rand()</code> pour la loi uniforme sur [0 ; 1[ ; on peut indiquer les dimension d'une matrice (ou hypermatrice) en paramètres, par exemple <code lang="python">np.random.rand(a, b)</code> pour une matrice ''a'' × ''b'' ; * <code lang="python">np.random.randn()</code> pour la loi normale centrée réduite ; on peut de même indiquer les dimension d'une matrice (ou hypermatrice) en paramètres, par exemple <code lang="python">np.random.rand(a, b)</code> pour une matrice ''a'' × ''b''. === Avec SciPy === Le module <code>scipy.stats</code> fournit un grand nombre de lois de probabilités. Ces lois sont des objets ayant toutes les mêmes méthodes. Par exemple, on dispose des lois suivantes : * lois dicrètes : ** <code>bernoulli</code> : loi de Bernoulli, ** <code>scipy.stats.binom</code> : loi binomiale, ** <code>scipy.stats.poisson</code> : loi de Poisson, ** <code>scipy.stats.randint</code> : loi discrète uniforme ; * loi continues : ** <code>scipy.stats.chi2</code> : loi du χ<sup>2</sup> (khi carré), ** <code>scipy.stats.norm</code> : loi normale, ** <code>scipy.stats.t</code> : loi de Student, ** <code>scipy.stats.uniform</code> : loi continue uniforme ; et des méthodes suivantes : * <code>.mean()</code> : calcule la moyenne, l'espérance de la loi ; * <code>.median()</code> : calcule la médiane de la loi ; * <code>.var()</code> : calcule la variance de la loi ; * <code>.std()</code> : calcule l'écart type ''({{lang|en|standard deviation}})'' de la loi ; * <code>.moment()</code> : calcule les moments de la loi ; * <code>.rvs()</code> : effectue des tirages aléatoires ''({{lang|en|random variables}})'' ; * <code>.pdf()</code> : fonction densité de probabilité ''({{lang|en|probability density function}})'' pour les lois continues ; * <code>.mdf()</code> : fonction de masse ''({{lang|en|mass density function}})'' pour les lois discrètes ; * <code>.cdf()</code> : fonction de répartition ''({{lang|en|cumulative density function}})'' ; * <code>.ppf()</code> : fonction quantile ''({{lang|en|percent-point function}})'' ; * <code>.fit()</code> : calcule les paramètres de la loi correspondant au mieux à un échantillon, au sens du maximum de vraisemblance ; uniquement pour les lois continues. Par exemple <syntaxhighlight lang="python"> from scipy import stats # moments mvsk : mean (moyenne), variance, skewness (asymétrie), kurtosis moy, var, asy, kurt = stats.norm.stats(moments="mvsk") print(moy, var, asy, kurt) # 0.0 1.0 0.0 0.0 print(stats.norm.pdf(1), ";", stats.norm.cdf(0.5), ";", stats.norm.ppf(0.99)) # Pour la fonction normale centrée réduite : densité de probabilité en 1 ; fonction de répartition en 0,5 ; dernier centile # 0.24197072451914337 ; 0.6914624612740131 ; 2.3263478740408408 x = np.linspace(-6, 6, 100) y1 = stats.norm.pdf(x) # Densité de probabilité de la loi normale centrée réduite y2 = stats.norm.cdf(x) # Fonction de répartition de cette loi plt.plot(x, y1, label="densité") plt.plot(x, y2, label="répartition") plt.legend() </syntaxhighlight> Par défaut, les lois continues sont centrées réduites (de moyenne nulle et d'écart type unité). Les objets disposent des paramètres <code>loc</code> (''location'', position) et <code>scale</code> (échelle) ; par exemple pour un tirage aléatoire de 100 échantillons avec une loi normale de moyenne 10 et d'écart type 5 : <syntaxhighlight lang="python"> stats.norm.rvs(100, loc=5, scale=10) </syntaxhighlight> Il est possible de fixer ces paramètres pour une loi, de la « geler », par exemple : <syntaxhighlight lang="python"> from scipy import stats varAl = stats.norm(loc=5, scale=10) # loi « gelée » (loi normale d'espérance 5 et d'écart type 10) n = 100 x = varAl.rvs(n) plt.plot(x, np.ones_like(x), "|") plt.hist(x) print(varAl.mean(), varAl.std()) </syntaxhighlight> ou encore <syntaxhighlight lang="python"> from scipy import stats n = 100 varAl = stats.poisson(mu=50) # loi de Poison d'espérance mu x = varAl.rvs(size=n) plt.plot(x, np.ones_like(x), "|") plt.hist(x) print(varAl.mean(), varAl.std()) res = stats.norm.fit(x) print(res) </syntaxhighlight> [[File:Diagramme qq python matplotlib.svg|vignette|upright=1.5|Diagramme quantile-quantile avec Python Scipy et Matplotlib.]] L'exemple suivant consiste à vérifier qu'un échantillon suit bien une loi normale centrée réduite en traçant sa droite de Henry : <syntaxhighlight lang="python"> import numpy as np from scipy import stats import matplotlib.pyplot as plt X = stats.norm.rvs(size=100) p = np.arange(0.1, 1, 0.1) qexp = np.quantile(X, p) qth = stats.norm.ppf(p) extr = stats.norm.ppf([0.1, 0.9]) plt.plot(extr, extr, "--r") plt.plot(qth, qexp, "*") plt.title("diagramme quantiles-quantiles") plt.xlabel("quantiles théoriques") plt.ylabel("quantiles expérimentaux") plt.savefig("diagramme_qq_python_matplotlib.svg") </syntaxhighlight> Pour les lois discrète, il est nécessaire d'indiquer leurs paramètres. Par exemple : * pour la loi de Bernoulli, la probabilité ''p'' : <code>stats.bernoulli(p)</code> ; * pour la loi binomiale, les facteurs de forme ''n'' et ''p'' : <code>stats.binom(n, p)</code> ; * pour la loi de Poisson : le paramètre μ (mu) : <code>stats.poisson(mu)</code> ; l est également possible de décaler la loi, <code>stats.poisson(mu, loc)</code> ; * pour la loi discrète uniforme, les valeurs minimales et maximales : <code>stats.randint(low, high)</code>. == Ressources == * {{lien web | url = https://docs.scipy.org/doc/scipy/reference/stats.html | titre = Statistical functions (scipy.stats) | site = Numpy and Scipy Documentation | consulté le = 2019-05-22 }} == Notes et références == {{références}} ---- [[../Polynômes|Polynômes]] &lt; [[../|↑]] &gt; [[../Interpolation, extrapolation et lissage|Interpolation, extrapolation et lissage]] [[Catégorie:Python pour le calcul scientifique (livre)]] 4wcne9yzgi5xtrjcw7lhljktamb5t9s 767581 767580 2026-06-08T10:23:04Z Cdang 1202 /* Avec SciPy */ corr. voc. 767581 wikitext text/x-wiki Le module NumPy fournit des fonctions statistiques. Rappelons que dorénavant les programmes commencent tous par : <syntaxhighlight lang="python"> #!/usr/bin/python3 import numpy as np import matplotlib.pyplot as plt </syntaxhighlight> == Méthodes de matrices == Rappel : la classe des matrices ''(ndarray)'' dispose de méthodes permettant de calculer des statistiques sur les éléments des matrices : * <code>.min()</code> : minimum des valeurs ; * <code>.max()</code> : maximum des valeurs ; * <code>.ptp()</code> : écart amplitude « max – min » ''({{lang|en|peak to peak}})'' ; * <code>.mean()</code> : moyenne ; * <code>.std()</code> : écart type ''({{lang|en|standard deviation}})''. == Statistiques descriptives == NumPy fournit la fonction <code>np.quantile()</code> qui détermine les quantiles avec la syntaxe : <syntaxhighlight lang="python"> np.quantile(M, q) </syntaxhighlight> où <code>M</code> est une matrice (ou une liste, un n-uplet, bref un itérable de nombres) et <code>q</code> est un quantile ou un vecteur de quantiles sous la forme d'un nombre entre 0 et 1. Par exemple, pour avoir les quartiles : <syntaxhighlight lang="python"> np.quantile(M, [0, 0.25, 0.5, 0.75, 1]) </syntaxhighlight> Si un des éléments de la matrice est un NaN, le résultat est un NaN. Pour éviter cela, on peut utiliser la fonction <code>np.nanquantile()</code> qui ignore les NaN. Les fonctions <code>np.percentile()</code> et <code>np.nanpercentile()</code> donnent les centiles ; on indique alors le centile que l'on veut sous la forme d'un nombre entier entre 0 et 100. Nous disposons également des fonctions suivantes : * <code>np.amin()</code>, <code>np.nanmin()</code> : minimum ; * <code>np.amax()</code>, <code>np.nanmax()</code> : maximum ; * <code>np.ptp()</code> : amplitude. Notons que pour toutes les fonctions, il est possible d'indiquer l'axe selon lequel on effectue le calcul. Par exemple, <syntaxhighlight lang="python"> M = np.arange(9).reshape(3, 3) # [[0, 1, 2] # [3, 4, 5] # [6, 7, 8]] print(np.quantile(M, [0.25, 0.5], 0)) # [[1.5 2.5 3.5] : 1er quartile des colonnes # [3. 4. 5. ]] : médiane des colonnes print(np.quantile(M, [0.25, 0.5], 1)) # [[0.5 3.5 6.5] : 1er quartile des lignes # [1. 4. 7. ]] : médiane des lignes </syntaxhighlight> == Indicateurs de position et de dispersion == NumPy fournit les indicateurs de tendance centrale suivants : * <code>np.mean()</code> et <code>np.nanmean()</code> : moyenne ; * <code>np.average()</code> et <code>np.nanaverage()</code> : moyenne pondérée ; la syntaxe est <code>np.average(M, axe, poids)</code> ou bien <code>np.average(M, weights = poids)</code> (voir ci-après) ; * <code>np.median()</code> et <code>np.nanmedian()</code> : médiane. En terme de performances, la fonction <code>np.mean()</code> est équivalente à la méthode <code>M.mean()</code> et à la fonction <code>np.average()</code> sans poids (ce qui équivaut donc à la moyenne). En revanche, la fonction <code>np.nanmean()</code> est plus lente, de même que la fonction <code>np.average()</code> lorsque l'on utilise des poids (même s'ils sont tous égaux à 1). Comme précédemment, on peut indiquer l'axe (si l'on veut évaluer les valeurs par colonne ou par ligne). Pour la moyenne pondérée, on utilise une matrice poids P de même dimension que la matrice de valeurs M, <code>P[i, j]</code> étant le poids associé à la valeur <code>M[i, j]</code>. Par exemple, si l'on veut évaluer la moyenne pondérée pour toutes les valeurs de M (pas d'axe), on peut écrire une des deux solutions suivantes : <syntaxhighlight lang="python"> np.average(M, None, P) # l'axe est le 2e paramètre np.average(M, weights = P) </syntaxhighlight> NumPy fournit également les indicateurs de dispersion suivants : * <code>np.std()</code>, <code>np.nanstd()</code> : écart type ''({{lang|en|standard deviation}})'' ; * <code>np.var()</code>, <code>np.np.nanvar()</code> : variance. == Fréquence, histogramme == On peut générer une matrice aléatoire avec les fonctions <code>np.random.rand()</code>, qui utilise une loi uniforme sur [0 ; 1], et <code>np.random.randn()</code> qui utilise une loi normale centrée réduite. Lorsque l'on dispose d'une série de données aléatoires, qu'elles aient été mesurées ou bien générées par une fonction aléatoire, on peut ensuite les mettre dans des classes ''({{lang|en|bins}})''. Les classes sont définies par un vecteur (ou une liste, un n-uplet) <code>[c1, c2,c3, …, cn]</code>. La classe 0 désigne les valeurs inférieures à ''c''<sub>1</sub> ; la classe 1 désigne les valeurs ''c''<sub>1</sub> ≤ ''x'' &lt; ''c''<sub>2</sub> ; la classe ''n'' (<code>n == len(classes)</code>) désigne les valeurs supérieures à ''c<sub>n</sub>''. La fonction <code>np.digitize()</code> indique dans quelle classe se trouve un nombre. Si on lui donne une matrice (ou un vecteur, une liste, un n-uplet), il renvoie une matrice de même dimension, <code>np.digitize(M, classes)[i, j]</code> étant la classe de l'élément <code>M[i, j]</code>. Par exemple : <syntaxhighlight lang="python"> M = np.random.rand(10) classes = (0, 0.2, 0.4, 0.6, 0.8, 1) print(M) print(np.digitize(M, classes)) </syntaxhighlight> On peut changer la « largeur » des inégalités avec le paramètre <code>right = True</code> : ''{{lang|en|right}}'', « droite », est vrai ''({{lang|en|true}})'' lorsque l'inégalité large est à droite, la classe ''i'' désigne les valeurs ''c<sub>i</sub>'' &lt; ''x'' ≤ ''c''<sub>''i'' + 1</sub>. La syntaxe est alors <code>np.digitize(M, classes, True)</code> ou bien <code>np.digitize(M, classes, right = True)</code>. Le sens de l'inégalité ne dépend pas du sens du vecteur de classes ; ainsi, ''{{lang|en|right}}'' désigne la valeur supérieure de l'intervalle même si le vecteur de classes est classé par ordre décroissant. [[Fichier:Histogramme loi normale 50 ech numpy pyplot.png|vignette|Histogramme tracé avec Python/Numpy/Matplotlib.]] La fonction <code>np.histogram()</code> détermine ''n'' classes de même taille et renvoie deux vecteurs : le premier contient le nombre d'éléments dans chaque classe et le second décrit les classes (c'est-à-dire les bornes des classes). Pour tracer l'histogramme, nous disposons de la fonction <code>plt.hist()</code> : <syntaxhighlight lang="python"> M = np.random.randn(50) plt.plot(M, np.ones_like(M), "|") plt.hist(M, bins=10, density=1) </syntaxhighlight> La fonction <code>np.bincount()</code> travaille sur les listes de nombres entiers. Elle renvoie un n-uplet, <code>np.bincount(M)[i]</code> est le nombre de fois que le nombre ''i'' revient dans la matrice M — rappel, le premier élément du n-uplet <code>np.bincount(M)</code> a l'indice 0 donc correspond au nombre de fois que le nombre 0 apparaît dans la matrice M. == Lois de probabilités == === Avec NumPy === NumPy fournit des générateurs de nombres pseudo-aléatoires, avec le module <code lang="python">random</code>. Pour définir un générateur de nombres (pseudo-)aléatoires (GNA), on l'initialise avec la fonction <syntaxhighlight lang="python"> gna = np.random.default_rng() </syntaxhighlight> on peut lui indiquer une graine, qui est un nombre entier, idéalement grand. Par exemple : <syntaxhighlight lang="python"> gna = np.random.default_rng() </syntaxhighlight> On peut ensuite utiliser ce générateur pour effectuer des tirages selon différentes lois de probabilité : * <code>.random()</code> : distribution uniforme dans [0 ; 1[ ; * <code>.standard_normal()</code> : distribution normale centrée réduite ; * <code>.integers(a, b)</code> : nombres entiers répartis uniformément sur [''a'' ; ''b'' [. Par exemple : <syntaxhighlight lang="python"> # loi uniforme A = gna.random() # un nombre aléatoire B = gna.random(5) # vecteur de 5 nombres aléatoires ; équivalent à gna.random(size = 5) # loi normale A = gna.standard_normal() # un nombre aléatoire B = gna.standard_normal(5) # vecteur de 5 nombres aléatoires ; équivalent à gna.standard_normal(size = 5) # loi uniforme sur des entiers A = gna.integers(1, 10) # un nombre aléatoire entre 1 et 9 inclus ; équivalent à gna.integers(low = 1, high = 10) A = gna.integers(1, 10, 5) # 5 nombre aléatoires entre 1 et 9 inclus ; équivalent à gna.integers(low = 1, high = 10, size = 10) </syntaxhighlight> NumPy fournit des générateurs pseudo-aléatoires pour les lois suivantes : : <code lang="python">.beta(a, b)</code>, <code lang="python">.binomial(n, p)</code>, <code lang="python">.chisquare(df)</code>, <code lang="python".>dirichlet(alpha)</code>, <code lang="python">.exponential()</code>, <code lang="python">.f(dnum, dfden)</code> (F), <code lang="python">.gamma(shape)</code>, <code lang="python">.geometric(p)</code>, <code lang="python">.gumbel()</code>, <code lang="python">.hypergeometric(ngood, nbad, nsample)</code>, <code lang="python">.laplace()</code>, <code lang="python">.logisticl()</code>, <code lang="python">.lognormal()</code>, <code lang="python">.logseries(p)</code>, <code lang="python">.multinomial(n, pvals)</code>, <code lang="python">.multivariate_hypergeometric(colors, nsample)</code>, <code lang="python">.multivariate_normal(mean, cov)</code>, <code lang="python">.negative_binomial(n, p)</code>, <code lang="python">.noncentral_chisquare(df, nonc)</code>, <code lang="python">.noncentral_f(dfnum, dfden, nonc)</code>, <code lang="python">.normal()</code>, <code lang="python">.pareto(a)</code>, <code lang="python">.poisson()</code>, <code lang="python">.power(a)</code>, <code lang="python">.rayleigh()</code>, <code lang="python">.standatd_cauchy()</code>, <code lang="python">.standard_exponential()</code>, <code lang="python">.standard_normal()</code>, <code lang="python">.standard_t(df)</code> (Student), <code lang="python">.triangular(left, mode, right)</code>, <code lang="python">.uniform(low, high, size)</code>, <code lang="python">.vonmises(mu, kappa)</code>, <code lang="python">.wald(mean, scale)</code> (Gauss inverse), <code lang="python">.weibull(a) et <code lang="python">.zipf(a)</code></code>. Nous n'avons indiqué que les paramètres obligatoires. Elles possèdent toues des paramètres optionnels, dont <code>size</code> (1 par défaut) qui donne la taille du vecteur généré. ; Voir * {{lien web |url=https://numpy.org/doc/stable/reference/random/generator.html#distributions |titre=Random Generator &gt; Distributions |site=NumPy.org |consuloté le=2026-03-23}} Le module <code>np.random</code> permet également : * de prendre un ou plusieurs éléments au hasard dans une matrice M : <code lang="python">.choice(M)</code><br /><code lang="python">gna.choice(M)</code> pour un élément, <code lang="python">gna.choice(M, n)</code> ou <code lang="python">gna.choice(M, size=n)</code> pour ''n'' éléments ; * de mélanger un matrice M : ** <code lang="python">.shuffle(M)</code> mélange la matrice M, ** <code lang="python">.permutation(M)</code> crée une copie mélangée de la matrice M ; * on peut indiquer l'axe de mélange (axe 0 par défaut), par exemple pour l'axe 1 : <code lang="python">.shuffle(M, 1)</code>, <code lang="python">.shuffle(M, axis = 1)</code>, <code lang="python">.permutation(M, 1)</code>, <code lang="python">.permutation(M, axis=1)</code>. Pour assurer une transition simple avec Matlab, NumPy fournit les générateurs pseudo-aléatoires suivants : * <code lang="python">np.random.rand()</code> pour la loi uniforme sur [0 ; 1[ ; on peut indiquer les dimension d'une matrice (ou hypermatrice) en paramètres, par exemple <code lang="python">np.random.rand(a, b)</code> pour une matrice ''a'' × ''b'' ; * <code lang="python">np.random.randn()</code> pour la loi normale centrée réduite ; on peut de même indiquer les dimension d'une matrice (ou hypermatrice) en paramètres, par exemple <code lang="python">np.random.rand(a, b)</code> pour une matrice ''a'' × ''b''. === Avec SciPy === Le module <code>scipy.stats</code> fournit un grand nombre de lois de probabilités. Ces lois sont des objets ayant toutes les mêmes méthodes. Par exemple, on dispose des lois suivantes : * lois dicrètes : ** <code>bernoulli</code> : loi de Bernoulli, ** <code>scipy.stats.binom</code> : loi binomiale, ** <code>scipy.stats.poisson</code> : loi de Poisson, ** <code>scipy.stats.randint</code> : loi discrète uniforme ; * loi continues : ** <code>scipy.stats.chi2</code> : loi du χ<sup>2</sup> (khi carré), ** <code>scipy.stats.norm</code> : loi normale, ** <code>scipy.stats.t</code> : loi de Student, ** <code>scipy.stats.uniform</code> : loi continue uniforme ; et des méthodes suivantes : * <code>.mean()</code> : calcule la moyenne, l'espérance de la loi ; * <code>.median()</code> : calcule la médiane de la loi ; * <code>.var()</code> : calcule la variance de la loi ; * <code>.std()</code> : calcule l'écart type ''({{lang|en|standard deviation}})'' de la loi ; * <code>.moment()</code> : calcule les moments de la loi ; * <code>.rvs()</code> : effectue des tirages aléatoires ''({{lang|en|random variates}})'' ; * <code>.pdf()</code> : fonction densité de probabilité ''({{lang|en|probability density function}})'' pour les lois continues ; * <code>.mdf()</code> : fonction de masse ''({{lang|en|mass density function}})'' pour les lois discrètes ; * <code>.cdf()</code> : fonction de répartition ''({{lang|en|cumulative density function}})'' ; * <code>.ppf()</code> : fonction quantile ''({{lang|en|percent-point function}})'' ; * <code>.fit()</code> : calcule les paramètres de la loi correspondant au mieux à un échantillon, au sens du maximum de vraisemblance ; uniquement pour les lois continues. Par exemple <syntaxhighlight lang="python"> from scipy import stats # moments mvsk : mean (moyenne), variance, skewness (asymétrie), kurtosis moy, var, asy, kurt = stats.norm.stats(moments="mvsk") print(moy, var, asy, kurt) # 0.0 1.0 0.0 0.0 print(stats.norm.pdf(1), ";", stats.norm.cdf(0.5), ";", stats.norm.ppf(0.99)) # Pour la fonction normale centrée réduite : densité de probabilité en 1 ; fonction de répartition en 0,5 ; dernier centile # 0.24197072451914337 ; 0.6914624612740131 ; 2.3263478740408408 x = np.linspace(-6, 6, 100) y1 = stats.norm.pdf(x) # Densité de probabilité de la loi normale centrée réduite y2 = stats.norm.cdf(x) # Fonction de répartition de cette loi plt.plot(x, y1, label="densité") plt.plot(x, y2, label="répartition") plt.legend() </syntaxhighlight> Par défaut, les lois continues sont centrées réduites (de moyenne nulle et d'écart type unité). Les objets disposent des paramètres <code>loc</code> (''location'', position) et <code>scale</code> (échelle) ; par exemple pour un tirage aléatoire de 100 échantillons avec une loi normale de moyenne 10 et d'écart type 5 : <syntaxhighlight lang="python"> stats.norm.rvs(100, loc=5, scale=10) </syntaxhighlight> Il est possible de fixer ces paramètres pour une loi, de la « geler », par exemple : <syntaxhighlight lang="python"> from scipy import stats varAl = stats.norm(loc=5, scale=10) # loi « gelée » (loi normale d'espérance 5 et d'écart type 10) n = 100 x = varAl.rvs(n) plt.plot(x, np.ones_like(x), "|") plt.hist(x) print(varAl.mean(), varAl.std()) </syntaxhighlight> ou encore <syntaxhighlight lang="python"> from scipy import stats n = 100 varAl = stats.poisson(mu=50) # loi de Poison d'espérance mu x = varAl.rvs(size=n) plt.plot(x, np.ones_like(x), "|") plt.hist(x) print(varAl.mean(), varAl.std()) res = stats.norm.fit(x) print(res) </syntaxhighlight> [[File:Diagramme qq python matplotlib.svg|vignette|upright=1.5|Diagramme quantile-quantile avec Python Scipy et Matplotlib.]] L'exemple suivant consiste à vérifier qu'un échantillon suit bien une loi normale centrée réduite en traçant sa droite de Henry : <syntaxhighlight lang="python"> import numpy as np from scipy import stats import matplotlib.pyplot as plt X = stats.norm.rvs(size=100) p = np.arange(0.1, 1, 0.1) qexp = np.quantile(X, p) qth = stats.norm.ppf(p) extr = stats.norm.ppf([0.1, 0.9]) plt.plot(extr, extr, "--r") plt.plot(qth, qexp, "*") plt.title("diagramme quantiles-quantiles") plt.xlabel("quantiles théoriques") plt.ylabel("quantiles expérimentaux") plt.savefig("diagramme_qq_python_matplotlib.svg") </syntaxhighlight> Pour les lois discrète, il est nécessaire d'indiquer leurs paramètres. Par exemple : * pour la loi de Bernoulli, la probabilité ''p'' : <code>stats.bernoulli(p)</code> ; * pour la loi binomiale, les facteurs de forme ''n'' et ''p'' : <code>stats.binom(n, p)</code> ; * pour la loi de Poisson : le paramètre μ (mu) : <code>stats.poisson(mu)</code> ; l est également possible de décaler la loi, <code>stats.poisson(mu, loc)</code> ; * pour la loi discrète uniforme, les valeurs minimales et maximales : <code>stats.randint(low, high)</code>. == Ressources == * {{lien web | url = https://docs.scipy.org/doc/scipy/reference/stats.html | titre = Statistical functions (scipy.stats) | site = Numpy and Scipy Documentation | consulté le = 2019-05-22 }} == Notes et références == {{références}} ---- [[../Polynômes|Polynômes]] &lt; [[../|↑]] &gt; [[../Interpolation, extrapolation et lissage|Interpolation, extrapolation et lissage]] [[Catégorie:Python pour le calcul scientifique (livre)]] ouil954vypmqxrif4l5c77nwgzumaaq 767582 767581 2026-06-08T10:25:58Z Cdang 1202 /* Avec SciPy */ précision 767582 wikitext text/x-wiki Le module NumPy fournit des fonctions statistiques. Rappelons que dorénavant les programmes commencent tous par : <syntaxhighlight lang="python"> #!/usr/bin/python3 import numpy as np import matplotlib.pyplot as plt </syntaxhighlight> == Méthodes de matrices == Rappel : la classe des matrices ''(ndarray)'' dispose de méthodes permettant de calculer des statistiques sur les éléments des matrices : * <code>.min()</code> : minimum des valeurs ; * <code>.max()</code> : maximum des valeurs ; * <code>.ptp()</code> : écart amplitude « max – min » ''({{lang|en|peak to peak}})'' ; * <code>.mean()</code> : moyenne ; * <code>.std()</code> : écart type ''({{lang|en|standard deviation}})''. == Statistiques descriptives == NumPy fournit la fonction <code>np.quantile()</code> qui détermine les quantiles avec la syntaxe : <syntaxhighlight lang="python"> np.quantile(M, q) </syntaxhighlight> où <code>M</code> est une matrice (ou une liste, un n-uplet, bref un itérable de nombres) et <code>q</code> est un quantile ou un vecteur de quantiles sous la forme d'un nombre entre 0 et 1. Par exemple, pour avoir les quartiles : <syntaxhighlight lang="python"> np.quantile(M, [0, 0.25, 0.5, 0.75, 1]) </syntaxhighlight> Si un des éléments de la matrice est un NaN, le résultat est un NaN. Pour éviter cela, on peut utiliser la fonction <code>np.nanquantile()</code> qui ignore les NaN. Les fonctions <code>np.percentile()</code> et <code>np.nanpercentile()</code> donnent les centiles ; on indique alors le centile que l'on veut sous la forme d'un nombre entier entre 0 et 100. Nous disposons également des fonctions suivantes : * <code>np.amin()</code>, <code>np.nanmin()</code> : minimum ; * <code>np.amax()</code>, <code>np.nanmax()</code> : maximum ; * <code>np.ptp()</code> : amplitude. Notons que pour toutes les fonctions, il est possible d'indiquer l'axe selon lequel on effectue le calcul. Par exemple, <syntaxhighlight lang="python"> M = np.arange(9).reshape(3, 3) # [[0, 1, 2] # [3, 4, 5] # [6, 7, 8]] print(np.quantile(M, [0.25, 0.5], 0)) # [[1.5 2.5 3.5] : 1er quartile des colonnes # [3. 4. 5. ]] : médiane des colonnes print(np.quantile(M, [0.25, 0.5], 1)) # [[0.5 3.5 6.5] : 1er quartile des lignes # [1. 4. 7. ]] : médiane des lignes </syntaxhighlight> == Indicateurs de position et de dispersion == NumPy fournit les indicateurs de tendance centrale suivants : * <code>np.mean()</code> et <code>np.nanmean()</code> : moyenne ; * <code>np.average()</code> et <code>np.nanaverage()</code> : moyenne pondérée ; la syntaxe est <code>np.average(M, axe, poids)</code> ou bien <code>np.average(M, weights = poids)</code> (voir ci-après) ; * <code>np.median()</code> et <code>np.nanmedian()</code> : médiane. En terme de performances, la fonction <code>np.mean()</code> est équivalente à la méthode <code>M.mean()</code> et à la fonction <code>np.average()</code> sans poids (ce qui équivaut donc à la moyenne). En revanche, la fonction <code>np.nanmean()</code> est plus lente, de même que la fonction <code>np.average()</code> lorsque l'on utilise des poids (même s'ils sont tous égaux à 1). Comme précédemment, on peut indiquer l'axe (si l'on veut évaluer les valeurs par colonne ou par ligne). Pour la moyenne pondérée, on utilise une matrice poids P de même dimension que la matrice de valeurs M, <code>P[i, j]</code> étant le poids associé à la valeur <code>M[i, j]</code>. Par exemple, si l'on veut évaluer la moyenne pondérée pour toutes les valeurs de M (pas d'axe), on peut écrire une des deux solutions suivantes : <syntaxhighlight lang="python"> np.average(M, None, P) # l'axe est le 2e paramètre np.average(M, weights = P) </syntaxhighlight> NumPy fournit également les indicateurs de dispersion suivants : * <code>np.std()</code>, <code>np.nanstd()</code> : écart type ''({{lang|en|standard deviation}})'' ; * <code>np.var()</code>, <code>np.np.nanvar()</code> : variance. == Fréquence, histogramme == On peut générer une matrice aléatoire avec les fonctions <code>np.random.rand()</code>, qui utilise une loi uniforme sur [0 ; 1], et <code>np.random.randn()</code> qui utilise une loi normale centrée réduite. Lorsque l'on dispose d'une série de données aléatoires, qu'elles aient été mesurées ou bien générées par une fonction aléatoire, on peut ensuite les mettre dans des classes ''({{lang|en|bins}})''. Les classes sont définies par un vecteur (ou une liste, un n-uplet) <code>[c1, c2,c3, …, cn]</code>. La classe 0 désigne les valeurs inférieures à ''c''<sub>1</sub> ; la classe 1 désigne les valeurs ''c''<sub>1</sub> ≤ ''x'' &lt; ''c''<sub>2</sub> ; la classe ''n'' (<code>n == len(classes)</code>) désigne les valeurs supérieures à ''c<sub>n</sub>''. La fonction <code>np.digitize()</code> indique dans quelle classe se trouve un nombre. Si on lui donne une matrice (ou un vecteur, une liste, un n-uplet), il renvoie une matrice de même dimension, <code>np.digitize(M, classes)[i, j]</code> étant la classe de l'élément <code>M[i, j]</code>. Par exemple : <syntaxhighlight lang="python"> M = np.random.rand(10) classes = (0, 0.2, 0.4, 0.6, 0.8, 1) print(M) print(np.digitize(M, classes)) </syntaxhighlight> On peut changer la « largeur » des inégalités avec le paramètre <code>right = True</code> : ''{{lang|en|right}}'', « droite », est vrai ''({{lang|en|true}})'' lorsque l'inégalité large est à droite, la classe ''i'' désigne les valeurs ''c<sub>i</sub>'' &lt; ''x'' ≤ ''c''<sub>''i'' + 1</sub>. La syntaxe est alors <code>np.digitize(M, classes, True)</code> ou bien <code>np.digitize(M, classes, right = True)</code>. Le sens de l'inégalité ne dépend pas du sens du vecteur de classes ; ainsi, ''{{lang|en|right}}'' désigne la valeur supérieure de l'intervalle même si le vecteur de classes est classé par ordre décroissant. [[Fichier:Histogramme loi normale 50 ech numpy pyplot.png|vignette|Histogramme tracé avec Python/Numpy/Matplotlib.]] La fonction <code>np.histogram()</code> détermine ''n'' classes de même taille et renvoie deux vecteurs : le premier contient le nombre d'éléments dans chaque classe et le second décrit les classes (c'est-à-dire les bornes des classes). Pour tracer l'histogramme, nous disposons de la fonction <code>plt.hist()</code> : <syntaxhighlight lang="python"> M = np.random.randn(50) plt.plot(M, np.ones_like(M), "|") plt.hist(M, bins=10, density=1) </syntaxhighlight> La fonction <code>np.bincount()</code> travaille sur les listes de nombres entiers. Elle renvoie un n-uplet, <code>np.bincount(M)[i]</code> est le nombre de fois que le nombre ''i'' revient dans la matrice M — rappel, le premier élément du n-uplet <code>np.bincount(M)</code> a l'indice 0 donc correspond au nombre de fois que le nombre 0 apparaît dans la matrice M. == Lois de probabilités == === Avec NumPy === NumPy fournit des générateurs de nombres pseudo-aléatoires, avec le module <code lang="python">random</code>. Pour définir un générateur de nombres (pseudo-)aléatoires (GNA), on l'initialise avec la fonction <syntaxhighlight lang="python"> gna = np.random.default_rng() </syntaxhighlight> on peut lui indiquer une graine, qui est un nombre entier, idéalement grand. Par exemple : <syntaxhighlight lang="python"> gna = np.random.default_rng() </syntaxhighlight> On peut ensuite utiliser ce générateur pour effectuer des tirages selon différentes lois de probabilité : * <code>.random()</code> : distribution uniforme dans [0 ; 1[ ; * <code>.standard_normal()</code> : distribution normale centrée réduite ; * <code>.integers(a, b)</code> : nombres entiers répartis uniformément sur [''a'' ; ''b'' [. Par exemple : <syntaxhighlight lang="python"> # loi uniforme A = gna.random() # un nombre aléatoire B = gna.random(5) # vecteur de 5 nombres aléatoires ; équivalent à gna.random(size = 5) # loi normale A = gna.standard_normal() # un nombre aléatoire B = gna.standard_normal(5) # vecteur de 5 nombres aléatoires ; équivalent à gna.standard_normal(size = 5) # loi uniforme sur des entiers A = gna.integers(1, 10) # un nombre aléatoire entre 1 et 9 inclus ; équivalent à gna.integers(low = 1, high = 10) A = gna.integers(1, 10, 5) # 5 nombre aléatoires entre 1 et 9 inclus ; équivalent à gna.integers(low = 1, high = 10, size = 10) </syntaxhighlight> NumPy fournit des générateurs pseudo-aléatoires pour les lois suivantes : : <code lang="python">.beta(a, b)</code>, <code lang="python">.binomial(n, p)</code>, <code lang="python">.chisquare(df)</code>, <code lang="python".>dirichlet(alpha)</code>, <code lang="python">.exponential()</code>, <code lang="python">.f(dnum, dfden)</code> (F), <code lang="python">.gamma(shape)</code>, <code lang="python">.geometric(p)</code>, <code lang="python">.gumbel()</code>, <code lang="python">.hypergeometric(ngood, nbad, nsample)</code>, <code lang="python">.laplace()</code>, <code lang="python">.logisticl()</code>, <code lang="python">.lognormal()</code>, <code lang="python">.logseries(p)</code>, <code lang="python">.multinomial(n, pvals)</code>, <code lang="python">.multivariate_hypergeometric(colors, nsample)</code>, <code lang="python">.multivariate_normal(mean, cov)</code>, <code lang="python">.negative_binomial(n, p)</code>, <code lang="python">.noncentral_chisquare(df, nonc)</code>, <code lang="python">.noncentral_f(dfnum, dfden, nonc)</code>, <code lang="python">.normal()</code>, <code lang="python">.pareto(a)</code>, <code lang="python">.poisson()</code>, <code lang="python">.power(a)</code>, <code lang="python">.rayleigh()</code>, <code lang="python">.standatd_cauchy()</code>, <code lang="python">.standard_exponential()</code>, <code lang="python">.standard_normal()</code>, <code lang="python">.standard_t(df)</code> (Student), <code lang="python">.triangular(left, mode, right)</code>, <code lang="python">.uniform(low, high, size)</code>, <code lang="python">.vonmises(mu, kappa)</code>, <code lang="python">.wald(mean, scale)</code> (Gauss inverse), <code lang="python">.weibull(a) et <code lang="python">.zipf(a)</code></code>. Nous n'avons indiqué que les paramètres obligatoires. Elles possèdent toues des paramètres optionnels, dont <code>size</code> (1 par défaut) qui donne la taille du vecteur généré. ; Voir * {{lien web |url=https://numpy.org/doc/stable/reference/random/generator.html#distributions |titre=Random Generator &gt; Distributions |site=NumPy.org |consuloté le=2026-03-23}} Le module <code>np.random</code> permet également : * de prendre un ou plusieurs éléments au hasard dans une matrice M : <code lang="python">.choice(M)</code><br /><code lang="python">gna.choice(M)</code> pour un élément, <code lang="python">gna.choice(M, n)</code> ou <code lang="python">gna.choice(M, size=n)</code> pour ''n'' éléments ; * de mélanger un matrice M : ** <code lang="python">.shuffle(M)</code> mélange la matrice M, ** <code lang="python">.permutation(M)</code> crée une copie mélangée de la matrice M ; * on peut indiquer l'axe de mélange (axe 0 par défaut), par exemple pour l'axe 1 : <code lang="python">.shuffle(M, 1)</code>, <code lang="python">.shuffle(M, axis = 1)</code>, <code lang="python">.permutation(M, 1)</code>, <code lang="python">.permutation(M, axis=1)</code>. Pour assurer une transition simple avec Matlab, NumPy fournit les générateurs pseudo-aléatoires suivants : * <code lang="python">np.random.rand()</code> pour la loi uniforme sur [0 ; 1[ ; on peut indiquer les dimension d'une matrice (ou hypermatrice) en paramètres, par exemple <code lang="python">np.random.rand(a, b)</code> pour une matrice ''a'' × ''b'' ; * <code lang="python">np.random.randn()</code> pour la loi normale centrée réduite ; on peut de même indiquer les dimension d'une matrice (ou hypermatrice) en paramètres, par exemple <code lang="python">np.random.rand(a, b)</code> pour une matrice ''a'' × ''b''. === Avec SciPy === Le module <code>scipy.stats</code> fournit un grand nombre de lois de probabilités. Ces lois sont des objets ayant toutes les mêmes méthodes. Par exemple, on dispose des lois suivantes : * lois dicrètes : ** <code>bernoulli</code> : loi de Bernoulli, ** <code>scipy.stats.binom</code> : loi binomiale, ** <code>scipy.stats.poisson</code> : loi de Poisson, ** <code>scipy.stats.randint</code> : loi discrète uniforme ; * loi continues : ** <code>scipy.stats.chi2</code> : loi du χ<sup>2</sup> (khi carré), ** <code>scipy.stats.norm</code> : loi normale, ** <code>scipy.stats.t</code> : loi de Student, ** <code>scipy.stats.uniform</code> : loi continue uniforme ; et des méthodes suivantes : * <code>.mean()</code> : calcule la moyenne, l'espérance de la loi ; * <code>.median()</code> : calcule la médiane de la loi ; * <code>.var()</code> : calcule la variance de la loi ; * <code>.std()</code> : calcule l'écart type ''({{lang|en|standard deviation}})'' de la loi ; * <code>.moment()</code> : calcule les moments de la loi ; * <code>.rvs()</code> : effectue des tirages aléatoires ''({{lang|en|random variates}})'' ; * <code>.pdf()</code> : fonction densité de probabilité ''({{lang|en|probability density function}})'' pour les lois continues ; * <code>.mdf()</code> : fonction de masse ''({{lang|en|mass density function}})'' pour les lois discrètes ; * <code>.cdf()</code> : fonction de répartition ''({{lang|en|cumulative density function}})'' ; * <code>.ppf()</code> : fonction quantile ''({{lang|en|percent-point function}})'', inverse de <code>.cdf()</code> ; * <code>.fit()</code> : calcule les paramètres de la loi correspondant au mieux à un échantillon, au sens du maximum de vraisemblance ; uniquement pour les lois continues. Par exemple <syntaxhighlight lang="python"> from scipy import stats # moments mvsk : mean (moyenne), variance, skewness (asymétrie), kurtosis moy, var, asy, kurt = stats.norm.stats(moments="mvsk") print(moy, var, asy, kurt) # 0.0 1.0 0.0 0.0 print(stats.norm.pdf(1), ";", stats.norm.cdf(0.5), ";", stats.norm.ppf(0.99)) # Pour la fonction normale centrée réduite : densité de probabilité en 1 ; fonction de répartition en 0,5 ; dernier centile # 0.24197072451914337 ; 0.6914624612740131 ; 2.3263478740408408 x = np.linspace(-6, 6, 100) y1 = stats.norm.pdf(x) # Densité de probabilité de la loi normale centrée réduite y2 = stats.norm.cdf(x) # Fonction de répartition de cette loi plt.plot(x, y1, label="densité") plt.plot(x, y2, label="répartition") plt.legend() </syntaxhighlight> Par défaut, les lois continues sont centrées réduites (de moyenne nulle et d'écart type unité). Les objets disposent des paramètres <code>loc</code> (''location'', position) et <code>scale</code> (échelle) ; par exemple pour un tirage aléatoire de 100 échantillons avec une loi normale de moyenne 10 et d'écart type 5 : <syntaxhighlight lang="python"> stats.norm.rvs(100, loc=5, scale=10) </syntaxhighlight> Il est possible de fixer ces paramètres pour une loi, de la « geler », par exemple : <syntaxhighlight lang="python"> from scipy import stats varAl = stats.norm(loc=5, scale=10) # loi « gelée » (loi normale d'espérance 5 et d'écart type 10) n = 100 x = varAl.rvs(n) plt.plot(x, np.ones_like(x), "|") plt.hist(x) print(varAl.mean(), varAl.std()) </syntaxhighlight> ou encore <syntaxhighlight lang="python"> from scipy import stats n = 100 varAl = stats.poisson(mu=50) # loi de Poison d'espérance mu x = varAl.rvs(size=n) plt.plot(x, np.ones_like(x), "|") plt.hist(x) print(varAl.mean(), varAl.std()) res = stats.norm.fit(x) print(res) </syntaxhighlight> [[File:Diagramme qq python matplotlib.svg|vignette|upright=1.5|Diagramme quantile-quantile avec Python Scipy et Matplotlib.]] L'exemple suivant consiste à vérifier qu'un échantillon suit bien une loi normale centrée réduite en traçant sa droite de Henry : <syntaxhighlight lang="python"> import numpy as np from scipy import stats import matplotlib.pyplot as plt X = stats.norm.rvs(size=100) p = np.arange(0.1, 1, 0.1) qexp = np.quantile(X, p) qth = stats.norm.ppf(p) extr = stats.norm.ppf([0.1, 0.9]) plt.plot(extr, extr, "--r") plt.plot(qth, qexp, "*") plt.title("diagramme quantiles-quantiles") plt.xlabel("quantiles théoriques") plt.ylabel("quantiles expérimentaux") plt.savefig("diagramme_qq_python_matplotlib.svg") </syntaxhighlight> Pour les lois discrète, il est nécessaire d'indiquer leurs paramètres. Par exemple : * pour la loi de Bernoulli, la probabilité ''p'' : <code>stats.bernoulli(p)</code> ; * pour la loi binomiale, les facteurs de forme ''n'' et ''p'' : <code>stats.binom(n, p)</code> ; * pour la loi de Poisson : le paramètre μ (mu) : <code>stats.poisson(mu)</code> ; l est également possible de décaler la loi, <code>stats.poisson(mu, loc)</code> ; * pour la loi discrète uniforme, les valeurs minimales et maximales : <code>stats.randint(low, high)</code>. == Ressources == * {{lien web | url = https://docs.scipy.org/doc/scipy/reference/stats.html | titre = Statistical functions (scipy.stats) | site = Numpy and Scipy Documentation | consulté le = 2019-05-22 }} == Notes et références == {{références}} ---- [[../Polynômes|Polynômes]] &lt; [[../|↑]] &gt; [[../Interpolation, extrapolation et lissage|Interpolation, extrapolation et lissage]] [[Catégorie:Python pour le calcul scientifique (livre)]] des2afc90d58hzee0rnvrnrguc7q3wq 767583 767582 2026-06-08T10:38:50Z Cdang 1202 /* Avec SciPy */ exemple 767583 wikitext text/x-wiki Le module NumPy fournit des fonctions statistiques. Rappelons que dorénavant les programmes commencent tous par : <syntaxhighlight lang="python"> #!/usr/bin/python3 import numpy as np import matplotlib.pyplot as plt </syntaxhighlight> == Méthodes de matrices == Rappel : la classe des matrices ''(ndarray)'' dispose de méthodes permettant de calculer des statistiques sur les éléments des matrices : * <code>.min()</code> : minimum des valeurs ; * <code>.max()</code> : maximum des valeurs ; * <code>.ptp()</code> : écart amplitude « max – min » ''({{lang|en|peak to peak}})'' ; * <code>.mean()</code> : moyenne ; * <code>.std()</code> : écart type ''({{lang|en|standard deviation}})''. == Statistiques descriptives == NumPy fournit la fonction <code>np.quantile()</code> qui détermine les quantiles avec la syntaxe : <syntaxhighlight lang="python"> np.quantile(M, q) </syntaxhighlight> où <code>M</code> est une matrice (ou une liste, un n-uplet, bref un itérable de nombres) et <code>q</code> est un quantile ou un vecteur de quantiles sous la forme d'un nombre entre 0 et 1. Par exemple, pour avoir les quartiles : <syntaxhighlight lang="python"> np.quantile(M, [0, 0.25, 0.5, 0.75, 1]) </syntaxhighlight> Si un des éléments de la matrice est un NaN, le résultat est un NaN. Pour éviter cela, on peut utiliser la fonction <code>np.nanquantile()</code> qui ignore les NaN. Les fonctions <code>np.percentile()</code> et <code>np.nanpercentile()</code> donnent les centiles ; on indique alors le centile que l'on veut sous la forme d'un nombre entier entre 0 et 100. Nous disposons également des fonctions suivantes : * <code>np.amin()</code>, <code>np.nanmin()</code> : minimum ; * <code>np.amax()</code>, <code>np.nanmax()</code> : maximum ; * <code>np.ptp()</code> : amplitude. Notons que pour toutes les fonctions, il est possible d'indiquer l'axe selon lequel on effectue le calcul. Par exemple, <syntaxhighlight lang="python"> M = np.arange(9).reshape(3, 3) # [[0, 1, 2] # [3, 4, 5] # [6, 7, 8]] print(np.quantile(M, [0.25, 0.5], 0)) # [[1.5 2.5 3.5] : 1er quartile des colonnes # [3. 4. 5. ]] : médiane des colonnes print(np.quantile(M, [0.25, 0.5], 1)) # [[0.5 3.5 6.5] : 1er quartile des lignes # [1. 4. 7. ]] : médiane des lignes </syntaxhighlight> == Indicateurs de position et de dispersion == NumPy fournit les indicateurs de tendance centrale suivants : * <code>np.mean()</code> et <code>np.nanmean()</code> : moyenne ; * <code>np.average()</code> et <code>np.nanaverage()</code> : moyenne pondérée ; la syntaxe est <code>np.average(M, axe, poids)</code> ou bien <code>np.average(M, weights = poids)</code> (voir ci-après) ; * <code>np.median()</code> et <code>np.nanmedian()</code> : médiane. En terme de performances, la fonction <code>np.mean()</code> est équivalente à la méthode <code>M.mean()</code> et à la fonction <code>np.average()</code> sans poids (ce qui équivaut donc à la moyenne). En revanche, la fonction <code>np.nanmean()</code> est plus lente, de même que la fonction <code>np.average()</code> lorsque l'on utilise des poids (même s'ils sont tous égaux à 1). Comme précédemment, on peut indiquer l'axe (si l'on veut évaluer les valeurs par colonne ou par ligne). Pour la moyenne pondérée, on utilise une matrice poids P de même dimension que la matrice de valeurs M, <code>P[i, j]</code> étant le poids associé à la valeur <code>M[i, j]</code>. Par exemple, si l'on veut évaluer la moyenne pondérée pour toutes les valeurs de M (pas d'axe), on peut écrire une des deux solutions suivantes : <syntaxhighlight lang="python"> np.average(M, None, P) # l'axe est le 2e paramètre np.average(M, weights = P) </syntaxhighlight> NumPy fournit également les indicateurs de dispersion suivants : * <code>np.std()</code>, <code>np.nanstd()</code> : écart type ''({{lang|en|standard deviation}})'' ; * <code>np.var()</code>, <code>np.np.nanvar()</code> : variance. == Fréquence, histogramme == On peut générer une matrice aléatoire avec les fonctions <code>np.random.rand()</code>, qui utilise une loi uniforme sur [0 ; 1], et <code>np.random.randn()</code> qui utilise une loi normale centrée réduite. Lorsque l'on dispose d'une série de données aléatoires, qu'elles aient été mesurées ou bien générées par une fonction aléatoire, on peut ensuite les mettre dans des classes ''({{lang|en|bins}})''. Les classes sont définies par un vecteur (ou une liste, un n-uplet) <code>[c1, c2,c3, …, cn]</code>. La classe 0 désigne les valeurs inférieures à ''c''<sub>1</sub> ; la classe 1 désigne les valeurs ''c''<sub>1</sub> ≤ ''x'' &lt; ''c''<sub>2</sub> ; la classe ''n'' (<code>n == len(classes)</code>) désigne les valeurs supérieures à ''c<sub>n</sub>''. La fonction <code>np.digitize()</code> indique dans quelle classe se trouve un nombre. Si on lui donne une matrice (ou un vecteur, une liste, un n-uplet), il renvoie une matrice de même dimension, <code>np.digitize(M, classes)[i, j]</code> étant la classe de l'élément <code>M[i, j]</code>. Par exemple : <syntaxhighlight lang="python"> M = np.random.rand(10) classes = (0, 0.2, 0.4, 0.6, 0.8, 1) print(M) print(np.digitize(M, classes)) </syntaxhighlight> On peut changer la « largeur » des inégalités avec le paramètre <code>right = True</code> : ''{{lang|en|right}}'', « droite », est vrai ''({{lang|en|true}})'' lorsque l'inégalité large est à droite, la classe ''i'' désigne les valeurs ''c<sub>i</sub>'' &lt; ''x'' ≤ ''c''<sub>''i'' + 1</sub>. La syntaxe est alors <code>np.digitize(M, classes, True)</code> ou bien <code>np.digitize(M, classes, right = True)</code>. Le sens de l'inégalité ne dépend pas du sens du vecteur de classes ; ainsi, ''{{lang|en|right}}'' désigne la valeur supérieure de l'intervalle même si le vecteur de classes est classé par ordre décroissant. [[Fichier:Histogramme loi normale 50 ech numpy pyplot.png|vignette|Histogramme tracé avec Python/Numpy/Matplotlib.]] La fonction <code>np.histogram()</code> détermine ''n'' classes de même taille et renvoie deux vecteurs : le premier contient le nombre d'éléments dans chaque classe et le second décrit les classes (c'est-à-dire les bornes des classes). Pour tracer l'histogramme, nous disposons de la fonction <code>plt.hist()</code> : <syntaxhighlight lang="python"> M = np.random.randn(50) plt.plot(M, np.ones_like(M), "|") plt.hist(M, bins=10, density=1) </syntaxhighlight> La fonction <code>np.bincount()</code> travaille sur les listes de nombres entiers. Elle renvoie un n-uplet, <code>np.bincount(M)[i]</code> est le nombre de fois que le nombre ''i'' revient dans la matrice M — rappel, le premier élément du n-uplet <code>np.bincount(M)</code> a l'indice 0 donc correspond au nombre de fois que le nombre 0 apparaît dans la matrice M. == Lois de probabilités == === Avec NumPy === NumPy fournit des générateurs de nombres pseudo-aléatoires, avec le module <code lang="python">random</code>. Pour définir un générateur de nombres (pseudo-)aléatoires (GNA), on l'initialise avec la fonction <syntaxhighlight lang="python"> gna = np.random.default_rng() </syntaxhighlight> on peut lui indiquer une graine, qui est un nombre entier, idéalement grand. Par exemple : <syntaxhighlight lang="python"> gna = np.random.default_rng() </syntaxhighlight> On peut ensuite utiliser ce générateur pour effectuer des tirages selon différentes lois de probabilité : * <code>.random()</code> : distribution uniforme dans [0 ; 1[ ; * <code>.standard_normal()</code> : distribution normale centrée réduite ; * <code>.integers(a, b)</code> : nombres entiers répartis uniformément sur [''a'' ; ''b'' [. Par exemple : <syntaxhighlight lang="python"> # loi uniforme A = gna.random() # un nombre aléatoire B = gna.random(5) # vecteur de 5 nombres aléatoires ; équivalent à gna.random(size = 5) # loi normale A = gna.standard_normal() # un nombre aléatoire B = gna.standard_normal(5) # vecteur de 5 nombres aléatoires ; équivalent à gna.standard_normal(size = 5) # loi uniforme sur des entiers A = gna.integers(1, 10) # un nombre aléatoire entre 1 et 9 inclus ; équivalent à gna.integers(low = 1, high = 10) A = gna.integers(1, 10, 5) # 5 nombre aléatoires entre 1 et 9 inclus ; équivalent à gna.integers(low = 1, high = 10, size = 10) </syntaxhighlight> NumPy fournit des générateurs pseudo-aléatoires pour les lois suivantes : : <code lang="python">.beta(a, b)</code>, <code lang="python">.binomial(n, p)</code>, <code lang="python">.chisquare(df)</code>, <code lang="python".>dirichlet(alpha)</code>, <code lang="python">.exponential()</code>, <code lang="python">.f(dnum, dfden)</code> (F), <code lang="python">.gamma(shape)</code>, <code lang="python">.geometric(p)</code>, <code lang="python">.gumbel()</code>, <code lang="python">.hypergeometric(ngood, nbad, nsample)</code>, <code lang="python">.laplace()</code>, <code lang="python">.logisticl()</code>, <code lang="python">.lognormal()</code>, <code lang="python">.logseries(p)</code>, <code lang="python">.multinomial(n, pvals)</code>, <code lang="python">.multivariate_hypergeometric(colors, nsample)</code>, <code lang="python">.multivariate_normal(mean, cov)</code>, <code lang="python">.negative_binomial(n, p)</code>, <code lang="python">.noncentral_chisquare(df, nonc)</code>, <code lang="python">.noncentral_f(dfnum, dfden, nonc)</code>, <code lang="python">.normal()</code>, <code lang="python">.pareto(a)</code>, <code lang="python">.poisson()</code>, <code lang="python">.power(a)</code>, <code lang="python">.rayleigh()</code>, <code lang="python">.standatd_cauchy()</code>, <code lang="python">.standard_exponential()</code>, <code lang="python">.standard_normal()</code>, <code lang="python">.standard_t(df)</code> (Student), <code lang="python">.triangular(left, mode, right)</code>, <code lang="python">.uniform(low, high, size)</code>, <code lang="python">.vonmises(mu, kappa)</code>, <code lang="python">.wald(mean, scale)</code> (Gauss inverse), <code lang="python">.weibull(a) et <code lang="python">.zipf(a)</code></code>. Nous n'avons indiqué que les paramètres obligatoires. Elles possèdent toues des paramètres optionnels, dont <code>size</code> (1 par défaut) qui donne la taille du vecteur généré. ; Voir * {{lien web |url=https://numpy.org/doc/stable/reference/random/generator.html#distributions |titre=Random Generator &gt; Distributions |site=NumPy.org |consuloté le=2026-03-23}} Le module <code>np.random</code> permet également : * de prendre un ou plusieurs éléments au hasard dans une matrice M : <code lang="python">.choice(M)</code><br /><code lang="python">gna.choice(M)</code> pour un élément, <code lang="python">gna.choice(M, n)</code> ou <code lang="python">gna.choice(M, size=n)</code> pour ''n'' éléments ; * de mélanger un matrice M : ** <code lang="python">.shuffle(M)</code> mélange la matrice M, ** <code lang="python">.permutation(M)</code> crée une copie mélangée de la matrice M ; * on peut indiquer l'axe de mélange (axe 0 par défaut), par exemple pour l'axe 1 : <code lang="python">.shuffle(M, 1)</code>, <code lang="python">.shuffle(M, axis = 1)</code>, <code lang="python">.permutation(M, 1)</code>, <code lang="python">.permutation(M, axis=1)</code>. Pour assurer une transition simple avec Matlab, NumPy fournit les générateurs pseudo-aléatoires suivants : * <code lang="python">np.random.rand()</code> pour la loi uniforme sur [0 ; 1[ ; on peut indiquer les dimension d'une matrice (ou hypermatrice) en paramètres, par exemple <code lang="python">np.random.rand(a, b)</code> pour une matrice ''a'' × ''b'' ; * <code lang="python">np.random.randn()</code> pour la loi normale centrée réduite ; on peut de même indiquer les dimension d'une matrice (ou hypermatrice) en paramètres, par exemple <code lang="python">np.random.rand(a, b)</code> pour une matrice ''a'' × ''b''. === Avec SciPy === Le module <code>scipy.stats</code> fournit un grand nombre de lois de probabilités. Ces lois sont des objets ayant toutes les mêmes méthodes. Par exemple, on dispose des lois suivantes : * lois dicrètes : ** <code>bernoulli</code> : loi de Bernoulli, ** <code>scipy.stats.binom</code> : loi binomiale, ** <code>scipy.stats.poisson</code> : loi de Poisson, ** <code>scipy.stats.randint</code> : loi discrète uniforme ; * loi continues : ** <code>scipy.stats.chi2</code> : loi du χ<sup>2</sup> (khi carré), ** <code>scipy.stats.norm</code> : loi normale, ** <code>scipy.stats.t</code> : loi de Student, ** <code>scipy.stats.uniform</code> : loi continue uniforme ; et des méthodes suivantes : * <code>.mean()</code> : calcule la moyenne, l'espérance de la loi ; * <code>.median()</code> : calcule la médiane de la loi ; * <code>.var()</code> : calcule la variance de la loi ; * <code>.std()</code> : calcule l'écart type ''({{lang|en|standard deviation}})'' de la loi ; * <code>.moment()</code> : calcule les moments de la loi ; * <code>.rvs()</code> : effectue des tirages aléatoires ''({{lang|en|random variates}})'' ; * <code>.pdf()</code> : fonction densité de probabilité ''({{lang|en|probability density function}})'' pour les lois continues ; * <code>.mdf()</code> : fonction de masse ''({{lang|en|mass density function}})'' pour les lois discrètes ; * <code>.cdf()</code> : fonction de répartition ''({{lang|en|cumulative density function}})'' ; * <code>.ppf()</code> : fonction quantile ''({{lang|en|percent-point function}})'', inverse de <code>.cdf()</code> ; * <code>.fit()</code> : calcule les paramètres de la loi correspondant au mieux à un échantillon, au sens du maximum de vraisemblance ; uniquement pour les lois continues. Par exemple, pour la loi normale, on a : : <math>\mathtt{scipy.stats.norm.mean(m, sigma)} = m</math> : <math>\mathtt{scipy.stats.norm.pdf(x, m, sigma)} = \frac{1}{\sigma \sqrt{2\pi}} \exp \left ( -\frac{1}{2} \left ( \frac{x - m}{\sigma} \right )^2 \right )</math> : <math>\mathtt{scipy.stats.norm.cdf(x, m, sigma)} = \int_{-\infty}^{x} \frac{1}{\sigma \sqrt{2\pi}} \exp \left ( -\frac{1}{2} \left ( \frac{t - m}{\sigma} \right )^2 \right ) \mathrm{d}t</math> Exemple de mise en œuvre : <syntaxhighlight lang="python"> from scipy import stats # moments mvsk : mean (moyenne), variance, skewness (asymétrie), kurtosis moy, var, asy, kurt = stats.norm.stats(moments="mvsk") print(moy, var, asy, kurt) # 0.0 1.0 0.0 0.0 print(stats.norm.pdf(1), ";", stats.norm.cdf(0.5), ";", stats.norm.ppf(0.99)) # Pour la fonction normale centrée réduite : densité de probabilité en 1 ; fonction de répartition en 0,5 ; dernier centile # 0.24197072451914337 ; 0.6914624612740131 ; 2.3263478740408408 x = np.linspace(-6, 6, 100) y1 = stats.norm.pdf(x) # Densité de probabilité de la loi normale centrée réduite y2 = stats.norm.cdf(x) # Fonction de répartition de cette loi plt.plot(x, y1, label="densité") plt.plot(x, y2, label="répartition") plt.legend() </syntaxhighlight> Par défaut, les lois continues sont centrées réduites (de moyenne nulle et d'écart type unité). Les objets disposent des paramètres <code>loc</code> (''location'', position) et <code>scale</code> (échelle) ; par exemple pour un tirage aléatoire de 100 échantillons avec une loi normale de moyenne 10 et d'écart type 5 : <syntaxhighlight lang="python"> stats.norm.rvs(100, loc=5, scale=10) </syntaxhighlight> Il est possible de fixer ces paramètres pour une loi, de la « geler », par exemple : <syntaxhighlight lang="python"> from scipy import stats varAl = stats.norm(loc=5, scale=10) # loi « gelée » (loi normale d'espérance 5 et d'écart type 10) n = 100 x = varAl.rvs(n) plt.plot(x, np.ones_like(x), "|") plt.hist(x) print(varAl.mean(), varAl.std()) </syntaxhighlight> ou encore <syntaxhighlight lang="python"> from scipy import stats n = 100 varAl = stats.poisson(mu=50) # loi de Poison d'espérance mu x = varAl.rvs(size=n) plt.plot(x, np.ones_like(x), "|") plt.hist(x) print(varAl.mean(), varAl.std()) res = stats.norm.fit(x) print(res) </syntaxhighlight> [[File:Diagramme qq python matplotlib.svg|vignette|upright=1.5|Diagramme quantile-quantile avec Python Scipy et Matplotlib.]] L'exemple suivant consiste à vérifier qu'un échantillon suit bien une loi normale centrée réduite en traçant sa droite de Henry : <syntaxhighlight lang="python"> import numpy as np from scipy import stats import matplotlib.pyplot as plt X = stats.norm.rvs(size=100) p = np.arange(0.1, 1, 0.1) qexp = np.quantile(X, p) qth = stats.norm.ppf(p) extr = stats.norm.ppf([0.1, 0.9]) plt.plot(extr, extr, "--r") plt.plot(qth, qexp, "*") plt.title("diagramme quantiles-quantiles") plt.xlabel("quantiles théoriques") plt.ylabel("quantiles expérimentaux") plt.savefig("diagramme_qq_python_matplotlib.svg") </syntaxhighlight> Pour les lois discrète, il est nécessaire d'indiquer leurs paramètres. Par exemple : * pour la loi de Bernoulli, la probabilité ''p'' : <code>stats.bernoulli(p)</code> ; * pour la loi binomiale, les facteurs de forme ''n'' et ''p'' : <code>stats.binom(n, p)</code> ; * pour la loi de Poisson : le paramètre μ (mu) : <code>stats.poisson(mu)</code> ; l est également possible de décaler la loi, <code>stats.poisson(mu, loc)</code> ; * pour la loi discrète uniforme, les valeurs minimales et maximales : <code>stats.randint(low, high)</code>. == Ressources == * {{lien web | url = https://docs.scipy.org/doc/scipy/reference/stats.html | titre = Statistical functions (scipy.stats) | site = Numpy and Scipy Documentation | consulté le = 2019-05-22 }} == Notes et références == {{références}} ---- [[../Polynômes|Polynômes]] &lt; [[../|↑]] &gt; [[../Interpolation, extrapolation et lissage|Interpolation, extrapolation et lissage]] [[Catégorie:Python pour le calcul scientifique (livre)]] 7eiiwln7cl4la2ekuw0sanojvmtd2wh Photographie/Fabricants/Rollei/Rollei Rolleiflex 3.5 E 0 75405 767576 647776 2026-06-07T14:46:09Z Cquoi 18950 /* Liens */ lien mode d'emploi 767576 wikitext text/x-wiki {{Ph s Fabricants}} == Rollei 3.5 E == <gallery widths="240px" heights="240px"> Rolleiflex 3.5 E chambre moyen format 6x6 double objectif.jpg|Rolleiflex 3.5 E chambre moyen format 6x6 double objectif </gallery> == Caractéristiques == {{APAR <!-- Général --> | type d'appareil = chambre moyen format reflex 6x6 bi-objectif | disponibilité = 1958 ► 1981 | prix = | format de film = 120 (6x6) | construction du boîtier = | avance du film = par manivelle couplée à l'armement | compteur de vues = oui | mise en marche = | particularités = chargement semi-automatique après alignement flèche / repère <!-- Optique --> | objectifs = [[Carl Zeiss]] Planar 75 mm f/3,5 à 5 lentilles | monture des objectifs = fixe | présélection du diaphragme = par molette frontale sur le bloc optique <!-- Visée et affichage --> | viseur = objectif de visée 75 mm f/2,8 à 3 lentilles, couplé à l'objectif de prise de vue, et dépoli interchangeable | accessoire de visée = loupe rigide 2,5X, prisme redresseur 1,5X | informations dans le viseur = | écran à cristaux liquides = non <!-- Mise au point --> | manuelle = commandée par un bouton à main gauche | autofocus = non | stabilisation = non | touche de [[profondeur de champ]] = non <!-- Obturateur --> | type = central mécanique Synchro-Compur taille CR00, B | fabricant ou marque = Franke & Heidecke | vitesse minimale (s) = 1 | vitesse maximale (s) = 1/500 | pose B ou T = | prise de vue en rafales = | retardement (s) = 10 | déclencheur = | expositions multiples = oui <!-- Exposition --> | modes A S P M = manuel | modes scènes et autres = | modes de mesure = | sensibilité du film (ISO) = | correction d'exposition = | mémorisation de la mesure = | autres données = <!-- Flash --> | flash intégré = non | synchronisation = | modes = | nombre-guide et portée = | prise pour flash externe = <!-- Autres caractéristiques --> | écrou de pied = | alimentation = aucune | contrôle des piles = | dimensions L x h x p (mm) = | poids (g) = 1 230 | accessoires fournis = sacoche en cuir et bouchon d'objectifs métallique | accessoires en option = | divers = |- |pays de fabrication=Allemagne}} == Commentaires == == Bibliographie == == Liens == [https://galerie-photo.com/rolleiflex_bi_objectif.html Les Rolleiflex bi-objectifs] [https://galerie-photo.com/manuels/notice-rolleiflex-3,5e.pdf Sur galerie-photo.com : notice du rolleiflex 3,5 E] [[Catégorie:Photographie]] [[Catégorie:Appareil argentique reflex]] nupri5ngxa00moqbtn0wgwocr9u4gzs Discussion:Ict@innovation: Free your IT Business in Africa/6-3 1 83933 767578 2026-06-08T01:35:57Z Elissaint sadrack 123958 /* IMPACT DE L’ORGANISATION SUR L’EFFICACITÉ DE L’ENTREPRISE */ nouvelle section 767578 wikitext text/x-wiki == IMPACT DE L’ORGANISATION SUR L’EFFICACITÉ DE L’ENTREPRISE == IMPACT DE L’ORGANISATION SUR L’EFFICACITÉ DE L’ENTREPRISE [[Utilisateur:Elissaint sadrack|Elissaint sadrack]] ([[Discussion utilisateur:Elissaint sadrack|discussion]]) 8 juin 2026 à 03:35 (CEST) e2revbkiivt85zzbrp4nrar0ek1x1no