Python Strings

Python Strings

Python tem uma classe string default chamada “str” com muitos recursos úteis

nome = 'Ana Beatriz'

Uma string com aspas duplas pode conter aspas simples sem qualquer problema e o inverso também é verdade. Por exemplo:

a = " Foi por uma gota d'agua. "

b = ' Ele disse: "Foi por pouco!"  .'

A declaração da string pode ocupar várias linhas, mas deve haver uma barra invertida no final de cada linha para indicar a continuidade da nova linha.

c = 'Ele disse: "Foi por pouco,' \
    'quase deu ruim.'

Strings literais entre aspas triplas, “”” ou ‘’‘, podem se estender por várias linhas de texto.

d  = """
    Strings literais entre aspas triplas,
    podem se estender por várias linhas de texto.

    """

Strings python são “imutáveis”, o que significa que elas não podem ser alteradas depois de serem criadas (strings em Java também utilizam este estilo imutável).

nome = 'Ana Beatriz'
print (nome)            # 'Ana Beatriz'
nome.join('!!')         # '!Ana Beatriz!'
print (nome)            # 'Ana Beatriz'

Sabendo que as strings não podem ser alteradas, podemos construir novas strings como valores concatenados.

nome = '!' + nome + '!'
print (nome)            # '!Ana Beatriz!'

Os caracteres de uma string são acessados pela sintaxe padrão [ ] Como em Java e C++, Python utiliza indexação baseada em zero.

print (nome[0])         # A
print (nome[1])         # n
print (nome[2])         # a
print (nome[3])         #

Se o índice estiver fora dos limites da string, o Python gerará um erro.

print (nome[11])
IndexError: string index out of range

O estilo Python (ao contrário do Perl) interrompe se não pode dizer o que fazer, em vez de apenas retornar um valor padrão.

O “slice” é uma sintaxe útil que trabalha para extrair qualquer substring de uma string.

nome[0:3]               # 'Ana'

A função len (string) devolve o comprimento de uma string.

len(nome)               # 11

A sintaxe [ ] e a função len() trabalham em qualquer tipo de sequência - strings, lists, etc...

O Python tenta fazer suas operações funcionarem de forma consistente em diferentes tipos.

Pegadinha para o novato em Python: não use “len” como um nome de variável para evitar o bloqueio a função len().

O operador ‘+’ pode concatenar duas strings.

Observe no código abaixo que diferente de outras LP’s as variáveis não são pré-declaradas - apenas para atribuir.

s = 'hi'
print s[1]          ## i
print len(s)        ## 2
print s + ' there'  ## hi there

Ao contrário do Java, o ‘+’ não converte automaticamente números ou outros tipos em string.

A função str() converte valores a uma forma de string para que possam ser combinados com outras strings.

    pi = 3.14
    ##text = 'Valor de pi: ' + pi               ## Erro, não funciona
    text = 'Valor de pi: '  + str(pi)           ## concatenando duas strings
print (text)                                ## Valor de pi: 3.14

Para números, os operadores +, -, /, * trabalham da maneira usual.

Em python não há operador ++, porém, +=, -=, e outros funcionarão.

x = 12
x += 1
print (x)                                   ## 13

Se você quiser uma divisão inteira, o correto é utilizar 2 barras - por exemplo:

# python 2.7
>>> 6/5
1
>>> 6.0/5.0
1.2
# python 3.4
>>> 6/5
1.2
>>> 6//5
1

String Methods

Um método é como uma função, mas é executado “em um objeto”.

Se a variável s é uma string (objeto da classe String), então o código s.lower() executa método lower() no objeto ‘s’ e retorna o resultado (esta ideia de um método de execução em um objeto é uma das ideias básicas que compõem a Programação Orientada a Objetos, POO). Aqui estão alguns dos métodos mais comuns:

  • s.lower(), s.upper() – retorna a string em minúscula ou maiúscula
  • s.strip() – retorna a string sem espaços no início e no fim
  • s.isalpha() s.isdigit() s.isspace()... – verifica se todas os caracteres da string correspondem ao teste
  • s.startswith(‘other’), s.endswith(‘other’) – testa se a string inicia ou termina com dados de outra string
  • s.find(‘other’) – procura dados em uma string (não procura expressão regular) e retorna o valor do primeiro caractere. Se retornar -1 o dado não foi encontrado
  • s.replace(‘old’, ‘new’) – retorna uma string quando todas as ocorrências de ‘old’ forem subistituidas por ‘new’
  • s.split(‘delim’) – retorna uma lista de substrings separadas por um delimitador. O delimitador não é uma expressão regular, é texto puro. Exemplo: ‘aaa,bbb,ccc’.split(‘,’) -> [‘aaa’, ‘bbb’, ‘ccc’]. Caso não seja definido um delimitador, será utilizado por padrão os espaços entre os caracteres
  • s.join(list) – oposto do split (), junta os elementos de uma lista de dados, utilizando a string como o delimitador. Exemplo.: ‘—’.join([‘aaa’, ‘bbb’, ‘ccc’]) -> aaa—bbb—ccc
  • Uma busca no Google por “python str” deverá levar você ao site oficial do Python, python.org , que contém uma lista com todos os metódos que podem ser utilizados.

Python não tem um tipo de caractere separado. Em vez disso uma expressão como s[8] retorna uma string de tamanho 1 contendo o caractere.

Com essa string de tamanho 1, os operadores ==, <=, ... farão todo o trabalho como seria de se esperar, portanto, na maior parte das vezes, você não precisa saber que o Python não tem uma variável do tipo “char” separado.

String Slices

A sintaxe “slice” é uma maneira prática para se referir a sub-partes de sequências - tipicamente strings e lists. Os slices s [start:end] são os elementos que começam no início e que se estendem até, mas não incluindo o fim. Suponha que temos s = “Hello”

../_images/hello.png

A string ‘hello’ com índice de letras 0 1 2 3 4

  • s[1:4] is ‘ell’ – caractere começando com 1 e não exibindo o 4
  • s[1:] is ‘ello’ – omite o primeiro caracter (0)
  • s[:] is ‘Hello’ – uma cópia da string (é o jeito pythonico de copiar uma sequência como uma string ou lista)
  • s[1:100] is ‘ello’ – Um index que é muito grande e será truncado até o comprimento real da string

Números de índice negativos são contados para trás a partir do final da string:

  • s[-1] == ‘o’ -> último caractere (1º a partir do fim)
  • s[-4] == ‘e’ -> 4º a partir do fim
  • s[:-3] == ‘He’ -> indo até o início mas não incluindo os últimos 3 caracteres.
  • s[-3:] == ‘llo’ -> iniciando com o 3º caractere a partir do final e extendendo até o fim da string.

É óbvio que slices que para qualquer índice n, s[:n] + s[n:] == s.

Isso funciona mesmo para n negativos ou fora dos limites.

Ou dito de outra forma s[:n] e s[n:] sempre dividirão a string em duas partes, conservando todos os caracteres.

Como veremos na seção lists mais tarde, slices também trabalham com listas.

Composição de Strings

O símbolo % é usado para indicar composição de strings com variáveis. O ‘%’ é chamado de marcador de posição, e indica que na posição em que foi colocado, conterá um valor. Veja os principais tipos de marcadores suportador pelo Python:

Marcador Tipo
%d Números inteiros
%s Strings
%f Números decimais
# % operator
text = "%d little pigs come out or I'll %s and %s and %s" % (3, 'huff', 'puff', 'blow down')
print (text)
"3 little pigs come out or I'll huff and puff and blow down"

A linha acima é um metódo comprido - suponha que você quer dividi-lo em linhas separadas. Você não pode simplesmente dividir a linha após o ‘%’ como é possível em outras linguagens, já que por padrão o Python trata cada linha como uma declaração separada (no lado positivo, é por isso que não precisa digitar ponto e vírgula em cada linha). Para corrigir isso, coloque toda a expressão em um conjunto externo de parênteses - então a expressão é permitida a abranger várias linhas. Esta técnica de códigos através de linhas trabalha com vários construtores agrupados detalhados abaixo: (),[],{}.

# add parens to make the long-line work:
text = ("%d little pigs come out or I'll %s and %s and %s" %
(3, 'huff', 'puff', 'blow down'))

If Statement

Python não utiliza {} para incluir blocos de código para if/strings/funções etc .. Em vez disso, Python usa dois pontos (:) e recuo/espaço em branco com declarações do grupo. O teste booleano para um if não precisa estar em parênteses (grande diferença do C++/Java), e pode ter as cláusulas elif e else (mnemonic: a palavra “elif” tem o mesmo comprimento que a palavra “else”).

Qualquer valor pode ser usado como um if-test.

Todos os valores “zero” contam como falso: None, 0, string vazia, lista vazia, dicionário vazio.

Há também um tipo booleano com dois valores: verdadeiro e falso (convertido para um int, estes são 1 e 0).

Python tem as operações de comparação habituais: ==, !=, <, <=,>,>=.

Ao contrário de Java e C, == está preparado para funcionar corretamente com strings.

Os operadores booleanos são identificados pelas palavras and, or, not

(Python não usa o estilo C, && ||!).

Observe como cada bloco declarado de then/else é seguido de um”:” e as demonstrações são agrupadas por sua identação:

if speed >= 80:
  print 'License and registration please'
  if mood == 'terrible' or speed >= 100:
    print 'You have the right to remain silent.'
  elif mood == 'bad' or speed >= 90:
    print "I'm going to have to write you a ticket."
    write_ticket()
  else:
    print "Let's try to keep it under 80 ok?"

Omitir o ”:” é o um erro comum sintaxe mais comum quando se digita o tipo de código acima, provavelmente já que é uma coisa adicional para digitar vs. meus hábitos C ++ / Java.

Além disso, não colocar o teste booleano em parênteses - que é um hábito C / Java.

Se o código é curto, você pode colocar o código na mesma linha após ”:”,

Como o exemplo abaixo (isso se aplica a funções, loops, etc. também), embora algumas pessoas achem que é mais legível para o espaço as coisas em linhas separadas.

if speed >= 80: print 'You are so busted'
else: print 'Have a nice day'

Exercício: string1.py

Download do Arquivo: string1.py

Exercício A: Donuts

# Dado um número de donuts, retorne um string
# contendo 'Number of donuts: <count>', onde <count> é o número recebido.
# Entretanto, se o número for 10 ou mais, use a palavra 'many'
# ao invés do contador.
# Então donuts(5) returns 'Number of donuts: 5'
# e donuts(23) returns 'Number of donuts: many'

Exercício B: both-ends

# Dada uma string s, retorne uma string constituída pelos 2 primeiros
# e pelos dois últimos caracteres da string original,
# então 'sprint' resulta 'spng'. Entretando, se a string tem
# comprimento menor que 2, retorna uma string vazia.

Exercicio C: fix-start

# Dada uma string s, retorne uma string
# onde todas as ocorrências do seu primeiro caracter tenha
# sido mudada para '*', exceto o primeiro caracter propriamente.
# Por exemplo: 'babble' resulta 'ba**le'
# Assuma que a string tem comprimento 1 ou maior.
# Dica: s.replace(stra, strb) retorna uma versão da string s
# onde todas instâncias de 'stra' foram mudadas para 'strb'

Exercício D: MixUp

# Dadas as strings 'a' e 'b', retorne uma única string com 'a' e 'b' separados
# por um espaço '<a> <b>', substituindo os 2 primeiros caracteres de cada string.
# Exemplo:
#    'mix', 'pod' -> 'pox mid'
#    'dog', 'dinner' -> 'dig donner'
# Assuma que 'a' e 'b' tenham comprimento 2 ou mais.