9 habilidades de programação em Python que distinguem um iniciante de um experiente

Uma tradução do artigo foi preparada antes do início do curso Python Developer .




Python é uma linguagem fantástica. Sua sintaxe é tão simples que você nem precisa procurar um ponto e vírgula extra em seu código. Eu diria até que o Python é uma das melhores linguagens para um novato.

Você começa com um extenso conjunto de bibliotecas e adiciona mais e mais a elas à medida que ganha experiência em programação.

Depois de um tempo, você pode sentir que está preso quando descobriu que escreveu muito código para uma operação simples. De fato, isso não é tão ruim quanto você imagina. Compreender a lógica do que você está trabalhando é muito mais importante que o número de linhas. O código curto é melhor, mas se a lógica for quebrada, seu código não funcionará conforme o esperado. Mas com experiência e uma abordagem criativa para o trabalho, seu código se tornará mais curto e melhor.

Iniciante ou experiente?


Então, o que distingue um iniciante de um programador experiente quando se trata de programação em Python?

Neste artigo, gostaria de focar nos seguintes problemas:

  • Resolução de problemas e a arte de fazer perguntas
  • Entendendo por que o código funciona (ou não)
  • Trabalhar com strings
  • Trabalhar com listas
  • Usando loops
  • Usando funções (e terminologia apropriada)
  • Programação orientada a objetos
  • Respeito pelo PEP

Resolução de problemas e a arte de fazer perguntas


Como programador, direi que, se você não tiver experiência suficiente na solução de problemas, será difícil começar a escrever um código excelente. Se você tiver problemas na solução de problemas, provavelmente não será fácil encontrar as melhores soluções para seus problemas. Programar não é apenas escrever código. A habilidade de resolução de problemas é a habilidade necessária para sair da categoria de iniciante.

Fazer perguntas sobre programação também é muito importante. Se você apenas pedir a alguém para resolver o problema, sem tentar nada, está fazendo a coisa errada. Isso não é fácil, mas se você não tentar resolver os problemas sozinho, não obterá nenhum benefício com a solução de outra pessoa para o seu problema.

Se você quiser saber como eu formulo perguntas de programação, aqui está um artigo separado.

Problema xy


"Eu preciso obter os três últimos caracteres em uma string."
"Não, não precisa! Você precisa obter a extensão do arquivo. ”

O problema XY é uma coisa muito engraçada. Você tem o problema X e, quando liga para o suporte, pergunta sobre o problema Y, cuja solução, como você pensa, resolverá o problema X. [1]

O caso descrito acima ilustra bem essa situação. Se você deseja obter a extensão do arquivo, pode presumir que precisa dos 3 últimos caracteres da linha.

Como pode ser:

def extract_ext(filename):
    return filename[-3:]
print (extract_ext('photo_of_sasquatch.png'))
>>> png

Perfeitamente! Bem, agora tente com.Um photo_of_lochness.jpeg
usuário pode perguntar sobre a extensão desde o início. O problema Y é os três últimos caracteres. O problema X é uma extensão.

def extract_ext(filename):
    return filename.split('.')[-1]
print (extract_ext('photo_of_sasquatch.png'))
print (extract_ext('photo_of_lochness.jpeg'))
>>> png
>>> jpeg

Isso é tudo!

Você também pode usar a biblioteca padrão os.path.splitext().
Você pode se familiarizar com isso aqui .

Entendendo por que o código funciona (ou não)


Quando você é novo, pode triturar um pequeno pedaço de código por vários dias. E quando esse código começar a funcionar repentinamente, você sentirá alívio e passará para a próxima parte. E esta é a pior coisa que você pode fazer. Aceitar silenciosamente que o código simplesmente funciona e não entender por que funciona é provavelmente ainda mais perigoso do que não entender por que o código não funciona em princípio.

Não entender por que seu código não funciona acontece o tempo todo. Quando você elimina todos os erros e finalmente descobre por que a solução não funcionou, é muito importante pensar sobre por que não funcionou e o que finalmente fez o código funcionar corretamente. Você transmitirá esse conhecimento através de todos os seus programas.

Por exemplo, se você tiver um erro ao recuar no início de uma linha no código com vários blocos, poderá começar a mover blocos aleatoriamente e formar-se quando o programa finalmente iniciar.
Lembre-se de que na maioria dos IDEs você pode recolher loops e if . Assim, você pode ver facilmente qual unidade funciona para você e qual não funciona.


ATOM com construções if-else dobradas à direita

Outra maneira legal de ver visualmente como seu código funciona é www.pythontutor.com , onde você pode ver o que acontece no seu programa linha por linha.


Execução de código em pitontutores

Trabalhar com strings


A seção atual não é inteiramente sobre linhas. É mais sobre cavar nas grandes bibliotecas Python. No Python, aprendemos cedo que uma string pode ser vista como uma lista de caracteres. Você pode acessar um caractere em uma string pelo índice.

word = 'supergreat'
print (f'{word[0]}') 
>>> s
print (f'{word[0:5]}')
>>> super

Uma mente curiosa aprende sobre o que ela oferece str(), mas você pode continuar escrevendo sem nunca olhar para a documentação str(). Para chamar a documentação da função, você pode escrever help(str)ou dir(str). Ao fazer isso, você pode encontrar métodos cuja existência nem sequer era suspeita. Você pode ter examinado a documentação e sabe que as seqüências de caracteres têm um método endswith(), por exemplo, e você pode aplicá-lo em algum lugar.



Aqui está um exemplo de código que faz a mesma coisa de duas maneiras diferentes. A primeira opção é usada split, sobre a qual falamos recentemente. E no segundo - endswith()que você pode encontrar na documentação.

A maioria dos programadores nunca lerá toda a documentação e aprenderá tudo. Uma parte importante do trabalho de um programador é saber onde procurar informações sobre como resolver um problema.

Trabalhar com listas


As listas são ótimas e versáteis.
Por exemplo, aqui misturamos valores inteiros e seqüências de caracteres:

my_list = ['a' , 'b' , 'n' , 'x' , 1 , 2 , 3, 'a' , 'n' , 'b']
for item in my_list:
    print (f'current item: {item}, Type: {type(item)}')



Veja como nós os misturamos. Se tentarmos classificar a lista, obteremos um erro.

print (my_list.sort())



E se precisarmos separar letras dos números? A primeira maneira é resolver o problema usando um loop no qual verificaremos cada elemento da lista. Um iniciante conhecerá os ciclos mais cedo, porque os loops são uma parte importante da programação.

O código pode ser algo como isto:

my_list = ['a' , 'b' , 'n' , 'x' , 1 , 2 , 3 , 'a' , 33.3 , 'n' , 'b']
number_list = []
string_list = []
for item in my_list:
    print (f'current item: {item}, Type: {type(item)}')
    if not isinstance(item,str):
        number_list.append(item)
    else:
        string_list.append(item)
my_list = string_list

Esta é a abordagem correta, mas um pouco complicada. O código funciona, mas você pode fazê-lo para que o problema seja resolvido pelo mesmo método, mas em uma linha!

Se você quiser ser mais feliz, saiba como as expressões de lista funcionam no Python. Aqui está o mesmo problema, mas resolvido com um entendimento de como as listas funcionam:

my_list = [letter for letter in my_list if isinstance(letter,str)]


Isso é tudo!

E este não é o fim. Você pode usar filterpara obter o mesmo resultado.

def get_numbers(input_char):
    if not isinstance(input_char,str):
        return True
    return False

my_list = [1,2,3,'a','b','c']
check_list = filter(get_numbers, my_list)
for items in check_list:
    print(items)




Como você provavelmente já entendeu, existem muitas maneiras de resolver o mesmo problema. Você deve estar ciente de que funcionará melhor especificamente para você e sua equipe.

Bônus

  • Virar uma lista (ou linha):

names = ['First' , 'Middle' , 'Last']
print(names[::-1])
>>> ['Last', 'Middle', 'First']

  • Combinando itens da lista:

names = ['First' , 'Middle' , 'Last']
full_name = ' '.join(names)
print(f'Full Name:\n{full_name}')
>>> First Middle Last

Usando loops


Você conheceu código semelhante?

greek_gods = ['Zeus' , 'Hera' , 'Poseidon' , 'Apollo' , 'Bob']
for index in range(0,len(greek_gods)):
    print (f'at index {index} , we have : {greek_gods[index]}')

Você provavelmente aprenderá esse construto em outras linguagens, mas isso está longe da abordagem do Python. No Python você usará:

for name in greek_gods:
    print (f'Greek God: {name}')

Você notará rapidamente que não há índice. E se você quiser operar em um índice? No Python, você pode aproveitar enumerate. Essa é uma ótima maneira de acessar tudo o que você precisa!

for index, name in enumerate(greek_gods):
    print (f'at index {index} , we have : {name}')



Usando funções (e terminologia apropriada)


Quando trabalho com animação, sempre digo que, se você faz a mesma coisa 5 vezes, precisa pensar se precisa de um programa? Às vezes, depois de passar duas semanas desenvolvendo uma ferramenta, você pode economizar seis semanas de trabalho. Quando você escreve um código e entende que está executando a mesma ação várias vezes, precisa pensar em codificar esse código em um procedimento ou função. A função retornará algum valor e o procedimento simplesmente executará o código. No primeiro exemplo, você vê o procedimento e, no segundo, a função.

Parece confuso. Aqui está uma ilustração que reflete o princípio de operação:



Preste atenção à diferença entre printe return. Pode parecer que eles funcionam da mesma maneira, mas se você observar a saída, verá que a função retornará simplesmente o nome passado.

Os seguintes termos que devem ser claramente separados são argumentos e parâmetros. Os parâmetros são definidos no procedimento ou função (destacados em vermelho na figura) e o que você passa para o procedimento ou função são argumentos (destacados em verde).

Aqui estão alguns exemplos.

Exemplo 1

def print_list(input_list):
    for each in input_list:
        print(f'{each}')
    print() #just to separate output
greek_gods = ['Zeus' , 'Hera' , 'Poseidon' , 'Apollo' , 'Bob']
grocery_list = ['Apples' , 'Milk' , 'Bread']
print_list(greek_gods)
print_list(grocery_list)
print_list(['a' , 'b' , 'c'])



Em vez de escrever o ciclo três vezes, escreverei uma vez no procedimento e ligo quando precisar. E no segundo exemplo, você pode ver como a função retorna uma lista invertida.

Exemplo 2

def reverse_list(list_input):
    return list_input[::-1]
my_list = ['a', 'b' , 'c']
print (reverse_list(my_list))
>>> ['c', 'b', 'a']

Programação orientada a objetos


Python é uma linguagem orientada a objetos e há muito poder em objetos. Pense em um objeto como um desenho - se você usar um desenho, crie uma instância dele. Assim, você pode criar quantas instâncias quiser e não estragar nada no desenho original ao usá-las.

A programação orientada a objetos (OOP) é ​​um tópico enorme; portanto, esta seção não contém tudo o que você precisa saber sobre ela, mas falaremos sobre alguns exemplos simples que ajudarão você em seu trabalho.

Se você já leu sobre OOP antes, provavelmente está cansado de estudar, mas aqui está novamente. Vamos começar definindo uma classe Student. Ele terá um nome ( name) e uma lista de disciplinas ( subject_list):

class Student():
    def __init__(self,name):
        self._name = name
        self._subject_list = []

Aqui __init__está o construtor da classe. Ele define o núcleo da classe. Mais tarde, você verá como os métodos são adicionados. Métodos são procedimentos ou funções pertencentes a uma classe que pode ser chamada ao usar a classe dentro do programa.
Se você deseja criar um aluno, criará a seguinte variável:

student1 = Student('Martin Aaberge')

Se precisar de mais alunos, você usará a mesma turma e criará um novo objeto.

student2 = Student('Ninja Henderson')

E student1, e student2serão instâncias da classe Student. Eles têm o mesmo esquema, mas não têm mais nada em comum. No momento, podemos fazer pouco com os alunos, mas adicionamos uma lista de disciplinas. Para preencher esta lista, criaremos um método separado. Você pode chamar métodos para interagir com instâncias de classe.

Vamos atualizar a classe:

class Student():
    def __init__(self,name):
        self._name = name
        self._subject_list = []
    def add_subject(self, subject_name):
        self._subject_list.append(subject_name)
    def get_student_data(self):
        print (f'Student: {self._name} is assigned to:')
        for subject in self._subject_list:
            print (f'{subject}')
        print()

Agora, essa turma pode ser usada para criar, editar e obter informações sobre eles.

#create students:
student1 = Student('Martin Aaberge')
student2 = Student('Heidi Hummelvold')
#add subjects to student1
student1.add_subject('psychology_101')
student1.add_subject('it_security_101')
#add subject to student2
student2.add_subject('leadership_101')
#print current data on students
student1.get_student_data()
student2.get_student_data()

Normalmente, as classes são armazenadas em arquivos separados e importadas para o código. Em nosso exemplo, criamos uma classe Studentem um arquivo student.pye a importamos para nosso arquivo main.py. (Nesse caso, os dois arquivos estão na mesma pasta).

from student import Student
student1 = Student('Martin')
student1.add_subject('biomechanics_2020')
student1.get_student_data()



Respeite o pep


Talvez você frequentemente veja pessoas escrevendo código Python e nem pense em PEP. Talvez eu mesmo faça isso algumas vezes: quando você trabalha em um ambiente de desenvolvimento, é muito importante seguir os padrões, se não os padrões de PEP, e pelo menos os padrões de sua empresa.

O PEP é uma recomendação definida para o seu código. Aqui está o link para o PEP-8 . Ótima leitura. Leia pelo menos uma vez para entender do que se trata. Um exemplo clássico é esse snake_case. As variáveis ​​no Python são escritas em snake_case, ou seja, as palavras no nome da variável são separadas usando sublinhados. Mesmo nas universidades, às vezes aprendem incorretamente, portanto, não desanime e comece a escrever de acordo com as regras.

Está certo:

chocolate_cake = 'yummy'

E aqui está - não:

chocolateCake = 'Yummy'

Conclusão


Ser um novato é incrível. Seu caminho não será fácil, mas sua curva de aprendizado será íngreme e proporcionará uma nova experiência! Parar de ser um novato pode ser difícil. Às vezes, é difícil entender o que você precisa focar. Qual será o próximo passo?

Talvez este artigo o leve na direção certa, ou talvez para você tenha sido apenas um monte de conversas aleatórias que você já conhece. Se você não tem certeza para onde ir a seguir, não tenha medo de perguntar. Siga os conselhos daqueles que são mais experientes que você. Esteja aberto a opiniões diferentes e descubra o que é certo para você. Se você não estiver pronto para usar certas maneiras de escrever código, escreva de uma maneira que seja conveniente até você aprender novas e melhores.

Fontes:

[1] Edição XY, en.wikipedia.org/wiki/XY_problem



Lição gratuita: Introdução aos testes automáticos



All Articles