最近写微信小程序, 写的头疼. 突然就想温习下python.
1. 数字: 一个整数或者小数
1 | age = 22 |
2. 字符串
1 | name = "dottie" |
3. 列表:方括号括起来的一组数据
1 | l = ["你好", 22, '大钟'] |
4. 元祖: 用圆括号括起来的一组数据
1 | t = (404, "页面未找到", "hh") |
5: 字典:用花括号括起来
1 | d = {"name": "dottie", "age": 22} |
6: 对象
1 | class Person(object): |
7: 命名规范
1 | PI = 3.14 |
8: 注释: 文档字符串doc
一般提供给外部使用时, 要标注功能 参数等信息.
1 | class Person(object): |
9: print格式化输出
1 | print('%s %d' % (nick_name, age)) |
1 |
|
10: 小数对象Decimal, 因为小数之间运算是不精确的(小数+整数是精确的).
1 | > from decimal import Decimal |
1 | aaa = 1.1 |
11. enumerate可以得到序列(字符串, 列表, 元组)的索引.
1 | > 调用内置函数enumerate()函数, 该函数参数必须是一个序列. 可以返回一个迭代器 Iterable |
1 | l = ["南财", 'daejong', 22] |
12: 内置 max, sort等函数 配合lambda表达式使用 接收的参数也是一个序列
1 | a = {"id": 1101, "price": 1000} |
13. 列表推导表达式(返回值是列表), 字典推导表达式(返回值是一个字典)
[表达式 操作 筛选] {表达式 操作 筛选}
1 | values = ["aa", 'bb', 'cc'] |
14: 迭代器(用的不多), 直接使用for while循坏即可迭代
iter(序列) 返回一个迭代器
next(迭代器) 返回具体的值
1 | l = ["aa", 22, 'cc'] |
15: 生成器(用户很多): 是一个(里面使用 yield 关键字) 函数
1 | > yield 让一个函数执行过程中停止下来, 下次执行时, 继续从上次停下来的位置执行. |
1 | l = [2 * x for x in range(3)] |
16: 函数的定义和调用 函数的高级使用
1 | def say_hello(name): |
17: 函数参数
- 必要参数
- 关键字参数
- 默认参数
- 不定长参数
- lambda表达式, 匿名函数
1 | # 1. 必要参数 |
18: 变量作用域
- Local 局部作用域
定义地方: 函数内部, 或者函数的参数- Enclosing 闭包函数外的函数中
- Global 全局作用域,
定义地方: 函数外部Build-in 内建作用域
如 math.pi pi就是内建变量查找过程: E->L->G->B
*还有局部不可修改全局, 但是>>**
如果非要修改: 要在局部 用关键字 global global_var 来修饰下 才可以修改*还有闭包中不可以修改自由变量, 但是>>**
如果非要修改: 要在闭包中 用关键字 nonlocal local_var 来修饰下 才可修改
1 | # 闭包 |
19: **注意: 跟其他语言完全不同.**
除了 def class lambda定义的代码块, python代码代码块不会引入新的作用域.
1 | def hello(): |
20: 闭包(函数式编程中重要概念) **重在理解概念
1 | > 在一个函数内部, 对外部作用域(但不是全局作用域)的变量进行引用, 那么内部函数就成为闭包(closure) |
1 | def line_conf(): |
21: python的模块和包 from fractions import Fraction
- 模块的概念
就是一个.py结尾的文件, 这里面有一些类和函数的声明, 不同模块之间可以使用 import 导入需要的模块
方便我们组织代码.- 模块的命名空间,
- 通过模块的名字来区分
如果命令行中要使用其他模块. 需要将模块的路径加到 sys.path(是一个列表)中,
import sys
使用sys.path.append(r’/usr/local/hello.py’) 这里的r是表示后面原生字符串, 不要转换.
也可以使用sys.modules 查看系统帮助我们已经导入的模块(这也是我们一开始不用导入模块就可以写代码的原因)- 导入方式
- import mod.py # 导入mod整个模块
- from mod import Avg, HelloClass # 导入mod模块中Avg函数和HelloClass类
- from mod import Sum as m # 导入mod模块中Sum函数或者类 并且命名为m
当导入模块时, 模块会被执行, 模块可以被导入多次, 但是只会执行一次.
包就是一个文件夹, 包里面有一个init.py 导入该包时, 该模块会被执行.
包里面放的就是模块
如: com 中有—util.py 里面有一个format_time()函,,有init.py有online.py
如果我们要在其他模块使用format_time函数
import sys
sys.path.append(r’/usr/local/xxxx/xxxx/com的上一级’)
- import com.util
com.util.format_time()- from com import util
util.format_time()- from com.util import format_time
format_time()- from com.util import * # 导入com包下面所有的模块
format_time()
1 |
22: 异常捕获和处理 以及 常见异常 Exception
try:
pass
except StopIteration as e:
pass
except ValueError as e:
pass
finally:
pass
- 主动抛出异常 raise ValueError
- 设置断言 assert(100==101) # 抛出AssertionError异常, 一般用于调试程序
- 自定义异常
1 |
|
1. python面向对象
- 构造方法 def init(self): 不支持构造函数的重载, 只能有一个构造函数.
- class中的所有方法第一个参数必须是self,
- self指的就是当前对象, self也可以用this代替
- 类没有静态变量, 但是可以有静态方法@staticmethod标注在方法上面
可以通过类的实例化后的对象调用, 也可以直接通过类名调用,
静态方法中不可以访问外部的变量- 类属性: 定义在类中方法外的. 可以通过类名或者实例对象来访问
- 类的实例属性: 在init方法中初始化的属性, 必须实例对象才可以访问.
1 | class Person(object): |
1. python内存管理: 自动完成, 通过垃圾回收器管理内存, 原理是引用计数.
- 析构方法 def del(): 当对象从内存释放时, 调用该方法
- 继承方法和属性, 也可以多重继承 class Worker(Father, SuperFather)
super()即为得到父类对象. 可以通过这个调用父类的方法和属性.- 方法覆盖, 子类中使用和父类同名的方法, 即为覆盖父类的方法
- 抽象类和接口
- 类和类实例的内建函数
issubclass(Worker, Father)
isinstance(a_worker, Worker)
hasattr(p, ‘name’)
getattr(p, ‘name’)
setattr(p, ‘name’, ‘daejong’)
dir(a_worker) 查看对象所有信息
super() 引用父类
vars(a_worker) {‘name’: ‘worker’, ‘age’: 22}
1 | class Phone(object): |
import pickle(C语言写的, 慢)
推荐用cPickle
对象的序列化和反序列化
- 序列化: 将对象持久保存成文件格式 (dump)
- 反序列化: 将文件转换成对象 load
- 访问控制: python没有真正的访问控制, 只是通过变量名来约定
命名_foo 表示protected
命名__foo 表示private
这只是一种约定而已.