python函数总结

这篇博客全面总结了Python中的常用函数,包括系统函数、列表、集合、字典、字符串等数据结构的操作,以及函数、变量作用域、匿名函数、装饰器等概念。此外,还涵盖了文件操作、时间模块、正则表达式等相关知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系统函数

  1. print 输出
  2. input 输入
  3. type 查看数据类型
  4. del 删除
  5. int 整型
  6. str 字符串
  7. float 浮点型
  8. ord 查看字符对应的整数
  9. chr 查看整字对应字符
  10. pow 求幂
  11. divmod 求商和余数
  12. abs求绝对值
  13. range 产生特殊序列的对象
  14. enmerate 枚举对象
  15. counter 统计元素及次数
  16. round 四舍五入
  17. max 求最大值
  18. min 求最小值
  19. sum 求一个序列所有元素的和
  20. format 占位函数
  21. len 可以统计字符串的长度

列表函数

  1. append 在列表末尾添加一个元素

  2. insert 在指定下标添加个一新的元素,不覆盖原数据,原数据向后延申

  3. index 查找列表中元素第一次出现的下标

  4. extand 将序列中的元素添加到列表

  5. remove 删除列表中的指定元素

  6. del 根据下标删除列表中的元素

  7. reverse 将列表逆序

  8. sort 将列表升序排列

  9. pop 弹出并删除列表中的元素,默认最后一个,可以指定下标

  10. count 统计元素出现的个数

  11. enumerate 列举

  12. enumerate 遍历列表,同时给出下标和值

  13. range 生成一个列表

集合的函数

  1. add 添加一个元素
  2. remove 删除元素 不存在会报错
  3. discard 删除元素, 不存在不会报错
  4. pop 随机弹出一个元素,并删除
  5. union 并集
  6. intersection 交集
  7. difference 差集
  8. isdisjoint 判断是否有交集
  9. issubset 判断是否是子集
  10. insuperset 判断是否是父集
  11. clear 清空元素
  12. abs 绝对值

字典的函数

  1. get 通过键,获取值,不存在返回None,可以指定默认值
  2. update 添加键值对,存在的就覆盖,不存在就添加
  3. setdefault 键存在就返回对应值,不存在先添加,再返回。值默认值None,可以指定
  4. popitems 随机弹出并返回一个键值对,一般是末尾的元素,字典为空会报错
  5. pop 删除指定的键,并返回值,一般是末尾的元素,没有会报错。
  6. items 返回字典的所有键值对组成(每个键值对是一个元素)列表,可以遍历,转换

字符串的函数

  1. splitlines 按照换行进行切割
  2. split 按照指定内容进行切割
  3. join 拼接字符串
  4. find 查找字符串的某个内容出现的次数
  5. rfind 从右边开始查找出现的次数
  6. count 统计字符串出现的次数
  7. startwith 判断字符串是否以指定内容开头
  8. endwith 判断是否以指定内容结尾
  9. upper 全部转为大写
  10. lower 全部转为小写
  11. swapcase 大小写互换
  12. capitalize 首字母大写
  13. title 每个单词首字母大写
  14. replace 替换指定内容
  15. isupper 判断是否全是小写
  16. isdecimal 判断是否全是数字
  17. istitle 判断是否每个单词首字母都大写
  18. isalpha 判断是否群是字母
  19. isalnum 判断是否全是数字或字母
  20. isidentifier 判断是否是合理的标识符
  21. ljust 左对齐,右侧填充指定内容,默认填充空格
  22. rjust 右对齐,左侧填充指定内容,默认填充空格
  23. center 居中对齐,两边填充指定内容,默认填充空格
  24. strip 同时去除两边的指定内容的字符串
  25. lstrip 去除左边的指定内容的字符
  26. rstrip 去除左边的指定内容的字符

函数

  1. return 返回
  2. args **kwargs 接收多余参数args 返回的是元祖,接收有属性的参数**kwargs 返回的是字典

变量的作用域

  1. global 修改全局变量,声明函数
  2. nonlocal 内部函数修改外部函数变量,声明函数

匿名函数

  1. lambda 匿名函数,用于简单函数的使用

装饰器

  1. @装饰器函数

函数判断

isfunction 判断对象是否是函数 from inspect import isfunction
callable 判断函数是否可以调用

生成器

  1. yield 返回yield后面的值,然后停止在这里
  2. next 从生成器里提取元素

迭代器

  1. Iterable 判断一个对象是否是可迭代对象 from collections import Iterable #isinstance(lt, Iterable)
  2. Iterator 判断一个对象是否是迭代器 from collections import Iterato #isinstance(lt, Iterator)
  3. iter 可以将迭代对象转为迭代器

高阶函数

  1. map 用func依次作用于iter1的每一个元素,返回一个迭代器
  2. filter 使用function依次作用于iterable中的每个元素中,返回值为真的元素保留下来
  3. reduce 使用function函数做用于sequence序列中的元素,得到的结果与下一个元素再次使用function处理, 最终得到一个结果,然后返回 from functools import reduce
  4. sorted 排序函数,支持升序降序,还支持任意类型的排序,返回的排序后的新列表,原列表保持不变

数学模块 math

  1. math.pi 打印Π
  2. math.e 打印一个常量
  3. math.ceil 向上取整
  4. math.floor 向下取整
  5. math.sqrt 求x平方根
  6. math.radians 把角度下转换为弧度 360 = 2Π
  7. math.degrees(math.pi) 把x从弧度转换成角度 一个Π是180度

随机模块 random

  1. random.randint 生成指定范围内的随机整数
  2. random.uniform 生成指定范围内的随机小数
  3. random.random 生成0-1的随机小数
  4. random.choice 从容器对象中随机挑取一个元素
  5. random.sample 从容器对象中随机挑取指定个数的元素,返回一个列表
  6. random.choices 从容器对象中挑选一个元素,返回一个列表,相当于sample提取个数为1的情况
  7. random.shuffle 打乱列表的元素的顺序

系统模块

  1. sys.argv 保存所有的命令行参数
  2. sys.platform 系统平台

os模块

  1. os.system(‘cls’) 清空屏幕
  2. os.system(‘calc’) 出计算器
  3. os.name 查看系统类型

os模块目录操作

  1. os.getcwd() 查看当前工作目录
  2. os.mkdir(‘test’) 创建目录,默认当前目录,可以指定目录,不能创建中间目录 os.mkdir(‘test/c/练习’)
  3. os.makedirs(‘a/b/c’) 可以创建中间目录
  4. os.rmdir(‘test’) 删除目录,只能删除空目录
  5. os.rename() 修改名称,可以修改文件名,也可以修改目录名,(old,new)
  6. os.listdir() 查看目录信息
  7. os.stat() 查看文件信息
  8. os.stat(‘os模块.py’).st_size 获取指定属性 字节
  9. os.remove 删除文件

os模块中path的操作

  1. path.join(‘abc/def/’,‘hello.py’) 目录拼接:目录分隔符会自动处理
  2. ath.dirname(‘abc/def/hello.py’) 目录提取,提取文件的上层目录
  3. ath.basename(os.getcwd()) 取文件名
  4. dir_name, file_name = path.split(‘abc/def/hello.py’ 切割文件名与路径
  5. file_name, ext = path.splitext(‘hello.py’) 切割文件名与后缀
  6. path.exists(‘aa’) 判断文件是否存在
  7. path.isfile() 判断是否是普通文件
  8. path.isbd() 判断是否是绝对路径
  9. path.isdir() 判断是否是目录
  10. path.getsize() 获取大小,仅限文件

文件读写的函数

  1. open 打开文件
  2. read 读取文件
  3. write 写入文件
  4. close 关闭文件
  5. readable 判断文件是否可读
  6. writeable 判断文件是否可写

字节流

  1. encode 编码
  2. decode 解码

环境变量

  1. set 设置环境变量 名称=值 获取 set 名称
  2. os.environ[ ] 获取指定环境变量,不存在会报错
  3. os.environ.get() 存在则返回对应的值,不存在则返回默认值
  4. os.getenv() 是os.environ.get()它的简写形式

shutil库

  1. shutil.copy() 拷贝文件
  2. shutil.copy() 拷贝目录
  3. shutil.rmtree 删除目录
  4. shutil.move 移动文件或目录

time时间模块

  1. time.sleep() 设置睡眠的秒数
  2. time.time() 获取当前时间戳
  3. time.locktime() 将时间戳转换为时间对象,时间带时区
  4. time.gmtime() 将时间转为时间对象,不带时区
  5. time.timezone() 0时区与当地时区的时间差(秒数)
  6. time.mktime(()) 将时间信息转换为时间戳
  7. time.strtime(’%Y-%m-%d %H:%M:%S %w %w’,local_time) 时间格式化显示,%Y:年(4位) %y:年(2位) %m:月 %d:日 %D:月/日/年 %H:时 %M:分 %S:秒 %w:星期几(1~7) %W:本周是今年的第几周

calendar日历模块

calendar.calendar() 返回某一年的日历 w:显示星期的字符数 l:内容的行高 c:两个月的水平间隔

calendar.month() 返回某个月的日历,指定年和月

calendar.issleap() 判断是否是闰年 import calendar

calendar.leapdays() 获取两个闰年之间的数量,[起始年份,结束年份)

datetime日期时间模块

date() 指定年月日 from datetime import date

date.today() 表示今天的日期

d = date.fromtimestamp() 根据时间戳创建日期

d.year, d.month, d).day 单独提取年月日信息

d.timetuple 将date转换为time.struct_time time.struct_time(tm_year=2019, tm_mon=3, tm_mday=21, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=80, tm_isdst=-1)

d.isoweekday() 获取星期几,格式:1-7

d.weekday() 获取星期:0-6

d.isoformat() 标准格式

d.issocalendar() 日历显示:(年,月,日,星期)

d.strftime(’%Y//%m//%d‘) 格式化显示

t = time(11,22,33) 创建时间对象 from datetime import time

t.hour,t.minute,t.second 单独获取时分秒

t.strftime(’%H-%M-%S’) 格式化显示

dt = datetime(2019,3,21,22,28,20) 时间日期datetime from datetime import datetime

dt.timestamp() 转换为时间戳 dt.strftime(’%Y/%m/%d %H:%M:%S’) 格式化显示

datetime.utcnow() 当前时间,不带时区

datetime.fromtimestamp(time.time()) 根据时间戳进行转换

d = dt.date() 提取日期 dt.time() 提取时间

时间间隔timedelta

from datetime import datetime,timedelta
d1 = datetime(2019,3,11,14,19,56)
d2 = datetime(2019,3,1,15,30,25)

delta = d2 - d1
print(delta, type(delta))

# 查看相差的天数
print(delta.days)

# 查看相差的除天以外的秒数
print(delta.seconds)

# 查看的相差的总共的秒数
print(delta.total_seconds())

# 创建时间相差对象
delta2 = timedelta(days=0,seconds=10)
# 运算后得到一个新的对象
d3 = d1 + delta2

虚拟环境

# 为什么要使用虚拟环境?
# 在一个环境中不同软件依赖同一包的不同版本,为了进行环境隔离就出现了虚拟环境。
# 安装工具:virtualenv
# pip install virtualenv
# 创建虚拟环境:
# virtualenv 虚拟环境目录
# 启动虚拟环境:
# 虚拟环境目录\Scripts\activate.bat
# 退出虚拟环境:
# 虚拟环境目录\Scripts\deactivate.bat
# 快速复制一个虚拟环境:
# 冷藏要复制的环境:pip freeze > requirements.txt
# 创建新的虚拟环境:virtualenv 虚拟环境名
# 激活虚拟环境:虚拟环境目录\Scripts\activate.bat
# 安装依赖:pip install -r requirements.txt
# 虚拟环境管理:virtualenvwrapper-win
# 安装:pip install virtualenvwrapper-win
# 说明:通过系统环境变量WORKON_HOME设置虚拟环境存放目录,默认保存在C:\Users\用户名\Envs
# 查看:lsvirtualenv
# 创建:mkvirtualenv
# 删除:rmvirtualenv
# 启动:workon 虚拟环境
# 退出:deactivate.bat

面向对象

self 哪个对象调用就代表谁

str__ 没有重写此方法,默认打印对象的类名加地址 重写此方法,打印对象会打印该方法的返回值

init 构造方法:创建对象后系统会自动调用该方法完成初始化设置

init 析构方法 :当对象释放时,系统会自动调用 用于资源释放操作,如:断开数据链接,关闭文件等

常用内置函数 获取属性时

# 说明:内置函数在特定时机被系统自动调用,不需要进行手动调用
# 设置、获取、删除属性时会自动触发的函数

class Person:
    def __init__(self,name):
        self.name = name
    # 访问不存在的属性自动触发
    def __getattr__(self, item):
        #ietm:获取不存在的属性名
        print(item)
        if item == 'age':
            return 10
        elif item == 'weight':
            return 60
        return '你猜'
    # 设置属性时自动触发
    def __setattr__(self, key, value):
        #key:表示属性名,value表示属性值
        # print(key,value)
        #手动保存
        self.__dict__[key] = value
    # 删除对象属性时自动触发
    def __delattr__(self, item):
        print(item,'属性即将销毁')
        del self.__dict__[item]

xiaohuang = Person('小黄')
# print(xiaohuang.age)
# print(xiaohuang.weight)
# print(xiaohuang.height)

# 设置属性
xiaohuang.age = 18
print(xiaohuang.age)
print(xiaohuang.name)

# 存放所有的对象属性
print(xiaohuang.__dict__)

del xiaohuang.name
print(xiaohuang.name)

常用内置函数 当作字典时

# 把对象当作字典时,会自动触发相关函数
class Person:
    #将对象当作字典,添加或设置属性时
    def __setitem__(self, key, value):
        # print(key,value)
        self.__dict__[key] = value
    # 将对象当作字典操作,获取属性时
    def __getitem__(self, item):
         # print(item)
         return self.__dict__.get(item)
    #将对象当作字典操作,删除属性时
    def __delitem__(self, key):
        print(key,'即将销毁')
        del self.__dict__[key]


xixi = Person()
xixi['name'] = '西西'
print(xixi['name'])

del xixi['name']
print(xixi['name'])



常用内置函数 当作函数调用

class Person:
    #对象当作函数调用,会自动触发
    def __call__(self, *args, **kwargs):
        # print('__call__')
        return sum(args)
xixi = Person()
print(xixi(1,2,3))


def text():
    pass

# 判断一个对象是否可以调用
print(callable(xixi))
print(callable(text()))

# 判断一个对象是否拥有__call__属性
print(hasattr(xixi,'__call__'))
print(hasattr(text(),'__call__'))

# 判断是否是函数
from inspect import isfunction
print(isfunction(text))
print(isfunction(xixi))

面向对象的特点

封装:即是对数据的封装,又是对数据方法的封装

继承:强调的是父子类的关系

多态:不同对象调用相同的方法,有不同的响应

继承属性重写

super().eat() 父类属性重写

多继承

继承链的查找顺序 __mro__属性记录了继承链的查找顺序,一旦找到立刻停止查找并返回,使用广度遍历的方式查找
for i in Son.__mro__:
    print(i,)

访问权限

权限
公有的:在类内可以使用,在类的外部以及子类中可以直接使用
私有的:在类内可以使用,在类的外部以及子类中不可使用
两个__开头就是私有属性

类属性

class Person(object):
    #类属性
    CN = '中国'
    #限制对象可以使用的属性,可以提高访问的效率
    __slots__ = ('name','age')
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __str__(self):
        return '我叫{},年龄{}'.format(self.name,self.age,)

#类属性通过类名访问
print(Person.CN)

p = Person('大猫',21)
# p.weight = 56
print(p)

# 获取对象的类型
print(p.__class__)

# 特殊的类属性
# 类的名字
print(Person.__name__)

#父类组成的元祖
print(Person.__bases__)

# 类相关的信息
print(Person.__dict__)

#继承链的查找顺序
print(Person.__mro__)

# 类的成员属性`
print(Person.__slots__)

类方法和静态方法

# 说明
#类方法通过类名调用
# 定义时需要使用装饰器classmethod

class Air:
    # 成员方法
    def fly(self):
        print('我喜欢飞')
    # 类方法
    @classmethod
    def test(cls):
        #cls 表示当前对象
        print(cls)
    @classmethod
    def shoot(cls):
        jianjiu = cls()
        jianjiu.zhidan = 2000
        return jianjiu
jianshi = Air()
jianshi.fly()
jianshi.test()

#创建对象 或`创建简单对象
#通过类名来调用
A = Air.shoot()
A.fly()


# 静态方法
# 说明:定义需要使用装饰器staticmethod
# 也是通过类名来调用

class Person(object):
    #定义静态方法
    @staticmethod
    def text():
        print("正在测试")

    #创建对象
    @staticmethod
    def ple():
        p = Person()
        p.name = '达摩'
        return p

#通过类名来调用
Person.text()
p = Person.ple()
print(p.name)

#总结
# 静态方法能够解决的问题类方法都可以解决
# 若类方法没有使用类名,都可以使用静态方法完成

repr

repr 对象的字符串表示方法

eval 其本身类型的表示打印方法

# 对象调用repr方法时会自动触发,通常返回的是字符串的表示形式
def __repr__(self):
    return 'Person("{}",{})'.format(self.name,self.age)

运算符重载

# 算术运算符重载
class Number(object):
    def __init__(self,num):
        self.num = num
    def __str__(self):
        return str(self.num)

    #对象出现'+'的左边时自动触发
    def __add__(self, other):
        print('__add__')
        return other + self.num

    # 对象出现'+'的右边时自动触发
    def __radd__(self, other):
        print('__radd__')
        return self.num + other
    # += 运算时会自动触发,若没有重写,会调用__add__方法
    def __iadd__(self, other):
        print('__iadd_')
        self.num += other
        return self

    # 对象出现'-'的左边时自动触发
    def __sub__(self, other):
        print('__sub_')
        return self.num - other
    # 对象出现'-'的右边时自动触发
    def __rsub__(self, other):
        print('__rsub_')
        return other - self.num#可互换结果不一样
    # -= 运算时会自动触发,若没有重写,会调用__sub__方法
    def __isub__(self, other):
        print('__isub_')
        self.num -= other
        return self

    # 对象出现'*'的左边时自动触发
    def __mul__(self, other):
        print('__mul__')
        return self.num * other
    # 对象出现'*'的左边时自动触发
    def __rmul__(self, other):
        print('__rmul__')
        return self.num * other
    # *= 运算时会自动触发,若没有重写,会调用__mul__方法
    def __imul__(self, other):
        print('__imul_')
        self.num *= other
        return self

    # 对象出现'/'的左边时自动触发
    def __truediv__(self, other):
        print('__truediv__')
        return self.num / other
    # 对象出现'/'的右边时自动触发
    def __rtruediv__(self, other):
        print('__rtruediv__')
        return self.num / other
    # /= 运算时会自动触发,若没有重写,会调用__truediv__方法
    def __itruediv__(self, other):
        print('__itruediv__')
        self.num /= other
        return self

# 对象出现'%'的左边时自动触发
    def __mod__(self, other):
        print('__mod__')
        return self.num % other
    # 对象出现'%'的右边时自动触发
    def __rmod__(self, other):
        print('__rmod__')
        return self.num % other
    # %= 运算时会自动触发,若没有重写,会调用__mod__方法
    def __imod__(self, other):
        print('__imod__')
        self.num %= other
        return self

    # 对象出现'//'的左边时自动触发
    def __floordiv__(self, other):
        print('__floordiv__')
        return  self.num // other
    # 对象出现'//'的右边时自动触发
    def __rfloordiv__(self, other):
        print('__rfloordiv__')
        return other // self.num
    # //= 运算时会自动触发,若没有重写,会调用__floordiv_方法
    def __ifloordiv__(self, other):
        print('__ifloordiv__')
        self.num //= other
        return self

n = Number(14)

# ret = n + 10
# ret = 10 + n
# n += 30
# ret = n - 10
# ret = 20 - n
# n -= 1
# ret = 30 * n
# n *= 2
# ret = 28 / n
# n /= 2
# ret = n % 3
# ret = n // 10
# ret = 100 // n
n //= 10

print(n, type(n))
# print(ret)

关系运算符重载

class Number(object):
    def __init__(self,num):
        self.num = num
    #大于 self > other 或other < self
    def __gt__(self, other):
        print('这里是大于')
        return self.num > other

    # 大于等于 self >= other
    def __ge__(self, other):
        print('这里是大于等于')
        return self.num > other

    # 小于 <
    def __lt__(self, other):
        print('这里是小于')
        return self.num > other

    # 小于等于 <=
    def __le__(self, other):
        print('这里是小于等于')
        return self.num > other

    # 等于 ==
    def __eq__(self, other):
        print('这里是等于等于')
        return self.num > other
    # 不等于 != 若重写则执行此方法,若没有重写则会尝试__eq__方法
    def __ne__(self, other):
        print('这里是不等于')
        return self.num != other

n = Number(7)

print(n > 5)
print(n >= 7)

print(n < 3)
print(n <= 7)

print(n == 7)
print(n != 7)

属性函数

 # 说明:将成员方法当做属性一样访问
 # 作用:保护特定的属性,或者对指定的属性进行特定的处理

class User(object):
    def __init__(self, name,password):
        self.name = name
        # 可以保护特殊属性
        self.__password = password

    # @property #可以访问password方法,当作属性来访问
    # def password(self):
    #     print('in func password')
    #     return '不给你看'
    #
    # @password.setter # 装饰方法 默认生成新方法,传一个新参数,password
    # def password(self,password):
    #     print('设置新密码',password)
    #     #可以进行特殊的处理
    #     self.__password = 'xxx' + password +'111'
u = User('damao','000000')
# print(u.password)
u.password = '000000'
print(u.__dict__)

抽象基类

# 抽象基类是为了统一接口而存在的
# 抽象基类不能进行实例化
# 继承自抽象基类的子类必须实现抽象基类的方法

from  abc import ABC,abstractmethod

# 抽象基类:不能实例化(创建对象)
class Animal(ABC):
    #定义抽象方法:规定接口
    @abstractmethod
    def eat(self):
        print('运动')

class Cat(Animal):
    #继承自抽象类的子类,必须实现基类的抽象方法,否则不能实例化创建对象)
    def eat(self):
        print('mao喜欢走猫步')

class Dog(Animal):
    def eat(self):
        print('狗喜欢吃屎')
# a = Animal()
# a.run()
c = Cat()
c.eat()

#不继承抽象类的方法,所以不能创建对象
# d = Dog()

单列模式

# 设计模式:针对特定场景的特定解决对象
# 单列模式:无论创建多少次对象,得到的始终都是同一个
# 内置函数:__new__
class Person(object):
    # 创建对象时,自动调用 cls相当于object *args,**kwargs相当于Person传的参数
    def __new__(cls, *args, **kwargs):
        print('这里是__new__函数')
        return object.__new__(cls)
    #创建对象后,初始化对象,自动调用
    def __init__(self):
        print('这里是__init__')

#__new__创建对象时使用,但是不能这么使用.
# p =Person.__new__(Person)
# print(type(p))

p = Person()

# p1 = Person()
# p2 = Person()

# print(id(p1))
# print(id(p2))


class Person(object):
    def __new__(cls, *args, **kwargs):
        #判断cls类 是否有'pp'属性,如果有直接返回之前创建的对象
        if not hasattr(cls, 'pp'):
            print('程序已经运行到这里')
            cls.pp = object.__new__(cls)
        return cls.pp

p1 = Person()
p2 = Person()
print(id(p1),id(p2))

内存管理 引用计数

# 当创建一个对象赋值给一个变量时,引用计数记为1;当多一个变量指向该对象,计数值加1;当少一个变量指向对象时,计数值减1,减到0时调用对象的__del__方法释放相关资源
# 引用计数的考察是针对可变变量来说的,不可变变量的引用计数对应我们来说没有意义
from sys import getrefcount
a = 10
b = 10
print(id(a))
print(id(b))

c = '我好烦'
d = '我好烦'
print(id(c))
print(id(d))

# getrefcount 用来查看变量出现的次数,使用该方法会是引用计数加1
print(getrefcount(a))
print(getrefcount(c))

lt = [1,2,3]
lt2 = lt
print(getrefcount(lt))


del lt2
print(getrefcount(lt))

class Person:
    def __del__(self):
        print('删除对象')
p = Person()
print(getrefcount(p))
del p
print('GG')

函数传参

def text(n):
    n += 1

num = 100
# 参数传递的是值
# text(num)#传递的num和上面的num没有一毛钱关系
# text(num)相当于text(100)
print(num)



def aaa(lt2):
    lt2[0] += 100

lt = [1,2,3]

# 参数传递的是引用
aaa(lt)
print(lt)

深浅拷贝

import copy

lt = [1,2,[3,4]]
# 浅拷贝:只拷贝对象本身,里面的元素只增加引用,不能改变,但是变量可改
lt1 = copy.copy(lt)
lt1[2] = 100#只是引用,不能改变原列表
print(lt)
print(lt is lt1)#返回Falses说明不是原列表,只是引用

# 深拷贝:拷贝对象本身,里面的元素也进行拷贝,可以改变
lt2 = copy.deepcopy(lt)
lt2[2] = 300
print(lt2)

class Person(object):
    #浅拷贝自动调用
    def __copy__(self):
        print('执行copy方法')
        return '111'
    #深拷贝自动调用
    def __deepcopy__(self, memodict={}):
        print('执行deepcopy方法')
        return '555'

p = Person()

#浅拷贝
p1 = copy.copy(p)
print(p1)

p2 = copy.deepcopy(p)
print(p2)

print(p is p2)

对象序列化-json

# 将对象转换为str
# json
import  json
d = {'name':'damao','age':20}

# 转为json字符串
s = json.dumps(d)
print(s,type(s))

# 转为字典对象
d2 = json.loads(s)
print(d2,type(d2))

# 保存到文件
# s = json.dumps(d)
# fp = open('dict.josn','w')
# fp.write(s)

#简单方法
fp = open('dict.josn','w')
json.dump(d, fp)

#读取对象
fp = open('dict.josn','r')
d3 = json.load(fp)
print(d3,type(d3))

对象序列化-pickle

# 将对象转换为bytes字节流
import pickle

class Person(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __str__(self):
        return 'name:{},age:{}'.format(self.name,self.age)

damao = Person('大毛',20)

# 序列化:将对象转换成bytes
s = pickle.dumps(damao)
print(s,type(s))

# 反序列化:从bytes中加载对象
dm = pickle.loads(s)
print(dm, type(dm))

# 序列化到文件
fp = open('data.txt','wb')
pickle.dump(damao,fp)

# 从文件序列化中得到对象
fp = open('data.txt','rb')
dam = pickle.load(fp)
print(dam, type(dam))

异常处理

# 概念
# 错误:程序运行之前的语法问题,如:关键字、缩进不齐,符号不成对。
# 异常:程序运行过程中出现的问题,如:除数为0.,小标越界,访问不存在的变量或对象属性

# 说明:异常处理可以理解为一种特殊的流程控制语句,可以提高代码的健壮性

# 基本语法
try:
    print('正常运行')
    a = 10 / 0

except Exception as i:
    #此处捕获异常,然后做出处理
    print('出现异常', i)

print('over')




#完整结构
try:
    # print(a)
    print('hahah')

except Exception as e:
    #出现异常的时候执行
    print('出现异常',e)
else:
    #没有异常
    print('正常结束')
finally:
    #无论有无异常都执行
    print('无论是否出现异常,我都是您的爹')

抛出异常

try:
    print('正常执行')
    raise Exception('抛出的异常')
    print('正常结束')
except Exception as e:
    print('出现异常:',e)

print('OVER')

异常嵌套

print('游戏开始')
try:
    print('敌军还有五秒到达战场')
    raise Exception('有一个小兵,昨晚吃冰淇淋,身体不舒服')
    print('敌军已到达战场,请开始你的表演')
except Exception as e:
    print('有一个小兵拉肚子了')
    try:
        print('替补上场')
        raise Exception('替补也拉肚子了')
        print('游戏继续')
    except Exception as e:
        print('替补出现问题')
        print('替替补已就位')
        print('游戏可以继续了')

print('热情满满开始打游戏')

自定义异常

class MyException(Exception):
    def __init__(self,msg):
        self.msg = msg
    def __str__(self):
        return self.msg
    def deal(self):
        print('自定义异常处理中')
        print('自定义异常处理完成。')
try:
    print('正常执行')
    raise  MyException('参数有误')
    print('执行结束')
except MyException as e:
    #子类的异常的捕获应该放在前面,否则可能无法被捕获
    print('自定义异常:',e)
    print('其他处理异常')
print('over')

with语句

# 当进行文件操作时,无论过程中有无异常,最后一定需要关闭文件。
# 凡是有上下文的场景,都可以使用with语句,来保证关闭上下文

'''
fp = open('xxx,txt')
# 文件操作
fp.close()
'''

# with open('xxx.txt') as fp:
#     #文件操作
#     pass
#     #with语句结束,无论中间是否有异常,一定能关闭文件,并且不要执行fp.close()

class Person:
    def __init__(self):
        print('aa')

    #进入上下文自动调用
    def __enter__(self):
        print('__enter__')
 # 退出上下文时自动调用
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('__exit__')
        print('异常类型:', exc_type)
        print('异常内容:', exc_val)
        print('异常追溯:', exc_tb)
with Person() as p:
    print('代码执行中')
    raise Exception('出错了')
    print('代码执行结束')

正则表达式

# 说明:正则的解析不是我们来写的,python中的re模块专门用来处理正则
import  re

# 从头进行匹配,找到返回正则结果对象,没有找到返回None
m = re.match('abc','abcaabcooo')
print(m)

# 功能同上,可以在任意位置匹配
a = re.search('a','llokoamjjnhh')
print(a)

#提取匹配的内容  位置
print(m.group(),m.span())

# 匹配所有的内容 ,以列表形式返回匹配内容,没有返回空列表
f = re.findall('qwer','tyuuoqwdsdqwwerllqwer')
print(f)

# 先生成正则表达式对象
d = re.compile('djw')
# 从头开始匹配
m = d.match('djwqowleodkdjwss')
print(m)
print(m.group(),m.span())
# 从任意位置开始匹配
s = d.search('fekkkefdjweffkekekekk')
print(s.group(),s.span())

# 匹配所有
f = d.findall('jfojfowdjwfwjfjfdjw')
print(f)




# 正则替换
s = 'if1you2do3not4leave5meI6will7by8you9side2until4the6life8end'
o = re.compile(r'\d')

#按照正则进行替换,可以指定次数
# s2 = o.sub('',s, 3)

# 干预替换
def tihuan(o):
    # print(o.group())
    return '*'
# s2 = o.sub(tihuan,s)

def double(o):
    # return o.group() * 2
    #函数作为替换的结果
    return str(int(o.group()) * 2)
s2 = o.sub(double,s)

print(s2)

# 可以传递一个函数,人为的干预替换过程
s3 = re.sub(r'\d',lambda m:str(int(m.group())*2),'how1are2you3')

print(s3)

正则语法

import re
# 单个字符

# 普通字符:就是一对一的完整匹配
'''
[]:匹配指定范围内的任意一个字符
   [abc]:匹配任意一个字符
   [0-9]:任意的数字
   [a-zA-Z]:任意的字母
   [^0-9]:任意的非数字
\d:数字字符,等价于[0-9]
\D:非数字字符,等价于0-9
\w:字(数字、字母、下划线、汉字)
\W:非字
\s:空白字符(\n、\r、\t、空格)
\S:非空白字符
\b:词边界(开头、结尾、空格、标点)
\B:非词边界
. :匹配除\n以外的任意字符
'''
# [] 匹配指定范围内的任意一个字符
# o = re.compile('[*]')#匹配任意一个字符
# o = re.compile('[0-9]')#任意的数字
# o = re.compile('[a-zA-Z]+')#任意的字母
# o = re.compile('[^0-9]+')#任意的非数字

#\d :数字字符,等价于[0-9]
# o = re.compile(r'\d+')

#\D:非数字字符 等价于[^0-9]
# o = re.compile(r'\D+')

#\w:字(数字、字母、下划线、汉字)
# o = re.compile(r'\w+')

# \W:非字
# o = re.compile(r'\W+')

#\s:空白字符(\n、\r、\t、空格)
# o = re.compile(r'\s+')

# \S:非空白字符
# o = re.compile(r'\S')

#\b:词边界(开头,结尾,空格,标点)
# o = re.compile(r'\b ')

#\B:非词边界
# o = re.compile(r'\B')

# s = o.search('kklsabDSFcjdsv 1230oo_59*/ll')
# if s:
#     print(s.group(), s.span())



#次数限定
#{m}:m次
# o = re.compile(r'ab{5}c')

#{m-n}:m-n次
# o = re.compile(r'ab{3,5}c')

#{m,}:至少m次
# o = re.compile(r'ab{3,}c')

#{,m}:至多m次
#o = re.compile(r'ab{,3}c')

# ?:至多一次
# o = re.compile(r'ab?c')

# +:至少一次
# o = re.compile(r'ab+c')

# *:任意次
# o = re.compile(r'ab*c')
# s = o.findall('abbbbbbbbbbbc')
# print(s)



# 边界判断
# ^:以指定的内容开头
# o =re.compile(r'^hello')

# $:以指定字符结尾
# o = re.compile(r'world$')

# s =o.search('helloworld')
# if s:
#     print(s.group(),s.span())



# |的使用
# :表示或,拥有最低的优先级
# c = re.compile(r'hello|world')
# s = c.search('helloworld')
# if s:
#     print(s.group(),s.span())


# 分组匹配
# o = re.compile(r'(\d+)([a-z]+)(\d+)')
#
# s = o.search('gas1235asdkj1235adugd')
# if s:
#     print(s.group(), s.span())
#     #分组默认为0
#     print(s.group(0), s.span(0))
#     #指定组号,返回对应组的匹配结果,一个()表示一个组
#     print(s.group(1), s.span(1))
#     print(s.group(2), s.span(2))
#     print(s.group(3), s.span(3))




# 固定匹配
# o = re.compile(r'<a>\w+</a>')
# o = re.compile(r'<div><a>\w+</a></div>')

# 无名分组: \1表示第一组,即第二个()的匹配的结果
# o = re.compile(r'<([a-z]+)><([a-z]+)>\w+</\2></\1>')

# 命名分组: 给每个组取名字,后面通过名字指定
# o = re.compile(r'<(?P<erniu>[a-z]+)><(?P<dankiu>[a-z]+)>\w+</(?P=dankiu)></(?P=erniu)>')


# s = o.search('<div><a>百度一下</a></div>')
# if s:
#     print(s.group(), s.span())
#     #所有匹配到的信息,是一个元祖,适用于分组
#     print(s.groups())
#     #所有匹配到的信息,是一个字典,用于命名分组
#     print(s.groupdict())




# 贪婪匹配
# 贪婪:最大限度的匹配。正则的匹配默认是贪婪的。
# 非贪婪:只要满足条件,能少匹配就少匹配。

# ?  可以取消.*的任意多次的贪婪匹配
# o = re.compile(r'a.*?')

# ?  可以取消.+的至少一次的贪婪匹配
# o = re.compile(r'a.+?b')

# s = o.search('ahsdsadbkjasdbskj')
# if s:
#     print(s.group())



# 匹配模式
# re.I:忽略大小写
# s = re.search(r'hello',"Hello world",re.I)

# re.M :多行匹配,默认单行
# s = re.search(r'^hello', 'ahd\nhkah\nhello world', re.M)

# re.S:单行模式,可以让.匹配包括\n在内的任意字符
string = '''<div>
helloworld
</div>'''
s = re.search(r'<div>.*?</div>', string, re.S)


if s:
    print(s.group())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值