python-2/03-Python基本用法.md
2024-12-26 09:59:08 +08:00

405 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 codepy文件变成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
```