#第一天 标准数据类型
Python3 中有六个标准的数据类型:
Number(数字)String(字符串)List(列表)Tuple(元组)Set(集合)Dictionary(字典)
Python3 的六个标准数据类型中:
不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。
#第二天 ##上午
-
del语句
语法 del 变量名1,变量名2
-
is/is not运算符
is 是判断两个标识符是不是引用自一个对象 is not 是判断两个标识符是不是引用自不同对象
-
id(obj)
返回对象内存地址
-
内建函数
1.round(x,n)
x 变量 n 小数点为0位,小数点左负,右正
5.输入输出
input()输入print(self, *args, sep=' ', end='\n', file=None)
6.逻辑运算符
and 前面条件正确时,才执行后面,不正确时,就不执行or 前面条件正确时,不执行后面,不正确时,才执行not 布尔取反
#第三天 1.len(x)字符串长度
2.str.center(width[, fillchar])
3.str.count(sub, start= 0,end=len(string))
4.格式化输出
%:[- + 0 宽度,精度]类型码-:左对齐+:显示正号0:左侧空白位置补零
#第四天 1.break语句
1.1 当break语句执行后当层循环直接中断退出到上一层
2.continue语句
2.1 跳过当前循环块中的剩余语句,然后继续进行下一轮循环。
3.序列
列表是一种序列,且可变(类似c或java里的数组)
3.1 创建 list=[]3.2 列表运算符+ * in not in3.3 索引与字符串相同3.4 切片赋值=右边必须是一个可迭代对象3.5 构造函数list()
元祖
3.6 元组的构造函数 t = tuple(1,2,3)3.7 元组是不可变序列
字典
3.8 是无序序列,是一种可变容器模型,且可存储任意类型对象。类似其他语言的关联数组3.9 格式d = {key1 : value1, key2 : value2 }3.10 构造函数dict()3.11 字典常用方法; clear() 清空 pop(x) 移除键,同时返回对应的键值 copy() 返回字典的副本 d1.updata(d2) 更新字典,相同的键值则替换 d.keys() 返回迭代的dict_keys集合对象 d.items 返回可迭代的dict_item对象 d.get(key,default = None) 返回key的值,如果没有,返回default的值
集合
3.12 集合(set)是一个无序不重复元素的序列。3.13 集合运算 交集& 并集| 子集< 差集- 对称差集^ 超集> * 交集 生成两个集合所有相同元素的集合 * 并集 两个集合合并 * 差集生成属于集合1,但不属于集合2的集合 * 对称补集 将两个集合相同元素移除,再合并 * 超集
三元运算
真值表达式1 if 条件判断语句 else 真值表达式2类似(条件判断? "表达式1":"表达式2")
#第五天 1.函数
def 函数名(参数列表):
函数体
函数体不能为空语句,为空用pass填充
2.参数传递
在 python 中,类型属于对象,变量是没有类型的:
a=[1,2,3]
a="Runoob"
以上代码中,[1,2,3] 是 List 类型,"Runoob" 是 String 类型,而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是指向 List 类型对象,也可以是指向 String 类型对象。 可更改(mutable)与不可更改(immutable)对象
在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。
不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a。可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。
python 函数的参数传递:
不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。可变类型:类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响
python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。
3.不定长参数
3.1 加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。
# 可写函数说明def printinfo( arg1, *vartuple ): "打印任何传入的参数" print ("输出: ") print (arg1) print (vartuple)# 调用printinfo 函数printinfo( 70, 60, 50 )
结果:70
(60, 50) ######如果单独出现星号 * 后的参数必须用关键字传入。
def f(a,b,*,c): return a+b+cf(1,2,3) # 报错f(1,2,c=3) # 正常
3.2 加了两个星号 ** 的参数会以字典的形式导入。
# 可写函数说明def printinfo( arg1, **vardict ): "打印任何传入的参数" print ("输出: ") print (arg1) print (vardict) # 调用printinfo 函数printinfo(1, a=2,b=3)
4.传递参数形式
位置传参序列传参关键字传参字典传参缺省参数必须从右到左依次排列
5.变量作用域
global 声明为全局变量nonlocal 声明嵌套作用域(enclosing 作用域,外层非全局作用域)变量globals() 函数会以字典类型返回当前位置的全部全局变量。locals() 函数会以字典类型返回当前位置的全部局部变量。
6.匿名函数
语法:
lambda [arg1 [,arg2,.....argn]]:expression
sum = lambda arg1, arg2: arg1 + arg2# 调用sum函数print ("相加后的值为 : ", sum( 10, 20 ))print ("相加后的值为 : ", sum( 20, 20 ))
7.eval()函数
7.1 描述
eval() 函数用来执行一个字符串表达式,并返回表达式的值。
7.2 语法:
eval(expression[, globals[, locals]])参数:expression -- 表达式。globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
7.3 返回值
返回表达式计算结果。
8.exec()函数 8.1描述
exec 执行储存在字符串或文件中的 Python 语句,相比于 eval,exec可以执行更复杂的 Python 代码。
语法
以下是 exec 的语法:
exec(object[, globals[, locals]])
参数
object:必选参数,表示需要被指定的Python代码。它必须是字符串或code对象。如果object是一个字符串,该字符串会先被解析为一组Python语句,然后在执行(除非发生语法错误)。如果object是一个code对象,那么它只是被简单的执行。globals:可选参数,表示全局命名空间(存放全局变量),如果被提供,则必须是一个字典对象。locals:可选参数,表示当前局部命名空间(存放局部变量),如果被提供,可以是任何映射对象。如果该参数被忽略,那么它将会取与globals相同的值。
返回值
exec 返回值永远为 None。
#第六天 1.高阶函数
1.1函数接收一个或多个函数作为参数传入1.2函数返回一个函数1.3python内建的高阶函数 map reduce filter sorted
内建高价函数、
map() 会根据提供的函数对指定序列做映射。
def myadd(x): return x ** 3l = map(myadd, range(1, 10))print(sum(l))
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象
def is_odd(n): return n % 2 == 1 tmplist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])newlist = list(tmplist)print(newlist)
2.装饰器
def 装饰器函数名(func): def 函数名: func() 函数体 return 函数名 @装饰器函数名 def 函数名(): 函数体
#第七天 ##pygame
#第八天 ###异常 1.语法
try:except 错误类型1 [as 变量1]: passexcept 错误类型2 [as 变量2]: pass else: 未发生异常执行语句finally: 最终执行语句
2.异常错误类型
- BaseException # 所有异常的父类- SystemExit # 由sys.exit()抛出的异常- KeyBoardInterrupt # 通常由ctrl+c或者Delete抛出的异常- GeneratorExit # 当生成器被关闭时抛出的异常- Exception # - StopIteration # 迭代结束异常 - StopAsyncIteration # 由异步迭代的`__anext__()`抛出的异常 - ArithmeticError # 各种算数错误引起的异常 - FloatingPointError # 浮点数操作错误 - OverflowError # 结果超出范围 - ZeroDivisionError # 0为除数异常- AssertionError # assert错误异常- AttributeError # 属性引用异常- BufferError # 缓存错误- EOFError # 读不到数据- ImportError # import错误 - ModuleNotFoundError # 找不多模块- LookupError # 由索引和key值引起的异常 - IndexError # 索引错误 - KeyError # 字典key值错误- MemortError # 内存溢出异常- NameError # 本地和全局找不到变量名 - UnboundLocalError # 局部变量没有赋值- OSError # system错误 - BlockingIOError # 调用阻塞异常错误 - ChildProcessError # 子进程 - ConnectionError # 连接 - BrokenPipeError # 管道读写异常 - ConnectionAbortedError # 连接失败 - ConnectionRefusedError # 连接拒绝 - ConnectionResetError # 连接重置 - FileExistsError # 创建文件和文件夹错误 - FileNotFoundError # 文件未找到 - InterruptedError # 中断错误 - IsADirectoryError # 文件操作用在文件夹上 - NotADirectoryError # 不是文件夹 - PermissionError # 权限 - ProcessLookupError # 进程不存在 - TimeoutError # 超时- ReferenceError # 引用异常- RuntimeError # - NotImplementedError # 运行抽象方法 - RecursionError # 超出最大递归深度- SyntaxError # 语法错误 - IndentationError # 缩进错误 - TabError # tab错误- SystemError # 解释器中断- TypeError # 类型错误- ValueError # 赋值错误 - UnicodeError # - UnicodeEncodeError # unicode编码错误 - UnicodeDecodeError # unicode解码错误 - UnicodeTranslateError # unicode转换错误- Warning # - DeprecationWarning # 操作不赞成警告 - PendingDeprecationWarning # 表明此操作将来会被弃用 - UserWarning # 用于用户生成警告 - SyntaxWarning # 语法可疑警告 - RuntimeWarning # 运行警告 - FutureWarning # 将会改变警告 - ImportWarning # 导入警告 - UnicodeWarning # unicode相关警告 - BytesWarning # 字节相关警告 - ResourceWarning # 资源使用情况警告
#第九天
面向对象
1.类对象
class MyClass: """一个简单的类实例""" i = 12345 def f(self): return 'hello world' # 实例化类x = MyClass() # 访问类的属性和方法print("MyClass 类的属性 i 为:", x.i)print("MyClass 类的方法 f 输出为:", x.f())
2.类内置函数
class D(object): def __init__(self): print("init") def __new__(cls, *args, **kwargs): print("new %s" % cls) return object.__new__(D,*args,**kwargs) def car(self,color): print("颜色",color) def __del__(self): print("del函数")d = D()d.car('red')
__new__ : 类实例之前调用__init__ : 构造函数,类实例初始化__del__ : 析构函数,在实例对象被销毁时调用__dict__ : 类的属性(包含一个字典,由类的数据属性组成) __class__ : 指向该实例对应的类__doc__ : 存储的是当前python文件的注释信息__slots__ : 限定一个类的实例只能操作列表以内的属性
class Person: __slots__ = ['name', 'color'] def out_stu(self): print(self.name)a = Person()a.name='lili'a.age=18a.out_stu()
3.类方法、静态方法与实例方法
类方法 @classmethod静态方法 [@staticmethod](https://my.oschina.net/staticmethod)
class Tst: name = 'tst' data = 'this is data' # 普通方法 def normalMethod(self, name): print self.data, name # 类方法,可以访问类属性 @classmethod def classMethod(cls, name): print cls.data, name # 静态方法,不可以访问类属性 @staticmethod def staticMethod(name): print name
4.类的继承与派生
继承
继承是一种创建类的方法,在python中,一个类可以继承来自一个或多个父类。原始类称为基类或超类。
派生
派生就是子类在继承父类的基础上衍生出新的属性。子类中独有的,父类中没有的;或子类定义与父类重名的东西。子类也叫派生类。
基类 | 父类 | 超类
派生类 | 子类
#第十天 1.继承
重写(覆盖):在子类重新写父类的方法
2.super()
返回绑定超类的实例,等同于super(__class__,实例方法的第一个参数)显式调用基类的初始化方法:当子类实现__init__的方法,基类的构造方法并不会被调用
3.issubclass()
issubclass() 方法用于判断参数 class 是否是类型参数 classinfo 的子类。
4.封装
使隐藏类内部的实现细节
作用:让使用者通过尽可能少的方法(或属性)操作对象
权限访问(伪权限,只是压缩时按规则换了变量名,Python 的哲学是假定使用者都会使用)
_xx 以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问。若内部变量标示,如: 当使用“from M import”时,不会将以一个下划线开头的对象引入 。
__xx 双下划线的表示的是私有类型的变量(private)。只能允许这个类本身进行访问了,连子类也不可以用于命名一个类属性(类变量),调用时名字被改变(在类FooBar内部,__boo变成_FooBar__boo,如self._FooBar__boo)
__xx__定义的是特列方法。用户控制的命名空间内的变量或是属性,如init , __import__或是file 。只有当文档有说明时使用,不要自己定义这类变量。 (就是说这些是python内部定义的变量名)
5.python的全部对象只有“运行时状态”(动态),没有像C++编译时的状态(静态)
#十四天 ip地址转换
inet_aton 将十进制地址转为二进制inet_ntoa 将二进制地址转为十进制
1.套接字分类
流式套接字 传输层使用tcp协议进行传输,提供一个面向对象的,可靠的传输服务 数据传输以字节流的方式传输,长度无限制 数据报套接字 传输层使用udp协议进行传输,提供无连接的,不可靠,数据以报的形式独立传输 原始套接字 最底层的 不常用
2.socket.socket([family[, type[, proto]]])
family: 套接字家族可以使AF_UNIX或者AF_INET type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM protocol: 一般不填默认为0.
socket.bind(host,port) 绑定本机ip和端口
server端的host为入站地址
s.listen():开始TCP监听。backlog指定在拒绝连接之前,
操作系统可以挂起的最大连接数量。该值至少为1, 大部分应用程序设为5就可以了。
accept() 被动接受TCP客户端连接,(阻塞式)等待连接的到来
返回值: 第一个值返回为新的套接字 第二个值为连接进来客户端的address 消息收发 recv()接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。 flag提供有关消息的其他信息,通常可以忽略。
####udp
s.recvfrom()
接收UDP数据,与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。
s.sendto(data, addr)
发送UDP数据,将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。
####第十五天
循环服务器模型
tcp循环模型 1.需要建立连接 2.如果处理段请求可以满足多个客户端需求,但是需要频繁创建 断开连接 效率太低 3.如果处理长时间请求,则一个请求没有完成,无法进行下一个客户端的请求 udp循环模型 1.不需要建立连接 2.如果是短时请求,仍然需要一定得到时间,当客户端请求非常大的时候会产生不好的用户体验