405 lines
12 KiB
Markdown
405 lines
12 KiB
Markdown
|
# 03-Python基本用法
|
|||
|
|
|||
|
[TOC]
|
|||
|
|
|||
|
## 一、编程模式
|
|||
|
|
|||
|
**交互模式编程**
|
|||
|
|
|||
|
interactive -- 交互
|
|||
|
|
|||
|
Python 带有一个交互式解释器,即你可以在解释器提示符后输入语句和表达式,立即执行并查看其结果。只需不带参数地启动 `python` 命令(也可以在你的计算机开始菜单中选择相应菜单项)。在测试新想法或检验模块和包的时候用这种方式会非常方便(请记得使用 `help(x)`)。
|
|||
|
|
|||
|
```python
|
|||
|
# python
|
|||
|
Python 2.6.4 (#1, Nov 11 2014, 13:34:43)
|
|||
|
[GCC 4.1.2 20120704 (Red Hat 5.6.2-48)] on linux2
|
|||
|
Type "help", "copyright", "credits" or "license" for more information.
|
|||
|
|
|||
|
键入下列文字在Python提示符,然后按Enter键:
|
|||
|
>>> print("Hello, Python!")
|
|||
|
Hello, Python!
|
|||
|
```
|
|||
|
|
|||
|
Python代码在执行时默认会动态加载一些内置库builtins.py
|
|||
|
|
|||
|
**脚本模式编程**
|
|||
|
调用解释器及脚本作为参数,并开始执行脚本
|
|||
|
写如下代码在一个test.py文件
|
|||
|
|
|||
|
```python
|
|||
|
print("Hello, Python!")
|
|||
|
```
|
|||
|
|
|||
|
运行程序:
|
|||
|
|
|||
|
```bash
|
|||
|
# python test.py
|
|||
|
Hello, Python!
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
另一种方式执行Python脚本,修改后的test.py文件:
|
|||
|
#!/usr/bin/python3.8
|
|||
|
print("Hello, Python!")
|
|||
|
|
|||
|
运行程序:
|
|||
|
# chmod +x test.py
|
|||
|
# ./test.py
|
|||
|
Hello, Python!
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
|
|||
|
## 二、Python标识符
|
|||
|
|
|||
|
**作用**
|
|||
|
|
|||
|
用来标识一个变量,函数,类,模块或其他对象的名称。
|
|||
|
一个标识符开始以字母A到Z或a到z后跟零个或多个字母下划线(_)和数字(0〜9)。
|
|||
|
Python标识符内不允许标点符号,如@、$、%等。
|
|||
|
Python区分大小写
|
|||
|
|
|||
|
**标识符命名约定:**
|
|||
|
|
|||
|
一句话:只能由数字,字母和下划线组成,不能以数字开头
|
|||
|
|
|||
|
• 类名以大写字母以及所有其它标识符以小写字母。
|
|||
|
• 开头单个前导下划线的标识符表示由该标识符约定的意思是私有的,避免用下划线作为变量名的开始。
|
|||
|
• 开头两个前导下划线的标识符表示一个强烈的私有的标识符。
|
|||
|
• 如果标识符末尾还具有两个下划线结束时,该标识符是一个语言定义的特殊名称。
|
|||
|
|
|||
|
**保留字**
|
|||
|
|
|||
|
bash: if for 等关键字 可以当作标识名称
|
|||
|
python: if for 等关键字 不能当作标识名称
|
|||
|
|
|||
|
保留字不可以被用作常量或变量,或任何其它标识符。所有Python关键字只包含小写字母。
|
|||
|
|
|||
|
```python
|
|||
|
查询当前版本python中所有关键字:
|
|||
|
>>> import keyword # 如果系统中没有这个模块,需要安装python-docs
|
|||
|
>>> keyword.kwlist
|
|||
|
['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']
|
|||
|
|
|||
|
判断是否为关键字:
|
|||
|
>>> keyword.iskeyword ('False')
|
|||
|
此时将返回True
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
|
|||
|
## 三、行和缩进
|
|||
|
|
|||
|
一个程序员学习Python时,遇到的第一个需要注意的地方是,不使用括号来表示代码的类和函数定义块或流程控制。代码块是由行缩进,这是严格执行表示方式。
|
|||
|
缩进位数目是可变的,但在块中的所有语句必须缩进相同的量。在这个例子中,两个功能块都很好使用:
|
|||
|
|
|||
|
```python
|
|||
|
if True:
|
|||
|
print "True"
|
|||
|
else:
|
|||
|
print "False"
|
|||
|
```
|
|||
|
|
|||
|
然而,在本实例中的第二块将产生一个错误:
|
|||
|
|
|||
|
```python
|
|||
|
#!/usr/bin/env python3.8
|
|||
|
if True:
|
|||
|
print ("Answer")
|
|||
|
print ("True")
|
|||
|
else:
|
|||
|
print ("Answer")
|
|||
|
print ("False")
|
|||
|
```
|
|||
|
|
|||
|
**使用空行**
|
|||
|
一行只含有空格,可能带有注释,如果是空行那么Python完全忽略它。
|
|||
|
在交互式解释器会话中,必须输入一个空的物理行终止多行语句。
|
|||
|
|
|||
|
**多行语句**
|
|||
|
Python语句通常用一个新行结束。 但是,Python允许使用续行符`\`来表示该行应该继续下去(跨行)。但是包含在[],{},()括号内的陈述并不需要使用续行符`\`。
|
|||
|
例如:
|
|||
|
|
|||
|
```python
|
|||
|
>>> total = (item_one +
|
|||
|
item_two +
|
|||
|
item_three)
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
```python
|
|||
|
>>> days = ['Monday',
|
|||
|
'Tuesday',
|
|||
|
'Wednesday',
|
|||
|
'Thursday',
|
|||
|
'Friday']
|
|||
|
```
|
|||
|
|
|||
|
**续行符**( \ ):
|
|||
|
Python 语句,一般使用换行分隔,也就是说一行一个语句。一行过长的语句可以使用反斜杠`\`分解成几行,比如:
|
|||
|
|
|||
|
```python
|
|||
|
# check conditions
|
|||
|
if (weather_is_hot == 1) and \
|
|||
|
(shark_warnings == 0):
|
|||
|
send_goto_beach_mesg_to_pager()
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
|
|||
|
**单行中多条语句**:
|
|||
|
分号( ; ) 允许在单行写入多条语句,不管语句是否启动一个新的代码块。下面是使用分号示例:
|
|||
|
|
|||
|
```python
|
|||
|
import sys; x = 'foo'; sys.stdout.write(x + '')
|
|||
|
|
|||
|
import sys
|
|||
|
x = 'foo'
|
|||
|
sys.stdout.write(x + '')
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
|
|||
|
## 四、引号和注释
|
|||
|
|
|||
|
**引号**
|
|||
|
Python接受单引号('),双引号(")和三('''或""")引用,以表示字符串常量,只要是同一类型的引号开
|
|||
|
始和结束的字符串。
|
|||
|
三重引号可以用于跨越多个行的字符串。
|
|||
|
例如,所有下列写法都是合法的:
|
|||
|
|
|||
|
```python
|
|||
|
word = 'word'
|
|||
|
sentence = "This is a sentence."
|
|||
|
paragraph = """This is a paragraph. It is
|
|||
|
made up of multiple lines and sentences."""
|
|||
|
```
|
|||
|
|
|||
|
**注释**
|
|||
|
"#"号之后字符是注释的一部分,Python解释器会忽略它们。
|
|||
|
|
|||
|
```python
|
|||
|
#!/usr/bin/python
|
|||
|
# First comment
|
|||
|
print "Hello, Python!" # second comment
|
|||
|
运行结果:
|
|||
|
Hello, Python!
|
|||
|
```
|
|||
|
|
|||
|
可以使用三引号完成多行注释:
|
|||
|
|
|||
|
```python
|
|||
|
'''
|
|||
|
comment1
|
|||
|
comment2
|
|||
|
''''
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
|
|||
|
## 五、读取用户输入
|
|||
|
|
|||
|
Python提供内置函数从标准输入读入一行文本,默认的标准输入设备是键盘:input()
|
|||
|
|
|||
|
在 **Python3.x** 中 **raw_input( )** 和 **input( )** 进行了整合,去除了 **raw_input( )**,仅保留了 **input( )** 函数,其接收任意输入,将所有输入默认为字符串处理,并返回字符串类型。
|
|||
|
|
|||
|
**input函数**
|
|||
|
input([prompt]) 函数从标准输入读取一个行,并返回一个字符串
|
|||
|
|
|||
|
```python
|
|||
|
#!/usr/bin/python3.8
|
|||
|
str = input("请输入:")
|
|||
|
print("你输入的内容是: ", str)
|
|||
|
|
|||
|
这将提示你输入任意字符串,然后在屏幕上显示相同的字符串。当我输入"Hello Python!",它的输出如下:
|
|||
|
请输入:Hello Python!
|
|||
|
你输入的内容是: Hello Python!
|
|||
|
```
|
|||
|
|
|||
|
**实例:等待用户**
|
|||
|
程序显示提示,按回车键退出,等待用户按下回车键:
|
|||
|
|
|||
|
```python
|
|||
|
#!/usr/bin/python3.8
|
|||
|
input("Press the enter key to exit.") #不接收用户输入
|
|||
|
在这里,一旦用户按下键时,程序结束。这是一个很好的技巧,保持一个控制台窗口打开,直到用户完成应用程序运行。
|
|||
|
```
|
|||
|
|
|||
|
**输入不可见密码**
|
|||
|
|
|||
|
getpass()
|
|||
|
输入密码时,如果想要不可见,需要利用 getpass 模块中的 getpass 方法:
|
|||
|
|
|||
|
```python
|
|||
|
#!/usr/bin/env python3.8
|
|||
|
import getpass
|
|||
|
pwd = getpass.getpass("请输入密码:") # 将用户输入的内容赋值给 pwd变量
|
|||
|
print(pwd) # 打印输入的内容
|
|||
|
|
|||
|
执行结果:
|
|||
|
请输入密码:
|
|||
|
123
|
|||
|
```
|
|||
|
|
|||
|
## 六、模块
|
|||
|
|
|||
|
模块以磁盘文件的形式存在, 每一个 Python 脚本文件都可以被当成是一个模块。
|
|||
|
|
|||
|
当一个模块变得过大, 且驱动了太多功能时,就应该考虑拆一些代码出来另外建一个模块。
|
|||
|
|
|||
|
模块代码可以是一段直接执行的脚本, 也可以是一堆类似库函数的代码, 从而可以被别的模块import调用。
|
|||
|
|
|||
|
模块可以包含直接运行的代码块、类定义、 函数定义或这几者的组合。
|
|||
|
|
|||
|
## 七、命令行参数
|
|||
|
|
|||
|
程序可以运行时提供有关如何运行的一些基本信息。 位置变量 位置参数
|
|||
|
|
|||
|
例如Python中可以使用 -h 做到这一点:
|
|||
|
|
|||
|
```bash
|
|||
|
# python3.8 -h
|
|||
|
usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ...
|
|||
|
Options and arguments (and corresponding environment variables):
|
|||
|
-c cmd : program passed in as string (terminates option list)
|
|||
|
-d : debug output from parser (also PYTHONDEBUG=x)
|
|||
|
-E : ignore environment variables (such as PYTHONPATH)
|
|||
|
-h : print this help message and exit
|
|||
|
[ etc. ]
|
|||
|
```
|
|||
|
|
|||
|
你也可以设定你的脚本,它应该以这样的方式接受各种选项。 命令行参数会在以后学习,当你学会其它的Python概念之后如果想对python脚本传参数,需要模块:sys 或者 getopt
|
|||
|
|
|||
|
**sys模块**
|
|||
|
|
|||
|
| 用法 | 意义 |
|
|||
|
| ------------- | -------- |
|
|||
|
| len(sys.argv) | 参数个数 |
|
|||
|
| sys.argv[0] | 脚本名 |
|
|||
|
| sys.argv[1] | 参数1 |
|
|||
|
| sys.argv[2] | 参数2 |
|
|||
|
|
|||
|
```python
|
|||
|
#vim test.py
|
|||
|
import sys
|
|||
|
print("脚本名:",sys.argv[0])
|
|||
|
for i in range(1,len(sys.argv)):
|
|||
|
print("参数",i,sys.argv[i]) sys.argv[1]
|
|||
|
|
|||
|
#python3.8 test.py hello world
|
|||
|
脚本名:test.py
|
|||
|
参数 1 hello
|
|||
|
参数 2 world
|
|||
|
```
|
|||
|
|
|||
|
**python参数解包**(**unpack**):
|
|||
|
|
|||
|
```python
|
|||
|
[root@wing python]# cat unpack.py
|
|||
|
#!/usr/bin/env python3.8
|
|||
|
from sys import argv
|
|||
|
|
|||
|
script, first, second, third = sysargv
|
|||
|
print(argv)
|
|||
|
print(script)
|
|||
|
print(first)
|
|||
|
print(second)
|
|||
|
print(third)
|
|||
|
|
|||
|
[root@wing python]# python unpack.py 1 2 3
|
|||
|
['unpack.py', '1', '2', '3']
|
|||
|
unpack.py
|
|||
|
1
|
|||
|
2
|
|||
|
3
|
|||
|
```
|
|||
|
|
|||
|
代码'script,first,second,third=argv' 表示将argv "解包(unpack)",argv本身是将所有参数放到同一个变量下面,这里是将每个参数赋予一个变量名:script, first, second, 以及third。
|
|||
|
|
|||
|
这看上去有些奇怪, 不过" 解包" 可能是最好的描述方式了。它的含义很简单:"把argv 中的东西解包,将所有的参数依次赋予左边的变量名"。
|
|||
|
|
|||
|
|
|||
|
|
|||
|
## 八、Python文件类型
|
|||
|
|
|||
|
**导语**
|
|||
|
python常用的有3种文件类型
|
|||
|
1.源代码 py
|
|||
|
2.字节代码 pyc
|
|||
|
3.优化代码 pyo
|
|||
|
|
|||
|
**源代码**:
|
|||
|
python源代码的文件以"py"为扩展名,由python程序解释,不需要编译
|
|||
|
|
|||
|
**字节代码**:
|
|||
|
python源文件经编译后生成的扩展名为"pyc"的文件,用于隐藏代码,提高加载速度
|
|||
|
|
|||
|
什么是pyc文件:
|
|||
|
pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,加载的速度有所提高,而且pyc是一种跨平台的字节码,是由python的虚拟机来执行的,这个是类似于JAVA或者.NET的虚拟机的概念。pyc的内容,是跟python的版本相关的,不同版本编译后的pyc文件是不同的,2.5编译的pyc文件,2.4版本的python是无法执行的。
|
|||
|
|
|||
|
为什么pyc文件:
|
|||
|
因为py文件是可以直接看到源码的,如果你是开发商业软件的话,不可能把源码也泄漏出去吧?所以就需要编译为pyc后,再发布出去。当然,pyc文件也是可以反编译的,不同版本编译后的pyc文件是不同的,根据python源码中提供的opcode,可以根据pyc文件反编译出py文件源码,网上可以找到一个反编译python2.3版本的pyc文件的工具,不过该工具从python2.4开始就要收费了,如果需要反编译出新版本的pyc文件的话,就需要自己动手了,不过你可以自己修改python的源代码中的opcode文件,重新编译python,从而防止不法分子的破解。
|
|||
|
|
|||
|
**编译方法**
|
|||
|
生成单个pyc文件:
|
|||
|
|
|||
|
```python
|
|||
|
方法1:代码方式
|
|||
|
#vim compile.py
|
|||
|
import py_compile
|
|||
|
py_compile.compile("hello.py")
|
|||
|
```
|
|||
|
|
|||
|
```python
|
|||
|
方法2:命令行
|
|||
|
#python3.8 -m py_compile hello.py
|
|||
|
-m 相当于脚本中的import
|
|||
|
```
|
|||
|
|
|||
|
> **注意**:
|
|||
|
> 字节代码和优化代码不能直接执行,只能用解释器运行
|
|||
|
> 正确执行方法:
|
|||
|
> \#python hello.pyc
|
|||
|
> \#python hello.pyo
|
|||
|
> 错误执行方法:
|
|||
|
> \#./hello.pyc //这样执行会报错
|
|||
|
|
|||
|
批量生成pyc文件:
|
|||
|
一般,工程都是在一个目录下的,不会仅仅编译一个py文件而已,而是需要把整个文件夹下的py文件都编译为pyc文件,python提供了另一个模块:compileall 。使用方法如下:
|
|||
|
|
|||
|
```python
|
|||
|
方法1:代码方式
|
|||
|
import compileall
|
|||
|
compileall.compile_dir(r'/root/src\')
|
|||
|
|
|||
|
方法2:命令行方式
|
|||
|
# python3.8 -m compileall /root/src/
|
|||
|
```
|
|||
|
|
|||
|
**优化代码**:
|
|||
|
pyo是经过优化编译后的程序,扩展名为"pyo",也可以提高加载速度,针对嵌入式系统,把需要的模块编译成pyo文件**可减少容量**,本质上和pyc没有区别,优化方法如下:
|
|||
|
|
|||
|
```python
|
|||
|
# python -O -m py_compile hello.py
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|