Python 笔记
class,__init__函数,self
1. class
class是类,可理解为一个抽象模板
2. __init__函数
- __init__是一个内置函数, 用两个下划线开头表示该函数为私有,不能被外类的外部被使用或访问
- __init__方法的第一参数永远是self,表示创建的类实例本身
- self.val = val即在__init__方法内部,把val绑定到self,表示ListNode类的属性变量
3. self
self是 __init__方法的第一参数,表示创建的类本身
#定义ListNode类
class ListNode: #class是类,抽象模板
def __init__(self, val=0, next=None): #__init__方法的第一参数永远是self,表示创建的类实例本身
self.val = val #在__init__方法内部,把val绑定到self,表示ListNode类的属性变量
self.next = next
#定义Rectangle来求周长和面积
class Rectangle():
def __init__(self,a,b):
self.a = a
self.b = b
def getPeri(self): #Rectangle类下的其中一个函数
return (self.a + self.b)*2
def getArea(self):
return self.a * self.b
#类的取用
rect = Rectangle(3,4)
print(rect.getPeri())
print(rect.getArea())
print(rect.__dict__) #得到Rectangle类的属性
嵌套函数和递归函数
嵌套函数:在一个函数里面嵌套了另一个函数
嵌套函数:在一个函数里面嵌套了另一个函数
- 注意:无法在外部函数外直接调用内部函数
def func(foo):
print(1)
foo()
print(3)
def a():
print(2)
b = func(a)
print(b)
运行结果应为:
1, #先运行func()第一行
2, #运行func()第二行,即调用a()
3, #第二行运行完,运行第三行
None #函数默认返回 None,赋值给 b
递归函数:在一个函数在内部调用自身本身
例如,求
f
a
c
t
(
n
)
=
n
!
=
1
∗
2
∗
3
∗
.
.
.
∗
(
n
−
1
)
∗
n
=
(
n
−
1
)
!
∗
n
=
f
a
c
t
(
n
−
1
)
∗
n
fact(n) = n! = 1 * 2 * 3 * ... * (n-1) * n = (n-1)! * n = fact(n-1) * n
fact(n)=n!=1∗2∗3∗...∗(n−1)∗n=(n−1)!∗n=fact(n−1)∗n
所以,fact(n)可以表示为 n * fact(n-1),只有n=1时需要特殊处理。于是,fact(n)用递归的方式写出来就是:
def fact(n):
if n==1:
return 1
return n * fact(n - 1)
另一个稍复杂的例子:Leetcode中Q203.移除链表元素 - 递归法
class Solution:
def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
if head is None: #先定义好边界
return head
head.next = self.removeElements(head.next,val) #使用递归函数
#相当于利用递归快速到达链表尾端,从后往前依次进行判断,用删除头节点的方式依次删除
#每次递归返回的时当前递归层的head(若head值不等于val),或head.next(若当前head值等于val)
if head.val == val: #若当前head值等于val
head = head.next
else: #若head值不等于val
head = head
return head