Python从入门到精通:老程序员速成记
.
1 深入接触Python:功能特性和优势
-
作为有多年软件开发经验的老程序员,即使没有机会使用Python做软件项目,也多少会接触一点,形象的比喻:即使没吃过猪肉,也应该见过猪跑。而事实上,Python是一门被广泛使用的编程语言,诞生于1991年,至于是谁发明的,感兴趣的小伙伴可以自己去脑补一下。不同的编程语言,擅长的领域各不相同,Python主要擅长以下几个方面:
(1)服务器端的网页开发编程。
(2)普通的应用软件开发。
(3)数学计算。
(4)系统脚本。
(5)人工智能。
在具体的功能实现方面,Python可以做以下事情:
(1)在服务器端创建一个网页应用。
(2)连接数据库以及读写文件。
(3)处理大数据做复杂的数学计算。
(4)分付的软件开发包,快速提升软件开发效率。
Python的这些功能特性,与这门编程语言的发展过程密不可分,从上图其演进过程不难看出,其兴起的1994年,计算机网络和分布式计算已经成为编程计算的趋势,而作为面向未来的编程语言,其设计之初也充分考虑了这一点。为了完成一些软件需求,我们选择Python,还因为以下几个原因:
(1)Python可以工作在不同的平台上,包括Windows,Mac OS,Linux,树莓派(Raspberry Pi)等等。
(2)Python的语法结构很简单,类似于英语的自然语言。
(3)Python的简单语法结构让实现相同的功能,需要的代码行数更少。
(4)Python是解释型语言,写好的代码,可以立即执行,制作项目原型非常方便。
(5)Python的开发方式灵活,可以面向过程,也可以面向对象,同时也支持面向功能。
目前Python的主流版本是Python 3,但是依然有一些项目用Python 2。编写Python可以直接使用文本编辑器,如果你对开发环境没有特别要求,甚至可以直接使用Windows自带的记事本。网上关于这方面种草的文章很多,也往往让刚入门的程序员不知道选择哪个开发环境最好。根据笔者这样的老程序员的经验,优先选择的是PyCharm,其次是VS Code,前者使用其社区版本(Community)即可,后者是小家子气的微软贡献的免费软件。
在语法结构上,主流的其他的编程语言基本要通过分号或者是花括号来换行,而Python语言的换行符号就是用来标志记一个程序指令执行结束的。我们使用其他语言编写一个函数,基本上离不开class、function之类开头和结束标志, Python则直接使用每一行开始的留白和空格来表示,这些操作毫无疑问会提高我们写代码的效率。
.
2 理解Python的强大:结盟的重要性
-
上面说了Python语言的很多好处,那么我们如何入手Python编程呢?
其实任何一门编程语言,大家想要实现从入门到精通,都要树立一个意识:千里之行始于足下,老程序员走的路多,对于一条新的路,哪些地方可能会有坑,大多数情况下,会提前做出判断,这是经验所发挥的作用。
我们学习Python编程,这几个概念需要记住:
(1)编程语言的解释器或编译器:Python是解释型语言,所以只要安装解释器就可以了,解释器就是可以运行的python.exe,将这个文件所在文件夹放在操作系统可以找到路径中。
(2)编程语言的语法:这是程序员和编程语言沟通的桥梁,如果不掌握语法,相当于是你和这显示器或编译器无法沟通,因此,Python也不例外。最基础的语法包括变量,数据类型,运算服务条件判断语句函数和类的定义以及函数库的引用。
(3)常用的软件开发包和库函数:所谓的常用,主要包括和系统的交互,如查询程序运行的操作系统的一些参数以及通过请求操作系统的接口,实现对文件的读写等操作,除了跟运行的操作系统的交互之外,我们还需要一些常用的输入输出函数,特别是写日志记录的函数,这方面往往被菜鸟程序员忽略。
除了以上三个基础的概念之外,在Python中我们不得不说其丰富的扩展库,这也是Python最引以为豪的地方,也是Python成为被广泛使用的编程语言的主要原因之一。可以形象的理解为:一个人的力量毕竟势单力薄,但是你与很多人结盟,大家分别贡献各自的力量,你有能力集合并运营,这才是真正的强大。Python就是这样的,他的“强”,真正彰显了结盟的重要性,具体的体现,就是“扩展库”。
上图是一段简单的Python代码的截图,虽然刚开个头,我们已经看到这段代码引用很多强大的扩展库,离开这些扩展库,Python跟其他的编程语言也就没有什么太大的区别了。
Python这门开发语言的扩展库很多,比如我们平时使用频率非常高的Web端的开发框架Flask和Django,用于数据处理的numpy和pandas,以及绘图工具turtle(常常被用于少儿编程入门第一课必学)。
Python这门编程语言更广泛的应用是在大数据处理和人工智能领域。Google早期对于人工智能领域的研究以及机器学习、神经元智能感知的计算等,大多数都是使用Python语言编写的,所以我们掌握了这门开发语言,在web3.0和元宇宙这样的大趋势背景下,可以更好的根据客户需求,创建项目原型,快速迭代开发。
这些扩展库为Python开发提供了丰富的可扩展框架,可以帮助我们快速搭建应用软件的基础架构,降低数据库连接以及增删改查的代码复杂度,有一些甚至优化了缓存读写机制,以提高数据操作的效率。
基于以上内容,老程序员要跟小伙伴们分享的基本就完成了,剩下的工作就是编写Python代码了。任何一门编程语言都是熟能生巧,在实际的项目开发和部署运营中不断深入对其功能特性的理解。如果仅停留在教程和课程设计案例上,像Python这样的开发语言,即使用了很久,可能还只是停留在表面,抓到一点皮毛而已。
.
3 Python的基础语法和常用数据类型
-
以下这部分对于老司机来说几乎忽略,如果不跟其他编程语言横向对比的话。所以这部分内容建议阅读的时候,根据各自的代码编程经验,想一想相同的语法规则,例如函数、类等概念,在C++、Java、PHP、GO、C#等环境中是如何实现的。
3.1 函数的定义与调用
Python 定义函数使用 def 关键字,一般格式如下:
def 函数名(参数列表):
函数体
以下是一个具体的实例,我们先导入logging包,定义logit函数来代为实现logger.info的功能:
import logging
def logit(log_info):
logger.info(log_info)
#logit调用
logit('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')
调用logit输出日志信息如下,其中的日期时间是有扩展库logging自动生成的。
2023-04-14 10:48:17,738 [abot_tools.py - L:37] - INFO aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa [__main__ - logit]
3.2 类的定义与调用
我们以类Abot_Config_Yaml为例来演示这个过程。
构造函数设置self.filename和self.config两个成员变量,方便在类里面和实例中调用这两个变量;而类方法的定义,也是为了在类和实例中方便调用。
以下实例中,load_config类方法,实现读取一个文件,把读取出来的内容传给yaml对象,在构造函数中定义的self.config成员变量,通过调用load_config类方法获取值。
import yaml
import os
class Abot_Config_Yaml(object):
def __init__(self, filename):
print('当前工作目录 os.getcwd() ==>> %s' % os.getcwd() )
current_path = os.path.dirname(__file__)
print('配置文件操作的class所在目录 os.path.dirname ==>> %s' % current_path)
self.filename = os.path.dirname(current_path) + '/config/' + filename
print('配置文件yaml的路径 ==>> %s' % self.filename)
self.config = self.load_config()
def load_config(self):
with open(self.filename, 'r', encoding='utf-8') as f:
config = yaml.load(f, Loader=yaml.FullLoader)
return config
def get_setting(self, group_name):
return self.config[group_name]
def SavePath(self):
return self.config['SAVEPATH']
3.3 包和库的引用
我们以JSON包来解释这个过程,因为JSON数据在不同的编程语言和功能模块中作为接口数据交换格式,已经被广泛应用。引用json包后,我们使用json包中的loads函数将json格式的内容转换成python字典对象。
import json
create_task_dict = json.loads('''
{
"humanid": 83,
"human_position": {
"x": 50,
"y": 50
},
"human_size": {
"width": 1080,
"height": 1920
},
"stageid": 59,
"ttsid": 60,
"video_name": "视频的名称",
"input_text": "输入的文字内容",
"background_image": "https://yanyubao.tseo.cn/static/images/xxxxx.jpg",
"input_voice": "enim magna voluptate"
}
''')
print('使用print直接输入JSON对象:')
print(create_task_dict)
print('\n')
print('通过json.dump格式化JSON对象并由print打印出来:')
# 美化显示JSON,显示中文,indent占位4个空格。
json_formatted_str = json.dumps(create_task_dict, ensure_ascii=False, indent=4)
print(json_formatted_str)
输出值为字典对象:
使用print直接输入JSON对象:
{'humanid': 83, 'human_position': {'x': 50, 'y': 50}, 'human_size': {'width': 1080, 'height': 1920}, 'stageid': 59, 'ttsid': 60, 'video_name': '视频的名称', 'input_text': '输入的文字内容', 'background_image': 'https://yanyubao.tseo.cn/static/images/xxxxx.jpg', 'input_voice': 'enim magna voluptate'}
通过json.dump格式化JSON对象并由print打印出来:
{
"humanid": 83,
"human_position": {
"x": 50,
"y": 50
},
"human_size": {
"width": 1080,
"height": 1920
},
"stageid": 59,
"ttsid": 60,
"video_name": "视频的名称",
"input_text": "输入的文字内容",
"background_image": "https://yanyubao.tseo.cn/static/images/xxxxx.jpg",
"input_voice": "enim magna voluptate"
}
3.4 列表、字典、元组和集合
Python代码中,列表、字典、元组和集合是我们最常用四种数据类型,必须区分他们的区别。我们需要搞清楚在Python中的列表、字典、元组和集合四个概念的关系,才能更好的理解这门编程语言。这里主要通过代码实例说明这4种数据类型的区别,至于这些链式结构的增删改查,可以根据具体的使用场景再组织代码。
3.4.1 列表
我们用[]初始化列表new_img_list,添加列表元素时调用append方法
new_img_list = []
new_img_item = {'seq':1}
new_img_list.append(new_img_item)
new_img_item = {'seq':2}
new_img_list.append(new_img_item)
new_img_item = {'seq':3}
new_img_list.append(new_img_item)
print(new_img_list)
输出的内容如下:
[{'seq': 1}, {'seq': 2}, {'seq': 3}]
3.4.2 字典
空字典初始化用{},这里我们设置seq序号为1,作为new_img_item的初始化。
字典通过一个键对应一个值的方式直接添加字典元素,和更改键对应的值。我们可以通过字典的键,直接访问对应键里的值。
new_img_item = {'seq':1}
new_img_item['type'] = '4:3'
new_img_item['url'] = 'http://xcxxxxxxxx'
print(new_img_item)
输出的内容如下:
{'seq': 1, 'type': '4:3', 'url': 'http://xcxxxxxxxx'}
3.4.3 元组
Python的元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号 ( ),列表使用方括号 [ ]。
元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可,代码实例如下:
today_work = ('完成延誉宝APP下载二维码更新', '新增小程序分享链接设置', '摸鱼')
work_time_plan = (3, 3, 1)
print('打印两个元组:')
print(today_work)
print(work_time_plan)
print('连接两个元组:')
print(today_work + work_time_plan)
print('看今天的第2项工作:')
print(today_work[1])
print('摸鱼完成,删除今天的工作:')
del today_work
try:
print(today_work)
except NameError:
print('元组 today_work 已经删除')
pass
回应的输入内容如下:
打印两个元组:
('完成延誉宝APP下载二维码更新', '新增小程序分享链接设置', '摸鱼')
(3, 3, 1)
连接两个元组:
('完成延誉宝APP下载二维码更新', '新增小程序分享链接设置', '摸鱼', 3, 3, 1)
看今天的第2项工作:
新增小程序分享链接设置
摸鱼完成,删除今天的工作:
元组 today_work 已经删除
3.4.4 集合
集合(set)是一个无序的不重复元素序列(列表),可以使用大括号 { } 或者 set() 函数创建集合;列表创建使用的是方括号[ ]。创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典,所以创建集合的时候,建议统一使用set函数,以避免跟“字典”这个概念混淆;字典创建是通过键值对的形式,而集合则没有键值对的。
创建的示例代码如下
set_test = set()
set_test.add('多级分销')
set_test.add('会员二维码')
set_test.add('推荐者关系')
print(set_test)
输出的内容如下,像字典,但是却没有键值对;像列表,但是又用{}开始和结尾。
{'多级分销', '会员二维码', '推荐者关系'}
以上是从一个老程序员的角度对Python编程的理解,希望能够对大家所有帮助。后续我们准备对数据库、文件、网址的读写做总结,对Python中常用的方法和函数做总结,同时对Flask这个基础框架的使用做说明。通过对剩下的这几个知识点的补充,Python开发的拼图基本完结。
2023年07月04日 2:33 下午 沙发
看看