首页
关于
Search
1
python打包-Nuitka快速上手
107 阅读
2
python打包-pystand快速上手
23 阅读
3
python打包-pyinstaller快速上手
18 阅读
4
开始我的python学习之路
17 阅读
5
python学习记录第25天
10 阅读
默认分类
登录
Search
Typecho
累计撰写
29
篇文章
累计收到
32
条评论
首页
栏目
默认分类
页面
关于
搜索到
29
篇与
的结果
2023-05-05
python学习记录第23天
7.2 【基础】静态方法与类方法1. 写法上的差异类的方法可以分为:静态方法:有 staticmethod 装饰的函数类方法:有 classmethod 装饰的函数实例方法:没有任何装饰器的普通函数举个例子,如下这段代码中,run 普通的实例方法,eat 是静态方法,jump 是类方法。class Animal: def __init__(self, name): self.name = name def run(self): print(f"{self.name}跑起来啦") @staticmethod def eat(): print("正在吃饭...") @classmethod def jump(cls, name): print(f"{name}跳起来啦")这三种方法,在写法有很大的区别:1、普通的实例方法,在定义时,他的第一个方法固定是 self,如果是从实例调用,那么 self 参数 不需要传入,如果是通过类调用,那么 self 要传入已经实例化的对象。>>> dog=Animal(name="小黑") >>> dog.run() 小黑跑起来啦 >>> Animal.run(dog) 小黑跑起来啦2、静态方法,在定义时,不需要 self 参数。>>> dog=Animal(name="小黑") >>> dog.eat() 正在吃饭... >>> Animal.eat() 正在吃饭...3、类方法,在定义时,第一个参数固定是 cls,为 class 的简写,代表类本身。不管是通过实例还是类调用类方法,都不需要传入 cls 的参数。>>> dog=Animal(name="小黑") >>> dog.jump("小黑") 小黑跳起来啦 >>> Animal.jump("小黑") 小黑跳起来啦2. 方法与函数区别在前面,我们很经常提到方法和函数,为免有同学将他们混为一谈,我这里总结一下他们的区别。在 Python 3.x 中,普通函数(未定位在类里)和静态方法,都是函数(function )。实例方法(@staticmethod)和类方法,都是方法(method )。这些结论其实都可以使用 type 函数得到验证。先准备如下代码class Animal: def __init__(self, name): self.name = name def run(self): print(f"{self.name}跑起来啦") @staticmethod def eat(): print("正在吃饭...") @classmethod def jump(cls, name): print(f"{name}跳起来啦") def demo_func(): pass然后进入 Python Console 模式>>> type(demo_func) # 普通函数 <class 'function'> >>> type(dog.eat) # 静态方法 <class 'function'> >>> >>> type(dog.run) # 实例方法 <class 'method'> >>> type(dog.jump) # 类方法 <class 'method'>类方法和实例方法,名字本身就有方法,也是方法也说得过去。那静态方法呢,为什么不是方法而是函数呢?对此,我的理解是:方法是一种和对象(实例或者类)绑定后的特殊函数。方法本质上还是函数,不同之处在于它与对象进行绑定。
2023年05月05日
1 阅读
0 评论
1 点赞
2023-05-04
python学习记录第22天
7.1 【基础】类的理解与使用1. 通俗理解类类(英文名 class),是具有相同特性(属性)和行为(方法)的对象(实例)的抽象模板。从定义上来理解类,是一件非常吃力的事情,特别是对那些没有任何基础的初学者。下面我举例来说明类中一些关键术语都是什么意思:类:动物属于一个类,植物属于一个类实例:猫和狗都属于同一类,就是动物类,那么猫和狗是动物类的实例/对象。属性:类中所有的变量,都叫做属性。方法:类中的所有函数,都叫做方法。类与对象的关系就如模具和铸件的关系,类的实例化的结果就是对象,而对象的抽象就是类,类描述了一组有相同特性(属性)和相同行为(方法)的对象。2. 如何定义类?定义一个类,使用的是 class 关键字下边我定义了一个 Animal 的类class Animal: age = 0 def __init__(self, name): self.name = name def run(self): print(f"{self.name} 跑起来了")其中Animal 是类名__init__ 是构造函数,用于实例的初始化self.name 是实例属性,age 是类属性run 是方法,第一个参数 self 是什么意思呢?这个咱后面再讲。除了上面这种写法外# 第一种写法 class Animal: ...还有另外两种写法,与之是等价的# 第二种写法 class Animal(): ... # 第二种写法 class Animal(object): ...因为在 Python 3 中,无论你是否显示继承自 object,Python 解释器都会默认你继承 object ,这是新式类的写法,与之对应的是 Python 2 的经典类写法(Python 2 已经远去,无需要再了解经典类写法)。3. 如何实例化?定义了类之后,就可以通过下边的写法实例化它,并访问属性,调用方法>>> class Animal: ... def __init__(self, name): ... self.name = name ... def run(self): ... print(f"{self.name} 跑起来了") ... >>> >>> dog=Animal(name="小黑") # 实例化出 dog 对象在实例化时传入的参数 name="小黑" 传进入到构造函数 __init__ 中,最终赋值 self.name 成为实例的属性。4. 方法的调用实例化成对象后,如果访问实例属性,可以用 对象.属性名 进行访问。>>> dog=Animal(name="小黑") >>> dog.name # 访问属性 '小黑'如果要调用方法,有两种方法通过 对象.方法名:使用这种方法,在定义方法时 self 就代表对象(dog),调用时无需再传入了。>>> dog=Animal(name="小黑") >>> dog.run() # 调用方法 小黑 跑起来了通过 类.方法名:使用这种方法,self 参数要传入实例对象>>> dog=Animal(name="小黑") >>> Animal.run(dog) 小黑 跑起来了
2023年05月04日
4 阅读
0 评论
1 点赞
2023-05-04
python学习记录第21天
6.2 【基础】如何抛出和捕获异常?1. 如何抛出异常?异常的产生有两种来源:一种是程序自动抛出,比如 1/0 会自动抛出 ZeroDivisionError一种是开发者主动抛出,使用 raise 关键字抛出。在 Python 中是使用 raise 关键字来抛出异常的,比如在下面这个函数中,如果不存在目标文件,则会抛出一个 Exception 通用异常。def demo_func(filename): if not os.path.isfile(filename): raise Exception2. 如何捕获异常?出现错误或者异常没有关系,关键在于你要学会预判程序可能会出现的错误或异常,然后在代码中捕获这些异常并处理。异常的捕获的语法有如下四种:第一种语法只捕捉但是不想获取异常信息try: 代码A except [EXCEPTION]: 代码B第二种语法不但捕捉了还要获取异常信息,赋值给 e 后,后面你可以把异常信息打印到日志中。try: 代码A except [EXCEPTION] as e: 代码B有了上面的基础语法,可以扩展出下面三种常用的异常捕获的写法。第三种语法正常使用 try ... except ...如果代码A发生了异常,则会走到代码B的逻辑。try: 代码A except [exception] as e : 代码B举个例子>>> try: ... 1/0 ... except ZeroDivisionError as e: ... print("发生了异常:错误信息如下: \n" + str(e)) ... 发生了异常:错误信息如下: integer division or modulo by zero第四种语法使用 try ... except ... else 如果代码A发生了异常,则会走到代码B的逻辑,如果没有发生异常,则会走到代码Ctry: 代码A except [exception] as e: 代码B else: 代码C举个例子不发生异常的情况>>> try: ... 4/2 ... except ZeroDivisionError as e: ... print("发生了异常:错误信息如下: \n" + str(e)) ... else: ... print("程序正常运行") ... 2 程序正常运行发生异常的情况>>> try: ... 1/0 ... except ZeroDivisionError as e: ... print("发生了异常:错误信息如下: \n" + str(e)) ... else: ... print("程序正常运行") ... 发生了异常:错误信息如下: integer division or modulo by zero第三种:使用 try ... except ... finally如果代码A发生了异常,则会走到代码B的逻辑,最后不管有没有发生异常都会走到代码Ctry: 代码A except [exception] as e: 代码B finally: 代码C举个例子发生异常的情况>>> try: ... 1/0 ... except ZeroDivisionError as e: ... print("发生了异常:错误信息如下: \n" + str(e)) ... finally: ... print("程序运行结束!!") ... 发生了异常:错误信息如下: integer division or modulo by zero 程序运行结束!!不发生异常的情况>>> try: ... 4/2 ... except ZeroDivisionError as e: ... print("发生了异常:错误信息如下: \n" + str(e)) ... finally: ... print("程序运行结束!!") ... 2 程序运行结束!!3. 捕获多个异常?每个except捕获一个异常一个 try 语句可能有多个 except 子句,以指定不同异常的处理程序,但是最多会执行一个处理程序。 当代码 A 在运行中抛出了异常时,Python 解释器会逐行运行代码,如果抛出的异常是 exception1 那么后面直接运行代码B,运行完 B 后,就不会再判断后面两个 except 语句了。而如果不是 exception1 ,而是 exception2 ,那会运行代码C,而不会再运行第三个 except 语句了。try: 代码A except [exception1] as e: 代码B except [exception2] as e: 代码C except [exception3] as e: 代码D举个例子吧,下面这段代码,由于 1/0 会抛出 ZeroDivisionError 错误,所以前面两个异常匹配都不成功,而在最后一个 except 成功匹配上,最终打印出 除数不能为 0try: 1/0 except IOError: print("IO读写出错") except FloatingPointError: # 浮点计算错误 print("计算错误") except ZeroDivisionError: # 除数不能为 0 print("计算错误") # output: 计算错误一个except捕获多个异常上面的例子可以看出来,第二个异常和第三个异常是属于同一类,就是 计算错误,异常处理的代码是一样的,那有没有办法将它们合并在一起呢,简化一下代码呢?答案是,可以的。在 except 后面其实是可以接多个异常的,多个异常之间使用括号包裹。只要匹配上一个就算捕获到,就会进入相应的代码分支。try: 1/0 except IOError: print("IO读写出错") except (ZeroDivisionError, FloatingPointError): print("计算出错") # output: 计算错误
2023年05月04日
2 阅读
0 评论
1 点赞
2023-05-03
python学习记录第20天
6.1 【基础】什么是异常?在程序运行过程中,总会遇到各种各样的问题和错误。有些错误是我们编写代码时自己造成的,比如语法错误、调用错误,甚至逻辑错误。下面这个例子,在输入 if 后输入回车了,没有按照 Python 的语法规则来,所以直接抛出了语法错误。>>> if File "<stdin>", line 1 if ^ SyntaxError: invalid syntax还有一些错误,则是不可预料的错误,但是完全有可能发生的,比如文件不存在、磁盘空间不足、网络堵塞、系统错误等等。下面这个例子,使用 open 函数打开 demo.txt 文件,可是在当前目录下并没有这个文件,所以一定会打开失败,抛出了IOError。>>> fp = open('demo.txt') Traceback (most recent call last): File "<stdin>", line 1, in <module> IOError: [Errno 2] No such file or directory: 'demo.txt'这些导致程序在运行过程中出现异常中断和退出的错误,我们统称为异常。正常情况下,异常都不会被程序处理,而是以错误信息的形式展现出来。异常有很多种类型,Python内置了几十种常见的异常,就在builtins模块内,它们无需特别导入,就可以直接使用。需要注意的是,所有的异常都是异常类,首字母是大写的!在发生异常的时候,Python会打印出异常信息,信息的前面部分显示了异常发生的上下文环境,并以调用栈的形式显示具体信息。异常类型作为信息的一部分也会被打印出来,例如ZeroDivisionError,TypeError。>>> 1/0 Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: integer division or modulo by zero >>> >>> >>> 10 + "1" Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'int' and 'str'正常情况下,我们都不需要去记住 Python 到底内置了哪些错误和异常类型,除非你需要去捕获它,关于捕获的内容,我会放在下一节。这一节先来认识一下 Python 中有哪些常见的错误和异常,对于新手,下面的内容大概过一下就好,不用深究,因为这些在你以后的编码中都会遇到的。1.SyntaxErrorSyntaxError,是语法错误,可能是新手在学习 Python 时最容易遇到的错误>>> while True print('Hello world') File "<stdin>", line 1 while True print('Hello world') ^ SyntaxError: invalid syntax解析器会输出出现语法错误的那一行,并显示一个“箭头”,指向这行里面检测到的第一个错误。 错误是由箭头指示的位置 上面 的 token 引起的(或者至少是在这里被检测出的):在示例中,在 print() 这个函数中检测到了错误,因为在它前面少了个冒号 (':') 。文件名和行号也会被输出,以便输入来自脚本文件时你能知道去哪检查。2、TypeErrorTypeError,是类型错误,也就是说将某个操作或功能应用于不合适类型的对象时引发,比如整型与字符型进行加减法>>> a = 10 >>> b = "1" >>> >>> a-b Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for -: 'int' and 'str'3、IndexErrorIndexError,是指索引出现了错误,比如最常见下标索引超出了序列边界>>> alist = [0,1,2] >>> alist[5] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list index out of range4、KeyErrorKeyError是关键字错误,这个异常主要发生在字典中,比如当用户试图访问一个字典中不存在的键时会被引发。>>> profile = {"name": "王炳明"} >>> profile["age"] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'age'5、ValueErrorValueError为值错误,当用户传入一个调用者不期望的值时会引发,即使这个值的类型是正确的,比如想获取一个列表中某个不存在值的索引。>>> int("1") 1 >>> int("a") Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: 'a'6、AttributeErrorAttributeError是属性错误,当用户试图访问一个对象不存在的属性时会引发。比如字典有get方法,而列表却没有,所以对一个列表对象调用该方法就会引发该异常。>>> alist = [0,1,2] >>> alist.get(0) Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'list' object has no attribute 'get'7、NameErrorNameError是指变量名称发生错误,比如用户试图调用一个还未被赋值或初始化的变量时会被触发。>>> name Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'name' is not defined8、IOErrorIOError 为打开文件错误,当用户试图以读取方式打开一个不存在的文件时引发。>>> fb = open('demo.txt') Traceback (most recent call last): File "<stdin>", line 1, in <module> IOError: [Errno 2] No such file or directory: 'demo.txt'9、StopIterationStopIteration为迭代器错误,当访问至迭代器最后一个值时仍然继续访问,就会引发这种异常,提醒用户迭代器中已经没有值可供访问了。>>> alist = range(2) >>> agen = iter(alist) >>> next(agen) 0 >>> next(agen) 1 >>> next(agen) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration10、AssertionErrorAssertionError 为断言错误,当用户利用断言语句检测异常时,如果断言语句检测的表达式为假,则会引发这种异常。>>> alist = [0,1,2] >>> assert isinstance(alist, list) >>> assert isinstance(alist, dict) Traceback (most recent call last): File "<stdin>", line 1, in <module> AssertionError11. IndentationErrorPython 是一门严格缩进的语言,如果缩进有问题,就会导致解释器解析异常,抛出 IndentationError>>> while True: ... print("hello") File "<stdin>", line 2 print("hello") ^ IndentationError: expected an indented block12. ImportError当你在使用 import 导包的时候,如果因为包名错误或者路径不对、包未安装,都会抛出 ImportError>>> import oxx Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named oxx
2023年05月03日
6 阅读
0 评论
1 点赞
2023-05-02
python学习记录第19天
5.3 【基础】匿名函数的使用匿名函数(英语:anonymous function)是指一类无需定义标识符(函数名)的函数。通俗来说呢,就是它可以让我们的函数,可以不需要函数名。正常情况下,我们定义一个函数,使用的是 def 关键字,而当你学会使用匿名函数后,替代 def 的是 lambda。这边使用def 和 lambda 分别举个例子,你很快就能理解。def mySum(x, y): return x+y mySum(2, 3) # 5 (lambda x, y: x+y)(2, 4) # 6从上面的示例,我们可以看到匿名函数直接运行,省下了很多行的代码,有没有?接下来,我们的仔细看一下它的用法带 if/else>>>( lambda x, y: x if x < y else y )( 1, 2 ) 1嵌套函数>>>( lambda x: ( lambda y: ( lambda z: x + y + z )( 1 ) )( 2 ) )( 3 ) 6递归函数>>> func = lambda n:1 if n == 0 else n * func(n-1) >>> func(5) 120或者>>> f = lambda func, n: 1 if n == 0 else n * func( func, n - 1 ) >>> f(f,4) 24从以上示例来看,lambda 表达式和常规的函数相比,写法比较怪异,可读性相对较差。除了可以直接运行之外,好像并没有其他较为突出的功能,为什么在今天我们要介绍它呢?首先我们要知道 lambda 是一个表达式,而不是一个语句。正因为这个特点,我们可以在一些特殊的场景中去使用它。具体是什么场景呢?
2023年05月02日
7 阅读
4 评论
1 点赞
1
2
3
...
6