Get Mystery Box with random crypto!

Curso de python

Logotipo do canal de telegrama forkpython - Curso de python C
Logotipo do canal de telegrama forkpython - Curso de python
Endereço do canal: @forkpython
Categorias: Não categorizado
Idioma: Português
Assinantes: 640
Descrição do canal

Um "fork" do @AcervoHackerBR para postar aulas de Python. Obs: o grupo mudou de nome para dividir os cursos em vários grupos e assim manter-se organizado.

Ratings & Reviews

4.00

3 reviews

Reviews can be left only by registered users. All reviews are moderated by admins.

5 stars

1

4 stars

1

3 stars

1

2 stars

0

1 stars

0


As últimas mensagens

2020-06-16 20:54:20 Processo linear iterativo / tail call recursion by @Foxx3r

O processo linear iterativo se difere do processo linear recursivo, no linear iterativo, temos um acumulador, no processo linear recursivo, a gente não tem um acumulador, então para a gente chegar no valor, precisamos desencapsular toda a função (o que faz ela crescer, tanto em tamanho quanto complexidade de algoritmo/tempo), um exemplo de como é feito o cálculo de baixo dos panos do processo linear recursivo em fatorial:

(factorial 6)
(6 * (factorial 5))
(6 * (5 * (factorial 4)))
(6 * (5 * (4 * (factorial 3))))
(6 * (5 * (4 * (3 * (factorial 2)))))
(6 * (5 * (4 * (3 * (2 * (factorial 1))))))
(6 * (5 * (4 * (3 * (2 * 1)))))
(6 * (5 * (4 * (3 * 2))))
(6 * (5 * (4 * 6)))
(6 * (5 * 24))
(6 * 120)
720

Agora vamos ver como é por baixo dos panos o processo linear iterativo:

(factorial 6)
(fact-iter 1 1 6)
(fact-iter 1 2 6)
(fact-iter 2 3 6)
(fact-iter 6 4 6)
(fact-iter 24 5 6)
(fact-iter 120 6 6)
(fact-iter 720 7 6)

Agora vamos ver o código:

def factorial(n):
if n == 1:
return 1
else:
return fact(n - 1) * n

def factorial2(n):
def fact_iter(product, accumulator):
if product == 1:
return accumulator
else:
return fact_iter(product - 1, accumulator * product)
return fact_iter(n, 1)

A diferença do primeiro pro segundo, é que o primeiro, depois de uma certa quantidade, ele causa stack overflow ou coisa pior na memória

O segundo nunca cresce, sempre permanece do mesmo, e como é tail recursion... O compilador pode fazer uma otimização na memória chamado de Tail Call Optimization (TCO), aonde a cada iteração, ele consegue limpar a memória e assim ela nunca vai se corromper... também, ele trata isso quase como se fosse um loop

Conseguiram perceber como faz?

1:
n - 1
2:
product - 1

1:
return 1
2:
return accumulator

1:
fact(...) * n
2:
accumulator * product

Agora prestem atenção:

def fibonacci(n):
if (n == 1 or n == 0):
return 1
else:
return fibonacci (n - 1) + fibonacci (n - 2)

def fibonacci2(n):
def fib_iter(n, current, previous):
if (n <= 0):
return current
else:
return fib_iter(n - 1, current + previous, current)
return fib_iter(n, 1, 0)

por baixo:

fibonacci 3
fibonacci 2 + fibonacci 1
fibonacci 1 + fibonacci 0 + fibonacci 1
1 + fibonacci 0 + fibonacci 1
1 + 1 + fibonacci 1
1 + 1 + 1
2 + 1
3

fibonacci2 3
fib_iter 3 1 0
fib_iter 2 1 1
fib_iter 1 2 1
fib_iter 0 3 2
3

Aonde current é o quanto de iterações que o programa já rodou, e o previous é o número anterior a essa iteração. a pergunta que vocês devem estar se perguntando agora é:

Por que temos um current e previous? Porque não é assim em fatorial

Simples, porque a gente só precisa dos dois números anteriores na fibonacci:

fib(n - 1) + fib(n - 2)

Precisamos de um número anterior e de um anterior a esse.

Então a cada iteração, dizemos que:

current += previous
previous = cur

Neste código, o acumulador é o current.

Para você saber qual é o acumulador, você simplesmente vê qual está sendo retornado, um exemplo:

fib 3
fib 3 1 0
fib 2 1 1
fib 1 2 1
fib 0 3 2
3

Deu 3, porque o segundo parâmetro é o acumulador. Iniciamos com fib(n, 1, 0), depois previous vira o valor do current (1), e temos um n - 1

Depois disso, é realizado um n - 1 novamente, o que o faz virar 1, e temos cur + prev que dá 2, e prev vira cur, que dá 1

Depois, temos n - 1 que vira 0, e cur + prev (2 + 1) dá 3, e prev vira cur, que dá 2. Agora aqui, ele só retorna 3. Não precisa desencapsular nem nada, só retornar o valor que foi incrementado durante todo o processo.
1.7K viewsFoxxer λ (Estoicist), 17:54
Aberto / Como
2020-06-13 02:57:36 Como calcular recursão desconstruindo ela

As vezes, usar esta forma https://t.me/ForkPython/150 para calcular funções, pode não ser muito intuitiva, principalmente por ela fazer mais sentido quando você tem uma base numérica por trás ou lida exatamente com matemática. Agora vamos fazer uma função que calcula o produto de uma função (por exemplo, pega [1, 2, 3, 4, 5] e faz 1 * 2 * 3 * 4 * 5):

def product(list_num):
if list_num == []:
return 0
# não precisamos usar
# else, porque o return
# termina a função
x = list_num[0] # cabeça
xs = list_num[1:] # calda
return (x * product(xs))

Agora, se formos rodar esta função, ela retornará 0 independente de qualquer valor. Mas por quê? Vamos dar uma olhada:

product([1, 2, 3, 4])
# 1 * product([2, 3, 4])
# 1 * 2 * product([3, 4])
# 1 * 2 * 3 * product([4])
# 1 * 2 * 3 * 4 * product([])
# 1 * 2 * 3 * 4 * 0
# 0

Realmente, a função está errada. Ao invés de retornar 0, vamos fazê-la retornar 1. Agora vamos ver como será:

product([1, 2, 3, 4])
# 1 * product([2, 3, 4])
# 1 * 2 * product([3, 4])
# 1 * 2 * 3 * product([4])
# 1 * 2 * 3 * 4 * product([])
# 1 * 2 * 3 * 4 * 1
# 24

Nota: Não se preocupe, você se acostuma e vai poder pensar nesses problemas logicamente na cabeça. Só ir treinando. Além de que recursão é muito mais poderoso do que for. E em breve, ensinarei a fazer tail call recursion, uma técnica de recursão que é tratada como iteração e seu custo não aumenta a cada loop.

Em breve passamos mais alguns exercícios de recursão. ;)
1.3K viewsFoxxer λ (Estoicist), edited  23:57
Aberto / Como
2020-05-03 23:52:27 Side effects em Python by @foxx3r

Para saber este tópico, você tem que saber programação funcional. Agora vamos às explicações. Side effect em programação funcional, é tudo aquilo que tem um efeito consequente em uma outra ação. Em programação funcional, não há side effects. Vamos ver um exemplo em Python:

def list1():
return [1, 2]
def list2():
return [3, 4]
def new_list(a, b):
return a + b

my_list1 = list1()
my_list2 = list2()
print(new_list(my_list1, my_list2)) # [1, 2, 3, 4] como esperado

Agora, irei modificar o valor dela para poder passar para outra função:

my_list2[0] = 0
outra_funcao(my_list2)
print(new_list(my_list1, my_list2)) # [1, 2, 0, 4] não esperado

Viu a importância de usarmos programação funcional? Imagine agora um programa complexo, aonde usamos as mesmas variáveis/funções para várias coisas e você modifica uma delas, logo o processo após irá falhar.
1.5K viewsFoxxer λ, edited  20:52
Aberto / Como
2020-01-06 01:29:23 Como calcular uma recursão? Simples. Temos três regras básicas:

1. Abra a quantidade de parênteses de 1 até o parâmetro passado.
2. Após isso, coloque o número de retorno dentro do parentese final até sair dos parenteses.
3. E então, faça a conta na qual você fez (fora dos parenteses).

Agora um exemplo:

def recursao(n):
if n == 0:
return 1
else:
return recursao(n - 1) * 2

recursao(3)

Então, o protótipo desta função é:

(((1) * 2) * 2) * 2

Aonde pegamos 1 e multiplicamos por 2, e dá 2.
Agora pegamos 2 e multiplicamos por 2, dá 4.
Agora pegamos 4 e multiplicamos por 2, dá 8.

E então 8 é o resultado de recursao(3)

Agora vamos ver aonde as regras foram cumpridas:

1. ((( ) ) )
2. (((1) ) )
3. (((1) * 2) * 2) * 2
1.9K viewsFoxxer, edited  22:29
Aberto / Como
2019-12-03 20:52:45 =========================
1 - A biblioteca NumPy

A biblioteca NumPy (NumPy, Numerical Python) é um pacote de alto nível, funções e ferramentas matemáticas e numéricas que são projetados para trabalhar com o objeto de matriz numpy. Uma matriz numpy é uma estrutura de dados multidimensional de alto desempenho e é mais eficiente e conveniente do que uma lista Python.

Um programa Python usando a biblioteca numpy pode exigir a instalação do pacote. Além disso, um programa que usa o pacote deve incluir a declaração:

import numpy

Python lida principalmente com listas e não tem uma estrutura de variedade nativa, de modo a compreender a matriz numpy é importante ter uma compreensão básica de matrizes.

Uma matriz unidimensional pode ser diretamente comparada com uma lista do Python porque ambos armazenam uma lista de números. Da mesma forma, os dados em uma matriz são chamados de elementos e estes são acedidos utilizando parêntesis rectos[].
Uma matriz bidimensional tem uma estrutura de grid com linhas e colunas.
E uma matriz tridimensional pode ser pensado como uma pilha de matrizes bidimensionais.

Matrizes NumPy são de um tamanho fixo, indexados a partir de 0, e contém os elementos de todas do mesmo tipo. Eles são objetos ndarray e são criados usando a função np.array().

Por exemplo:

import numpy as np
b = np.array ([1, 2, 3, 4])

O código acima cria uma matriz unidimensional com quatro constantes.
matrizes Numpy referem-se a dimensões como os eixos e o número de eixos que é posto. Portanto, b representa uma matriz de rank 1.

Existem várias funções numpy para descrever uma matriz e dos seus elementos, como demonstrado no código abaixo:

import numpy as np

# Cria uma matriz de rank 2
my_arr = np.array([
[1,2,3,4],
[5,6,7,8]
])

print(my_arr)
# [[1 2 3 4]
# [5 6 7 8]]

print(my_arr[1, 2]) # acessa um único elemento
# 7

print(my_arr.ndim) # o rank
# 2

print(my_arr.shape) # n linhas, colunas m
# (2, 4)

print(my_arr.size) # número de elementos
# 8

print(type(my_arr)) # tipo de elemento
#

Nota: Note-se a utilização de colchetes ao criar o array. Colchetes também são usados ​​ao acessar um elemento.
=========================
1.8K viewsFoxxer, edited  17:52
Aberto / Como
2019-12-03 20:52:21 Tudo o que irá cair no curso de NumPy:
1 - A biblioteca NumPy
2 - Criando arrays NumPy
3 - Criando uma sequência
4 - Mudando shape e size de arrays
5 - Fatiamento (slice) de arrays
6 - Funções aritméticas
7 - Elementwise de funções
8 - Funções de arrays
9 - Broadcasting
4.8K viewsFoxxer, 17:52
Aberto / Como
2019-08-13 21:40:54 o curso irá continuar, em breve falaremos dos conceitos de programação assincrona e multi-threading. Depois do curso de NumPy ou de PHP
1.8K viewsFoxxer, 18:40
Aberto / Como
2019-08-12 07:43:49 se extendermos o curso talvez falaremos sobre:
- programação assincrona
- multi-threading
1.7K viewsFoxxer, 04:43
Aberto / Como
2019-08-12 07:42:07 e é isso galera, terminamos o nosso curso de Python, mas pensamos seriamente em extendê-lo mais um (ou dois) módulos, então deixamos o futuro deste canal na mão de vocês:
1.5K viewsFoxxer, 04:42
Aberto / Como