Python笔记2(函数参数、面向对象、装饰器、高级函数、捕获异常、dir)

简介: Python笔记2(函数参数、面向对象、装饰器、高级函数、捕获异常、dir)

Python笔记1(赋值、浅拷贝和深拷贝、字符串日期转换、argparse、sys、overwrite、eval、json.dumps/json.loads、os.system(cmd)、zfill、endswith、open)

16、函数参数

参数定义

在python中定义函数的时候,函数名后面的括号里就是用来定义参数的,如果有多个参数的话,那么参数之间直接用逗号, 隔开。定义函数的时候在函数名后面的括号里定义的参数叫做形参,而调用函数的时候传入的参数叫做实参,形参是用来接收实参的。

参数分类

1.位置参数

位置参数也称必备参数,是必须按照正确的顺序传到函数中,即调用时的数量和位置必须和定义时是一样的。

def func(a,b):
    print(a)
    print(b)
add_num(11,22)
#运行结果
11
22

2.关键字参数

关键字参数是指使用形式参数的名字来确定输入的参数值。通过该方式指定实际参数时,不再需要与形式参数的位置完全一致。只要将参数名写正确即可。

def func(a,b,c):
    print(a)
    print(b)
    print(c)
add_num(11,c=99,b=33)
#运行结果
11
33
99

注意:在定义函数时,指定默认的形式参数必须在所有参数的最后,否则将产生语法错误。

可变参数

在Python中,还可以定义可变参数。可变参数也称为不定长参数,即传入函数中的实际参数可以是任意多个。定义可变参数时,主要有两种形式:一种是 *parameter,另一种是 **parameter。

  1. *parameter:这种形式表示接收任意多个实际参数并将其放到一个元组中。如果想要使用一个已经存在的列表作为函数的可变参数,可以在列表的名称前加 “ * ”。
  2. **parameter:这种形式表示接收任意多个类似于关键字参数一样显式赋值的实际参数,并将其放到一个字典中。如果想要使用一个已经存在的字典作为函数的可变参数,可以在字典的名称前加 “ ** ”。
  3. 在函数的形参中,如果同时有*parameter和**parameter,*parameter必须在**parameter前面。
def func(*args):
  print(args)
func(33,44,55,66,77)
func(*(33,44,55,66,77))
#运行结果
(33,44,55,66,77)
(33,44,55,66,77)
def func(**kwargs):
    print(kwargs)
func(e=33,h=44,f=55,d=66,c=77)
func(**{'e':33,'h':44,'d':66,'c':77})
#运行结果
{'e': 33, 'h': 44, 'f': 55, 'd': 66, 'c': 77}
{'e': 33, 'h': 44, 'f': 55, 'd': 66, 'c': 77}

17、面向对象

类和对象的定义

类是一种用户自定义的数据类型,它由数据和方法组成。数据表示属性,方法表示行为。一个类可以包含多个属性和方法。属性是类的成员变量,可以存储数据。方法是一组操作数据的代码,它们可以实现某些功能或者改变属性的值。

class 类名:
    类属性 = 值
    def __init__(self, 参数):
        self.属性1 = 参数1
        self.属性2 = 参数2
    def 方法1(self, 参数):
        # 方法代码
    def 方法2(self, 参数):
        # 方法代码

类中的私有函数与私有变量

1、什么是私有函数私有变量

无法被实例化后的对象调用的类中的函数与变量

类内部可以调用私有函数与变量

只希望类内部业务调用使用,不希望被使用者调用

2、私有函数与私有变量的定义

在变量或函数前添加__(2个下横线),变量或函数名后面无需添加

Python中定义函数时,若想在函数内部对函数外的变量进行操作,就需要在函数内部将其声明其为global 变量。添加了global关键字后,则可以在函数内部对函数外的对象进行操作了,也可以改变它的值。

18、装饰器

1、重试装饰器

在数据科学项目和软件开发项目中,有很多我们依赖外部系统的情况。事情并不总是在我们的控制之中。当意外事件发生时,我们可能希望我们的代码等待一段时间,让外部系统自行纠正并重新运行。

import time
from functools import wraps
def retry(max_tries=3, delay_seconds=1):
    def decorator_retry(func):
        @wraps(func)
        def wrapper_retry(*args, **kwargs):
            tries = 0
            while tries < max_tries:
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    tries += 1
                    if tries == max_tries:
                        raise e
                    time.sleep(delay_seconds)
        return wrapper_retry
    return decorator_retry
@retry(max_tries=5, delay_seconds=2)
def call_dummy_api():
    response = requests.get("https://qzkq.github.io/")
    return response
print(call_dummy_api)

在上面的代码中,我们尝试获取 API 响应。如果失败,我们将重试相同的任务 5 次。在每次重试之间,我们等待 2 秒。

2、@logger

def logger(function):
    def wrapper(*args, **kwargs):
        print(f"----- {function.__name__}: start -----")
        output = function(*args, **kwargs)
        print(f"----- {function.__name__}: end -----")
        return output
    return wrapper
@logger
def some_function(text):
    print(text)
some_function("first test")
# ----- some_function: start -----
# first test
# ----- some_function: end -----
some_function("second test")
# ----- some_function: start -----
# second test
# ----- some_function: end -----

3、@timeit

该装饰器用来测量函数的执行时间并打印出来。这对调试和监控非常有用。

import time
from functools import wraps
def timeit(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        result = func(*args, **kwargs)
        end = time.perf_counter()
        print(f'{func.__name__} took {end - start:.6f} seconds to complete')
        return result
    return wrapper
@timeit
def process_data():
    time.sleep(1)
process_data()
# process_data took 1.000012 seconds to complete

4、@property

@property装饰器用于定义类属性,这些属性本质上是类实例属性的getter、setter和deleter方法。通过使用@property装饰器,可以将方法定义为类属性,并将其作为类属性进行访问,而无需显式调用该方法。如果您想在获取或设置值时添加一些约束和验证逻辑,使用@property装饰器会非常方便。

class Movie:
    def __init__(self, r):
        self._rating = r
    @property
    def rating(self):
        return self._rating
    @rating.setter
    def rating(self, r):
        if 0 <= r <= 5:
            self._rating = r
        else:
            raise ValueError("The movie rating must be between 0 and 5!")
batman = Movie(2.5)
batman.rating
# 2.5
batman.rating = 4
batman.rating
# 4
batman.rating = 10
# ---------------------------------------------------------------------------
# ValueError                                Traceback (most recent call last)
# Input In [16], in <cell line: 1>()
# ----> 1 batman.rating = 10
# Input In [11], in Movie.rating(self, r)
#      12     self._rating = r
#      13 else:
# ---> 14     raise ValueError("The movie rating must be between 0 and 5!")
#
# ValueError: The movie rating must be between 0 and 5!

19、python 类的高级函数

1.str

__str__的功能,如果定义了该函数,当print当前实例化对象的时候,会返回该函数的return信息。

class Test(object):
    def __str__(self):
        return '这是描述'
test = Test()
print(test)

2.getattr

功能:当调用的属性或者方法不存在时,会返回该方法定义的信息。

class Test2(object):
    def __getattr__(self,key):
        print('这个key:{}不存在'.format(key))
a = Test2()
print(a.w)

3.setattr

功能:拦截当前类中不存在的属性和值。

def __setattr__(self, key, value):
    self.__dict__[key] = value
    print(self.__dict__)

4.call

功能:将一个类变成一个函数。

class Test3(object):
    def __call__(self, a):
        print(a)
t = Test3()
t('测试')
#打印结果   测试

综合示例(魔法函数)

# t.a.b.c 链式操作
class Test2(object):
    def __init__(self, attr=''):
        self.__attr = attr
    def __call__(self, name):
        return name
    def __getattr__(self, key):
        if self.__attr:
            key = '{}.{}'.format(self.__attr, key)
        else:
            key = key
        print(key)
        return Test2(key)
t2 = Test2()
name = t2.a.b.c('dewei')
print(name)
result = t2.name.age.sex('ok')
print(result)
aa.ba.b.cdeweinamename.agename.age.sexok

20、捕获异常(通用)

try:
    <代码块>
except Exception as e:
    <异常代码块>

主动抛出异常

可以使用 raise 语句来抛出异常,该语句后面需要带一个对象,该对象必须是派生自 Exception。

nums = [1, 2, 3, 4]
try:
    num = 5
    if num in nums:
        print(num)
    else:
        myException = Exception("变量不在列表内...") # 创建一个异常对象
        raise myException # 主动抛出异常
except Exception as err:  # 接受异常,err的内容就是错误原因
    print(err)  # 输出异常信息(或者针对异常做其他处理)

自定义异常类

  1. 一定要继承Exception类
  2. 要重新定义 init 和 __str__函数
nums = [1, 2, 3, 4]
# 继承异常基类 Exception
class myError(Exception):
    # 下面两个魔法函数是必须要写的
    # __init__函数负责类变量的初始化(一般是接报错的内容)
    def __init__(self, message):
        self.message = message
    # __str__函数负责根据类对象名称,返回异常信息
    def __str__(self):
        return "出现错误:" + self.message
try:
    num = 5
    if num in nums:
        print(num)
    else:
        myerror = myError("数字不在列表内")  # 创建一个自定义异常类型的变量
        raise myerror  # 手动抛出异常
except Exception as err:
    print(err)

常见异常

BaseException 所有异常的基类
Exception 常见错误的基类
ArithmeticError 所有数值计算错误的基类
Warning 警告的基类
AssertError 断言语句(assert)失败
AttributeError 尝试访问未知的对象属性
DeprecattionWarning 关于被弃用的特征的警告
EOFError 用户输入文件末尾标志EOF(Ctrl+d)
FloattingPointError 浮点计算错误
FutureWarning 关于构造将来语义会有改变的警告
GeneratorExit generator.close()方法被调用的时候
ImportError 导入模块失败的时候
IndexError 索引超出序列的范围
KeyError 字典中查找一个不存在的关键字
KeyboardInterrupt 用户输入中断键(Ctrl+c)
MemoryError 内存溢出(可通过删除对象释放内存)
NamerError 尝试访问一个不存在的变量
NotImplementedError 尚未实现的方法
OSError 操作系统产生的异常(例如打开一个不存在的文件)
OverflowError 数值运算超出最大限制
OverflowWarning 旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning 关于特征会被遗弃的警告
ReferenceError 弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象
RuntimeError 一般的运行时错误
RuntimeWarning 可疑的运行行为(runtime behavior)的警告
StopIteration 迭代器没有更多的值
SyntaxError Python的语法错误
SyntaxWarning 可疑的语法的警告
IndentationError 缩进错误
TabError Tab和空格混合使用
SystemError Python编译器系统错误
SystemExit Python编译器进程被关闭
TypeError 不同类型间的无效操作
UnboundLocalError 访问一个未初始化的本地变量(NameError的子类)
UnicodeError Unicode相关的错误(ValueError的子类)
UnicodeEncodeError Unicode编码时的错误(UnicodeError的子类)
UnicodeDecodeError Unicode解码时的错误(UnicodeError的子类)
UserWarning 用户代码生成的警告
ValueError 传入无效的参数
ZeroDivisionError 除数为零

assert断言

assert condition, message
  • condition:一个布尔表达式,表示你要断言的条件。如果条件为假,就会触发断言异常。
  • message:可选参数,通常是一个字符串,用于在触发断言异常时提供额外的信息,帮助你理解断言失败的原因

21、Python dir() 函数

dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。

相关文章
|
4天前
|
数据采集 JSON API
Python 实战:用 API 接口批量抓取小红书笔记评论,解锁数据采集新姿势
小红书作为社交电商的重要平台,其笔记评论蕴含丰富市场洞察与用户反馈。本文介绍的小红书笔记评论API,可获取指定笔记的评论详情(如内容、点赞数等),支持分页与身份认证。开发者可通过HTTP请求提取数据,以JSON格式返回。附Python调用示例代码,帮助快速上手分析用户互动数据,优化品牌策略与用户体验。
|
4天前
|
数据采集 JSON API
Python 实战!利用 API 接口获取小红书笔记详情的完整攻略
小红书笔记详情API接口帮助商家和数据分析人员获取笔记的详细信息,如标题、内容、作者信息、点赞数等,支持市场趋势与用户反馈分析。接口通过HTTP GET/POST方式请求,需提供`note_id`和`access_token`参数,返回JSON格式数据。以下是Python示例代码,展示如何调用该接口获取数据。使用时请遵守平台规范与法律法规。
|
1月前
|
Python
Python 高级编程与实战:深入理解面向对象与并发编程
本文深入探讨Python的高级特性,涵盖面向对象编程(继承、多态、特殊方法、类与实例属性)、异常处理(try-except、finally)和并发编程(多线程、多进程、异步编程)。通过实战项目如聊天服务器和异步文件下载器,帮助读者掌握这些技术,编写更复杂高效的Python程序。
|
2月前
|
数据库 Python
[oeasy]python066_如何捕获多个异常_try_否则_else_exception
本文介绍了Python中`try...except...else`结构的使用方法。主要内容包括: 1. **回顾上次内容**:简要复习了`try`和`except`的基本用法,强调了异常处理的重要性。 2. **详细解释**: - `try`块用于尝试执行代码,一旦发现错误会立即终止并跳转到`except`块。 - `except`块用于捕获特定类型的异常,并进行相应的处理。 - `else`块在没有异常时执行,是可选的。 3. **示例代码**:通过具体例子展示了如何捕获不同类型的异常(如`ValueError`和`ZeroDivisionError`),并解释了异常处理
80 24
|
2月前
|
人工智能 数据库连接 开发工具
[oeasy]python069_当前作用域都有些什么_列表dir_函数_builtins
本文介绍了Python中`dir()`函数的使用方法及其作用。`dir()`可以列出当前作用域内的所有变量和成员,类似于`locals()`,但`dir()`不仅限于本地变量,还能显示模块中的所有成员。通过`dir(__builtins__)`可以查看内建模块中的所有内建函数,如`print`、`ord`、`chr`等。此外,还回顾了`try-except-finally`结构在数据库连接中的应用,并解释了为何`print`函数可以直接使用而无需导入,因为它位于`__builtins__`模块中。最后,简要提及了删除`__builtins__.print`的方法及其影响。
58 0
|
4月前
|
分布式计算 MaxCompute 对象存储
|
4月前
|
关系型数据库 开发者 Python
Python编程中的面向对象设计原则####
在本文中,我们将探讨Python编程中的面向对象设计原则。面向对象编程(OOP)是一种通过使用“对象”和“类”的概念来组织代码的方法。我们将介绍SOLID原则,包括单一职责原则、开放/封闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则有助于提高代码的可读性、可维护性和可扩展性。 ####
|
6月前
|
Python
Python面向对象(2)
【10月更文挑战第14天】
56 6
Python面向对象(2)
|
5月前
|
Python
在Python中,`try...except`语句用于捕获和处理程序运行时的异常
在Python中,`try...except`语句用于捕获和处理程序运行时的异常
127 5
|
6月前
|
设计模式 程序员 C语言
Python面向对象
【10月更文挑战第13天】
49 2
Python面向对象

热门文章

最新文章

下一篇
oss创建bucket