Python随笔

272 阅读15分钟

Python随笔

  • 帮助函数:
    • dir():列出指定类或模块包含的全部内容
    • help():查看某个函数或方法的帮助文档
  • print()函数end参数的默认值为\n,print()函数输出不换行,print( , end = "")
  • python3允许数值增加下划线为分隔符,增强可读性,不影响数值本身
  • 字符串属于序列
  • 输出 " ,print(""")
  • 输出 ' ,print("'")
  • str()和repr()都可以将数值转换为字符串,str()本身为python内置类型,repr()为函数,repr()以python表达式的形式来表示值
  • python3的input()函数用于向用户生产一条提示,然后获取用户输入的内容,返回一个字符串,与python2中的raw_input()相同。python2的input()函数要求用户输入符合python语法的表达式,输入字符串时必须使用""
  • 定义长字符串:
    • s = '''111 222 333'''
  • 原始字符串:r'',原始字符串中\不会识别成转义,但是' "还是需要转义
  • 字符串格式化输出:%,参数:(可同时存在)
    • -:指定左对齐
    • +:表示正负数值带符号
    • 0:补充0
  • str类中大小写方法:
    • title():将每个单词的首字母改为大写
    • lower():将整个字符串改为小写
    • upper():将整个字符串改为大写
  • str类删除字符:
    • strip([chars]):删除字符串前后的字符
    • lstrip([chars]):删除字符串前面的字符
    • rstrip([chars]):删除字符串后面的字符
  • str类查找替换:
    • startswith():判断字符串是否以指定子串开头。
    • endswith():判断字符串是否以指定子串结尾。
    • find():查找指定子串在字符串中出现的位置,如果没有找到指定子串,则返回-1。
    • index():查找指定子串在字符串中出现的位置,如果没有找到指定子串,则引发ValueError错误。str.index(sub[, start[, end]]) sub:指定查询的目标子串;start:指定查询的起始位置;end:指定查询的结束位置。
    • replace(old, new):使用指定子串替换字符串中的目标子串。old:指定被替换的子串;new:指定新的子串。
    • translate():使用指定的翻译映射表对字符串执行替换,创建翻译映射表函数maketrans(' ', ' ')。
    • format(values):格式化。values:指定格式化的值,位于{}中。
  • str类分割连接方法:
    • split(sep):将字符申按指定分割符分割成多个短语。sep:指定待分割的分割符;
    • join():将多个短语连接成字符串
  • str类切片:
    • [开始(包含), 结束(不包含), 步长]。切片索引指的是按照固定的步长,连续取出多个元素,可以用[start:end:step]表示。其中start指定索引的起始位置;end指定索引的终止位置(注意end位置的元素取不到!);step指步长,默认为1,表示逐个取出子元素。
    • 无限切片是指在切片过程中不限定起始元素的位置或终止元素的位置,甚至起始和终止元素的位置都不限定,可以用[::step]表示。第一个冒号是指从字符串的第一个元素开始获取;第二个冒号是指取到最后一个元素结束(包含最后一个元素值)。
  • false、none、0、""、()、[]、{},这些值作为bool表达式时,会当成false处理
  • /:数学计算的除法,除不尽时产生小数;//:整除,结果只有整数部分
  • **:乘方运算
  • if else语句:
    • 关键词(if、elif和else)所在的行末必须加上英文状态的冒号
    • 冒号所在行的下一行必须缩进(目的是为了代码的好看与好用)
    • else后面永远不要写条件
    • elif的正确写法 (错误写法:elseif、else if)
  • if else语句基本规则,总是优先把包含范围小的条件放在前面处理
  • 空语句:pass
  • 列表推导式:
    • 语法:[expression for i in iterable if condition]
    • 说明:
      • expression就是对每一个元素的具体操作表达式
      • iterable是某个可迭代对象,如列表、元组或字符串等
      • if condition是对每一个元素做分支判断,如果条件符合,则expression操作对应的元素
  • while与for的区别:
    • 绝大多数场景下,while循环与for循环是可以互相替代的
    • 如果存在明确的被迭代对象(如列表、元组、字符串等),可优先使用for循环
    • 如果不存在明确的被迭代对象,使用while循环将会更加地简单
  • zip()函数,压缩得到的可迭代对象所包含的元素是由原列表元素组成的元组,以短的列表为主
  • reversed()函数,反向遍历
  • return结束该函数或者方法
  • 元组()不可变,数据更加稳定安全;列表[]可变,构成列表的元素没有任何限制,可以是任何类型的数据,也可以是任何结构的数据。
  • 元组和列表都属于序列,字符串索引和切片的使用方法在元组和列表上同样适用。
  • 字典是可变对象,但是不属于序列
  • 构造只包含一个元素的元组,需在元组后面加逗号。t = (1,)
  • 元组不能直接和列表相加
  • in判断列表或者元组是否包含某个元素
  • 程序把多个值赋值给一个变量的时候python会自动将多个值封装成元组
  • 在序列解包时也可以只解出部分变量,剩下的依然使用列表变量保存。为了使用这种解包方式Python允许在左边被赋值的变量之前添加*,那么该变量就代表一个列表,可以保存多个集元素。
  • list()函数可用于将元组、区间等对象转换为列表
  • tuple()函数可用于将列表、区间等对象转换为元组
  • append()方法增加单个列表元素,追加到列表最后,可以接受单个值或者列表、元组,当成单个元素嵌套。extend([])可以增加多个元素,[]不可少。
  • insert(位置, 插入内容)方法插入列表元素
  • del语句删除列表(根据索引),列表名加[]可删除单个元素或者某一段,del语句也可删除变量
  • remove()方法删除列表(根据内容),删除第一个找到的元素
  • 可以通过切片对列表其中一部分赋值,并不要求新赋值的元素与原来的元素个数相等
  • count():用于统计列表中某个元素出现的次数。
  • index():用于判断某个元素在列表中出现的位置。
  • pop():用于将列表当成“栈”使用,实现元素出栈功能。
  • reverse():用于将列表中的元素反向存放。
  • sort():用于对列表元素排序,要求列表中所有元素的数据类型相同。
  • clear():用于清空列表的所有元素。
  • 通过{}或者dict()函数创建字典
  • 键在字典中是唯一的,不能有重复
  • 列表不允许对不存在的索引赋值,字典对不存在的key赋值,相当于增加一个键值对
  • get()方法,根据key来返回value
  • update()方法可使用一个字典所包含的key-value对来更新已有的字典。在执行update()方法时,如果被更新的字典中已包含对应的key-value对,那么原value会被覆盖;如果被更新的字典中不包含对应的key-value对,则该key-value对被添加进去。
  • items()、keys()、values()分别用于获取字典中的所有key-value对、所有key、所有value。
  • pop()方法用于获取指定key对应的value,并删除这个键值对
  • popitem()方法用于随机弹出字典中的一个键值对,存储的最后一个键值对
  • setdefault()方法也用于根据key来获取对应value的值。但该方法有一个额外的功能——当程序要获取的key在字典中不存在时,该方法会先为这个不存在的key设置一个默认的value,然后再返回该key 对应的value。总之,setdefault()方法总能返回指定key对应的value,如果该key-value对存在,则直接返回该key对应的value;如果该key-value对不存在,则先为该key设置默认的value,然后再返回该key对应的value。
  • 使用正则表达式先导入re包:import re
  • 常用的正则符号:
    • 英文状态的句号点 .:指代任意字符(如数字、字母、标点符号、汉字等),但除了换行符\n。
    • 反斜杠 \:表示转义符,用于转换含义的符号。
      • \n:指代换行
      • \t:指代Tab制表符
      • \d:指代0~9中的任一数字
      • \s:指代任意一种空白(如空格、Tab、换行等)
      • \w:指代字母、数字和下划线中的任意一种(一共63个)
      • .:指代句号点本身
    • 英文状态的中括号[] 指代字符集合,当需要特定字符匹配时,可以选择中括号。
    • 英文状态的圆括号 () 指代特定内容的截取
    • 英文状态的问号 ? 表示匹配前一个字符0次或1次
    • 加号 + 表示匹配前一个字符1次及以上
    • 星号 * 表示匹配前一个字符0次及以上
    • 英文状态的大括号 {} 表示匹配前一个字符特定的次数或范围。
      • {m}:匹配前一个字符m次
      • {m,}:匹配前一个字符至少m次
      • {m,n}:匹配前一个字符m~n次
      • {,n}:匹配前一个字符之多n次
  • 表达式 .* 是单个字符匹配任意次,即贪婪匹配。 
  • 表达式 .*? 是满足条件的情况只匹配一次,即最小匹配。
  • 正则表达式函数:
    • 查找:findall(pattern, string, flags=0) pattern:指定需要匹配的正则表达式。string:指定待处理的字符串。flags:指定匹配模式,常用的值可以是re.I、re.M、re.S和re.X。re.I的模式是让正则表达式对大小写不敏感;re.M的模式是让正则表达式可以多行匹配;re.S的模式指明正则符号.可以匹配任意字符,包括换行符\n;re.X模式允许正则表达式可以写得更加详细,如多行表示、忽略空白字符、加入注释等。
    • 替换:sub(pattern, repl, string, count=0, flags=0) pattern:同findall函数中的pattern。repl:指定替换成的新值。string:同findall函数中的string。count:用于指定最多替换的次数,默认为全部替换。flags:同findall函数中的flags。
    • 分割:split(pattern, string, maxsplit=0, flags=0) pattern:同findall函数中的pattern。 maxsplit:用于指定最大分割次数,默认为全部分割。 string:同findall函数中的string。 flags:同findall函数中的flags。
  • 函数中的局部变量与全局变量重名,默认使用局部变量
  • 函数中用''' '''编写说明文档,通过help()函数或者函数的__doc__属性查看
  • 注意带默认值的参数定义在形参列表的最后
  • 形参前加*,表示该参数可以接受多个参数值,多个参数值当成元组传入
  • 逆向参数收集,指的是在程序已有列表、元组、字典等对象的前提下,把它们的元素拆开后传给函数的参数。逆向参数收集需要在传入的列表、元组参数之前加* ,在字典参数之前加 **
  • python函数的参数传递都是值传递
  • Pytbon提供了如下三个工具函数来获取指定范围内的“变量字典”:
    • globals():该函数返回全局范围内所有变量组成的“变量字典”。
    • locals():该函数返回当前局部范围内所有变量组成的“变量字典”。
    • vars(object):获取在指定对象范围内所有变量组成的“变量字典”。如果不传入object参数,vars()和locals()的作用完全相同。
  • 函数中声明全局变量:global 变量名
  • python支持在函数内部定义函数,称为局部函数,默认对外隐藏,只在其封闭函数内有效
  • python可把函数赋值给变量,这样可以通过该变量来调用函数
  • python支持像使用其他参数一样使用函数参数
  • 函数可作为返回值
  • lambda表达式的语法格式如下:
    • lambda [parameter_list]:表达式
    • lambda表达式必须使用lambda关键字定义。
    • 在lambda关键字之后、冒号左边的是参数列表,可以没有参数,也可以有多个参数。
    • 有多个参数,则需要用逗号隔开,冒号右边是该lambda表达式的返回值。
    • 实际上,lambda表达式的本质就是匿名的、单行函数体的函数。因此,lambda表达式可成函数的形式。
  • 匿名函数:
    • 匿名函数,可以用lambda关键字定义。通过lambda构造的函数可以没有名称,最大特点是“一气呵成”,即在自定义匿名函数时,所有代码可在一行内完成。
    • 语法:lambda parameters : function_expression
      • lambda为匿名函数的关键起始词
      • parameters是函数的形参,多个参数之间用英文状态的逗号隔开
      • function_expression为具体的函数体
  • 导入模块:
    • 直接导入模块:import 模块名1, 模块名2
    • 导入模块的指定函数:form 模块名 import 函数名
    • 导入模块的全部函数:form 模块名 import *
    • 导入模块的指定别名:import 模块名1 as 别名1, 模块名2 as 别名2
  • 模块中用''' '''编写说明文档,通过模块的__doc__属性访问
  • 加载模块:
    • 使用环境变量,变量名为PYTHONPATH,变量值为模块存放路径
    • 将模块放在默认的模块加载路径下
  • 查看模块内容:
    • 使用dir()函数
    • 使用模块本身提供的__all__变量
  • 查看模块源文件路径:__file__属性
  • 类是某一批对象的抽象,对象是一个具体存在的实体
  • Python类可以调用实例方法,但使用类调用实例方法时,Python不会自动为方法的第一个参数self绑定参数值;程序必须显性地为第一个参数self传入方法调用者。
  • 类方法(@classmethod)和静态方法(@staticmethod)区别:Python会自动绑定类方法的第一个参数,类方法的第一个参数(建议参数名为cls)会自动绑定到类本身;静态方法不会自动绑定。
  • @函数装饰器,用函数A装饰函数B:
    • (1). 将被装饰的函数B作为参数传给@符号引用的函数A
    • (2). 将函数B替换成第(1)步的返回值
  • property函数定义属性:
    • 语法格式:property(fget=None, fset=None, fdel=None, doc=None)
    • 用property也传入0个(既不能读,也不能写的属性)、1个(只读属性)、2个(读写属性)、3个(读写属性,也可删除)和4个(读写属性,也可删除,包含文档说明)参数。
  • Python类的成员命名为以双下划线(__)开头,Python就会把它隐藏
    • 默认调用时候不会显示
    • 如果要显示:对象名._类名.__函数名()
  • Python的继承支持多继承机制,即一个子类可以同时有多个直接父类,若非必要并不推荐,如果多个父类中包含了同名的方法,排在后面的父类的方法会被屏蔽。
  • 子类方法与父类同名称为方法重写,或方法覆盖。调用重写后的方法,会指定执行子类的重写方法,如果想执行父类的重写方法:父类名.方法名(参数)。
  • Python是动态语言,类、对象的属性、方法都可以动态的增加和修改。
  • __slots__属性的值是一个元组,该元组的所有元素列出了该类的实例允许动态添加的所有属性名和方法名。不过并不限制通过类来动态添加的属性和方法。
  • Python采用自动引用计数(ARC)方式来回收对象所占用的空间,当程序中有一个变量引用该Python对象时,Python会自动保证该对象引用计数为1;当程序中有两个变量引用该Python对象时,Python会自动保证该对象引用计数为2……依此类推,如果一个对象的引用计数变成了0,则说明程序中不再有变量引用该对象,表明程序不再需要该对象,因此Python就会回收该对象。
  • Python的异常机制主要依赖try、except、else、finally和raise五个关键字,其中在try关键字后缩进的代码块简称try块,它里面放置的是可能引发异常的代码;在excpt以后对应的是异常类型和一个代码块,用于表明该except块处理这种类型的代码块;在多个excpt块之后可以放一个else块,表明程序不出现异常时还要执行else块;最后还可以跟一个finally块,ifinally块用于回收在try块里打开的物力资源,异常机制会保证finally块总被执行;而raise可以单独作为语句使用,引发一个具体的异常对象。
  • 不管程序代码块是否处于try块中,甚至包括excpt块中的代码,只要执行该代码块时生现了异常,系统总会自动生成一个Error对象。如果程序没有为这段代码定义任何的excpt块,则Python解释器无法执到处理该异常的excpt块,程序就在此退出。
  • 先捕获小异常再捕获大异常。
  • Python的垃圾回收机制不会回收任何物理资源,只能回收堆内存中对象所占用的内存。
  • 尽量避免在finally块里使用return或raise等导致方法终止的语句。