1.1 Python简介
(1)解释型语言
解释型语言在运行程序的时候才逐行翻译、运行。
①优点:
有良好的平台兼容性,在任何环境中都可以运行(安装了解释器)灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。
②缺点:
每次运行的时候都要解释一遍,性能上不如编译型语言
(2)动态类型语言
在运行期间才去做数据类型检查的语言。
1.2运算符和表达式
(1)除法
Python中的除法有两种,整数除法(//)和除法(/)
除法在Python2中,这个操作对于整数运算会省去小数部分,而对于浮点数运算会保持小数部分;在Python3中变成真除法(无论任何类型都会保持小数部分,即使整除也会表示为浮点数形式)。
| Python2 | Python3 |
3/5 | 0 | 0.6 |
3.0/5 | 0.6 | 0.6 |
(2)%取余数
对整数和浮点数计算余数。但是由于浮点数的精确度影响,计算结果可能略有误差。
(3),分隔符
>>> x = 3, 5
>>> x
(3, 5)
>>> 3==3, 5
(True, 5)
(4)*运算符
>>> 3*2 #数值乘法
6
>>>"a"*10 #字符串重复
'aaaaaaaaaa'
>>> [1,2,3]*3 #列表重复
[1, 2, 3, 1, 2, 3, 1, 2,3]
>>> (1,2,3)*3 #元组重复
(1, 2, 3, 1, 2, 3, 1, 2,3)
1.3内置函数
函数 | 功能简要说明 |
abs(x) | 返回数字x的绝对值 |
all(iterable) | 如果对于可迭代对象中所有元素x都有bool(x)为True,则返回True。对于空的可迭代对象也返回True |
any(iterable) | 只要可迭代对象中存在元素x使得bool(x)为True,则返回True。对于空的可迭代对象,返回False |
bin(x) | 把数字x转换为二进制串 |
callable(object) | 测试对象是否可调用。类和函数是可调用的,包含__call__()方法的类的对象也是可调用的 |
chr(x) | 返回ASCII编码(Py2)或Unicode编码(Py3)为x的字符 |
cmp(x, y) | 比较大小,如果x<y则返回负数,如果x==y则返回0,如果x>y则返回正数。Python 3.x不再支持该函数 |
dir() | 返回指定对象的成员列表。可以查看指定模块中包含的所有成员或者指定对象类型所支持的操作。 |
eval(s[, globals[, locals]]) | 计算字符串中表达式的值并返回 |
filter(function or None, sequence) | 返回序列中使得函数值为True的那些元素,如果函数为None则返回那些值等价于True的元素。如果序列为元组或字符串则返回相同类型结果,其他则返回列表 |
float(x) | 把数字或字符串x转换为浮点数并返回 |
help(obj) | 返回对象obj的帮助信息 |
hex(x) | 把数字x转换为十六进制串 |
id(obj) | 返回对象obj的标识(地址) |
input([提示内容字符串]) | 接收键盘输入的内容,返回字符串。Python 2.x和Python 3.x对该函数的解释不完全一样,详见后面的1.4.8节 |
int(x[, d]) | 返回数字的整数部分,或把d进制的字符串x转换为十进制并返回,d默认为十进制 |
isinstance(object, class-or-type-or-tuple) | 测试对象是否属于指定类型的实例 |
len(obj) | 返回对象obj包含的元素个数,适用于列表、元组、集合、字典、字符串等类型的对象 |
list([x])、 set([x])、tuple([x])、dict([x]) | 把对象转换为列表、集合、元组或字典并返回,或生成空列表、空集合、空元组、空字典 |
map(函数,序列) | 将函数映射至序列中每个元素,返回列表或map对象 |
max(x)、 min(x)、 sum(x) | 返回序列中的最大值、最小值或数值元素之和 |
open(name[, mode[, buffering]]) | 以指定模式打开文件并返回文件对象 |
ord(s) | 返回1个字符s的ASCII编码(Py2)或Unicode编码(Py3) |
pow(x, y) | 返回x的y次方,等价于x**y |
range([start, ] end [, step] ) | 返回一个等差数列(Python 3.x中返回一个range对象),不包括终值 |
reduce(函数,序列) | 将接收2个参数的函数以累积的方式从左到右依次应用至序列中每个元素,最终返回单个值作为结果 |
reversed(列表或元组) | 返回逆序后的迭代器对象 |
round(x [, 小数位数]) | 对x进行四舍五入,若不指定小数位数,则返回整数 |
str(obj) | 把对象obj转换为字符串 |
sorted(列表[, cmp[, key[reverse]]] | 返回排序后的列表。Python 3.x中的sorted()方法没有cmp参数 |
type(obj) | 返回对象obj的类型 |
zip(seq1 [, seq2 [...]]) | 返回[(seq1[0], seq2[0] ...), (...)]形式的列表 |
可迭代对象
• 迭代协议:有next()方法的对象会前进到下一个结果,而在一系列结果的末尾时,则会引发StopIteration异常
• 我们把可以通过for...in...这类语句迭代读取⼀条数据供我们使⽤的对象称之为可迭代对象(Iterable)
1.4基本输入输出
(1)基本输入
通过input( )函数来实现的,其一般格式为:
x = input(‘提示信息:')
• 该函数返回输入的对象。可输入数字、字符串和其它任意类型对象
• 在Python 2.x中,该函数返回结果的类型由输入值时所使用的界定符来决定(即输入什么得到什么)
• 在Python 2.x中,还有另外一个内置函数raw_input()也可以用来接收用户输入的值。与input()函数不同的是,raw_input()函数返回结果的类型一律为字符串。例如:
• 在Python 3中,不存在raw_input()函数,只提供了input()函数用来接收用户的键盘输入。在Python 3中,不论用户输入数据时使用什么界定符,input()函数的返回结果都是字符串,需要将其转换为相应的类型再处理
(2)基本输出
• 在Python 2中,使用print语句进行输出
• 而Python 3中,使用print()函数进行输出
• 默认情况下,Python将结果输出到IDLE或者标准控制台,在输出时也可以进行重定向,例如可以把结果输出到指定文件。在Python2中使用下面的方法进行输出重定向:
>>> fp =open(r'C:\mytest.txt', 'a+')
>>> print>>fp, "Hello,world"
>>> fp.close()
而在Python 3中则需要使用下面的方法进行重定向
>>> fp =open(r'D:\mytest.txt', 'a+')
>>>print('Hello,world!', file = fp)
>>> fp.close()
• Python中print的输出默认是换行的
• 对于Python 2而言,在print语句之后加上逗号“,”则表示输出内容之后不换行,例如:
>>> for i inrange(10):
print i,
0 1 2 3 4 5 6 7 8 9
• 在Python 3中,如果要实现不换行需要在变量末尾加上 end="":
>>> for i inrange(10,20):
print(i, end=' ')
10 11 12 13 14 15 16 17 1819
x="a"
# 换行输出
print( x )
# 不换行输出
print( x,end=" ")
# 打印空行
print()
• print可以一次输出多个表达式
print(表达式1,表达式2,……)
1.5模块
• Python默认安装仅包含部分基本或核心模块,但用户可以利用pip安装大量的扩展模块
• 在Python启动时,仅加载了很少的一部分模块,在需要时由程序员显式地加载(可能需要先安装)其他模块
• 减小运行的压力,仅加载真正需要的模块和功能
• 可以使用sys.modules.items()显示所有预加载模块的相关信息
• 建议每个import语句只引入一个模块
• 将整个模块导入:
import模块名 [as 别名]
导入后,使用导入模块中的对象需要加上前缀(“模块名.对象名”)。若为导入模块设置别名,则前缀可以为别名(“别名.对象名”)
• 从某个模块中导入指定对象:
from 模块名 import 对象名 [as 别名]
建议使用的方式。这种导入方式可以减少查询次数,提高访问速度,使用对象时不需要用模块名作为前缀。
• 从某个模块中导入全部对象:
from 模块名 import *
不推荐使用的方式。一旦多个模块中有同名对象,这种方式将导致混乱。
• 可以使用dir函数查看任意模块中所有的对象列表,如果调用不带参数的dir()函数,则返回当前脚本的所有名字列表。
• 可以使用help函数查看任意模块或函数的使用帮助。
• 在2.x中可以使用reload函数重新导入一个模块,在3.x中,需要使用imp模块的reload函数。注意:重新加载模块要求该模块已经被正确加载。
• Python首先在当前目录中查找需要导入的模块文件,如果没有找到则从sys模块的path变量所指定的目录中查找。可以使用sys模块的path变量查看python导入模块时搜索模块的路径,也可以向其中append自定义的目录以扩展搜索路径。
• 在导入模块时,会优先导入相应的pyc文件,如果相应的pyc文件与py文件时间不相符,则导入py文件并重新编译该模块。
• 导入模块建议按照以下顺序:
• Python标准库模块:如os、sys、re
• 第三方扩展库:如PIL、numpy、scipy
• 自定义本地模块
1.6代码编写规范(PEP 8)
(1)缩进
• Python程序依靠代码块的缩进来体现代码之间的逻辑关系
• 类定义、函数定义、选择结构、循环结构,行尾的冒号表示缩进的开始
• 以4个空格为基本缩进单位
• 同一个级别的代码块的缩进量必须相同
• 不要将空格和Tab(制表符)混用
(2)变量名
• 普通变量:小写字母,单词之间用_分割
this_is_a_var
• 类名:单词首字母大写
ClassName
• 全局变量名:大写字母,单词之间用_分割
GLOBAL_VAR
(3)注释
• 常用的注释方式主要有两种:
• 以#开始,表示本行#之后的内容为注释
• 包含在一对三引号'''...'''或"""..."""之间且不属于任何语句的内容将被解释器认为是(多行)注释
# 第一个注释
'''
第二注释
第三注释
'''
"""
第四注释
第五注释
"""
(4)编写规范
• ①如果一行语句太长,可以在行尾加上\来换行分成多行
total = item_one + \
item_two + \
item_three
在 [], {}, 或 () 中的多行语句,不需要使用反斜杠(\),例如:
total =['item_one','item_two','item_three',
'item_four','item_five']
• ②运算符两侧、函数参数之间、逗号两侧建议使用空格分开
• ③不同功能的代码块之间、不同的函数定义之间增加一个空行以增加可读性
1.7 Python文件名
• .py:Python源文件,由Python解释器负责解释执行。
• .pyw:Python源文件,常用于图形界面程序文件。
• .pyc:Python字节码文件,无法使用文本编辑器直接查看该类型文件内容,可用于隐藏Python源代码和提高运行速度。对于Python模块,第一次被导入时将被编译成字节码的形式,并在以后再次导入时优先使用“.pyc”文件,以提高模块的加载和运行速度。对于非模块文件,直接执行时并不生成“.pyc”文件,但可以使用py_compile模块的compile()函数进行编译以提高加载和运行速度。另外,Python还提供了compileall模块,其中包含compile_dir()、compile_file()和compile_path()等方法,用来支持批量Python源程序文件的编译。
• .pyo:优化的Python字节码文件,同样无法使用文本编辑器直接查看其内容。可以使用“python –O -m py_compile file.py”或“python –OO -m py_compile file.py”进行优化编译。
• .pyd:一般是由其他语言编写并编译的二进制文件,常用于实现某些软件工具的Python编程接口插件或Python动态链接库。
1.8__name__和 __init__
• 每个Python脚本在运行时都有一个“__name__”属性
• 如果脚本作为模块被导入,则其“__name__”属性的值被自动设置为模块名
• 如果脚本独立运行,则其“__name__”属性值被自动设置为“__main__”
• 利用“__name__”属性可以控制Python程序的运行方式
• 例如,编写一个包含可被其他程序利用的函数的模块,而不希望该模块可以直接运行,则可以在程序文件中添加以下代码:
if __name__ == '__main__':
print 'Please use this as a module'
• 这样一来,程序直接执行时将会得到提示“Please usethis as a module.”,而使用import语句将其作为模块导入后可以使用其中的类、方法、常量或其他成员
• 包是Python用来组织命名空间和类的重要方式,可以看作是包含大量Python程序模块的文件夹。在包的每个目录中必须包含一个__init__.py文件,该文件可以是一个空文件,仅用于表示该目录是一个包。__init__.py文件的主要用途是设置__all__变量以及执行初始化包所需的代码,其中__all__变量中定义的对象可以在使用“from … import *”时被全部正确导入
1.9 调用python解释器与指定编码
#!/usr/bin/python3
# -*- coding: UTF-8 -*-
print("Hello, World!");
注意文件开头的两行注释,最好在每个文件的开头都加上。
第一行注释标的是指向python 的路径,告诉操作系统执行这个脚本的时候,调用 /usr/bin 下的 python 解释器。为了跨平台兼容,应加上该注释。
第二行注释指定文件编码为UTF-8。默认情况下,Python 3.x 源码文件以 UTF-8 编码,而Python2.x的默认编码是ASCII。为了跨版本兼容,应加上该注释。