教程:廖雪峰Python教程
Python基础
- Python是解释型语言。编译和解释的区别?
- 编译型语言在编译过程中生成目标平台的指令,解释型语言在运行过程中才生成目标平台的指令。
- 虚拟机的任务是在运行过程中将中间代码翻译成目标平台的指令。
- 输入/输出(Input/Output,IO)
print('hello,world’)
input()
- 字符串
- 用
r''
表示''
内部的字符串默认不转义 - 用
'''...'''
的格式表示多行内容
- 用
- 布尔值
True / False
and
、or
、not
- 特殊的空值
None
- 除法运算
/
除法计算结果是浮点数,即使是两个整数恰好整除,结果也是浮点数//
地板除,两个整数的除法仍然是整数
- 字符编码
- ASCII,1个字节
- Unicode,2~4个字节
- UTF-8,可变长编码,1~6字节(此处有疑问,到底几个字节?)
- 计算机内存使用Unicode编码,硬盘或传输时,转换为UTF-8编码? 参考:
- 单字符转换:
- ord(‘A’),’A’ => 65,one-charater => unicode code point.
- chr(65), 65 => ‘A’,to a charater
- 字符串转换为指定编码格式
- encode,str => bytes
- decode,bytes => str
- len(),str字符数 / bytes 字节数
- 关于注释
#!/usr/bin/env python3
,Linux/OS X系统中表明是python程序,例如直接通过./xxx.py
来运行就需要这一行注释# -*- coding: utf-8 -*-
,告诉Python解释器,按照UTF-8编码读取源代码
- 格式化输出
- 与C类似,用
%
实现,- %d 整数
- %f 浮点数
- %s 字符串
- %x 16进制
- 与C类似,用
- list和tuple
- list 列表,有序集合,跟数组类似
- tuple 元组,不可更改的list,初始化后更安全
- dict和set
- dict 字典,无序键值对,查找快但需要更多空间,类似map
- set
函数
from fileA import funcB
, 从文件fileA导入函数funcBpass
, 占位符- 参数
- 默认参数会导致的问题, 不是很懂?
*parma
可变参数, 接收tuple**parma
关键字参数, 接受dict
- 递归
- 逻辑清晰,但存在栈溢出
- 对尾递归优化的语言,可以通过尾递归防止栈溢出
- 汉诺塔
#!/usr/bin/env python3 # -*- coding: utf-8 -*- def move(n, a, b, c): if n == 1: print(a + '=>' + c) else: move(n - 1, a, c, b) move(1, a, b, c) move(n - 1, b, a, c) move(3, 'A', 'B', 'C')
高级特性
- list切片
L=list() L:[i:j]
- 迭代
for ... in for value in d.values() or k, v in d.items() #判断是否可迭代 from collections import Iterable isinstance('abc', Iterable) # str是否可迭代
- 列表生成式
- 生成list
list(range(1, 11))
=>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[x * x for x in range(1, 11)]
=>[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
- 生成list
- 生成器generator, 一边循环一边计算, 相对于list更节省空间
g = (x * x for x in range(10)) next(g)
函数式编程
我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。 由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。 函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
- 高阶函数,把函数作为参数传入
- map接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
def f(x): return x * x r = map(f, [1,2,3]) print(list(r)) # [1,4,9]
- reduce把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算
- filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素
- map接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
- 匿名函数
lambda x: x * x
等同于def f(x) return x * x
- 装饰器,python的@语法可以把decorator置于函数的定义处
def log(func): def wrapper(*args, **kw): print('call %s():' % func.__name__) return func(*args, **kw) return wrapper @log def now(): print('2015-3-25')
- 偏函数,固定函数的某些参数
模块
- python 内置函数列表:https://docs.python.org/3/library/functions.html
- 为避免模块名冲突,引入包,包目录下需定义
__init__.py
文件 - 安装模块
pip3 install xxx
, 模块搜索路径sys.path
面向对象编程(Object Oriented Programming,OOP),
一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
- 类和实例
#!/usr/bin/env python3 # -*- coding: utf-8 -*- class Student(object): def __init__(self, name, score): self.name = name self.score = score def print_score(self): print(self.name, self.score) bar = Student("hello", 2) bar.print_score()
- 继承和多态
- 子类继承父类(基类、超类)
- 什么是多态?
- 获取对象信息
- type() 判断对象类型
- isinstance() 判断class类型
- dir() 获取对象的所有属性和方法
- getattr()、setattr()、hasattr(),属性操作
- 鸭子类型?
面向对象高级编程
封装、继承、多态。
- slots (slots翻译,限制)限制class能添加的属性,对当前类实例起作用、对继承的子类不起作用,除非在继承的子类中也定义__slots__
- @property,装饰器,把一个方法变为属性调用
- 多重继承。MixIn可以给一个类增加多个功能
- 定制类?str、repr、iter、getitem。。。
- 使用枚举类。
- @unique装饰器可以帮助我们检查保证没有重复值。
- 元类:
动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的。
- type()函数既可以返回对象类型,又可以创建出新的类型。
IO编程
把变量从内存中变成可存储或传输的过程称之为序列化
进程和线程
任务 => 进程(Process) 子任务 => 线程(Thread)
多任务实现方式
- 多进程
- 多线程
- 多进程 + 多线程
Python既支持多进程,又支持多线程
- 进程
- Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。
- 子进程永远返回0,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()就可以拿到父进程的ID。
- 线程
- 多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改,因此,线程之间共享数据最大的危险在于多个线程同时改一个变量,把内容给改乱了。