在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
。看起来它们的工作方式相同,但是如果查看输出,您将看到该函数将简单地返回传递的名称。以下应明确区分的术语是参数和参数。参数是过程或函数中定义的参数(图中红色突出显示),传递给过程或函数的是参数(绿色突出显示)。这里有些例子。例子1def print_list(input_list):
for each in input_list:
print(f'{each}')
print()
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'])
我将不再在程序中编写三遍,而是在过程中编写一次,并在需要时调用它。在第二个示例中,您可以看到函数如何返回反向列表。例子2def 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')
并且student1
和student2
将是该类的实例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()
现在,该课程可用于创建学生,编辑并获取有关他们的信息。
student1 = Student('Martin Aaberge')
student2 = Student('Heidi Hummelvold')
student1.add_subject('psychology_101')
student1.add_subject('it_security_101')
student2.add_subject('leadership_101')
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_case
。Python中的变量是用snake_case编写的,即变量名中的单词用下划线分隔。即使在大学,他们有时也会学习不正确,因此不要灰心,而只是开始按规则写作。那就对了:chocolate_cake = 'yummy'
这是-否:chocolateCake = 'Yummy'
结论
成为新手真是太神奇了。您的道路并不容易,但是您的学习曲线将会陡峭,并为您带来新的体验!停止成为新手可能很困难。有时很难理解您需要关注的重点。下一步将是什么?也许这篇文章会把您推向正确的方向,或者对您而言,这只是您已经知道的一堆随机聊天。如果您不确定下一步该怎么做,不要害怕问。确保遵循那些比您经验丰富的人的建议。对不同意见持开放态度,并找出最适合您的方法。如果您还没有准备好使用某些编写代码的方法,请以一种对您方便的方式编写代码,直到您学习新的更好的代码为止。资料来源:[1]第XY期,en.wikipedia.org / wiki / XY_problem
免费课程:自动测试简介