Na primeira parte vimos os **tipos de dados** de Python. Neste segundo capítulo cobrimos os **operadores**, o **controle de fluxo** (if, for, while) e as **funções**.
Aviso: Este post foi traduzido para o português usando um modelo de tradução automática. Por favor, me avise se encontrar algum erro.
📚 **Esta entrada faz parte da série _Guia completo de Python_**, dividida em três capítulos que são lidos em ordem:
> * Parte 1: Tipos de dados
* 👉 **Parte 2: Operadores, controle de fluxo e funções**
* Parte 3: Classes, objetos e temas avançados
3. Operadores
3.1. Operadores aritméticos
Operador de soma +
InputPython3 + 5Copied
8
Operador de subtração -
InputPython3 - 5Copied
-2
Operador de multiplicação *
InputPython3 * 5Copied
15
Operador de divisão /
InputPython3 / 5Copied
0.6
Operador módulo %. Retorna o resto de uma divisão
InputPython25 % 2Copied
1
Operador de expoente **
InputPython5 ** 2Copied
25
Operador de divisão inteira //
InputPython25 // 2Copied
12
3.2. Operadores de comparação
Operador é igual ==
InputPython1 == 1Copied
True
Operador é diferente !=
InputPython1 != 2Copied
True
Operador é maior que >
InputPython3 > 2Copied
True
Operador é menor que <
InputPython2 < 3Copied
True
Operador é maior ou igual que >=
InputPython3 >= 3Copied
True
Operador é menor ou igual que <=
InputPython3 <= 3Copied
True
3.3. Operadores lógicos
Operador and
InputPythonTrue and TrueCopied
True
Operador or
InputPythonTrue or FalseCopied
True
Operador not
InputPythonnot FalseCopied
True
3.4. Operadores de identidade
Operador is
InputPython5.3 is 5.3Copied
True
Operador is not
InputPython5.3 is not 5Copied
True
3.5. Operadores de pertinência
Operador in
InputPythonx = ["apple", "banana"]"banana" in xCopied
True
Operador not in
InputPythonx = ["apple", "banana"]"orange" not in xCopied
True
3.6. Operadores bit a bit
Operador AND &
InputPythona = 60 # 60 = 0011 1100b = 13 # 13 = 0000 1101c = a & b; # 12 = 0000 1100cCopied
12
Operador OU |
InputPythona = 60 # 60 = 0011 1100b = 13 # 13 = 0000 1101c = a | b; # 61 = 0011 1101cCopied
61
Operador XOR ^
InputPythona = 60 # 60 = 0011 1100b = 13 # 13 = 0000 1101c = a ^ b; # 49 = 0011 0001cCopied
49
Operador NOT ~
InputPythona = 60 # 60 = 0011 1100c = ~a; # -61 = 1100 0011cCopied
-61
Operador de deslocamento à esquerda <<
InputPythona = 60 # 60 = 0011 1100c = a << 2; # 240 = 1111 0000cCopied
240
Operador de deslocamento para a direita >>
InputPythona = 60 # 60 = 0011 1100c = a >> 2; # 15 = 0000 1111cCopied
15
3.7. Operadores de atribuição
Operador =
InputPythona = 5aCopied
5
Operador +=. x += y é equivalente a x = x + y
InputPythona += 5aCopied
10
Operador -=. x -= y é equivalente a x = x - y
InputPythona -= 5aCopied
5
Operador *=. x *= y é equivalente a x = x * y
InputPythona *= 3aCopied
15
Operador /=. x /= y é equivalente a x = x / y
InputPythona /= 3aCopied
5.0
Operador %=. x %= y é equivalente a `x = x % y
InputPythona = 25a %= 2aCopied
1
Operador //=. x //= y é equivalente a x = x // y
InputPythona = 25a //= 2aCopied
12
Operador **=. x **= y é equivalente a x = x ** y
InputPythona = 5a **= 2aCopied
25
Operador &=. x &= y é equivalente a x = x & y
InputPythona = 60 # 60 = 0011 1100b = 13 # 13 = 0000 1101a &= b; # 12 = 0000 1100aCopied
12
Operador |=. x |= y é equivalente a x = x | y
InputPythona = 60 # 60 = 0011 1100b = 13 # 13 = 0000 1101a |= b; # 61 = 0011 1101aCopied
61
Operador ^=. x ^= y é equivalente a x = x ^ y
InputPythona = 60 # 60 = 0011 1100b = 13 # 13 = 0000 1101a ^= b; # 49 = 0011 0001aCopied
49
Operador >>=. x >>= y é equivalente a x = x >> y
InputPythona = 60 # 60 = 0011 1100a <<= 2; # 240 = 1111 0000aCopied
240
Operador <<=. x <<= y é equivalente a x = x << y
InputPythona = 60 # 60 = 0011 1100a >>= 2; # 15 = 0000 1111aCopied
15
4. Controle de fluxo
Para poder utilizar as ferramentas de controle de fluxo é necessário adicionar a instrução, dois pontos : e, em uma nova linha, escrever o código com indentação.
Ao contrário de outras linguagens, Python precisa de indentação (adicionar um espaço em branco) para definir o código dentro de uma ferramenta de controle de fluxo
4.1. Se
Mediante if podemos criar condicionais
InputPythonif len('MaximoFN') == 8:print('MaximoFN tiene 8 caracteres')Copied
MaximoFN tiene 8 caracteres
Se quisermos criar mais de uma condição, podemos usar elif
InputPythonif len('MaximoFN') < 8:print('MaximoFN tiene menos de 8 caracteres')elif len('MaximoFN') == 8:print('MaximoFN tiene 8 caracteres')Copied
MaximoFN tiene 8 caracteres
Se o que queremos é que algo seja executado caso nenhuma das condições indicadas seja cumprida, podemos usar else
InputPythonif len('MaximoFN') < 8:print('MaximoFN tiene menos de 8 caracteres')elif len('MaximoFN') > 8:print('MaximoFN tiene más de 8 caracteres')else:print('MaximoFN tiene 8 caracteres')Copied
MaximoFN tiene 8 caracteres
Se quisermos escrever tudo em uma única linha
InputPythonif len('MaximoFN') == 8: print('MaximoFN tiene 8 caracteres')Copied
MaximoFN tiene 8 caracteres
Mesmo assim, se quisermos escrever tudo em uma linha, mas com várias condições
InputPythonprint('MaximoFN tiene menos de 8 caracteres') if len('MaximoFN') < 8 else print('MaximoFN tiene más de 8 caracteres') if len('MaximoFN') > 8 else print('MaximoFN tiene 8 caracteres')Copied
MaximoFN tiene 8 caracteres
Se, por exemplo, queremos fazer a estrutura do if, mas não queremos, por enquanto, codificar uma das condições, podemos usar pass
InputPythonif len('MaximoFN') < 8:print('MaximoFN tiene menos de 8 caracteres')elif len('MaximoFN') > 8:passelse:print('MaximoFN tiene 8 caracteres')Copied
MaximoFN tiene 8 caracteres
4.2. Enquanto
O loop while é executado enquanto a condição for True
InputPythoni = 0string = 'MaximoFN'while len(string) > i:print(string[i], end='')i += 1Copied
MaximoFN
Se quisermos que o loop pare por alguma condição, usamos break
InputPythoni = 0string = 'MaximoFN'while len(string) > i:if string[i] == 'F':breakprint(string[i], end='')i += 1Copied
Maximo
Se quisermos que uma das iterações não seja executada por algum motivo, usamos continue
InputPythoni = 0string = 'Maximo FN'while len(string) > i:if string[i] == ' ':i += 1continueprint(string[i], end='')i += 1Copied
MaximoFN
Por meio de else, pode-se executar um bloco de código se a condição do while não for True
InputPythoni = 0string = 'MaximoFN'while len(string) > i:print(string[i], end='')i += 1else:print(" Se ha terminado el while")Copied
MaximoFNSe ha terminado el while
4.3. Para
O loop for é usado para executar código enquanto se itera por uma sequência; esta sequência pode ser qualquer elemento iterável do Python (string, lista, tupla, range, dicionário, set)
InputPythonstring = 'MaximoFN'for x in string:print(x, end='')Copied
MaximoFN
InputPythonlista = ['M', 'a', 'x', 'i', 'm', 'o', 'F', 'N']for x in lista:print(x, end='')Copied
MaximoFN
InputPythontupla = ('M', 'a', 'x', 'i', 'm', 'o', 'F', 'N')for x in tupla:print(x, end='')Copied
MaximoFN
InputPythonstring = 'MaximoFN'for i in range(len(string)):print(string[i], end='')Copied
MaximoFN
InputPythondiccionario = {"letra1": "M","letra2": "a","letra3": "x","letra4": "i","letra5": "m","letra6": "o","letra7": "F","letra8": "N",}for x in diccionario.values():print(x, end='')Copied
MaximoFN
Também é possível iterar pelos sets, mas como são elementos não ordenados, não teremos controle da ordem de execução
InputPythonset_ = {'M', 'a', 'x', 'i', 'm', 'o', 'F', 'N'}for x in set_:print(x, end='')Copied
NximoaMF
Se queremos que o loop pare por alguma condição, usamos break
InputPythonstring = 'MaximoFN'for x in string:if x == 'F':breakprint(x, end='')Copied
Maximo
Se quisermos que uma das iterações não seja executada por algum motivo, usamos continue
InputPythonstring = 'Maximo FN'for x in string:if x == ' ':continueprint(x, end='')Copied
MaximoFN
Por meio de else, é possível executar um bloco de código se a condição do while não for True
InputPythonstring = 'MaximoFN'for x in string:print(x, end='')else:print(" Se ha terminado el for")Copied
MaximoFNSe ha terminado el for
Se, por exemplo, quisermos fazer a estrutura do for, mas não quisermos, por enquanto, codificar o seu interior, podemos usar pass
InputPythonstring = 'MaximoFN'for x in string:passprint('Interior del for no codificado')Copied
Interior del for no codificado
5. Funções
Uma função é uma porção de código que pode ser executada tantas vezes quanto você quiser. Podem ser passados argumentos e ela pode devolver dados como resultado
Para definir uma função, começa-se com a palavra reservada def, seguida do nome da função, parênteses (), dois pontos : e, em seguida, em uma nova linha indentada, o código da função
InputPythondef funcion():print('MaximoFN')Copied
Para chamar a função, basta escrever o seu nome
InputPythonfuncion()Copied
MaximoFN
A las funções podem receber todos os argumentos que quiser, dentro dos parênteses e separados por vírgulas
InputPythondef funcion(string1, string2):print(string1 + ' ' + string2)funcion("Hola", "MaximoFN")Copied
Hola MaximoFN
Quando a função é chamada, deve-se passar o mesmo número de argumentos que foram declarados; se forem passados mais ou menos, obteríamos um erro.
Se não sabemos os argumentos que a função vai receber, podemos usar *args, ou seja, colocando um * antes dos argumentos indica-se que o número de argumentos é livre.
Ao fazer isso, passa-se uma tupla (lembremos que ela é imutável) com os argumentos
InputPythondef funcion(*argumentos):numero_argumentos = len(argumentos)for i in range(numero_argumentos):print(argumentos[i], end=' ')funcion("funcion", "con", "varios", "argumentos", "sin", "especificar", "cuantos")Copied
funcion con varios argumentos sin especificar cuantos
No caso de não saber a ordem dos argumentos de uma função, podemos indicar o argumento que queremos passar, indicando o seu nome
InputPythondef funcion(argumento1, argumento2, argumento3):print(argumento1 + ' '+ argumento2 + ' ' + argumento3)funcion(argumento3 = "MaximoFN", argumento1 = "Blog", argumento2 = "de")Copied
Blog de MaximoFN
No caso de querer passar os argumentos com seu nome, mas caso não se saiba quantos argumentos serão passados, pode-se usar **kwargs. Neste caso, será passado um dicionário com os argumentos
InputPythondef funcion(**kargumentos):print("Autor del blog: " + kargumentos["autor"])funcion(blog = "Blog", pertenencia = "de", autor = "MaximoFN")Copied
Autor del blog: MaximoFN
Se quisermos que algum argumento tenha um valor padrão, podemos indicá-lo entre os parênteses da função. Dessa forma, se ao chamar a função esse argumento não for passado, ele terá na função o valor padrão.
InputPythondef funcion(argumento1, argumento2, argumento3 = "MaximoFN"):print(argumento1 + ' '+ argumento2 + ' ' + argumento3)funcion("Blog", "de")Copied
Blog de MaximoFN
Pode-se passar qualquer tipo de dado como argumento. Por exemplo, se for passada uma lista como argumento, dentro da função, esse argumento será tratado como uma lista
InputPythondef funcion(argumento):longitud_lista = len(argumento)for i in range(longitud_lista):print(argumento[i], end=' ')funcion(["Blog", "de", "MaximoFN"])Copied
Blog de MaximoFN
As funções podem devolver dados, isso é feito por meio da palavra reservada return
InputPythondef funcion(argumento):longitud_lista = len(argumento)string = ""for i in range(longitud_lista):string = string + argumento[i] + ' 'return stringprint(funcion(["Blog", "de", "MaximoFN"]))Copied
Blog de MaximoFN
Podem devolver mais de um dado
InputPythondef funcion(argumento):longitud_lista = len(argumento)string0 = argumento[0]string1 = argumento[1]string2 = argumento[2]return string0, string1, string2dato0, dato1, dato2 = funcion(["Blog", "de", "MaximoFN"])print(dato0 + ' ' + dato1 + ' ' + dato2)Copied
Blog de MaximoFN
Se um dos dados retornados não nos interessa, podemos ignorá-lo com _
InputPythondef funcion(argumento):longitud_lista = len(argumento)string0 = argumento[0]string1 = argumento[1]string2 = argumento[2]return string0, string1, string2_, _, dato_de_interes = funcion(["Blog", "de", "MaximoFN"])print(dato_de_interes)Copied
MaximoFN
Se, por exemplo, quisermos fazer a estrutura da função, mas não quisermos, por enquanto, codificar o interior, podemos usar pass
InputPythondef funcion():passfuncion()Copied
Uma função pode chamar a si mesma; isso é chamado de recursão ou recursividade da função.
Por exemplo, podemos usar esta propriedade para calcular o fatorial de um número
InputPythondef factorial(n):if n == 0 or n == 1:return 1else:return n * factorial(n-1)factorial(5)Copied
120
5.1. Funções embutidas
Há uma série de funções já definidas em Python que podem ser usadas, como por exemplo a função abs(), que devolve o valor absoluto
InputPythonabs(-5)Copied
5
A seguir, é apresentada uma lista dessas funções
InputPythonimport builtinsdir(builtins)Copied
['ArithmeticError','AssertionError','AttributeError','BaseException','BlockingIOError','BrokenPipeError','BufferError','BytesWarning','ChildProcessError','ConnectionAbortedError','ConnectionError','ConnectionRefusedError','ConnectionResetError','DeprecationWarning','EOFError','Ellipsis','EnvironmentError','Exception','False','FileExistsError',...'slice','sorted','staticmethod','str','sum','super','tuple','type','vars','zip']
5.2. Documentação de uma função
Pode-se adicionar uma explicação de uma função que criamos por meio de um comentário no início da função; dessa forma, quando chamarmos a built-in function help(), ela nos mostrará essa explicação.
InputPythondef funcion():"Esta es la explicación de la función"Nonehelp(funcion)Copied
Help on function funcion in module __main__:funcion()Esta es la explicación de la función
Outra opção para ver a explicação da função é usar o método __doc__ da função
InputPythonfuncion.__doc__Copied
'Esta es la explicación de la función'
5.3. Decoradores
Os decoradores são uma funcionalidade do Python que permite adicionar novas características a uma função
Cria-se uma função decoradora que tem como parâmetro outra função. Então, a função decoradora adiciona a nova característica à função que recebe
InputPythondef decorador(parametro_funcion):"""Agrega barritas arriba y abajo de la funcion"""def envoltorio():"""Aplica las barritas al texto"""print("==================")parametro_funcion()print("==================")return envoltoriodef funcion():print("MaximoFN")funcion_envoltorio = decorador(funcion)print('Función sin decoradores: ')funcion()print(' Función con decoradores: ')funcion_envoltorio()Copied
Función sin decoradores:MaximoFNFunción con decoradores:==================MaximoFN==================
Mas outra forma mais poderosa de usar os decoradores é por meio do uso de @ e o nome do decorador antes da função.
Ou seja, primeiro se define o decorador e, em seguida, chama-se uma função com o decorador definido
InputPythondef decorador2(parametro_funcion2):"""Agrega barritas arriba y abajo de la funcion"""def envoltorio2():"""Aplica las barritas al texto"""print("==================")parametro_funcion2()print("==================")return envoltorio2@decorador2def funcion2():print("MaximoFN")print('Función con decoradores: ')funcion2()Copied
Función con decoradores:==================MaximoFN==================
5.4. *args e **kwargs
*args e **kwargs são argumentos opcionais que podem ser usados ao definir uma função em Python. A sintaxe é a seguinte:
def mi_funcion(arg1, arg2, *args, **kwargs):
# código da função aqui5.4.1. *args
*args é usado para enviar um número variável de argumentos para uma função. Ao usar *args, você pode enviar uma quantidade variável de argumentos para a função sem precisar especificar o número exato de argumentos que a função precisa. Os argumentos são recebidos na função como uma tupla.
InputPythondef saludo(saludo, *nombres):for nombre in nombres:print(f"{saludo}, {nombre}")saludo("Hola", "Alicia", "Roberto", "Carlos")Copied
Hola, AliciaHola, RobertoHola, Carlos
5.4.2. **kwargs
**kwargs é usado da mesma forma, mas para enviar um número variável de argumentos com palavras-chave (keyword arguments) para uma função. Ao usar **kwargs, você pode enviar uma quantidade variável de argumentos para a função e especificar o valor de cada argumento usando seu nome. Os argumentos são recebidos na função como um dicionário.
InputPythondef saludo(saludo, **personas):for key, value in personas.items():print(f"{saludo} {key}, tu edad es {value} años")saludo("Hola", Juan=22, Maria=32, Pedro=25)Copied
Hola Juan, tu edad es 22 añosHola Maria, tu edad es 32 añosHola Pedro, tu edad es 25 años
6. Funções adicionais
6.1. Funções *lambda*
Uma função *lambda* é uma pequena função anônima.
Uma função *lambda* pode receber qualquer número de argumentos, mas só pode ter uma expressão.
As funções *lambda* são definidas da seguinte maneira:
argumentos lambda : expressãoInputPythonx = lambda a : a + 10print(x(5))Copied
15
InputPythonx = lambda a, b, c : a + b + cprint(x(5, 6, 2))Copied
13
O poder de *lambda* se mostra melhor quando é usado como uma função anônima dentro de outra função.
InputPythondef myfunc(n):return lambda a : a * nmydoubler = myfunc(2)mytripler = myfunc(3)print(f"mydoubler: {mydoubler(11)}")print(f"mytripler: {mytripler(11)}")Copied
mydoubler: 22mytripler: 33
6.2. Função map
A função map permite aplicar a cada elemento de uma estrutura iterável uma função
InputPythonlista = [1, 2, 3]def funcion_mas_1(valor):return valor + 1lista_modificada = list(map(funcion_mas_1, lista))lista_modificadaCopied
[2, 3, 4]
Isso é equivalente a usar list comprehension
InputPythonlista_modificada = [funcion_mas_1(x) for x in lista]lista_modificadaCopied
[2, 3, 4]
6.3. Função filter
A função filter permite selecionar os elementos de uma estrutura iterável que cumpram uma condição
InputPythonlista = [1, 2, 3, 4, 5, 6, 7]def esPar(valor):return valor % 2 == 0lista_filtrada = list(filter(esPar, lista))lista_filtradaCopied
[2, 4, 6]
Isso é equivalente a usar list comprehension
InputPythonlista_filtrada = [x for x in lista if esPar(x)]lista_filtradaCopied
[2, 4, 6]
6.4. Função reduce
A função reduce permite realizar tarefas acumulativas sobre estruturas iteráveis
InputPythonfrom functools import reducelista = [1, 22, 33]def acumular(valor, acumulador):print(f'valor = {valor}, acumulador = {acumulador}, acumulacion = {valor + acumulador}')return valor + acumuladoracumulacion = reduce(acumular, lista)print(f' acumulacion = {acumulacion}')Copied
valor = 1, acumulador = 22, acumulacion = 23valor = 23, acumulador = 33, acumulacion = 56acumulacion = 56
6.5. Função zip
Com a função zip é possível combinar várias estruturas iteráveis em uma só, ou seja, ela permite agrupar vários elementos das estruturas *Ax* em uma única estrutura *B*. A estrutura *B* é formada por tuplas dos elementos das estruturas *Ax*
InputPythonnombres = ["Manolo", "Andres", "Fernando"]altura = [181, 178, 180]my_zip = list(zip(nombres, altura))my_zipCopied
[('Manolo', 181), ('Andres', 178), ('Fernando', 180)]
6.5. Geradores
Suponha que queremos iterar sobre uma sequência de números, mas de uma forma especial que não nos oferece nenhum tipo de loop. Isso podemos resolver com os geradores. Para poder fazer isso, a função geradora não precisa devolver o valor com return, mas sim com yield para que saiba que tem de continuar iterando
InputPythondef iterador_custom(N):for i in range (N):if i % 3 == 0:yield igenerador = iterador_custom(20)for i in generador:print(i)Copied
0369121518
Acabámos de fazer um iterador por números múltiplos de 3
6.6. Funções de ordem superior
Podemos criar funções que recebem outras funções como parâmetros, de modo que a função que recebe outra função como parâmetro é chamada de função de ordem superior (high order function). Vejamos um exemplo
InputPythondef increment(x):return x + 1def hof(f, x):return 2*f(x)print(hof(increment, 3))Copied
8
---
➡️ **Continua na Parte 3: clases, objetos y temas avanzados**, onde darás o salto para a programação orientada a objetos e para os módulos.