---
layout: post
title: 我的第一个Python程序
description: 我的第一个Python程序
keywords: python
author: admin
date: 2020-08-22 15:49
category: 网络技术
tags: python
---



今天我们来学习写第一个Python程序。

> 目标:从命令行传入一个参数,比如人名,然后打印出欢迎信息。

我们大学期间都学过C语言或C++。那先来想想如果用C++该如何实现?
在C++中,命令行传参数是用char * argv[],即字符串的指针的数组。打印是用cout输入输出流。下面是C++实现的代码。

```cpp
#include

using namespace std;

int main(int argc, char *argv[]){
cout << "hello " << argv[1] << "!" << endl;

return 0;
}
```

编译命令 `g++ -o hello hello.cpp`,编译后生成可执行文件`hello`。
运行命令 `./hello bill`,终端里输出hello bill! 。

所有的编程语言都只是思想或逻辑的描述,所以不同语言之间肯定有相同之处。我们用对比的方法来学习第一个Python程序。下面是Python的实现代码。

```python
#!/usr/bin/env python

import sys

def main(argv) :
print("hello " + argv[1] + "!")

if __name__ == '__main__' :
main(sys.argv)
```

第1行:#!/usr/bin/env python用来指定执行本脚本所用的软件。是这Linux、Unix脚本的共同特性,与Python无关,Shell、Perl等其它脚本语言都有。操作系统先读取脚本的第一行,来决定用哪个软件来执行脚本,不依赖文件的后缀名。因此Linux中的脚本可以不带用后缀名。通常好的编程习惯是加上特定的后缀名,如Python加py,Perl加pl。

第3行:import sys类似C++的#include语句,用来包含(准确点叫导入)库文件。sys是与系统相关的库,包括argv、stdin、stdout等。我们这个例子里用到了argv,所以需要导入sys库。

第5行:def main(argv) : 定义一个函数。def是定义函数的关键字,main是函数名,圆括号里定义了函数参数。这个例子里定义了一个名叫main的函数,函数有一个参数argv。
我们注意到第5行的最后有一个冒号“:”,这是Python语言所特有的标记,相当于C++的大括号{},表明一个层次关系。

第6行:print("hello " + argv[1] + "!")是调用python语言内置的函数print()来向终端(屏幕)打印信息。括号里的“+”的作用是字符串的拼接,其中argv[1]是数组argv的第1个元素(从0开始计数)。

第8行:if \_\_name\_\_ == '\_\_main\_\_' : 意思是判断当前模块的名字是不是'\_\_main\_\_',如果是则执行后面的语句,如果不是则忽略后面的语句。一般情况下\_\_name\_\_的值总是等于'\_\_main\_\_'。只有一种例外的情况,当我们写的脚本被当作库文件导入到其它脚本时,\_\_name\_\_等于我们的脚本文件名。例如,我们这个脚本名叫hello.py,被导入到其它脚本时,\_\_name\_\_等于hello。

当然现在觉得复杂不好理解没有关系,照着写就行了。等以后学习写库文件的时候再深入学习。

第9行:main(sys.argv)调用了上面自定义的main()函数,并把命令行参数的字符串数组sys.argv传入main()函数。

###### 运行Python脚本

方法一:

```bash
chmod +x hello.py
./hello.py bill
```

方法二:

```bash
python hello.py bill
```

结果输出:
hello bill!

## 总结

我们来总结一下Python脚本的特点:
- 第1行用env python来指定运行脚本的命令。比直接指定/usr/bin/python要更通用,因为用env python时写的代码与python安装路径、版本无关。
- 定义函数用def关键字
- 需要表明层次关系时需要用冒号“:”,如def、if的行尾加冒号。即使def或if内部层次只有一个语句。并且同一层次的语句必须保持相同的缩进。if语句块后续的语句必须与if保持相同的缩进。例如下图中,b = 1和c = 2属于if内部层次,只有当if条件成立时才执行。而d = 3与if并列,if语句块过后,始总会执行。


- 利用if \_\_name\_\_ == '\_\_main\_\_' : 来实现类似C++的main函数的作用,让代码看起来更整洁,更利于被当作库文件来复用。
- 与C++的不同之处一:每个语句末尾不需要加分号“;”
- 与C++的不同之处二:变量的类型不需要提前定义,给它赋什么类型的值就是什么类型。
- 与C++的不同之处三:不需要编译,可直接执行。

"我的第一个Python程序"介绍了一个较规范的Python脚本的例子,并且跟C++语言作了对比。希望大家对文章末尾的总结多看几遍,慢慢体会。