Skip to content

Instantly share code, notes, and snippets.

@ewjoachim
Last active November 29, 2016 10:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ewjoachim/8fb6352be242fae40aba471664dcbaf8 to your computer and use it in GitHub Desktop.
Save ewjoachim/8fb6352be242fae40aba471664dcbaf8 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Mesdames, Messieurs, voici ``python 3.6``\n",
"\n",
"Mais ne me croyez pas sur parole, on va vérifier\n",
"\n",
"(présentation en avant-première !)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3.6.0b4 (default, Nov 25 2016, 08:08:08) \n",
"[GCC 5.4.0 20160609]\n"
]
}
],
"source": [
"import sys\n",
"print(sys.version)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Yay\n",
"\n",
"Bon quoi de neuf, du coup"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Les Strings formattées encore améliorées"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Vous connaissez déjà la syntaxe suivante"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Bonjour le dernier Meetup Python de l'année 2016\n"
]
}
],
"source": [
"language = \"Python\"\n",
"year = 2016\n",
"\n",
"template = \"Bonjour le dernier Meetup %(language)s de l'année %(year)d\"\n",
"\n",
"print(template % {\"language\": language, \"year\": year})"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Vous avez peut-être l'habitude d'utiliser"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Bonjour le dernier Meetup Python de l'année 2016\n"
]
}
],
"source": [
"template = \"Bonjour le dernier Meetup %s de l'année %d\"\n",
"print(template % (language, year))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Mais c'est long à taper.\n",
"\n",
"Ça c'était en Python 2."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Vous connaissez aussi la nouvelle syntaxe"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Bonjour le dernier Meetup Python de l'année 2016\n"
]
}
],
"source": [
"template = \"Bonjour le dernier Meetup {language} de l'année {year}\"\n",
"\n",
"print(template.format(language=language, year=year))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Mais c'est toujours long à taper..."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Et peut-etre même savez-vous que ca permet de faire des choses merveilleuses comme"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"~~~~~~ Bonjour Python ! ~~~~~~\n"
]
}
],
"source": [
"print(\"{:~^30}\".format(\" Bonjour Python ! \"))"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2016-11-28\n"
]
}
],
"source": [
"from datetime import datetime\n",
"print(\"{:%Y-%m-%d}\".format(datetime.now()))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"(protip : plongez vous dans les arcanes du ``.format`` sur http://pyformat.info)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"### Et maintenant vous avez... (roulement de tambours)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"'Bonjour le dernier Meetup Python de 2016'"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"f\"Bonjour le dernier Meetup {language} de {year}\""
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"'Bonjour le dernier Meetup Python de 2016'"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"f\"Bonjour le dernier Meetup {language} de {datetime.now():%Y}\""
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Les annotations de types pour les variables"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Python, circa 2014 (a.k.a Python 3.4-)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Average grade: 3.6\n"
]
}
],
"source": [
"first_grade = 3\n",
"grades = [first_grade, 2, 5.7]\n",
"\n",
"class Student:\n",
" notes = []\n",
" \n",
" def average(self, multiplier=1):\n",
" if not self.grades:\n",
" return \"Aucune note\"\n",
" \n",
" average = sum(self.grades) / len(self.grades)\n",
" average *= multiplier\n",
" return \"Average grade: {:.1f}\".format(average)\n",
" \n",
"s = Student()\n",
"s.grades = grades\n",
"print(s.average())"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Python, circa 2015 (a.k.a Python 3.5)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Average grade: 3.6\n"
]
}
],
"source": [
"first_grade = 3\n",
"grades = [first_grade, 2, 5.7]\n",
"\n",
"class Student:\n",
" notes = []\n",
" \n",
" def average(self, multiplier: float=1) -> str:\n",
" if not self.grades:\n",
" return \"Aucune note\"\n",
" \n",
" average = sum(self.grades) / len(self.grades)\n",
" average *= multiplier\n",
" return \"Average grade: {:.1f}\".format(average)\n",
" \n",
"s = Student()\n",
"s.grades = grades\n",
"print(s.average())"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Python, circa 2016 (a.k.a Python 3.6+)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Average grade: 3.6\n"
]
}
],
"source": [
"from typing import List\n",
"\n",
"first_grade: int = 3\n",
"grades: List[float] = [first_grade, 2, 5.7]\n",
"\n",
"class Student:\n",
" notes: List[float] = []\n",
" \n",
" def average(self, multiplier: float=1) -> str:\n",
" if not self.grades:\n",
" return \"Aucune note\"\n",
" \n",
" average: float = sum(self.grades) / len(self.grades)\n",
" average *= multiplier\n",
" return f\"Average grade: {average:.1f}\"\n",
" \n",
"s:Student = Student()\n",
"s.grades = grades\n",
"print(s.average())"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Des grands nombres enfin lisibles"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1000000000000000\n",
"FFFFFFFF\n"
]
}
],
"source": [
"print(1_000_000_000_000_000)\n",
"\n",
"print(f\"{0x_FF_FF_FF_FF:X}\")\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Des nouvelles méthodes magiques "
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Pour l'héritage..."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[<class '__main__.Plugin1'>, <class '__main__.Plugin2'>]\n"
]
}
],
"source": [
"class PluginBase:\n",
" subclasses = []\n",
"\n",
" def __init_subclass__(cls, **kwargs):\n",
" super().__init_subclass__(**kwargs)\n",
" cls.subclasses.append(cls)\n",
"\n",
"class Plugin1(PluginBase):\n",
" pass\n",
"\n",
"class Plugin2(PluginBase):\n",
" pass\n",
"\n",
"print(PluginBase.subclasses)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"... et pour la composition"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"class IntField:\n",
" # this is the new initializer:\n",
" def __set_name__(self, owner, name):\n",
" self.model = owner\n",
" self.name = name\n",
" \n",
" def whats_your_name(self):\n",
" print(f\"{self.model} m'a nommé {self.name}\")\n",
"\n",
"class ModelA:\n",
" value_a = IntField()\n",
" \n",
"class ModelB:\n",
" value_b = IntField()"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class '__main__.ModelA'> m'a nommé value_a\n",
"<class '__main__.ModelB'> m'a nommé value_b\n"
]
}
],
"source": [
"ModelA().value_a.whats_your_name()\n",
"ModelB().value_b.whats_your_name()"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Toujours plus d'asynchrone\n",
"\n",
"L'API d'asyncio est stabilisée et on peut maintenant créer des générateurs asynchrones"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# ``pathlib`` amélioré !"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['Spotify-AdKiller', 'beautifuldjango.github.io', 'agency-jekyll-theme', 'django', 'deps', 'theano', 'test', 'req.txt', 'jupyter']\n"
]
}
],
"source": [
"import os, pathlib\n",
"\n",
"path = pathlib.Path() / \"..\"\n",
"\n",
"print(os.listdir(path))"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<_io.TextIOWrapper name='../jupyter/Python 3.6.ipynb' mode='r' encoding='UTF-8'>\n"
]
}
],
"source": [
"path = path / \"jupyter\" / \"Python 3.6.ipynb\"\n",
"\n",
"print(open(path))"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"../jupyter\n"
]
}
],
"source": [
"print(path.parent)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
".ipynb\n"
]
}
],
"source": [
"print(path.suffix)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Python 3.6\n"
]
}
],
"source": [
"print(path.stem)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Python connait ``tau`` !"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"True\n",
"1.00, -0.00\n"
]
}
],
"source": [
"from math import tau, pi, cos, sin\n",
"\n",
"print(tau == 2 * pi)\n",
"print(f\"{cos(tau):.2f}, {sin(tau):.2f}\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Les dictionnaires sont maintenant ordonnés "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Bonus : ils sont plus compacts en mémoire !"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"list({i: i for i in range(100)}) == list(range(100))"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Le module ``secrets`` pour générer des clés"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"F68C2A8EB0518742D521FF66DF24E464FC54E2F03BE9C93A2400862907D391BD8A884B22FBCF40E187A3A218A374B178542DD259F1F25C233DD2A0BA33438B775EAAE3EF689CD31249EC36CAB9EFB7E2EDDC2B941F0875123A78FCA7A1C733B62FD77E80740F94809527BF57BFB53774D02DD267D6E4BA812DAFCE2118FF369948FB22E7B60A72546D761D1D35361656C95D7ADF07E79CAE404FA8B9F7A208895EEBE888151B0E702D25A1D9678A6948C739573B1D02534315B6618A92DCDA56AB327B66FD262C125124B8C29042385D6A56894A0B0AB20C9D65F73965CBF33FECFD82B60E46A2190D717F12935E1973322FEB7FF163BB737B5B785AB9F4BA04\n"
]
}
],
"source": [
"import secrets\n",
"print(f\"{secrets.randbits(2048):X}\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true,
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# En route pour la 3.7 !\n",
"## Merci de votre attention. Des questions ?\n",
"\n",
"Novembre 2016 - Joachim Jablon (@ewjoachim) - PeopleDoc (on recrute !)\n",
"![](http://cdn2.hubspot.net/hubfs/468550/assets/logo.png?t=1453755414564)\n",
"\n",
"_Réalisation technique des slides: Jupyter Notebook et Reveal.js_"
]
}
],
"metadata": {
"celltoolbar": "Slideshow",
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.0b4"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment