
本文共 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 + arg2print(sumary(10, 20)) # 输出30func = 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 == 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]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) # 输出2print(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.arabbit = 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 afor 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
关键字定义的。生成器返回迭代器对象。
发表评论
最新留言
关于作者
