VinBR

LP 05/10/2011

Oct 27th, 2011
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.43 KB | None | 0 0
  1.  
  2. # # # # # # # # # # # # # #
  3. # Linguagens de Programação #
  4. # Prof. Fernando Pereira #
  5. # notasdogarcia.blog.com #
  6. # # # # # # # # # # # # # #
  7.  
  8. // Vamos falar de linguagens imperativas.
  9.  
  10. O que diferencia linguagens imperativas de linguagens funcionais?
  11. As linguagens imperativas são mais semelhantes à algoritimos.
  12. E são descritas usando estados que são alterados por comandos.
  13. O que são comandos então?
  14.  
  15. CONCEITO:
  16. Um Comando é uma linha de código destinada a alterar o estado de uma estrutura do programa.
  17.  
  18. Exemplos de Tipos de comandos:
  19. Comandos de Desvio - if, while, for, do-while, repeat, goto, break, throw, call, continue, etc..
  20. Comandos de Atribuição - a = b, a += b, a = *p
  21. // Tinha mais um aqui, mas demorei pra copiar e ele já tirou da tela =P
  22.  
  23. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  24.  
  25. Python é a linguagem com a qual vamos lidar para descrever linguagens imperativas.
  26. // Antigamente o professor utilizava Java, porém como hoje nós já temos alguma experiência com Java, ele prefere usar o Python para nós ganharmos prática.
  27.  
  28. Python ganhou o nome de um seriado britânico.
  29. E é uma linguagem bem simples que já foi até usada para ensinar crianças.
  30.  
  31. A filosofia de python é:
  32.  
  33. beautiful is better than ugly
  34. Explicit is better than implicit. // apesar de que quanto explicidade SML é bem mais explicito que python né =P.
  35. Simples is better than complex.
  36. Complex is better than complicated.
  37. Flat is better than nested.
  38. Sparse is better than dense
  39. Readability counts.
  40. Special cases aren't special enough to ...
  41. ...tem outras coisas mas o principal é isso aí. (na verdade nem consegui copiar o resto xP)
  42.  
  43. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  44.  
  45. Exemplo de código em Python:
  46.  
  47. if 2 != 3:
  48. a = "oi"
  49. else:
  50. a = 2;
  51.  
  52. Vamos então discutir os detalhes desse código, e do python em geral:
  53.  
  54. (1) Como o tipo pode variar em tempo de execução? -> Tipagem dinâmica.
  55. Se voce tentar usar uma variável com o tipo dinâmico incompátivel da erro em tempo de execução e não compilação.
  56.  
  57. (2) Para se testar o tipo de a em tempo de execução use type(a), no exemplo acima é retornado str.
  58. Ou seja voce pode perguntar o tipo em tempo de execução. É uma característica reflexiva de linguagens dinâmicas.
  59.  
  60. (3) Blocos em python são definidos pela identação. Assim se eu digitasse else com dois espaços a mais antes dele, daria erro.
  61.  
  62. (4) Em python pode-se "compilar e executar" uma string em tempo de execução.
  63. Ou seja dada uma string com código em python voce pode usar o comando "exec" para executa-la.
  64.  
  65. Exemplo disso:
  66. a = 1
  67. exec "a = a + 1" # O comando exec é responsável pela execução da string.
  68.  
  69. E com isso voce tem que a = 2 ao fim dessa execuçào.
  70. Ou seja voce consegue interpretar uma string como parte do código, e até mesmo acessar variáveis locais, com ela!
  71. (isso nem C faz dessa forma)
  72.  
  73. As características 1, 2 e 4 são muito importantes lembre bem delas, pois elas definem linguagens dinâmicas.
  74.  
  75. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  76.  
  77. Notas de python:
  78.  
  79. Python é uma linguagem normalmente interpretada, mas pode também ser usada de forma compilada.
  80. Existe também uma máquina virtual para python.
  81.  
  82. O formato dos arquivos fonte de python são da forma: arquivo.py
  83.  
  84. Python pode ser usado como uma linguagem script tipo bash.
  85.  
  86. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  87.  
  88. Nota um pouco solta:
  89.  
  90. O que é uma linguagem de tipo script?
  91.  
  92. CONCEITO:
  93. Linguagens de tipo Script
  94. São linguagens que gerenciam a ordem de chamada de outros programas, como um script de teatro.
  95.  
  96. Uma linguagem puramente script é o bash que é o script usado pelo linux.
  97. E praticamente todo sistema operacional que se preze tem uma linguagem desse tipo associado, para
  98. que o gerenciamento dos programa possa ser feito de forma mais fácil.
  99.  
  100. Tipos primitivos em Python:
  101. inteiros, strings, reais, boleanos. (mas assim como na linguagem C, um booleano = 0 é um false, e um !=0 é um true)
  102.  
  103. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  104.  
  105. Existem operações sobre bits em python também, assim como em C:
  106. 40 >> 2
  107. Que shift é esse? O lógico ou o aritimético?
  108. (ele não terminou de falar, mas acho que é o aritimético que preserva o sinal do número) ( faça um teste se estiver com vontade :P )
  109.  
  110. Não existe o operador "i++" em Phyton.
  111.  
  112. Em Phyton pode-se escrever booleans resumidos: "2 <= 3 <= 4" e isso retornaria verdadeiro (poucas linguagens permitem isso).
  113. enquanto fazer "2 <= 3 == 4" retornaria falso.
  114. Ou seja, é um jeito mais economico para escrever expressões booleanas mais compridas.
  115.  
  116. Assim como em C pode-se fazer: x = y = z = 0;
  117. Significando x=0; y=0; z=0;
  118.  
  119. Em python existem tipos compostos, como (x,y,z) sendo uma tupla.
  120.  
  121. Existem listas em python na forma:
  122. a = ['a', 'b', 'c']
  123. Uma lista pode ser usada como arranjo, diferentemente de SML.
  124. a[0] == 'a', isso retorna true.
  125.  
  126. Existem umas notações interessantes em listas, seja a lista:
  127. a = [0,1,2,3,4,5];
  128.  
  129. a[2:5] retorna [2,3,4] (pode pensar que ele rodou um for de (i=2; i<5; i++) e foi coletando os elementos da lista)
  130. a[:3] retorna [0,1,2]
  131. a[3:] retorna [3,4,5]
  132. a[3:] + ['bacon', 4] retonaria:
  133. [3,4,5, 'bacon', 4]
  134.  
  135. Eu posso fazer uma atribuição usando essas notações:
  136. a[1:3] = ['a', 'b', 'c'] insere sobre as posições 1, 2 a lista [a, b, c] retornando: [0,'a','b','c',3,4,5] (repare que 1 e 2 foram deletados da lista)
  137. a[0:2] = [] apaga as duas primeiras posições da lista.
  138. a função duplist0([1,2,3]) retorna [1,2,3,1,2,3]
  139.  
  140. Como já falei antes tuplas são da forma:
  141. t = 1,2,3
  142. E podem ser acessadas como arranjos também.
  143.  
  144. o professor disse que uma tupla com um único elemento seria da forma u = (2,)
  145. não sei porque não poderia ser (2)
  146.  
  147. Uma coisa interessante:
  148. Dicionários:
  149. u = ['abc': 2344, 'efg' : 51551]
  150. Assim se eu acessar u['abc'] eu terei como retorno 2344.
  151. Em outras palavras isso é uma tabela hash.
  152.  
  153. Veja uma função:
  154.  
  155. def fact(n):
  156. if n>1:
  157. return n * fact(n-1)
  158. elif n == 1 or n==0: # else if
  159. return 1
  160. else:
  161. raise ArithmeticError("Numero negativo!") // lançando uma exceção
  162.  
  163. Em phyton não importa muito o quão grande é o inteiro, ele deve ser capaz de armazena-lo em memória.
  164. Ex:
  165. fact(1) retorna um tipo inteiro mas.
  166. fact(999) apesar de não da erro de estouro de memória, é retornado um "long" (mas na verdade esse long teria mais de 64 bits para caber tudo)
  167. Posso até imprimir isso na tela, da um número imenso.
  168. Porém se eu chamar fact(1000) da erro, porque?
  169. É porque existe um número máximo de chamadas recursivas e esse número é 999.
  170. Para que eu pudesse calcular o fact(1000) eu precisaria de uma abordagem iterativa.
  171.  
  172. Veja uma implementação iterativa:
  173.  
  174. def factW(n):
  175. ans = 1
  176. while n > 1:
  177. ans *= n
  178. n-=1
  179. return ans
  180.  
  181. Note que se eu mudasse apenas um detalhe, isso podia dar erro:
  182.  
  183. def factW(n):
  184. ans = 1
  185. while n > 1:
  186. ans *= n
  187. n-=1
  188. return ans
  189.  
  190. O motivo do erro caso ainda não tenha percebido é que o bloco do while é definido pela identação.
  191. Mudar isso faria a atribuição n-=1 ficar fora do while, e o programa entraria em loop infinito.
  192.  
  193. def sum(a, b): return a + b
  194. f = sum
  195. Nesse caso f é uma função que é retornada por sum, assim como em sml.
  196. // Em outras palavras existem funções de alta ordem em python!.
  197.  
  198. O professor chamou isso de "funções também serem de primeira classe".
  199. Ou seja também são objetos que podem ser retornados e recebidos como parâmetros.
  200. Também se pode fazer closures:
  201. def make_inc(n):
  202. def inc(x):
  203. return x + n
  204. return inc
  205.  
  206. Assim make_inc(2) retorna um closure com o n definido na tabela de simbolos da função inc.
  207. // (para quem não lembra um closure é a função juntamente com uma tabela com os valores das variáveis)
  208.  
  209. Outra forma de se declarar isso:
  210. def make_inc2(n):
  211. return lambda x : x + n
  212. # assim como o fn em SML.
  213.  
  214. Veja um outro modo de se declarar uma função:
  215.  
  216. f = lambda x: lambda y: x+y
  217. a = f(3)
  218. a(4)
  219. e por fim isso retorna 7 (ou seja a soma de 3+4).
  220.  
  221. Também posso chamar f na forma:
  222. f(3)(4) que também retornaria 7.
  223.  
  224. Uma expressão interessante em python:
  225.  
  226. a = [1,2,3,4]
  227. b = [3*x for x in a]
  228. Assim b retornaria:
  229. b = [3, 6, 9, 12]
  230. ou seja multiplicou tudo em a por 3.
  231. Isso é chamado de expressões currificadas eu acho.
  232. // Sugiro que testem isso, pois me pareceu muito vago com poucos exemplos.
  233.  
  234. Veja uma função filtro:
  235. def filterC(c,1):
  236. return [s for s in l if c(s)]
  237.  
  238. Assim:
  239. filterC(lambda x: x > 1, [1,2,3,4])
  240.  
  241. retornaria: [2,3,4]
  242.  
  243. Veja alguma funções built in:
  244.  
  245. map(lambda n: n * n * n, range (1,4))
  246. Isso retorna:
  247. [1,8, 27]
  248.  
  249. Ou seja range(1,4) retorna um arranjo com [1,2,3]
  250. E map aplica a função lambda n: n³ para cada elemento.
  251.  
  252. sum ([1,2,3,4]) retorna 10.
  253.  
  254. Em python existe um "atomo" que é chamado de None.
  255.  
  256. a = None
  257.  
  258. É o único valor que não tem tipo. É o equivalente ao void do C e C++ imagino.
  259.  
  260. Toda função que não retorna nada, de fato retorna "None".
  261.  
  262. // Comentários pessoais: Em python uma função pode retornar qualquer coisa, em tempo de execução, string ou inteiro não é preciso um tipo de retorno estático.
  263.  
  264. Em python eu posso fazer isso:
  265. if type(a) == type(None): ...
  266. Ou seja esse é uma "meta-operação" que existe em python mas não existe em C por exemplo.
  267.  
  268. // fim da aula.
Advertisement
Add Comment
Please, Sign In to add comment