PEP8规则
- 变量命名最好是s_server,而不是大驼峰sServer或者带下划线的大驼峰s_Server
- 导入模块时,尽量不要用form xxx import *,用的是import xxx
取整(就是取商)
11//5 --> 5
取余(就是取余数)
11%5 --> 1
变量就是内存中的一段存储空间
有关导入模块
当交互模式下,修改py文件的代码,之后需要用reload重新加载模块文件,不过可以用一个方法来改变
exec(open('模块文件.py').read())
等腰三角形的输出
while输出三角形
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| i = 0 while i < 5: j = 0 while j <= i: print("* ", end="") j += 1 print("\n") i += 1 i = 0 while i < 4: j = 0 while j < (4-i): print("* ",end="") j += 1 print("\n") i += 1
|
带空白字符的字符串不是空字符串,在布尔环境下返回True,也就是返回一个值
在交互环境下
1 2 3 4 5
| if "": print("hello") # 这样是不会有返回值的 if " ": print("hello") # 这样的返回值是hello
|
break用于结束当前循环,continue用于结束本次循环,进入下一次循环
匿名函数lambda,交互模式下
1 2 3
| add = lambda x,y:x+y add(2,4) 输出值:6
|
递归函数
递归函数,自己调用自己,可能因判断条件有误,而导致无限循环
应有一个基准条件和递归条件,交互模式下
1 2 3 4 5 6 7 8 9 10
| # 设计一个从1累加到100的递归函数 def sum_n(n, sum=0): if n < 1: # 基准条件 n < 0 return sum # 当条件满足,不再调用自己,返回一个值 else: # 当递归条件 n >= 1 sum += n return sum_n(n-1, sum) # 此时不满足基准条件,自己调用自己,调用sum_n函数 sum_n(100) 5050
|
面向对象
面向对象编程(OOP,面向对象程序设计)
new方法直接创建对象,init是对 对象里面的东西初始化
Python中万物皆对象
经典类存在于python2中,在python3中,所有的类默认继承自object,python3中只有新式类,object是所有类的父类。
不可变类型的全局变量在函数中不加global声明,就无法修改,并且报错
私有属性和私有方法
1. 私有属性,就是函数中带有两个下划线的变量名,子类不能调用私有属性
1 2 3
| class A(object): def __init__(self): self.__name = "老王" #私有属性
|
2. 私有方法,就是函数中带有两个下划线的方法,子类不能调用私有方法
1 2 3 4 5 6
| class A(object): def __init__(self): self.__name = "老王" #私有属性 def __test__(self): #私有方法 print("---test_1---")
|
类属性和实例属性
1. 实例属性就是相当于平常定义的类,init方法里面的属性,实例属性通过对象来调用
1 2 3 4
| class Car(object): def __init__(self): # 下面就是实例属性 self.name = "che"
|
2. 类属性就是一个类里面定义的一个属性,类属性通过类名来调用(如果这个num=0没有放到一个方法中,那么这个变量就是这个类对象的属性,称为类属性;它的特点,所有通过这个类创建出来的对象,都可以使用这个属性)
1 2 3 4 5 6 7
| class Car(object): # 下面这个就是类属性 num = 0 def __init__(self): # 下面就是实例属性 self.name = "che"
|
类方法和静态方法
修改类属性的值需要在类属性的下面用到@classmethod,这个就叫类方法
1 2 3 4 5 6 7 8 9 10 11 12 13
| # 原无法修改类属性的时候 class Car: num = 0 def setNewnum(self, num): self.num = num # 现可以修改类属性的时候 class Car: num = 0 @classmethod # 类方法 def setNewnum(cls, num): cls.num = num
|
如果一个方法前面写了@staticmethod,那么这个方法就叫做静态方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Car: num = 0 @classmethod # 类方法 def setNewnum(cls, num): cls.num = num @staticmethod # 静态方法 def printCarsNum(): print(Car.num) bmw = Car() Car.num += 1 benz = Car() Car.num += 1 Car.printCarsNum()
|
简单工厂模式
模式就是通俗地说当遇到什么样的问题,就用什么样的解决方式来解决它。
定义一个函数,函数接收参数,根据接收参数的不同,生成对象也是不同的,这种方式叫简单工厂模式。工厂函数和工厂类
new方法
new方法就是创建对象,init对对象的属性初始化
单例模式需要用到new方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Animal(object): __instance = None __inited = None def __new__(cls, *args): if cls.__instance is None: cls.__instance = object.__new__(cls) return cls.__instance def __init__(self, name): if Animal.__inited is None: self.name = name Animal.__inited = True dog = Animal("xiaogou") cat = Animal("xiaomao") print(id(dog)) print(dog.name) print(id(cat)) print(cat.name)
|
输出结果是:
1 2 3 4
| 139722319965824 xiaogou 139722319965824 xiaogou
|
异常
1 2 3 4 5 6 7 8 9
| try: print(a) print("---1---") except: print("产生了错误...") if self.xxx: print("捕获开启") else: raise 类名A # 重新抛出异常,抛出的异常叫 类名A
|
all限制模块的导入,如果定义了all,那么导入模块只能导入跟all相对应的,如all = [“test1”]
包就是py文件
给程序传参
1 2
| import sys print(sys.argv)
|
列表推倒式
num = [x for x in range(1,11)]
也可以在列表推倒式里面添加条件
num = [x for x in range(1,11) if x%2!=0]
Get
num = [[x,x+1,x+2] for x in range(1,11,3)]
1 2
| a = [1,2,3,4,5,6,7,8,9,10,11,12] num = [[x,x+1,x+2] for x in a[::3]]
|
导入模块
搜索模块路径
1 2 3
| import sys sys.path sys.path.append("路径") #给path增加地址
|
1 2 3
| from imp import * #导入重新加载的模块功能 reload(模块) #重新加载模块 exec(open('模块文件.py').read()) --> 解决重新加载模块的问题,由于某些问题不推荐使用
|
==和is
1 2 3 4
| a = [11, 12] b = [11, 12] a == b #True,数值相同 a is b #False,内存地址不同,返回false
|
深拷贝和浅拷贝
深拷贝
1 2
| import copy a = copy.deepcopy(b) #深拷贝,拷贝内存中的数据到新的内存中,就是相当于重新写了一份数据
|
浅拷贝
1 2 3
| a = b #浅拷贝,类似于只拷贝引用,指向同一内存地址 copy.copy #根据拷贝的数据类型(可变,不可变)分拷贝情况,拷贝的是引用,如果一个列表删掉了里面的元素列表,那么另一个列表里面的数据不会变,如果是修改的话,同样都会变
|
进制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 正数:原码=反码=补码 负数:原码,反码:负数不变,后面取反,补码:最后位+1 补码转原码:反码 --> 补码 bin()二进制,oct()八进制,hex()十六进制,int("数值",几进制) >>右移,<<左移 9取反得-10 9的二进制是0000 1001,,,,后四位的值为 8 4 2 1,,,它的值相加是8+0+0+1 = 9 之后补码取反,1111 0110 再之后负数位不变,其他位取反+1,1000 1001 + 1,,,等于 1000 1010 = -10
|
属性property
property的作用:相当于把方法进行了封装, 开发者在对属性设置数据的时候更方便
property升级setter方法和getter方法
方法一:property(getter, setter)
方法二:@property #装饰器
函数中存在yield的就是生成器