Agora que vocês já estão craques listas, já fizeram vários exercícios, já praticaram manipulação de listas, vamos aprender uma outra estrutura de dados mais sofisticada. As listas, elas armazenam uma coleção de valores, uma coleção linear, sequencial. Mas, muitos casos nós precisamos pouco mais de estruturação nesses valores que a gente armazena. Vamos pensar por exemplo que você quer fazer programinha para calcular as notas dos alunos de uma classe. E na classe você tem 70 alunos e tem cinco notas ao longo do semestre, então, na verdade você vai precisar de uma tabela, por exemplo, com 70 linhas, uma para cada aluno e cinco colunas. Matematicamente, a abstração que a gente usa para esse tipo de coisas é a matriz. Então, o que a gente vai faze agora são as matrizes. Todas as linguagens de programação têm alguma forma de representar matrizes e a gente vai ver como a gente lida com matrizes Python da maneira mais simples. E a gente vai ver que matrizes Python, na verdade elas são listas de listas. A gente pode pensar que a matriz tem linhas, então, vai ser uma lista de linhas onde cada linha tem colunas, então, vai ser uma lista de elementos que são as colunas daquela linha. Então, dessa forma a gente podia ter uma matriz de 70 linhas que, seria uma lista de 70 linhas e, cada linha cinco números ponto flutuante para representar as notas dos alunos. Outro exemplo de uso de matrizes. Vamos supor que você quer fazer a tabela do campeonato brasileiro, daí são 20 times e para cada time você tem que saber o número de jogos, empates, derrotas e vitórias, pontos ganhos, saldos de gols e então, você precisaria de 20 linhas, uma matriz de 20 linhas, uma para cada time, e uma coluna número inteiro nesse caso, para cada item, número de jogos, número de vitórias e derrotas, empates e assim por diante. Último exemplo, tabuleiro de xadrez para representar jogo de xadrez, você precisaria de uma matriz oito por oito, onde cada elemento dessa matriz seria uma uma posição no seu tabuleiro de xadrez, daí você pode guardar lá, por exemplo, string com o nome da peça, ou número inteiro para representar, preciso de uma codificação para cada tipo de peça ou número inteiro correspondente. Mas daí você armazenaria numa matriz de oito por oito, uma configuração do tabuleiro num jogo de xadrez. Então, na verdade, o que nós vamos ter é uma estrutura de dados bidimensional com linhas e colunas. E a gente vai poder armazenar dados nessas linhas e colunas. Então, uma matriz A por exemplo, a gente poderia representar uma matriz A dessa forma aqui. dois três quatro cinco seis quando a gente desenha no papel tipicamente a gente desenha uma matriz dessa forma, assim como se fosse quadrado ou retângulo ali, essa é uma matriz de três linhas e três colunas e depois a gente gostaria de acessar os elementos dessa matriz, falar alguma coisa do tipo A [zero] [zero] seria o elemento que está na linha zero, coluna zero da matriz, que nesse caso é o número eu gostaria de poder falar alguma coisa também do tipo A, o que está na linha dois, coluna eu gostaria que você atribuísse lá o valor 99. Eu gostaria de atribuir fazer manipulação dos dados a três, dessa forma e podemos fazer isso Python. Vamos abrir aqui o Idle para ver como podemos fazer isso Python. Primeiro, como que eu defino uma matriz? Se eu já tenho os elementos dessa matriz inicialmente, eu posso usar essa notação aqui vai ser uma lista de listas, então, eu digo que o primeiro colchete para abrir a lista das linhas e daí par de colchetes para cada linha, para conter as colunas. Então, vai ter dois, três aí fecha o colchete, daí aqui vem a minha segunda linha, dois, três, quatro, cinco, seis, vou fazer uma matriz três por três então aqui a gente tem o sete, oito, nove. E daí fecha aqui completamente. Então, o A aqui, na verdade, ele está mostrando linearmente aqui, é uma lista de três linhas com três listas dentro, então cada uma dessas três listas representa uma das linhas da minha matriz. Vamos ver agora código para definir uma matriz mas de uma forma pouco mais dinâmica, onde supondo que não tenho ainda os elementos que vou guardar na matriz, então eu quero inicializar uma matriz grande, por exemplo, 50 por 50 com determinado valor inicial como zero, ou algum outro valor inicial para depois poder iniciar a manipular essa matriz. Vamos ver programa para fazer isso, eu tenho aqui o programa já pronto, que é este programa aqui, matriz. Como é que funciona isso aqui? Vamos dar uma olhada nesse cria matriz. É uma função: cria matriz, que ela recebe três parâmetros o número de linhas, o número de colunas, e o valor com o qual eu quero inicializar todas as células da matriz. Então, aqui esse pedacinho verde é comentário que está explicando o que essa função cria matriz faz, então, está dizendo que ela recebe como parâmetro, dois inteiros e determinado valor ali e daí ela devolve uma matriz que, na verdade, vai ser uma lista de listas, que retorna uma matriz com número de linhas e número de colunas que cada elemento é igual ao valor dado aqui nessa variável valor. Como é que funciona? Primeiro, inicialmente a gente cria aqui uma lista vazia para guardar as linhas da minha matriz. Esse sustenido lista vazia é simplesmente comentário, o sustenido é para indicar que aqui é comentário para explicar para ser humano o que é que esse comando faz, isso aqui é uma coisa que não é processada pelo interpretador Python. O interpretador Python, ele ignora tanto essas linhas vermelhas, que são os comentários, quanto esse pedaço verde que é o comentário inicial. Então começamos com uma lista vazia e daí a gente faz esse primeiro for in range num linhas, ele vai repetir num linhas vezes, então se você passa o número dez aqui como parâmetro para ser o num linhas, ele vai repetir esse for mais externo dez vezes, está começando do zero e indo até o nove. Quando começa no zero ele vai iniciando aqui, criando uma determinada linha. Aqui eu crio uma linha, vai ser uma outra lista, inicialmente vazia para essa nova linha e daí faço outro for para preencher os elementos das colunas para preencher os elementos das colunas dessa linha. Daí faço esse segundo for, for encaixado dentro do outro for a gente já viu isso, com uma outra variável, a variável J, então for J range número de colunas, então, o número de vezes que esse for mais interno vai executar é o número de colunas da minha matriz e daí, para cada vez que executa, acrescento append, acrescento ao final da linha valor, como vou executar esse num colunas vezes, ao final de executar esse segundo for aqui, a minha linha vai ter num colunas, elementos dentro dela, e todos os elementos vão ser esse valor que é passado como parâmetro, se passar o número zero, vai criar uma matriz inicialmente tudo com zero. E daí, terminei de que é essa linha, adiciono append dessa linha na minha matriz. Cada vez eu vou acrescentando uma nova linha da minha matriz e eu vou repetir isso num linhas vezes. Então o for mais externo repete num linhas vezes e o for mais interno num colunas vezes e eu terminei, eu devolvo a minha matriz. Vamos ver se eu executar isso aqui e crio uma matriz. Vou fazer cria matriz, recebe como parâmetro número de linhas e número de colunas e o valor, note que ele já está mostrando aqui o a documentação que eu criei ali, cria e retorna uma matriz, ele explica direitinho e já botou aqui. Vou fazer uma matriz de cinco linhas e oito colunas e eu quero que inicialize com o valor zero. E daí ele devolveu essa matriz, você vai poder ver aqui. 8 colunas. Então, 1, 2, 3, 4, 5, 6, 7, 8, essa primeira linha tem 8, daí aqui estão sequência as outras linhas da matriz. Exercício que vocês podem fazer, que eu vou deixar para vocês, é o seguinte: note que ele está mostrando as matrizes linearmente assim, que não é formato muito agradável para ser humano ler. A gente que está acostumado a ver matrizes nesse formato aqui, uma linha embaixo da outra. Então, a minha primeira lição para vocês aí é: escrevam método que recebe uma matriz como parâmetro e imprime essa matriz nesse formato bonitinho, uma linha embaixo da outra, vez de imprimir nesse formato aqui que esse interpretador aqui Python está mostrando. Vai ser jeito mais visualmente agradável de a gente visualizar as matrizes, então é exercício para vocês fazerem isso. Mas eu quero mostrar aqui outro exercício, eu quero modificar, o exercício é o seguinte: modificar esse código aqui do cria matriz de forma que, ao invés de ele inicializar a matriz com valor predefinido todas as posições, que ele vá lendo do teclado, ele dê oportunidade para o usuário que está sentado no computador digitar os elementos da matriz. Então como a gente poderia fazer isso? Vamos alterar isso aqui, vamos fazer conjunto aqui aos poucos. Então, primeiro eu vou gravar isso num arquivo com outro nome, eu vou fazer Save as, vez de chamar Matriz, eu vou chamar de LeMatriz, porque ele vai ler a matriz do teclado. Pronto, eu criei aqui arquivo chamado LeMatriz e agora a primeira coisa que eu preciso definir é o tamanho dessa matriz, quantas linhas e quantas colunas elas vão ter. Então vamos ler do teclado, pedir para o usuário digitar. Então eu vou fazer método aqui chamado le_matriz, que vai ler do teclado. Então, primeiro ele vai ler, o número de linhas vai ser igual, daí eu vou fazer int input. Então eu vou pedir para o usuário digitar, eu vou falar o seguinte: digite o número de linhas da matriz. Daí algo bem semelhante para as colunas, então eu vou trocar aqui. Aqui vai ser colunas, digite o número de colunas da matriz. Então, fazendo isso, eu já tenho a variável lin guardando linhas e col guardando colunas e daí sim, eu vou chamar o cria_matriz passando como parâmetro o lin e o col. [SEM_ÁUDIO] Agora, então vamos alterar agora o cria_matriz. A primeira coisa, eu não vou precisar mais desse valor aqui, porque eu vou ler do teclado os valores. Então, atualizar a documentação aqui para ficar certo. Então a documentação vai ser cria e retorna uma matriz com o número de linhas e o número de colunas, que cada elemento é igual ao valor dado, não, cada elemento é digitado pelo usuário. Então vamos ver aqui o que a gente precisa alterar. A matriz continua começando com uma matriz vazia, daí a gente vai acrescentando as linhas aos poucos, aqui eu crio cada linha, continuo aqui for in nesse range, aqui que muda, agora não tem mais essa variável valor, a gente vai ter que ler do teclado. Então eu vou colocar aqui comando: o meu valor recebe, vamos ver do teclado. Vamos supor que são números inteiros, então int input e agora eu vou falar o seguinte: Digite o elemento. E agora eu quero que apareça qual é o elemento, então 0 0 0 1 0 2, eu vou usar aquela notação dos colchetes, então digite o elemento, abre colchetes. Agora a gente precisa colocar o número da linha, então eu vou dar fecha aspas, eu vou precisar concatenar aqui nesse string o número da linha. O número da linha vai ser a variável i, só que a variável i é inteiro, eu preciso converter para string para poder concatenar aqui no string, então eu faço str de i. Pronto, o str de i vai pegar o valor, o número i e converter aquilo para string para poder concatenar. Daí tudo bem. Então agora eu preciso fechar os colchetes, primeiro colchete, fechar o colchete da linha e agora abrir o colchete da coluna. Eu vou fazer a mesma coisa, só que agora eu vou concatenar o valor de j convertido para string. Então string de j, pronto, mais e agora fechar o colchete da coluna. Acho que é só isso, vamos, a gente vai ver se vai dar certo. Então tem que fechar mais parêntese aqui do inteiro, pronto. Então, pronto. Agora eu li o valor do teclado, eu vou acrescentar esse valor aqui na linha, o resto eu acho que não precisa mudar nada. Vamos poder fazer teste aqui para ver se vai funcionar. Se tiver erro, a gente conserta. Vamos lá, vai salvar, ok to save, ok. Pronto, agora eu preciso chamar o método e como chama? le_matriz, a função le_matriz. le_matriz. Vamos ver o que acontece. Digite o número de linhas da matriz. Vamos supor que eu quero uma linha com, uma matriz com 3 linhas e 4 colunas. Digite o elemento 00. 1. Digite o elemento 01. 2. Estou digitando. Então parece que está funcionando. Então eu falei que cada linha vai ter 4 colunas, então a linha 0 já tem os 4 aqui, agora a gente tem que passar para a linha 1. Vamos ver se vai passar para a linha 1. Sim, passou para a linha 1, coluna 0. 1, 2, 3, 4, agora eu vou chutar uns números quaisquer aqui. Coluna 2, pronto. Opa! Vamos ver aqui o que aconteceu. Eu acho que eu digitei o 4 [INAUDÍVEL] aqui, ele não me mostrou a matriz. Eu vou fazer o seguinte: eu vou guardar essa matriz numa variável. Então, m recebe le_matriz. Quer dizer, m recebe le_matriz e daí 3, 4 e agora eu vou botar os vários elementos aqui, a matriz tem só 3 linhas. Então ela termina aqui. Pronto, esse aqui é o último elemento. Vamos ver se o m armazenou o valor. Não, tem algum erro, não está devolvendo a matriz. Vamos tentar descobrir o que tem de errado aqui com a nossa matriz. Descobrir o que tem errado nesse programa, porque você note que o cria_matriz, ele está devolvendo a matriz que eu criei. Mas ele devolve para quem? Ele devolve para quem o chamou, quem chamou foi a função le_matriz. O le_matriz chama aqui o cria_matriz, mas ele não está fazendo nada. Então essa matriz que está sendo devolvida, está sendo ignorada e perdida. Então na verdade a gente precisa ou guardar numa variável ou colocar aqui o return cria_matriz. Assim o le_matriz vai devolver essa matriz que foi devolvida aqui pelo cria_matriz. Então descobrimos o erro, então vamos executar novamente. Executando novamente, salva, eu vou de novo fazer eu vou chamar aqui o le_matriz e agora é uma matriz de 3 linhas e 4 colunas. Digitando os elementos. Atenção. Pronto, imprimiu, aqui está a nossa matriz 1, 2, 3, 4, 5, 6, 7, 8, os elementos que eu digitei, então parece que deu certo. Eu posso também armazenar isso aqui numa variável: le_matriz, agora fazer uma matriz de 5 por 3, 5 linhas e 3 colunas, então ela vai ter 15 elementos e ele não devolveu nada, porque, aqui não imprimiu nada aqui, porque eu guardei no m. Se eu botar o m aqui, pronto, o m tem ali todos os elementos que eu digitei, as suas 5 linhas e as 3 colunas. Então, certo? Então ficou aquela lição para vocês fazerem uma função que imprime a matriz, mas imprime num formato bonitinho, uma linha embaixo da outra. Então, por hoje é só. [MÚSICA] [MÚSICA] [MÚSICA]