Table of Contents

![altran_logo.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqoAAAD/CAYAAAA5WfQHAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAEUESURBVHhe7d0HmNzUuT7wz93rtu69YhvbuOJuMNjGEHoxpFGSAAkk/5BCbhJyubm5wM1NLknIpQTSSIBQ08CmNxOKccG44AauGPe+3rW9buvy16s9smUhaTQzOpoz2vf3PPOMNLs7O6PRSK8+nXNU66hFiIiIiIgMU1vdExEREREZhUGViIiIiIzEoEpERERERmJQJSIiIiIjMagSERERkZEYVImIiIjISAyqRERERGQkBlUiIiIiMhKDKhEREREZiUGViIiIiIzEoEpERERERmJQJSIiIiIjMagSERERkZEYVImIiIjISAyqRERERGQkBlUiIiIiMhKDKhEREREZiUGViIiIiIzEoEpERERERmJQJSIiIiIjMagSERERkZEYVImIiIjISAyqRERERGQkBlUiIiIiMhKDKhEREREZiUGViIiIiIxU66hFTafehl37ZNHWXbJ4y27ZtveA7D5wyL7tOlh9v/tAlex2ptV90wZ1pZl1a1q/XvW9M+96rHOzEjmlbVPp36aptGncQP03IiIyQdWRI9Z2f5cssm4ryipP2MZXT1vbfs9jUL29r1e9vcd0fWcfUP0Ytv/92zaTAdb2v2/rpvbfULzmbSqX9RX7Zce+A7Jjb5V1OyDb91Xf2/P7Dh6bLqlXW1o1qi+trVurEuuG+0YNrOl6ahqPN5Ah7ZtxX11EUhlUd1mBExukRVt3H9s4Ld5aIWXWyq0bVn4E1urg2qxoAuyEh99VU/F687qxaip5d7y1VN5avV3NUZJum9BXxndvreai07Uemqh2rVrSsG5taVivjn1fUhf31dO479GikYzq3MIKQc3UX1AUK3bssbb31dv96n1AhSzdvkf9VJ+6tWup0FodXHGPeXyOFM3qnXtl/uZyeX9DucxaVyYz15fJgUNH1E/j1bNlYxnTpaWM6dxShnQolVPbl1pBt476KZkkFUH1g80V8tYn2+VtK5TM21Qhayv2qp+Yo58VVi/v11Eu6dteRnZqoR41R63bpqip+CCoFDqo3v7mUjVHScLnnmtQxXeZjkPVDjvUER1byGBrhzrE2qH2snayJFK+v+rYtn/6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)

Tenga en cuenta que estamos usando Python 3.7 (NO Python 2! Python 2 está muerto)

Clicar aquí para abrir el cuaderno en google Colab. Toca sin miedo, te prometemos que no se romperá.

Open In Colab

# Let's make sure we are using Python 3
import sys
print(sys.version)
3.7.9 (default, Jan 25 2021, 10:30:43) 
[GCC 7.5.0]

¡Empecemos!

print('Hello Altran!')
Hello Altran!

print es una función incorporada. Lo usaremos varias veces.

Tipos de datos básicos: números, booleanos y cadenas

Los tipos de datos básicos en python3 son: https://realpython.com/python-data-types/

  • Numérico: enteros, flotantes y números complejos

  • Texto: cadenas

  • Lógica: booleanos

Numérico

Nota:

  • Use la función type () para obtener el tipo de una variable

  • Los números pueden ser enteros (‘int’), como 3, 5 y 3049

  • Los números decimales son flotantes (‘float’), como 2.5, 3.1 y 2.34938493

  • Los números imaginarios se definen con la letra j

a_int = 5
print(type(a_int))
print(a_int)

a_float = 2.3
print(type(a_float))
print(a_float)

a_img = 2j
print(type(a_img))
print(a_img)
<class 'int'>
5
<class 'float'>
2.3
<class 'complex'>
2j

Operadores matemáticos: +, -, \ , /, *

Los operadores matemáticos le permiten realizar operaciones matemáticas. Nota:** es el operador de exponenciación

a = 2
b = a + 1
print(b)
c = a - 1
print(c)
d = a * 2
print(d)
e = a / 2
print(e)

f = a ** 2
print(f)
3
1
4
1.0
4

Operadores matemáticos abreviados

a + = 1 es la abreviatura de a = a + 1

a = 5
a += 1
print(a)
a *= 2
print(a)
a /= 4
print(a)
a -= 2
print(a)
6
12
3.0
1.0
Warning : `+=` it's not the same as `=+`.
print(f'{a}')
1.0
a = 1
a += 4
print(a)
5
a = 1
a =+ 4
print(a)
4

Booleanos y operadores lógicos

im_true = True
im_false = False

print(type(im_true))
print(im_true)
<class 'bool'>
True

Operadores logicos

Los operadores lógicos (== y ! =) Le permiten comparar los valores de las variables en el lado izquierdo y derecho.

print(im_true == im_false)
print(im_true != im_false)
False
True

The and operator will return True only if both elements are True.

print(im_true and im_false)
False

The or operator will return True if any of the variables are True.

print(im_true or im_false)
True
im_true + im_true
2
Warning : Boolean TRue a menudo se trata como entero 1 y False como 0. Uso de operaciones matemáticas, por ejemplo, `+`:     Verdadero + Verdadero será 2.
True + True
2
True and True
True
True + False
1
True and False
False

1.3 Strings (cadenas de caracteres)

Puede usar comillas simples o dobles para cadenas.

my_string = 'Altran'
my_other_string = "Part of Capgemini"
print(my_string, my_other_string)
Altran Part of Capgemini

Métodos de strings

Cuerdas de concatenación:

another_string = 'Hello' + my_string + my_other_string
print(another_string)
HelloAltranPart of Capgemini
Cuidado con los espacios.
another_string = 'Hello, ' + my_string + " " + my_other_string
print(another_string)
Hello, Altran Part of Capgemini

Obtenga la longitud de la cadena:

print(len(another_string))
31

len es otra función incorporada

Las cadenas se pueden multiplicar.

Tipos de datos de contenedor

Algunos contenedores incorporados son

  • Lista y tuplas

  • Establecer

  • Dict

Se pueden dividir en mutables o inmutables:

  • Inmutables: Tuplas

  • Mutable: lista, dict y conjuntos.

Listas

Una lista de Python almacena múltiples elementos, cuyos tipos pueden ser diferentes.

my_list = ['a', 'b', 'c', 3485]
print(my_list)
['a', 'b', 'c', 3485]

Puede acceder a un elemento en una lista con la siguiente sintaxis:

Note :, el primer elemento de una lista tiene un índice de cero.
print(my_list[2])
print(my_list[0])
c
a

Reasignación de elementos en una lista:

my_list[0] = 'Altran'
print(my_list)
['Altran', 'b', 'c', 3485]

Agregar / eliminar elementos de una lista:

my_list.append('Part of Capgemini')
print(my_list)

my_list.pop()
print(my_list)
['Altran', 'b', 'c', 3485, 'Part of Capgemini']
['Altran', 'b', 'c', 3485]

Acceso a múltiples elementos en una lista:

print(my_list[0:2]) # Access elements in index 0, 1 and 2
print(my_list[2:]) # Access elements from index 2 to the end
print(my_list[:2]) # Access elements from the beginning to index 2
['Altran', 'b']
['c', 3485]
['Altran', 'b']

Tuplas

Una tupla es una secuencia de objetos Python inmutables. Las tuplas son secuencias, al igual que las listas. Las diferencias entre las tuplas y las listas son que las tuplas no se pueden cambiar a diferencia de las listas y las tuplas usan paréntesis, mientras que las listas usan corchetes.

a = (2, 'a')
print(a)

print(a[0])
print(type(a))
(2, 'a')
2
<class 'tuple'>

Para acceder a todas las propiedades y métodos de un objeto, use la función incorporada dir.

dir(a)
['__add__',
 '__class__',
 '__contains__',
 '__delattr__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getitem__',
 '__getnewargs__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__iter__',
 '__le__',
 '__len__',
 '__lt__',
 '__mul__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__rmul__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 'count',
 'index']

Diccionarios

Los diccionarios contienen pares clave / valor y son útiles para almacenar información.

my_dict = { 'key_one': 'Altran', 'key_two': 'Part of Capgemini' }
my_dict
{'key_one': 'Altran', 'key_two': 'Part of Capgemini'}

Acceda a un valor de un diccionario mediante una clave:

print(my_dict['key_one'])
print(my_dict['key_two'])
Altran
Part of Capgemini

Recorriendo los valores de un diccionario:

Note : consulte las siguientes secciones a continuación para obtener información sobre los bucles.
for key in my_dict:
    print("The key is " + key)
The key is key_one
The key is key_two
for key, value in my_dict.items():
    print("The key is " + key + ", and the value is " + value)
The key is key_one, and the value is Altran
The key is key_two, and the value is Part of Capgemini

Conjuntos

Los conjuntos son similares a las listas, pero solo pueden contener valores únicos.

my_set = {1, 2, 3, 3, 3, 3, 'hello'}
print(my_set)
{'hello', 1, 2, 3}

Al definir un conjunto con el mismo valor presente varias veces, solo se agregará un elemento al conjunto.

3. Funciones

Una función es un bloque de código reutilizable que realiza una determinada acción. Una vez que haya definido una función, ¡puede usarla en cualquier parte de su código!

Definiendo una función:

def am_i_happy(happiness_level):
    """ Function that prints if I'm happy or not."""
    
    if happiness_level >= 10:
        return "I'm very happy."
    elif happiness_level >= 5:
        return "I'm happy."
    else:
        return "I am not happy."

Llamar a una función:

print(am_i_happy(0))
I am not happy.
print(am_i_happy(5))
I'm happy.

Flujo de control

Hay varias oraciones de control de flujo. Los fundamentos son:

  • if / else

  • for

  • Comprensión de listas

  • while

If/Else

sleepy = True
hungry = False

if sleepy and hungry:
    print("Eat a snack and take a nap.")
elif sleepy and not hungry:
    print("Take a nap")
elif hungry and not sleepy:
    print("Eat a snack")
else:
    print("Go on with your day")
Take a nap

Bucles

Iterar sobre objetos iterables, como cadenas, matrices, rango, lista, tuplas, conjuntos, dictados.

bucles ‘while’

Mientras que los bucles se ejecutan hasta que se alcanza una condición de salida.

counter = 0
while (counter < 10): # this is the exit condition
    print("You have counted to", counter)
    counter = counter + 1 # Increment the counter
    
print("You're finished counting.")
You have counted to 0
You have counted to 1
You have counted to 2
You have counted to 3
You have counted to 4
You have counted to 5
You have counted to 6
You have counted to 7
You have counted to 8
You have counted to 9
You're finished counting.

bucles ‘for’

Recorrer una lista:

cool_animals = ['cat', 'dog', 'lion', 'bear']
for animal in cool_animals:
    print(animal + "s are cool")
cats are cool
dogs are cool
lions are cool
bears are cool

Loop over a dict:

animal_sounds = {
    'dog': 'bark',
    'cat': 'meow',
    'pig': 'oink'
}

for animal, sound in animal_sounds.items():
    print("The " + animal + " says " + sound + "!")
The dog says bark!
The cat says meow!
The pig says oink!

Lista / comprensión dict

Otra sintaxis para usar for-loops en python se llama comprensión de lista. Son mucho más legible y ampliamente utilizado.

Este sintax devuelve una lista.

cool_animals = ['cat', 'dog', 'lion', 'bear']
text = [animal + "s are cool" for animal in cool_animals]
print(text)
['cats are cool', 'dogs are cool', 'lions are cool', 'bears are cool']
print('Applause')
Applause