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)

a
a.b
a.b.c
dewei
name
name.age
name.age.sex
ok

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__(),该方法将最大限度地收集参数信息。文章来源地址https://www.toymoban.com/news/detail-716921.html

到了这里,关于Python笔记2(函数参数、面向对象、装饰器、高级函数、捕获异常、dir)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 学习笔记整理-面向对象-02-认识函数的上下文

    什么是上下文 函数的上下文 函数中可以使用 this ,它表示 函数的上下文 。 与中文中\\\"这\\\"类似,函数中的this具体指代什么 必须通过调用函数时的\\\"前言后语\\\"来判断 函数中的this 函数的上下文由调用方式决定 同一个函数,用不同的形式调用它,则函数的上下文不同 情形

    2024年02月13日
    浏览(35)
  • 20个经典面试问题Python面向对象实战--飞机大战(1),Python中高级面试必知必会

    each.reset() for each in mid_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: screen.blit(each.image1, each.rect) pygame.draw.line(screen, BLACK, (each.rect.left, each.rect.top - 5), (each.rect.right, each.rect.top - 5), energy_remain = each.energy / enemy.MidEnemy.energy if energy_remain 0.2: en

    2024年04月15日
    浏览(43)
  • python第6课(函数,内置高阶函数,匿名函数,装饰器)笔记

    变量名的查找规则; 在访问变量时,先查找本地变量,然后是包裹此函数的外部函数的内部变量,之后是全局变量,最后是内置变量 1 在函数内使用全局变量 2使用nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量 函数名是变量,它在创建函数时绑

    2024年02月11日
    浏览(47)
  • Python学习笔记(二十)————面向对象

    (1)面向对象的好处 在日常中,记录数据时往往使用统一的表格,这样就不会使得数据信息格式混乱,同样在程序中的数据组织中,仅仅通过变量来记录会显得混乱不统一。 在程序中是可以做到和生活中那样,设计表格、生产表格、填写表格的组织形式的。 1. 在程序中 设

    2024年02月13日
    浏览(48)
  • Python补充笔记4-面向对象

    目录 一、编程思想​ 二、类与对象​ 三、类的创建​ 四、对象的创建​ 五、类属性、类方法、静态方法​ 六、动态绑定属性和方法​ 七、知识点总结 八、面向对象的三大特征 1.封装  2.继承​ 3.多态 九、方法重写 十、object类  十一、特殊方法和特殊属性 1.dict/len/add​

    2024年02月16日
    浏览(43)
  • python学习笔记:第七章面向对象

    与java类似,python作为一种面向对象的编程语言,也可以创建自定义的对象和类。 它的特性主要有:继承,封装,多态,方法,属性,超类 两者转换 每个类对应每个对象,下面有类变量 起到封装变量,封装函数,代码的作用 格式 实例化类,给类赋值 在创建对象时,就会被

    2024年02月13日
    浏览(50)
  • 10天玩转Python第6天:python 函数和面向对象基础 全面详解与代码示例

    不定长参数补充-函数调用时的拆包 匿名函数 语法 代码 练习 匿名函数作为函数的参数 - 列表中的字典排序 字符串比大小 基本的介绍 面向过程 关注的是 具体步骤的实现, 所有的功能都自己书写 亲力亲为 定义一个个函数, 最终按照顺序调用函数 面向对象 关注的是结果, 谁

    2024年02月04日
    浏览(59)
  • 第十章 面向对象编程(高级)

    定义语法: 访问修饰符        static        数据类型        变量名; 类变量也叫 静态变量/静态属性 ,是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量。 (

    2024年02月06日
    浏览(53)
  • Scala面向对象编程(高级部分)

    (1)回顾Java中的静态概念 public static 返回值类型 方法名(参数列表) {方法体} 静态属性… 说明: Java中静态方法并不是通过对象调用的,而是通过类对象调用的,所以静态操作并不是面向对象的。 (2)Scala中静态的概念-伴生对象 ①Scala语言是完全面向对象(万物皆对象)的语言

    2024年02月09日
    浏览(48)
  • Java基础(七)面向对象编程(高级)

    回顾类中的实例变量(即非static的成员变量) 创建两个Circle对象: Circle类中的变量radius是一个实例变量(instance variable),它属于类的每一个对象,c1中的radius变化不会影响c2的radius,反之亦然。 如果想让一个成员变量被类的所有实例所共享,就用static修饰即可,称为类变量(

    2023年04月16日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包