函数、类和对象、魔法方法小结
发布日期:2021-05-14 15:55:22 浏览次数:17 分类:精选文章

本文共 3675 字,大约阅读时间需要 12 分钟。

阿里天池Python训练营 task 3

1. 函数和lambda表达式

1.1 函数参数

Python函数参数有以下5种:位置参数、默认参数、可变参数、关键字参数、命名关键字参数。

1.1.1 位置参数

位置参数在调用函数时位置要固定。

1.1.2 默认参数

默认参数在调用函数时,如果没有传入,则默认值被使用。默认参数必须放在位置参数后面,否则会报错。

1.1.3 可变参数

可变参数用*args表示,可变参数可以是零个到任意个数,自动组装成元组。*args接收所有未命名的变量参数。

1.1.4 关键字参数

关键字参数用**kw表示,可变参数可以是零个到任意个数,自动组装成字典。**kw接收所有关键字参数。

1.1.5 命名关键字参数

命名关键字参数用nkw表示,用户可以指定关键字参数。命名关键字参数定义方式是在参数名前加分隔符*。例如,*, nkw。

1.1.6 参数组合

函数可以定义位置参数、默认参数、可变参数、命名关键字参数、关键字参数中的四种参数。参数定义顺序必须是:位置参数、默认参数、可变参数、关键字参数,或者位置参数、默认参数、命名关键字参数、关键字参数。

1.1.7 可变参数和关键字参数的语法

*args 是可变参数,接收零个或多个参数,返回一个元组。**kw 是关键字参数,接收零个或多个关键字参数,返回一个字典。

1.2 lambda表达式

lambda 是Python用于创建匿名函数的关键字。语法结构如下:

lambda argument_list: expression
  • argument_list:函数参数,可以是位置参数、默认参数、关键字参数等。
  • expression:函数执行的表达式,返回一个值。

lambda函数的注意事项:

  • 没有return语句,表达式本身就是返回值。
  • lambda函数的命名空间是独立的,无法访问参数列表之外的命名空间。
1.2.1 lambda函数的应用示例
sumary = lambda arg1, arg2: arg1 + arg2
print(sumary(10, 20)) # 输出30
func = lambda *args: sum(args)
print(func(1, 2, 3, 4, 5)) # 输出15
1.2.2 filter和map函数中的lambda应用

filter函数用于过滤序列,map函数用于对序列进行映射。

odd = lambda x: x % 2 == 1
templist = 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]
m2 = map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
print(list(m2)) # 输出[3, 7, 11, 15, 19]

2. 类和对象

2.1 继承

子类自动共享父类的数据和方法。如果子类定义了与父类同名的方法或属性,则会覆盖父类的对应方法或属性。

2.1.1 类定义示例
class people:
name = '' # 类属性
age = 0 # 类属性
__weight = 0 # 私有属性
def __init__(self, n, a, w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print("%s 说: 我 %d 岁。" % (self.name, self.age))
2.1.2 单继承示例
class student(people):
grade = '' # 属性
def __init__(self, n, a, w, g):
people.__init__(self, n, a, w)
self.grade = g
def speak(self):
print("%s 说: 我 %d 岁了,我在读 %d 年级" % (self.name, self.age, self.grade))
s = student('小马的程序人生', 10, 60, 3)
s.speak() # 输出:"小马的程序人生 说: 我 10 岁了,我在读 3 年级"
2.2 多态

不同对象对同一方法的响应不同。

class a():
def fun(self):
print('This is a!')
class b():
def fun(self):
print('This is b!')
c, d = a(), b()
c.fun() # 输出:"This is a!"
d.fun() # 输出:"This is b!"
2.3 魔法方法

魔法方法总是被双下划线包围,例如__init__。魔法方法会在特定情况下自动被调用。

2.3.1 类的魔法方法
  • __init__(self[, ...]):构造器方法,实例化时自动调用。
  • __new__(cls[, ...]):实例化前调用的方法,用于创建对象。
2.3.2 算数运算符的魔法方法

可以通过定义魔法方法来自定义运算行为。例如:

class new_int(int):
def __add__(self, other):
return int.__sub__(self, other)
def __sub__(self, other):
return int.__add__(self, other)
a = new_int(5)
b = new_int(3)
print(a + b) # 输出2
print(a - b) # 输出8
2.3.3 属性访问的魔法方法
  • __getattr__:定义当属性不存在时的行为。
  • __setattr__:定义属性设置的行为。
  • __delattr__:定义属性删除的行为。
2.3.4 迭代器

迭代是Python最强大的功能之一。可以通过定义__iter____next__方法来实现自定义迭代器。

class rabits:
def __init__(self, n):
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.a
rabbit = rabits(100)
for each in rabbit:
print(each)
2.3.5 生成器

生成器函数是通过使用yield关键字定义的。生成器返回迭代器对象。

def libs(n):
a, b = 0, 1
while True:
a, b = b, a + b
if a > n:
return
yield a
for each in libs(100):
print(each, end=' ')

3. 魔法方法

魔法方法总是被双下划线包围,例如__init__。魔法方法的第一个参数通常是cls(类方法)或self(实例方法)。

3.1 基本魔法方法
  • __init__(self):构造器方法。
  • __new__(cls):实例化前的方法。
3.2 算数运算符的魔法方法

可以通过定义魔法方法来自定义运算行为。

3.3 反算数运算符的魔法方法

定义反向运算行为。

3.4 属性访问的魔法方法
  • __getattr__:定义属性获取行为。
  • __setattr__:定义属性设置行为。
  • __delattr__:定义属性删除行为。
3.5 迭代器

可以通过定义__iter____next__方法来实现自定义迭代器。

3.6 生成器

生成器函数是通过使用yield关键字定义的。生成器返回迭代器对象。

上一篇:简单爬虫:爬取100张4K动漫图片
下一篇:字符串、字典、集合小结

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2025年04月26日 00时05分34秒