这一块应该没有什么难度的,但是对于初学小白来说也是非常重要的知识点
一些小的层面的
函数常用的一些操作:
调用函数
定义函数
函数的参数
递归函数
函数的高级特性:(印象笔记也整理了一部分,这里相当于是二次整理,只不过可能更加的详细了)
- 切片
- 迭代
- 列表生成式
- 生成器
- 迭代器
函数式编程:
大的层面方向的
Python函数调用时,参数的传递方式
详细内容移步:https://www.cnblogs.com/downey-blog/p/10483216.html 有兴趣的话后面再吗,慢慢的去结合起来进行全方面的深度理解。
对于C程序员来说,我们都知道C在函数调用时,采用的是值传递,即形参和实参分配不同的内存地址,在调用时将实参的值传给实参,在这种情况下,在函数内修改形参并不会影响到实参,但是这样带来一个问题,如果我们需要刻意地对实参进行修改,就不得不传递实参的指针到函数,然后在函数中修改指针指向的数据,以达到修改实参的目的。
后来,C++中引入了引用这个概念,即在函数定义时,在形参前加一个&符号,表示传递参数的引用,在写法上,除了多出一个&符号,其他部分和C中传值调用一样,但是实际确是达到了可以在函数内修改实参内容的目的。这种参数传递的方式被称为传引用。
python的参数传递
关于各个函数的调用的问题
以及各个循环之间的参数是否互不影响的问题??这也是我在做算法题遇到的一些很小的问题
python类中函数调用要加self
参考链接:
https://www.cnblogs.com/jessonluo/p/4717140.html
https://blog.csdn.net/stuscs/article/details/40110815
python中的类方法也是一种对象,既可以通过实例也可以通过类来访问方法,再python里面有两种风格
- 未绑定的类方法:没有self
通过类来引用方法返回一个未绑定方法对象。要调用它,你必须显示地提供一个实例作为第一个参数。 - 绑定的实例方法:有self
通过实例访问方法返回一个绑定的方法对象。Python自动地给方法绑定一个实例,所以我们调用它时不用再传一个实例参数。
两者的区别:两种方法都是对象,它们可以被传递、存入列表等待。两者运行时都需要一个实例作为第一参数(给予一个self值),但当通过一个实例调用一个绑定方法时Python自动会提供一个。
对象调用方法时, 实际上是通过类调用的a = muffedcalculator()a.calc(expr)
实际上是这样调用的 muffledcalculator.calc(a, expr)这样self 就是 a, python隐含地把a 传进方法 替代了self, 就成了绑定的方法, 就可以执行了. 否则就是非绑定方法(这种方式虽然很抽象,但是子集读了几遍之后大概是理解了,self就像是一个替代品一样)
self代表类的实例,而非类
class Test:
def prt(self):
print(self)
print(self.__class__)
t = Test()
t.prt()
# 运行结果
# <__main__.Test object at 0x000000000284E080>
# <class '__main__.Test'>
从上面的例子中可以很明显的看出,self代表的是类的实例。而self.__class__则指向类。(没有太懂)
self不必非写成self
class Test:
def prt(this):
print(this)
print(this.__class__)
t = Test()
t.prt()
# 运行结果不变
self是否可以不写
class Test:
def prt():
print(self)
t = Test()
t.prt()
# 运行提示:prt() takes 0 positional arguments but 1 was given(prt在定义的时候没有参数,但是我们运行的时候强行传入了一个参数。t.prt()通过python解释成:Test.prt(t),程序提醒我们多传入了一个参数t)
如果我们在定义和调用的时候都不传入实例,就是属于类方法
class Test:
def prt():
print(__class__)
Test.prt()
# 输出:<class '__main__.Test'>
在继承时,传入的是哪个实例,就是那个传入的实例,而不是指定义了self的类的实例
# 定义父类
class Parent:
# 定义了一个pprt()函数
def pprt(self):
print(self)
# 定义一个child类
class Child(Parent):
# 定义了一个cprt()函数
def cprt(self):
print(self)
c = Child()
c.cprt()
# 输出结果:<__main__.Child object at 0x0000000002A47080>
# 指的是child类的实例
c.pprt()
# 输出结果:<__main__.Child object at 0x0000000002A47080>
# 等同于child.pprt(c),self依然是child类的实例,由于self中没有定义pprt()方法,所以沿着继承树往上找,发现在父类Parent中定义了pprt()方法,所以就会成功调用。
p = Parent()
p.pprt()
# 输出结果:<__main__.Parent object at 0x0000000002A47240>