区分初学者和经验丰富的9种Python编程技能

在Python开发人员课程开始之前,准备了本文的翻译




Python是一种很棒的语言。它的语法非常简单,您甚至不必在代码中寻找多余的分号。我什至会说Python是新手最好的语言之一。

您从大量的库开始,并随着获得编程经验而向它们添加越来越多的库。

一段时间后,当您发现为一个简单的操作编写了过多的代码时,您可能会感到困惑。实际上,这并不像您想的那样糟糕。了解工作的逻辑比行数重要得多。短代码更好,但是如果逻辑中断,您的代码将无法按预期工作。但是,凭借经验和创新的工作方法,您的代码将变得越来越短和更好。

初学者还是经验丰富?


那么,在Python编程方面,初学者与经验丰富的程序员有什么区别?

在本文中,我将重点关注以下问题:

  • 解决问题和提问的艺术
  • 了解为什么代码有效(或无效)
  • 使用琴弦
  • 使用清单
  • 使用循环
  • 使用函数(和适当的术语)
  • 面向对象编程
  • 尊重PEP

解决问题和提问的艺术


作为一名程序员,我要说的是,如果您没有足够的解决问题的经验,那么您将很难开始编写出色的代码。如果您遇到的问题是解决问题,那么找到最佳的解决方案可能并不容易。编程不仅仅是编写代码。解决问题的技能是您需要从新手类别中爬出来的技能。

提出有关编程的问题也很重要。如果您只是要求某人为您解决问题,而不尝试任何事情,那么您在做错事。这并不容易,但是如果您不尝试自己解决问题,那么别人的解决方案将不会给您带来任何好处。

如果您想知道我是如何提出编程问题的,这里是另一篇有关它的文章。

问题xy


“我需要获取字符串中的最后三个字符。”
“不,不需要!您需要获取文件扩展名。”

问题XY是一件非常有趣的事情。您有一个问题X,当您致电支持人员时,您会询问问题Y,您认为该问题的解决方案将解决问题X。[1]

上述情况很好地说明了这种情况。如果要获取文件扩展名,则可以假定需要该行的最后3个字符。

它可能是什么样的:

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

完美!好了,现在尝试一下,photo_of_lochness.jpeg
用户可以从一开始就询问扩展名。问题Y是最后三个字符。问题X是扩展。

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

就这样!

您也可以使用标准库os.path.splitext()
您可以在这里熟悉它

了解为什么代码有效(或无效)


新手时,您可以磨一小段代码几天。当此代码突然开始工作时,您会感到放心,然后继续进行下一部分。这是您最糟糕的事情。静默地接受代码仅能正常工作,而不理解为什么它会工作,这比不理解为什么代码在原理上不工作更加危险。

不了解为什么您的代码始终无法工作。当消除所有错误并最终找出解决方案为什么不起作用时,考虑它为什么不起作用以及最终使代码正确工作的原因非常重要。您将通过所有程序携带这些知识。

例如,如果您在从具有多个块的代码的行首开始缩进时出错,则可以随机开始移动块,然后在程序最终启动时形成。
请记住,在大多数IDE中,您可以折叠循环(如果是)。因此,您可以轻松查看哪个单元适合您,哪个不适合。


ATOM与右侧折叠的if-else结构。

另一个很酷的方式直观地看到你的代码是如何工作的www.pythontutor.com,在那里你可以看到一行程序行会发生什么。


pythontutors中的代码执行

使用琴弦


当前部分不完全是关于行的。它更多地是关于挖掘伟大的Python库的。在Python中,我们很早就知道字符串可以被视为字符列表。您可以按索引访问字符串中的字符。

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

一个有好奇心的人知道它提供了什么str(),但是您可以继续写作而无需查阅文档str()。要调用函数的文档,您可以编写help(str)dir(str)。当您执行此操作时,您可以找到甚至不怀疑其存在的方法。您可能已经看过文档,并且知道字符串有一个方法endswith(),例如,您可以将其应用到某个地方。



这是一个以两种不同方式执行相同操作的代码示例。第一个选项是使用split,这是我们最近讨论过的。第二个- endswith()您可以在文档中找到。

大多数程序员永远不会阅读所有文档并学到所有东西。程序员工作的重要部分是知道从哪里寻找有关如何解决问题的信息。

使用清单


列表是一件很棒且用途广泛的事情。
例如,这里我们混合使用整数值和字符串:

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)}')



看看我们如何混合它们。如果尝试对列表进行排序,则会出现错误。

print (my_list.sort())



如果我们需要将字母和数字分开怎么办?第一种方法是使用循环来解决问题,在循环中我们将检查列表的每个元素。初学者将尽早了解循环,因为循环是编程中的重要组成部分。

该代码可能看起来像这样:

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

这是正确的方法,但有点麻烦。该代码有效,但是您可以做到这一点,以相同的方法解决问题,但是只需一行!

如果您想更快乐,请了解列表表达式在Python中的工作方式。这是相同的问题,但通过了解列表的工作方式得以解决:

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


就这样!

这还不是终点。您可以使用filter以获得相同的结果。

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)




正如您可能已经了解的那样,有很多方法可以解决相同的问题。您必须意识到,它最适合您和您的团队。

奖金

  • 翻转列表(或行):

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

  • 合并列表项:

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

使用循环


您遇到过类似的代码吗?

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]}')

您可能会从其他语言中学习这种构造,但这与Python的方法相去甚远。在Python中,您将使用:

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

您会很快注意到没有索引。如果要对索引进行操作怎么办?在Python中,您可以利用enumerate这是访问所需内容的好方法!

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



使用函数(和适当的术语)


在制作动画时,我总是说如果您做5次相同的事情,那么您需要考虑是否需要一个程序?有时,花了两个星期开发工具后,您可以节省六个星期的工作。当您编写代码并了解自己多次执行相同的操作时,需要考虑是否将此代码编码为过程或函数。该函数将返回一些值,并且该过程将仅执行代码。在第一个示例中,您将看到该过程,在第二个示例中,您将看到该函数。

听起来很混乱。这是一个反映操作原理的图示:请



注意print之间的区别return。看起来它们的工作方式相同,但是如果查看输出,您将看到该函数将简单地返回传递的名称。

以下应明确区分的术语是参数和参数。参数是过程或函数中定义的参数(图中红色突出显示),传递给过程或函数的是参数(绿色突出显示)。

这里有些例子。

例子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'])



我将不再在程序中编写三遍,而是在过程中编写一次,并在需要时调用它。在第二个示例中,您可以看到函数如何返回反向列表。

例子2

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

面向对象编程


Python是一种面向对象的语言,对象具有强大的功能。将对象视为图形-如果使用图形,则会创建该对象的实例。因此,您可以根据需要创建任意多个实例,并且在使用它们时不会破坏原始图形中的任何内容。

面向对象编程(OOP)是一个巨大的主题,因此本节不包含您需要了解的所有内容,但是我们将讨论一些简单的示例,这些示例将对您的工作有所帮助。

如果您以前曾经阅读过有关OOP的文章,则可能已经厌倦了学习,但现在又来了。让我们从定义一个类开始Student。它将具有名称(name)和学科列表(subject_list):

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

__init__是该类的构造函数。它定义了类的核心。稍后,您将看到如何添加方法。方法是属于某个类的过程或函数,在程序内部使用该类时可以调用它们。
如果要创建学生,将创建以下变量:

student1 = Student('Martin Aaberge')

如果需要更多的学生,则将使用同一班级并创建一个新对象。

student2 = Student('Ninja Henderson')

并且student1student2将是该类的实例Student它们具有相同的方案,但是没有更多共同之处。目前,我们对学生几乎无能为力,但我们增加了一系列学科。要填充此列表,我们将创建一个单独的方法。您可以调用方法与类实例进行交互。

让我们更新类:

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()

现在,该课程可用于创建学生,编辑并获取有关他们的信息。

#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()

通常,类存储在单独的文件中,然后导入代码中。在我们的示例中,我们Student在文件中创建了一个类student.py并将其导入到文件中main.py(在这种情况下,两个文件都在同一文件夹中)。

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



尊重人


您可能经常看到人们在编写Python代码,却根本不考虑PEP。当您在开发环境中工作时,遵循标准(如果不是PEP标准,那么至少是公司的标准)非常重要。

PEP是针对您的代码的建议集。这是指向PEP-8的链接很棒的阅读。至少阅读一次以了解其含义。一个典型的例子就是这个snake_casePython中的变量是用snake_case编写的,即变量名中的单词用下划线分隔。即使在大学,他们有时也会学习不正确,因此不要灰心,而只是开始按规则写作。

那就对了:

chocolate_cake = 'yummy'

这是-否:

chocolateCake = 'Yummy'

结论


成为新手真是太神奇了。您的道路并不容易,但是您的学习曲线将会陡峭,并为您带来新的体验!停止成为新手可能很困难。有时很难理解您需要关注的重点。下一步将是什么?

也许这篇文章会把您推向正确的方向,或者对您而言,这只是您已经知道的一堆随机聊天。如果您不确定下一步该怎么做,不要害怕问。确保遵循那些比您经验丰富的人的建议。对不同意见持开放态度,并找出最适合您的方法。如果您还没有准备好使用某些编写代码的方法,请以一种对您方便的方式编写代码,直到您学习新的更好的代码为止。

资料来源:

[1]第XY期,en.wikipedia.org / wiki / XY_problem



免费课程:自动测试简介



All Articles