2019/9/26
python学习
列表生成式
列表生成器:列表生成式就是一个用来生成列表的特定语法形式的表达式。
- 基础语句结构:
[ exp for iter_var in iterable ]
例如:a=[f(x) for x in range(10)]
-
工作过程:
迭代iterable中的每个元素;每次迭代都先把结果赋值给iter_var,然后通过exp得到一个新的计算值;最后把所有通过exp得到的计算值以一个新列表的形式返回。
相当于这样的过程:
L = [] for iter_var in iterable:
L.append(exp)
-
作用:
按照某种算法不断生成新的数据,直到满足某一个指定的条件结束。
-
构造生成器的两种方式:
- 使用类似列表生成式的方式生成
(2*n + 1 for n in range(3, 11))
-
使用包含yield的函数来生成
生成器的执行过程:
在执行过程中,遇到yield关键字就会中断执行,下次调用则继续从上次中断的位置继续执行。
-
生成器的特性:
只有在调用时才会生成相应的数据,只记录当前的位置,只能next,不能prev
生成器的调用要调用生成器产生新的元素,有两种方式:
调用内置的next()方法
使用循环对生成器对象进行遍历(推荐)
调用生成器对象的send()方法注意:
方括号:是熟悉的列表解析式,一次性返回整个列表,
圆括号:是生成器表达式,返回一个生成器对象,而不是一次性生成整个列(返回,按需产生的一个结果对象,而不是构建一个结果列表)
print([x for x in range(5)])
print((x for x in range(5)))
输出结果:
[0, 1, 2, 3, 4]
<generator object at 0x000001C53D084360>
值传递和址传递
python中变量与对象的引用关系类似于c语言的指针变量与指针指向值的关系。
在python的数据结构中,对象分为可变对象和不可变对象。基本数据类型如int、float等都是不可变对象。在结构数据类型中,元祖tuple、str是不可变对象,list(列表)、dict(字典)、set(集合)是可变对象,可变对象存储的元素的引用其实是没有改变的,改变的是其引用指向的值。
采用引用语义存储的只是一个变量的值所在的内存地址,而不是这个变量的值本身。可变对象为引用传递,不可变对象为值传递。(函数传值)
变量中存储的是值的引用,也就是指所在内存空间的地址。对于给变量赋值时,每一次的赋值都会产生一个新的地址空间,将新内容的地址赋值给变量,但是对于相同的值,地址不发生变化。
对复杂的数据类型(列表、元祖、字典),如果添加某一项元素,或者添加几个元素,不会改变其本身的地址,只会改变其内部元素的地址引用,但是如果对其重新赋值时,就会重新赋予地址覆盖就地址,这时地址就会发生改变。
值传递
被调函数在执行时,首先对收到的参数对象生成一个副本,在执行过程中,是对参数副本的操作,并不会对原参数产生改变。也就是在堆栈中开辟内存空间存放由主调函数传进来的实参对应的副本值。
特点:函数对收到的参数的任何操作,不会对原参数(实参变量)产生影响。
引用传递
当传递列表或者字典时,如果改变引用的值,就改变了原始对象。(引用传递直接传的是地址,是对原始对象的直接操作。)
注意:引用传递,函数修改的直接是实参的值。但是,在函数体中不能直接修改整个列表或者字典的值,这样做,也等于创建实参的副本,并不会对实参本身产生影响。
面向对象
类继承: 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。
通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类。
继承语法
class 派生类名(基类名):
……
在python中继承中的一些特点:
- 如果在子类中需要父类的构造方法就需要显示的调用父类的构造方法,或者不重写父类的构造方法。详细说明可查看:python 子类继承父类构造函数说明。
- 在调用基类的方法时,需要加上基类的类名前缀,且需要带上 self 参数变量。区别在于类中调用普通函数时并不需要带上 self 参数
- Python 总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 。
self理解: self有点类似java中的this,无实际意义。但是约定俗成的都是用self表示类的实例。
self代表类的实例,而非类;而self.class则指向类。
概括:
- self在定义时需要定义,但是在调用时会自动传入。
- self的名字并不是规定死的,但是最好还是按照约定是用self
- self总是指调用时的类的实例。