文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python函数和面向对象实例分析

2023-06-29 04:50

关注

这篇文章主要介绍“python函数和面向对象实例分析”,在日常操作中,相信很多人在python函数和面向对象实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python函数和面向对象实例分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

函数

python中『一切皆对象』, 函数也不例外.

在之前所学的C++Java中, 可以发现函数的返回值要么为空, 要么是某种数据类型, 但是在python中, 返回值可以是任何对象, 包括函数.

函数参数

函数的参数种类比较多, 主要有:

位置参数 (positional argument): 就是最常见的x, y等

2默认参数 (default argument): 给定一个默认值, 用户也可以传入实参来调整.

def func(x, y=3):    print(x+y)func(1)  # 4func(1, 666)  # 667

可变参数 (variable argument): 不限制输入参数的个数, 传入后自动保存为元组类型.

*args 是可变参数,args 接收的是一个 tuple

def printinfo(arg1, *args):    print(arg1)    print(args, type(args))printinfo(10)  # 仅一个参数, 没有属于args的.# 10# () <class 'tuple'>printinfo(70, 60, 50)  # 除arg1位置匹配的, 其他都传入给可变参数# 70# (60, 50) <class 'tuple'>

关键字参数 (keyword argument): 不限制关键字的个数和命名, 传入后自动保存为字典的形式.

**kw 是关键字参数,kw 接收的是一个 dict

def printinfo(arg1, *args):    print(arg1)    print(args, type(args))printinfo(10)  # 仅一个参数, 没有属于args的.# 10# () <class 'tuple'>printinfo(70, 60, 50)  # 除arg1位置匹配的, 其他都传入给可变参数# 70# (60, 50) <class 'tuple'>

命名关键字参数 (name keyword argument)

命名关键字参数是为了限制调用者可以传入的『参数名』,也可以提供默认值.

与关键字参数不同的是, 关键字参数的名字和值都是任意的, 后续再进行匹配使用, 而命名关键字则只能接受给定的关键字作为参数.定义命名关键字参数

不要忘了写分隔符 *, 否则定义的是位置参数, 命名关键字参数调用函数时必须给定参数名.

def person(name, *, age, height=1.90):    print(f'{name}今年{age}岁, 身高{height:.2f}m')person('张三', age=18, height=1.80)  # 张三今年18岁, 身高1.80mperson('李四', age=18)  # 李四今年18岁, 身高1.90mperson('王五')  # TypeError, 需要传入给定关键字

参数组合

Python中定义函数时, 以上这5种参数都可以使用, d但最多可以使用4种, 并且要注意顺序:

位置参数、默认参数、可变参数和关键字参数.

位置参数、默认参数、命名关键字参数和关键字参数.

变量作用域

在python程序中, 处于不同位置的变量, 有不同的作用域.

需要注意的是:

内嵌函数和闭包

内嵌函数就是在外层函数内定义内层函数.

def outer():    print('outer函数在这被调用')    def inner():        print('inner函数在这被调用')    inner()  # 该函数只能在outer函数内部被调用outer()# outer函数在这被调用# inner函数在这被调用

闭包是一个比较重要的语法结构, 结构上与内嵌函数类似, 区别在于返回值, 闭包的外层函数返回值是一个函数.

如果在一个内部函数里对外层非全局作用域的变量进行引用, 那么内部函数就被认为是闭包.

通过闭包可以访问外层非全局作用域的变量, 这个作用域称为闭包作用域.

def funX(x):    def funY(y):        print('使用funY(y)')        return x * y    return funYi = funX(8)print(type(i))  # <class 'function'>print(i(5))  # 40

注意到上述代码中, 内部函数FunY中使用了外部非全局作用域的变量x.

同样是, 函数内嵌套的函数作用域也需要特别注意, 若我们需要修改闭包内的变量, 需要使用nonlocal关键字.

num = 999def outer():    num = 10    def inner():        nonlocal num  # nonlocal关键字声明        num = 100        print(f'inner中num = {num}')    inner()    print(f'outer中num = {num}')outer()# inner中num = 100# outer中num = 100print(f'全局中num = {num}')# 全局中num = 999

lambda 表达式

lambda需要注意的是:

匿名函数主要适用于函数式编程(函数不会影响函数之外的内容)的一些高阶函数中. 例如map映射和filter过滤, 当然也可以在自己自定义函数中使用.

odd = lambda x: x % 2 == 1templist = filter(odd, [1, 2, 3, 4, 5, 6, 7, 8, 9])print(list(templist))  # [1, 3, 5, 7, 9]m1 = map(lambda x: x ** 2, [1, 2, 3, 4, 5])print(list(m1))  # [1, 4, 9, 16, 25]

面向对象

三大特性

面向对象就必须了解三大特性:

类、类对象 和 实例对象

类属性 和 对象属性

class A():    a = 0  #类属性    def __init__(self, xx):        A.a = xx  #使用类属性可以通过 (类名.类属性)调用。

有一些操作属性的方法:

class A(object):    name = '张三'    def set(self, a, b):        x = a        a = b        b = x        print(a, b)a = A()print(hasattr(a, 'name'))  # 判断是否有name属性 Trueprint(hasattr(a, 'set'))  # 判断是否有set方法 Truex = getattr(a, 'name')  # 获取属性值print(x)  # 张三c = getattr(a, 'set')  # 获取方法c(a='1', b='2')  # 2 1

私有

私有属性和方法仅需在定义命名的时候加上两个下划线"__"即可.

相对于公有属性和公有方法来说, 私有属性和私有方法更加的安全. 从定义上来说, 将需要安全保护的属性和方法封装为私有, 可以阻止外部直接调用, 而必须使用实例化对象方法类方法进行调用, 从而提高安全性.

但在python中的私有是『伪私有』, 即可以使用类名, 通过 object._className__attrName 访问私有属性,用 object._className__func() 访问私有方法.

class JustCounter:    __secretCount = 0  # 私有变量    publicCount = 0  # 公开变量    def count(self):        self.__secretCount += 1        self.publicCount += 1        print(self.__secretCount)counter = JustCounter()counter.count()  # 1print(counter.publicCount)  # 1# 特殊方法依旧可以访问print(counter._JustCounter__secretCount)  # 1# 直接访问则会报错.print(counter.__secretCount)

实例直接使用就可以增加属性了, 这点需要注意一下.

class B:    def func(self):        print('调用func方法')b = B()print(b.__dict__)  # 查看属性 {}b.name = '张三'b.age = 18print(b.__dict__)  # 查看属性{'name': '张三', 'age': 18}b1 = B()print(b1.__dict__)  # 查看属性 {}

魔法方法

基本的魔法方法

魔法方法基本上是被下划线包围的一些特殊方法. 相比于普通的方法, 它能够在适当的时候自动调用. 第一个参数一般是cls『类方法』或者self『实例方法』.

算术运算符

普通的计算在对象中是无法进行的, 需要自定义计算方式.

__add__(self, other)定义加法的行为: +

__sub__(self, other)定义减法的行为: -

__mul__(self, other)定义乘法的行为: *

__truediv__(self, other)定义真除法的行为: /

__floordiv__(self, other)定义整数除法的行为: //

__mod__(self, other) 定义取模算法的行为: %

__divmod__(self, other)定义当被 divmod() 调用时的行为 

divmod(a, b)把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b)。 

__pow__(self, other[, module])定义当被 power() 调用或 ** 运算时的行为

__lshift__(self, other)定义按位左移位的行为: <<

__rshift__(self, other)定义按位右移位的行为: >>

__and__(self, other)定义按位与操作的行为: &

__xor__(self, other)定义按位异或操作的行为: ^

__or__(self, other)定义按位或操作的行为: |

还有对应的反运算符, 在之前加上r即可, 例如__rsub__. 对应增量赋值运算符, 在之前加上i即可, 例如__isub__.

属性访问 

__getattr__(self, name): 定义当用户试图获取一个不存在的属性时的行为.

__getattribute__(self, name): 定义当该类的属性被访问时的行为(先调用该方法, 查看是否存在该属性, 若不存在, 接着去调用__getattr__).

__setattr__(self, name, value): 定义当一个属性被设置时的行为.

__delattr__(self, name): 定义当一个属性被删除时的行为.

描述符

描述符就是将某种特殊类型的类的实例指派给另一个类的属性.

__get__(self, instance, owner): 用于访问属性, 它返回属性的值.

__set__(self, instance, value): 将在属性分配操作中调用, 不返回任何内容.

__del__(self, instance): 控制删除操作, 不返回任何内容.

迭代器和生成器

迭代器

迭代是Python最强大的功能之一, 是访问集合元素的一种方式.

迭代器有两个基本的方法: iter() 和 next():

把一个类作为一个迭代器使用需要在类中实现两个魔法方法 __iter__() 与 __next__() .

class Fibs:    def __init__(self, n=10):        self.a = 0        self.b = 1        self.n = n    def __iter__(self):        return self    def __next__(self):        self.a, self.b = self.b, self.a + self.b        if self.a > self.n:            raise StopIteration        return self.afibs = Fibs(100)for each in fibs:    print(each, end=' ')# 1 1 2 3 5 8 13 21 34 55 89

生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator)。

def libs(n):    a = 0    b = 1    while True:        a, b = b, a + b        if a > n:            return        yield afor each in libs(100):    print(each, end=' ')# 1 1 2 3 5 8 13 21 34 55 89

到此,关于“python函数和面向对象实例分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯