Ich habe einige der neuen Funktionen von Python 3.8 touched angesprochen

Einführung

Schwach Python-Ingenieure haben einige der neuen Funktionen in Python3.8 ausprobiert. Ich überspringe diejenigen, die ich nicht verstehe (ich überspringe das Build-Profil). Einzelheiten finden Sie im offiziellen Dokument (https://docs.python.org/ja/3/whatsnew/3.8.html).

Seiuchi-Betreiber

Als Teil der größeren Syntax wurde eine neue Syntax: = hinzugefügt, um Variablen Werte zuzuweisen. Diese Syntax ähnelt den Augen und Zähnen eines Seuchi, daher der Spitzname "Seuchi-Operator".

image.png Seiuchi-Operator süß </ font>

array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# python3.8 oder früher
# n = len(array) > 10
# if n:
#     print(f"List is too long ({n} elements, expected <= 10)")

# python3.8
if n := len(array) > 10:
    print(f"List is too long ({n} elements, expected <= 10)")

Ausgabeergebnis

List is too long (True elements, expected <= 10)

Haben Sie das Gefühl, dass Sie Variablen mit Urteilsvermögen deklarieren können?

Da es auch in while-Anweisungen und inklusive Notation verwendet werden kann, finden Sie Einzelheiten im offiziellen Dokument (https://docs.python.org/ja/3/whatsnew/3.8.html).

Nur-Position-Argumente

Neue Syntax / hinzugefügt, um anzuzeigen, dass Funktionsargumente als Positionsargumente angegeben werden müssen und nicht als Schlüsselwortargumente angegeben werden können. Diese Syntax ist dieselbe wie wenn help () die von Larry Hastings Argument Clinic kommentierte C-Funktion anzeigt.

Funktionsaufruf korrigieren

def profile(first_name, last_name, /, gender, age, *, zip_code, address):
    print(f'\
Nachname:{first_name}\n\
Name:{last_name}\n\
Sex:{gender}\n\
Alter:{age}\n\
        〒:{zip_code}\n\
Gehäuse:{address}')

profile('Suzuki', 'Ichiro', 'Mann', 99, zip_code='000-0000', address='Raum')  # OK
profile('Suzuki', 'Ichiro', 'Mann', age=99, zip_code='000-0000', address='Raum')  # OK
profile('Suzuki', 'Ichiro', gender='Mann', age=99, zip_code='000-0000', address='Raum')  # OK

Die Argumente sind von links geordnet Positionsargumente: Vorname, Nachname Es ist sowohl ein Positionsargument als auch ein Schlüsselwortargument: "Geschlecht", "Alter" Schlüsselwortargumente: "Postleitzahl", "Adresse"

Falscher Funktionsaufruf

profile('Suzuki', 'Ichiro', gender='Mann', 99, zip_code='000-0000', address='Raum')  # SyntaxError: positional argument follows keyword argument
profile('Suzuki', 'Ichiro', age=99, 'Mann', zip_code='000-0000', address='Raum')  # SyntaxError: positional argument follows keyword argument
profile('Suzuki', 'Ichiro', 'Mann', 99, '000-0000', address='Raum')  # TypeError: profile() takes 4 positional arguments but 5 positional arguments (and 1 keyword-only argument) were given
profile('Suzuki', 'Ichiro', 'Mann', 99, zip_code='000-0000', 'Raum')  # SyntaxError: positional argument follows keyword argument

Beseitigen Sie die Verwendung als Schlüsselwortargument

Da die Argumente vor / Positionsargumente sind, ist es jetzt möglich, die folgenden Aufrufmethoden zu entfernen, die vor python3.8 möglich waren. Es kann als Positionsargument erzwungen werden, sodass Sie den Argumentnamen ohne zu zögern ändern können !!! </ red>

# python3.Vor 8 konnte es sowohl als Positionsargument als auch als Schlüsselwortargument verwendet werden.
def profile(first_name, last_name):
    print(f'{first_name} {last_name}')
profile2(first_name='Yoshida', last_name='Hanako')  # Yoshida Hanako
...
..
.
# python3.8 Nur-Position-Argumente/verwenden
def profile(first_name, last_name, /):
    print(f'{first_name} {last_name}')
profile2(first_name='Yoshida', last_name='Hanako')  # TypeError: profile2() got some positional-only arguments passed as keyword arguments: 'first_name, last_name'

Sie können es auch so schreiben, um beliebige Schlüsselwortargumente zu erhalten.

def profile(first_name, last_name, /, **kwargs):
    print(f'{first_name} {last_name} {kwargs}')
profile('Yoshida', 'Hanako', first_name='Suzuki', last_name='Ichiro')  # Yoshida Hanako {'first_name': 'Suzuki', 'last_name': 'Ichiro'}

Dies macht es viel einfacher, eine Funktion oder Methode zu definieren, die beliebige Schlüsselwortargumente akzeptiert.

Es wird offiziell gesagt, aber ich bin ein schwacher Ingenieur, deshalb verstehe ich den Geschmack nicht.

Möglichkeit zum Speichern von Cache-Dateien an einem anderen Speicherort

Der implizite Bytecode-Cache verwendet standardmäßig das Unterverzeichnis pycache in jedem Quellcodeverzeichnis, jedoch mit der neu hinzugefügten Umgebungsvariablen PYTHONPYCACHEPREFIX (oder der Befehlszeilenoption -X pycache_prefix), dem Quellcode und Es wird nun in einem separaten Verzeichnisbaum gespeichert.

Der Speicherort des Caches befindet sich in sys.pycache_prefix (wenn Sie pycache verwenden, lautet dies: const: None).

Ich konnte es nicht gut verifizieren, also habe ich es vorerst durchgesehen. .. ..

"=" Bezeichner für formatiertes String-Literal (F-String) aktiviert

string = 'F-Saite'

# python3.8.Vor 0
print(f'{string}')  #F-Saite

# python3.8.0
print(f'{string=}')  # string='F-Saite'

Es scheint nützlich zum Debuggen zu sein (kleines durchschnittliches Gefühl)

dict und dictview können jetzt mit reverse () in umgekehrter Reihenfolge iteriert werden.

Wenn Sie bis zu Python3.7 versuchen, "dict" mit "reverse" umzukehren, erhalten Sie "TypeError:" dict "-Objekt ist nicht umkehrbar".

# python3.8.Vor 0
dictionary = {'a': 1, 'b': 2, 'c': 3}

for d in reversed(dictionary):
    print(d)

>> TypeError: 'dict' object is not reversible

Ab python3.8 ist das möglich!

# python3.8.Vor 0
dictionary = {'a': 1, 'b': 2, 'c': 3}

for d in reversed(dictionary):
    print(d)

>> c
>> b
>> a

Die Methode _asdict () von collection.namedtuple () gibt jetzt ein Dikt zurück

Wie man zuerst ein benanntes Tupel macht [hier](https://qiita.com/Seny/items/add4d03876f505442136#%E3%81%A9%E3%82%93%E3%81%AA%E3%81% A8% E3% 81% 8D% E3% 81% ABnamedtuple% E3% 82% 92% E4% BD% BF% E3% 81% 86% E3% 81% 8B) hat eine leicht verständliche Erklärung !!!

Vor python3.8 gab es "OrderedDict" zurück.

import collections
Human = collections.namedtuple('Human', ['first_name', 'last_name', 'age'])
human = Human('yamada', 'taro', 25)
print(human._asdict())

>> OrderedDict([('first_name', 'yamada'), ('last_name', 'taro'), ('age', 25)])

python3.8 gibt jetzt Dict zurück!

import collections
from collections import OrderedDict

Human = collections.namedtuple('Human', ['first_name', 'last_name', 'age'])
human = Human('yamada', 'taro', 25)
print(human._asdict())
# print(OrderedDict(human._asdict()))  # 3.Selbst mit 8 wird empfohlen, die für Ordered Dict spezifischen Funktionen zu verwenden und zu verwenden.

>> {'first_name': 'yamada', 'last_name': 'taro', 'age': 25}

csv.DictReader gibt jetzt auch dict zurück

Mit dieser Änderung können Sie schneller und mit weniger Speicherbedarf bei gleichbleibender Reihenfolge ausgeführt werden.

Es scheint. Ich habs gemacht.

Dem datetime-Modul wurden zwei Methoden hinzugefügt

Es wurden die Methoden datetime.date.fromisocalendar () und datetime.datetime.fromisocalendar () hinzugefügt, um Datums- und Datums- / Uhrzeitobjekte nach Jahr, Wochennummer und Tag gemäß den ISO-Vorschriften zu erstellen. Dies gilt für jede Klasse. Es ist die Umkehrung der Isocalendar-Methode.

was zur Hölle? Ich habe versucht, es auszugeben.

from datetime import datetime

date = datetime.now()  # 2020-03-06(Stunden, Minuten und Sekunden weggelassen)
print(date.isocalendar())  # (2020, 10, 5)
print(date.fromisocalendar(2020, 4, 1))  # 2020-01-20 00:00:00
print(datetime.fromisocalendar(2020, 4, 1))  # 2020-01-20 00:00:00

Zunächst der vorhandene isocalendar ()

2020-03-06 ist 2020, 10. Woche Freitag (5) Sonntag </ font> image.png

Aus dem in 3.8 hinzugefügten Isokalender

print(date.fromisocalendar(2020, 4, 1)) # 2020-01-20 00:00:00 Die Details der Argumente sind von links nach rechts: "Westlicher Kalender", "Woche", "Tag"

`` 4. Woche 2020, Montag (1) Sonntag </ font>

image.png

① endet hier

Ich bin müde, also bin ich fertig. ② wird bald veröffentlicht. (Selbständig)

Recommended Posts