py_introducao_vetores.html 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. <!--
  2. Introdução à Programação - 2017 - Prof. Leoônidas de Oliveira Brandão
  3. Introdução aos vetores em Python
  4. @url: ./codigos/varias_entradas_saidas.py
  5. LInE (Laboratory of Informatics in Education) - http://www.usp.br/line
  6. IME - USP
  7. Material didático
  8. Pode usar livrevemente este material para fins não comerciais, devendo sempre fazer referência à autoria.
  9. Sugestões/apontamento são bem vindos: leo@ime.usp.br (favor indicar no assunto "material de introducao 'a programacao")
  10. Prof. Leônidas de Oliveira Brandão
  11. http://www.ime.usp.br/~leo
  12. http://line.ime.usp.br
  13. http://www.matemtica.br
  14. -->
  15. <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
  16. <meta name='keywords' content='mac0122, material, professores, leonidas de oliveira brandao'>
  17. <link rel='stylesheet' type='text/css' href='css_img_js_conf/all.css'>
  18. <link rel='stylesheet' type='text/css' href='css_img_js_conf/line_introducao_programacao.css'>
  19. <script src="css_img_js_conf/defineLInE.js"></script> <!-- para referencias 'a documentos internos -->
  20. <div class="pagina">
  21. <!--
  22. <center><p>[
  23. <a href="#" title=""></a> &nbsp; | &nbsp;
  24. <a href="#memoria" title=""></a> &nbsp; &nbsp;
  25. ]</p>
  26. </center>
  27. -->
  28. <p class="secao">Introdução aos vetores em <i>Python</i></p>
  29. <p>
  30. Como estudado no
  31. <a href="#" onclick="trocaPagina('introducao_vetores.html')" title="introducao_vetores.html">texto a respeito do conceito de vetores</a>,
  32. um vetor é uma sequência de dados ocupando posições consecutivas de memória e por isso existe uma ordem
  33. natural (o primeiro elemento, o segundo e assim por diante).
  34. A grande vantagem de usar vetor é poder trabalhar com um grande número de variáveis utilizando um único
  35. nome (para a variável). Para isso existe uma sintaxe especial para pegar elementos do vetor em posições
  36. específicas (como o primeiro elemento ou o décimo elemento).
  37. </p>
  38. <p>
  39. A linguagem <i>Python</i> encapsula bastante o conceito de vetor, agregando funcionalidades e por isso
  40. geralmente o material didático sobre <i>vetores</i> em <i>Python</i> utiliza o nome <i>lista</i>.
  41. </p>
  42. <bloco1>Neste texto:
  43. <a class="" title="como ler varios dados entradas com unico ENTER" href="#entradas_saidas">entradas e saídas</a>;
  44. <a class="" title="definir e imprimir um vetor" href="#define">definir/imprimir vetor</a>;
  45. <a class="" title="definir e imprimir string" href="#string">definir "string"</a>;
  46. <a class="" title="sobre referencia e copia de vetores" href="#referencia">referência a listas</a>;
  47. <a class="" title="definir e imprimir uma matriz" href="#matriz">definir/imprimir matriz</a>.
  48. </bloco1>
  49. <br/>
  50. <!-- secao -->
  51. <a name="entradas_saidas">
  52. <p class="secao">1. Como ler vários dados de uma só vez</p>
  53. </a>
  54. <p>
  55. Em <i>Python</i> entrar vários dados de uma só vez não é tão trivial, é preciso processamento para recuperar os valores,
  56. para isso é preciso ler a entrada toda como uma <i>cadeia de caracteres</i> (<i>string</i>).
  57. Mais ainda, no <i>Python 2</i> existe uma função especial para isso, a <tt>raw_input</tt>, que no <i>Python 3</i> sumiu!
  58. </p>
  59. <p>
  60. O truque básico é ler como <i>string</i>, quebrar em itens (usando os separadores, geralmente espaço em branco) e por fim
  61. converter para o tipo desejado.
  62. Por exemplo, para ler dois valores, o primeiro sendo inteiro e o seguindo flutuante, podemos fazer:
  63. <br/>
  64. <center>
  65. <i>Tab. 1. Exemplos de técnicas para ler vários dados com um único <i>ENTER</i> em <i>Python</i>.</i>
  66. <table style="border: 1px solid black;">
  67. <tr style="border: 1px solid black;"><td><i>Python 2</i></td> <td>&nbsp;&nbsp;</td> <td><i>Python 3</i></td></tr>
  68. <tr>
  69. <td><tt style="font-size: 0.8em;">linha = raw_input();<br/>
  70. itens = linha.split();<br/>
  71. n, val = int(itens[0]), float(itens[1]);<br/>
  72. <verm>print</verm>("n=%d, val=%f" % (n,val));</td><td>&nbsp;</td>
  73. <td><tt style="font-size: 0.8em;">linha = input();<br/>
  74. itens = linha.split();<br/>
  75. n, val = int(itens[0]), float(itens[1]);<br/>
  76. <verm>print</verm>("n=%d, val=%f" % (n,val));</td></tr>
  77. </table></center>
  78. </p>
  79. <p>
  80. Note que usamos um formatador especial <tt>%d</tt> para valores inteiros e <tt>%f</tt> para ponto flutuante.
  81. </p>
  82. <p>
  83. No exemplo acima precisamos converter o primeiro item para inteiro e o segundo para <i>flutuante</i>.
  84. Entretanto se todos itens forem de mesmo tipo, existe uma função que realiza automática o laço percorrendo
  85. todos os elementos e convertendo um a uma, é o mapeamento <tt>map</tt>, como ilustrado abaixo.
  86. Experimente o código com um única linha de entrada de dados: <tt>0.0 1.0 1.5 2.0 3.0 3.5 &lt;ENTER&gt;</tt>.
  87. <br/>
  88. <center>
  89. <i>Tab. 2. Exemplos de técnicas para ler vários dados "reais" com um único <i>ENTER</i> em <i>Python</i>.</i>
  90. <table style="border: 1px solid black;">
  91. <tr style="border: 1px solid black;"><td><i>Python 2</i></td> <td>&nbsp;&nbsp;</td> <td><i>Python 3</i></td></tr>
  92. <tr>
  93. <td><tt style="font-size: 0.8em;">linha = raw_input();<br/>
  94. itens = linha.split();<br/>
  95. vetor = map(float, itens); <cyan># Erro se tentar: map(int, itens)</cyan><br/>
  96. tam = len(vetor);<br/>
  97. for i in range(tam) :<br/>
  98. &nbsp;&nbsp;<verm>print</verm>("%2d | %4.1f" % (i,vetor[i]));</td><td>&nbsp;</td>
  99. <td><tt style="font-size: 0.8em;">linha = input();
  100. itens = linha.split();<br/>
  101. vetor = map(float, itens); <cyan># Erro se tentar: map(int, itens)</cyan><br/>
  102. tam = len(vetor);<br/>
  103. for i in range(tam) :<br/>
  104. &nbsp;&nbsp;<verm>print</verm>("%2d | %4.1f" % (i,vetor[i]));</td></tr>
  105. </table></center>
  106. </p>
  107. <p>
  108. Note que os formatadores <tt>%d</tt> e <tt>%f</tt> foram usado com parâmetros, <tt>%2d</tt> e <tt>%4.1f</tt>.
  109. O primeiro indica que devemos ajutar 2 posições à direita e o segundo ajustar 4 posições à direito e usar apenas 1 casa
  110. decimal. Estes formatadores permitem saídas mais interessantes, em particular a construção de tabelas.
  111. </p>
  112. <p>
  113. Pegue <a href="codigos/varias_entradas_saidas.py" title="um exemplo para testar">este código</a>
  114. exemplo e "brinque" com ele, altere os formatadores, troque "float" por "int", veja a mensagem de erro, acerte-a.
  115. Teste até estar seguro de ter entendido o <tt>raw_input</tt>, o <tt>split</tt>, o <tt>map</tt> e os formatadores
  116. <tt>%d</tt> e <tt>%f</tt>.
  117. </p>
  118. <!-- secao -->
  119. <a name="define">
  120. <p class="secao">2. Defininido e imprimindo uma lista</p>
  121. </a>
  122. <p>
  123. Pode-se construir uma lista em <i>Python</i> fornecendo todos seus elementos, como em:
  124. <tt>vet = [21, 22, 23, 24];</tt> (o finalizador <tt>;</tt> só é obrigatório se tiver mais de um comando na mesma linha).
  125. </p>
  126. <p>
  127. Pode-se também construtir uma lista em <i>Python</i> de modo interativo, agragando novo elemento a cada passo
  128. usando a função comando <tt>append(.)</tt>, como em:
  129. <tt>vet.append(10+i);</tt>, que anexa o elemento de valor <tt>10+i</tt> à lista.
  130. </p>
  131. <p>
  132. No exemplo a seguir construimos uma lista com <i>n</i> (usando o valor fixo <i>10</i> no código) elementos,
  133. iniciando no <i>10+i</i> e seguindo até o <i>10+n-1</i>.
  134. Nesse exemplo ilustramos o uso de iterador (<i>in</i>) e o anexador de novo elemento em lista (<i>append</i>).
  135. </p>
  136. <div class="exemplo"><i>Exemplo 1</i>. Construir uma lista e imprimir seus elementos.
  137. </div><!-- class="exemplo" -->
  138. <div class="codigo">
  139. <pre># Python2 para 'print' sem pular linha : <verm>print</verm>("*" , end = "");
  140. from __future__ import print_function
  141. n = 10;
  142. # Definir vetor/lista com: (10,11,12,13,...10+n-1)
  143. vet = []; <cyan># define um vetor vazio</cyan>
  144. for i in range(0, n, 1) : <cyan># ou mais simples neste caso "for i in range(n)"</cyan>
  145. vet.append(10+i); <cyan># anexe mais um elemento `a lista</cyan>
  146. <cyan># Imprime o vetor/lista de uma so' vez (na mesma linha)</cyan>
  147. <verm>print</verm>("\nO vetor: ", end=""); <cyan># informe o que vira impresso a seguir (na mesma linha devido ao parametro end=""</cyan>
  148. <verm>print</verm>(vet);
  149. # Imprimir vet em linha unica na forma "( 0, 0) ( 1, 1)..."
  150. <verm>print</verm>("\nNovamente o vetor impresso de 2 modos: "); <cyan># informe o que vira impresso a seguir (e "quebre" a linha)</cyan>
  151. i = 0;
  152. for item in vet : <cyan># "item in vet" e' um iterador, item comeca em vet[0], depois vet[1] e assim por diante</cyan>
  153. <verm>print</verm>("(%2d, %2d) " % (item, vet[i]), end="");
  154. i += 1;
  155. <verm>print</verm>(); <cyan># quebre a linha</cyan></pre>
  156. </div><!-- class="codigo" -->
  157. <!-- secao -->
  158. <a name="string">
  159. <p class="secao">3. Defininido uma <i>cadeia de caracteres</i> ("string")</p>
  160. </a>
  161. <p>
  162. Em <i>Python</i> é possível definir um vetor com caracteres, formando uma palavra, ou seja, uma <i>cadeia de caracteres</i>,
  163. que abreviadamente é denominada "<i>string</i>".
  164. Para isso pode-se fazer uma atribuição como constante ou ler os dados como palavra. Isso é ilustrado no exemplo abaixo.
  165. </p>
  166. <div class="exemplo"><i>Exemplo 2</i>. Trabalhando com "strings". Uma "string" fixa e digitar uma frase, imprimindo o número
  167. de caracteres nela.
  168. </div><!-- class="exemplo" -->
  169. <div class="codigo">
  170. <pre># Definir "string"
  171. string = "0123456789abcdefghih"; <cyan># (1)</cyan>
  172. # Imprimir cada caractere da string com seu codigo ASCII
  173. <verm>print</verm>("\nImprime caracteres e seus codigos ASCII na forma de tabela\nColuna 1 => caractere; coluna 2 => seu codigo ASCII");
  174. for char in string : <cyan># iterador</cyan>
  175. <verm>print</verm>("%20c : %3d" % (char, ord(char))); <cyan># funcao ord(.) devolve codigo ASCII do caractere parametro</cyan>
  176. <verm>print</verm>(); <cyan># quebre a linha</cyan>
  177. # Agora um entrada de dados via teclado e pegando uma frase como "string" (o ENTER finaliza a frase)
  178. <verm>print</verm>("Digite uma frase e tecle ENTER/CR");
  179. string = raw_input(); <cyan># no Python 2 e' obrigatorio usar a funcao 'raw_input' (que tambem funciona no 3)</cyan>
  180. <verm>print</verm>("Foi digitada uma frase com %d caracteres: %s" % (len(string), string));
  181. # Observacao: se definiu um vetor como "string" como em (1) acima, NAO e' possivel alterar a "string", por exemplo,
  182. # o comando abaixo resulta erro "TypeError: 'str' object does not support item assignment"
  183. # string[2] = '*'; <cyan># isso resultaria erro! experimente</cyan></pre>
  184. </div><!-- class="codigo" -->
  185. <!-- secao -->
  186. <a name="referencia">
  187. <p class="secao">4. Sobre copiar ou referenciar um vetor/lista</p>
  188. </a>
  189. <p>
  190. Ao declarar uma <i>lista/tupla</i>, significa que associamos um nome de variável à uma sequência de posições de memória,
  191. sendo que cada item pode ter um tamanho distinto dos demais,
  192. como em <tt>l = [1,[2],"tres"];</tt>.
  193. Uma diferença essencial entre <i>lista</i> (como <tt>l = [1,2,3];</tt>) e <i>tupla</i> (como <tt>l = (1,2,3);</tt>)
  194. é que uma <i>lista</i> é <i>mutável</i> (<i>que pode ser altedo</i>) e
  195. <i>tupla</i> é <i>imutável</i> (impossível de alterar algum elemento).
  196. <center>
  197. <img src="img/int_vet_apontador_menor.png" title="representacao de vetor em memoria com indicacao de endereco ocupado"/>
  198. </center>
  199. </p>
  200. <p>
  201. Por exemplo, ao declarar a <i>tupla</i> com <tt>v = (1,2,3);</tt>, além do espaćo com informaćões sobre a <i>tupla</i>, são
  202. reservadas 3 posições de memória, uma para cada elemento da <i>tupla</i>.
  203. Deve-se destacar que usar um comando do tipo <tt>aux = v;</tt>, seja <i>v</i> uma lista ou uma <i>tupla</i>,
  204. <i>não implica em copiar</i> <i>v</i>, mas sim ter uma nova referência para <i>v</i>.
  205. Assim, no caso de <i>lista</i>, que portanto pode ser alterada, ao usar os comandos<br/>
  206. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<tt>v = [1,2,3]; aux = v; aux[2] = -1; <verm>print</verm>(v);</tt><br/>
  207. será impresso na tela: <tt>[1, 2, -1]</tt>, ou seja, o elemento da posićão 2 de <i>v</i> foi alterado para <i>-1</i>.
  208. </p>
  209. <p>
  210. Mas existe uma funćão em uma biblioteca <i>Python</i> que copia listas genéricas (<tt>copy</tt>).
  211. No exemplo a seguir ilustramos como fazer copia de <i>listas</i> ou <i>tuplas</i>.
  212. </p>
  213. <div class="exemplo"><i>Exemplo 3</i>. Construindo um vetor e imprimindo seus elementos via um apontador.
  214. </div><!-- class="exemplo" -->
  215. <div class="codigo">
  216. <pre>import copy <cyan># para funcao 'copy(.)'</cyan>
  217. <verm>def</verm> copiar (lst_tpl) : <cyan># funcao para copiar elementos de lista/tupla gerando lista nova</cyan>
  218. lista = [];
  219. for item in lst_tpl : lista.append(item);
  220. return lista;
  221. lista = [1,2,[3]]; <cyan># define lista com 3 elementos, sendo o terceiro uma lista com 1 elemento</cyan>
  222. aux = lista;
  223. aux[2] = -1; <cyan># alterou lista[2]</cyan>
  224. <verm>print</verm>("Lista: lista = %s" % lista);
  225. lista = [1,2,[3]]; <cyan># lista</cyan>
  226. <verm>print</verm>("Lista: lista = %s" % lista);
  227. aux1 = copy.copy(lista); <cyan># copiar com funcao "copy(.)" de biblioteca "copy"</cyan>
  228. aux2 = list(lista); <cyan># copiar com gerar de lista "list(.)"</cyan>
  229. aux3 = copiar(lista); <cyan># copiar com funcao local "copiar(.)"</cyan>
  230. aux1[2] = -1; <cyan># NAO alterou lista[2]</cyan>
  231. aux2[2] = -1; <cyan># NAO alterou lista[2]</cyan>
  232. aux3[2] = -1; <cyan># NAO alterou lista[2]</cyan>
  233. <verm>print</verm>("aux1=%s, lista=%s" % (aux1, lista));
  234. <verm>print</verm>("aux2=%s, lista=%s" % (aux2, lista));
  235. <verm>print</verm>("aux3=%s, lista=%s" % (aux3, lista));
  236. tupla = [1,2,[3]]; <cyan># tupla</cyan>
  237. <verm>print</verm>("Tupla: tupla = %s" % tupla);
  238. aux1 = copy.copy(tupla); <cyan># usar funcao 'copy' de biblioteca 'copy'</cyan>
  239. aux2 = list(tupla);
  240. aux3 = copiar(tupla);
  241. <verm>print</verm>("aux1=%s, tupla=%s" % (aux1, tupla));
  242. <verm>print</verm>("aux2=%s, tupla=%s" % (aux2, tupla));
  243. <verm>print</verm>("aux3=%s, tupla=%s" % (aux3, tupla));</pre>
  244. </div><!-- class="codigo" -->
  245. <p>
  246. Experimente! Esse código produz como saída as seguintes linhas:
  247. <div class="exemplo"><i>Saídas do exemplo 3</i>.
  248. </div><!-- class="exemplo" -->
  249. <div class="codigo">
  250. <pre>Lista: lista = [1, 2, -1]
  251. Lista: lista = [1, 2, [3]]
  252. aux1=[1, 2, -1], lista=[1, 2, [3]]
  253. aux2=[1, 2, -1], lista=[1, 2, [3]]
  254. aux3=[1, 2, -1], lista=[1, 2, [3]]
  255. Tupla: tupla = [1, 2, [3]]
  256. aux1=[1, 2, [3]], tupla=[1, 2, [3]]
  257. aux2=[1, 2, [3]], tupla=[1, 2, [3]]
  258. aux3=[1, 2, [3]], tupla=[1, 2, [3]]</pre>
  259. </div><!-- class="codigo" -->
  260. </p>
  261. <!-- secao -->
  262. <a name="matriz">
  263. <p class="secao">5. Defininido matriz como lista de lista</p>
  264. </a>
  265. <p>
  266. Uma vez que um vetor/lista é armazenado consecutivamente na memória, então podemos armazenar
  267. vários vetores também consecutivamente para obter algo que represente (e seja tratado como) <i>matriz</i>.
  268. Como na imagem abaixo, em que cada alocamos <i>nl</i> vetores consecutivos na memória,
  269. cada vetor com <i>nc</i> posições de memória, desde <tt>vet[0]</tt> até <tt>vet[nc-1]</tt>.
  270. Assim, podemos ver este agregado de dados como uma matriz <tt>mat[][]</tt>, cuja primeira linha é
  271. o primeiro vetor e assim por diante. Isso está ilustrado na imagem abaixo.
  272. <center>
  273. <img src="img/int_vet_vet_representacao.png" title="representacao matriz e como fica em memoria como vetor de vetor"/>
  274. </center>
  275. </p>
  276. <p>
  277. Desse modo obtemos uma estrutura com dois índices que pode ser manipulada como uma matriz (como em <i>mat[i][j]</i>).
  278. No exemplo abaixo ilustramos isso de dois modos, imprimindo as linhas da matriz
  279. e mostrando que pode-se passar como parâmetro uma linha de matriz para uma função que
  280. tenha como <i>parâmetro formal</i> um vetor.
  281. </p>
  282. <div class="exemplo"><i>Exemplo 3</i>. Construindo matriz como vetor de vetor e ilustrando que cada linha dela
  283. é um vetor, podendo portanto ser usado para chamar uma função que tem como parâmetro um vetor.
  284. </div><!-- class="exemplo" -->
  285. <div class="codigo">
  286. <pre><cyan># Vetor de vetor ou matriz</cyan>
  287. # Definir vetor/lista com: (0,1,2,3,...n-1)
  288. nl = 3; nc = 4;
  289. mat = []; <cyan># define um vetor vazio</cyan>
  290. for i in range(0, nl, 1) : <cyan># ou mais simples neste caso "for i in range(n)"</cyan>
  291. linha = []; <cyan># define um vetor vazio</cyan>
  292. for j in range(0, nc, 1) : <cyan># ou mais simples neste caso "for i in range(n)"</cyan>
  293. linha.append(i*n+j);
  294. mat.append(linha); <cyan># anexe nova linha `a matriz 'mat'</cyan>
  295. # Imprime o vetor/lista de uma so' vez (na mesma linha)
  296. <verm>print</verm>("\nA matriz: ", end=""); <cyan># informe o que vira impresso a seguir (na mesma linha devido ao parametro end=""</cyan>
  297. <verm>print</verm>(mat);
  298. # Pegando o primeiro e segundo elemento da terceira linha de mat: mat[2][1]
  299. prim = mat[2][0]; seg = mat[2][1]; <cyan># pegar primeiro e segundo elemento da linha mat[2]</cyan>
  300. <verm>print</verm>("O primeiro e segundo elemento da terceira linha da matriz: %d e %d" % (prim, seg));
  301. <verm>print</verm>("Linhas da matriz: 0=%s ; 1=%s ; 2=%s" % (mat[0], mat[1], mat[2])); <cyan># cada linha e' um vetor!</cyan>
  302. # <verm>print</verm>(mat[0]); <verm>print</verm>(mat[1]); <verm>print</verm>(mat[2]);
  303. # Verifique que cada linha da matriz e' de fato um vetor
  304. # Usar a funcao 'somalinha(...)' que soma elementos em vetor
  305. for i in range(0, nl) :
  306. <verm>print</verm>("Soma da linha %2d = %3d" % (i, somalinha(mat[i])));</pre>
  307. </div><!-- class="codigo" -->
  308. <!-- secao -->
  309. <a name="cuidados">
  310. <p class="secao">6. Cuidados com referencias (ou apelidos)</p>
  311. </a>
  312. <p>
  313. Vocês devem tomar muito cuidado com atribuições envolvendo listas, pois na verdade <b style="color:#aa0000;">não</b> ocorre uma cópia,
  314. mas comentado na seção 4. Por exemplo, estude e teste em seu computador a sequência de comandos a seguir.
  315. <div class="codigo"><pre>>>> a = [1, 2, 3];
  316. >>> b = a;
  317. >>> b[2] = -9;
  318. >>> print(a)
  319. [1, 2, -9]</pre>
  320. <i>Cód. 1. Exemplo de uso de atribuição com listas, equivalente a referência, não cópia.
  321. </div>
  322. </p>
  323. <p>
  324. Entretanto o <i>Python</i> oferece um mecanismo que efetivamente realiza uma cópia de cada um dos elementos, portanto
  325. envolve um <i>laço</i> de tamanho igual ao número de elementos da lista.
  326. Isso é feito usando algo como <tt>[inicio:fim]</tt>, sendo <i>inicio</i> a posição iniciar a partir da qual deseja copiar e
  327. <i>fim</i> o último elemento.
  328. <br/>Atenção ao <i>fim</i>, não é posição, mas sim número do elemento, então se <i>fim=3</i>, irá copia
  329. até o terceiro elemento. Por exemplo, algo como <tt>b = a[4:3];</tt> resultaria em lista vazia, pois o terceiro elemento está antes
  330. do elemento da posição <i>4</i>.
  331. <div class="codigo"><pre>>>> a = [0, "um", 2, 3, 4, 5, 6, 7, 8];
  332. >>> v1 = a[4:3]; v2 = a[0:3]; print(v1, v2);
  333. ([], [0, 'um', 2])</pre>
  334. <i>Cód. 2. Exemplo truque para cópiar vários elementos.
  335. </div>
  336. </p>
  337. <p class="autoria">
  338. <a href="https://www.ime.usp.br/~leo" target="_blank" title="seguir para a pagina do prof. Leônidas">Leônidas de Oliveira Brandão</a><br/>
  339. <a href="http://www.ime.usp.br/~leo" target="_blank" title="seguir para a página do LInE">http://line.ime.usp.br</a>
  340. </p>
  341. <p class="rodape">
  342. <b>Alterações</b>:<br/>
  343. 2020/08/12: novo formato, pequenas revisões<br/>
  344. sexta, 08 May 2020, 21:00<br/>
  345. segunda, 03 May 2018, 16:00
  346. </p>
  347. </div>