Skip to content

Commit

Permalink
feat: continuidade capítulo sobre funções
Browse files Browse the repository at this point in the history
  • Loading branch information
HenriqueAJNB committed Sep 10, 2024
1 parent 8f28e97 commit 69d284e
Showing 1 changed file with 173 additions and 0 deletions.
173 changes: 173 additions & 0 deletions book/08-funcoes/01-introducao.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,171 @@
" ...\n",
"\n",
"funcao_sem_parametros() # Aqui é onde estamos chamando a função, e o bloco de código dela será executado\n",
"```\n",
"\n",
"Vamos começar com um exemplo de uma função customizada que não existe na lista de funções nativas do Python. Vamos criar uma função que calcula a média de uma sequência de números. Conceitualmente, a média aritmética simples é a soma de todos os elementos dividida pelo número de elementos. Já existe a função `sum()` que calcula a soma de uma dada sequencia e `len()` que calcula o tamanho da sequência, então podemos usar essas duas funções para calcular a média. Vamos ver como fazer isso."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3.0\n"
]
}
],
"source": [
"def calcula_media(valores):\n",
" return sum(valores) / len(valores)\n",
"\n",
"\n",
"valores_exemplo = [1, 2, 3, 4, 5]\n",
"\n",
"media = calcula_media(valores_exemplo)\n",
"print(media)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Aqui definimos a função e a usamos em seguida para calcular a média da lista `valores_exemplo`. O resultado da função `calcula_media` é armazenado na variável `media` e depois é impresso na tela.\n",
"\n",
"É possível reaproveitar a mesma função para calcular a média de outras sequências de números, bastando passar as diferentes sequências como argumento."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"As médias são, respectivamente, 3.0, 63.8 e 663.0\n"
]
}
],
"source": [
"def calcula_media(valores):\n",
" return sum(valores) / len(valores)\n",
"\n",
"\n",
"lista1 = [1, 2, 3, 4, 5]\n",
"lista2 = [45, 74, 50, 99, 51]\n",
"lista3 = [548, 781, 961, 473, 552]\n",
"\n",
"media1 = calcula_media(lista1)\n",
"media2 = calcula_media(lista2)\n",
"media3 = calcula_media(lista3)\n",
"\n",
"print(f\"As médias são, respectivamente, {media1}, {media2} e {media3}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Escopo de variáveis"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"É possível criar variável dentro de funções, porém uma variável só estará disponível dentro do escopo que ela foi criada. Elas só vão existir enquanto a função for executada. É o que chamamos de escopo local. Se você tentar acessar uma variável criada dentro de uma função fora dela, você terá um erro. Vamos ver um exemplo:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"tags": [
"raises-exception"
]
},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'x' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[1;32mIn[3], line 5\u001b[0m\n\u001b[0;32m 2\u001b[0m x \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m10\u001b[39m\n\u001b[0;32m 3\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mA variável x dentro da função é \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mx\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m----> 5\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[43mx\u001b[49m)\n",
"\u001b[1;31mNameError\u001b[0m: name 'x' is not defined"
]
}
],
"source": [
"def exemplo_escopo_local():\n",
" x = 10\n",
" print(f\"A variável x dentro da função é {x}\")\n",
"\n",
"\n",
"print(x)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"O erro `NameError: name 'x' is not defined` ocorre porque a variável `x` foi criada dentro da função `exemplo_escopo_local`. Isso significa que `x` só existe enquanto o código está sendo executado dentro dessa função. Se você tentar acessar `x` fora da função, o Python não conseguirá encontrá-la, resultando nesse erro.\n",
"\n",
"O mesmo vale para os parâmetros de uma função: eles só existem no escopo interno da função e não podem ser acessados de fora.\n",
"\n",
"Todas as variáveis definidas no escopo principal (fora de qualquer função) são chamadas de variáveis globais. Elas podem ser acessadas de qualquer lugar do código, inclusive de dentro de funções. E sinceramente, o Python é bem confuso e neste ponto, pois ele dá abertura para algumas más práticas de programação que tornanm o código dificil de entender, apesar do código funcionar. Vejamos um exemplo:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"A variável x dentro da função é 10\n",
"A variável x fora da função é 20\n"
]
}
],
"source": [
"x = 20 # variável definida no escopo global\n",
"\n",
"\n",
"def exemplo_escopo_global():\n",
" x = 10 # variável definida no escopo local da função\n",
" print(f\"A variável x dentro da função é {x}\")\n",
"\n",
"\n",
"exemplo_escopo_global()\n",
"print(f\"A variável x fora da função é {x}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Percebam como fica confuso! Temos um `x` global e um `x` local, e o Python não reclama disso. Isso é um problema, pois se você não tomar cuidado, você pode acabar entendendo errado e fazendo confusão com os valores.\n",
"\n",
"```{admonition} Dica profissional (variáveis globais e locais)\n",
":class: tip\n",
"Não use variáveis globais e locais com o mesmo nome pois dá margem para confusão e erros! Busque sempre usar nomes diferentes para variáveis globais e locais. \n",
"```\n",
"\n",
"Existe ainda uma palavra reservada chamada `global` para permitir o uso de variáveis globais dentro de funções, e o entendimento do código pode ficar pior ainda! Por isso nem gosto de ensinar esta abordagem por ser considerada uma má prática. \n",
"\n",
"```{admonition} Perigo (variáveis globais)\n",
":class: danger\n",
"Evite ao máximo usar variáveis globais dentro de funções! Se você precisar de um valor de fora da função, passe esse valor como parâmetro. Isso torna o código mais legível e menos propenso a erros.\n",
"```"
]
}
Expand All @@ -203,7 +368,15 @@
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.2"
}
},
Expand Down

0 comments on commit 69d284e

Please sign in to comment.