Quais são algumas características do Python que o tornam único como sua própria linguagem? [fechadas]
12
Quais são algumas características do Python que o tornam único como sua própria linguagem? Estou procurando por qualquer tipo de características que vão do bom ao ruim, útil ao impedimento, sintaxe ao uso no mundo real, mas observações não obscuras seriam as mais úteis para o desenvolvedor médio.
Eu sou um novato aqui, então coisas intuitivas podem precisar ser explicadas ...
O Python não é exclusivo, não contém um único recurso único que não é visto em nenhuma outra linguagem.
SK-logic
10
É a única língua que eu sei que é nomeado após Monty Python ...
yannis
@ SK-logic, a questão é sobre características, das quais características são um subconjunto. Não há características exclusivas do Python?
Kjiro
@kojiro, nunca vi uma definição formal de uma "característica", então prefiro não adivinhar.
SK-logic
1
@kojiro, os recursos de PL são normalmente entendidos como sintaxe e semântica. E ambos são formalmente definidos.
SK-logic
Respostas:
22
Você terá dificuldade em encontrar recursos absolutamente únicos . A maioria dos recursos de idioma existentes foi adotada em mais de um idioma desde o início. Alguns podem ser mais raros, principalmente porque são novos e ainda estão na obscuridade ou morreram por um bom motivo. No entanto, mesmo assim, seria melhor procurar combinações de recursos.
Dito isto, vários recursos do Python devem criar uma combinação relativamente única. Pelo menos não conheço nenhum idioma remotamente popular (e prático) com um conjunto de recursos sobrepostos. Como observado nos comentários, Ruby está bem próximo, mas existem inúmeras diferenças.
Metaprogramação baseada em metaclasse . Basicamente, executando código arbitrário na criação de classe. Cria uma customização de classe muito agradável, com muito pouco trabalho no final de recebimento - por exemplo, para um Mapeamento Relacional a Objetos (ORM), as classes clientes podem ser escritas como de costume com algumas linhas extras attr = SomeDataType()e uma tonelada de código é gerada automaticamente. Um exemplo disso são os "modelos" do Django .
Você é incentivado a usar iteradores para tudo . Isso é especialmente aparente no 3.x, onde a maioria das alternativas baseadas em lista com um equivalente baseado em iterador foi abolida em favor do último. Os iteradores também servem como interface quase universal para coleções (tanto as que você realmente tem na memória quanto as que você precisa apenas uma vez e, portanto, criam com os recursos abaixo). Independente de coleta, eficiente em termos de O(1)espaço (o espaço para resultados intermediários geralmente segue naturalmente, poucas tarefas realmente precisam de todos os itens da memória de uma só vez), o processamento de dados composíveis nunca foi tão fácil.
Expressões de gerador, relacionadas ao acima. Muitos já ouviram falar de compreensões de lista (criando uma lista de outra iterável, filtrando e mapeando no processo, com sintaxe muito conveniente). Esquecê-los, eles são açúcar sintático, um caso especial. As expressões de gerador são muito próximas sintaticamente e, finalmente, resultam na mesma sequência de itens, mas produzem resultados preguiçosamente (e, portanto, ocupam O(1)espaço, a menos que você mantenha explicitamente os resultados).
yield, que principalmente tornam os iteradores de gravação (chamados de geradores aqui) muito mais agradáveis. Eles são o irmão mais velho do anterior, suportando todos os tipos de fluxo de controle. C # tem algo semelhante, com a mesma palavra-chave. Mas yieldtambém está sobrecarregado para suportar um tipo limitado de corotinas (Lua, por exemplo, tem um suporte mais elaborado) que, no entanto, foi bem utilizado por pessoas inteligentes que trabalham com problemas difíceis. Dois exemplos em cima da minha cabeça: descida recursiva analisando com backtracing e sem limite de pilha e E / S assíncrona (com sintaxe conveniente).
Atribuição multi-alvo e descompactação iterável. Atribuição em esteróides. Não apenas você pode atribuir vários valores ao mesmo tempo (mesmo para trocar valores e ao iterar - for key, value in mapping.items()), mas também pode descompactar qualquer iterável de tamanho conhecido (honestamente, principalmente tuplas) em várias variáveis. Desde 3.x é ainda prático para coleções de comprimento desconhecido como você pode especificar algumas variáveis levando itens de solteiro e uma tomada que resta: first, *everything_in_between, last = values.
Descritores , provavelmente o mais poderoso dentre as várias maneiras de personalizar o acesso aos atributos. Existem propriedades (como em C #, mas sem suporte especial a idiomas), métodos estáticos, métodos de classe, etc., todos implementados como descritores. Eles são objetos de primeira classe também. Há apenas uma semana, fui confrontado com código repetitivo e complicado em propriedades - então escrevi uma pequena função gerando a parte repetitiva e agrupando-a em um properyobjeto.
Regra puramente impedida (indicação de delimitação de blocos). Eu coloquei isso por último intencionalmente. Embora ele distinga o Python, ele realmente não se destaca na programação cotidiana quando você está acostumado (ou pelo menos essa é a minha experiência).
Eu ainda sou um pouco novo em Ruby, mas acho que atinge tudo, exceto o último ponto também? De qualquer maneira, eu concordo que "único" provavelmente não será encontrado em Python, mas "não é comum entre outros idiomas principais".
Rig
@Rig: Eu não sou um especialista em Ruby, mas não vi metaclasses (o Ruby certamente é tão poderoso em relação à metaprogramação, e pode usá-lo para fins semelhantes, mas minha impressão é de que é alcançado de maneira diferente), nem geradores nem expressões geradoras (embora pareça haver rotinas), nem descompactação iterável (embora haja atribuição de vários destinos) nem descritores no Ruby. Sim, Ruby e Python se sobrepõem. Mas existem diferenças .
Bom, +1. Para mim, "atribuição de esteróides" é na verdade "correspondência de padrões de homens pobres", mas é incrivelmente útil :) Eu também notaria quão flexível é a passagem de parâmetros em funções: *argse **kwargs, maneira indolor de mapear tuplas e dictos para parâmetros, etc. .
9000
Acredito que o lisp comum com o CLOS atinge todos os pontos, exceto o uso da sintaxe baseada em layout. Haskell não é orientado a objetos (embora existam extensões OO), mas, além do ponto de metaclasse, acredito que ele corresponda a todos esses recursos.
Jules
3
Eu acho que a única coisa que torna o Python único é a combinação específica de recursos que ele expõe. Isso seria verdade para a maioria das linguagens de programação.
Ou pode haver uma pequena coisa: eu não vi o modo como o Python explicitamente passa selfcomo um parâmetro formal para objetar as funções de membros executadas em qualquer outra linguagem. É uma coisa pequena, e não vejo como isso realmente muda alguma coisa.
Mas eu não sou muito fluente em Python, então pode haver coisas que estão faltando com certeza!
@delnan: Ah, eu perdi "passar explicitamente o self como um parâmetro formal" .. Acho que é o que ganho com a leitura às 2h da manhã;)
Demian Brecht
4
O self explícito ocorre também em Oberon, fwiw
grrussel
Um auto-parâmetro explícito também é usado no sistema de objetos lisp comum. O CLOS fornece vários métodos, no entanto, o que significa que o parâmetro self não é de forma alguma especial, como é em python.
Jules
1
O processamento automático de documentos para se tornarem propriedades de seus proprietários. Em geral, todos os brilhantes recursos de introspecção do Python o tornam uma linguagem muito única, da capacidade de usar help () à capacidade de usar __doc__como uma propriedade de primeira classe de um objeto. Por exemplo:
>>>classDocStringException(Exception):..."""Error message is the same as docstring"""...def __str__(self):...return repr(self.__doc__)...>>>classExampleException(DocStringException):..."""An example happened"""...>>>raiseExampleExceptionTraceback(most recent call last):File"<stdin>", line 1,in<module>
__main__.ExampleException:'An example happened'
Outros recursos úteis de introspecção:
help / help () - ajuda com o intérprete / ajuda com um objeto
keywords - palavras-chave python
locals () - obtém os nomes locais
globals () - obtém os nomes globais
dir () - obtém propriedades e métodos de um objeto
Ruby tem praticamente o mesmo poder, assim como Common Lisp, Clojure e muitas outras linguagens dinâmicas que acredito.
Torbjørn
@ Torbjørn qual poder? A documentação automática ou os recursos de introspecção?
Kjiro
Eu estava pensando em ambos. Não é exatamente o que diz, mas em espírito. Não acredito que Ruby tenha as mesmas habilidades de documentação, mas introspecção com certeza. CL e Clojure têm os dois recursos - e acredito que a introspecção vai muito além do que você encontrará em Python, já que é homoicônico .
Torbjørn
1
Generator Expressions
input()Deixe-me explicar, eu não vi um idioma (até agora), onde você pode atribuir um valor a uma instrução que imprime algo, é como ruby print/gets, mas com um valor atribuído à impressão, em vez de:print "Foo" bar = gets
yield
Muitos tipos de conjuntos de dados: ordereddict, namedtuple, array, list, tuple, dictionary
Expressões de gerador podem ser implementadas no Haskell usando compreensão de lista (as listas Haskell são preguiçosas, diferentemente das listas python, portanto, nenhuma sintaxe específica é necessária para isso). Por "entrada", presumo que você queira dizer a função python 3 desse nome (como a função python 2 é perigosa e não deve ser usada). É verdade que essa é uma combinação incomum de comportamento (embora esteja presente no javascript - window.prompt - e no BASIC, que é onde acho que o python o emprestou), mas pode ser implementada trivialmente pelo programador ("input s = putStrLn s >> getStrLn "fará isso por haskell).
Jules
Uma linguagem preguiçosa como Haskell realmente não precisa de rendimento - ele pode simplesmente retornar uma lista criada usando os métodos usuais, e os itens serão gerados sob demanda. Apesar disso, a biblioteca inclui uma implementação explícita de corotinas. A biblioteca padrão Haskell contém todas as estruturas de dados mencionadas e muito mais.
Jules
-2
O problema é que o Python está entre muito poucas linguagens com sobrecarga sintática extremamente baixa, oferecendo enormes poderes expressivos: compreensão de lista / conjunto / dict, rendimento, decoradores, avaliação, programação de meta-classe, introspecção, estruturas de dados internas otimizadas (listas, dict, sets), todas essas coisas conspiram de uma maneira muito agradável para dar a você (desenvolvedor) o poder de expressar seus pensamentos em código conciso e elegante quase tão rápido quanto você pode imaginar. Eu realmente não consigo pensar em nenhuma outra linguagem com esse conjunto matador de recursos combinados.
Se você acha que o Python tem uma sobrecarga sintática baixa (apesar de ter uma gramática obscenamente complicada e uma quantidade relativamente grande de açúcar de sintaxe), o que você acha do Scheme?
Tikhon Jelvis
O Eval realmente não deve ser usado para nenhum programa de produção (embora eu admita que possa ser útil para hacks rápidos). Como mostrado nos comentários de outras perguntas, o python não é de forma alguma exclusivo para ter esses recursos. Acredito, por exemplo, que o clojure possui todos os recursos que você lista, e a maioria pode ser feita com o lisp comum.
Jules
-4
Eu diria que é uso de recuo para incluir declarações e loops. Não vi isso em nenhum outro idioma.
Eu acho que é muito útil porque torna significativamente mais difícil ofuscar o código python!
Também parece ser executado de maneira organizada, linha por linha, com exceção das funções, e também pode ser interpretado como tal, o que é bom.
A Wikipedia conhece uma tela cheia de idiomas que também o fazem. É chamada de regra de fora-de-lado .
3
Eu não entendo Também parece ser executado de maneira organizada, linha por linha, com exceção das funções, e também pode ser interpretado como tal, o que é bom. O que isso significa?
Respostas:
Você terá dificuldade em encontrar recursos absolutamente únicos . A maioria dos recursos de idioma existentes foi adotada em mais de um idioma desde o início. Alguns podem ser mais raros, principalmente porque são novos e ainda estão na obscuridade ou morreram por um bom motivo. No entanto, mesmo assim, seria melhor procurar combinações de recursos.
Dito isto, vários recursos do Python devem criar uma combinação relativamente única. Pelo menos não conheço nenhum idioma remotamente popular (e prático) com um conjunto de recursos sobrepostos. Como observado nos comentários, Ruby está bem próximo, mas existem inúmeras diferenças.
attr = SomeDataType()
e uma tonelada de código é gerada automaticamente. Um exemplo disso são os "modelos" do Django .O(1)
espaço (o espaço para resultados intermediários geralmente segue naturalmente, poucas tarefas realmente precisam de todos os itens da memória de uma só vez), o processamento de dados composíveis nunca foi tão fácil.O(1)
espaço, a menos que você mantenha explicitamente os resultados).yield
, que principalmente tornam os iteradores de gravação (chamados de geradores aqui) muito mais agradáveis. Eles são o irmão mais velho do anterior, suportando todos os tipos de fluxo de controle. C # tem algo semelhante, com a mesma palavra-chave. Masyield
também está sobrecarregado para suportar um tipo limitado de corotinas (Lua, por exemplo, tem um suporte mais elaborado) que, no entanto, foi bem utilizado por pessoas inteligentes que trabalham com problemas difíceis. Dois exemplos em cima da minha cabeça: descida recursiva analisando com backtracing e sem limite de pilha e E / S assíncrona (com sintaxe conveniente).for key, value in mapping.items()
), mas também pode descompactar qualquer iterável de tamanho conhecido (honestamente, principalmente tuplas) em várias variáveis. Desde 3.x é ainda prático para coleções de comprimento desconhecido como você pode especificar algumas variáveis levando itens de solteiro e uma tomada que resta:first, *everything_in_between, last = values
.propery
objeto.fonte
*args
e**kwargs
, maneira indolor de mapear tuplas e dictos para parâmetros, etc. .Eu acho que a única coisa que torna o Python único é a combinação específica de recursos que ele expõe. Isso seria verdade para a maioria das linguagens de programação.
Ou pode haver uma pequena coisa: eu não vi o modo como o Python explicitamente passa
self
como um parâmetro formal para objetar as funções de membros executadas em qualquer outra linguagem. É uma coisa pequena, e não vejo como isso realmente muda alguma coisa.Mas eu não sou muito fluente em Python, então pode haver coisas que estão faltando com certeza!
fonte
O processamento automático de documentos para se tornarem propriedades de seus proprietários. Em geral, todos os brilhantes recursos de introspecção do Python o tornam uma linguagem muito única, da capacidade de usar help () à capacidade de usar
__doc__
como uma propriedade de primeira classe de um objeto. Por exemplo:Outros recursos úteis de introspecção:
fonte
Generator Expressions
input()
Deixe-me explicar, eu não vi um idioma (até agora), onde você pode atribuir um valor a uma instrução que imprime algo, é como rubyprint/gets
, mas com um valor atribuído à impressão, em vez de:print "Foo" bar = gets
yield
ordereddict, namedtuple, array, list, tuple, dictionary
fonte
O problema é que o Python está entre muito poucas linguagens com sobrecarga sintática extremamente baixa, oferecendo enormes poderes expressivos: compreensão de lista / conjunto / dict, rendimento, decoradores, avaliação, programação de meta-classe, introspecção, estruturas de dados internas otimizadas (listas, dict, sets), todas essas coisas conspiram de uma maneira muito agradável para dar a você (desenvolvedor) o poder de expressar seus pensamentos em código conciso e elegante quase tão rápido quanto você pode imaginar. Eu realmente não consigo pensar em nenhuma outra linguagem com esse conjunto matador de recursos combinados.
fonte
Eu diria que é uso de recuo para incluir declarações e loops. Não vi isso em nenhum outro idioma.
Eu acho que é muito útil porque torna significativamente mais difícil ofuscar o código python!
Também parece ser executado de maneira organizada, linha por linha, com exceção das funções, e também pode ser interpretado como tal, o que é bom.
fonte