Python训练营 Task3 Python基础进阶:从函数到高级魔法方法 学习笔记
一、学习知识点概要
函数(定义、调用)
lambda-表达式(匿名函数定义、应用)
类与对象
魔法方法
二、学习内容
1、函数
1.1 函数定义:函数以def
关键词开头,后接函数名和圆括号()。函数执行的代码以冒号起始,并且缩进。return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回None
。
1.2 函数的调用
1 def printme(str):
2 print(str)
3 printme("我要调用用户自定义函数!") # 我要调用用户自定义函数!
4 printme("再次调用同一函数") # 再次调用同一函数
5 temp = printme('hello') # hello
6 print(temp) # None
1.3 函数参数
- 位置参数 (positional argument):这些参数在调用函数 (call function) 时位置要固定
- 默认参数 (default argument):调用函数时,默认参数的值如果没有传入,则被认为是默认值。默认参数一定要放在位置参数 后面,不然程序会报错。
- 可变参数 (variable argument):可变参数就是传入的参数个数是可变的,可以是 0, 1, 2 到任意个,是不定长的参数。
def functionname(arg1, arg2=v, *args):
"函数_文档字符串"
function_suite
return [expression]
*args
- 可变参数,可以是从零个到任意个,自动组装成元组。
加了星号(*)的变量名会存放所有未命名的变量参数。
- 关键字参数 (keyword argument):
**kw
- 关键字参数,可以是从零个到任意个,自动组装成字典。
def functionname(arg1, arg2=v, args, *kw):
"函数_文档字符串"
function_suite
return [expression]
- 命名关键字参数 (name keyword argument)
def functionname(arg1, arg2=v, args, *, nkw, *kw):
"函数_文档字符串"
function_suite
return [expression]
*, nkw
- 命名关键字参数,用户想要输入的关键字参数,定义方式是在nkw 前面加个分隔符 *
。
如果要限制关键字参数的名字,就可以用「命名关键字参数」
使用命名关键字参数时,要特别注意不能缺少参数名。
- 参数组合:在 Python 中定义函数,可以用位置参数、默认参数、可变参数、命名关键字参数和关键字参数
但是,参数定义的顺序必须是:
位置参数、默认参数、可变参数和关键字参数。
位置参数、默认参数、命名关键字参数和关键字参数。
2.Lambda 表达式
2.1 匿名函数定义
lambda
- 定义匿名函数的关键词。argument_list
- 函数参数,它们可以是位置参数、默认参数、关键字参数,和正规函数里的参数类型一样。:
- 冒号,在函数参数和表达式中间要加个冒号。expression
- 只是一个表达式,输入函数参数,输出一些值。
注意:
expression
中没有 return 语句,因为 lambda 不需要它来返回,表达式本身结果就是返回值。- 匿名函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
2.2 匿名函数的应用:函数式编程 是指代码中每一块都是不可变的,都由纯函数的形式组成。这里的纯函数,是指函数本身相互独立、互不影响,对于相同的输入,总会有相同的输出,没有任何副作用。
匿名函数 常常应用于函数式编程的高阶函数 (high-order function)中,主要有两种形式:
- 参数是函数 (filter, map)
filter(function, iterable)
过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list()
来转换。
【例子】
1 odd = lambda x: x % 2 == 1
2 templist = filter(odd, [1, 2, 3, 4, 5, 6, 7, 8, 9])
3 print(list(templist))4 # [1, 3, 5, 7, 9]
- 返回值是函数 (closure)
map(function, *iterables)
根据提供的函数对指定序列做映射。
【例子】
1 m1 = map(lambda x: x ** 2, [1, 2, 3, 4, 5])
2 print(list(m1))
3 # [1, 4, 9, 16, 25]1 m2 = map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
2 print(list(m2))
3 # [3, 7, 11, 15, 19]
3.类与对象 (对象 = 属性 + 方法)
- 封装:信息隐蔽技术(使用关键字
class
定义 Python 类,关键字后面紧跟类的名称、分号和类的实现。) - 继承:子类自动共享父类之间数据和方法的机制
- 多态:不同对象对同一方法响应不同的行动
4.魔法方法:如果你的对象实现了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,而这一切都是自动发生的...
类有一个名为__init__(self[, param1, param2...])
的魔法方法,该方法在类实例化时会自动调用。
【例子】
class Ball:
def __init__(self, name):
self.name = namedef kick(self):
print("我叫%s,该死的,谁踢我..." % self.name)
a = Ball("球A")
b = Ball("球B")
c = Ball("球C")
a.kick()
# 我叫球A,该死的,谁踢我...
b.kick()
# 我叫球B,该死的,谁踢我...
cls
:代表一个类的名称self
:代表一个实例对象的名称
__new__(cls[, ...])
在一个对象实例化的时候所调用的第一个方法,在调用__init__
初始化前,先调用__new__
。
__new__
至少要有一个参数cls
,代表要实例化的类,此参数在实例化时由 Python 解释器自动提供,后面的参数直接传递给__init__
。
__new__
对当前类进行了实例化,并将实例返回,传给__init__
的self
。但是,执行了__new__
,并不一定会进入__init__
,只有__new__
返回了,当前类cls
的实例,当前类的__init__
才会进入。
三、学习问题与解答
类的方法与普通的函数的区别 : 它们必须有一个额外的第一个参数名称(对应于该实例,即该对象本身),按照惯例它的名称是 self
。在调用方法时,我们无需明确提供与参数 self
相对应的参数。
可变参数与关键字参数有什么区别:
- 可变参数允许传入零个到任意个参数,它们在函数调用时自动组装为一个元组 (tuple)。
- 关键字参数允许传入零个到任意个参数,它们在函数内部自动组装为一个字典 (dict)。
四、学习思考与总结
在这次的Task3的学习中,我进一步了解了Python的基础知识,开始了python中函数的使用。刚开始看这个任务的题目【从函数到高级魔法方法】,感觉有点迷惑,同时也有点被吸引,不禁思考题目中的“魔法”到底是指什么。经过这次学习,我有点理解了,它是一种自动运行方式。本次任务内容丰富,知识点也很多。对于基础还是比较薄弱的我来说还难以完全消化,但我会认真回顾所学的知识,为往后的学习筑基。