Python知识点汇总(2)

本文深入讲解Python中的排序方法、函数作用域、时间处理、面向对象编程、类的特殊方法、生成器与迭代器、错误与异常处理、文件操作及常见模块的使用技巧。

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

21、比较
(1)list.sort()与全局sorted()
list.sort(key = None,reverse = False)是列表内置排序方法。但其返回值为None(x.sort()的结果、print(x.sort())、x = x.sort()后x的结果都是None),只有当文字说“执行语句x.sort(),x的值为”,x.sort()作用的结果,需要通过打印被作用的列表才可以查看结果。true是倒序,false是正序。
sorted():Python内置方法。返回新的列表。
(2)list.reverse()和reversed()
list.reverse()返回的是None,其作用的结果,需要通过打印被作用的列表才可以查看结果。
reversed():内置方法。经过reversed()作用之后,返回的是一个吧序列值经过倒序的迭代器,所以,需要通过遍历或list、tuple或next()方法,才能获得作用后的值。
(3)字符串的查找:find和index
str.find(s):从左至右查找str中是否含s,有则返回第一次出现s的索引位置,否则返回-1
str.index(x):从左至右查找是否含有x,有则返回第一次出现的索引位置,没有则抛出ValueError
str.rfind()和str.rindex()就是从右至左查找。


22、函数变量的作用域
(1)局部变量、全局变量、global
global:用于在函数中直接修改全局变量的值。
(2)内嵌函数
内嵌函数的作用域仅限其所在的函数体内。如果要在内部函数中修改外部函数中的局部变量的值,使用nonlocal关键字。


23、datetime库——处理时间
其中的一个类:datetime类。引用方式:from datetime import datetime


24、面向对象编程
(1)首先定义一个“类”:class 类名(object):类名要求:每个单词首字母大写其余小写(如:SomeClass)
(2)在类中定义实例方法:
实例方法只有实例对象才可以调用。
调用方式:1、类对象内部(其他实例方法中):self.方法名(实参);2、类对象外部:实例对象.方法名(实参)。
第一种:普通方法:def 方法名(self,其他形参):。self是用于接收实例对象的。
第二种:特殊方法:def __init__(self,其他形参)。用于在创建实例对象后对其进行初始化。self必须有且是第一个形参,其他形参可有可无。创建实例对象后就会自动调用此方法。

(3)实例属性:实例对象所绑定的属性。
给实例对象绑定实例属性的方式:1、在类对象内(方法中):self.属性名 = 属性值 ;2、在类对象外部:实例对象.属性名 = 属性值。
访问实例属性的方式:1、在类对象内部(方法中):self.属性名;2、在类对象外部:实例对象.属性名
(4)类对象属性:类属性指的是类对象所绑定的属性。
绑定方式:1、类对象内:属性名 = 属性值;2、类对象外部:类对象.属性名 = 属性值。
访问类属性的方式:1、类对象的内部(方法中):类对象.属性名;2、在类对象外部:类对象.属性名 或 实例对象.属性名
总结:访问实例属性和类属性都可通过“实例对象.属性名”的方式,要注意的是,当通过“实例对象.属性名”方式访问属性时,会先查找指定的实例对象中有没有指定名称的实例属性,如果没有,再查找对应的类对象中有没有指定名称的类属性。
(5)函数装饰器:装饰器接收一个函数作为参数(传入的实参是被装饰的函数)。装饰器内部嵌套定义一个函数,且返回值是内函数(即return 内函数名)。被装饰函数的前面要添加@装饰器的函数名
(6)类方法:即类对象中使用装饰器@classmethod进行装饰的方法。
第一个形参用cls,表示类对象。
调用方式:类对象.方法名(实参)或cls.方法名(实参);也可以被实例对象调用,调用方式:实例对象.方法名(实参)或self.方法名(实参)。
(7)静态方法:用装饰器@staticmethod
静态方法只是一个普通的函数,因此,第一个形参没要求。调用方法同类方法。
(8)访问控制:控制类对象的属性和方法在类对象的外部是否可以直接访问。如果在类对象的某个属性或方法前添加两个下划线__,在类对象的外部就不能直接访问该属性或方法了。但在类对象的外部仍可以通过_类名__xxx访问属性或方法__xxx
(9)三大特征:封装、继承和多态
封装:将数据(属性)和行为(方法)包装到类对象中。在方法内部对属性进行操作,在类对象的外部调用方法。
继承: 当几个类对象有共同的属性和方法时,可以将这些属性和方法提取到一个基类,则只需要让每个类对象(子类)继承这个基类(父类),就可以访问基类中的属性和方法。子类会继承所有父类(所有直接/间接父类)的所有属性和方法。
子类可以添加父类中没有的属性。也可以重写自父类的某个属性或方法:在子类中定义与父类中同名的属性或方法(包括装饰器)。重写后可以通过super().xxx()调用父类中被重写的名为xxx的方法。
MRO(方法解析顺序)用于查看在类继承树上搜索方法的顺序。获取方法:调用最底层类对象的方法mro()或访问他的特殊属性__mro__。如果想调用指定父类中被重写的方法,可以给super()传入两个实参:super(a_type,obj),a_type是类对象,obj是实例对象。被指定的父类是:obj所对应类对象的MRO中,a_type后面那个类对象
多态:在不考虑对象类型的情况下使用对象。
(10)内置函数:issubclass()与isinstance() 、type()与dir()、增删改查
issubclass(实参1,实参2)用于判断类对象与类对象的关系(是不是子类)。实参1是类对象。实参2是类对象(或类对象组成的元组)时,如果实参1是实参2的子类(或元组内任意一个类对象的子类),返回Ture。(自己是自己的子类)
isinstance(实参1,实参2)用于判断实例对象与类对象的关系。实参1是实例对象,实参2是类对象(类对象组成的元组)时,如果实参1是实参2或其子类的实例对象(或实参2中任意一个类对象或其子类的实例对象,返回True)(print(isinstance(D(),D))是True)

type()用于获取指定对象的类型。实例对象的类型是其对应的类对象。类对象的类型是type,即,类对象是type的一个实例对象。自定义函数对象的类型是function,内置函数对象的类型是builtin_function_or_method(如type(dir)是这个,type(dir())是list)。可以用运算符==判断某个对象的类型是否是指定的类型。不是基本数据类型需导入模块types使用其中定义的变量。
dir()用于获得类对象或实例对象所有可以访问的属性和方法(包括从父类中继承的)的列表。类对象和实例对象的结果的区别:类对象的结果不包括实例属性
增删改查:
hasatter(object,name): 判断指定对象object是否有名为name的属性或方法。
getattr(object,name[,default]):等价于:object.name。用于获取指定对象object中名为name的属性或方法。找不到name指定的属性或方法时,不指定default就抛出AttributeError.指定了参数default就返回default。
setattr(object,name,value):在指定的object中添加或修改名为name的属性或方法的值,改为value。等价于:object.name=value.
delattr(object,name):删除。等同于del object.name
(11)算术运算符重载
+ 对应的特殊方法是__add__()和__radd__()
- 对应的特殊方法是__sub__()和__rsub__()
* 对应的特殊方法是__mul__()和__rmul__()
/ 对应的特殊方法是__truediv__()和__rtruediv__()
//对应的特殊方法是__floordiv__()和__rfloordiv__()
例如:object1+object2,object1在左边,所以需要实现__add__(),object2在右边,所以需要实现__radd__()。先查看object1,如果返回NotImplemented,就转去查看object2。
(12)类的特殊方法之__str__()和__repr__()
类的特殊方法之__str__()和__repr__()用于自定义并返回实例对象的字符串表示形式。

  • 直接打印一个实例对象时,若实例对象对应的类对象中实现了特殊方法__repr__(),会自动调用该方法,否则打印实例对象对应的类对象和实例对象在内存中的地址。
  • 用print打印实例对象时。若有__str__(),会自动调用它,否则有__repr__(),就调用它,都没有就打印地址。
  • str(实例对象名)时,若有__str__(),会自动调用它,否则有__repr__(),就调用它,都没有就打印地址。
  • repr(实例对象名)时,有__repr__(),就调用它,否则就打印地址.
    (13)new()
    当使用“类名([实参])”创建实例对象时,首先调用__new__(cls,*args,**kwargs)创建实例对象,该类中没有,就去父类中找;再调用特殊方法__init__()对创建的实例对象进行初始化,new()返回的实例对象会作为实参被自动传递给__init__()的第一个形参self。
    (14)getitem()、setitem()、delitem()用于使用中括号语法操作数据。
    getitem(self,key):当操作object[key]时,会自动调用该特殊方法。
    setitem(self,key,value):当执行操作object[key]=value时,会自动调用该特殊方法。
    delitem(self,key):当执行操作del object[key]时,会自动调用该特殊方法。
    (15)特殊方法之__call__()与__callable__()、len()
    如果在类对象中实现了特殊方法__call__(),那么就可以像调用函数一样直接调用这个类对象的实例对象,从而会自动调用特殊方法__call__()。
    内置函数callable用于判断指定对象是否是可调用的。除了函数对象是可调用的之外,对于实现了特殊方法__call__()的类对象,其实例对象也是可调用的。
    特殊方法__len__()用于解决内置函数len()的实参不能是自定义类对象的实例对象这个问题。有了__len__(),调用len()时,在其内部会自动调用实参所对应类对象的特殊方法__len__()。
    (16)特殊属性:docdictslots
    类对象有个特殊属性叫__doc__,用于访问类对象的文档字符串。文档字符串是位于类对象的第一行的字符串,通常用三个引号表示(如:""“文档字符串”"")访问类对象的文档字符串方式:类名.doc
    特殊属性__dict__,用于获得指定的类对象和实例对象所绑定的所有属性和方法的字典,其中,字典中的键为属性名或方法名。
    特殊属性__slots__用于对实例对象动态绑定的属性和方法的名称进行限制。在类对象中定义这个特殊属性,并给它赋值一个所有元素都为字符串的列表或元组。这样名称只能来自于__slots__中的元素。
    类对象中定义了__slots__后,就不会再创建__dict__了(打印类名称.__dict__,会报错),但__slots__只对其所在类对象的实例对象起作用,对子类的实例对象无用。如果子类也定义了特殊属性__slots__,那么子类的实例对象可以动态绑定的属性方法的名称为子类的__slots__和父类的__slots__。
    (17)生成器和迭代器
  • 生成器表达式:例如输出(i * i for i in range(8))的结果<generator object <genexpr> at 0x000001C75B0390C0>就是生成器表达式。需要用其他方式查看其中的元素。
    查看方式有两种:
    1、多次调用next(),每次都返回生成器的下一个元素,直到抛出异常StopIteration时表示没有更多元素了。
    2、使用for-in语句对生成器进行迭代,这样就不用关心异常StopIteration了。
    生成器中保存的并不是其对应的所有元素,而是如何推算出所有元素的算法。用于以上两种方法时都是在调用中一个个将元素推算出来,所以生成器是惰性推算,只有当用到生成器中的某个元素时,才会临时进行推算,不会提前。
    还可以使用生成器函数得到生成器,生成器函数中通过关键字yield返回推算出的元素(如print(a,end = ','等同于yield a),当调用以上两种查看方式时,执行完yield语句就会将生成器函数挂起,下次从挂起的地方继续执行。
  • 迭代器:
    可以用for-in语句的对象被称为可迭代(Iterable)对象,例如:range、列表、元组、字符串、字典、集合、生成器.可以调用内置函数isinstance(某对象,类Iterable)判断一个对象是否是可迭代对象,标准库模块collections中的类Iterable用于表示可迭代对象。
    迭代器(Iterator)对象:可以作为next()的实参从而支持惰性推算的可迭代对象。range、列表、元组、字符串、字典、集合都不是。生成器可以。所以生成器是迭代器的一种。
    可以调用内置函数iter()把不支持惰性推算的可迭代对象转换成迭代对象。如果一个对象同时实现了特殊方法__iter__()和__next__(),那么该对象也被称为迭代器对象。如果将该对象用于for-in语句,for-in语句首先会调用特殊方法__iter__()返回一个可迭代对象,然后不断调用该可迭代对象的__next__()返回下一次迭代的值,直到遇到StopIteration时退出循环。
    25、lambda函数:返回函数名作为结果
    <函数名> = lambda <参数>: <表达式>
    等价于
    def <函数名>(<参数>):
    <函数体>
    return <返回值>

26、返回迭代器的函数range/map/filter/reduce/zip/enumerate
range(start,stop,step)函数:返回一个可迭代对象(类型是对象),而不是列表类型,所以打印的时候不会打印列表。计数从start至stop结束,但不包括stop,步长为step。
map(函数,一个或多个序列):(函数作用到每一个序列)每一个序列都调用函数,返回新返回值。返回迭代器。需要list或next或for-in使其实现。
filter(function,iterable)。过滤掉不符合条件的元素,返回由符合条件元素组成的迭代器。第一个参数为函数,第二个为序列,序列的每一个元素作为参数传递给函数进行判断,然后返回Ture(即符合条件的)的元素。但是当function = None时,则返回不等于None(即等价于True)的元素,如0 = false就过滤掉,返回不等于0的元素
filter类实现了__iter__和__next__方法,可以看做一个迭代器,有惰性运算的特性。
zip(seq,seq…)函数:将2个及以上的序列中对应的元素合并在一起,打包成一个个元组,在处理完最短序列中的所有项后停止。利用*号操作符,可以将元组解压为列表。zip(*xxx)
enumerate(sequence,start = 0)用于将一个可遍历对象组合为一个索引序列,将数据索引下标和数据组合成一个元组,返回值是迭代器。一般用在for循环中。
reduce(function(有两个参数的函数),iterable序列,初始参数)函数:对参数序列中的元素进行累积。函数将一个数据集合(链表或元组等)中的所有数据进行下列操作:用传给reduce中的函数先作用给第1、2个元素,得到的结果再与第三个元素进行函数操作,最后得到结果。reduce()需要先调用functools模块。


27、模块与包
API用于描述模块中提供的函数的功能和调用方法。
模块的导入:from 模块 import 函数名(*)或import 模块名
查看模块搜索路径:sys.path
标准库os:import os 。查看当前路径:os.getcwd() ;修改当前路径:os.chdir(路径); 建立子文件夹,已存在会保存:os.mkdir();删除一个文件夹,不存在会报错:os.rmdir();列出当前目录下文件夹名称,返回一个列表:os.listdir();修改文件名:os.rename();删除文件:os.remove();
文件的开与关:开:open()提供了’r’,‘w’,‘x’,‘a’,‘b’,‘t’,’+’。如:f = open(‘a.txt’,‘r’) ,以w方式打开一个不存在的文件,会创建此文件,其他的遇到不存在文件,会报错。
关:f.close()。f.write()。f.read():读完一次,指针位于文档最后,再次读内容为空。关闭后再打开时,指针又回到文档的起点。
读取:read()返回字符串、readline()按行读取,返回字符串、readlines()所有内容在一整行返回,返回列表。
f.tell()获得文件当前读写位置。控制文件读写位置:f.seek(偏移量,参数)参数为0,1,2分别表示文件开头、当前、末尾位置。


28、错误与异常
错误分为:语法错误、逻辑错误和运行时错误。
语法错误指拼写等错误:SyntaxError、
逻辑错误:程序可执行,但结果不对;
运行时错误:
没导入相关模块:NameError;
0做分母:ZeroDivisionError;
程序试图打开不存在的文件:FileNotFoundError。
异常:程序没有语法错误的前提下,在运行期间产生的特定错误。
TypeError.
异常处理:try…except…else…finally结构
将可能会产生异常的代码放在try语句块中,把处理异常是代码放在except语句块中。


29、turtle库(import turtle)
设置窗口大小及位置:turtle.setup(width, height, startx, starty)
海龟坐标(以海龟为参照物确定方向):
向海龟正前方进行:turtle.fd(d) ;
向海龟反方向进行:turtle.bk(d) ;
向海龟左侧angle度的某点为圆心r为半径进行曲线运行:turtle.circle(r,angle)
改变海龟行进方向:turtle.seth();
向左转/向右转:turtle.left(angle)/turtle.right(angle);
画笔控制函数:抬起画笔,海龟在飞行:turtle.penup();
放下画笔:turtle.pendown();
改变画笔粗细:turtle.pensize()或turtle.width();
改变画笔颜色:turtle.pencolor()。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值