Bom gostaria da avaliação de todos quanto ao meu programa pois concerteza ele não está 100% com cara de python, meus conceitos de uma linguagem estruturada (C) ainda estão muito fortes então eu sempre acabo colocando algo de C em tudo q eu faço (tipo contatores em fluxo de repetição, etc) mais eu sempre tento melhorar isso também e aprender sempre mais e estou conseguindo me adaptar sempre a pensar de acordo com o paradigma da linguagem na qual estou trabalhando.
Abaixo segue o link para o código do programa.
http://pastebin.com/raw.php?i=ywGnCK0h
Agradeço desde já a ajuda de todos.
Att,
Erick.
------------------------------------
,-----------------------------------------------------------.
| Antes de enviar um e-mail para o grupo leia: |
| http://www.pythonbrasil.com.br/moin.cgi/AntesDePerguntar |
| E se você é usuário do BOL lembre-se de cadastrar o |
| e-mail do grupo na lista branca do seu sistema anti-spam. |
`-----------------------------------------------------------´Links do Yahoo! Grupos
<*> Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/python-brasil/
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@yahoogrupos.com.br
<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html
por exemplo de bin para dec vc pode fazer simplesmente:
print int('1110',2)
e o resultado será o numero inteiro
voce provavelmente tera algo parecido para a conversao inversa. mas eu nao
procurei mt agora e nao lembro bem essas conversoes agora. Domingo nao eh um
dia que se pensa mt
Demetrius Albuquerque
Linux & SO www.maltzsama.blogspot.com
Estação do Rock http://www.estacaodorock.com
Em 24 de abril de 2010 20:39, erick <erick.g...@gmail.com> escreveu:
>
>
> Olá a todos da lista.
> Sou principiante na linguagem python, mais estou gostanto bastante da mesa,
> fiz um pequeno programa em python de conversão binario para decimal e vice
> versa usando Tkinter.
> O propósito principal desse meu "mini"projeto é aprender a trabalhar com
> listas e me familiarizar com a linguagem.
>
> Bom gostaria da avaliação de todos quanto ao meu programa pois concerteza
> ele não está 100% com cara de python, meus conceitos de uma linguagem
> estruturada (C) ainda estão muito fortes então eu sempre acabo colocando
> algo de C em tudo q eu faço (tipo contatores em fluxo de repetição, etc)
> mais eu sempre tento melhorar isso também e aprender sempre mais e estou
> conseguindo me adaptar sempre a pensar de acordo com o paradigma da
> linguagem na qual estou trabalhando.
> Abaixo segue o link para o código do programa.
>
> http://pastebin.com/ywGnCK0h
>
> http://pastebin.com/raw.php?i=ywGnCK0h
>
> Agradeço desde já a ajuda de todos.
>
> Att,
> Erick.
>
>
>
[As partes desta mensagem que não continham texto foram removidas]
Carlos,
Honestamente, eu não sei se uma solução com reduce e lambda é
"pythonica". Eu também sou iniciante em Python mas já escrevi alguns
pedaços de código, também já li códigos escritos por outras pessoas.
Sugerir essa conversão é engenhoso, é legal mas não sei se é claro
para muita gente, principalmente para um iniciante.
Eu posso estar errado, sou novato e certamente a grande maioria aqui
sabe muito mais Python do que eu, mas quando eu olho pra essa linha
que você mostrou vejo algo muito distante de:
Explicit is better than implicit.
Simple is better than complex.
Em tempo, eu não tenho nenhuma solução para a função bin_dec, não
pensei, só achei que a proposta me pareceu mais complicada do que
deveria ser.
Abraços,
--
Vinícius Figueiredo
Como outra pessoa já comentou (e como você mesmo admite no seu comentário),
a implementação funciona mas não é "pitônica". Manipular dados "básicos"
como caracteres e dígitos individuais com loops em Python tende a ser
ineficiente. Existem funções de conversão nativas em Python que são
implementadas em C e portanto são bem eficientes. E finalmente, no Python
2.x já era possível escrever números em notações como octal e hexadecimal, e
no Python 3.x já é possível escrever binários diretamente ('0b001101', por
exemplo). Mas o mais importante é entender a filosofia da linguagem e as
possibilidades que uma linguagem de mais "alto nível" oferece se comparada a
C.
Nesse sentido, mesmo uma função de conversão como a que você fez poderia ser
implementada usando outras construções mais eficientes para lidar com
strings (ou com listas arbitrárias). Um exemplo, uma possível implementação
para uma função "bin_dec" poderia ser:
>>> s= "10010"
>>> reduce(lambda x,y:2*x+((y=='1') and 1 or 0), s, 0)
>>> print s
18
Experimente com esse tipo de construção, isso pode ajudar você a entender
outras formas de construir programas!
Carlos Ribeiro
2010/4/24 erick <erick.g...@gmail.com>
--
Carlos Ribeiro
Consultoria em Projetos
twitter: http://twitter.com/carribeiro
blog: http://rascunhosrotos.blogspot.com
mail: carri...@gmail.com
[As partes desta mensagem que não continham texto foram removidas]
------------------------------------
--- Em dom, 25/4/10, Carlos Ribeiro <carri...@gmail.com> escreveu:
De: Carlos Ribeiro <carri...@gmail.com>
Assunto: Re: [python-brasil] Principiante em python.
Para: python...@yahoogrupos.com.br
Data: Domingo, 25 de Abril de 2010, 22:53
Antes de começar, gostaria de dizer que meu comentário é bem-intencionado,
portanto, não leve a mal (e não fique sem graça também).
Como outra pessoa já comentou (e como você mesmo admite no seu comentário),
a implementação funciona mas não é "pitônica". Manipular dados "básicos"
como caracteres e dígitos individuais com loops em Python tende a ser
ineficiente. Existem funções de conversão nativas em Python que são
implementadas em C e portanto são bem eficientes. E finalmente, no Python
2.x já era possível escrever números em notações como octal e hexadecimal, e
no Python 3.x já é possível escrever binários diretamente ('0b001101', por
exemplo). Mas o mais importante é entender a filosofia da linguagem e as
possibilidades que uma linguagem de mais "alto nível" oferece se comparada a
C.
Nesse sentido, mesmo uma função de conversão como a que você fez poderia ser
implementada usando outras construções mais eficientes para lidar com
strings (ou com listas arbitrárias). Um exemplo, uma possível implementação
para uma função "bin_dec" poderia ser:
>>> s= "10010"
>>> reduce(lambda x,y:2*x+((y= ='1') and 1 or 0), s, 0)
>>> print s
18
Experimente com esse tipo de construção, isso pode ajudar você a entender
outras formas de construir programas!
Carlos Ribeiro
2010/4/24 erick <erick.gallani. 1...@gmail.com>
> Olá a todos da lista.
> Sou principiante na linguagem python, mais estou gostanto bastante da
> mesa, fiz um pequeno programa em python de conversão binario para decimal e
> vice versa usando Tkinter.
> O propósito principal desse meu "mini"projeto é aprender a trabalhar com
> listas e me familiarizar com a linguagem.
>
> Bom gostaria da avaliação de todos quanto ao meu programa pois concerteza
> ele não está 100% com cara de python, meus conceitos de uma linguagem
> estruturada (C) ainda estão muito fortes então eu sempre acabo colocando
> algo de C em tudo q eu faço (tipo contatores em fluxo de repetição, etc)
> mais eu sempre tento melhorar isso também e aprender sempre mais e estou
> conseguindo me adaptar sempre a pensar de acordo com o paradigma da
> linguagem na qual estou trabalhando.
> Abaixo segue o link para o código do programa.
>
> http://pastebin. com/ywGnCK0h
>
> http://pastebin. com/raw.php? i=ywGnCK0h
>
> Agradeço desde já a ajuda de todos.
>
> Att,
> Erick.
>
>
>
> ------------ --------- --------- ------
>
> ,----------- --------- --------- --------- --------- --------- --.
> | Antes de enviar um e-mail para o grupo leia: |
> | http://www.pythonbr asil.com. br/moin.cgi/ AntesDePerguntar |
> | E se você é usuário do BOL lembre-se de cadastrar o |
> | e-mail do grupo na lista branca do seu sistema anti-spam. |
> `----------- --------- --------- --------- --------- --------- --´Links do
> Yahoo! Grupos
>
>
>
--
Carlos Ribeiro
Consultoria em Projetos
twitter: http://twitter. com/carribeiro
blog: http://rascunhosrot os.blogspot. com
mail: carribeiro@gmail. com
Com relação a esse metodo.
">>> s= "10010"
>>> reduce(lambda x,y:2*x+((y=='1') and 1 or 0), s, 0)
>>> print s
18"
Como disse nosso amigo Vinícius Figueiredo, seria legal quando propor
soluções assim explicar como exatamente essa função está trabalhando com os
dados, talvez para alguem que já programe fluente em Python isso seja muito
fácil de compreender para pessoas que estão começando como eu é um tanto
quanto complicado, portanto uma explicação sobre a função seria legal.
Agradeço a todos pelas dicas, se alguem tiver mais dicas fiquem a vontade
para expor as mesmas.
Att,
Erick.
Em 26 de abril de 2010 11:03, ubiratan lopes <uaa...@yahoo.com.br>escreveu:
>
>
> gostaria de agradecer as dicas, estou estudando PYTHON e a cada dia acho-a
> mais fascinante. podem mandar dicas a vontade pois percebi que vocês mancham
> muito.
> estou aprendendo pensar em objetos pois só programo para microcontrolador
> ATMEL.
>
> --- Em dom, 25/4/10, Carlos Ribeiro <carri...@gmail.com<carribeiro%40gmail.com>>
> escreveu:
> 2010/4/24 erick <erick.gallani. 1...@gmail.com <1%40gmail.com>>
--
Atenciosamente.
Erick
2010/4/26 Erick Gallani <erick.g...@gmail.com>:
--
Fábio Cerqueira
Acens - Mentes em Desenvolvimento
Laboratório de Redes de Comunicação e Segurança da Informação - LARCES
Enfim, não sabia dessa...
O oposto também vale
>>> 0b1011
11
--
Pedro Werneck
> Com relação a esse metodo.
> ">>> s= "10010"
> >>> reduce(lambda x,y:2*x+((y=='1') and 1 or 0), s, 0)
> >>> print s
> 18"
>
> Como disse nosso amigo Vinícius Figueiredo, seria legal quando propor
> soluções assim explicar como exatamente essa função está trabalhando com os
> dados, talvez para alguem que já programe fluente em Python isso seja muito
> fácil de compreender para pessoas que estão começando como eu é um tanto
> quanto complicado, portanto uma explicação sobre a função seria legal.
>
Talvez eu tenha me expressado mal, mas posso garantir que minha intenção não
era soar como exibicionista, arrogante ou "sabe tudo". Pra ser exato
respondi ao email num intervalo de 10 minutos, no meio da correria do dia a
dia, e nem tive tempo de elaborar melhor a resposta... mas vamos lá. Recorri
a algumas técnicas pouco comuns (e pouco recomendadas!), mas a idéia era
muito mais mostrar que existe abordagens completamente diferentes, do que
causar esse tipo de impacto que infelizmente ocorreu. Só posso dizer que a
intenção foi boa.
Vou tentar explicar melhor. Esse trechinho de código ilustra duas técnicas
diferentes:
1) A primeira é uma "expressão ternária". Devido à forma como os operadores
"and" e "or" funcionam, a expressão "a and b or c" funciona como um
"if-then-else" compacto, que testa o valor de "a"; se "a" for verdadeiro,
retorna "b"; se "a" for falso, retorna "c".
Assim, (y=='1') and 1 or 0) é basicamente o mesmo que:
if y=='1':
return 1
else:
return 0
Note que este é um hack prático mas pouco recomendado em termos de
legibilidade. A bem da verdade tive que recorrer a ele por conta da técnica
#2 (ver abaixo).
Tudo isso colocado, o mais simples mesmo era ter usado a conversão simples
- int(y) -que faz praticamente a mesma coisa de forma muito mais simples.
2) A função reduce percorre uma sequência e calcula o valor acumulado de uma
função. No caso, eu escrevi essa função usando um "lambda" para não ter que
criar uma função normal. Uma chamada reduce(funcao, sequencia, inicial) é
mais ou menos equivalente a:
x = inicial
for item in sequencia:
x = funcao(x, item)
return x
No caso exemplificado a função "lambda" dobra o valor atual e soma o próximo
digito. É o mesmo que você faria dentro de um loop que estivesse varrendo a
sua string binária:
funcao(x, digito) --> 2*x+digito
onde:
digito --> se y=='1', retornar 1; caso contrário retornar 0
Como o lambda tem que ser escrito obrigatoriamente em uma só linha
(limitação da sintaxe), não podia usar um "if" normal, então usei a
expressão explicada no item (1).
reduce(lambda x,y:2*x+((y=='1') and 1 or 0), s, 0)
Ou usando int():
reduce(lambda x,y:2*x+int(y), s, 0)
Note que o reduce() é uma função de uso meio controverso. Eu pessoalmente
gosto de usar mas há quem ache confuso e "não pitônico". Por esse motivo ela
foi rebaixada de função padrão do Python para uma biblioteca de operações
funcionais (functools) no Python3.0.
Dando a mão à palmatória, daria para ter feito a mesma coisa de forma mais
limpa e legível:
- separando a conversão dos dígitos '1' e '0' em valores em uma função
externa;
- melhor ainda, fazendo uma simples chamada para int();
- separando o lambda em uma função externa;
- trocando o reduce por um loop explícito.
Espero que a explicação tenha ajudado, e que qualquer mal-entendido seja
esclarecido!!
--
Carlos Ribeiro
Consultoria em Projetos
twitter: http://twitter.com/carribeiro
blog: http://rascunhosrotos.blogspot.com
mail: carri...@gmail.com
Eu diria que a maneira mais "pythônica" de implementar isso seria essa:
>>> s = "10010"
>>> sum(2**i for i, v in enumerate(reversed(s)) if v == '1')
18
Note a ênfase em "implementar". É óbvio que para fazer isso basta usar int()
passando a base.
Python não encoraja muito o uso de lambda, do hack com operador ternário, e
até mesmo do reduce.
--
Pedro Werneck
Oi, Carlos, um detalhe importante para se ter em mente. É bom ter
cuidado com esse tipo de construção, pois, caso "b" seja falso num
contexto booleano, "a and b or c" vai retornar "c":
>>> a = True
>>> b = []
>>> c = [1]
>>> a and b or c
[1]
Assim, acho mais apropriado usar para esse propósito "b if a else c",
que aliás é mais legível.
Abraços,
André
> On Wednesday 28 April 2010 11:08:28 Carlos Ribeiro wrote:
> [corta]
> >
> > Dando a mão à palmatória, daria para ter feito a mesma coisa de forma
> mais
> > limpa e legível:
>
> Eu diria que a maneira mais "pythônica" de implementar isso seria essa:
>
> >>> s = "10010"
> >>> sum(2**i for i, v in enumerate(reversed(s)) if v == '1')
> 18
>
Muito bom!
Note a ênfase em "implementar". É óbvio que para fazer isso basta usar int()
> passando a base.
>
> Python não encoraja muito o uso de lambda, do hack com operador ternário, e
> até mesmo do reduce.
>
Dou a mão à palmatória. Como atenuante só queria dizer que eu mandei o
primeiro email apressadamente, e acabei usando o operador ternário e não o
if "novo" por puro hábito. É por isso que é bom pensar antes de apertar o
"send" :-)
--
Carlos Ribeiro
Consultoria em Projetos
twitter: http://twitter.com/carribeiro
blog: http://rascunhosrotos.blogspot.com
mail: carri...@gmail.com
[As partes desta mensagem que não continham texto foram removidas]
------------------------------------