14 de março de 2013

Rapidinha - strings em Python

"Rapidinha Python" é uma série de posts que demonstram a praticidade de Python.

Você pode encontrar outros posts da série, identificadas com a tag "rapidinha".

Iniciamos a série com esse post falando de strings em Python.
Rapidinha Python é direto ao assunto. Então, show me the code!

Preenchido ou vazio?
>>> s = 'abcd'
>>> if s:
...   print('tem conteudo')
... 
tem conteudo

>>> s = ''
>>> if not s:
...   print('vazio')
... 
vazio 

Adicionando e multiplicando strings.
>>> 'facil' * 3
facilfacilfacil
>>> 'muito' + ' ' + 'facil'
muito facil 

Interpolando strings e variáveis.
Leia mais sobre esse assunto em str.format() e em Format String Syntax.
>>> profissao = 'programador'
>>> 'eu sou %s' % profissao
eu sou programador

>>> 'eu sou {}'.format(profissao) # do jeito do Python 3
eu sou programador
>>> nome = 'Vinicius'
>>> profs = 'programador'
>>> 'eu sou {profs} e me chamo {nome}'.format(nome=nome, profs=profs) 

Identificando o que tem dentro de uma string:
>>> s = 'aBcD' # pode ser aspas simples
>>> s = "aBcD" # pode ser aspas duplas também
>>> len('abcd')
4

>>> 'abcd'.startswith('a')
True
>>> 'abcd'.startswith('*')
False
>>> s.endswith('d')
True

>>> 'bc' in 'abcd'
True
>>> 'xx' in 'abcd'
False

>>> 'abcd'.find('c')
2
>>> 'abcd'.find('x')
-1

>>> 'abcd'.index('c')
2
>>> 'abcd'.index('x')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: substring not found 

Mexendo com pedaços da string, também conhecido como slicing ou fatiamento.
>>> 'abcd'[0]
a
>>> 'abcd'[0:2] # atenção: nao inclui o índice final
ab
>>> 'abcd'[-1] # última posição da string
d
>>> 'abcd'[-1::-1] # inverte a string com 1 comando. ;-)
dcba
>>> 

Importante: Os métodos de string nunca modificam o conteúdo original.
>>> s = 'eu gosto de Python'
>>> s.title()
Eu Gosto De Python
>>> s.capitalize()
Eu gosto de Python
>>> s # nao modificou a string original
eu gosto de Python

>>> 'ABCD'.lower() # método executado direto numa constante
abcd
>>> 'abcd'.upper()
ABCD
>>> 'AbcD'.swapcase()
aBCd

>>> 'abcd'.replace('c', '*')
ab*d
>>> '   abcd   '.strip()
abcd
>>> '   abcd   '.lstrip() # retira espacos só do inicio
abcd   
>>> len('   abcd   '.lstrip())
7
>>> '   abcd'.rstrip() # retira espacos só do final
   abcd
>>> '12'.zfill(5)
00012
>>> 

Entra lista e sai string:
>>> vogais = ['a', 'e', 'i', 'o', 'u']
>>> '-'.join(vogais)
a-e-i-o-u

>>> ''.join(vogais)
aeiou

>>> ','.join(['maria', 'pedro', 'joao'])
'maria,pedro,joao' 

Entra string e sai lista:
>>> 'cada palavra separada'.split()
['cada', 'palavra', 'separada']

>>> 'so 2 pedacos'.split(None, 1)
['so, '2 pedacos']

>>> 'pedro,marcos,maria'.split(',')
['pedro', 'marcos', 'maria']

Strings são listas de caracteres
>>> for letra in 'abcd':
...     print(letra)
a
b
c
d 

Cuidado com palavras acentuadas no Python 2.
>>> len('á')
2
>>> len(u'á') # string unicode
1
>>> len('á'.decode('utf-8')) # de string -> unicode
1
>>> len(u'á'.encode('utf-8')) # de unicode -> string
2 
>>> len(b'á') # tipo bytes: prepare p/ Python 3 já!
2 

A recomendação é usar o tipo bytes para strings que devem ser tratadas conforme seu comprimento em bytes. Leia mais sobre strings e unicode, na documentação oficial do Python.

Você tem uma ideia de assunto para abordarmos na série Rapidinha Python? Sugira nos comentários.

Eu sou Vinicius Assef, um programador do século passado que gosta de Python, pratica Lean Development e acredita em Deus. Você pode me contactar por email ou twitter.

8 comentários:

  1. Gostei do post!

    Acho que tem um pequeno erro na parte de slicing de string:
    'abcd'[-1:0:-1] devolve 'dcb' (a posição 0 é exclusive, certo? ;) )
    então acho que o correto é 'abcd'[-1::-1].

    ResponderExcluir
  2. Perfeita, a sua observação, Helen. Corrigido.

    Obrigado

    ResponderExcluir
  3. Queria saber como faz para python ler dois numeros inteiro separados por espaço...

    ResponderExcluir
    Respostas
    1. Acho que para fazer isso precisa-se primeiramente tratar os números como uma única string, usar o split para separá-los e depois transformar em números, usando os comandos int ou float.

      Excluir
  4. Que tal falar um pouco em como criar um analisador léxico...

    ResponderExcluir

Marcadores