Fonctionnalités de grammaire ajoutées à partir de Python3.6

Python3.6.0 est sorti le 23 décembre 2016, avec quelques nouvelles mises à jour. What’s New In Python 3.6

Après tout, pour ceux qui programment en utilisant Python, les fonctions de grammaire nouvellement ajoutées peuvent être particulièrement préoccupantes. Donc cette fois, c'est une fonction de grammaire ajoutée dans 3.6.0,

--PEP 498: Chaîne littérale formatée --PEP 515: trait de soulignement en littéral numérique --PEP 526: syntaxe d'annotation variable --PEP 525: Générateur asynchrone --PEP 530: Notation d'inclusion asynchrone

Je vais présenter environ.

Littéraux de chaîne formatés (chaînes f)

Python fournit une méthode format () dans la classe string (string), et vous pouvez utiliser str.format () pour effectuer des substitutions de variables et le formatage des valeurs. (En plus de ce str.format (), il existe% -formatting et string.Template comme méthodes de formatage et d'incorporation de variables.) Cependant, la méthode existante est sujette à des erreurs, est inflexible et présente des problèmes en ce qu'elle nécessite une écriture redondante.

Cette fois, f-strings est une fonction équivalente à format (), et sa caractéristique est que vous pouvez incorporer des variables, des formats et des expressions d'exécution dans __character strings __str.format () C'est dans __ où vous n'avez pas à écrire de manière redondante comme .

Utilisation de base

Vous pouvez déclarer des chaînes f avec le préfixe f`` et utiliser {} `comme espace réservé. Un exemple est présenté ci-dessous.

python


#Expansion variable de base
hoge = 'hogehoge'
f'string value: {hoge}'  #=> 'string value: hogehoge'

Dans str.format (), ce qui a été écrit comme suit peut maintenant être écrit comme ci-dessus.

python


'string value: {hoge}'.format(hoge='hogehoge')

Je vais vous montrer comment l'utiliser de différentes manières, mais il est intéressant que les f-strings puissent être écrites de manière simplifiée car .format (...) peut être omis. (Je suis très reconnaissant d'avoir souvent été en colère contre la ligne utilisant str.format () parce que l'évaluation du style de code de PEP8 dépassait 80 caractères.)

Divers usages

Les variables que vous souhaitez développer peuvent être imbriquées dans {}, et vous pouvez utiliser les valeurs développées pour spécifier le format.

python


#Format
float_val = 0.123456
size = 4
f'result: {float_val:.{size}}'  #=> 'result: 0.1235'

Puisqu'elle est évaluée comme une expression d'exécution dans {}, vous pouvez développer la liste et le dictionnaire, ajouter et soustraire, etc. comme suit.

python


#liste
some_list = ['foo', 'bar', 'baz']
f'list item: {some_list[0]}'  #=> 'list item: foo'

#dictionnaire
some_dict = {'foo': 'foofoo', 'bar': 'barbar'}
f'dict item: {some_dict["foo"]}'  #=> 'dict item: foofoo'

# operation
some_value = 10
f'add ops: {some_value + 20}'  #=> 'add ops: 30'

f'list length: {len(some_list)}'  #=> 'list length: 3'

Vous pouvez également appeler une fonction dans {}.

python


# function
def multi(a, b):
    return a * b

x = 10
y = 20
f'multi value: {multi(x, y)}'  #=> 'multi value: 200'

{} Peut être cassé car ils sont entre parenthèses implicites avant l'évaluation.

python


class Foo(object):

    def __init__(self, name):
        self.name = name

    def get_name(self):
        return self.name

f'''Instance method call: {Foo("foo").get_name(
	)}'''
#=> 'Instance method call: foo'

Vous pouvez obtenir une sortie échappée en utilisant fr au lieu de f dans le préfixe.

# raw f-strings
fr'raw output\n'  #=> 'raw output\\n'

Soulignement dans le littéral numérique

C'est un petit ajout, mais vous pouvez maintenant utiliser le trait de soulignement _ pour les littéraux numériques. Toutefois, la position de soulignement ne peut pas être utilisée au début, à la fin ou au formulaire contigu et peut être placée entre des nombres ou après le spécificateur de base. Certes, si ça continue avec «000000 ...», ça peut être un peu difficile à voir, mais il semble que ça va être résolu.

#Nombre décimal
decimal = 10_000_000.0
print(decimal)  #=> 10000000.0

#Hexadécimal
hexadecimal = 0xCAFE_F00D
print(hexadecimal)  #=> 3405705229

#Nombre binaire
binary = 0b_0011_1111_0100_1110
print(binary)  #=> 16206

# binary string => int casting
binary_string = int('0b_1111_0000', 2)
print(binary_string)  #=> 240

Syntaxe d'annotation de variable

La fonction d'indication de type ajoutée dans PEP484 (Python 3.5) fournit une syntaxe d'indication de type pour les arguments formels de fonction. C'était fait. La syntaxe d'indication de type pour les variables est ajoutée à ce PEP526. Les "variables" incluent des variables de classe et des variables d'instance en plus des variables régulières.

python


from typing import List

vectors: List[float] = [0.1, 0.2]

counts: Dict[str, int] = {
    'foo': 10,
    'bar': 20,
    'baz': 30,
}

#Les variables de classe sont également disponibles
class Foo(object):

    name: str = 'foo'

En passant, ces annotations ne sont pas affectées par le résultat de cette annotation dans l'interpréteur Python, il n'y a donc pas d'avertissement sur le runtime Python. Cette fonctionnalité est désormais un outil tiers (par exemple mypy, pytype, [PyCharm] Vous devez savoir que (https://www.jetbrains.com/pycharm/, etc.) est une fonctionnalité qui vous permet de vous référer facilement aux attributs d'annotation.

url: str = ''

url = 100  #=>

print(url)  #=>S'affiche comme 100 sans avertissement, etc.

Générateur asynchrone

PEP492 (Python 3.5) a ajouté ʻawaitetyield à la même fonction dans la syntaxe async / await Cependant, depuis la version 3.6, des générateurs asynchrones ont été pris en charge dans lesquels ʻawait et yield peuvent être utilisés pour la même fonction.

python


import asyncio


async def ticker(delay, to):
    for i in range(to):
        yield i
        await asyncio.sleep(delay)


async def run():
    async for i in ticker(1, 10):
        print(i)


loop = asyncio.get_event_loop()
try:
    loop.run_until_complete(run())
finally:
    loop.close()

Notation d'inclusion asynchrone

Depuis la version 3.6, l'utilisation de ʻasync for` dans les listes, les ensembles, les inclusions de dictionnaire et les expressions génératrices est prise en charge. C'est un petit changement, mais je pense que c'est plus facile à écrire.

python


import asyncio


async def aiter():
    n = 10
    for i in range(n):
        yield i
        await asyncio.sleep(0.5)

#Notation d'inclusion asynchrone
async def run():
    result = [i async for i in aiter() if i % 2]
    print(result)

#Courir au-dessus()Même syntaxe que
async def run():
    result = []
    async for i in aiter():
        if i % 2:
            result.append(i)


loop = asyncio.get_event_loop()
try:
    loop.run_until_complete(run())
finally:
    loop.close()

Comme mentionné ci-dessus, je voudrais certainement l'utiliser dans un environnement où vous n'avez pas à vous soucier de la compatibilité.

Cette fois je n'ai introduit que le changement de grammaire, mais à partir de 3.6, il y en a d'autres

--Garder l'ordre des arguments de mot-clé

Il y a des changements tels que. Pour plus de détails, reportez-vous à Nouveautés de Python 3.6.

Recommended Posts

Fonctionnalités de grammaire ajoutées à partir de Python3.6
vérification de la grammaire python
sql à sql
MeCab de Python
Notes de grammaire Python
Grammaire de base Python3
Touchez MySQL depuis Python 3
Exploitez Filemaker depuis Python
Python ~ Apprentissage rapide de la grammaire ~
Accéder à bitcoind depuis python
Changements de Python 3.0 à Python 3.5
Extrayez la quantité de caractéristiques (identité) du texte.
Changements de Python 2 à Python 3.0
Python depuis ou import
Utilisez MySQL depuis Python
Exécutez Python à partir d'Excel
Installer Python à partir de la source
Exécuter des commandes depuis Python
Grammaire de base Python (divers)
Faites fonctionner le neutron de Python!
Utiliser MySQL depuis Python
Faire fonctionner LXC depuis Python
Manipuler riak depuis python
Forcer Python depuis Fortran
Utilisez BigQuery depuis Python.
Mémo de grammaire de base Python
Exécuter la commande depuis Python
[Python] Lire depuis Stdin
Utilisez mecab-ipadic-neologd de Python
Aplatir à l'aide du rendement Python de
Appeler CPLEX depuis Python (DO cplex)
Grammaire de base du système Python3 (quelques itérations de Python)
Publier de Python vers Slack
Flirter de PHP à Python
Rendre MeCab disponible à partir de Python 3
Informations obtenues à partir de tweet_id (Python)
OCR à partir de PDF en Python
Exécutez le script illustrator à partir de python
Utiliser MySQL depuis Anaconda (python)
Anaconda mis à jour de 4.2.0 à 4.3.0 (python3.5 mis à jour vers python3.6)
Étude de Python Hour4: orientée objet ②
Interroger Athena depuis Lambda Python
Accéder à Oracle DB depuis Python
Installation de Python et grammaire de base
Mémo de grammaire de base Python (1)
Étude de Python Hour3: Fonctions
Démarrer / arrêter GCE à partir de python
Grammaire de base Python (divers) Mémo (3)
Arrêtez Omxplayer à partir du code Python
Passer de python2.7 à python3.6 (centos7)
Grammaire de base Python (divers) Mémo (2)
Connectez-vous à sqlite depuis python
Grammaire de base Python pour les débutants
Installez pyenv depuis Homebrew, installez Python depuis pyenv
Étude de Python Hour4: orientée objet ①
Convention de dénomination Python (à partir de PEP8)
Commencez avec Python! ~ ② Grammaire ~
[Python] Exemple de code pour la grammaire Python