Python 是一种很棒的语言,语法简略,无需在代码中搜寻分号。对于初学者来说,Python 是入门最简略的语言之一。
Python 有大量的库反对,你还能够装置其余库来减少本人的编程教训。学了一阵子之后,你可能会感觉:为如此简略的操作写大量的代码有些令人困惑。实际上,事件并没有你想得那么糟。了解其背地的逻辑比写几行代码更为重要。
短代码更好,但如果逻辑有问题,那么无论如何你的代码都会有问题。随着教训和创造力的增长,最终你的代码将会变得更短、更好。
1. 初学者与中级程序员
那么,对于 Python 程序员而言,初学者和进阶者有什么区别呢?本文将重点介绍以下方面:
•解决问题和提出问题;
•XY 问题;
•了解代码为何起作用(或不起作用);
•应用字符串;
•应用列表;
•应用循环;
•应用函数(并正确议论函数);
•面向对象编程;
•尊重 PEP。
1. 解决问题和提出问题:
程序员不足解决问题能力的话,代码杰出也是枉然。如果你解决问题的思维不够发达,可能就无奈为你要解决的问题找到最佳的解决方案。
编程不仅仅是编写代码,须要解决问题能力有机会出初学者行列。提出编程相干的问题也很重要。如果不经尝试,就让他人解决你的问题,可能也会出局。
2.XY 问题:
“我须要从字符串中提取最初 3 个字符。”
“不,你不须要。只需文件扩展名。”
XY 问题很乏味。你有个 X 问题,当你调用服务中心时,会寻求 Y 问题的解决方案,以解决 X 问题。下面的案例就是极好的例子。如果想要文件名中的文件扩展名,很容易假如你须要的是最初 3 个字母。如何写代码:
def extract_ext(filename):
return filename[-3:]
print (extract_ext('photo_of_sasquatch.png'))
>>> png
好极了,当初换成 photo_of_lochness.jpeg:
用户从一开始应该会索要扩展名,最初 3 个字母是 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()
,点击这里查看:os.path.splitext():https://www.geeksforgeeks.org…。
3. 了解代码为何起作用(或不起作用):
作为老手,你可能要花几天来凑合一小段代码。如果这段代码忽然起作用了,你可能会感觉释怀,而后持续下一段代码。这是最蹩脚的事件之一。
不了解起因只管运行的做法,可能比不了解代码的为什么不运行更加危险。不了解为何代码不运行的状况总会产生,当进行故障排除并搞清楚其起因时,思考代码不运行的起因和最终使其运行的因素十分重要。这次学到的常识会带到下一个程序中。
例如,如果多个缩进级别的代码中呈现了缩进谬误,能够尝试随机调整代码块,而后在最终运行时为本人庆贺。切记,在大多数 IDE 中,能够折叠循环和 if 语句,从而更容易查看正在应用的局部。
右侧是折叠了 if/else 语句的 ATOM 另一种方法是将你的代码通过 www.pythontutor.com 可视化,就能够逐行查看代码运行的形式了。
4. 应用字符串:
这部分内容其实与字符串不齐全相干,与开掘 Python 优雅的库有更大关系。咱们很早就在 Python 中学过,字符串也能够看作是一串字符。你也能够应用索引拜访字符串中的字符。
word = 'supergreat'
print (f'{word[0]}')
>>> s
print (f'{word[0:5]}')
>>> super
敏锐的学习者会查看 str()
所提供的内容,但也能够不查看 str()
文档持续编程。查看函数或过程文档能够通过调用 help(str)
或者 dir(str)
来实现。执行此操作时,你可能会发现一些并不知道的办法,兴许你在查看 str()
时,找到有个名叫 endswith()
的办法,或者能用在某处。
上面是一些以两种不同形式执行雷同操作的代码案例,一种用到了咱们才谈过的拆分,还有一种用到了咱们刚刚学到的 endswith()
:
filenames = ['lochness.png' , 'e.t.jpeg' , 'conspiracy_theories_CONFIRMED.zip']
# 1: Using ENDSWITH
for files in filenames:
if files.endswith('zip'):
print(f'{files} is a zip file')
else:
print (f'{files} is NOT a zip file')
# 2: Using SPLIT
for files in filenames:
if files.split('.')[-1] == 'zip':
print(f'{files} is a zip file (using split)')
else:
print (f'{files} is NOT a zip file (using split)')
大多程序员是从来不会把所有文档读遍来学习全部内容的。作为一名程序员,局部工作就是要搜寻如何解决问题的信息。
5. 应用列表:
列表很棒,用处也很宽泛。上面的案例中,咱们将整数和字符串混合在了一起:
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)]
就是这样!还没完结!应用过滤器也能够取得同样的后果:
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
6. 应用循环:
是否在 Python 中见过这样的代码?
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-each 循环:
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}')
7. 应用函数(并正确议论函数):
我在从事动画工作时,总是说如果同一个操作反复 5 次,就应该思考是否须要写个程序。有些时候花上两周开发一款工具能够节俭你六个礼拜的工作工夫。
编写代码时,如果发现同一动作执行了不止一次,应该思考这是过程还是函数,还不只是写写代码。函数会返回内容,过程则只是运行代码,第一个案例是个过程,第二个是函数。这样说可能会令人困惑,上面是其工作原理的示意图:
留神 print 和 return 的差别,看起来兴许很类似,但如果你查看输入后果,函数只会返回发送的名称。下一个要理解的语法是 parameters 和 arguments,在过程或函数中定义时(红色局部)被称为形参(parameters),当发送名称到过程或函数中(绿色局部)时就叫实参(arguments)了。上面是些案例:
案例 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'])
无需把循环写上 3 次,只需在过程中写上一次,而后在须要时调用即可。在案例 2 中,你能够发现代码是如何返回反向列表的。
案例 2
def reverse_list(list_input):
return list_input[::-1]
my_list = ['a', 'b' , 'c']
print (reverse_list(my_list))
>>> ['c', 'b', 'a']
8. 面向对象编程
Python 是一种面向对象的语言,其弱小之处在于对象。将对象视为蓝图,如果应用蓝图,你能够创立该蓝图的实例。也就是说,你能够创立须要的多个蓝图实例,但不会损毁你应用的蓝图。
面向对象编程(OOP)是一个宏大的话题,因而咱们不会在本节中涵盖所有你须要理解的内容,但能够通过几个简略的示例帮你入门。如果你之前读过面向对象编程的相干内容,可能曾经厌倦了学生(student)类,但咱们又来了。从定义一个名为 student 的类开始,student 会领有一个名称和一个 subject_list:
class Student():
def __init__(self,name):
self._name = name
self._subject_list = []
如果想要创立一个 student,能够像这样将其调配给变量:
student1 = Student('Martin Aaberge')
如果须要更多 student,能够应用同一个类并增加另外的姓名:
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()
这个类能够用于创立、编辑学生信息,并获取咱们存在其中的信息:
#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.py 文件中创立一个 student
类,并将其导入咱们的 main.py 文件(本案例中,它们都位于同一个文件夹中)。
from student import Student
student1 = Student('Martin')
student1.add_subject('biomechanics_2020')
student1.get_student_data()
9. 尊重 PEP
咱们常常看到人们在写 Python 代码时并不尊重 PEP(Python 加强提案:Python Enhancement Proposals),但我本人会尊重。当你在开发环境中工作时,恪守规范十分重要——如果不是 PEP 规范,也至多要恪守公司的规范。
PEP 是代码的一组准则,上面是 PEP- 8 的链接(https://www.python.org/dev/pe…),读起来很棒。请确保你通读过一次,理解大略内容。
一个典型的案例是 snake_case
,Python 是以snake_case
来写的,这代表着咱们用下划线来辨别词组,即使大学里也会犯错,因而别难过,只有别这样做就行了。这样写是对的:
chocolate_cake = 'yummy'
这样是错的:
chocolateCake = 'Yummy'
2、论断
入门是了不起的体验,须要艰辛钻研,但你的学习曲线急遽回升,用新的教训填满你。兴许老手状态很难解脱,理解你要关注什么是很艰难的,下一步呢?兴许本文将你向正确的方向推动了一步,兴许只是一堆你曾经晓得的胡说八道。
如果你不确定下一步该做什么,不要胆怯发问。确保你用好了那些比你更有教训的人,对各种意见持凋谢态度,看看哪些对你有用。如果还没筹备好应用某些编程形式,请持续让代码可能运行,同时学些新的和更好的办法。
福利:豆花同学为大家精心整顿了一份对于 linux 和 python 的学习材料大合集!有须要的小伙伴们,关注豆花集体公众号:python 头条!回复关键词“材料合集”即可收费支付!