- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
在这个系列笔记中,我将陆续整理自己在学习 Python 编程语言及其框架的过程中留下的笔记和代码,目的是掌握如何在生产环境中利用各种领域的第三方框架来快速开发应用程序。和大多数学习过程一样,我需要在第一部分笔记中花费一点篇幅来鸟瞰一下 Python 语言所涉及的领域,以便从全局视野来规划接下来的学习路线图,为此,我会在 https://github.com/owlman/study_note 项目的 Programming/LanguageStudy/Python 目录下创建一个名为的 RouteMap 目录,用于存放并维护接下来的这一部分笔记.
诚如大家所知,Python 是当前在程序设计领域中最为热门的、解释型的高级编程语言之一。它支持函数式、指令式、结构化和面向对象编程等多种编程范型,且拥有强大的动态类型系统和垃圾回收功能,能够自动管理内存使用,并且其本身拥有一个巨大而广泛的标准库。这些特性可以帮助使用这门编程语言的程序员在参与各种规模的项目时编写出思路清晰的、合乎逻辑的代码。在使用 Python 编写代码时,开发者们通常会遵循“优雅、明确、简单”的核心准则,具体来说就是:
优美优于丑陋。明了优于隐晦。
简单优于复杂。复杂优于凌乱。
扁平优于嵌套。稀疏优于稠密。
可读性很重要。
上述准则确保了开发者们在使用 Python 语言时一般会拒绝花俏的语法,而选择明确且尽可能没有歧义的语法。当然了,对于这些准则的坚守也导致了 Python 社区对于牺牲了优雅特性的优化策略持有了较为谨慎的态度,一些对非重要部分进行性能优化的补丁通常很难被获准合并到 Python 的官方实现 CPython 项目中,这也限制 Python 在某些对执行速度有较高要求领域的使用。到目前为止,人们主要将 Python 应用于以下领域,并开发了相应的程序库与框架:
基本上,除了基本语法之外,一个 Python 开发者的能力实际上就取决于如何根据自己面对的问题找到适用的框架,并在合理的时间内掌握该框架的使用方法,并用它快速地构建自己的项目。在后续笔记中,我们将会利用具体的项目实践来介绍如何构建这种“在做中学,在学中做”的能力.
在了解以上基本概念之后,接下来就可以来具体规划一下要学习如何使用Python语言进行框架开发的学习路线图了。大致上,我们可以将路线图划分为以下三个里程碑.
要想学习接下来要介绍的内容,掌握 Python 语言的基本语法及其标准库的使用方法无疑是先决条件。虽然在这个系列笔记中,我们会设定自己已经掌握了这门语言的基本使用,但对于“掌握”程度,我们还是希望先和读者约定以下标准。首先,自然是要能正确地安装 Python 语言运行环境,掌握这一能力的标准是读者能在自己的计算机环境中顺利地执行以下 Hello World 程序:
#! /usr/bin/env python
def main():
print("hello world!")
if __name__ == '__main__':
main()
接下来,读者需要掌握的是 Python 语言的标准语法,包括灵活运用各种表达式语句、条件语句、循环语句,以及会使用标准库提供的各种数据类型和数据结构,掌握这一能力的标准是能理解下面代码中实现的各种排序算法,并能正确地调用它们:
#! /usr/bin/env python
import random
def selectionSort(coll):
if(coll == []): return []
for i in range(len(coll)-1,0,-1):
max_j = i
for j in range(i):
if coll[j] > coll[max_j]: max_j = j
coll[i], coll[max_j] = coll[max_j], coll[i]
return coll
def countingSort(coll):
if(coll == []): return []
endl = len(coll)
minv = min(coll)
maxv = max(coll)
temp = [0 for i in range(maxv - minv + 1)]
for i in range(endl):
temp[coll[i] - minv] += 1
index = 0
for i in range(minv, maxv + 1):
for j in range(temp[i - minv]):
coll[index] = i
index += 1
return coll
def radixSort(coll, length):
if(coll == []): return []
for d in xrange(length):
LSD = [[] for _ in xrange(10)]
for n in coll:
LSD[n / (10 ** d) % 10].append(n)
coll = [tmp_a for tmp_b in LSD for tmp_a in tmp_b]
return coll
def bucketSort(coll):
if(coll == []): return []
length = len(coll)
buckets = [[] for _ in xrange(length)]
for tmp_a in coll:
buckets[int(length * tmp_a)].append(tmp_a)
tmp_coll = []
for tmp_b in buckets:
tmp_coll.extend(insertSort(tmp_b))
return tmp_coll
def insertSort(coll):
if(coll == []): return []
for i in range(1,len(coll)):
j = i
while j > 0 and coll[j-1] > coll[j]:
coll[j-1], coll[j] = coll[j], coll[j-1]
j -= 1
return coll
def shellSort(coll):
if(coll == []): return []
size = len(coll)
step = size / 2
while(step >= 1):
for i in range(step, size):
tmp = coll[i]
ins = i
while(ins >= step and tmp < coll[ins - step]):
coll[ins] = coll[ins - step]
ins -= step
coll[ins] = tmp
step = step / 2
return coll
def bubbleSort(coll):
if(coll == []): return []
endl = len(coll)
for i in range(endl, 0, -1):
for j in range(0, i - 1):
if(coll[j] > coll[j + 1]):
coll[j], coll[j + 1] = coll[j + 1], coll[j]
def quickSort(coll):
if(coll == []): return []
return quickSort([x for x in coll[1:] if x < coll[0]]) + \
coll[0:1] + \
quickSort([x for x in coll[1:] if x >= coll[0]])
最后,在最理想的情况下,读者还应该具备一些针对某一特定任务来编写自动化脚本的能力,例如能理解并复述下面这段实现 Git 提交操作的自动化脚本.
#! /usr/bin/env python
import os
import sys
import time
if not len(sys.argv) in range(2, 4):
print("Usage: git_commit.py <git_dir> [commit_message]")
exit(1)
title = "= Starting " + sys.argv[0] + "...... ="
n = len(title)
print(n*'=')
print(title)
print(n*'=')
os.chdir(sys.argv[1])
print("work_dir: " + sys.argv[1])
if len(sys.argv) == 3 and sys.argv[2] != "":
commit_message = sys.argv[2]
else:
commit_message = "committed at " + time.strftime("%Y-%m-%d",time.localtime(time.time()))
os.system("git add .")
os.system("git commit -m '"+ commit_message + "'")
print("Commit is complete!")
print(n*'=')
print("= Done!" + (n-len("= Done!")-1)*' ' + "=")
print(n*'=')
如果读者在基于以上标准的自我检验中遇到了一些不可回避的问题,我们会强烈建议先回过头去补习一下 Python 语言的基础知识,例如去阅读一下《Python 基础教程》或者其他介绍了上述基础的书籍,等达到了我们在这里约定的对基础知识的“掌握”标准,再继续学习后面的内容,以便实现最好的学习效果.
这一里程碑主要聚焦的是 可持续之学习能力 。众所周知,在如今的软件开发活动中,我们可以选择的开发框架不仅琳琅满目,选择众多,而且新陈代谢极为快速。这意味着,即使某一本书介绍了当前最为流行的框架及其具体使用方法,很有可能等到它最终出版之时,开发者们已经有了更好的选择。所以授之以鱼不如授之以渔,真正的目的是要掌握“快速学习新框架”的能力,这需要我们掌握如何阅读这些框架本身提供的官方文档,以便自行去了解这些框架的设计思路,并理解为什么决定开放那些接口给用户,为什么对用户隐藏那些实现。这就需要读者自己具备开发框架的能力。换句话说,虽然不必重复发明轮子,但一个优秀的工程师或设计师应该了解轮子是如何被发明的,这样才能清楚在怎么样的轮子上构建怎么样的车.
总而言之,对于如今的项软件工程师来说,在一个月内快速掌握某个新框架的能力远比之前已经掌握了多少个框架重要得多,例如当开发团队的管理员在面试新成员时,如果这位面试者有五年 A 框架的使用经验,那固然是很好,但团队中很多人都有,未必需要再多一个同类型的人才、但如果该面试者能在一个礼拜快速上手基于 Python 的任意一种框架,那么这位人才的重要性就会被凸显出来。毕竟如果我是一个开发团队的管理者,肯定不会喜欢团队的成员告诉我这个不会,那个不会.
最后此篇关于Python学习路线图的文章就讲到这里了,如果你想了解更多关于Python学习路线图的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!