associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

Diferenças para "SomarNumerosDeUmArquivoEmUmaLinha"

Diferenças entre as versões de 1 e 8 (7 versões de distância)
Revisão 1e 2005-01-29 20:04:15
Tamanho: 785
Comentário:
Revisão 8e 2008-09-26 14:07:33
Tamanho: 2090
Editor: localhost
Comentário: converted to 1.6 markup
Deleções são marcadas assim. Adições são marcadas assim.
Linha 1: Linha 1:
#pragma section-numbers off
Linha 4: Linha 3:
Em um [http://www.mse.com/icon/ documento] que explica o uso da linguagem Icon, tem um interessante exemplo de programa que computa a soma de todos os números de um arquivo (estes, separados por espaços), os números podem estar dispersos em várias linhas. Um arquivo de exemplo seria: Em um [[http://www.mse.com/icon/|documento]] que explica o uso da linguagem Icon, tem um interessante exemplo de programa que computa a soma de todos os números de um arquivo (estes, separados por espaços), os números podem estar dispersos em várias linhas. Um arquivo de exemplo seria:
Linha 15: Linha 14:
Em Icon o programa ficaria assim:

{{{
every sum +:= !split(!&input, ' \t')
}}}

Aonde "input" é a stream de entrada.
Linha 16: Linha 23:

Este é o código para Python 2.2 e 2.3:
Linha 19: Linha 28:
import sys

if __name__ == '__main__':
   print "Aqui entra o código"
print sum([sum([int(s) for s in l.split()]) for l in __import__("sys").stdin])
Linha 26: Linha 31:
== Exemplo de uso == Para o Python 2.4 podemos utilizar 'generator expressions' para fazer a mesma coisa. Com isso temos um código muito mais 'escalável' (palavra bonita), pois não será necessário alocar uma lista com strings e outra com inteiros para cada linha do arquivo (imagine isso para um arquivo bem grande). Eis o código:
Linha 30: Linha 35:
import sys print sum((sum((int(n) for n in sn)) for sn in (linha.split() for linha in __import__("sys").stdin)))
}}}
Linha 32: Linha 38:
if __name__ == '__main__':
   print "Aqui entra o exemplo de uso. Essa seção é opcional."
Usar as características de linguagens funcionais que Python traz consigo torna a programação [[http://64.233.187.104/search?q=cache:aND5UNWjJm8J:www.microsoft.com/brasil/pr/ie40prev.htm+%22uma+experi%C3%AAncia+muito+mais%22++microsoft&hl=pt-BR|muito mais rica e empolgante]], além de servir como um divertido exercício.
Linha 35: Linha 40:
=== Comentário (por João Paulo F Farias) ===

Achei uma forma mais simples:

{{{
#!python
sum(map(int, __import__('sys').stdin.read().split()))
Linha 36: Linha 48:

:P

Uma forma mista (Bogdano), para Python2.4:

{{{
#!python
sum((int(n) for n in __import__('sys').stdin.read().split()))
}}}

As duas formas acima são muito mais simples, porém consomem muita memória, pois 'split()' gera uma lista com todos os números do arquivo (uma saída seria ler em blocos), e no primeiro caso mais uma lista com os inteiros (gerada por 'map()').
Linha 41: Linha 64:
Nome do autor da Receita BogdanoArendartchuk

Receita: Somando números de um arquivo com uma linha de código

Em um documento que explica o uso da linguagem Icon, tem um interessante exemplo de programa que computa a soma de todos os números de um arquivo (estes, separados por espaços), os números podem estar dispersos em várias linhas. Um arquivo de exemplo seria:

10 30 5
5
2 54 2 76 4 2
2 4 
3
4 5 6 20 12

Em Icon o programa ficaria assim:

every sum +:= !split(!&input, ' \t')

Aonde "input" é a stream de entrada.

Código

Este é o código para Python 2.2 e 2.3:

   1 print sum([sum([int(s) for s in l.split()]) for l in __import__("sys").stdin])

Para o Python 2.4 podemos utilizar 'generator expressions' para fazer a mesma coisa. Com isso temos um código muito mais 'escalável' (palavra bonita), pois não será necessário alocar uma lista com strings e outra com inteiros para cada linha do arquivo (imagine isso para um arquivo bem grande). Eis o código:

   1 print sum((sum((int(n) for n in sn)) for sn in (linha.split() for linha in __import__("sys").stdin)))

Usar as características de linguagens funcionais que Python traz consigo torna a programação muito mais rica e empolgante, além de servir como um divertido exercício.

Comentário (por João Paulo F Farias)

Achei uma forma mais simples:

   1 sum(map(int, __import__('sys').stdin.read().split()))

:P

Uma forma mista (Bogdano), para Python2.4:

   1 sum((int(n) for n in __import__('sys').stdin.read().split()))

As duas formas acima são muito mais simples, porém consomem muita memória, pois 'split()' gera uma lista com todos os números do arquivo (uma saída seria ler em blocos), e no primeiro caso mais uma lista com os inteiros (gerada por 'map()').

Volta para CookBook.


BogdanoArendartchuk