简介
本文提供了python中几个基本主题的简短概述,适合快速回顾。
闭包:内部函数访问外部变量,实现数据隐藏。
- Python惯用法:用
in
检查字典键,用dict.get()
安全取值。 - 元组 unpack:
first, *rest, last = range(10)
。 - 参数传入:
foo(**adict)
,foo(*alist)
。 - 字符串连接:
name = "Wang" "Hone"
。 - 列表推导:
[(i,j) for i in range(3) for j in range(i)]
。 pickle
序列化:存储和读取对象。
1 闭包
闭包 closure,在Python中,当嵌套的函数在其封闭的范围内引用一个值时,我们有一个闭包。
以下几点总结了在Python中创建闭包必须满足的条件。
我们必须有一个嵌套函数(函数在函数内部)。
嵌套函数必须引用在封闭函数中定义的值。
封闭函数必须返回嵌套函数。
闭包指的是 难以读取其他函数内部遍历的函数
def print_msg(msg):
# 这是外部封闭函数
def printer():
# 这是嵌套函数
print(msg)
return printer # 这变了
another = print_msg("Hello")
现在,让我们尝试调用此函数。
another()
输出: Hello
删除print_msg,仍然可以调用 another
del print_msg
another()
输出: Hello
实现:从上面的实例可以看出, 定义在函数内的内部函数可以读取外层函数变量,从而实现闭包。
2 注意几个惯例;
1,判定dict的key是否存在,使用key in dict而不用 has_key
2,not的位置,使用key not in dict 而不用 no key in dict
3, 使用 dict.get(key[,default])如果key存在,返回,否则返回default
4, 数组字典初始化
dic = {}
for k,v in data:
group = dic.setdefault(key,[]) #如果存在,返回dic[key],不存在把dic[key]设为defalut并返回
group.append(v)
from collections import defaultdic
dic = defalutdic(list)
for (k,v) in data:
dic[key].append(v) #所有key都有一个默认值
迭代一个数组,使用for i,e in enumerate(array) 而不是 for i in range(len(array))
enumerate 还有第二个参数
3 py3元组unpack
first, second,*rest, last = range(10)
0 1 2~8 9
4 函数参数传入
def foo(x,y):
print(x,y)
adict = {'x':1, 'y':2}
foo(**adict) #字典key作为参数名传入参数值
alist=[1,2]
foo(*alist)
5 字符串处理
计算机不处理字符,它们处理数字(二进制)。即使您可能在屏幕上看到字符,在内部它也被存储和操纵为0和1的组合。
字符到数字的这种转换称为编码,而相反的过程是解码。ASCII和Unicode是一些常用的编码。
在Python中,字符串是Unicode字符序列。引入Unicode包括所有语言中的每个字符并带来统一的编码。
- 定义
下面这些都是等价的
my_string = 'Hello' print(my_string) my_string = "Hello" print(my_string) my_string = '''Hello''' print(my_string)
三引号字符串可以扩展多行
my_string = """Hello, welcome to the world of Python""" print(my_string)
连接
name = "Wang" "Hone" # WangHong
- 访问
str = '(abcdefghijklmnopqrstuvwxyz)'
print('str = ', str)
第一个字符
print('str[0] = ', str[0])最后一个字符
print('str[-1] = ', str[-1])切片第二到第五个字符
print('str[1:5] = ', str[1:5])切片从第6个到倒数第2个字符
print('str[5:-2] = ', str[5:-2])删除字符串
字符串是不可变的。这意味着字符串的元素一旦分配就无法更改。
我们可以简单地将不同的字符串重新分配给相同的名称。
可以完全删除定义的字符串,但是不能修改。内置方法
字符串内置了常用的函数format()方法就是其中之一。其他方法有lower()、upper()、join()、split()、find()、replace()等。
6 解释器是开源的
解释器和源码在python都是开源的,任何人都可以编写Python解释器来执行Python代码。
确实存在多种Python解释器,包括但不限于:
CPython:当我们从Python官方网站下载并安装好Python 2.7或者python3后,我们就直接获得了一个官方版本的解释器:CPython。这个解释器是用C语言开发的,所以叫CPython。在命令行下运行python就是启动CPython解释器。
CPython是使用最广的Python官方解释器。
IPython是基于CPython之上的一个交互式解释器,IPython只是在交互方式上有所增强,功能和CPython是完全一样的。CPython用>>>作为提示符,而IPython用In [序号]:作为提示符。
PyPy是另一个Python解释器,它的目标是执行速度。PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),所以可以显著提高Python代码的执行速度。但是如果你的代码要放到PyPy下执行,就需要了解PyPy和CPython的不同点。
Jython是运行在Java平台上的Python解释器, 把Python代码编译成Java字节码执行。
IronPython .Net的python解释器
7 嵌套列表推导式
列表理解可以包含一个表达式,后跟方括号内的for语句。
这是一个列出每项增加2的幂的示例。
pow2 = [2 ** x for x in range(10)]
输出: [1, 2, 4, 8, 16, 32, 64, 128, 256, 512]
print(pow2)
[(i,j) for i in range(3) for j in range(i)]
此代码等效于
pow2 = []
for x in range(10):
pow2.append(2 ** x)
列表推导可以选择包含更多for或if语句。可选if语句可以过滤出新列表的项目。如示例。
[2 ** x for x in range(10) if x > 5]
8 关键字
Python 3 中有 33 个关键字。该数字在一段时间内可能会略有变化。可以如下方式查看:
>>> import keyword
>>> print(keyword.kwlist)
所有关键字必须是小写的,其中 True,False 和 None 除外。
而print用法与c类似,如下为一个输出重定向。
print >>open('a.txt', 'w+'), 'hello,world'
9 反射
#检查是否某个自定的类
isinstance(obj, class)
10 Picking是Python数据结构的序列化过程
存储一个对象,稍后再取出读取
如何pickle 已存在的对象类型到文件
json = {'name':'jack', 'age':100}
json_file = open('json pkl', 'rb')
pickle.dump(json.json_file)
json_file.dump(json,json_file)
json_file.close()
取出
data=pickle.load(json_file)
print(data)
json_file.close()
pickler内建类型和外部方法
类自定义行为
__getinitargs__(self) #
__getnewargs__(self)
Slate 记住它曾经是什么,以及什么时候赋值给它 ?
__slate__
为对象类 提供限制,只能赋予固定的属性名称