基础语法
编码
默认python3源码使用UTF-8编码 所有字符使用UNICODE
/# 指定源码使用的编码
/# -- coding: cp-1252 --标识符
第一个字符 字母 或 _
其他部分由字母 数字 下划线组成
大小写敏感保留字
1
2>>>import keyword
>>>keyword.kwlist注释
1
# 这是一个注释
行与缩进
python 最具特色的就是使用缩进来表示代码块数字类型
- int 只有一种整数类型
- bool True False
- float 浮点数
- compex 复数
字符串
- 使用’或”包裹
- “”” 或 ‘’’ 三引号可以指定一个多行的字符串
- \ 转义字符
- r”\n” r可以使\不发生转义
- 字符串可以用 + 连接
- 字符串不能够改变
- 没有单独的字符类型
- 字符串切片 str[start:end] 包含start 不包含end
- 字符串切片可以加上步长 srt[start:end:step]
空行
函数之间或方法之间用空行分割等待用户输入
1
input("\n\n按下enter键后退出")
同一行显示多条语句
1
import sys;x = 'rtonxut'; sys.stdout.write(x+'\n');
多个语句构成代码组
缩进相同的语句构成一个代码块1
2
3
4
5
6if expression:
suite
elif expression:
suite
else:
suiteprint输出
默认输出是换行的 实现不换行 变量末尾加上 end=””1
print("------",end="");
import 与 from…import
python用import或from…import 来带入相应的模块1
2
3
4
5import sys
print("-----Python import mode--------");
for i in sys.argv:
print(i)
print("\n python 路径为",sys.path);
1 | from sys import argv,path #导入特定的成员 |
- 命令行参数
使用python -h可以查看各参数的帮助文档
基本数据类型
- 多个变量赋值
1
2
3a=b=c=1
a,b,c=1,2,"hello"
Number
python3只支持int float bool complex
1 | a = 20 |
bool 是 int 的子类
1 | issubclass(bool,int) |
可以使del语句来删除一些对象引用
1 | del val1[,val2...] |
字符串
字符串使用单引号’或双引号”扩起来 使用\转义特殊字符
1 | str = "runnable" |
bool类型
- True 或 False
- 布尔类型可以与其他数据类型进行比较 数字 字符串等
比较时,True视为1 False视为0 - 可以和逻辑运算符一起使用 and or not
- 可以被转换为其他的数据类型 比如 整数 浮点数 字符串
1
2
3
4
5
6
7
8
9
10
11
12
13a =True
b = False
print(2 < 3)
print( 2 == 3)
print(a and b)
print(a or b)
print(not a)
print(int(a))
print(float(a))
print(str(b))
列表
- 列表是python 使用最频繁的数据类型
- 列表中的元素而已不相同 支持数字 字符串 可以包含列表
1 | list = ['abc', 456, 43.1,'12'] |
- list内置了许多方法 apped pop等
元组
元组与列表类似 但是元组的元素不能修改
元组中的元素类型也可以不相同
1 | tuple = ('abcd',432,2.23,"runnode") |
集合
是一种无序 可变的数据类型 可以存储唯一的元素
集合中的元素不会重复
可以进行交集 并集 差集
1 | sites = {'Google','Taobao','Facebook'} |
字典
字典是无序的对象集合 字典中的元素是 通过键来存取的
在同一个字典中 key必须是唯一的
1 | dict = {} |
bytes类型
表示的是不可变的二进制序列
bytes 中的元素是 整数值 0-255 而不是unicode字符
通常用于处理二进制数据 图像文件 音频 视频 网络编程
1 | x = b'hhello' |
python 数据类型转换
- int(x[,base]) 将x转换为一个整数
- float()
- complex(real,imag)
- str(x)
- repr(x) 将x转换为表达式字符串
- eval(x) 用来计算在字符串中的有效python表达式 并返回一个对象
- tuple(s) 将序列s转换为一个元组
- list(s)
- set(s)
- dict(d) d必须是一个(key,value)元组序列
- frozenset(s) 转换为不可变集合
- chr(x) 将一个整数转换为一个字符
- ord(x) 将一个字符串转换为一个整数
- hex(x) 将一个整数转换为一个十六进制字符串
- oct(x) 将一个整数转换为一个八进制的字符串
python3数据类学转换
隐式类型转换
python 会自动将一种数据类型转换为另外一种数据类型1
2
3
4num_int = 123
num_flo = 1.23
num_new = num_int + num_flo #整数自动转换为浮点数显式类型转换
使用int() float() str()等副定义函数进行强制转换1
2
3x = int(1)
y = int(2.8)
z = int("2")
python3 解释器
linux unix 系统 一般默认将python3.x 装在/usr/local/python3目录中
1
2export PATH=$PATH:/usr/local/python3/bin/python3
python --version交互式编程
1
2python3
>>print("hello world")
注释
单行注释
1
# 这是一行注释
多行注释
1
2
3
4
5
6
7
8
9
10'''
这是
多行
注释
'''
"""
这也是
多行注释
"""
python3 运算符
算术运算符
- / % **幂 //取整除
比较运算符
== != > < >= <=
赋值运算符
= += -+ *= /= %= **= //= :=海象运算符 在表达式中同时进行赋值和返回
1 | if(n:=len(a) > 10): |
位运算符
& | ^ ~ << >>
逻辑运算符
and or not
成员运算符
in
not in
身份运算符
用于比较两个对象的存储单元 x is y 引用的同一个对象返回True
is
is not
数字
- 用于存储数值
- 数据类型不允许改变 一位着如果改变数字数据类型的值,将重新分配内存空间
1 | var1 = 1 |
数字函数
- abs(x) 绝对值
- ceil(x) 上入整数
- floor(x) 下舍整数
- cmp(x,y) 已废弃 使用(x > y) - (x < y)
- exp(x) 返回e的x次幂
- fabs(x) 以浮点数返会数字的绝对值
- log(x) math.log(math.e) 返回1.0 math.log(100,10) 返回2
- log10(x) 返回以10为基数的对数
- max(x1,x2,…)
- min(x1,x2,…)
- modf(x) 返回x的整数与小数部分
- pow(x,y) x**y的运算结果
- round(x[,n]) 返回浮点数x的四舍五入值 给出n值 代表舍入到小数点后的位数
- sqrt(x) 返回数字x的平方根
随机函数
- choice(seq) 从序列中随即挑选一个元素
- randrange([start],stop,[step]) 从指定基数递增的集合中获取一个随机数 基数默认值为1
- random() 随即生成下一个实数
- seed(x) 改变随机数生成器的种子seed
- shuffle(lst) 将序列的所有元素随机排列
- uniform(x,y) 随即生成曾为一个实数 在[x,y]范围内
三角函数
。。。
数学常量
pi e
python3 字符串
转义字符
\续行符
\反斜杠
' 单引号
" 双引号
\a 响铃
\b 退格
\000 空
\n 换行
\v 纵向制表符
\t 横向制表符
\r 回车
\f 换页
\yyy 八进制数字
\xyy 十六进制数字
\other 其他的字符以普通格式输出
字符串运算
- 字符串连接
- 重复输出字符串
[] 通过索引获取字符串中字符
[:] 截取字符串的一部分 左开右闭
in 成员运算符 如果字符串中包含给定的字符返回True
not in
r/R 原始字符串 所有的字符串都是字面意思
% 格式字符串
字符串格式化
%c 格式化字符及其ASCII码
%s 格式化字符串
%d 整数
%u 格式化无符号整数
%o 格式化无符号八进制数
%x 无符号十六进制数
%f 浮点数
%e 用科学记数法格式化浮点数
%E 科学记数法
%g %f和%e的简写
%G %f和%E 的简写
%p 用十六进制数 格式化 变量的地址
格式化操作符辅助指令
- 定义宽度或者小数点精度
- 用作左对齐
- 在正数前面显示+号
在正数前面显示空格 在八进制数前显示0 十六进制前显示’0x’
- 0 显示的数字前面填充’0’而不是默认的空格
- % ‘%%’ 输出一个单一的’%’
- (var) 映射变量
- m.n m是显示的最小总宽度 n是小数点后的位数
f-string
1 | name = 'name' |
字符串的内建函数
- capitalize() 将字符串的第一个字符转换为大写
- center(width,fillchar) 返回一个指定宽度居中的字符串fillchar为填充字字符串
- count(str,beg=0,end=len(string)) 返回str在string里面出现的次数
beg end 用于指定范围 - bytes.decode(encoding=’utf-8’,errors=’strict’)
可以使用bytes对象的decode()方法来解码给定的bytes对象 - encode(encoding=’utf=8’,errors=’strict’)
以encoding指定的编码格式编码字符串 - endswith(suffix,beg=0,end=len(string)) 检查字符串是否以suffix结束
- expandtabs(tabsize=8) 把字符串string中的tab符号转换为空格 默认空格数为8
- find(str,beg=0,end=len(string)) 检查str是否包含在字符串中 返回索引值 不再返回-1
- index(str,beg=0,end=len(string)) 同find 不在报出异常
- isalnum() 字符串至少有一个字符 所有的字符都是 字母或数字
- isdigit() 只包含数字
- islower() 所有字符都是小写
- isnumeric() 只包含数字字符
- isspace() 只有空格
- isupper()
- join(seq) 以指定的字符串作为分隔符 将seq中的所有的元素合并为一个新的字符串
- len(String)
- ljust(width,[fillchar]) 返回一个原字符串左对齐 使用fillchar 填充长度至width的新字符串
- lower() 将所有字母转换为小写
- maketrans() 创建字符映射的转换表
- max(str) 返回字符串中最大的字母
- min(str)
- repalce(old,new,[max]) 将字符串中的old替换为new 如果max指定 则替换不超过max次
- rfind(str,beg=0,end=len(string)) 类似find() 不过是从右边查找
- rindex(str,beg=0,end=len(string))
- rjust(width,[fillchar])
- rstrip() 删除字符末尾的空格或指定的字符
- split(str=””,num=string.count(str)) 以str作为分隔符截取字符串 如果num指定
仅截取num+1个子字符串 - splitlines([keepends]) 按照\r \n \r\n 分隔 返回一个包含各行作为元素的列表
- startswith(substr,beg=0,end=len(string)
- strip([chars]) 在字符串上执行 lstrip() rstrip()
- swqpcase() 将字符串中大写转换为小写 小写转换为大写
- title() 标题化字符串 所有的单词都是以大写开头 其余字母均为小写
- translate(table,deletechars=’’)根据table给出的表转换string字符串
要过滤的字符放到deletechars参数中 - upper()
- zfill(width) 返回长度为width的字符串 原始字符串右对齐 前面填充零
- isdecimal() 是否只包含十进制字符
列表
更新列表
1
2
3
4
5list = ['Google','Runoob',1997,2000]
list[2] = 2001
list.append('Badidu');
print(list)删除列表元素
1
2
3
4list = ['Goolge','Runnoob',1992,2000]
print(list)
del list[2]
print(list)列表操作符
- 用于组合列表 * 用于重复列表
len([1,23,3]) 长度
[1,2,3]+[4,5,6] 组合
[‘Hi’]*4 重复
3 in [1,2,3]
for x in [1,23,3]: print(x,end=””)
列表的截取与拼接
L=[1,23,4,5,6,7,8]
L[2] 第三个元素
L[-1] 右侧第一个元素
L[1:] 从第二个元素开始嵌套列表
a = [‘a’,’b’,’c’]
n = [1,2,3]
x = [a.n]列表比较
a = [1,2,3]
b = [4,5,6]
operator.eq(a,b)函数&方法
len(list)
max(list)
min(list)
list(seq)
list.append(obj)
list.count(obj)
list.extend(seq)
list.index(obj)
list.insert(index,obj)
list.pop([index=-1])
list.remove(obj)
list.reverse()
list.sort(key=None,reverse=False)
list.clear()
元组
修改元组
- 元组中的元素是不允许修改的
- 可以对元组进行连接组合
1
2
3
4
5tup1 = (12,34,56)
tup2 = ('abc','xyz')
tup3= tup1+tup2
print(tup3)
删除元组
1 | tup = ('Google','Runoob',1997,2000); |
元组运算符
- len((1,2,3))
- tup3= tup1+tup2
- (“hhi”,”haha”)*4
- 3 in (1,2,3)
- for x in (1,2,3): print (x,end=””)
元组的内置函数
- len(tuple)
- max(tuple)
- min(tuple)
- tuple(iterable) 将可迭代系列转换为元组
元组是不可变的
1 | tup = (1,2,3); |
字典
创建字典
1 | emptyDict={} |
访问字典里的值
1 | tinyDict={'Name':'Runnable','Age':7,'Class':'First'} |
修改字典
1 | tinyDict ={'Name':'Tom',"Age":12} |
删除字典元素
1 | del tinyDict['Name']; |
字典键的特性
- 不允许同一个键出现两次
- 键必须不可变 可以用数字 字符串或元组 但是不能够使用列表
字典的内置函数&方法
len(dict)
str(dict)
type(variable)
dict.clear()
dict.copy()
dict.fromkeys()
dict.get(key,default=None)
key in dict
dict.items()
dict.keys()
dict.setdefault(key,default=None)
dict.update(dict2)
dict.values()
pop(key,[default])
popitem()
集合
集合的创建
1 | set1=set(); |
集合的基本操作
添加元素
s.add(x)
s.update(x1,[x2])移除元素
s.remove(x)
s.discard(x)
s.pop()计算集合元素个数
len(s)清空集合
s.clear()
- x in s
集合内置方法
- add()
- clear()
- copy()
- difference()
- difference_update()
- discard()
- intersection()
- intersection_update()
- isdisjoint()
- issubset()
- issuperset()
- pop()
- remove()
- symmetric_difference()
- sysmmetric_difference_update()
- union()
- update()
- len()
条件控制
if语句
if expression:
suite
elif expression:
suite
else:
suitematch 语句
match subject:
case < pattern_1 >:
action_1
case < pattern_2 >:
action_2
case_:
action_wildcard;
循环语句
while 语句
while(condition):
action_…while else 语句
while(condition):
action_while
else:
action_elsefor语句
for var in seq:
action1
else:
action2range()函数
for i in range(5):
print(i)
for i in range(5,9):
print(i)
for i in range(0,10,3):
print(i)
推导式
列表推导式
1 | names=['Bob','Tom','John','Wendy'] |
字典推导式
1 | listdemo=['Google','Baidu','Taobao'] |
集合推导式
1 | setnew = {i**2 for i in (1,2,3)} |
元组推导式
1 | a = (x for x in range(1,10)) |
迭代器和生成器
迭代器是一个可以记住遍历的位置的对象
从集合的第一个元素开始访问 知道所有的元素都被访问完结束
两个基本方法iter() next()
1 | list=[1,2,3,4] |
创建一个迭代器
1 | class MyNumbers: |
StopIteration 异常
- 用来标识迭代的完成 防止出现无限循环的情况
1
2
3
4
5
6
7
8
9
10
11class MyNumbers:
def __iter__(self):
self.a=1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a+=1
return x
else:
raise StopIteration
生成器
- 使用了yield的函数被称为生成器generator
1
2
3
4
5
6
7
8
9
10
11def countdown(n):
while n>0:
yield n
n-=1
generator = countdown(10)
print(next(generator))
print(next(generator))
for value in generator:
print(value)
函数
定义函数
1 | def hello(): |
参数传递
- 不可变类型
整数、字符串、元组 传递的只是它的值 - 可变类型
列表 字典 将la
参数
1 | def printme(str): |
必须参数
必须以正确的顺序传入函数 调用时的数量必须和声明时一样1
printme("hello")
关键字参数
使用关键字参数来确定传入的参数值1
printme(str="hello world!")
默认参数
如果没有传递参数 会使用默认参数1
2
3
4
5
6
7def printinfo(name, age=25)
print("name",name)
print("age",age)
return
printinfo("tomg",24)
printinfo(name='John')不定长参数
1
2
3
4
5
6
7
8
9
10
11
12
13def functionname([formal_args,],*var_args_tuple):
function_suite
return [expression]
def printinfo(arg1,*vartuple):
print("输出:")
print(arg1)
print(vartuple)
printinfo(70,60,50)
匿名函数
- 使用lamda 来承建匿名函数
1
2
3
4lambda [arg1,...]: expression
x = lambda a:a+10
print(x(10))
return语句
- 用于退出函数 选择性地向调用方返回一个表达式
- 不带参数值的return语句返回None
强制位置参数
- 用来指明函数形参必须使用指定位置参数
1
2
3
4
5
6
7def f(a,b,/,c,d,*,e,f):
print(a,b,c,d,e,f)
f(10,20,30,d=40,e=50,f=60)
#a b 只能使用指定位置参数
#c d 可以是位置形参或关键字形参
#e f 要求为关键字形参
lambda 函数
- lambda函数是匿名的, 没有函数名称 只能通过赋值给变量或作为参数传递给其他函数来使用
- lambda函数通常只包含一行代码 适用于编写简单的函数
1 | f = lambda : "Hello world!" |
装饰器
- decorators 是python中的一种高级功能,允许动态的修改函数或类的行为
- 是一种函数 接受一个函数作为参数 并返回一个新的函数或修改原来的函数
- python 提供了一些内置的装饰器
1
2
3
4
5
6
7
8
9
10
11
12
13
14def decorator_function(original_function):
def wrapper(*args,**kwargs):
before_call_code()
result = original_function(*args,**kwargs)
after_call_code()
return result
return wrapper
def target_function(arg1,arg2):
pass
带参数的装饰器
1 | def repeat(n): |
类装饰器
1 | class DecoratorClass: |
数据结构
将列表当作栈来使用
1 | #创建一个空栈 |
将列表当作队列来使用
1 | #collections.deque 是双端队列 |
- 使用列表实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#创建队列
queue = []
#向队尾添加元素
queue.append('a')
queue.append('b')
#从队首移除元素
first_element = queue.pop(0)
#查看队首元素
front_element = queue[0]
#检查队列是否为空
is_empty = len(queue) == 0
#获取队列的大小
size = len(queue)
列表推导式
1 | vec = [2,3,4,5] |
嵌套列表解析
1 | matrix = [ |
del语句
1 | a = [0,1,2,3,4] |
元组和序列
1 | tup = 12345, 54321, 'hello!' |
集合
1 | set = {'apple','orange','pear','apple'} |
字典
1 | tel = {'Jack':4098,'Sape',4129} |
模块
- 模块是一个包含所有你定义的函数和变量的文件 后缀为.py
- 模块可以被别的程序引入 以使用该模块中的函数等功能
1
2
3
4
5
6import sys
print('命令行参数')
for i in sys.argv:
print(i)_
print("\n\npython路径为:",sys.path,'\n')
import 语句
- 向使用python 源文件 只需在另一个源文件里执行import 语句
1
import module1,moudle2,...
from … import 语句
- 让你从魔灵中导入一个指定的部分到当前命名空间中
- 这个声明不会把整个模块导入到当前的命名空间中
1
form modulename import name1,name2,///
深入模块
- 模块除了可以方法定义 还可以包括可执行的代码
- 这些代码只有在第一次被导入时才会被执行
- 每个模块有各自独立的符号表 在模块内为所有的函数当作全局符号来使用
1
2
3
4from fibo import fib1,fib2
fib1()
from fibo import *
name 属性
- 一个模块被另一个程序第一次引入时,其主程序将运行
- 如果向在模块被引入时,模块中的某一程序块不被执行
1
2
3
4if __name__ = '__main__'
print('程序自身在运行')
else:
print('我来自另一个模块') - 每个模块都有一个__name__ 属性 当其值是 main 表明该模块是自身在运行 否则是被引入
dir() 函数
- 内置的dir()快船找到模块内定义的所有名称 以一个字符串列表的形式返回
1
2
3
4
5
6import fibo,sys
print(dir(fibo))
#输出 ['__name__','fibo','fib2']
print(dir())
#输出 当前模块定义的所有名称
标准模块
- python本身自带一些标准的模块库
- 有些直接被构建在解析器里
- 这些组建会根据不同的操作系统进行不同形式的配置
winreg这个模块就智慧提供给window系统
sys 模块 内置在每一个python解析器中1
2
3
4
5
6
7
8
9>>import sys
>>sys.ps1
'>>>'
>>sys.ps2
'... '
>>sys.ps1 = 'C>'
print('Hello')
Hello- sys.ps1 sys.ps2定义了主提示符和副提示符的字符串
包
- 包是一种 管理python模块命名空间的形式 采用点模样名称
- A.B 表明是一个包A中的自模样B
- 在导入一个包时,PYTHON会根据sys.path中的目录来寻找这个包中包含的子目录
- 只有包含一个__init__.py的文件才会被认作是包
1 | #每次只是导入一个包内的特定模块 |
输入和输出
- python两种输出值的方法 1 表达式语句 2 print函数
- 第三种 使用文件对象的write()方法 标准输出文件可以用sys.stdout引用
- str.format()函数来格式化输出值
- repr() 或 str() 可以将输出转为字符串
1 | s = 'hello , tongzhi' |
读取键盘输入
- 提供了input 内置函数从标准输入读入一行文本 默认的标准输入是键盘
1
2str = input("请输入:")
print('你输入的内容是:',str)
读和写文件
- open() 将会返回一个file对象
open(filename,mode) - mode
- r 只读
- rb 以二进制打开 只读
- r+ 读写
- rb+
- w 只写 不存在 创建
- wb
- w+
- wb+
- a 打开一个文件用于追加 文件指针放在文件的皆为 文件不存在则承建
- ab
- a+ 读写
- ab+
文件对象的方法
f.read(size)
1
2
3
4
5
6
7
8
9#打开一个文件
f = open('/tmp/foo.txt','r')
#f.read(size) 读取一定数目的数据 size忽略或为负 该文件的所有内容都会被返回
str = f.read()
print(str)
#关闭打开的文件
f.close()f.readline()
从文件中读取单独的一行 换行符为 \n
如果返回一个空字符串 说明已经读取到最后一行f.readlines()
将返回该文件中包含的所有行
如果设置可选参数sizehint 则读取指定长度的字节 并且将这些字节按行分隔f.write(string)
将string写入到文件中 返回写入的媳字符数目
如果要写入一些不是字符串的东西 需要先进行转换1
2value = ('www.baidu.com',14)
f.write(str(value))f.tell()
用于返回文件当前的读写位置 文件指针的位置
文件指针表示 从文件开头开始的字节数偏移量f.seek()
f.seek(offset,whence)
设置文件指针的位置到 相对于whence的offset偏移量的位置
f.seek(x,0) 从开始位置 移动x个字符
f.seek(x,1) 从当前位置开始往后移动x的字符
f.seek(-x,2) 从文件的皆为往前移动个字符f.close()
处理完一个文件后,调用f.close()来关闭文件并释放系统的资源
pickle模块
- 实现了基本的数据序列和反序列化
- 能够将程序中运行的对象信息保存到文件中去 永久存储
- 通过反序列化可以从文件中创建上一次程序保存的对象
1
2pickle.dump(obj,file,[protocol])
x=pickle.load(file)
FILE
OPEN方法
open(file,mode=’r’)
完整格式
open(file,mode=’r’,buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)参数说明
- file 必须 文件路径
- mode 可选 文件打开模式
- buffering 设置缓冲
- encoding 一般使用utf-8
- errors 报错级别
- newline 区分换行符
- closefd 传入的file参数类型
- opener 设置自定义开启器 返回值是一个打开的文件描述符
mode
- t 文本模式
- x 写模式
- b 二进制模式
- 可读可写
- U 通用换行模式
- r
- rb
- r+
- w
- wb
- w+
- wb+
- a
- a+
- ab
- ab+
file 对象
常用的函数
- file.close()
- file.flush() 刷新缓存 把内部缓冲区的数据 立刻写入 文件
而不是等待被动输入缓冲区写入 - file.fileno() 返回一个整型的fd
- file.isatty() 如果文件连接到一个终端设备 返回true
- file.read([size]) 从文件读取指定字节数目 未给定或为负则读取所有 返回读取的字节数
- file.readline([size])
- file.seek()
- file.truncate([size]) 从文件的首行首字符开始截断,截断文件为size个字符
无size表示从当前位置截断 - file.write(str)
- file.writelines(seq) 向文件写入一个序列字符串列表
如果需要换行则要自己加入每行的换行符
OS
os 模块提供了非常丰富的方法用来处理文件和目录
- os.access(path,mode) 检验权限模式
- os.chdir(paht) 改变工作目录
- os.chflags(path,flags) 设置炉具的标记为数字标记
- os.chmod(path,mode) 更改权限
- os.chown(path,uid,gid)
- os.chroot(path) 改变当前进程的根目录
- os.close(fd) 关闭文件描述符
- os.closerange(fd_low,fd_high) 关闭所有的文件描述符
- os.dup(fd) 复制文件描述符
- os.dup2(fd,fd2) 将一个文件描述符fd 复制到另一个 fd2
- os.fchdir(fd)通过文件描述符改变当前的工作目录
- os.fchmod(fd,mode)
- os.fchown(fd,uid,gid)
- os.fdatasync(fd) 强制将文件写入磁盘 但是不强制更新文件的装入了信息
- os.fdopen(fd[,mode[,bufsize]]) 通过文件描述符创建一个文件对象
- os.fpathconf(fd,name) 返回一个打开文件的系统配置信息 name为检索的系配置的值
- os.fstat(fd) 返回文件描述符的状态
- os.fstatvfs(fd) 返回包含文件描述符fd的文件系统的信息
- os.fsync(fd) 强制将文件写入到硬盘
- os.ftruncate(fd,length) 裁剪fd对应的文件
- os.getcwd() 返回当前的工作目录
- os.getcwdb() 返回当前工作目录的Unicode对象
- os.isatty(fd) 终端设备返回true
- os.lchmod(path,mode) 修改连接文件权限
- …
错误和异常
语法错误
语法解析器指出的错误异常
运行期间检测到的错误异常的捕捉
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43while True:
try:
x = int(input("请输入一个数字"))
break;
except ValueError:
print("你输入的不是数字,请再次尝试输入!");
import sys
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except OSError as err:
print('Os Error: {0}'.format(err))
except ValueError:
print("Could not convert data to an integer")
except:
print("Unexpected error:",sys.exc_info()[0])
raise
for arg in sys.argv[1:]:
try:
f = open(arg,'r')
except IOError:
print("cannot open",arg)
else:
print(arg,'has',len(f.readlines()),'lines')
f.close()
try:
runoob()
except AssertionError as err:
print(err)
else:
try:
with open('file.log') as file:
read_data = file.read()
except FileNotFoundError as fnf_err:
print(fnf_err)
finally:
print('这句话,无论是否发生都会执行')
抛出异常
raise [Exception [,args[,traceback]]]
1 | x =10 |
用户自定义异常
可以通过创建一个新的异常类来拥有自己的异常
1 | class MyError(Exception): |
定义清理行为
定义了无论在任何情况下都会执行的清理行为
try:
raise KeyBoardInterrupt
finally:
print(‘Goodbye,world!’)
1 | for line in open("Myfile.txt"): |
面向对象
init() 构造方法
self 代表实例 而不是 类
def 定义一个方法
1
2
3
4
5
6
7
8
9
10class MyClass:
__weight= 0 #私有属性
def __init__(self,value):
self.value = value;
def dispaly_value(self):
print(self.value)
obj = MyClass(42)
obj.dispaly_value()继承
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25class DerivedClassName(Base1,Base2,Base3):
...
class people:
name = ''
age = 0
__weight = 0
def __init__(self,n,a,w):
self.name=n
self.age=a
self.__weight = w
def speak(self):
print('{}说:我{}岁了'.format(self.name,self.age))
class student(people):
grade = ''
def __init__(self,n,a,w,g):
people.__init__(self,n,a,w)
self.grade= g
def speak(self):
print(f"{}说:我{}岁了,我在上{}年级",self.name,self.age,self.grade)
类属性和方法
- __private_attrs 双下划线 表明 该属性为似有属性
- __private_method 私有方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37class JustCounter:
__secretCount = 0
publicCount = 0
def count(self):
self.__secretCount+=1
self.publicCount+=1
print(self.__secretCount)
counter = JustCounter()
counter.count()
counter.count()
print(counter.publicCount)
print(counter.__secretCount)#报错
class Site:
def __init__(self,name,url):
self.name = name
self.__url = url
def who(self):
print('name:',self.name)
print('url:',self.__url)
def __foo(self):
print("这是私有方法")
def foo(self):
print("这是公有方法")
self.__foo()
x=Site('Baidu','www.baidu.com')
x.who()
x.foo()
x.__foo() #报错
类的专有方法
init 构造函数
del 析构函数
repr 打印 转换
setitem 按照索引赋值
getitem 按照索引获取值
len 获得长度
cmp 比较运算
call 函数调用
add 加运算
sub 减运算
mul 乘运算
truediv 除运算
mod 求余运算
pow 乘方
运算符重载
1 | class Vector: |
命名空间和作用域
一般有三种命名空间
- 内置名称built-in names 语言内置的名称 函数名abs char BaseEXception等等
- 全局名称global names 模块中定义的名称 记录模块的变量
- 局部名称local names 函数中定义的名称
1 | var1 = 5 #全局名称 |
作用域
是一个python程序可以直接访问命名空间的正文区域
- 四种作用域
- L(Local) 最内层 比如一个函数 方法内部
- E(Enclosing) 包含了非局部也非全局的变量
- G(Global) 当前脚本的最外层
- B(Built-in) 包含了内建的变量/关键字等等
- 规则顺序
L->E->G->B
PYTHON3标准库
OS模块 SYS模块 time模块 datetime模块 random模块 math模块 re模块 json模块 urllib模样
OS模块
- 提供了不少与操作系统相关的函数
import os1
2
3
4
5current_dir = os.getcwd()
print('当前的工作目录:',current_dir)
files = os.listdir(current_dir)
print('目录下的文件:',files)
GLOB
提供了一个函数用影视从目录通配符搜索中生成文件列表
1 | import glob |
命令行参数
命令行参数 以 链表的形式存储于 sys模块 的 argv 变量
1 | import sys |
错误输出重定向和程序终止
sys 有stdin stdout stderr属性
1 | sys.stderr.write('Warning, log file not found starting a new one\n'); |
字符串正则匹配
1 | import re |
数学
提供了浮点运算对底层C库的访问
1 | import math |
随机数
1 | import random |
访问互联网
1 | form urllib.request import urlopen |
时间和日期
1 | import datetime |
数据压缩
zlib gzip bz2 zipfile tarfile
1 | import zlib |
性能度量
1 | from timeit import Timer |
正则表达式
python 中使用re.模块来处理正则表达式
re.match函数
- 从字符串的其实位置匹配一个模式 如果不是起始位置匹配成功的话 返回NONE
re.match(pattern,string,flags)
return 一个匹配的对象 否则返回NONE
可以使用group(num) groups()匹配对象函数来获取匹配表达式1
2
3
4
5
6import re
print(re.match('www','www.baidu.com').span())
#返回(0,3)
print(re.match('com','www.baidu.com'))
#返回None
1 | import re |
re.search函数
- 扫描整个字符串并返回第一个成功的匹配
re.search(pattern,string,flags=0)1
2
3import re
print(re.search('www','www.baidu.com').span())
print(re.search('www','com.baidu.www').span())
1 | import re |
检索和替换
- re.sub用于替换字符串中的匹配项
re.sub(pattern,repl,string,count=0,flags=0)
前3个参数为必选, 后2个为可选参数
repl 也可以是一个函数
1 | import re |
1 | import re |
compile函数
用于编译正则表达式
re.compile(pattern[,flags])flags:
- re.L 表示特殊字符集 \w \W \b \B \s \S 以来于当前环境
- re.MULTILINE 或 re.M 多行模式 改变^ $的行为
- re.DOTALL或re.S 使.匹配包括换行符在内的任意字符
- re.ASCII 使\w \W \b \B \d \D \s \S 仅匹配ASCII
- re.VERBOSE 或 re.X 忽略空格和注释
- re.IGNORECASE 或 re.I 使匹配对大小写不敏感
标志位可以单独使用 也可以通过按位或 | 组合使用
1 | import re |
1 | import re |
findall 函数
- 在字符串中找到正则表达式所匹配的所有字符字串 并返回一个列表
- 如果有多个匹配模式 则返回元组列表
- 如果每有匹配 返回空列表
re.findall(pattern,string,flags =0)
或
pattern.findall(string[,pos[,endpos]])
-pos 可选参数 指定字符串的起始位置默认0
-endpos 可选参数 指定字符串的结束位置 默认字符串的长度
1 | import re |
1 | import re |
re.finditer
- 在字符串中找到正则表达式所匹配的所有子串 并把他们作为一个迭代器返回
re.finditer(pattern,string,flags=0)
1 | import re |
re.split函数
re.split(pattern, string[,maxsplit=0,flags=0])
-maxsplit 分割次数 maxsplit=1 分割一次 默认=0 不限制次数
1 | import re |
正则表达式对象
re.RegexObject
- re.compile() 返回RegexObject对象
re.MatchObject
- group() 返回被RE匹配的字符串
start() 返回开始的位置
end() 返回结束的位置
span() 返回一个元组包含匹配的位置
正则表达式修饰符 可选标志
正则表达式可以包含一些可选标志修饰符来控制匹配的模式
可以单独使用 也可以 组合使用 |
- re.IGNORECASE 或 re.I 对大小写不敏感
- re.MULTILINE 或 re.M 多行匹配
- re.DOTALL 或 re.S 使得.匹配包括换行符在内的任意字符
- re.ASCII 使/w/W /b/B /d/D /s/S 仅匹配ASCII字符
- re.VERBOSE 或 re.X 忽略空格和注释
正则表达式模式
- 字母和数字表示他们自身
- 多数字母和数字前加一个\会有不同的含义
- \需要使用\转义
- 标点符号只有被转义才匹配自身
^ 匹配字符串的开头
$ 匹配字符串的结尾
. 匹配任意字符 除了换行符 re.DOTALL 可以匹配换行符
[…] 用来匹配所包含的任意一个字符
[^…] 匹配不包含的任意一个字符
re* 匹配0个或多个的表达式
re+ 匹配1个或多个的表达式
re? 匹配0个或1个的表达式
re{n} 匹配n个前面的表达式
re{n,} 精确匹配n个前面的表达式
re{n,m} 匹配n到m此由前面的正则表达式定义的片段 贪婪方式
a|b 匹配a或b
(re) 匹配括号内的表达式 也表示一个组
(?imx) 正则表达式包含3种可选标志:i m x 只影响括号中的区域
(?-imx) 关闭 i m x 可选标志
(?:re) 类似(…) 不表示一个组
(?imx:re) 在括号中使用i m x可选标志
(?-imx:re)
(?#。。。) 注释
(?=re) 前向肯定界定符
(?!re) 前向否定界定符
(?>re) 匹配的独立模式 省去回溯
\w 匹配数字 字母 下划线
\W 匹配非数字 字母 下划线
\s 匹配任意空白字符 等价于[\t\b\r\f]
\S 匹配任意非空字符
\d 匹配任意数字
\D 匹配任意非数字
\A 匹配字符串的开始
\Z 匹配字符串的结束 换行前的结束字符串
\z 匹配字符串结束
\G 匹配最后匹配完成的位置
\b 匹配一个单词边界
\B 匹配非单词边界
\n \t 等等 匹配一个换行符 一个制表符等等
\1…\9 匹配第n各分组的内容
\10 匹配第n各分组的内容
多线程
- python3中有2个模块
- _thread
- threading(推荐使用)
- _thread.start_new_thread(function,args[,kwargs])
function 线程函数
args 传递给线程函数的参数 必须是tuple类型
kwargs 可选参数
1 | import _thread |
threading模块
_thread提供了低级别的 原始的线程 及 一个简单的锁
threading 模块除了_thread模样中的所有方法外,还提供了其他方法
threading.current_thread() 返回当前线程变量
threading.enumerate() 返回正在运行的线程数量
threading.active_count() 返回正在运行的线程数量
threading.Thread(target,args=(),kwargs={},daemon=None):
创建Thread实例,
target 线程将要执行的目标函数
args 目标函数的参数 元组方式传递
kwargs 目标函数的关键字参数 以字典形式传递
daemon 指定了线程是否为守护进程
threading.Thread 类提供了以下的方法和属性:
1. init(self,group=None,target=None,name=None,args=(),kwargs={},*,daemon=None)
初始化对象
group 线程组 暂未使用
target 线程将要执行的目标函数
name 线程的名称
args 目标函数的参数
kwargs 目标函数的关键字参数
daemon 指定线程是否为守护线程
2. start(self)
启动线程
3. run(self)
线程在此方法中要执行的代码
4. join(self,timeout=None)
等待线程终止 默认情况下join()会一直阻塞 直到被调用线程终止
指定timeout 最多等待timeout秒
5. isalive(self)
返回线程是否在运行 True False
6. getName(self)
返回线程的名称
7. ident属性
线程的唯一标识符
8. daemon属性
线程的守护标志 用于指定是否是守护进程
9. isDaemon()
1 | import threading |
1 | import threading |
线程同步
1 | import threading |
线程优先级队列 Queue
Queue模块提供了同步的 线程安全的队列类 FIFO Queue LIFO LifoQueue 优先级队列
PriorityQueue
- Queue方法
Queue.qsize() 返回队列的大小
Queue.empty() 空返回True 否则返回False
Queue.full() 满了返回True
Queue.full 与 maxsize 大小对应
Queue.get([block[,timeout]]) 获取队列 timeout 等待时间
Queue.get_nowait() 相当于Queue.get(False)
Queue.put(item)
Queue.put_nowait()
Queue.task_done() 向任务已经完成的队列发送一个信号
Queue.join() 等到队列为空 再执行别的操作
1 | import queue |
日期和时间
- time 模块 和 calender 模块
time.time() 时间戳
时间元组
struct_time =
(tm_year,tm_mon,tm_mday,tm_hour,tm_min,tm_sec,tm_wday,tm_yday,tm_isdst)time.localtime(time.time())
time.strftime(format[,t])
年 %y 00-99 %Y 000-9999
月 %m 01-12
日 %d 0-31
小时 %H 0-23 %I 01-12
分 %M 00-59
秒 %S 00-59星期 本地简化%a 本地完整%A
月份 本地简化%b 本地完整%B
本地相应的日期表示和时间表示
%c年内的一天001-366
%j本地A.M. 或 P.M.的等价符
%p一年中的星期数00-53
%U 星期天为开始
%W 星期一为开始星期0-6
%w本地相应的日期表示
%x本地相应的时间表示
%X当前时区的名称
%Z%% %符号本身
获取格式化时间
time.asctime(time.localtime(time.time()))获取某月日历
calendar.month(2016,1)
time 模块
time.altzone 返回utc 偏移秒数
time.asctime([tupletime]) 返回一个24个字符的字符串
time.perf_counter() 返回系统运行时间
time.process_time() 返回进程运行时间
time.ctime([secs]) 相当于 time.asctime(time.localtime())
time.gmtime([secs]) 返回时间元组
time.localtime([secs]) 返回当地时间下的时间元组
time.mktime(tupletime)
time.sleep(secs) 睡眠secs秒
time.strftime(fmt[,tupletime])
time.strptime(str,fmt=’%a %b %d %H:%M:%S%Y’)
根据fmt的格式把一个时间字符串解析为时间元组time.time() 返回时间戳
time.tzset() 根据环境变量TZ重新初始化时间相关设置
time.perf_counter() 返回计时器的精准时间
time.process_time() 返回当前进程执行cpu的时间总和
time.timezone 当地时区
time.tzname 包含一对跟坏情况不同而不同的字符串
Calendar 模块
- calendar.calendar(year,w=2,l=1,c=6)
3个月一行 间隔距离 c 每日宽度 w 字符 每行长度21w+18+2c - calendar.firstweekday() 返回每周起始日期的设置 默认0 周一
- calendar.isleap(year) 闰年 返回 True
- calendar.leapdays(y1,y2) 返回在y1 y2 间的闰年
- calendar.month(year,month) 返回一个整数的单层嵌套列表
- calendar.montrange(year,month) 返回两个整数
- calendar.setfirstweekday(weeday) 设置每周的起始日期码
- calendar.timegm(tupletime) 返回时间戳
- calendar.weekday(year,month,day) 返回给定日期的日期码
XML 解析
- ElementTree SAX DOM
ElementTree
解析XML
- fromstring() 方法 将包含xml数据的字符串转换为Element对象
- parse() 方法 解析整个XML文档
1
2
3
4
5
6import xml.etree.ElementTree as ET
xml_string = '<root><element>Some Data</element></root>'
root = ET.fromstring(xml_string)
tree = ET.parse('example.xml')
root = tree.getroot()
遍历XML树
- find()方法 查找指定标签的第一个子元素
- findall() 方法 查找具有指定标签的偶有子元素
1
2title_element = root.find('title')
book_elements = root.findall('book')
访问元素的属性和文本内容
1 | #attrib 访问元素的属性 |
创建XML
1 | new_element = ET.Element('new_element') |
修改XML
1 | root.remove(title_element) |
1 | import xml.etree.ElementTree as ET |
1 | import xml.etree.ElementTree as ET |
SAX
ContentHandler 类方法介绍
- characters(content) 方法
- startDocument() 方法
- endDocument() 方法
- startElement(name,attrs)
- endElement(name)
make_parser方法
创建一个新的解析器对象并返回
xml.sax.make_parser([parser_list])- parser_list 可选参数 解析器列表
parser 方法
xml.sax.parseString(xmlstring,contenthandler[,errorhandler])- xmlstring xml字符串
- contenthandler ContentHandler对象
- errorhandler SAX ErrorHandler对象
1 | import xml.sax |
xml.dom 解析xml
- 文件对象模型Document Object Model DOM
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23from xml.dom.minidom import parse
import xml.dom.minidom
DOMTree = xml.dom.minidom.parse('movies.xml')
collection = DOMTree.documentElement
if collection.hasAttribute('shelf'):
print('Root element : %s'% collection.getAttribute('shelf'))
movies = collection.getElementsByTagName('movie')
for movie in movies:
print('*****Movie*****')
if movie.hasAttribute('title'):
print('Title: %s'% movie.getAttribute('title'))
type = movie.getElementsByTagName('type')[0]
print('Type: %s'% type.childNodes[0].data)
format = movie.getElementsByTagName('format')[0]
print('Format: %s'% format.childNodes[0].data)
rating = movie.getElementsBytagName('rating')[0]
print('Rating:%s'% rating.childNodes[0].data)
description = movie.getElementsByTagName('description')[0]
print('Description : %s'% description.childNodes[0].data)
网络编程
- 低级别的网络服务支持基本的Socket
- 高级别的网络服务支持服务器中心类 SocketServer
- socket() 函数
socket.socket([family[,type[,[[[proto]]])
- family 套接字家族 可以是AF_UNIX AF_INET
- type 面向连接SOCK_STREAM 非连接SOCK_DGRAM
- proto 一般不填 默认0
- Socket 对象的方法
服务器端套接字
s.bind() 绑定到(host,port)
s.listen() 开始TCP监听 backlog指定在拒绝连接前 可以挂起的最大数连接数 至少为1
大部分设置为5
s.accept() 阻塞式等待连接的到来
客户端套接字
s.connnect() 主动初始化TCP服务器连接 返回SOCKET.ERROR错误
s.connect_ex() 出错返回错误码 而不是抛出异常
公共用途的套接字函数
s.recv() 数据以字符出的形式返回 bufsize指定要接受的最
s.send()
s.sendall()
s.recvfrom() UDP
s.sendto() UDP
s.close()
s.getpeername() 返回远程地址
s.getsockname() 返回本地地址
s.setsockopt(level,optname,value)
s.getsockopt(level,optname[,buflen])
s.settimeout(timeout)
s.gettimeout()
s.fileno() 返回套接字的文件描述符
s.setblocking(flag) flag为False 为非阻塞式
s.makefile() 创建一个与该套接字相关联的文件
- PYTHON INTERNET 模块:
- HTTP 网页访问
- NNTP 阅读和张贴新闻文章
- FTP 文件传输
- SMTP 发送邮件
- POP3 接收邮件
- IMAP4 获取邮件
- TELNET 命令行
- GOPHER 信息查找