type
Post
status
Published
date
Sep 30, 2025
slug
python
summary
菜鸟教程
tags
计算机科学
category
学习笔记
icon
password
Before OOP
推导式
- 列表推导式
expression可以是一个函数,例如
name.upper() ,则可以为:names显然应该是一个列表,name是列表中的一个项
还可以接上条件判断进行筛选,通用为:
例如如果我们仅仅利用条件来筛选:
这意味着获得30以内能够被3整除的整数,这里
i本身被当作一个表达式,当然你可以换成函数,这样函数只会对那些符合条件的执行。- 字典推导式
有了列表推导式的认识我们很容易理解以下语法:
对于有条件的情况
显然
collection 还是需要为一个列表或者元组,这样的表达式会返回字典- 集合推导式
如果把键值对换成单个值返回的就是集合:
有条件的情况:
- 元组推导式
如果把大括号换成小括号得到的就是元组:
有条件的情况:
函数
Mutable and Immutable
python的变量都是指针
而变量本身的指向信息则存放在命名空间,对于不可变类型,更改赋值就是更改指向:
而对于可变对象,更改对象本身指向是一样的:
打印值相同,但是列表中不同的项地址是不一样的:
而且看起来python的变量并不是连续存放的,如果我们插入:
由于python调用函数时传递的是地址,因此对于可变对象和不可变对象就有差别,对于不可变对象
因此传递不可变对象时我们可以相信,原来的对象不会被改变,但是对于可变对象:
Parameter of function
我们主要讨论可变参数
这里
*args意味着将传入的参数当作元组,还有一种可以将传入参数当作字典的:Lambda
我们最后介绍lambda匿名函数,所谓匿名函数就是定义时没有名字的,如下:
可以注意到,冒号前是变量,冒号后是表达式,匿名函数更大的用途是构造带参量的函数:
注意到这种结构很像数学中的泛函
Decorators
装饰器的直接过程是输入一个函数,并返回一个函数:
这样,当你在调用
func() ,你实际在调用new_function ,通常我们称这个新的函数为包装函数wrapper ,现在我们来考虑一下参数传递的问题。正如我们刚才所说的,如果实际调用的是包装函数,参数应该传给了包装函数,因此:
从这个意义上看,装饰函数似乎完成了对原始函数的一个封装。装饰器本身也可以传入参数:
要理解这个传递如何发生,我们得知道装饰器语法糖的展开为
say_hello = repeat(3)(say_hello) ,当执行到repeat(3),调用repeat() 并传入参数,此时返回decorator 函数,从而将repeat(3) 替换为了decorator() ,再传入say_hello ,返回wrapper ,再次替换,say_hello = wrapper ,并且利用闭包机制使得传入的参数被wrapper 记住。我们可以验证这件事:可以看到,完全符合。
这里我们还介绍一下类的装饰器,首先是函数形式的类装饰器:
同样的,当我们看到
@log_class 我们应当认识到执行的是MyClass = log_class(MyClass),据定义返回Wrapper 并传入cls = MyClass但我们不可能再
Wrapper 中一对一的写出MyClass的所有方法,我们希望当调用一个MyClass 中有的但是Wrapper 中没有的方法时,Wrapper 能转交给MyClass ,这就是getattr :当调用
another_method() 方法,但Wrapper 内没有这个方法,就会自动调用__getattr__ ,进而调用getattr(obj, name) 方法,该方法用于寻找obj的名称为name 的属性,从而找到MyClass的实例self.wrapped 的属性another_method 我们还有类形式的类装饰器:
这意味着
@decorator_class 的语法糖展开中original_class = decorator_class(original_class)发生的是装饰类的构造函数的调用,这有很大的变化,original_class 本身是个类,在这之后变为了decorator_class(original_class) 的实例,因此当我们假装按照类的方法再次创建一个实例obj = original_class(args)其实调用的是装饰类对象的成员函数,这个成员函数就是__call__ 内置函数,按道理这个函数必须返回一个对象,因此我们可以通过这个特性来构造单例类:除此之外,python还有一些内置的装饰器:
@staticmethod
可以看到,该装饰器用于将一个方法转为静态方法
@classmethod
该装饰器将类本身传入方法
@property
可以看到该装饰器将函数转为属性,通常我们将其与
setter组合在一起:OOP
Class Definition and Object
其中
__init__ 是python中类的构造函数,self 代表类的实例,而self.__class__ 则指向类Inheritance
当多继承时,方法先在子类中找,找不到就在父类从左往右找,因此重写会自然发生:
但我们可以利用
super 访问父类的已被覆盖的方法:- 作者:向思齐
- 链接:https://blog.xiangsiqi.site/notes/python
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章


