python再学习笔记
python各种半桶水QAQ,一些特性经常跟其他语言搞混,官方入门文档重读温习......
最好用4个空格的缩进
空值是Python里一个特殊的值,用None表示
变量就是在程序中用来指向这些数据对象的,对变量赋值就是把数据和变量给关联起来
编码问题:
print u'中'.encode('utf-8')
另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改,比如同样是列出同学的名字:classmates = ('Michael', 'Bob', 'Tracy')
可以用一个list表示:classmates = ['Michael', 'Bob', 'Tracy']
用Python写一个dict如下:
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
要创建一个set,需要提供一个list作为输入集合: s = set([1, 2, 3])
if注意不要少写了冒号:
if age >= 6:
print 'teenager'
for x in range(100):
sum = sum + x
必须先用int()把字符串强制转换为我们想要的整型:
birth = int(raw_input('birth: '))
在Python中,定义一个函数要使用def语句,函数的返回值用return语句返回。
我们以自定义一个求绝对值的my_abs函数为例:
def my_abs(x):
if x >= 0:
return x
else:
return -x
def nop():
pass
实际上pass可以用来作为占位符,比如现在还没想好怎么写函数的代码
函数可以返回多个值吗?答案是肯定的。
return nx, ny
要注意定义可变参数和关键字参数的语法:
*args是可变参数,args接收的是一个tuple
**kw是关键字参数,kw接收的是一个dict
对应上面的问题,取前3个元素,用一行代码就可以完成切片:
>>> L[0:3]
创建一个generator:L = [x * x for x in range(10)]
对应到编程语言,就是越低级的语言,越贴近计算机,抽象程度低,执行效率高,比如C语言;越高级的语言,越贴近计算,抽象程度高,执行效率低,比如Lisp语言。函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!结论:函数本身也可以赋值给变量,即:变量可以指向函数。
Python内置的sorted()函数就可以对list进行排序: sorted([36, 5, 12, 9, 21])
正常的函数和变量名是公开的(public),可以被直接引用,比如:abc,x123,PI等;
类似__xxx__这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如上面的__author__,__name__就是特殊变量,hello模块定义的文档注释也可以用特殊变量__doc__访问,我们自己的变量一般不要用这种变量名;
类似_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc,__abc等;
Python有两个封装了setuptools的包管理工具:easy_install和pip。目前官方推荐使用pip。
eg.: pip install PIL
Python提供了__future__模块,把下一个新版本的特性导入到当前版本,于是我们就可以在当前版本中测试一些新版本的特性。
面向对象:
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print '%s: %s' % (self.name, self.score)
class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的。
__init__和__del__分别完成初始化和删除操作
任何时候,如果没有合适的类可以继承,就继承自object类。
通过多重继承,一个子类就可以同时获得多个父类的所有功能。
class TestClass(object):
val1 = 100
def __init__(self):
self.val2 = 200
def fcn(self,val = 400):
val3 = 300
self.val4 = val
self.val5 = 500
这里,val1是类变量,可以由类名直接调用,也可以有对象来调用;
val2是成员变量,可以由类的对象来调用,这里可以看出成员变量一定是以self.的形式给出的,因为self的含义就是代表实例对象;
val3不是成员变量,它只是函数fcn内部的局部变量;
val4和val5也都不是成员变量,虽是以self.给出,但并没有在构造函数中初始化。
所以高级语言通常都内置了一套try...except...finally...的错误处理机制,Python也不例外。
当我们认为某些代码可能会出错时,就可以用try来运行这段代码,如果执行出错,则后续代码不会继续执行,而是直接跳转至错误处理代码,即except语句块,执行完except后,如果有finally语句块,则执行finally语句块,至此,执行完毕。finally如果有,则一定会被执行(可以没有finally语句)。
如果要抛出错误,首先根据需要,可以定义一个错误的class,选择好继承关系,然后,用raise语句抛出一个错误的实例.
Python的os模块封装了常见的系统调用,其中就包括fork,可以在Python程序中轻松创建子进程
在Unix/Linux下,multiprocessing模块封装了fork()调用,使我们不需要关注fork()的细节。由于Windows没有fork调用,因此,multiprocessing需要“模拟”出fork的效果,父进程所有Python对象都必须通过pickle序列化再传到子进程去,所有,如果multiprocessing在Windows下调用失败了,要先考虑是不是pickle失败了。
多任务可以由多进程完成,也可以由一个进程内的多线程完成。
Python的标准库提供了两个模块:thread和threading,thread是低级模块,threading是高级模块,对thread进行了封装。绝大多数情况下,我们只需要使用threading这个高级模块。
有了准备知识,我们就可以在Python中使用正则表达式了。Python提供re模块,包含所有正则表达式的功能。
Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数。
好在Python提供了HTMLParser来非常方便地解析HTML,只需简单几行代码:
PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了。PIL功能非常强大,但API却非常简单易用。
所以,我们要创建一个基于TCP连接的Socket,可以这样做:
# 导入socket库:
import socket
# 创建一个socket:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接:
s.connect(('www.sina.com.cn', 80))
[import fibo]
这样做不会直接把 fibo 中的函数导入当前的语义表;它只是引入了模块名 fibo。
import 语句的一个变体直接从被导入的模块中导入命名到本模块的语义表中。例如:
>>> from fibo import fib, fib2
>>> fib(500)
甚至有种方式可以导入模块中的所有定义:
>>> from fibo import *
在from aaa import bbb中:
aaa是一个module
bbb是一个方法或者类搜索
bbb是在aaa下的
用if __name__ == '__main__'来判断是否是在直接运行该.py文件
1.os 和操作系统有关
2.time 与时间有关
3.pcap 抓包
4.dpkt 解包和组包
5.pymssql 进行mssql数据库操作
6.cProfile 自己debug脚本性能时用的,可以精确快速计算运行时间
7.urllib2 最早接触的库之一,跟HTTP有关
8.httplib 与HTTP有关
9.smtplib SMTP的lib
10.poplib POP3的lib
11.tarfile 解tar包
12.socket 最原始的tcp库
13.paramiko SSH SFTP
14.psyco 增强性能,对函数和类,尤其包含多次循环的非常有效
15.pywin32 运用windows的API
16.selenium 界面自动化
17.sqlite3 sqlite3数据库操作
18.email 邮件的编码解码
19.stackless 微线程,据有关人测试,可以达到普通线程的十倍性能
20.wx wxpython,写界面用的
21.py2exe 把py程序弄成exe可执行的
22.shutil 很有用,copy,删除
23.thread 普通线程