BreizhCamp 2015 #BzhCmp
#python #bzhcmp
BreizhCamp 2015 #BzhCmp
Python après 15 ans de
JAVA
Pierre-Alban DEWITTE - @__pad__
dev.myscript.com
PYTHON
● Langage généraliste
● Dynamiquement typé
● Orienté objet
● Fonctionnel
● Gestion de la mémoire par un garbage
collector
...
● Créé par Guido van Rossum
● Version 0.9 datant de 1991
● Version 1.0 datant de 1994
● Développé par la communauté
● Code...
Python 2 ou Python 3
● Quelques changement de syntaxe
● Portée des variables limitées
● Fusion de librairies
● Utilisation de l’UTF-8 par défau...
● Contraint par l’environnement
● Contraint par des librairies
http://python3wos.appspot.com/ et
notamment Spark
● Vous vo...
Le langage
● Bye bye les accolades !
● Ne pas mélanger espaces et tabulations
Identation
• En python3 toute les chaines sont unicodes
(comme java)
• Le préfixe r indique de ne pas échapper la
chaine
• Nombreuses...
● List est un type natif
● Les tuples sont des listes immutables
● Les fonctions de manipulation sont intégrées
au langage...
ArrayList
uneListe = ['Morbihan', 'Finistère', 'Côtes-
d''Armor', 'Ile et Vilaine']
uneListe.append('Loire-Atlantique')
un...
ArrayList
print(unTuple)
# Dernier élément
print(unTuple[-1])
# Entre le second et l'avant dernier élément
print(unTuple[1...
ArrayList
# Equivalent du .equals() en Java
print(copie == uneListe)
# Equivalent du == en Java
print(copie is uneListe)
#...
ArrayList
print("for ... in ...")
for dpt in uneListe:
print(dpt)
print("for ... in enumerate(...)")
for idx, dpt in enume...
ArrayList
if 'Morbihan' in uneListe :
print("A moitié bretons")
uneListe.remove('Morbihan')
print(uneListe)
uneListe.sort(...
Set
# Création de la patte à galette
myset = {'farine', 'eau', 'sel', 'oeufs'}
print(myset)
# Finalement double dose de fa...
Map
mydict = {
# Tableau comme valeur
'ingredients':
['farine', 'eau'],
# Set comme valeur
'ustensiles': {'spatule', 'poel...
Map
{'ustensiles': {'poele', 'spatule'},
'duree': 10, 'difficulte': {'debutants':
'facile', 'experimente': 'super facile'}...
Fonctions
def ma_fonction(arg1, arg2="default", *args,
**kwargs):
# arg1 est obligatoire
print("arg1:", arg1)
# arg2 optio...
Fonctions
########### appel 1 ###########
arg1: 1
arg2: default
args: ()
kwargs: {}
########### appel 2 ###########
arg1: ...
Classes
class MaClasse(object):
def __init__(self, transform):
self.attribut = 'un attribut'
self.transform = transform
de...
● Favoriser autant que possible l’utilisation de
fonctions
● Toujours préférer une fonction à l’utilisation
de l’héritage
...
● Notion de package comme en java
● Un répertoire doit contenir un fichier
__init__.py
● Possibilité d’importer un package...
Et vraiment beaucoup de choses
Eco-système
● De nombreuses librairies sont disponibles
dans le runtime Python
● Eco-système très riche et très
communautaire
Librairi...
Librairies natives
Jetty <> http.server
python –m http.server 8080
● Utile créer un serveur HTTP minimaliste
Documentation
def max(*args, key=None):
"""
max(iterable, *[, default=obj, key=func]) -
> value
max(arg1, arg2, *args, *[,...
JUNIT, TestNG <> unittest
import unittest
def fun(x,y):
return x + y
class MyTest(unittest.TestCase):
def setUp(self):
sel...
Mockito <> unittest.mock
from unittest.mock import MagicMock
class ProductionClass(object):
def method(self):
self.somethi...
● Extrêmement complet
● Attention à ne bien initialiser qu’une fois
● Pas tout le temps compatible avec d’autre
modules (m...
Jackson <> json
json_string = '{"first_name": "Guido",
"last_name":"Rossum"}'
parsed_json = json.loads(json_string)
print(...
Autres équivalences
JAVA PYTHON
Commons IO os, shutil, subprocess
et sys
Commons Collections collections
Commons Codec cod...
Gestion des dépendances
● Pip est le gestionnaire de dépendance
couramment utilisé
● Par convention la liste des dépendance est
contenue dans le f...
Virtualenv
● VENV permet d’isoler un environnement
d’éxécution
● Permet de figer une version de Python et les
dépendances
...
Librairies disponibles dans PyPi
Jodatime <> dateutil
from dateutil.relativedelta import *
from dateutil.easter import *
from dateutil.rrule import *
from ...
HTTPClient <> Requests
r = requests.get('https://…/json', auth=('u','p'))
print(r.status_code)
print(r.headers['content-ty...
Bootle <> Spring MVC
from bottle import get, post, request # or route
@get('/login') # or @route('/login')
def login():
re...
● SQLAlchemy est Spring JDBC et Hibernate
réunis
● DJANGO est à Python de que Grails est à
Groovy
● Des librairies scienti...
PEP8
● classes : CorrectClassName
● exceptions : IncorrectClassNameError (suffixe
"Error" !)
● fonctions : get_correct_number()...
● Script PEP 8
● autre
Pour vérifier
Sources
● http://sametmax.com/cours-et-tutos/les-
articles-pour-apprendre-python-dans-le-bon-
ordre/
● http://docs.python-guide.or...
● http://sametmax.com
● http://www.talkpythontome.com/
● http://pycoders.com/
Pour se tenir au courant
• VIDEO PYCON 2015
Questions
#python #bzhcmp
@__pad__
Python après 15 ans de JAVA
Prochain SlideShare
Chargement dans…5
×

Python après 15 ans de JAVA

708 vues

Publié le

JAVA n'a plus de secret pour vous. Créer un projet, le passer de maven à graddle, enlever Spring, remplacer Guava par les API de Java 8 vous le faites sans même réfléchir. Vous avez essayé Python et la ce n'est plus la même affaire. Passé le "Hello World", quand il a fallu faire un projet de la vrai vie le courage vous a quitté. Cette conférence donnera les clefs pour bien débuter en Python quand on est un dev JAVA. Python 2 ou Python 3, choix d'un IDE, outils de build, contrôle de code, gestion des dépendances, choix des librairies, documentation, ressources indispensables à connaitre...

Publié dans : Logiciels
0 commentaire
1 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
708
Sur SlideShare
0
Issues des intégrations
0
Intégrations
2
Actions
Partages
0
Téléchargements
76
Commentaires
0
J’aime
1
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive
  • Me relire
    MAJ le ws et uploader sur Github
    Répéter
  • Usage script de python
    Envie de faire un projet plus conséquent avec Python
    Impression de recommencer de zéro
  • Source : http://antrix.net/static/pages/python-for-java/online/#what_is_python
    http://fr.wikipedia.org/wiki/Python_%28langage%29
  • PEP = Python Enchancement Proposal
  • http://python3wos.appspot.com/
    http://sametmax.com/dois-je-apprendre-python-2-ou-python-3/
    https://speakerdeck.com/pyconslides/python-3-dot-3-trust-me-its-better-than-python-2-dot-7-by-dr-brett-cannon
    http://sametmax.com/python-3-est-fait-pour-les-nouveaux-venus/
  • http://python.lycee.free.fr/annexes.html
    https://spark.apache.org/docs/latest/programming-guide.html
  • http://antrix.net/static/pages/python-for-java/online/#fun_with_lists
  • http://antrix.net/static/pages/python-for-java/online/#fun_with_lists
  • http://antrix.net/static/pages/python-for-java/online/#fun_with_lists
  • http://antrix.net/static/pages/python-for-java/online/#fun_with_lists
  • http://antrix.net/static/pages/python-for-java/online/#fun_with_lists
  • Encore énormément de choses…

    Si vous aimez Groovy vous serez comme chez vous
  • https://docs.python.org/3/library/
  • https://docs.python.org/3.4/library/unittest.html
  • https://docs.python.org/3.4/library/unittest.mock.html
  • https://labix.org/python-dateutil
  • http://docs.python-requests.org/en/latest/
  • http://media.jehaisleprintemps.net/talks/pep8-talk/#slide85
  • Python après 15 ans de JAVA

    1. 1. BreizhCamp 2015 #BzhCmp #python #bzhcmp BreizhCamp 2015 #BzhCmp Python après 15 ans de JAVA Pierre-Alban DEWITTE - @__pad__
    2. 2. dev.myscript.com
    3. 3. PYTHON
    4. 4. ● Langage généraliste ● Dynamiquement typé ● Orienté objet ● Fonctionnel ● Gestion de la mémoire par un garbage collector PYTHON
    5. 5. ● Créé par Guido van Rossum ● Version 0.9 datant de 1991 ● Version 1.0 datant de 1994 ● Développé par la communauté ● Code détenu par la Python Software Fundation ● Evolution à travers des PEP (≈JSR) PYTHON
    6. 6. Python 2 ou Python 3
    7. 7. ● Quelques changement de syntaxe ● Portée des variables limitées ● Fusion de librairies ● Utilisation de l’UTF-8 par défaut ● Exceptions Python 2 ou Python 3 for ind in [1, 2, 3]: squared = [ind**2 for ind in (20, 30, 40, 50)] print(ind)
    8. 8. ● Contraint par l’environnement ● Contraint par des librairies http://python3wos.appspot.com/ et notamment Spark ● Vous voulez utiliser Jython Pourquoi choisir Python 2
    9. 9. Le langage
    10. 10. ● Bye bye les accolades ! ● Ne pas mélanger espaces et tabulations Identation
    11. 11. • En python3 toute les chaines sont unicodes (comme java) • Le préfixe r indique de ne pas échapper la chaine • Nombreuses fonctions disponibles nativement System.out.println() c: empdir c:tempdir c:tempdir print('c:tempdir') print('c:tempdir') print(r'c:tempdir')
    12. 12. ● List est un type natif ● Les tuples sont des listes immutables ● Les fonctions de manipulation sont intégrées au langage ● Comme si Guava était inclus nativement ArrayList
    13. 13. ArrayList uneListe = ['Morbihan', 'Finistère', 'Côtes- d''Armor', 'Ile et Vilaine'] uneListe.append('Loire-Atlantique') uneListe.append(50) print(uneListe) uneListe.pop() print(uneListe) unTuple = (22, 29, 56, 35) print(unTuple) ['Morbihan', 'Finistère', 'Côtes-dArmor', 'Ile et Vilaine', 'Loire-Atlantique', 50] ['Morbihan', 'Finistère', 'Côtes-dArmor', 'Ile et Vilaine', 'Loire-Atlantique'] (22, 29, 56, 35)
    14. 14. ArrayList print(unTuple) # Dernier élément print(unTuple[-1]) # Entre le second et l'avant dernier élément print(unTuple[1:-1]) # Un élément sur deux de la liste print(unTuple[::2]) # En inversant l'ordre print(unTuple[::-1]) (22, 29, 56, 35) 35 (29, 56) (22, 56) (35, 56, 29, 22)
    15. 15. ArrayList # Equivalent du .equals() en Java print(copie == uneListe) # Equivalent du == en Java print(copie is uneListe) # Equivalent du hashCode() en java print(id(copie), id(uneListe)) True False 51316416 51315096
    16. 16. ArrayList print("for ... in ...") for dpt in uneListe: print(dpt) print("for ... in enumerate(...)") for idx, dpt in enumerate(uneListe): print(idx, " -> ", dpt) for ... in ... Morbihan ... Loire-Atlantique for ... in enumerate(...) 0 -> Morbihan ... 4 -> Loire-Atlantique
    17. 17. ArrayList if 'Morbihan' in uneListe : print("A moitié bretons") uneListe.remove('Morbihan') print(uneListe) uneListe.sort() print(uneListe) A moitié bretons ['Finistère', 'Côtes-dArmor', 'Ile et Vilaine', 'Loire-Atlantique'] ['Côtes-dArmor', 'Finistère', 'Ile et Vilaine', 'Loire-Atlantique']
    18. 18. Set # Création de la patte à galette myset = {'farine', 'eau', 'sel', 'oeufs'} print(myset) # Finalement double dose de farine myset.add('farine') print(myset) # Jamais de la vie avec des oeufs myset.remove('oeufs') print(myset) {'eau', 'sel', 'farine', 'oeufs'} {'eau', 'sel', 'farine', 'oeufs'} {'eau', 'sel', 'farine'}
    19. 19. Map mydict = { # Tableau comme valeur 'ingredients': ['farine', 'eau'], # Set comme valeur 'ustensiles': {'spatule', 'poele'}, # Tout type 'duree': 10, # Imbrication des dictionaires entre eux 'difficulte': { 'debutants': 'facile', 'experimente': 'super facile'} } print(mydict) mydict.pop('ustensiles') print(json.dumps(mydict, indent=2, separators=(',', ': ')))
    20. 20. Map {'ustensiles': {'poele', 'spatule'}, 'duree': 10, 'difficulte': {'debutants': 'facile', 'experimente': 'super facile'}, 'ingredients': ['farine', 'eau']} { "duree": 10, "difficulte": { "debutants": "facile", "experimente": "super facile" }, "ingredients": [ "farine", "eau" ] }
    21. 21. Fonctions def ma_fonction(arg1, arg2="default", *args, **kwargs): # arg1 est obligatoire print("arg1:", arg1) # arg2 optionel avec une valeur par défaut print("arg2:", arg2) # args est un tableau print("args:", args) # kwargs est un dictionnaire print("kwargs:", kwargs) if __name__ == '__main__': print('########### appel 1 ###########') ma_fonction('1') print('########### appel 2 ###########') ma_fonction('2', 'la','decl.', 'est', 'flexible',vous_en='pensez quoi ?')
    22. 22. Fonctions ########### appel 1 ########### arg1: 1 arg2: default args: () kwargs: {} ########### appel 2 ########### arg1: 2 arg2: la args: ('declaration', 'est', 'tres', 'flexible') kwargs: {'pensez': 'quoi ?', 'vous': 'en'}
    23. 23. Classes class MaClasse(object): def __init__(self, transform): self.attribut = 'un attribut' self.transform = transform def affiche(self): print(self.transform(self.attribut)) if __name__ == '__main__': uneIntance = MaClasse(lambda x:x.upper()) uneIntance.affiche() UN ATTRIBUT
    24. 24. ● Favoriser autant que possible l’utilisation de fonctions ● Toujours préférer une fonction à l’utilisation de l’héritage Classes et fonctions
    25. 25. ● Notion de package comme en java ● Un répertoire doit contenir un fichier __init__.py ● Possibilité d’importer un package dans son intégralité ou bien seulement un module ● Le mot clé as permet de gérer les éventuels conflits de nommage ● Recherche relativement à la variable PYTHON_PATH Import
    26. 26. Et vraiment beaucoup de choses
    27. 27. Eco-système
    28. 28. ● De nombreuses librairies sont disponibles dans le runtime Python ● Eco-système très riche et très communautaire Librairies
    29. 29. Librairies natives
    30. 30. Jetty <> http.server python –m http.server 8080 ● Utile créer un serveur HTTP minimaliste
    31. 31. Documentation def max(*args, key=None): """ max(iterable, *[, default=obj, key=func]) - > value max(arg1, arg2, *args, *[, key=func]) -> value With a single iterable argument, return its biggest item. The default keyword-only argument specifies an object to return if the provided iterable is empty. With two or more arguments, return the largest argument. """ pydoc permet de générer la doc
    32. 32. JUNIT, TestNG <> unittest import unittest def fun(x,y): return x + y class MyTest(unittest.TestCase): def setUp(self): self.inc = 1 def test_premier(self): self.assertEqual(fun(3,self.inc), 4) def test_second(self): self.assertEqual(fun(3,self.inc), 'wrong')
    33. 33. Mockito <> unittest.mock from unittest.mock import MagicMock class ProductionClass(object): def method(self): self.something(1, 2, 3) def something(self, a, b, c): pass real = ProductionClass() real.something = MagicMock() real.method() real.something.assert_called_once_with(1, 2, 3) Dans la librairie standard depuis Python 3.3
    34. 34. ● Extrêmement complet ● Attention à ne bien initialiser qu’une fois ● Pas tout le temps compatible avec d’autre modules (multithread windows par exemple) xxx4J, LogPack <>Logging import logging logging.basicConfig(filename='example.log',level=l ogging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too')
    35. 35. Jackson <> json json_string = '{"first_name": "Guido", "last_name":"Rossum"}' parsed_json = json.loads(json_string) print(parsed_json['first_name']) d = { 'first_name': 'Guido', 'titles': ['BDFL', 'Developer'], } print(json.dumps(d, sort_keys=True, indent=4)) Guido { "first_name": "Guido", "titles": [ "BDFL", "Developer" ]}
    36. 36. Autres équivalences JAVA PYTHON Commons IO os, shutil, subprocess et sys Commons Collections collections Commons Codec codecs Guava Ba y’en a pas besoin
    37. 37. Gestion des dépendances
    38. 38. ● Pip est le gestionnaire de dépendance couramment utilisé ● Par convention la liste des dépendance est contenue dans le fichier requirements.txt ● Pour installer / upgrader Gestion des dépendances pymongo==2.8.0 pymssql==2.1.1 pip install requirements.txt
    39. 39. Virtualenv ● VENV permet d’isoler un environnement d’éxécution ● Permet de figer une version de Python et les dépendances ● Absolument nécessaire en toute occasion python -m venv myenv myenv/Scripts/activate.bat
    40. 40. Librairies disponibles dans PyPi
    41. 41. Jodatime <> dateutil from dateutil.relativedelta import * from dateutil.easter import * from dateutil.rrule import * from dateutil.parser import * now = parse("Sat May 30 15:20:08 GMT 2015") today = now.date() year = rrule(YEARLY,bymonth=8,bymonthday=13,byweekday=FR )[0].year rdelta = relativedelta(easter(year), today) print(…) Today is: 2015-05-30 Year with next Aug 13th on a Friday is: 2021 How far is the Easter of that year: relativedelta(years=+5, months=+10, days=+5) And the Easter of that year is: 2021-04-04
    42. 42. HTTPClient <> Requests r = requests.get('https://…/json', auth=('u','p')) print(r.status_code) print(r.headers['content-type']) os.system("pause") print(r.text) os.system("pause") print(r.json()['releases']['1.0.4 ']) ● Mises à jour de sécurité fréquentes ● Pool de connections ● Gestion multi-part ● Persistance de cookies ● …
    43. 43. Bootle <> Spring MVC from bottle import get, post, request # or route @get('/login') # or @route('/login') def login(): return '''<form action="/login … ''' @post('/login') # or @route('/login', method='POST') def do_login(): username = request.forms.get('username') if check_login(username, password): return "<p>Your login was correct.</p>" else: return "<p>Login failed.</p>" ● Template, routing, serialization …
    44. 44. ● SQLAlchemy est Spring JDBC et Hibernate réunis ● DJANGO est à Python de que Grails est à Groovy ● Des librairies scientifique pour grapher des résultats ● Spark et son API PYTHON ● Des drivers pour toutes les bases de données No-SQL ● … Et aussi
    45. 45. PEP8
    46. 46. ● classes : CorrectClassName ● exceptions : IncorrectClassNameError (suffixe "Error" !) ● fonctions : get_correct_number() ● méthodes : get_correct_number(self) ● arguments des méthodes et fonctions : get_correct_number(random=False) ● variables : number = my_object.get_correct_number() ● constantes : ANSWER_TO_LIFE = 42 Conventions de nommage
    47. 47. ● Script PEP 8 ● autre Pour vérifier
    48. 48. Sources
    49. 49. ● http://sametmax.com/cours-et-tutos/les- articles-pour-apprendre-python-dans-le-bon- ordre/ ● http://docs.python-guide.org/en/latest/ ● http://antrix.net/static/pages/python-for- java/online/ ● http://stackoverflow.com/questions/1052435/ moving-from-java-to-python Pour bien commencer
    50. 50. ● http://sametmax.com ● http://www.talkpythontome.com/ ● http://pycoders.com/ Pour se tenir au courant • VIDEO PYCON 2015
    51. 51. Questions #python #bzhcmp @__pad__

    ×