暑假开始了!准备好好学习python,打算先把基础课程过一遍。
1.类与对象
类初始化时名字一般首字母大写
类初始化实例:(利用__init__函数)
当传入参数数目不确定时,用*来表示(在函数与类中都是这样)
例题:
定义一个类,当实例化该类的时候,自动判断传入了多少个参数,并显示出来:
>>> class A:
def __init__(self,*args):
length=len(args)
if length==0:
print("没有传入参数")
else:
print("传入了 %d 个参数,分别是"%length,end=' ')
for each in args:
print(each,end=' ')
利用*args来表示传入多个参数的可能,注意__init__函数在设置参数时为(self,…),同时利用了格式化输出。
在定义类的成员时,如果成员名以两个下划线或更多下划线开头而不以两个或更多下划线结束则表示是私有成员。
私有成员访问方式要与普通成员有所不同
如果要访问私有成员:在类名前加_
继承——便于代码复用:
方法:子类名(父类名)
多态:
2.魔法方法
利用魔法方法,我们可以实现对运算符的重载操作(即赋予新意义)
例题:
定义一个单词(Word)类重写比较操作符(参考自学:Python 魔法方法详解),当两个 Word 类对象进行比较时,根据单词的长度来进行比较大小。
编写代码之前,我们首先需要查阅希望修改的运算符所对应的函数名,再在类的定义里
class word:
def __init__(self,words):
self.w=words
def __lt__(self,other):
return len(self.w)<len(other.w)
def __le__(self,other):
return len(self.w)>len(other.w)
def __eq__(self,other):
return len(self.w)==len(other.w)
>>> w1=word('just')
>>> w2=word('try')
>>> w1>w2
True
3.迭代器、生成器
实际用例:
>>> def get(number):
while True:
if number>100:
break
if is_prime(number):
yield number
number+=1
>>> a=get(1)
>>> for each in a:
print(each,end=' ')
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
4.模块思想
三种导入模块的方法:
-
import 模块名 as 新的模块名
-
from 模块名 import 模块元素
-
from 模块名 import *
导入模块时,要确保模块的存储路径包含于python 搜索路径,因此,问题变为如何获得python的搜索路径
import sys
print(sys.path)
我们可以很清楚的看到,sys.path是一个列表,因此当模块的路径不在sys.path中时,我们可以对其使用列表的append方法来增加搜索路径。
同时,也可以把模块文件直接移动到已有的搜索路径中。
自己创建一个包的方法:
- 新建一个文件夹
- 创建一个名为__init__.py的文件(可以为空)
- 相关的模块文件放入文件夹中
包名---->文件夹名 模块名---->模块文件的名字
__name__属性的含义:
作为独立程序时:__name__与__main__含义相同
作为模块被引入时,__name__即为模块名
应用实例:
对于下面这段代码,不管是运行a还是b都会报错
# a.py
import b
def x():
print('x')
b.y()
# b.py
import a
def y():
print('y')
a.x()
解决方法:
# a.py
import b
def x():
print('x')
if __name__ == '__main__':
b.y()
# b.py
import a
def y():
print('y')
if __name__ == '__main__':
a.x()
利用:if name == ‘main’:
使得两者之间主次分明,从而避免了上面的报错的情况。