Outros tipos de dados nativos
Só numeros e caracteres é insuficiente para representar nossos
algoritmos. O Python oferece outros (cinco) tipos de dados pré definidos
e extremamente poderosos para suportar programação em geral e que
veremos à seguir. Na verdade Python é uma linguagem orientada a objetos
e isto permite usuários definirem novos tipos de dados que acharem
convenientes, mas para nós os cinco tipos nativos provavelmente são
suficientes. Pelo menos no início.
Os tipos de dados nativos do Python que iremos usar bastante são:
- strings
- lists
- tuples
- sets
- dictionaires
Strings
Strings são sequências ordenadas de caracteres indexados começando em
0 e imutáveis. Oportunamente veremos algo sobre codificação, ASCII,
Unicode e similares, mas isto só nos concerne na medida em que
precisemos ler arquivos externos e será comentado quando necessário.
Vejamos exemplos:
Vejamos exemplos:
In [21]:
s = 'abcd' # a variável s tem como valor o string abcd
print(s)
l = len(s) # len() é uma função do Python que retorna o comprimento de um objeto
print(l)
print(s[0]) # s[0] é o caracter de índice 0 do string s
print(s[2])
O operador + (soma) aplicado entre dois strings permite concatenar os
dois strings num terceiro string que é o resultado desta "soma":
In [4]:
r = ' são quatro letras'
print(s + r)
Trechos de texto de várias linhas são usados para comentar algoritmos
em cabeçalhos. Tambem podem ser usados para definir strings de várias
linhas:
In [5]:
s1 = '''Quando visitar Roma
não deixe de ver o Vaticano.
Seus mármores assombrosos teriam sido
reciclados dos palácios imperiais
no monte Palatino.'''
Como foi mencionado strings são objetos que possuem diversas funções
associadas para sua manipulação. A forma de usar tais funções é apendar
um ponto (.) ao string seguido do nome da função desejada. Por exemplo:
In [6]:
# splitlines() é uma função membro de strings que devolve uma lista das linhas contidas no string
s1.splitlines()
Out[6]:
Observe como o Python retornou uma lista de linhas separadas por virgulas e listadas entre chaves quadradas.
Strings podem ser repetidos diversas vêzes usando operador multiplicador * e um numero, desta forma:
Strings podem ser repetidos diversas vêzes usando operador multiplicador * e um numero, desta forma:
In [8]:
s2 = 3*s + 'xy'
print(s)
print(s2)
Já vimos que caracteres num string são indexados, começando por 0. Às
vêzes queremos algum caracter contando do final para o começo do
string. Para isto existe a conveniência de índices negativos: -1 é o
último caracter, -2 seu predecessor e assim por diante:
In [9]:
print(s[-1])
print(s[-2])
Além de indexação dos caracteres strings também tem a utilíssima operação de "fatiagem" (slicing).
Usamos slicing para obter um pedaço de um string, como se cortassemos
fora as partes sem interesse. Isto é feito especificando os índices do começo e do primeiro caracter que não interessa, separados por dois pontos:
In [15]:
print(s[0:2])
print(s[1:]) # deixando o número final ausente equivale a ir até o fim
print(s[:-1]) # deixando o número inicial ausente equivale a começar no 0. -1 é o último caracter.
print(s[-3:]) # imprima os três últimos caracteres
Existem muitas outras funções-membro úteis em strings. Aprenda elas na medida do necessário. Aí vão alguns exemplos:
In [17]:
S = s.upper() # muda todos caracteres de s em maiúsculas, onde possível
print(S)
In [18]:
print(S.lower()) # muda maiusculas em minusculas
Podemos querer saber quantas vêzes uma palavra (um substring) ocorre num texto. Alguem pensou nisto e temos um método adequado:
In [20]:
texto = '''mas problemas não se resolvem,
problemas têm família grande,
e aos domingos
saem todos a passear
o problema, sua senhora
e outros pequenos probleminhas'''
n = texto.count('problema') # quantas ocorrências do substring 'problema'?
print(n)
Lists
Listas são um poderoso tipo de dados, tanto por razões teóricas
quanto na prática. Usando listas podemos emular muitos outros tipos de
dados, mas felizmente na prática e para nós isto não será necessário.
Uma lista é uma sequência ordenada de elementos. Elementos podem ser
objetos quaisquer, não precisam ser do mesmo tipo e, ao contrário dos
caracteres de strings, podem ser modificados.
Lista são representadas com chaves quadradas e seus elementos separados por virgulas:
Lista são representadas com chaves quadradas e seus elementos separados por virgulas:
In [24]:
L = ['Esta','é', 'uma', 'lista', 'de','strings', 1, 2, 3]
print(L)
Listas também podem ser criadas pela função
list()
do Python:
In [68]:
v = list() # cria uma lista vazia
print(v)
v = list('abcd') # cria lista com elementos de um string
print(v)
Existe um meio avançado de criar listas usando "comprehensions", um
tipo avançado e muito útil de construtor. Voltaremos a isto mais
adiante.
Listas tem indexação, como os strings:
In [27]:
print(L[2])
print(L[-1])
print(L[-5:])
Mas, ao contrário de strings, os elementos de listas podem ser modificados:
In [28]:
print(L)
L[-4] = 777
print(L)
Uma lista pode ser criada vazia, isto é, sem nenhum elemento inicial.
Elementos podem ser adicionados na lista a qualquer momento usando
métodos do tipo list:
In [39]:
l1 = [] # criei uma lista vazia, sem nenhum elemento
print(l1)
l1.append(123)
print(l1)
l1.append('mais um')
print(l1)
l1.append(777)
print(l1)
Elementos indesejados podem ser removidos pelo método remove():
In [40]:
l1.remove('mais um') # o elemento indesejado é dado como argumento
print(l1)
Outro modo de remoção é o método pop() o qual remove sempre o último elemento da lista:
In [42]:
print(L)
L.pop()
print(L)
L.pop()
print(L)
Listas podem ser extendidas e ter elementos inseridos em índices específicos:
In [44]:
print(l1)
l1.extend(['mais', 'uma', 'lista'])
print(l1)
l1.insert(3, '999')
print(l1)
Listas também tem o operador + (soma) de mesma forma que strings. Duas listas podem ser concatenadas usando este operador:
In [45]:
l = [1,2,3]
l1 = [4,5,6]
print(l)
print(l1)
print(l + l1)
Como os strings, listas também podem ser fatiadas:
In [47]:
l1 = L[2:5]
print(l1)
print(l1[-2])
Como disse, listas podem ter qualquer tipo de elemento. Em particular podem ter outras listas como elementos:
In [50]:
lst = [1, 2, 3]
outra = ["a", 'b', 'c']
une = lst + outra
print(une)
une[1] = lst # a lista lst vira elemento de indice 1 em une
print(une)
print(une[1:4]) # uma fatia da lista une
ele = une[1][2] # pega elemento 1 de une e nele pega o elemento 2
print(ele)
No ultimo exemplo observe algo que é padrão no Python: dado algum
objeto você sempre pode invocar seus metodos ou demais propriedades. Ali
o elemento
une[1]
é por acaso outra lista, então tudo que
se aplica a uma lista também vale para este elemento, em particular ele é
indexavel donde une[1][2]
é perfeitamente válido.
Entre os muitos métodos aplicáveis a listas alguns são realmente da
hora. Por exemplo frequentemente queremos saber se determinado objeto
está numa lista ou não. Neste caso usamos o método in que funciona assim:
In [57]:
print(L)
'uma' in L # 'uma' in L é uma expressão que necessariamente tem valor True ou False
Out[57]:
O operador in é um método da classe list e produz um resultado booleano,
True
ou False
In [58]:
print(88 in L) # será que 88 é membro de L?
Python tem uma série de funções embutidas entre as quais todos conectivos de lógica booleana:
and
, or
e not
. Com isto podemos montar expressões mais complicadas, o que será muito útil para nossos algoritmos:
In [59]:
'uma' in L and 777 in L # uma conjunção de duas expressões lógicas
Out[59]:
In [60]:
1 in L and 88 in L
Out[60]:
In [61]:
not 88 in L # não é o caso que 88 está na lista L?
Out[61]:
In [66]:
88 in L or 1 in L # 88 na lista L OU 1 na lista L?
Out[66]:
Em suma, listas são tipos de dados que modelam bem a maioria dos conceitos que vamos encontrar em nossos problemas.
Tuples
Tuples (enuplas) são sequências ordenadas e imutáveis de
quaisquer objetos. O que torna tuples diferentes de listas é serem
imutáveis, como os strings. Uma vez criada uma tupla seus elementos não
podem mais ser modificados. Como listas, as tuplas são indexadas e podem
ser fatiadas.
Tuplas são úteis para devolver resultados de funções, armazenar constantes e são mais rápidas que listas.
Tuplas podem ser construidas com elementos em fila separados por virgulas e entre parênteses:
Tuplas são úteis para devolver resultados de funções, armazenar constantes e são mais rápidas que listas.
Tuplas podem ser construidas com elementos em fila separados por virgulas e entre parênteses:
In [70]:
tup = ('a', 'b', 'c') # constroi uma tupla usando 3 elementos
tup
Out[70]:
In [77]:
t = () # constroi uma tupla vazia. existem casos onde isto é útil.
t
Out[77]:
In [71]:
tup[1] # tuplas são indexadas
Out[71]:
In [73]:
tup[1:] # tuplas podem ser fatiadas
Out[73]:
In [74]:
'b' in tup # tuplas tem metodo de busca, como em listas
Out[74]:
In [75]:
'd' in tup
Out[75]:
Também existe uma função criadora de tuplas usando outros tipos de dados como argumento. Igual ao que vimos em listas.
In [78]:
t = tuple('ab7d89') # cria tupla a partir de um string
t
Out[78]:
In [79]:
t1 = 'a', 'b', 42, 'd' # tuplas podem ser criadas de fila de objetos separados por virgulas
t1
Out[79]:
Range
Range é um tipo de dados bastante útil que usaremos muito para
contagem de repetições. Essencialmente um range "conta", incrementando a
contagem por 1 cada vez que o objeto é acionado e termina a contagem
qundo chegar a um valor determinado.
Um objeto range é construido por uma expressão que dá o número final da contagem e, opcionalmente, o número inicial (seu default é zero) e um "passo" ou incremento da contagem (seu default é 1).
Um objeto range é construido por uma expressão que dá o número final da contagem e, opcionalmente, o número inicial (seu default é zero) e um "passo" ou incremento da contagem (seu default é 1).
In [82]:
list(range(10)) # vai criar uma lista com os valores da contagem um a um
Out[82]:
In [83]:
list(range(21,27,2)) # começando em 21, conte até 27 de 2 em 2
Out[83]:
In [84]:
list(range(100, 70, -10)) # contagem decrescente de 100 a 70 contando de 10 em 10
Out[84]:
E com isto termina esta lição. Na próxima veremos os tipos de dados set e dict e começaremos com comandos.
No comments:
Post a Comment