一些 python 的学习笔记。

一、基本数据类型

Nunber、string、list、tuple、dict、set

1、number 类型

主要包含: int、float、bool Bool 类型在 python 中归纳为 int 的一个子类,值有两个:True / False

2、string 类型

主要包含: 字母、数字、下划线、汉字等 一般使用单引号或双引号来包裹字符或字符串。 可用三个单引号包裹多行字符串:

'''
 ABCD
 abcd
'''

3、list 类型

列表用[]来表示,[]中可放字符、字符串、数字或是嵌套列表

4、tuple 类型

元组使用 () 来表示, () 中可放字符、字符串、数字或是嵌套元组。 元组是特殊的列表, 其元素不可更改

5、dict 类型

一般情况下,key 使用字符串,需用引号括起来

6、set 类型

集合使用{}表示,{}里直接放值 如:{123, abc, 编程}

二、input 输入函数

1、参数是提示信息 2、输入的内容使用变量接收。如:password = input (“请输入密码:”) 3、input 函数执行完毕后返回的是字符串类型 4、input 函数执行时,输入结束后按下回车键 input () 才会结束,进而执行下一段代码

三、python 的数据类型转换

转换形式:int –> string string –> int bool –> int 在 python 中,字符串和整型不能直接进行数学运算

1、int (x, base=10) 将其它类型转换为整型

参数: 1、x, 要转换的数据变量 2、base = 10, 以十进制(默认)转换为整型 不是所有类型都可通过 int () 转换为整型,如“python”转换时会报错。一般是数字字符串转换为整型

2、str (x) 将其它类型转换为字符串类型

参数: x, 要转换的数据变量

3、float (x) 将其它类型转换为浮点型

参数: x, 要转换的数据变量 不是所有类型都可通过 int () 转换为整型,如“python”转换时会报错。一般是数字字符串转换为浮点型

4、bool (x) 将其它类型转换为布尔型

Python 中 bool 类型有两个值:True 和 False(注意首字母大写) 数字 0、空字符串、空列表、空元组、空字典、空集合等为 False,其余为 True 隐式类型转换,不通过 bool () 进行转换,一般用于条件表达式:如:“ 3>4 ” 为 False,“1+1=2”为 True

5、list (x) 将其它类型转换为列表

如:

tup = (1,2,3)      //此时tup类型为tuple
list(tup)          //将tup类型转换为list

不是所有类型都可通过 list () 转换为列表,一般是字符串或元组转换为列表

6、tuple (x) 将其它类型转换为元组

一般情况下,是字符串和列表转换为元组

注: type (x) 可返回变量 x 的类型

三、python 的算术运算符

'+'(加法)   '-'(减法)   '*'(乘法)  '/'(除法)  '%'(取余或求模)  '**'(幂)  '//'(取整)

算术运算符在字符串中的应用

 “hello" + "world" = "helloworld" (拼接字符串)

注意:python 中,数字和字符串不能进行加法运算,只能是字符串和字符串拼接

四、python 的赋值运算符

1、简单的赋值运算符: “=”, 表示把右边的值赋给左边的变量, 和数学中的等好不同 2、复合运算符:

'+='  '-='  '*='  '/='  '%='  '**='  '//='

注意:pyhon 中不支持‘++’‘–’操作

五、python 的关系运算符

'>'  '<'  '>='  '<='  '=='  '!='

除数字外,字符串也可使用关系运算符进行操作,字符串比较时通过 ASCLL 码值进行比较

六、python 的成员运算符

‘in’ (在指定序列中找到指定值则返回 True, 否则返回 False) ’not in’ (指定值不在指定序列中返回 True, 否则返回 False)

七、python 的逻辑运算符

‘and’ (且运算) ‘or’ (或运算) ’not’ (非运算)

A and B ==> A和B同时为真时返回True,只要有一个为假,则返回False
A or B  ==> A和B有一个为真即返回True,同时为假才返回False
not A   ==> 对原来的结果取反

Python 的逻辑运算符可以操作任何类型的表达式,不论表达式是否为 bool 类型。

同时,其运算的结果也不一定为 bool 类型。

短路运算

Python 中的‘and’和‘or’不一定会计算右边表达式的值,有时只需计算左边表达式即可得出结果 ‘and’和’or‘会将其中一个表达式的值作为最终结果,而不是 True 或 False ​

八、python 的流程控制

1、顺序结构:

程序从头到尾执行每一条语句。不重复、不跳过任何一行代码。

2、分支结构 (选择结构):

让程序有选择地执行某段代码。

单分支语句:
if 条件:
	代码块  			//这里强制缩进,是python的语法特点,不需要花括号。

​ 执行流程: 若条件成立, 则执行缩进的代码块, 否则跳过。

双分支语句:
if 条件:
	代码块1
else:
    代码块2

执行流程: 若条件成立, 则执行代码块 1, 否则执行代码块 2。

三元运算符:

三元运算符是对 if.. Else.. 语句的简化 三元运算符的写法:

max = a if a > b else b

运算流程: 若 a>b 成立, 则把 a 赋给 max, 否则把 b 赋给 max

多分支语句:
if 条件1:
	代码块1
elif 条件2:
	代码块2
elif 条件3:
    代码块3
else:
    代码块4

多分支语句中,只会执行其中满足条件的一项

if 语句的嵌套
if 条件1:
	if 条件1.1:
		代码块1
	elif 条件1.2:
		代码块2:
	else:
        代码块3
else:
	if 条件2.1:
		代码块4
	else:
        代码块5

Pass 关键字, 在 python 中没有任何意义, 只用来实现单纯的占位, 保证语句完整

3、循环结构

while 循环

语法:

初始条件
while 判断条件:
	代码块
    更新条件

Break 和 continue 关键字:

Break 指跳出循环不再执行。

Continue 指跳出此次循环,继续执行下一次循环。 ​

for 循环

Python 中的 for 循环与其它语言不同,指的是 for… In… 循环。 语法:

for 元素 in 可迭代对象:         --->      for i in range(m,n)
	代码块                                   代码块

注意: 1、python 中的可迭代对象一般指字符串、列表、元组、集合等 2、python 中使用 for.. In.. 循环时, 一般需配合一个内置类 range。 Range 可生成一个指定区间的序列。语法: range (m, n) //生成区间为[m, n) 的序列 (左闭右开) 循环的嵌套: 实际应用中,循环的嵌套层级不会超过三层

九、python 的字符串

1、字符串的声明:

使用一对单引号/双引号/三引号进行声明 例如:

str1 = 'hello world'
str2 = "hello python"
str3 = '''hello code'''

2、字符串的嵌套规则:

外层是单引号, 内层只能是双引号。外层是双引号, 内层只能是单引号。

3、字符串的转义字符:

\ (让符号失去原有的意义)

例如:

如要单独输出双引号,则应使用\""代替
\''   -->表示转义单引号
\""   -->表示转义双引号
\n    -->表示换行
\t    -->表示制表符(相当于tab键的作用)

4、特殊字符

“r”: 字符串前加 r 表示原样输出 “f”: 字符串前加 f 表示支持花括号语法,即在字符串中嵌入变量 例如:

name = "张三"
age = 18
print(f"我的名字是{name},年龄是{age}")
==>我的名字是张三,年龄是18

5、字符串的下标和切片

下标 (索引): 表示第几个元素, 默认从 0 开始。可通过下标获取指定位置的元素 例如:

str = "hello world"
print(str[4])
==>o

切片: 从字符串中复制指定的一段内容, 生成一个西的字符串 切片的语法:

str[start:end:step]
str表示要切片的字符串
start表示开始下标(包含开始下标的数据)
end表示结束下标(不包含结束下标的数据)
step表示步长,默认为1

6、字符串的常见功能

1> 统计字符串长度 len ()

例如: len (str)

2> 在整个字符串中, 统计子串出现的次数 count ()

例如: str.Count (str 1) –> 统计在字符串 str 中,子串 str 1 出现的次数

3> 字符串的大小写转换: upper () lower () swapcase () title ()

例如:

str1.upper()     -->将str1中的小写字母转换为大写字母
str2.lower()     -->将str1中的大写字母转换为小写字母
str3.swapcase()  -->将字符串中的大写字母转换为小写字母,小写字母转换为大写字母
str4.title()     -->将单词的首字母转换为大写
4> 查找字符串出现的位置: find () index ()

Find () 查找子串在字符串中第一次出现的位置。若找到,返回下标,否则返回-1。 例如: str.Find (“str 1”) –> 寻找 str 1 在 str 中第一次出现的位置 ​

在指定范围内查找: str.Find (“x”, start. End)

Rfind () 查找子串在字符串中最后一次出现的位置。若找到,返回下标,否则返回-1。

Index () 和 find () 功能类似,区别是若未找到即报错。

Rindex () 和 rfind () 功能类似,区别是若未找到即报错。

5> 字符串的提取: strip () lstrip () rstrip ()

Strip () 去除字符串两边的指定字符,默认为空格 例如: str.Strip (“x”) –>去除 str 两边的 x

Lstrip () 只去除字符串左边的指定字符 Rstrip () 只去除字符串右边的指定字符

6> 字符串的分割和合并: split () join ()

Split () 以指定字符对字符串进行风格,默认为空格 例如: str.Split ()

Join () 合并字符串 例如: str.Join (tup) –>用 str 对 tup 进行拼接

7> 字符串的替换和判断:

Replace () isupper () islower () isdigit () isTitle () isalpha ()

Replace () 将字符串中的指定内容进行替换 参数 1: 要替换的内容参数 2: 替换后的内容参数 3: 控制替换的次数 例如: str.Replace (“A”,“B”, 1) –>将字符串 str 中的 A 替换成 B,次数为 1 Isupper () 检测字符串中的字母是否全为大写,返回值为布尔型 (True/False) 用法: str.Isupper ()

Islower () 检测字符串中的字母是否全为小写,返回值为布尔型 (True/False) 用法: str.Islower ()

Isdigit () 检测字符串是否只由数字组成,返回值为布尔型 (True/False) 用法: str.Isdigit ()

IsTitle () 检测字符串中单词的首字母是否全为大写。

Isalpha () 检测字符串中的字符是否全为字母、汉字或数字组成。

7、字符串的编码、解码及 ascii 码的转换

//常用编码格式: GBK UTF-8

1> encode () 编码

Str.Encode (‘utf-8’) –> 以 UTF-8 格式对字符串 str 进行编码

2> decode () 解码

Str.Decode (‘gbk’) –> 以 GBK 格式对字符串 str 进行解码

3> chr () 将 ascii 码值转换为对应的字符

Chr (97) –> ascii 码'97’对应的字符为 a

4> ord () 将字符转换为对应的 ascii 码值

Ord (‘a’) –> 97

8、字符串的格式化输出

通过%占位符的方式进行输出

%     -->   占位符
%d    -->   表示整数
%f    -->   表示浮点数
%.2f  -->   表示按两位小数输出(小数位数可控)
%c    -->   表示单个字符
%s    -->   表示字符串

例如:

name = '张三'
print("my name is:%s" %name)    //这里与C语言的区别在对变量的引用,需用%加持。

注: 这里也可在字符串前加 f,使其支持花括号语法进行占位。

十、列表 (相当于 C 中的数组)

列表可以一次性保存多个数据, 每一个数据叫做一个元素。列表使用[]来表示。 列表的索引可正可负, 正数表示从左往右, 负数表示从右往左。

定义列表:

list1 = ['A','1','你好']
列表中的元素可以是不同的数据类型,也可以是一个新的列表,即列表的嵌套。
获取/修改列表的元素是通过下标进行的,下标从 0 开始。

遍历列表:

方式一
for i in list1:
	......
方式二 (可同时遍历索引和值)
for index,value in enumerate(list1):
        ......

列表的常见操作:

1、合并列表 (通过’+‘实现)
list1 = ['A','B','C']
list2 = ['a','b','c']
list3 = list1 + list2
2、判断指定元素是否在列表中

(通过成员运算符’in’或’not in’进行检查, 返回值为 True/False)

if 'str' in list1:
	......
3、列表的切片
list1[start:end:step]
4、列表元素的添加

方法一: append () 向列表尾部追加元素

list1.append("x")  		//向列表list1尾部追加元素x

注意:

1、append () 追加单个元素时,直接把要追加的内容放到函数内即可。 2、append () 一次性追加多个元素,需要以列表的形式追加,但原来的列表会变成二维列表。

方法二: extend () 可以在列表尾部一次性追加多个元素且不改变原列表的维度,但仍需以列表的形式追加。

list1.extend(['x','y'])

用 extend () 追加一个元素,会对元素做一次拆分后追加

方法三: insert () 向列表的指定位置添加指定元素

list1.insert(参数1,"参数2")  	//参数一:追加的位置(某个下标前)  参数二:追加的内容

若要一次性追加多个元素,需要以列表的形式追加,但会改变原列表的维度。

5、列表元素的删除

方法一: pop () 删除指定位置的元素

list1.pop(参数)  		//参数为要删除元素的下标。不填参数时默认删除最后一个元素

方法二: remove () 删除指定元素

list1.remove(参数)  	//参数为要删除的元素

方法三: clear () 清空列表

list1.clear()  		//清空整个列表
6、列表元素的排序、反转和获取
列表的排序

方法一: sort ()

list1.sort()  				//对原列表中的元素进行排序,默认为升序,不会生成新列表
list1.sort(reverse=True)  	//降序排列,传入参数reverse=True

方法二: sorted ()

list2 = sorted(list1)  		//对原列表(list1)进行排序,默认为升序,会生成一个新列表,传递给list2。
list2 = sorted(list1,reverse=True)  //降序排列,传入参数reverse=True
list2 = sorted(list1,key=len)  		//添加key=len(排序依据),按照元素长度进行排序
列表的翻转

Reverse () 翻转列表元素

 list1.reverse()
获取列表长度 (获取列表的元素个数)

Len ()

len(list)
获取列表中元素的最大值/最小值

Max () / min ()

max(list) / min(list)
获取指定元素的索引

Index ()

list.index(x)  //获取元素x在列表list中的下标
7、列表的嵌套

列表中的元素还是列表 (相当于二维数组),称为二维列表 访问二维列表的方式与 C 中访问而为数组元素的方式相同,即:

list[m][n]
8、列表生成式
1> list1 = list(range(start,end,step))   						//生成指定区间内整数组成的列表
2> list2 = [i ** 2 for i in range(start,end,step)]  	   //生成指定区间内整数的平方组成的列表
3> list3 = [i for i in range(start,end,step) if i %2 == 0]    //生成指定区间内的偶数组成的列表

十一、字典

字典相当于 C 语言中的结构体 字典用花括号标识 字典由键 (key) 和值 (value) 组成,健和值一一对应,由": “连接。不同键值对间用”,“隔开

dict1 = {"name":"张三", "age":18, "school":"清华大学"}

访问字典中的元素:

1、通过索引的方式访问 --> 	dict1['key']
2、通过get()        -->     dict1.get('key')

修改字典中的元素:

dict1['key'] = '更改为的值'

向字典中添加元素:

dict1['新增加的key'] = '新增加的值'

删除字典中的元素:

1、pop()  		--> 	dict1.pop('key')  	//key为要删除元素的键
2、popitem() 	--> 	dict1.popitem() 	//删除字典的最后一对key:value
3、clear()   	--> 	dict1.clear()   	//清空字典

字典的获取:

Len () 获取字典的长度
len(dict1)  --> 统计键值对的个数
Keys () 获取字典中所有的 key
dict1.keys()
Values () 获取字典中所有的 value
dict1.value()
Items () 获取字典中所有的 key 和 value
dict1.items()

遍历字典:

方式一: 直接遍历字典

for i in dict1:     //遍历字典中所有的key
	......

方式二: enumrate ()

for k,v in enumrate(dict1):     //遍历字典中所有的key及其下标
	......

方式三: items ()

for k,v in dict1.items():       //遍历字典中所有的key和value
	......

方式四: values ()

for v in dict1.values():        //遍历字典中所有的value
	......

方式五: keys ()

for k in dict1.keys():          //遍历字典中所有的key
	......

合并字典

Update 方法
dict1.update(dict2)         //把字典dict2追加到字典dict1后部

十二、集合

集合 (set) 是 python 中的一种数据类型,和数学中的集合类似

集合的特点:

1、无序 2、无重复

创建集合:

set1 = {value1, value2,....}    	//集合和字典的区别就是集合只有值(value),没有键(key)

注意:集合不能通过下标访问或修改 (无序性)

获取集合的长度: len ()

len(set1)   		//获取集合中的元素个数

向集合中添加元素: add () update ()

set1.add(value)     //向集合set1中添加值value,add()方法一次只能添加一个元素
set1.update(list)   //向集合set1中添加多个值,以列表list的形式添加

删除集合中的元素: pop () remove () discard () clear ()

set1.pop()              //随机删除集合中的一个元素
set1.remove(value)      //删除集合中值为value的元素,若删除不存在的元素会报错  
set1.discard(value)     //删除集合中值为value的元素,若删除不存在的元素不会报错
set1.clear()            //清空集合

遍历集合:

for i in set1:
	......

十三、元组

元组和列表类似,本质上是一种有序的集合。 元组和列表有区别:

1、定义元组使用 (),定义列表使用[] 2、元组中的元素不可修改,列表中的元素可修改

创建元组:

tup = (value1, value2, ......)      //元组中的元素可以为任意类型

若创建元组时元组中只有一个元素, 需要在该元素的后面加上一个逗号, 否则不会被识别为元组

访问元组: (和列表类似)

通过下标访问 tup[x]

合并元组:

通过‘+’来实现
tup = tup1 + tup2

判断元素是否在元组中:

使用成员运算符‘in / not in‘

元组的切片:

tup[start:end:step]

获取元组的长度:

len(tup1)

获取元组中元素的最大值/最小值:

max(tup)/min(tup)

其它数据类型转换为元组

tuple ()

tup = tuple(list1)      //将列表list1转换为元组后传递给tup

遍历元组: (与遍历列表类似)

直接遍历:

for v in tup1:
	......

enumrate ():

for i,v in enumerate(tup1):     同时遍历元组的元素及其下标
	......

十四、赋值、浅拷贝、深拷贝

赋值: 本质上就是对象的引用

list1 = ['a', 'b', 'c']
list2 = list1

如此赋值,实际上是让 list 2 指向 list 1 中元素在内存的地址,即 list 1 和 list 2 共同指向内存中的同一个地方,所以当修改 list 1 中的值时,list 2 的值也会被修改

浅拷贝:

为了解决上述问题,可以使用浅拷贝 (copy) 的方法: 使用浅拷贝,需导入 copy 模块: import copy

import copy
list1 = [value1, value2, ......]
list2 = list1.copy()        			//如此操作后,开辟了一段新的内存空间,list1和list2的值就互不影响

浅拷贝可以解决一维列表的复制问题 对于二维列表,使用浅拷贝后,外部列表分别位于内存的不同空间,但内部列表的元素仍位于同一内存空间

深拷贝:

使用深拷贝 (deepcopy) 可以解决二维 (多维) 列表修改元素时不能独立处理的问题。同样需要导入 copy 模块

import copy
list1 = [value1, value2, ......]
list2 = copy.deepcopy(list1)        //注意深拷贝的语法,与浅拷贝不同

十五、函数

函数要解决的问题: 1、重复的代码 2、程序的维护 ===> 函数就是把在项目中经常使用的功能代码提取出来并封装,方便后续不同地方的调用。

函数的基本语法:

def 函数名(参数1, 参数2, ......):
	函数体
使用 def 关键字来声明函数
函数由两部分组成: 声明部分和实现部分
函数定义时的参数,叫做形参,可写可不写,取决于函数功能
函数体要缩进
函数在使用前必须调用,调用格式: 函数名 ()
函数的调用必须在函数定义之后

函数调用时的注意事项:

在同一个文件中,若出现定义的函数名相同的情况,后面定义的函数会覆盖前面定义的函数
若将函数名复制给一个变量,就可以通过这个变量来调用函数
函数必须先定义后使用

函数的参数:

定义函数时传递的参数叫作形参
调用函数时传递的参数叫作实参,实参会取代形参的位置
若在定义函数时有形参,则在调用函数时必须传入实参,且实参和形参的数量必须相同

函数中参数的类型:

a.必须参数  -->  在调用函数时, 必须以正确的顺序传递参数
b.关键字参数  -->  使用关键字参数调用函数,允许实参和形参的顺序不一致
def f(x,y):
	......
f(y=value1, x=value2)
c.默认参数  -->  定义函数时若定义了默认参数,在调用时可以不传递实参,使用默认参数,而传递实参后,会覆盖默认参数。默认参数应置于参数列表末尾。
def f(x,y=5):
	......
f(6)				#函数f在定义时有两个形参,但有一个参数被定义为了默认函数,所以在调用该函数时可以只传递一个实参

​ d.不定长参数:

*args 用来接收多个未知参数,得到的是一个元组。
def f(*args):        //如此定义后,调用函数时可以同时传递任意多个参数。不定长参数应置于参数列表末端。
	......

**kwargs 用来接收多个关键字参数,得到的是一个字典。在传递参数时,必须是以key=value的形式。
def f(**kwargs):
	......
f(key1=value1, key2=value2, ......)

函数的返回值:

函数按照有无返回值分为两类: a.有返回值  b.无返回值
函数的返回值需要使用‘return’关键字进行返回, 函数在哪里调用,函数的返回值就返回到哪里
函数的返回值使用,可以使用变量接收,也可以直接打印输出
def f():
	......
    return x
函数中的代码执行到 return 关键字之后就停止,return 关键字之后的语句不会执行
函数中没有 return 关键字或没有数据返回,则默认返回 NULL
Return 可以一次性返回多个数据,数据之间使用逗号隔开,返回的结果是一个元组

函数的嵌套:

函数之间可以相互嵌套,即自定义函数内部可以调用其它函数

匿名函数:

函数按照有无名字,分为两类: 有名函数和匿名函数 匿名函数是一个使用 lambda 定义的表达式,比普通函数简单。 Lambda 表达式中包含参数、函数体、返回值

num1 = lambda num:num ** 2      //参数为num.返回值为num**2

回调函数:?

把一个函数 f () 作为一个参数传递到另一个函数中,那么 f () 称为回调函数
def f():
	......
def g(func):
    func()
g(f)            	//把函数f作为参数传入函数g,实现函数g对函数f的调用

闭包函数:?

若一个函数内部嵌套了另一个函数,则外部函数称作外函数,内部的函数称作内函数 闭包: 若在一个外部函数中定义了一个内部函数,且外部函数的返回值是这个内部函数,则这个内部函数成为闭包 最简单的闭包:

def outer():
    def inner()
        ......
    return inner      		//注意: 这里返回的是函数体,不是函数的调用
fn = outer()            	//这里使变量fn指向inner函数
fn()                   		//这里就相当于调用的inner函数

闭包函数的特点: 内部函数可以使用外部函数的变量, 闭包函数主要应用于装饰器函数的实现

函数的作用域

分支语句和循环语句不存在作用域的问题,它们内部定义的变量可以在外部直接访问 函数内部定义的变量,在函数外部不能直接访问 函数内部可以直接访问函数外部的变量 若要在函数内部修改函数外部的变量,需要使用 global 关键字将函数内部的变量变为全局变量

十六、filter 和 map 方法

Filter 在 python 3 中是一个内置类, 但仍以函数的方式调用 Filter () 内置类有两个参数, 第一个参数是一个函数, 第二个参数是一个可迭代对象 Filter () 的返回值是一个 filter 类型的对象

Map 和 filter 的功能类似 Map () 有两个参数, 第一个参数是一个函数, 第二个参数是一个可迭代对象 Map () 的返回值是一个 map 类型的对象 Filter () 适用于对可迭代对象中元素的筛选,map () 适用于对可迭代对象中元素的处理

十七、装饰器

装饰器可以在程序运行过程中,动态地添加功能

装饰器的常规写法:

def f1():
        ......
#这里的outer()就是一个装饰器,用于修改某个函数的功能
def outer(fn):               #fn表示形参,实际调用装饰器时,传入的实参是原函数的名字
	def inner():
	   	fn()				 #调用原函数
       	补充的功能语句         #给原函数添加功能
	return inner			 #闭包函数的写法,返回的是函数体,不是函数的调用,不加括号
  
f1 = outer(f1)
f1()

装饰器的简化写法:

@ + 装饰器名称

def outer(fn):               #fn表示形参,实际调用装饰器时,传入的实参是原函数的名字
	def inner():
	   	fn()				 #调用原函数
       	补充的功能语句         #给原函数添加功能
	return inner			 #闭包函数的写法,返回的是函数体,不是函数的调用,不加括号

@outer       	#等价于f1 = outer(f1),这是简化写法,表示给函数f1添加一个装饰器
def f1():		#使用简化写法时,原函数定义必须在装饰器函数下面,否则报错
	......
f1()			#经装饰器修饰、添加功能后,再次调用原函数

装饰器的其它用法:

1、一个装饰器函数修饰多个函数
def outer(fn):
	def inner(*args):			#这里使用不定长参数,使得传入的原函数带有多少个参数都可以
		fn(*args)
		补充的功能语句
	return inner
@outer							#每次修饰前都调用一次装饰器函数即可
def f1(parameter1,parameter2)
	......
@outer
def f2(parameter1,parameter2,parameter3)
	......
f1(parameter1,parameter2)
f2(parameter1,parameter2,parameter3)
2、一个原函数有多个装饰器函数修饰
def outer1(fn):					#定义第一个装饰器
	def inner1():
		fn()
		补充的功能语句
	return inner

def outer2(fn):					#定义第二个装饰器
	def inner2():
		fn()
		补充的功能语句
	return inner2

@outer1							#在定义原函数前,调用要使用的装饰器
@outer2							#修饰的顺序是:从离原函数近的装饰器开始
def f():						#不论有多少个装饰器,原函数只执行一次
	......

十八、python 中的模块

1、模块的介绍及引用

python 模块的简单介绍:

Python 中的模块可理解为具有不同功能的. Py 文件,但不是所有. Py 文件都能被当作模块导入使用。

能作为模块导入使用的. Py 文件必须遵循命名规则

Python 提供了很多内置模块可直接使用

常见的内置模块:

Os、sys、re、math、random、datetime、time、calendar、hashlib、hmac 等

调用模块的方式:

第一种:直接使用 import 关键字导入模块

import 模块名称

导入某个模块后,可以使用该模块下的方法

第二种:

from 模块名 import 该模块下的方法名

这种方法可以直接导入指定的方法,调用此方法时可直接使用,不用以模块. 方法的方式使用

第三种:

from 模块名 import *		#此处的星号表示该模块下的所有方法和变量名

第四种:

import 模块名 as 别名   #as表示给导入的模块起一个新的名称,调用时可以直接使用别名

第五种:

from 模块名 import 方法名 as 别名   #as表示给导入的方法起一个新的名称,调用时可以直接使用别名

2、math 模块的使用

Math 模块保存了数学运算的相关方法,主要用于数学运算的操作

使用前需要导入:

import math

Math 模块的常用方法:

math.fabs(x)			#取绝对值
math.ceil(x)			#向上取整
math.floor(x)			#向下取整
math.pi					#圆周率的值
math.pow(x,y)			#计算x的y次方
math.factorial(x)		#计算x的阶乘
......

3、os 模块的使用

Os 模块主要用于获取系统的功能,操作文件或文件夹

使用前需要导入:

import os

Os 模块的常用方法:

os.curdir						 #获取当前目录
os.getcwd()						 #获取当前路径
os.mkdir("路径+文件夹名称")	    #创建文件夹,只能创建不存在的文件夹,不能创建已存在的文件夹
os.rmdir("路径+文件夹名称")	 	#删除文件夹,只能删除空文件夹
os.rename("原来的名字","新名字")    #重命名
os.remove("路径+文件名")			  #删除文件
os.path.join("路径1","路径2")	   #拼接路径
os.path.getsize("路径+文件名")	  #获取文件大小
os.path.isfile("路径+文件名")	  #判断是否为文件,返回值为True/False
os.path.isdir("路径+文件名")		  #判断是否为文件夹,返回值为True/False
os.path.exists("路径+文件名")	  #判断文件/文件夹是否存在,返回值为True/False