Python não garante o uso de ponto e vírgula para finalizar instruções. Então, por que isso (abaixo) é permitido?
import pdb; pdb.set_trace()
Python não garante o uso de ponto e vírgula para finalizar instruções. Então, por que isso (abaixo) é permitido?
import pdb; pdb.set_trace()
Respostas:
O Python não requer ponto -e-vírgula para finalizar instruções. Ponto e vírgula pode ser usado para delimitar instruções, se você deseja colocar várias instruções na mesma linha.
Agora, por que isso é permitido? É uma decisão de design simples. Eu não acho que o Python precise dessa coisa de ponto-e-vírgula, mas alguém pensou que seria bom ter e o adicionou à linguagem.
timeit a = 5; a*a
timeitsignifica? a = 2; a*aé inútil, pois aainda é 2; ele teria que sera = 2; a *= a
http://docs.python.org/reference/compound_stmts.html
As declarações compostas consistem em uma ou mais 'cláusulas'. Uma cláusula consiste em um cabeçalho e um 'conjunto'. Os cabeçalhos da cláusula de uma instrução composta específica estão todos no mesmo nível de indentação. Cada cabeçalho da cláusula começa com uma palavra-chave de identificação exclusiva e termina com dois pontos. Um conjunto é um grupo de instruções controladas por uma cláusula. Um conjunto pode ser uma ou mais instruções simples separadas por ponto-e-vírgula na mesma linha que o cabeçalho, após os dois pontos do cabeçalho, ou pode ser uma ou mais instruções recuadas nas linhas subseqüentes . Somente a última forma de suíte pode conter instruções compostas aninhadas; o seguinte é ilegal, principalmente porque não seria claro a que cláusula if se pertenceria uma cláusula else:
if test1: if test2: print xObserve também que o ponto-e-vírgula se liga mais estreitamente que os dois pontos neste contexto, para que, no exemplo a seguir, todas ou nenhuma das instruções print sejam executadas:
if x < y < z: print x; print y; print z
Resumindo:
compound_stmt ::= if_stmt
| while_stmt
| for_stmt
| try_stmt
| with_stmt
| funcdef
| classdef
| decorated
suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement ::= stmt_list NEWLINE | compound_stmt
stmt_list ::= simple_stmt (";" simple_stmt)* [";"]
if cond: stmt1; stmt2; stmt3exemplo, todas ou nenhuma das instruções é executada ".
Python usa o ;como um separador, não um terminador. Você também pode usá-los no final de uma linha, o que os faz parecer um terminador de instruções, mas isso é legal apenas porque instruções em branco são legais em Python - uma linha que contém um ponto-e-vírgula no final são duas instruções, a segunda um espaço em branco.
stmt_list ::= simple_stmt (";" simple_stmt)* [";"]
Depois de ler as respostas, ainda sinto falta de um aspecto importante do ponto e vírgula, possivelmente o único em que realmente faz a diferença ...
Quando você está trabalhando em um intérprete REPL (o shell interativo Python, IDLE, ipython), o valor da última expressão é impresso na tela e, geralmente, esse é o comportamento pretendido.
Mas, em alguns casos, você deseja avaliar uma expressão apenas para seus efeitos colaterais, por exemplo, para ver os resultados de sua simulação plotados por matplotlib.
Nesse caso, você (provavelmente) não deseja ver a tela cheia de repr s de matplotlibobjetos que às vezes são retornados por uma chamada para uma matplotlibfunção e, pelo menos no IPython, uma das possibilidades que você tem é acrescentar um ponto-e-vírgula ao valor excessivo. instrução detalhada , agora o IPython vê a linha de entrada composta por duas expressões, a matplotlibinvocação e uma instrução nula, de modo que o valor da expressão composta é Nonee nada é impresso na tela pelo intérprete (a outra possibilidade é a atribuição , como em _ = plot(...)mas acho isso um pouco mais intrusivo).
IMHO, o uso do ponto-e-vírgula para suprimir a saída não desejada no intérprete tornou-se mais relevante após a introdução do notebook IPyton, que permite salvar a entrada e a saída, incluindo a saída gráfica, de uma sessão de intérprete para documentação e eventual reutilização .
ipython... Eu editei minha resposta para refletir sua observação.
Como todo mundo observou, você pode usar ponto e vírgula para separar as instruções. Você não precisa , e não é o estilo usual.
Quanto ao motivo pelo qual isso é útil, algumas pessoas gostam de colocar duas ou mais declarações curtas realmente triviais em uma única linha (pessoalmente, acho que isso transforma várias linhas triviais e facilmente passadas em uma única linha de aparência complexa e torna mais difícil ver que é trivial) .
Mas é quase um requisito quando você está chamando os liners Python a partir do shell usando python -c '<some python code>'. Aqui você não pode usar o recuo para separar as instruções. Portanto, se o seu one-liner é realmente de dois, você precisará usar um ponto-e-vírgula. E se você quiser usar outros argumentos em uma linha, precisará importar syspara obter sys.argv, o que exige uma importdeclaração separada . por exemplo
python -c "import sys; print ' '.join(sorted(sys.argv[1:]))" 5 2 3 1 4
1 2 3 4 5
pythonno shell: basta estender o código citado por várias linhas ou usar um heredoc. Ainda assim, isso falhará se você quiser que seja "uma linha". ;)
-c
Percebo que sou tendencioso como um programador C antigo, mas há momentos em que as várias convenções do Python tornam as coisas difíceis de seguir. Às vezes, acho a convenção de travessia um pouco aborrecida.
Às vezes, a clareza de quando uma instrução ou bloco termina é muito útil. O código C padrão geralmente lê algo como isto:
for(i=0; i<100; i++) {
do something here;
do another thing here;
}
continue doing things;
onde você usa o espaço em branco para obter mais clareza - e é fácil ver onde o loop termina.
O Python permite que você termine com um ponto e vírgula (opcional). Como observado acima, isso NÃO significa que há uma instrução a ser executada seguida por uma instrução 'nula'. SO, por exemplo,
print(x);
print(y);
É o mesmo que
print(x)
print(y)
Se você acredita que o primeiro tem uma declaração nula no final de cada linha, tente - como sugerido - fazendo o seguinte:
print(x);;
Irá gerar um erro de sintaxe.
Pessoalmente, acho que o ponto-e-vírgula torna o código mais legível quando você tem muitos aninhamentos e funções com muitos argumentos e / ou argumentos de nome longo. Então, a meu ver, isso é muito mais claro do que outras opções:
if some_boolean_is_true:
call_function(
long_named_arg_1,
long_named_arg_2,
long_named_arg_3,
long_named_arg_4
);
pois, para mim, você sabe que o último ')' termina algum 'bloco' que passou por muitas linhas.
Pessoalmente, acho que há muito a ser feito nas diretrizes de estilo PEP, IDEs que as aplicam e a crença de que existe "apenas uma maneira pitônica de fazer as coisas". Se você acredita no último, veja como formatar números: a partir de agora, o Python suporta quatro maneiras diferentes de fazê-lo.
Tenho certeza de que serei inflamado por alguns problemas, mas o compilador / intérprete não se importa se os argumentos têm nomes longos ou curtos e - mas para a convenção de indentação em Python - não se preocupa com espaços em branco. O maior problema com o código é dar clareza a outro humano (e até a você mesmo depois de meses de trabalho) para entender o que está acontecendo, onde as coisas começam e terminam etc.
Ponto e vírgula fazem parte da sintaxe válida: 8. Instruções compostas (The Python Language Reference)
Uma citação de " When Pythons Attack "
Não encerre todas as suas declarações com ponto e vírgula. É tecnicamente legal fazer isso no Python, mas é totalmente inútil, a menos que você esteja colocando mais de uma instrução em uma única linha (por exemplo, x = 1; y = 2; z = 3).
x,y,z = 1,2,3?
x, y, z = 1, 2, 3seja mais lento, pois incorre em uma viagem de ida e volta desnecessária na construção de uma tupla e, em seguida, a envia imediatamente. (A propósito, eu realmente não acho que @communistpancake está sugerindo o x=1; y=2; z=3padrão. Acho que ele / ela está apenas dando um exemplo de como ponto-e-vírgula é um separador e não um terminador.)
Várias instruções em uma linha podem incluir ponto e vírgula como separadores. Por exemplo: http://docs.python.org/reference/compound_stmts.html No seu caso, facilita a inserção de um ponto para entrar no depurador.
Além disso, como mencionado por Mark Lutz no Learning Python Book , é tecnicamente legal (embora desnecessário e irritante) encerrar todas as suas declarações com ponto e vírgula.
Ponto e vírgula pode ser usado para uma linha, dois ou mais comandos. Eles não precisam ser usados, mas não são restritos.
O ponto-e-vírgula (;) permite várias instruções na linha única, uma vez que nenhuma instrução inicia um novo bloco de código.
http://www.tutorialspoint.com/python/python_basic_syntax.htm
Ponto e vírgula (como pontos, vírgulas e parênteses) tendem a causar guerras religiosas. Ainda assim, eles (ou algum símbolo semelhante) são úteis em qualquer linguagem de programação por vários motivos.
Prático: a capacidade de colocar vários comandos curtos que pertencem conceitualmente juntos na mesma linha. Um texto de programa que se parece com uma cobra estreita tem o efeito oposto ao pretendido por novas linhas e recuo, o que está destacando a estrutura.
Conceitual: separação de preocupações entre sintaxe pura (neste caso, para uma sequência de comandos) e apresentação (por exemplo, nova linha), antigamente chamada de "impressão bonita".
Observação: para destacar a estrutura, o recuo pode ser aumentado / substituído por linhas verticais da maneira óbvia, servindo como uma "régua visual" para ver onde um recuo começa e termina. Cores diferentes (por exemplo, seguindo o código de cores para resistores) podem compensar a aglomeração.
É permitido porque os autores decidiram permitir: https://docs.python.org/2/reference/simple_stmts.html
Se passarmos a questionar por que os autores decidiram fazer isso, acho que é porque a semicoluna é permitida como final de instrução simples, pelo menos nos seguintes idiomas: C ++, C, C #, R, Matlab, Perl, ...
Portanto, é mais rápido mudar para o uso do Python para pessoas com experiência em outra linguagem. E não há perda de generalidade nesse julgamento.
O ponto e vírgula (";") é necessário apenas para a separação de instruções em um mesmo bloco, como se tivéssemos o seguinte código C:
if(a>b)
{
largest=a; //here largest and count are integer variables
count+=1;
}
Pode ser escrito em Python em uma das duas formas:
if a>b:
largest=a
count=count+1
Ou
if a>b: largest=a;count=count+1
No exemplo acima, você pode ter qualquer número de instruções em um ifbloco e pode ser separado por ";" em vez de.
Espero que nada seja tão simples quanto a explicação acima.
Adicionando ao vasto conhecimento presente aqui,
esta é uma resposta relacionada à biblioteca matplotlib
import numpy as np
import matplotlib as plt
%matplotlib notebook
linear_data = np.array([1, 2, 3, 4, 5, 6, 7, 8])
quadratic_data = linear_data**2
plt.figure()
xvals = range(len(linear_data))
plt.barh(xvals, linear_data, height = 0.3, color='b')
plt.barh(xvals, quadratic_data, height = 0.3, left=linear_data, color='r')
Se você não fornecer um ponto-e-vírgula no final do barh (barra horizontal), a saída será um gráfico + um endereço de função. Mas se você usar ponto e vírgula no final de ambas as linhas barh, ele mostrará apenas o gráfico e suprimirá a saída do endereço da função.
Algo assim: Comparação