• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

andrethrill

pequena duvida numa linha de codigo....

10 mensagens neste tópico

Boas a todos pessoal, encontrei a seguinte função que me indica se um numero é primo mas acontece que não entendo bem a sintaxe da função---

def isPrime(n):

	return not [x for x in xrange(2,int(sqrt(n))+1) if n%x == 0]

será que alguem me poderia ajudar? não entendo principalmnete o que faz o "x" antes do for, e basiciamente quais os valores que toma o codigo que está entre parentesis rectos, se alguem me conseguir ajudar agradecia :)

cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ora.. se partires isso aos bocados talvez entendas. A função devolve os números X do intervalo (2, sqrt(n)+1) que não verifiquem a condição do ciclo: serem divisiveis por um numero que nao ele proprio (e 1, mas 1 não conta ali no ciclo).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas a todos pessoal, encontrei a seguinte função que me indica se um numero é primo mas acontece que não entendo bem a sintaxe da função---

def isPrime(n):

return not [x for x in xrange(2,int(sqrt(n))+1) if n%x == 0]

será que alguem me poderia ajudar? não entendo principalmnete o que faz o "x" antes do for, e basiciamente quais os valores que toma o codigo que está entre parentesis rectos, se alguem me conseguir ajudar agradecia :)

cumps

O problema não acho que é não perceberes a sintaxe, mas sim, não percebers o algoritmo usado.

Um número é primo quando é só divisível por si e por 1. Logo, se o número que queres verificar é primo, não é divisível por nenhum outro. Se ele não é primo, o divisor há-de ser sempre menor que a sua raiz quadrada.

Por exemplo:

se quiseres ver se 8 é primo, sabes que 8 não é, porque é divisível por 2. Agora, vamos ver a raiz quadrada de 2~=2.8284

Como podes ver, o divisor de 8 que diz que 8 não é primo é 2, que é menor que a raiz quadrada de 8, logo não vale a pena fazer um range até mais à frente que a raiz quadrada.

Múltiplos exemplos:

Nr=4;Divisor=2;SQRT=2.0

Nr=6;Divisor=2;SQRT=2.44948974278

Nr=8;Divisor=2;SQRT=2.82842712475

Nr=9;Divisor=3;SQRT=3.0

Nr=10;Divisor=2;SQRT=3.16227766017

Nr=12;Divisor=2;SQRT=3.46410161514

Nr=14;Divisor=2;SQRT=3.74165738677

Nr=15;Divisor=3;SQRT=3.87298334621

Nr=16;Divisor=4;SQRT=4.0

Nr=18;Divisor=2;SQRT=4.24264068712

Nr=20;Divisor=2;SQRT=4.472135955

Nr=21;Divisor=3;SQRT=4.58257569496

Nr=22;Divisor=2;SQRT=4.69041575982

Nr=24;Divisor=2;SQRT=4.89897948557

Nr=25;Divisor=5;SQRT=5.0

Nr=26;Divisor=2;SQRT=5.09901951359

Nr=27;Divisor=3;SQRT=5.19615242271

Nr=28;Divisor=2;SQRT=5.29150262213

Nr=30;Divisor=2;SQRT=5.47722557505

Nr=32;Divisor=2;SQRT=5.65685424949

Nr=33;Divisor=3;SQRT=5.74456264654

Nr=34;Divisor=2;SQRT=5.83095189485

Nr=35;Divisor=5;SQRT=5.9160797831

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas

dsclpem so responder agora mas tive sem net,  a minha duvida mas concretamente é por exemplo o que faz o X antes do for, não sei o que é que isso faz.... e por exemplo tambem não percebo o que é que o not está a negar....

se me pudessem ajudar :P

cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que o "not" faz é modificar os valores "False" para "True" e "True" para "False".

O código

[x for x in xrange(2,int(sqrt(n))+1) if n%x == 0]

assim escrito dá-te uma lista de todos os números que ao dividir com a variável "n" dá resto 0.

Qualquer lista que tenha um valor (ou valores) qualquer tem um significado de "True" para o Python.

Por exemplo:

>>> if [2]:
print "Esta lista foi considerada como True."

Esta lista foi considerada como True.
>>> if []:
print "Esta lista foi considerada como True."


>>>

Portanto, se houvesse algum divisor da variável "n", a função daria o valor True, senão era o False.

Isso iria-te obrigar a pensar ao contrário, pois quando fosse True significava que não era número primo, e se fosse False significava que era número primo.

Coloca-se então o "not". Assim, se for número primo a função dá-te o contrário de False (que obviamente é True), senão dá-te o contrário de True (que é False).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que o "not" faz é modificar os valores "False" para "True" e "True" para "False".

O código

[x for x in xrange(2,int(sqrt(n))+1) if n%x == 0]

assim escrito dá-te uma lista de todos os números que ao dividir com a variável "n" dá resto 0.

Qualquer lista que tenha um valor (ou valores) qualquer tem um significado de "True" para o Python.

Por exemplo:

>>> if [2]:
print "Esta lista foi considerada como True."

Esta lista foi considerada como True.
>>> if []:
print "Esta lista foi considerada como True."


>>>

Portanto, se houvesse algum divisor da variável "n", a função daria o valor True, senão era o False.

Isso iria-te obrigar a pensar ao contrário, pois quando fosse True significava que não era número primo, e se fosse False significava que era número primo.

Coloca-se então o "not". Assim, se for número primo a função dá-te o contrário de False (que obviamente é True), senão dá-te o contrário de True (que é False).

assim ja tou a entender melhor, é que o que me confundo é o facto de nao ter nenhum códgo após o if e ter um X antes do for.... é que eu aprendi a programar em C agora tou-me a lançar no python e nunca vi algo assim ;\

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

assim ja tou a entender melhor, é que o que me confundo é o facto de nao ter nenhum códgo após o if e ter um X antes do for.... é que eu aprendi a programar em C agora tou-me a lançar no python e nunca vi algo assim ;\

Não tinha visto essa parte do post, erro meu (uma pessoa distraí-se com alguma coisa e *puff* lá se vai meia frase :P)

o [x for x in xrange(2,int(sqrt(n))+1) if n%x == 0] seria o mesmo que

for x in xrange(2,int(sqrt(n))+1):
    if n%x == 0:
        uma_lista_qualquer.append(x)

Podia também utilizar métodos que o "x" pudesse ter, como por exemplo [ x.replace("abc", "def") for x in lista ] (o if é opcional).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não tinha visto essa parte do post, erro meu (uma pessoa distraí-se com alguma coisa e *puff* lá se vai meia frase :P)

o [x for x in xrange(2,int(sqrt(n))+1) if n%x == 0] seria o mesmo que

for x in xrange(2,int(sqrt(n))+1):
    if n%x == 0:
        uma_lista_qualquer.append(x)

Podia também utilizar métodos que o "x" pudesse ter, como por exemplo [ x.replace("abc", "def") for x in lista ] (o if é opcional).

agpra ja percebi, muito obrigado a ti e a todos :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora