news 2026/1/31 6:56:28

3、Python编程基础:从基础语句到代码复用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
3、Python编程基础:从基础语句到代码复用

Python编程基础:从基础语句到代码复用

1. 环境准备与基础操作

Python的学习可以借助IPython交互式shell和常规的Bash shell。首先,需要为你的平台下载并安装正确版本的IPython,下载地址为: http://ipython.scipy.org/moin/Download 。若安装失败,也可以使用常规的Python shell。另外,还可以下载包含所有所需软件的虚拟机,其中已预配置好可直接运行的IPython。安装完成后,在终端输入ipython,会出现如下提示:

[ngift@Macintosh-7][H:10679][J:0]# ipython Python 2.5.1 (r251:54863, Jan 17 2008, 19:35:17) Type "copyright", "credits" or "license" for more information. IPython 0.8.2 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system. object? -> Details about 'object'. ?object also works, ?? prints more. In [1]:

IPython shell与常规的Bash shell很相似,能执行如lscdpwd等命令。下面通过简单示例对比Python和Bash的操作:
- 在Python终端输入:

In [1]: print "I can program in Python" I can program in Python
  • 在Bash终端输入:
[ngift@Macintosh-7][H:10688][J:0]# echo "I can program in Bash" I can program in Bash

通过这两个示例可以发现,Python和Bash在基础输出操作上差异不大。

2. Python语句执行

在终端输入命令是常见操作,下面对比Bash和Python执行命令的方式。
-Bash示例:在Bash终端输入ls -l /tmp/,会列出/tmp/目录下的文件信息。

[ngift@Macintosh-7][H:10701][J:0]# ls -l /tmp/ total 0 -rw-r--r-- 1 ngift wheel 0 Apr 7 00:26 file.txt
  • Python示例:在Python终端,需要先导入subprocess模块,再使用subprocess.call方法执行命令。
In [2]: import subprocess In [3]: subprocess.call(["ls","-l ","/tmp/"]) total 0 -rw-r--r-- 1 ngift wheel 0 Apr 7 00:26 file.txt Out[3]: 0

对于初次接触Python代码的人来说,import subprocess可能比较陌生。Python的强大之处在于能够导入包含代码的模块或文件,并在新程序中复用。在这个示例中,只需导入subprocess并按所示语法使用即可。可以使用以下通用语法在Python中运行任何shell命令:

subprocess.call(["some_command", "some_argument", "another_argument_or_path"])

下面是一个Python版本的ls命令封装示例,将代码保存为pyls.py文件,并使用chmod +x pyls.py使其可执行。

#!/usr/bin/env python #Python wrapper for the ls command import subprocess subprocess.call(["ls","-l"])

运行该脚本,会得到与在命令行运行ls -l相同的输出。这展示了Python在系统编程中的常见用途,即“封装”其他脚本或Unix命令。

下面是一个系统信息收集脚本的Python和Bash版本对比:
-Python版本(pysysinfo.py

#!/usr/bin/env python #A System Information Gathering Script import subprocess #Command 1 uname = “uname” uname_arg = “-a” print "Gathering system information with %s command:\n" % uname subprocess.call([uname, uname_arg]) #Command 2 diskspace = "df" diskspace_arg = "-h" print "Gathering diskspace information %s command:\n" % diskspace subprocess.call([diskspace, diskspace_arg])
  • Bash版本(bashsysinfo.sh
#!/usr/bin/env bash #A System Information Gathering Script #Command 1 UNAME="uname -a" printf “Gathering system information with the $UNAME command: \n\n" $UNAME #Command 2 DISKSPACE="df -h" printf "Gathering diskspace information with the $DISKSPACE command: \n\n" $DISKSPACE

这两个脚本的功能相似,运行后输出相同。使用subprocess.call时,将命令和参数分开是可选的,也可以使用subprocess.call("df -h", shell=True)这种语法。

在IPython中,可以使用Tab键查看模块的可用属性。例如,导入subprocess模块后,输入subprocess.并按Tab键,会显示如下属性:

In [12]: subprocess. subprocess.CalledProcessError subprocess.__hash__ subprocess.call subprocess.MAXFD subprocess.__init__ subprocess.check_call subprocess.PIPE subprocess.__name__ subprocess.errno subprocess.Popen subprocess.__new__ subprocess.fcntl subprocess.STDOUT subprocess.__reduce__ subprocess.list2cmdline subprocess.__all__ subprocess.__reduce_ex__ subprocess.mswindows subprocess.__builtins__ subprocess.__repr__ subprocess.os subprocess.__class__ subprocess.__setattr__ subprocess.pickle subprocess.__delattr__ subprocess.__str__ subprocess.select subprocess.__dict__ subprocess._active subprocess.sys subprocess.__doc__ subprocess._cleanup subprocess.traceback subprocess.__file__ subprocess._demo_posix subprocess.types subprocess.__getattribute__ subprocess._demo_windows

若想查看subprocess.call的详细使用信息,可在IPython中输入subprocess.call?,会显示其文档说明。

3. Python函数的使用

在之前的示例中,我们按顺序执行语句,实现了一些自动化操作。接下来,为了进一步优化代码执行的自动化程度,需要创建函数。函数可以看作是小型脚本,它允许将一组语句封装在一起,在需要时调用。

在Python中,函数的定义和使用需要注意缩进问题。Python要求嵌套代码保持统一的缩进级别,通常一个制表符缩进为四个空格。以下是Python和Bash中函数使用的示例:
-Python示例:在IPython交互式提示符下输入以下代码:

In [1]: def pyfunc(): ...: print "Hello function" ...: ...: In [2]: pyfunc Out[2]: <function pyfunc at 0x2d5070> In [3]: pyfunc() Hello function In [4]: for i in range(5): ...: pyfunc() ...: ...: Hello function Hello function Hello function Hello function Hello function

在这个示例中,将print语句放在函数中,不仅可以在后续调用该函数,还能根据需要多次调用。
-Bash示例:在Bash shell中输入以下代码:

bash-3.2$ function shfunc() > { > printf "Hello function\n" > } bash-3.2$ for (( i=0 ; i < 5 ; i++)) > do > shfunc > done Hello function Hello function Hello function Hello function Hello function

对比Python和Bash的示例可以发现,Bash实现相同功能需要更多的“额外代码”。例如,Bash的for循环语法与Python不同。

下面是一些简单函数的示例:

In [1]: def print_many(): ...: print "Hello function" ...: print "Hi again function" ...: print "Sick of me yet" ...: ...: In [2]: print_many() Hello function Hi again function Sick of me yet In [3]: def addition(): ...: sum = 1+1 ...: print "1 + 1 = %s" % sum ...: ...: In [4]: addition() 1 + 1 = 2

现在,将之前的系统信息收集脚本转换为使用函数的形式:

#!/usr/bin/env python #A System Information Gathering Script import subprocess #Command 1 def uname_func(): uname = "uname" uname_arg = "-a" print "Gathering system information with %s command:\n" % uname subprocess.call([uname, uname_arg]) #Command 2 def disk_func(): diskspace = "df" diskspace_arg = "-h" print "Gathering diskspace information %s command:\n" % diskspace subprocess.call([diskspace, diskspace_arg]) #Main function that call other functions def main(): uname_func() disk_func() main()

对应的Bash版本如下:

#!/usr/bin/env bash #A System Information Gathering Script #Command 1 function uname_func () { UNAME="uname -a" printf "Gathering system information with the $UNAME command: \n\n" $UNAME } #Command 2 function disk_func () { DISKSPACE="df -h" printf "Gathering diskspace information with the $DISKSPACE command: \n\n" $DISKSPACE } function main () { uname_func disk_func } main

这两个脚本都创建了多个函数,并使用main函数调用这些函数。如果是初次接触函数,建议在Bash和Python脚本中注释掉main函数,再次运行脚本,会发现没有输出,因为程序虽然执行了,但没有调用内部的函数。此时,你已经具备在Bash和Python中编写简单函数的能力,可以尝试修改这些脚本中的系统调用,添加新的函数并从main函数中调用它们。

下面是一个简单的流程图,展示了Python脚本中函数调用的流程:

graph TD; A[开始] --> B[导入subprocess模块]; B --> C[定义uname_func函数]; B --> D[定义disk_func函数]; B --> E[定义main函数]; E --> F[调用uname_func函数]; E --> G[调用disk_func函数]; F --> H[执行uname命令]; G --> I[执行df命令]; H --> J[输出系统信息]; I --> K[输出磁盘空间信息]; J --> L[结束]; K --> L;

通过以上内容,我们学习了Python的基础操作、语句执行、函数使用等知识,为后续的学习和实践打下了坚实的基础。在接下来的内容中,我们将探讨如何使用import语句实现代码复用。

Python编程基础:从基础语句到代码复用

4. 使用import语句复用代码

在前面的示例中,我们学习了如何创建函数来替代在脚本中逐个执行shell命令。同时了解到,模块实际上就是一个脚本或文件中的一些代码行,只要以特定方式组织,就可以在未来的程序中复用。下面通过导入之前创建的系统信息脚本,来展示函数对于代码复用的重要性。

首先,打开IPython和Bash窗口。之前创建的Python脚本pysysinfo.py,由于在Python中文件就是模块,所以可以将该脚本文件导入到IPython中。需要注意的是,导入时不需要指定文件的.py扩展名,否则导入将失败。以下是在Noah的Macbook Pro笔记本上导入pysysinfo.py的示例:

In [1]: import pysysinfo Gathering system information with uname command: Darwin Macintosh-8.local 9.2.2 Darwin Kernel Version 9.2.2: / Tue Mar 4 21:17:34 PST 2008; root:xnu-1228.4.31~1/RELEASE_I386 i386 Gathering diskspace information df command: Filesystem Size Used Avail Capacity Mounted on /dev/disk0s2 93Gi 88Gi 4.2Gi 96% / devfs 110Ki 110Ki 0Bi 100% /dev fdesc 1.0Ki 1.0Ki 0Bi 100% /dev map -hosts 0Bi 0Bi 0Bi 100% /net map auto_home 0Bi 0Bi 0Bi 100% /home /dev/disk1s2 298Gi 105Gi 193Gi 36% /Volumes/Backup /dev/disk2s3 466Gi 240Gi 225Gi 52% /Volumes/EditingDrive

虽然导入包含Python代码的文件看起来运行良好,但实际上存在一些问题。例如,如果只想打印脚本中磁盘空间部分的输出,是无法实现的。这就是使用函数的原因,函数可以控制程序各部分的运行时间和方式,避免所有代码一次性运行。

下面看导入使用函数封装的脚本pysysinfo_func.py的示例:

In [3]: import pysysinfo_func Gathering system information with uname command: Darwin Macintosh-8.local 9.2.2 Darwin Kernel Version 9.2.2: Tue Mar 4 21:17:34 PST 2008; root:xnu-1228.4.31~1/RELEASE_I386 i386 Gathering diskspace information df command: Filesystem Size Used Avail Capacity Mounted on /dev/disk0s2 93Gi 88Gi 4.1Gi 96% / devfs 110Ki 110Ki 0Bi 100% /dev fdesc 1.0Ki 1.0Ki 0Bi 100% /dev map -hosts 0Bi 0Bi 0Bi 100% /net map auto_home 0Bi 0Bi 0Bi 100% /home /dev/disk1s2 298Gi 105Gi 193Gi 36% /Volumes/Backup /dev/disk2s3 466Gi 240Gi 225Gi 52% /Volumes/EditingDrive

可以发现输出与未使用函数的脚本相同。查看脚本pysysinfo_func.py的源代码:

#Main function that call other functions def main(): uname_func() disk_func() main()

问题在于,main函数在命令行运行脚本时用于获取输出,但导入脚本时却不希望所有输出一次性出现。在Python中,将模块既作为从命令行执行的脚本,又作为可复用的模块使用是很常见的需求。解决方案是修改main函数的调用方式,将脚本的最后部分修改为:

#Main function that call other functions def main(): uname_func() disk_func() if __name__ == "__main__": main()

这是一种常见的编程“惯用法”,缩进在if __name__ == "__main__":语句下的代码,只有在从命令行执行脚本时才会运行。可以将此修改应用到自己的脚本中,或者导入修复后的脚本pysysinfo_func_2.py进行验证。

现在,回到IPython解释器,导入新脚本:

In [1]: import pysysinfo_func_2

这次,main函数没有被调用。为了实现代码复用,我们可以使用之前提到的IPython技巧,使用Tab键查看模块的可用属性:

In [2]: pysysinfo_func_2. pysysinfo_func_2.__builtins__ pysysinfo_func_2.disk_func pysysinfo_func_2.__class__ pysysinfo_func_2.main pysysinfo_func_2.__delattr__ pysysinfo_func_2.py pysysinfo_func_2.__dict__ pysysinfo_func_2.pyc pysysinfo_func_2.__doc__ pysysinfo_func_2.subprocess pysysinfo_func_2.__file__ pysysinfo_func_2.uname_func pysysinfo_func_2.__getattribute__ pysysinfo_func_2.__hash__

可以忽略带有双下划线的属性,因为这些是特殊方法,超出了本文的介绍范围。过滤后可以看到pysysinfo_func_2.disk_func,调用该函数:

In [2]: pysysinfo_func_2.disk_func() Gathering diskspace information df command: Filesystem Size Used Avail Capacity Mounted on /dev/disk0s2 93Gi 89Gi 4.1Gi 96% / devfs 111Ki 111Ki 0Bi 100% /dev fdesc 1.0Ki 1.0Ki 0Bi 100% /dev map -hosts 0Bi 0Bi 0Bi 100% /net map auto_home 0Bi 0Bi 0Bi 100% /home /dev/disk1s2 298Gi 105Gi 193Gi 36% /Volumes/Backup /dev/disk2s3 466Gi 240Gi 225Gi 52% /Volumes/EditingDrive

可以看到,通过函数我们实现了代码复用,能够导入之前编写的代码,并交互式地运行所需的部分。同样,也可以单独运行其他函数:

In [3]: pysysinfo_func_2.uname_func() Gathering system information with uname command: Darwin Macintosh-8.local 9.2.2 Darwin Kernel Version 9.2.2: Tue Mar 4 21:17:34 PST 2008; root:xnu-1228.4.31~1/RELEASE_I386 i386 In [4]: pysysinfo_func_2.main() Gathering system information with uname command: Darwin Macintosh-8.local 9.2.2 Darwin Kernel Version 9.2.2: Tue Mar 4 21:17:34 PST 2008; root:xnu-1228.4.31~1/RELEASE_I386 i386 Gathering diskspace information df command: Filesystem Size Used Avail Capacity Mounted on /dev/disk0s2 93Gi 89Gi 4.1Gi 96% / devfs 111Ki 111Ki 0Bi 100% /dev fdesc 1.0Ki 1.0Ki 0Bi 100% /dev map -hosts 0Bi 0Bi 0Bi 100% /net map auto_home 0Bi 0Bi 0Bi 100% /home /dev/disk1s2 298Gi 105Gi 193Gi 36% /Volumes/Backup /dev/disk2s3 466Gi 240Gi 225Gi 52% /Volumes/EditingDrive

通常,编写可复用模块的目的是为了在新脚本中多次使用部分代码。下面是一个使用import复用代码的示例脚本new_pysysinfo.py

#Very short script that reuses pysysinfo_func_2 code from pysysinfo_func_2 import disk_func import subprocess def tmp_space(): tmp_usage = "du" tmp_arg = "-h" path = "/tmp" print "Space used in /tmp directory" subprocess.call([tmp_usage, tmp_arg, path]) def main(): disk_func() tmp_space() if __name__ == "__main__": main()

在这个示例中,不仅复用了之前编写的代码,还使用了特殊的Python语法,只导入所需的函数。通过导入其他模块的函数,可以创建出完全不同的程序。在main函数中,将其他模块的函数disk_func()与本文件中创建的新函数tmp_space()混合使用。

以下是一个表格,总结了代码复用的关键步骤:
|步骤|操作|
| ---- | ---- |
|1|将功能封装成函数,编写模块脚本|
|2|使用if __name__ == "__main__":语法控制脚本执行和模块导入时的行为|
|3|在新脚本中使用importfrom ... import ...语句导入所需的函数或模块|
|4|在新脚本中调用导入的函数|

下面是一个流程图,展示了代码复用的流程:

graph LR; A[编写模块脚本] --> B[封装函数]; B --> C[使用 if __name__ == "__main__" 控制执行]; C --> D[保存为模块文件]; E[编写新脚本] --> F[导入模块或函数]; F --> G[调用导入的函数]; D --> F;

通过以上内容,我们深入学习了Python代码复用的方法和重要性。掌握这些知识后,你可以编写更复杂的Python模块,并在不同的项目中反复使用,提高编程效率。希望这些内容能帮助你在Python编程的道路上更进一步。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/28 15:59:46

Folium地理数据可视化终极指南:5步快速创建交互式地图

Folium是一个功能强大的Python地理数据可视化库&#xff0c;它将Python的数据处理能力与Leaflet.js的地图功能完美结合。无论你是数据分析师、地理信息工程师还是普通用户&#xff0c;Folium都能帮你轻松创建专业的交互式地图&#xff0c;实现空间数据分析和地理可视化展示。 【…

作者头像 李华
网站建设 2026/1/30 7:50:53

OpenCode:终端开发者的智能编程伙伴深度体验

OpenCode&#xff1a;终端开发者的智能编程伙伴深度体验 【免费下载链接】opencode 一个专为终端打造的开源AI编程助手&#xff0c;模型灵活可选&#xff0c;可远程驱动。 项目地址: https://gitcode.com/GitHub_Trending/openc/opencode 作为一款专为终端环境设计的开源…

作者头像 李华
网站建设 2026/1/27 9:56:54

3分钟搞定VLC播放器在UOS ARM系统的完美安装

3分钟搞定VLC播放器在UOS ARM系统的完美安装 【免费下载链接】VLC播放器离线安装包UOSARM含依赖一键安装 本仓库提供了一个VLC播放器的离线安装包&#xff0c;特别适用于UOS ARM架构的系统。该安装包包含了所有必要的依赖项&#xff0c;用户只需一键安装即可轻松使用VLC播放器。…

作者头像 李华
网站建设 2026/1/30 19:22:24

Swin Transformer快速上手:从零开始构建高性能视觉模型

Swin Transformer快速上手&#xff1a;从零开始构建高性能视觉模型 【免费下载链接】Swin-Transformer This is an official implementation for "Swin Transformer: Hierarchical Vision Transformer using Shifted Windows". 项目地址: https://gitcode.com/GitH…

作者头像 李华
网站建设 2026/1/26 18:36:20

Altium Designer Viewer:电子设计协作的终极解决方案

还记得那次紧急的设计评审会议吗&#xff1f;供应商在电话那头急切地询问&#xff1a;"这个PCB布局是否合理&#xff1f;"而你却无法立即分享设计文件&#xff0c;因为对方没有安装昂贵的Altium Designer软件。这种场景在电子工程领域屡见不鲜&#xff0c;直到我发现…

作者头像 李华
网站建设 2026/1/29 20:25:28

LMCache深度解析:如何让大语言模型推理快10倍

LMCache深度解析&#xff1a;如何让大语言模型推理快10倍 【免费下载链接】LMCache Making Long-Context LLM Inference 10x Faster and 10x Cheaper 项目地址: https://gitcode.com/GitHub_Trending/lm/LMCache 在当今AI应用遍地开花的时代&#xff0c;大语言模型的推理…

作者头像 李华