三、python基础知识

阅读: 评论:0

三、python基础知识

三、python基础知识

  1. 函数:
    1. def test(a.b,*args):a,b位置参数,*args将剩下的元素以元祖形式接收
    2. return可以返回多个值,没有返回值的时候返回None(没有Null)
    3. 解释性语言,不需要编译,执行的时候翻译,效率低、独立
    4. random.random生成0到1之间的随机浮点数
    5. python的socket:使用功recvfrom()接收udp数据,返回(data,address),data为包含接收数据的字符串、address是发送数据的套接字地址;使用getsockname()获取套接字自己的地址,通常是一个元组(ipaddr,port);使用connect()初始化TCP服务器连接,连接到address处的套接字,一般address为元组(hostname,port),连接出错返回;服务端用listen()开始TCP监听
    6. python的切片不受内建类型的限制,切片不会越界
    7. 当运行模块时,__name__如果等于__main__;如果import到其他模块中,则__name__等于模块名称
    8. 编码过程:line-解码gbk-编码utf-16-编码url,解码相反url-utf-16 - gbk
    9. __new__和__init__:init方法为初始方法(静态方法),new方法才是真正的构造函数(实例方法);new方法默认返回实例(cls)对象供init方法、实例方法使用,init方法无返回;init方法为类的实例提供一些属性或完成一些动作,定制实例对象
    10. list、dict、tuple、set、string:
      1. list:元素有序、可修改,不要求数据类型一致;dict:无序,可修改,key和value不要求数据结构一致;tuple:有序,不可修改,不要数据类型一致,定义只有一个元素的时候,括号前面必须加逗号;set:无序,可修改,数据结构不要求一致、空集必须表现为s=set();string:有序,不可修改;
      2. list和tuple底层数据结构:线性表,分为顺序表(将表元素直接顺序存放在一块划分的连续区域内)、链接表(将表元素放在通过链接构造起来的系列存储块里)
      3. set本质是dict:主要使用hash对元素做散列计算和eq对元素做散列值对判断
      4. dict底层数据结构:伪随机探测的散列表
  2. python中不变的数据结构-tuple:
    1. list:不要求数据类型相同、元素是有序的、可修改的,用[ ]括起来所有元素:
      1. 添加元素:list.appen(元素) 追加到尾部,list.insert(元素插入位置,元素))
      2. 删除元素:list.pop(元素位置)、ve(元素) 删除符合条件的第一个元素然后返回删除后的列表、list.pop(元素位置)返回删除的元素/元素位置传空则不删、del list[元素位置]返回删除后的列表
      3. 清空列表:del list删除整个list运行报错、list.clear()清空整个list返回空的list
      4. 列表元素出现次数&#unt(某个元素)某个元素出现次数,from collections import Counter引用后Counter(list)返回类似于字典的计数器返回所有元素出现次数、Counter(list).most_common(n)返回出现次数最多的前n位数(元组类型,按顺序取,n+1位即便与第n位一直也丢弃,n不传返回所有结果)
      5. 列表拼接&#d(list2)将值返回给list1,list1+list2
      6. 列表复制:list*n相当于n个list相加、list1&#py()列表list1被list覆盖
      7. 访问list:list[start:end:n]:按照步数n访问索引为start至end的元素,包头不包尾,start不传默认取0,end不传默认取len(list),n不传默认取1,如list[::-1]表示从最后一位数访问到list的第一位数,即将列表翻转(verse()也可以实现该功能)
      8. 元素索引寻找:list.index(x[, start[, end]])从start索引至end索引查找元素x,返回第一个匹配值的索引,匹配失败抛出异常,start不传默认0,end不传默认len(list),包头不包尾
      9. 列表排序:sorted(list)不改变原数组返回改变后的值、改变原数组不返回list.sort( key=None, reverse=False) reverse取false升序排列、true按降序排列,默认升序,eg:list.sort(key=len)按照元素的长度进行升序排列、list元素是字典list.sort(key=lambda a: a["key"])元素按照字典中的key值升序排列(a.sort(key=lambda x: list(x.values/keys()))按照元素的value/key排序)、list是元祖list.sort(key=lambda a: a[索引1]:a[索引2])先按照元祖的索引1排序 然后按照索引2排序
    2. tuple:有序,但不可修改,元素不要求同类型,用()括起来所有元素,避免单个元素组成的元组
      1. 元祖可以包含列表:如T=(1,2,[4,5],6)T[2]=[4,5],T[2][0]=4
      2. 元祖访问:tuple[i]表示第i个元素,i为负数代表访问倒数第i个元素
      3. 排序:sorted(iterable,  key=None, reverse=False),eg:sorted(tuple,key=lambda a: a[索引1]:a[索引2])先按照索引2进行排序 然后按照索引1对tuple进行排序
      4. tuple()可以讲字符串、列表、字典、集合转为元祖、字典转的时候只保留key
      5. 如果出现单个元祖,只有一个元素的时候需要添加“,”,eg:(a,)
    3. dict:无序,key和value不要求同一类型,可被修改,用{}括起来所有元素
      1. 判断key是否存在:if key in dict或者用[key],key不存在则返回None,存在则返回dict[key];dict.setdefault(key) key不存在则插入key、key对应的value为None
      2. 删除元素:dict.pop(key[,value1]),如果key不存在返回value1,如果value未设置且key不存在会报错,存在返回被删除的key对应的value;dict.popitem()返回并删除最后一对键值对,如果字典为空则报错KeyError
      3. 清空字典:dict.clear()
      4. key必须保证唯一性,如果不唯一,只会记住最后一个;key不可变,可采取数字、字符串、元祖,但列表不行
      5. 拷贝:浅拷贝-py()或import copy然后调用py(dict)拷贝原数组,原数组如果发生改变,父对象改变无影响,子对象会变更成原数组改变后的值;深拷贝import copy然后调用copy.deepcopy(dict)拷贝原数组,父子对象改变对新字典均无影响
      6. 修改字典:dict.fromkeys(seq[,value]),设置字典值列表的值为value,value取空默认传None,该方法返回一个新的字典;dict.update(dict2)把dict2追加入到dict中
      7. 查找元素:dict.items()遍历所有键值,dict.keys()遍历所有键,dict.values()遍历所有值
    4. string:可以用‘’或""来创建
      1. 字符串前缀:r/R去除转义字符、f表示在字符串内支持{}、b表示后面是bytes类型(服务器、浏览器只认bytes类型)、u编码规范化一般用于中文字符串作前缀
      2. 转义符:续行符用在行尾、\反斜杠符号输出、'返回‘、“返回"、r回车、t横向制表符、n换行
      3. 格式化符:%c格式化字符及ASCII码、%s格式化字符串、%d格式化整数、%u格式无符号整型、%o格式化八进制数、%x格式化无符号十六进制数(大写%X)、%a.bf格式化浮点数(a表示浮点数长度,b表示浮点数小数后面的精确度,不填默认6位,a小于实际长度输出a、大于实际长度左侧补齐空位;b小于实际长度四舍五入、大于实际长度左侧空格补齐)
      4. 判断元素是否存在:s in string 存在返回True,否则返回False,s not in string正好相反&#dwith(s,start,end)判断str的start和end间是否是以字符or字符串s结尾的,是返回True,否则返回False;
      5. 元素检验:str.isalnum(),检验str是否只由字母或数字组成,符合则返回True,否则返回False;str.isalpha()判断str是否只由文字或字母组成,是返回True,否返回False;str.isdigit()判断是否只包含数字;str.islower()判断是否全由小写字母组成;str.issuper()判断是否由大写字母组成;str.isnumeric()检测是否只由数字字符组成,数字字符包含 Unicode 数字,全角数字(双字节),罗马数字,汉字数字;str.isspace()判断是否只包含空格;str.istitle()判断所有单词拼写首字母是否大写;str.startwith(s,start,end)检测
      6. 字符串检索:string[start:end],start不传默认0,end不传默认len()、字符串翻转可以用string[::-1];str.rfind(s,start,end)如果包含s返回查找到的最后一个索引值,不包含返回-1;str.find(s,start,end)如果包含s返回查找到的第一个索引值,不包含返回-1;str.index(s,start,end)如果包含s返回查找到的第一个索引值,不包含报错;str.rindex(s,start,end)如果包含s返回查找到的最后一个索引值,不包含报错;str.split("分隔符",num)通过指定分隔符进行切片,分割为num+1个字符串,num默认-1全部;str.splitlines(True/False),输出结果里是否保留换行符,返回修改后的字符串;
      7. 字符串修改:str.capitalize()首字母大写其余字符小写后返回,如果首字符不是字母则全部转为小写后返回&#(width[,fillchar]),返回width宽度str居中两侧fillchar填充的字符串,如果width小于字符串长度,则返回原串,fillchar不填默认为空格&#pandtabs(tabsize=8),以tabsize个空格替换制表符t,返回修改后的字符串,默认size为8;str.ljust((width[,fillchar]),左对齐,输出一个以width开头fillchar填充的width宽度字符串,width小于len(str)返回原串;str.rjust(width[,fillchar])右对齐;str.lstrip(s)去掉左边全部空格或者指定字符s;str.rstrip(s)删除右末尾的所有s或者空格,返回修改后的字符串;str.lower()将所有大写字符改为小写;s.maketrans(intab,outtab)将s中的intab字符全部换成对应位置的outtab字符并返回;max(str)返回str中最大的字符;min(str)返回str中最小的字符&#place(old,new[,max])将str中的所有old字符换成new、替换次数不超过max次,返回替换后的字符串,max不填默认全部替换;
      8. 字符串拼接:str*n相当于n个s相加;str.join(s)将s作为连接符连接str中的所有元素,并返回修改后的值
      9. 字符串出现次数&#unt(s,start,end)在索引为start~end之间寻找字符s,start默认0,end默认len(str),返回s出现的次数
      10. 字符串decode、encode处理:bytes.decode(encoding="utf-8", errors="strict")以指定编码格式解码bytes对象,返回解码后的字符串&#de(encoding='UTF-8',errors='strict')以UTF-8的编码格式对str进行encode,erros设置错误处理方案,默认是strict,返回编码后的对象(bytes对象)
    5. set:集合中元素是无序的,可被修改,其中元素不要求一个类型,此处以basket举例
      1. 构建set:空集 S=set(),非空集S=set(传入list)或者S={元素1、元素2、元素3,……}
      2. 去重:print basket
      3. 判断元素存在 value in basket返回True表示存在,返回False表示不存在
      4. 两个集合运算:a-b返回a中有但b中没有的元素;a|b或a.union(b, c...)返回新集合或a.update(b)修改原集合,返回集中a和b集合包含的全部元素,;a&b或a.intersection(b)返回新合集或a.intersection_update(b,c,d)在原集上移除不合规元素,返回a和b的交集;a^b或.difference(b)返回a和b的差集;a.difference_update(b)修改原集合或a.symmetric_difference(b)返回新集合,移除a和b中都有的元素后返回;a.symmetric_difference_update(b)修改a集合,将a和b的交集去除,然后增加b中非重复的元素
      5. 集合比较:s.isdisjoint(s1),判断两个合集是否有相同元素,不包含返回True,反之False;s.issubset(s1),判断s是否是s1的子集,是则返回True,反之False;s.issuperset(s1),判断s1是否是s的子集,是则返回True,反之False
      6. 添加元素:s.add(x)将x添加到s中,如果x已经存在则不进行任何操作;s.update(x),x可以是列表、字典、元素等
      7. 移除元素&#ve(x)将元素x从s中移除出去,如果x不存在会报错;s.discard(x),x不存在不报错;s.pop()随机删除元素
      8. 清空合集:s.clear()
      9. 拷贝集合&#py()
    6. 文件读取方式:
      1. f=open(file,“模式”,encoding="utf-8") 、f.read()、f.close()
        1.  读写模式有:r只读、r+读写(rb以二进制读模式打开,rb+以二进制读写模式打开)、w新建覆盖原文件(w+以读写模式打开、wb以二进制写模式打开、wb+以二进制读写模式打开)、a追加(a+以读写模式打开、ab以二进制追加模式打开、ab+以二进制读写模式打开)、b二进制文件
      2. with open(path,encoding='utf-8') as f: 、f.read()
      3. import linecache、linecache('file',n):读取file的第n行
    7. 复数:real + image j/J 或 complex(real,image),real实部、image虚部,不支持比大小
      1. 共轭复数a.conjugate()=real -image j/J
      2. 复数相加a+b=(real1+real2) + (image1+image2) j/J,复数想减a-b=(real1-real2) + (image1-image2) j/J
      3. 乘:a*b=real1*real2 -image1*image2 +(real1*image2+real2*image1) j/J
    8. 多线程
      1. 创建方式:threading.Thread(target=线程函数名,args=参数)
      2. 多线程相当于一个并发系统,可以同时执行多个任务
      3. 线程池在启动的时候,创建大量空闲的线程,当函数提交到线程池,会分配一个空闲线程来执行,执行结束后回归线程池恢复空闲状态,等待执行下一个线程
      4. 线程池种类:
        1. 创建固定数量的线程池,适用于线程数明确或服务器负载较重,对线程有严格限制的场景
        2. 创建只有一个线程的线程池,适用于需要保证顺序执行各任务,并且在任意时间点,不会同时有多个线程的场景
        3. 创建可缓存的线程池,适用于可创建一个无限扩大的线程池,服务器负载压力小,执行时间短,任务多的场景
        4. 创建可供调度的线程池,可延时启动、定时启动,使用多个后台线程执行周期任务的场景
        5. 创建一个拥有多个任务队列的线程池,可以减少连接数,创建当前cpu可用核数的线程来执行任务,适用于耗时大,可并行执行的场景
    9. 内存管理机制:
      1. 引用计数:记录了对象有多少引用,即引用计数,引用计数增加,多一个索引,结果+1;引用计数减少,销毁一个索引,结果-1;循环引用,如对象a中的属性引用b,对象b中的属性引用a,会导致a,b无法释放。
      2. 垃圾回收机制:
        1. 引用计数:是一种直观的垃圾收集机制,当引用计数为0,则说明没有任何引用指向该对象,表示可以回收。优点:实时性,缺点:维护引用计数消耗资源、无法解决循环引用问题
        2. 标记清理:对执行删除操作后的每个引用-1,把等于0的引用放进死亡容器内,大于0的引用放进存活容器内,遍历存活容器,查看是否有存活容器调用了死亡容器内的对象,如果有就把该对象挪到存活容器内,最后将死亡容器内的所有对象删除。缺点:清除非活动的对象前必须顺序扫描整个堆内存
        3. 分代回收:新创建的对象作为0代,每执行一个标记-清理,存活的对象代数就+1,代数越高的对象(存活时间越久),进行标记-删除的时间间隔就越长
      3. 内存池机制:许多申请的小块内存,很快被释放,当创建大量消耗小内存的对象时,频繁调用new/malloc会导致大量碎片,导致效率变低。内存池的概念是预先在内存中申请一定数量、大小相等的内存块留作备用,当有内存新需求,优先从池子中进行分配,不够再申请新的。分为大内存、小内存,以256k为界限,小于256k时,pymalloc会在内存池中申请内存;大于256的时候,执行new/malloc申请内存
    10. 锁:
      1. gil锁:全局解释锁,在同一进程下可开启多个线程,但同时刻只有一个线程能执行,无法使用多核技术,但保证了数据安全性(同一时间只有一个线程能修改数据)、避免了大量加锁解锁
      2. 同步锁:同一时刻的一个进程下只能使用一个CPU,要确保这个线程下的程序在一段时间内被CPU执行,需要用到同步锁;对公共数据的操作前后加上上锁和释放锁的操作即可使用,保证程序的完整性,避免遇到io操作,cpu切到其他线程上去
      3. 递归锁和死锁:
        1. 死锁,指两个或两个以上的进程或线程在执行程序的时候,因争夺资源而互相等待的现象;产生条件:互斥条件,不可剥夺,请求和保持(请求新资源,继续占用原资源),循环等待(p1占p2资源,p2占p3资源,p3占p1资源)
        2. 递归锁,支援同一个线程中多次请求同一资源,提供可重入锁,这个Rlock内部维护着一个lock和一个counter,counter记录了acquire的次数,从而使得资源可以多次被rquire,直到一个线程的所有acquire都被释放掉,其他线程才可以获取资源
    11. 设计模式:分为3大类,细分为23种
      1. 创建型模式
        1. 单例模式:确保一个类只有一个实例存在,比如读取配置信息
        2. 工厂模式:用来创建对象的设计模式、当程序输入一个类型,需要创建与此相应的对象时,就用到了该模式,扩扩展、代码可维护
        3. 建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以有不同的表示,比如一个指挥员、两个创造者,指挥员可以指定哪个来创造
        4. 原型模式:本质是克隆对象,在对象初始化比较复杂的时候很实用,能降低耗时,提高性能
      2. 结构性模式:
        1. 适配型模式:接口适配技术,可通过某个类来使用另一个与接口与之不兼容的类,使用于希望复用现存类,但接口又与复用环境不一样的情况
        2. 修饰器模式:用于扩展对象,比如使用不同的照相机镜头
        3. 外观模式:门面模式,是一种对象结构型模式
        4. 享元模式:运用共享技术有效的支持大量细粒度的对象
        5. 模型-视图-控制器模式、代理模式
      3. 行为模式:责任链模式、命令模式、解释器模式、观察者模式、状态模式、策略模式、模板模式
    12. python比java运行速度慢、比c++快:java强大于改进了n次的jre,c++由于指针所以慢
    13. 装饰器:修改其他函数的函数,一切皆可对象,在函数中嵌套函数,从函数中返回函数,将函数作为入参传递给另一个函数,但不能修改被装饰函数的源代码和调用方式
    14. 封装、继承、多态
      1. 封装:将数据与具体操作的实现代码放在某个对象内部,外界只能通过接口来调用,隐藏对象细节,易于维护,更安全
      2. 继承:实现代码复用,多个类的公共代码,可以在一个类中提供,其他类直接继承就行了,子类在调用某个方法和变量时,优先从自己内部找,如果没找到,则开始以深度优先的方式从继承的父类里找
      3. 多态:不检查类型,只要方法存在,参数正确,就可以调用
    15. shell和python对比:
      1. shell启动时间比python快,但执行效率比python低
      2. shell缺少很多函数、对象、数据结构和多线程支持,这限制了他在复杂脚本或者编程中使用;python拥有大量库、文档及活跃社区,错误处理更友好,但对于简单任务需要些更多的代码
      3. shell在Linux下可直接运行,无依赖;python可能包含许多第三方依赖,这些依赖需要在执行前安装
      4. shell缺少良好的调试工具和实用程序
    16. 常用函数
      1. bin(i) 以0b1……的格式表示二进制,int('ob'+x,2)将x转为int形
      2. from collections import deque:从右边添加,deque.append();从左边添加deque.appendleft();从左边添加list&#dleft(list);deque.pop()出队列,返回队列元素;deque.popleft()从左边开始出

本文发布于:2024-02-04 04:47:32,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170699384852186.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:基础知识   python
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23