本帖最后由 17858527423 于 2019-3-30 22:18 编辑
此贴为看书、学习过程中碰到的不太清楚的地方整合的笔记,不少是复制粘贴的。。。 1.关键字命名 1.1关键字(ipython3): import keyword print(keyword.kwlist) 1.2变量命名: 1.只能由下划线、数字和字母组成 2.不能以数字开头 3.不能与关键字同名 4.应尽量避免与引用到的函数或库同名 5.大驼峰命名法、小驼峰命名法、下划线命名法等
2.目前接触到的变量类型 2.1- Python 中数据类型可以分为 数字型 和 非数字型 - 数字型 - 整型 (int) - 浮点型(float) - 布尔型(bool) - 真 True 非 0 数 —— 非零即真 - 假 False 0 - 复数型 (complex) - 主要用于科学计算,例如:平面场问题、波动问题、电感电容等问题
- 非数字型 - 字符串 - 列表 - 元组 - 字典
2.2- 在 Python 中,所有 非数字型变量 都支持以下特点: 1. 都是一个 序列 sequence,也可以理解为 容器 2. 取值 [] 3. 遍历 for in 4. 计算长度、最大/最小值、比较、删除 5. 链接 + 和 重复 * 6. 切片
2.3取整: int() 直接截取小数部分,(返回值为整数) floor() 得到最接近原数但小于原数的整数(返回值) round()得到最接近原数的整数,(返回值值为浮点数) bool: bar = True print("%s" %bar) >>>True print("%d" %bar) >>>1
3.列表 其实在 Python 中, 一切都是指针。 按照 Python 的法则, 你无法真正删除一个数值对象, 你仅仅是不再使用它而已。
3.1列表常用操作 In [1]: name_list. name_list.append name_list.insert name_list.extend name_list.count name_list.index name_list.copy name_list.reverse name_list.sort name_list.pop name_list.remove name_list.clear
3.2序列操作符:切片 正向索引时,索引值开始于 0,结束于总长度减 1(因为我们是从 0 开始索引的) 如果开始索引或者结束索引没有被指定,则分别以字符串的第一个和最后一个索引值为默认值。 反向索引操作时,是从-1 开始,向字符串的开始方向计数,到字符串长度的负数为索引的结束
3.3创建列表 >>> [ i * 2 for i in [8, -2, 5] ] [16, -4, 10] >>> [ i for i in range(8) if i % 2 == 0 ] [0, 2, 4, 6]
# 切片产生了新的内存空间 a = [1,2,3] b = a[:] del(a[1]) print(a) print(b)
# 没有带括号就没有产生新的内存空间 a = [1,2,3] b = a del(a[1]) print(a) print(b)
3.4比较大小 1. 对两个列表的元素进行比较. 2. 如果比较的元素是同类型的,则比较其值,返回结果. 3. 如果两个元素不是同一种类型,则检查它们是否是数字. a. 如果是数字,执行必要的数字强制类型转换,然后比较. b. 如果有一方的元素是数字,则另一方的元素"大"(数字是"最小的") c. 否则,通过类型名字的字母顺序进行比较. 4. 如果有一个列表首先到达末尾,则另一个长一点的列表"大". 5. 如果我们用尽了两个列表的元素而且所有元素都是相等的,那么结果就是个平局,就是说返回一个 0.
堆栈: 堆栈是一个后进先出(LIFO)的数据结构 列表 队列是一种先进先出(FIFO)的数据类型,
4.元组 只有一个元素的元组需要在元组分割符里面加一个逗号(,),用以防止跟普通的分组操作符混淆; 元组对象本身是不可变的,但这并不意味着元组包含的可变对象也不可变
5.字典(键值对) 每个键只能对应一个项。也就是说,一键对应多个值是不允许的。(像列表、元组和其他字典这样的容器对象是可以的。) 当有键发生冲突(即,字典键重复赋值),取最后(最近)的赋值。 比较大小:(1)比较字典长度 (2)比较字典的键 (3)比较字典的值 (4) Exact Match hash():只有这个对象是可哈希的,才可作为字典的键 元组中只包括像数字和字符串这样的不可变参数,才可以作为字典中有效键 值相等的数字表示相同的键
6.类型分类 数据类型 存储模型 更新模型 访问模型 数字 Scalar 不可更改 直接访问 字符串 Scalar 不可更改 顺序访问 列表 Container 可更改 顺序访问 元组 Container 不可更改 顺序访问 字典 Container 可更改 映射访问
6.2 id变化 在不改变id的情况下,内部的值 是可变的,如字典、列表
浅拷贝 发生改变,只拷贝存储空间 a = 1 b = a 深拷贝 存储空间和值都拷贝 用模块
输入id(257)时,每次得到的值应该是不一样的,有时候得到相同的结果是因为当电脑比较忙时,如果以前使用过,会读取使用过的内存空间;
7.条件表达式 x, y = 4, 3 >>>smaller = x if x < y else y >>>smaller 3
8.1序列内建函数 sorted(),zip() 返回一个序列(列表) reversed() 和 enumerate() 返回迭代器(类似序列)
8.2列表解析: [expr for iter_var in iterable if cond_expr] x = len([word for line in f for word in line.split()]) y = sum([len(word) for line in f for word in line.split()])
8.3生成器表达式: (expr for iter_var in iterable if cond_expr) 读取文件最大行、生成器 print(max(len(x.strip()) for x in open("config-win.txt")))
8.4 lambda: 匿名函数(相当于函数的单行版本) # def a(x,y=2) return x+y a = lambda x, y=2:x+y
from random import randint as print [n for n in [randint(1,99) for i in range(9)] if n%2] 8.5 map(): 将函数调用“映射”到每个序列的元素上, 并返回一个含有所有返回值的列表。 >>map((lambda x: x+2),[0,1,2,3,4,5]) [2,3,4,5,6,7] >>>map((lambda x,y: (x+y,x-y),[1,3,5],[2,4,6]) [(3,-1),(7,-1),(11,-1)] >>>map(None,[1,3,5],[2,4,6]) [(1,2),(3,4),(5,6)]
8.6 zip() >>>zip([1,3,5],[2,4,6]) [(1,2),(3,4),(5,6)]
[size=12.0000pt]9. 异常 9.1异常语句 try: pass except exception1: pass except exception2: pass except exception as result: pass else: pass finally: pass
9.2异常名称 描述 BaseExceptiona 所有异常的基类 SystemExitb python解释器请求退出 KeyboardInterruptc 用户中断执行(通常是输入^C) Exceptiond 常规错误的基类 StopIteratione 迭代器没有更多的值 GeneratorExita 生成器(generator)发生异常来通知退出 SystemExith Python 解释器请求退出 StandardErrorg 所有的内建标准异常的基类 ArithmeticErrord 所有数值计算错误的基类 FloatingPointErrord 浮点计算错误 OverflowError 数值运算超出最大限制 ZeroDivisionError 除(或取模)零 (所有数据类型) AssertionErrord 断言语句失败 AttributeError 对象没有这个属性 EOFError 没有内建输入,到达 EOF 标记 EnvironmentErrord 操作系统错误的基类 IOError 输入/输出操作失败 OSErrord 操作系统错误 WindowsErrorh Windows 系统调用失败 ImportError 导入模块/对象失败 KeyboardInterruptf 用户中断执行(通常是输入^C) LookupErrord 无效数据查询的基类 IndexError 序列中没有没有此索引(index) KeyError 映射中没有这个键 MemoryError 内存溢出错误(对于 Python 解释器不是致命的) NameError 未声明/初始化对象 (没有属性) UnboundLocalErrorh 访问未初始化的本地变量 ReferenceErrore 弱引用(Weak reference)试图访问已经垃圾回收了的对象 RuntimeError 一般的运行时错误 NotImplementedErrord 尚未实现的方法 SyntaxError Python 语法错误 IndentationErrorg 缩进错误 TabErrorg Tab 和空格混用 SystemError 一般的解释器系统错误 TypeError 对类型无效的操作 ValueError 传入无效的参数 UnicodeErrorh Unicode 相关的错误 UnicodeDecodeErrori Unicode 解码时的错误 UnicodeEncodeErrori Unicode 编码时错误
10.模块 与其它可以导入类(class)的语言不同,在 Python 中你导入的是模块或模块属性。
10.1模块名称空间 即使属性之间有名称冲突, 但它们的完整授权名称(fully qualified name)——通过句点属性标识指定了各自的名称空间 - 防止了名称冲突的发生。
10.2模块导入 只从模块导入名字的另一个副作用是那些名字会成为局部名称空间的一部分。 这可能导致覆盖一个已经存在的具有相同名字的对象。 而且对这些变量的改变只影响它的局部拷贝而不是所导入模块的原始名称空间。也就是说, 绑定只是局部的而不是整个名称空间。 ############ # imptee.py # ############# foo = 'abc' def show(): print 'foo from imptee:', foo ############# # impter.py # ############# from imptee import foo, show show() foo = 123 print 'foo from impter:', foo show()
运行这个导入者程序, 我们发现从被导入者的观点看, 它的 foo 变量没有改变, 即使 我们在 importer.py 里修改了它。 foo from imptee: abc foo from impter: 123 foo from imptee: abc
唯一的解决办法是使用 import 和完整的标识符名称(句点属性标识)。 ############# # impter.py # ############# import imptee imptee.show() imptee.foo = 123 print 'foo from impter:', imptee.foo imptee.show() 完成相应修改后, 结果如下: foo from imptee: abc foo from impter: 123 foo from imptee: 123
|