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

773 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
  • Soyez le premier à commenter

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__

×