1. 只有在形参表末尾的那些参数可以有默认参数值
例如, def func(a, b=1) 是有效的, 但是 def func(a=1, b) 是无效的
2. 默认参数的值是不可变的对象, 比如 NoneTrueFalse 数字或字符串
例如; def print_info( a , b = [] ): 就是错误的
3. 回调函数
定义:
一般情况下, 应用程序会时常通过 API 调用库里所预先备好的函数但是有些库函数却要求应用先传给它一个函数,
好在合适的时候调用, 以完成目标任务这个被传入的后又被调用的函数就称为回调函数
打个比方:
有一家旅馆提供叫醒服务, 但是要求旅客自己决定叫醒的方法可以是打客房电话, 也可以是派服务员去敲门,
睡得死怕耽误事的, 还可以要求往自己头上浇盆水
叫醒这个行为是旅馆提供的, 相当于库函数,
叫醒的方式是由旅客决定并告诉旅馆的, 也就是回调函数;
而旅客告诉旅馆怎么叫醒自己的动作, 也就是把回调函数传入库函数的动作, 称为登记回调函数
实例:
http://blog.csdn.net/tchenjx/article/details/51661173
4. 所有的变量都可以理解是内存中一个对象的引用
可变对象一旦创建之后还可改变但是地址不会发生改变, 即该变量指向的还是原来的对象, 不可变对象相反
strings, tuples, 和 numbers 是不可更改的对象, 而 list, dict, set 等则是可以修改的对象
值传递: 将参数 a 的值作为参数传递进去, 程序运行完 a 的值不改变
引用传递: 将参数 a 的地址传递进去, 程序运行完 a 的值随之改变
python 不允许程序员选择传值还是传引用,
如果函数接受的是一个不可变对象, 则为值传递;
如果函数接受的是一个可变对象, 则为引用传递
匿名函数
- lambda x,y: x+y
- filter(lambda x:x>3,[1,2,3,4,5])
反转字符串 text="abcdef"
1)text[::-1]
2)转换成 list, 用其 reverse 函数
[:end:]和 range(,end,) 都是输出到 end-1, 比如:
- text="abcdef"
- print text[:5] #abcde
博客:
https://changchen.me/about/
http://ssdxiao.github.io/ 虚拟化
- a = [1,2,3]
- b = [4,5,6]
- zipped = zip(a,b) # 打包为元组的列表[(1, 4), (2, 5), (3, 6)]
- zip(*zipped) # 与 zip 相反, 可理解为解压, 返回二维矩阵式[(1, 2, 3), (4, 5, 6)]
函数调用问题(下面代码会输出什么)
https://www.cnblogs.com/zhangqigao/p/6397853.html 问题 6
第 3 次是建立在第 1 次函数调用的基础上, l = [0,1]
5. 实例方法 / 类方法 / 静态方法
- 6. yield
- iterables -> generators -> yield
列表推导式: mylist = [x*x for x in range(3)]
生成器也是迭代器的一种, 但是你只能迭代它们一次.
原因很简单, 因为它们不是全部存在内存里, 它们只在要调用的时候在内存里生成
mygenerator = (x*x for x in range(3))
生成器和迭代器的区别就是用 () 代替[], 还有你不能用 for i in mygenerator 第二次调用生成器
Yield 的用法和关键字 return 差不多, 会返回一个生成器
Yield 你必须先理解当你调用函数的时候, 函数里的代码并没有运行. 函数仅仅返回生成器对象
每当 for 语句迭代生成器的时候你的代码才会运转
7. 当函数的参数不确定时, 可以使用 * args 和 **kwargs,*args 没有 key 值,**kwargs 有 key 值
http://blog.csdn.net/chenjinyu_tang/article/details/8136841
8. 爬虫
1. urllib2 库 xpath
获取标签内的 text
info = bloger[0].xpath(string(.)).encode(utf-8).strip()
文件转化为 html 格式进行分析
- from lxml import etree
- record = open("test.html",r)
- tree = etree.HTML(record.read())
- desc = tree.xpath("//dt[text()=Bugzilla:]")[0].getnext().xpath(string(.))
- pattern = re.compile("CVE-\d+-\d+ .*:")
- print re.findall(r"(.*):", pattern.findall(desc)[0])[0]
- 2. excel
- import xlwt
- workbook = xlwt.Workbook()
- sheet = workbook.add_sheet(sheet,cell_overwrite_ok=True)
- sheet.write(0, 0, EnglishName) #(行, 列, 写入内容)
- workbook.save(test.xls)
3. 正则
- record = open(suse_path+cve,"r").read() # 文本内容转化为 string
- pattern = re.compile("h4\>\n.*\n\<hr\>")
- print pattern.findall(record)[0]
9. 新式类是广度优先, 旧式类是深度优先
10. 浅拷贝和深拷贝
直接赋值: 传递对象的引用而已, 原始列表改变, 被赋值的 b 也会做相同的改变
浅拷贝: 子对象没有拷贝, 所以原始数据改变, 子对象会改变
深拷贝: 全部拷贝, 原始数据怎么变也不会导致拷贝后的元素改变
11. 使用 for 从序列中得到的每一个对象, 事实上都是从原序列中复制了一份
因此对此对象进行处理时, 只是处理了复制体, 并没有影响到原序列
来源: http://www.bubuko.com/infodetail-2510403.html