Python入门-常用模块
1.sys,os
import sys import os #获取当前的路径 print(sys.path[0]) print(os.getcwd()) print(os.path.abspath(".")) #绝对路径 """ C:\Users\john\Desktop\code C:\Users\john\Desktop\code C:\Users\john\Desktop\code """ #获取默认的编码规则 print(sys.getdefaultencoding()) # utf-8 #获取当前的平台 print(sys.platform) print(os.name) """ win32 nt 'posix'-表示Linux 'nt'----表示Windows """ #获取当前目录下的文件名和文件名 os.listdir() #删除文件,文件夹 os.remove('文件名') os.rmdir('hahaha/linghuchong') #创建文件夹,递归文件夹 os.makedirs('hahaha/linghuchong') #文件重命名 os.rename('test','test_new') #执行shell命令 os.system('pwd') #显示当前平台下路径分隔符 os.sep #给出当前平台使用的行终止符 os.linesep """ '\n' #linux '\r\n' #windows #获取系统环境变量 os.environ """ #获取父目录,子目录 res = os.getcwd() print("当前路径:",res) print("当前的绝对路径:",os.path.abspath(res)) print("当前路径父目录:",os.path.dirname(res)) print("返回该路径的最后一个目录或者文件",os.path.basename(res) ) print("路径是否是一个文件:",os.path.isfile(res)) print("路径是否是一个目录:",os.path.isdir(res)) print("获取文件或者目录信息:",os.stat(res)) """ 当前路径: C:\Users\john\Desktop\code 当前的绝对路径: C:\Users\john\Desktop\code 当前路径父目录: C:\Users\john\Desktop 返回该路径的最后一个目录或者文件 code 路径是否是一个文件: False 路径是否是一个目录: True 获取文件或者目录信息: os.stat_result(st_mode=16895, st_ino=476537135571141335, st_dev=958370624, st_nlink=1, st_uid=0, st_gid=0, st_size=4096, st_atime=1634220837, st_mtime=1634220837, st_ctime=1622276463) """ #目录分割与合并 print("路径进行操作分割:",os.path.split(res)) print("目录与文件名链接:",os.path.join(res,'test')) """ 路径进行操作分割: ('C:\\Users\\john\\Desktop', 'code') 目录与文件名链接: C:\Users\john\Desktop\code\test """ if len(sys.argv) == 1: print("程序没有输入参数") sys.exit(0) else: print("=======") for i in sys.argv: print(i) """ ======= D:\anaconda\lib\site-packages\ipykernel_launcher.py -f C:\Users\Lenovo\AppData\Roaming\jupyter\runtime\kernel-83ae40ea-1212-46ac-b201-0a7428d93e37.json """
2.copy
使用copy模块需要先导入
copy分为:浅拷贝【copy.copy( 对象)】,深拷贝【copy.deepcopy(对象)】
引用传递赋值
# 引用不可变对象时================================================================================== a = 22 b =a print(a) print(b) print(id(a)) print(id(b)) print("开始修改源数据:") a=99 print(a) print(b) print(id(a)) print(id(b)) # """ 22 22 140704197061072 140704197061072 开始修改源数据: 99 22 140704197063536 140704197061072 """ 引用对象的id和源对象id一致 当源对象改变后,引用对象id还是源对象id # 引用可变对象时================================================================================ a = dict(name="tom",age=22) b =a print(a) print(b) print(id(a)) print(id(b)) print("开始修改源数据:") a["age"]=99 print(a) print(b) print(id(a)) print(id(b)) """ {'name': 'tom', 'age': 22} {'name': 'tom', 'age': 22} 2133159287104 2133159287104 开始修改源数据: {'name': 'tom', 'age': 99} {'name': 'tom', 'age': 99} 2133159287104 2133159287104 """ 不管是否修改数据,引用传递的id和源对象id,始终保持一致
当拷贝对象为不可变对象时,无论深浅拷贝,对象id不变
import copy #使用copy需要先导入 a = "hello word" b = copy.copy(a) print(id(a)) print(id(b)) c = copy.deepcopy(a) print(id(c)) import copy a = "hello word" b = copy.copy(a) print(id(a)) print(id(b)) c = copy.deepcopy(a) d = copy.deepcopy(b) print(id(c)) print(id(b)) """ 2900547798000 2900547798000 2900547798000 2900547798000 """
当拷贝对象为可变对象,且子对象没有可变对象
无论深浅拷贝,都等于引用传递
import copy list1 = [ i for i in range(10)] a = copy.copy(list1) b = copy.copy(list1) c = copy.deepcopy(list1) d = copy.deepcopy(list1) print(a) print(b) print(c) print(d) print(id(a)) print(id(b)) print(id(c)) print(id(d)) print("开始修改源对象列表===========") list1.append(999) print(list1) print(id(list1)) print("已经改完了===================") print(a) print(b) print(id(a)) print(id(b)) print("深拷贝:") print(c) print(d) print(id(c)) print(id(d)) """ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 2133159968192 2133159967872 2133159968128 2133159964864 开始修改源对象列表=========== [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 999] 2133159967936 已经改完了=================== [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 2133159968192 2133159967872 深拷贝: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 2133159968128 2133159964864 """
当拷贝对象为可变对象,且子对象有可变对象
深拷贝对象完全独立,子对象地址也是独立的。
浅拷贝只拷贝第一层地址,不会拷贝第二层地址
import copy list1 = [ i for i in range(10)] + [[1,2,3]] a = copy.copy(list1) b = copy.copy(list1) c = copy.deepcopy(list1) d = copy.deepcopy(list1) print(a) print(b) print(c) print(d) print(id(a)) print(id(b)) print(id(c)) print(id(d)) print("开始修改源对象的子列表===========") list1[-1].append(999) print(list1) print(id(list1)) print("已经改完了===================") print("浅拷贝:") print(a) print(b) print(id(a)) print(id(b)) print("深拷贝:") print(c) print(d) print(id(c)) print(id(d)) """ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, [1, 2, 3]] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, [1, 2, 3]] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, [1, 2, 3]] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, [1, 2, 3]] 2133159151360 2133159152832 2133159151872 2133159135872 开始修改源对象的子列表=========== [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, [1, 2, 3, 999]] 2133158973824 已经改完了=================== 浅拷贝: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, [1, 2, 3, 999]] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, [1, 2, 3, 999]] 2133159151360 2133159152832 深拷贝: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, [1, 2, 3]] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, [1, 2, 3]] 2133159151872 2133159135872 """
3.偏函数partial
# 不使用偏函数的调用如下: def add(a,b,c =2): return a + b +c add(2,3,4) # 9 from functools import partial #使用偏函数,需要先导入模块 def add(a,b,c =2): return a + b +c res = partial(add,100,200) #偏函数调用 print(res()) print(res(30)) """ 302 330 """ 使用偏函数,可以减少一些长参数函数的数据传递问题
4.math模块
from math import * print("阶乘计算:", factorial(10)) print("累加计算:", fsum(range(101))) print("乘方计算:", pow(10,3)) print("对数计算:", log2(10)) print("余数计算:",fmod(10,3) ) # 四舍五入计算,roun i=4.5 print(round(i)) #偶数.5不会进1,这是bug,修复思路如下 res = (round(i) +1) if (i-0.5) % 2 ==0 else round(i) print(res) print(round(6.666666,2)) # 也可以设置小数保留位数,6.67
5.random随机数
# randint(开始,结束),获取范围内的一个随机整数================== import random randint_num = "" for i in range(6): res = random.randint(0,9) # 此处可省列random randint_num += str(res) print(randint_num) # 767568 #choice(对象),获取对象中的一个随机数=========================== numbers = [ i*2 for i in range(10)] print(numbers) for i in range(5): print(random.choice(numbers), end=",") #此处的random可省略 """ 16,12,0,18,4, """
6.MapReduce数据处理
numbers = list(range(10)) filter_res = list(filter(lambda x : x%2 ==0, numbers)) # 最后进行list转变 print(filter_res) map_res = list(map(lambda x: x*2, filter_res)) # 最后进行list转变 print(map_res) from functools import reduce reduce_res = reduce(lambda x,y: x + y, map_res) print(reduce_res) """ [0, 2, 4, 6, 8] [0, 4, 8, 12, 16] 40 """
7.hashlib编码模块
import hashlib """ Python中的hashlib中提供了常见的摘要算法【MD5,SHA1等】 摘要算法:哈希算法,散列算法,通过一个函数,把任意长度的数据转换为长度固定的数据,一般使用16进制的字符串表示 通过函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了监测原始数据是否被人篡改过 """ #MD5=========================================== md5 = hashlib.md5() md5.update("this is a test".encode("utf-8")) print(md5.hexdigest()) #print("中文23432this is a test".encode("utf-8")) #SHA1=========================================== sha1 = hashlib.sha1() sha1.update("this is a test".encode("utf-8")) print(sha1.hexdigest()) """ MD5加密的特点: 1.不同长度的数据,md5的值的长度有可能相等 2.从原始数据计算md5的值速度很快,hashlib.md5() 3.已知一个原始数据和对应的md5字符串,想要找到一个具有相同md5值的原始数据是很困难的,md5的加密是不可逆的 4.如果对原始数据做了任何修改,不管数据量多大,生成的md5的结果完全不同 """