“Python para Iniciantes”, nesta série de posts vamos abordar um pouco sobre essa linguagem incrível que é o Python e que mudou para melhor meu dia dia como desenvolvedor WEB e também a de milhares de pessoas que querem e precisam entregar projetos de qualidade em prazos relativamente curtos. A intenção dessa aula, é apresentar ao estudante uma visão de como trabalhar como Strings em Python, então vamos lá: Tudo em Python é objeto, inclusive as strings:
1 2 3 |
>>> my_first_string = "Olá, eu sou uma string" >>> type(my_first_string) str |
No exemplo acima o tipo da variável my_first_string é str, que é o tipo que representa strings em Python. Em Python Strings são imutáveis. O que é isso? Objetos imutáveis são aqueles que não podem ser alterados, ou seja, esses mantém seu estado após criados e quando existe a necessidade de serem alterados eles se multiplicam, vamos a um expemplo:
1 2 3 4 5 6 |
>>> va = "meninO" >>> vb = va >>> va[5] = "A" Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' object does not support item assignment |
No exemplo acima não foi possível atribuir o valor “A” na sexta posição da string “menino“, pois como o erro lançado nos diz: “O tipo string não suporta atribuição de item”, portanto não é possível alterar apenas uma posição da variável “va“. Para tal precisariamos atribuir novamente o valor da variável va:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
>>> va = "meninO" >>> vb = va >>> id(va), id(vb) # id() -> função built-in que retorna a identidade de um objeto 123456, 123456 # os números aqui são apenas ilustrativos, mas eles sempre serão iguais neste momento # pois apontam para o mesmo endereço de memória neste instante. >>> print (va, vb) meninO meninO # repare que o valor de va e vb são iguais >>> va = "meninA" # neste momento um novo objeto é criado >>> id(va), id(vb) 345434, 123456 # repare que o endereço de memória de 'va' foi alterado, o que significa que foi criada uma nova variável. >>> print(va, vb) meninA meninO # repare que apenas o valor de 'va' mudou, enquanto o valor de 'vb' continuou o mesmo. >>> vc = va.capitalize() >>> print(va, vc) meninA Menina # 'va' não mudou mas 'vc' ganhou um M maiúsculo |
Resumindo: qualquer operação em uma string, sempre gera um novo objeto e isso também vale para os tipos int, float, long, complex, tuple … Tendo em mente que uma nova string será gerada a cada operação, devemos tomar cuidado com coisas assim:
1 |
>>> va = "muitas" + "strings" + "para" + "concatenar" |
Pois dessa forma o Python vai concatenar as strings assim (((“muitas” + “strings”) + “para”) + “concatenar”), de duas em duas, gerando mais processamento. Portanto o jeito pythonico de se fazer é utilizando o método join(), que concatena tudo de uma única vez, assim:
1 |
>>> ''.join(["muitas", "strings", "para", "concatenar"]) |
Como retornar o tamanho de uma string?
É bem tranquilo, basta utilizar a função built-in len().
1 2 3 4 5 |
>>> my_string = "qual meu tamanho" >>> len(my_string) 16 >>> nome.__len__() # a função len() busca pela implementação __len__() do objeto 16 |
Como retornar uma parte da string (substring) em Python?
1 |
>>> nome = "abcdef" |
A sintaxe para retornar o pedaço de uma string é nome[START:END:STEP]
Mas antes de começar vamos entender a diferença entre Python índices(index) e slices.
Índices(index) enumeram os elementos enquando slices enumeram os espaços entre os elementos. A imagem abaixo pode explicar melhor:
Na sintaxe nome[START:END]
START reflete as duas primeiras linhas da imagem acima, que equivale a posição real, iniciando em zero da esquerda para direita e em -1 da direita para a esquerda. Portanto falamos que o índice START é fechado.
END reflete as duas últimas linhas da imagem acima, que equivale a (posição desejada - 1) e por isso falamos que o índice END é aberto.
Por índice:
nome[index] # caracter que está na posição index, que equivale à nome.__getitem__(index)
Por slicing:
nome[start:end] # caracteres que comecem da posição start até end-1
nome[start:] # caracteres que comecem da posição start e vão até o fim
nome[:end] # caracteres que comecem da posição 0(do início) até end-1
nome[:] # caracteres que comecem da posição 0 até o fim. Faz uma cópia da string
Indices negativos também são permitos
Por índice:
nome[-1] # caracteres começam de trás para frente, onde -1 é o último item da string.
Por slicing:
nome[-2:] # caracteres que comecem do penúltimo até o fim da string
nome[:-2] # pega todos os caracteres menos os dois últimos.
Temos também os passos (steps)
a[start:end:step] # caracteres que comecem da posição start até end-1, onde step é um valor numérico e inteiro que indica o passo, por exemplo:
nome[:5:2] # caracteres que comecem da posição 0 até 5-1, pulando de 2 em 2
1 2 3 4 5 6 7 8 9 10 11 |
>>> nome = "abcdef" >>> nome[2] # retorna 'c', equivale à nome.__getitem__(2) >>> nome[1:5] # retorna 'bcde' equivale à nome.__getitem__(slice(1, 5)) >>> nome[1:] # retorna 'bcdef' >>> nome[:3] # retorna 'abc' >>> nome[:] # retorna 'abcdef' >>> nome[-1] # retorna 'f' >>> nome[-2:] # retorna 'ef' >>> nome[:-2] # retorna 'abcd' >>> nome[:5:2] # retorna 'ace' equivale à nome.__getitem__(slice(0, 5, 2)) >>> nome[::-1] # retorna 'fedcba'. Obs: inverte a string |
Alguns métodos interessantes do objeto String:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
>>> va = "teste métodos" >>> va.split() # retorna uma lista ['teste', 'métodos'] >>> a.capitalize() # retorna o primeiro caracter com letra maiúscula Teste métodos >>> a.title() # retorna os primeiros caracteres de cada palavra com letra maiúscula Teste Métodos >>> a.upper() # retorna todos os caracteres com letra maiúscula TESTE MÉTODOS >>> a.count("e") # retorna a quantidade de caracteres encontrados 2 >>> va = "dia: {0} mes: {1} ano: {2}".format(10, 8, 2014) # injetar outras strings 'dia: 10 mes: 8 ano: 2014' >>> va = "dia: {} mes: {} ano: {}".format(10, 8, 2014) # em Python 3 não precisamos passar os índices 'dia: 10 mes: 8 ano: 2014' |
Obrigado e até a próximo post