乐趣区

关于云计算:Python-初学者进阶的九大技能

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

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.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 头条!回复关键词“材料合集”即可收费支付!

退出移动版