Python2 contagem regressiva, não venha a dominar as novas funcionalidades Python3 legal? | Programa de Força

Autor | tecnologia rastreador Nuvem notas de pesquisa

Zebian | Guo Rui

Produzido | CSDN blogue

Python3.8 lançou quase um mês, a partir de primeiro lançamento Python3.0 será mais do que 10 anos. Acredito que muitas pessoas ainda na versão uso Python2.7, você quiser migrar para a versão mais recente, mas não sabem como dominar rapidamente a maneira mais surpreendente.

O seguinte artigo, vou dar-lhe recomendar os mais modernos 3,0 funções versão-dependente e sintaxe, para que possa "destacam-se" no tempo Code Review!

prefácio

Primeiro, vamos falar vários momentos:

  • Python2.7 parou oficialmente o tempo de manutenção 1 de janeiro de 2020, há mais de um mês atrás

  • Python3.8 começou Publicado 14 outubro de 2019, mais de um mês atrás

A partir dessas duas figuras podemos ver, Python3 a versão grande tem sido desenvolvido por um longo tempo, enquanto que a partir do final de Python2.7 também se aproximando. Distância de paragem no ano de manutenção Python2.7, um monte de bons projetos de código aberto já deixou de apoiar a 2,7, por exemplo, para janeiro deste ano, NumPy vai parar de apoiar Python 2; até o final deste ano, ipython, Cython e Pandas, etc., vai um após o outro para deixar de apoiar o Python 2.

Assim, a fim de responder à chamada, seguem a tendência. Vamos lentamente migrar para Python3.X, como é que vamos ser capazes de captar rapidamente a essência da versão Python3.X dele? Vamos começar com alguns novos recursos interessantes, esses recursos ou métodos são várias versões do Python 3 recém-adicionado, em comparação com os métodos tradicionais em Python são mais fáceis de resolver alguns problemas na prática.

Todos os exemplos são escritos em Python 3.7 no ambiente de cada exemplos característicos são dados da versão mínima necessária de Python seu trabalho normal.

fluxo das marés

  • string de formato f-string (menor Python versão 3.6)

"Como string de formato" Este é um tema que eu acho que cada colaborador no momento do contato com uma vontade de aprender novas sintaxe da linguagem, ea maneira em formato Python sintaxe que geralmente tendem a [Format] ou [% S] estes dois métodos, como se segue:

imprimir ( "Meu nome é% s" % ( 'phithon',)) imprimir ( "Meu nome é% (name) s" % { 'nome': 'phithon'}) imprimir ( "Meu nome é {}". formato ( "bob")) imprimir ( "Meu nome é {name}". formato (name = "bob"))

Pela versão Python3.6, introduzimos um novo método de flexível string formatada [] f-string, usando {} f-corda acima da mesma função de codificação é tal que:

name = "bob" imprimir (f "Meu nome é {name}")

Comparamos Vários destes cadeia de formato, pode ser encontrada em comparação com o formato de cadeia de caracteres comum [% S] ou [método] Format, [] variável f-string aparece mais conveniente para inserir diretamente no espaço reservado, também melhor compreendidos, sobre a formatação de velocidade pode se referir a este blog (https: // stackoverflow .com / Perguntas / 56587807 / por que-é-f-strings-mais rápida que a str-to-valores de análise) para ver uma explicação detalhada.

  • Biblioteca de Gerenciamento de Caminho Pathlib (mínimo Python versão 3.4)

Como pode ser visto a partir das características anteriores [f-String] realmente poderosa e bela, mas em termos do caminho do arquivo, Python seguir sua filosofia de desenvolvimento: Tudo é um objeto, assim que realizar seu caminho também trouxe um objeto único caminho biblioteca, que é um processo de biblioteca de abstração caminho do arquivo] [pathlib. Se você não sabe por que você deve usar [pathlib], consulte o seguinte post no blog esta imagem Varas de frango preparados por Trey Hunner (https: // treyhunner .com / 2018/12 por-você-deve-ser-com-pathlib /) e suas versões posteriores /.

Vamos comparar duas versões do mesmo para alcançar os antigos e novos casos de Python:

de glob glob importação file_contents = para filename em glob (, recursivo = True '** / * py.'): com aberta (nome do ficheiro) como python_file: file_contents. aplicativo final (python_file.read) de caminho de importação pathlib file_contents = S ')

Como mostrado acima, você pode Read_Text uso e compreensão da lista de objetos Path, todo o conteúdo do arquivo é lido em uma nova lista, comparado ao uso de uma versão mais antiga do Python perceber, sem dúvida, melhor em gramática e bonito!

  • Digite Prompt Indução de tipo (mínimo Python versão 3.5)

Existem muitos tipos de linguagens de programação, em comparação com linguagens estaticamente compiladas e linguagens interpretadas são software dinâmico engenharia de um tema quente, quase todo mundo tem suas próprias opiniões sobre isso. Em um tipo de linguagem de anotação estática é, sem dúvida, as pessoas gostam de ódio, o amor é para compilar mais rápido, o trabalho em equipe compreensão exata do tipo de parâmetro função do método, o ódio é extremamente complicado quando Codificação rótulo. No entanto, este extremamente marcado em linha com cultura de equipe foi introduzida em operação ou Python3, e logo ficou popular.

def print_yes_or_no (codition: str) - >  bool: passar
  • Enumeração (mínimo Python versão 3.4)

Quando você escreve Java ou linguagem C são expostos a enumerar as propriedades, a enumeração também nos ajudar a salvar um monte de tempo, mas também fazer o nosso código mais bonito. Versões mais antigas do Python, que queremos alcançar, métodos de enumeração então percebeu variou, "Oito Imortais, recontagem", dar a desempenhar plenamente a linguagem dinâmica recursos do Python. Aqui nós damos alguns exemplos:

# São tipo de operação usando a classe auto def enum (enums **): tipo de retorno ( 'Enum' ,, enums) Números = enum (UM = 1, DOIS = 2, TR = 'três') # Numbers.ONE == 1, Numbers.TWO == 2 e Numbers.THREE == atualização operação usando classe show de auto 'três' # tipo def enum (seqüencial *, ** nomeado): enumerações = Dict (ZIP (sequencial, gama (len (sequencial))), ** chamado) tipo de retorno ( 'Enum' ,, enums) Números = enum ( 'ZERO', 'um', 'dois') # Numbers.ZERO == 0 e Numbers.ONE == 1 # com o valor para ter o mapeamento de nome def enum (seqüencial *, ** nomeado): enumerações = Dict (ZIP (sequencial, gama (len (sequencial))), ** chamado) inverter = Dict ((valor, chave) para a chave, no valor enums.iteritems) enums < 'reverse_m aplicativo ing '> = inversa tipo de retorno ( 'Enum' ,, enums) # Numbers.reverse_m aplicativo ing == 'três' # Além disso, implementado usando namedtuple a partir de coleções namedtuple importação def enum (* chaves): voltar namedtuple ( 'Enum', chaves) (* chaves) MyEnum = enum ( 'foo', 'bar', 'BAZ') # Os personagens com mapas digitais, tais como C / C ++ def enum (* chaves): namedtuple ( 'Enum', chaves) voltar (* intervalo (LEN (chaves))) # Com dicionário mapeamento pode mapear vários tipos, não é limitado para o digital def enum (kwargs **): voltar namedtuple ( 'Enum', kwargs.keys) (* kwargs.values)

Visto muito mais do que mostra a operação, agora Python3 dar-lhe purificar seus olhos, Python3.4 novo método simples para a preparação de enumeração por categoria "Enum".

de importação enum Enum, auto Monstro classe (Enum): ZOMBIE = auto GUERREIRO = auto URSO = auto imprimir (Monster.ZOMBIE) para i em Monster: imprimir (i) # Monster.ZOMBIE # Monster.ZOMBIE # Monster.WARRIOR # Monster.BEAR

Acima, podemos ver que a enumeração é uma coleção de nome simbólico (membro), que são nome simbólico e os valores somente constantes estão unidos. Na enumeração, a operação pode ser comparado com os membros através de identificação, enumeração em si também pode ser atravessada.

  • cache do LRU Native (mínimo Python versão 3.2)

Caching é uma característica que todos serão utilizados no desenvolvimento, se usarmos preciso ele é bom, ele vai nos salvar um monte de tempo e dinheiro. Eu acredito que, quando muitas pessoas vão começar a aprender decoradores Python para alcançar um decorador cache para salvar computação função Fibonacci tempo. Mas depois de Python 3 vai LRU (algoritmo menos usado recentemente) cache como um decorador chamado "lru_cache", fazendo uso do cache é muito simples.

Aqui é uma simples função de Fibonacci, sabemos que o uso de cache irá ajudar a calcular esta função, uma vez que executa o mesmo trabalho várias vezes por forma recursiva.

tempo de importação def fib (número: int) - >  int: se o número de == 0: retornar 0 se o número de == 1: retornar 1 fib retorno (número 1) + FIB (número 2) start = time.time fib (40) imprimir (f'Duration: {time.time - start} s') # Duração: 30 .684099674224854s

Temos visto, o tempo é inútil quando o cache decorador é calculada 30 Segundos ou menos, agora, podemos usar o "lru_cache" para otimizá-lo (Esta técnica de otimização é chamado de "memoization"). Por essa otimização, vamos reduzir o tempo de execução de alguns segundos a alguns nanossegundos.

de functools lru_cache importação @lru_cache (maxsize = 512) fib_memoization def (número: int) - >  int: se o número de == 0: retornar 0 se o número de == 1: retornar 1 fib_memoization retorno (número 1) + fib_memoization (número 2) start = time.time fib_memoization (40) imprimir (f'Duration: {time.time - start} s') # Duração: 6.866455078125e-05s

Pode-se ver o quanto nós aumentar o custo de utilização de um meio de cache função decorador no desenvolvimento de tempo de computação, além disso, após a nova versão Python3.8, lru_cache agora ser directamente usado como decoração e não como uma função de retorno decorador. Assim, os dois estão agora escrevendo apoio:

@lru_cache def f (x): ... @lru_cache (maxsize = 256) def f (x): ...
  • descompactação iterable prolongado (mínimo Python versão 3.0)

Python descompactar acreditamos no nosso iniciante Python quando tem que entender, se entender esse recurso muito, eu acredito que é uma coisa muito legal. Qual é o estendido descompactá-lo? Podemos aprender mais com pep3132, por exemplo:

# Python 3.4 na função de impressão não permitir que várias operações * > > >  imprimir (* , * ) File " < stdin > ", Linha 1 imprimir (* , * ) ^ SyntaxError: sintaxe inválida > > > # Olhe para python3.5 ou mais tarde # Pode ser usado qualquer um de uma pluralidade de desempacotamento operando > > >  print (* , * , 3) 123 > > >  * Gama (4), quatro (0, 1, 2, 3, 4) > > >   > > >  {* Range (4), 4} {0, 1, 2, 3, 4} > > >  { 'X': 1, ** { 'y': 2}} { 'X': 1, 'y': 2}

Podemos ver que esta operação pode ser considerada descompactar o Python em jogo incrivelmente elegante, e jogar uma boa mão de desembalar, o show vai realmente transformar a ah audiência!

  • decorador classe de dados (mínimo Python versão 3.7)

Python 3.7 introduziu [] classe de dados, novos recursos grandemente Simplifica a quantidade de código é definida classe de objeto, o código é simples e clara. Ao usar decoradora uma classe de design modificado @dataclass ele pode ser usado para reduzir o uso de código clichê, porque o decorador irá gerar automaticamente, como "__init__" e métodos especiais, tais como "__repr__." No documento oficial, eles são descritos como "nome da variável com um valor padrão tuplas."

de dataclasses classe de dados de importação @dataclass classe DataClassCard: classificação: str terno: str # Gerar exemplos queen_of_hearts = DataClassCard ( 'Q', 'Corações') print (queen_of_hearts.rank) impressão (queen_of_hearts) imprimir (queen_of_hearts == DataClassCard ( 'Q', 'Corações')) #Q #DataClassCard (rank = 'Q', terno = 'Hearts') #True

As aulas regulares, de acordo com a sintaxe semelhante a este, antes 3,7 Python:

classe RegularCard def __init__ (Self, classificação, terno) : self.rank = classificação self.suit = terno queen_of_hearts = RegularCard ( 'Q', 'Corações') print (queen_of_hearts.rank) impressão (queen_of_hearts) imprimir (queen_of_hearts == RegularCard ( 'Q', 'Corações')) # 'Q' # < __main __. objecto RegularCard em 0x7fb6eee35d 30 > #False

Embora tal abordagem não usa mais quantidade de código, mas podemos ver facilmente para a inicialização, apenas para inicializar um objeto, valor e naipe foi repetido três vezes. Além disso, se você tentar usar essa classe RegularCard, você vai notar que a representação do objeto não é muito descritivo, e a classe tem uma classe com a nova declaração sobre se a comparação não é o mesmo. Porque cada declaração irá usar um novo endereço de memória, ea mensagem "==" mais do que as lojas de classe de comparação, o ainda relativamente o mesmo endereço de memória.

classe de dados ainda subjacente nos deu um pacote mais útil. Por classe de dados padrão percebeu __repr__ método, ele pode fornecer uma representação bom string; __eq__ é um método que pode fazer a comparação objeto básico. E se RegularCard quer alcançar as funções acima precisa escrever um monte de declarações, a quantidade de código mais assustador.

classe RegularCard (objecto): def __init__ (Self, classificação, terno) : self.rank = classificação self.suit = terno def __repr__ (Self) : # Informações de classe pode ser impresso retorno (f '{self .__ class __.__ name__}' '(Terno rank = {self.rank! R}, = {self.suit! R})' f) # Podemos tentar! "R" para remover ou alterá-los ou para s r um, dê uma olhada no que acontece a saída caráter #conversion: esperado 's', 'r' ou 'a' def __eq__ (Self, outro) : # Pode comparar se a mesma classe (sem levar em conta para o endereço de memória) se outro .__ class__ não é self .__ class__: retorno NotImplemented retorno (self.rank, self.suit) == (other.rank, other.suit)
  • pacote namespace implícita (mínimo Python versão 3.3)

arquivo de código Python uma abordagem organizacional é encapsular-los em um pacote (que contém uma pasta "init.py"). Aqui está um exemplo da documentação oficial desde que:

som / Top-level pacote __init__.py Inicializar o pacote de som formatos / subpacote para conversões de formato de arquivo __init__.py wavread.py wavwrite.py aiffread.py aiffwrite.py auread.py auwrite.py. .. Efeitos / subpacote para efeitos sonoros __init__.py echo.py surround.py reverse.py ... filtros / subpacote para filtros __init__.py equalizer.py vocoder.py karaoke.py ...

Em Python 2, acima de cada pasta deve conter uma pasta em um arquivo de pacote de Python "init.py". Em Python 3, com a introdução de pacotes implicitamente namespace, o arquivo não é uma obrigação.

som / Top-level pacote __init__.py Inicializar o pacote de som formatos / subpacote para conversões de formato de arquivo wavread.py wavwrite.py aiffread.py aiffwrite.py auread.py auwrite.py ... Efeitos / subpacote para efeitos sonoros echo.py surround.py reverse.py ... filtros / subpacote para filtros equalizer.py vocoder.py karaoke.py ...

Como dizem algumas pessoas, o trabalho não é tão simples como diz o artigo, o documento oficial 'PEP 420 Especificação ' apontou que o pacote convencional ainda precisa' init.py "para removê-lo a partir de uma pasta a pasta se tornará um pacote namespace local, que trará algumas restrições adicionais. pacote namespace local da documentação oficial dá um bom exemplo, e deixou claro que todas as restrições.

resumo

Várias tendências são dadas acima propriedades podem não ser muito completo, precisamos de mais para explorar e jogar de acordo com suas próprias equipes, este artigo é apenas para mostrar-lhe alguns dos novos recursos mais interessantes do Python, ele pode ajudar a mestre você escrever código mais Pythonic.

Aviso: Este artigo é o artigo CSDN bloggers "tecnologia cloud rastreador notas de pesquisa" originais, e pertence ao autor de tudo.

Um homem entrou estrada tecnologia é muito difícil?

Uma habilidade para jogar Debu?

artigos de qualidade não estão expostos?

Não se preocupe,

A partir de agora, CSDN trará inovação e criatividade para criar o seu show se torna um grande palco,

Sob a digitalização de código de Fanger Wei, Bem-vindo ao "Programa Force" CSDN!

1,1 bilhões! Tianjin Castelo oposto Zi Jinnan Daxinzhuang preço mínimo de cerca de 10.747 yuan / m
Anterior
Muito ruim! 446 os preços da habitação falência louco para dinheiro emprestado no exterior, Kuangmai doméstica para "80% dos desenvolvedores mortas" realmente quer vir?
Próximo