您的位置:首页 > 编程语言 > Python开发

python 笔记

2016-06-03 00:00 513 查看
摘要: filter、map、reduce、lambda、yield ,[],(),set(),dist,__str__ 和 __repr__

查看已经安装好的所有包的版本信息

pip freeze

virtualenv (python 虚拟环境)

一、安装

pip install virtualenv

其他安装方式

http://www.virtualenv.org/en/latest/index.html

二、创建虚拟环境

root@ayoway:/data/project# virtualenv test_env
New python executable in test_env/bin/python
Installing setuptools, pip...done.

(test_env)为virtualenv 环境名称

默认情况下,虚拟环境会依赖系统环境中的site packages,系统中已经安装好的第三方package也会安装在虚拟环境中,加上
-
-
no
-
site
-
packages 
则可以取消packages依赖。

# virtualenv test_env --no-site-packages

三、启动虚拟环境

root@ayoway:/data/project# ls -l test_env/
总用量 16
drwxr-xr-x 2 root root 4096  5月 31 22:09 bin
drwxr-xr-x 2 root root 4096  5月 31 21:58 include
drwxr-xr-x 3 root root 4096  5月 31 21:58 lib
drwxr-xr-x 2 root root 4096  5月 31 21:58 local

root@ayoway:cd test_env/ && source ./bin/activate
(test_env)root@ayoway:/data/project/test_env#

四、退出虚拟环境

(test_env)root@ayoway:/data/project/test_env# deactivate

五、指定python版本
可以使用-p PYTHON_EXE选项在创建虚拟环境的时候指定python版本

virtualenv -p /usr/bin/python2.7 ENV2.7

六、生成可打包环境

某些特殊需求下,可能没有网络, 我们期望直接打包一个ENV, 可以解压后直接使用,
这时候可以使用virtualenv -relocatable指令将ENV修改为可更改位置的ENV

virtualenv --relocatable

七、帮助

virtualenv -h

参考:http://docs.python-guide.org/en/latest/dev/virtualenvs/

requirements.txt

pip的freeze命令用于生成将当前项目的pip类库列表生成 requirements.txt 文件

$ pip freeze > requirements.txt

安装requirements.txt中的类库内容

$pip install -r requirements.txt

requirements.txt 文件格式:

requests==1.2.0
Flask==0.10.1

编码

Pybhon默认采用的是ascii编码,不能正常输出汉字,在源文件头做如下设置改变编码

#!/usr/bin/env python
# -*- coding: utf-8 -*-

异常捕获

1.

try:<语句> #运行别的代码
except <名字>:
<语句> #如果在try部份引发了'name'异常
except <名字>,<数据>:
<语句> #如果引发了'name'异常,获得附加的数据
else:
<语句> #如果没有异常发生

2. try-finally 语句

try-finally 语句无论是否发生异常都将执行最后的代码

try:
<语句>
finally:
<语句> #退出try时总会执行
raise

__str__ 和 __repr__

当需要显示一个对象在屏幕上时,将这个对象的属性或者是方法整理成一个可以打印输出的格式

str是显示给用户用的

repr是给机器用的

class A(object):

def __str__(self):

print "this is A class"

def __repr__(self):

print "this is repr func"

a = A()

print a 调用的是a的__str__方法

python解释器里直接敲a后回车,调用的是a.__repr__()方法

列表(list)

列表是序列对象,可包含任意的Python数据信息,如字符串、数字、列表、元组等。列表的数据是可变的,我们可通过对象方法对列表中的数据进行增加、修改、删除等操作。
可以通过list(seq)函数把一个序列类型转换成一个列表。
append(x) 在列表尾部追加单个对象x。使用多个参数会引起异常。
count(x) 返回对象x在列表中出现的次数。
extend(L) 将列表L中的表项添加到列表中。返回None。
Index(x) 返回列表中匹配对象x的第一个列表项的索引。无匹配元素时产生异常。
insert(i,x) 在索引为i的元素前插入对象x。如list.insert(0,x)在第一项前插入对象。返回None。
pop(x) 删除列表中索引为x的表项,并返回该表项的值。若未指定索引,pop返回列表最后一项。
remove(x) 删除列表中匹配对象x的第一个元素。匹配元素时产生异常。返回None。
reverse() 颠倒列表元素的顺序。
sort() 对列表排序,返回none。bisect模块可用于排序列表项的添加和删除。

元组(tuple)

tuple=(1,),这是单个元素的元组表示,需加额外的逗号。
tuple=1,2,3,4,这也可以是一个元组,在不使用圆括号而不会导致混淆时,Python允许不使用圆括号的元组。
和列表一样,可对元组进行索引、分片、连接和重复。也可用len()求元组长度。
元组的索引用tuple[i]的形式,而不是tuple(i)。
和列表类似,使用tuple(seq)可把其它序列类型转换成元组。

集合(set)

集合是一个数学概念,用set()创建
set.add(),set.update.set.remove,添加更新删除,-= 可以做set减法
set.discard 和 set.remove不同在于如果删除的元素不在集合内,discard不报错,remove 报错
< <= 表示 子集,> >=表示超集
| 表示联合 & 表示交集 - 表示差集 ^ 差分集里啊

字典(dict)

dict 用 {} 包围
dict.keys(),dict.values(),dict.items()
hash(obj)返回obj的哈希值,如果返回表示可以作为dict的key
del 或 dict.pop可以删除一个item,clear清除所有的内容
sorted(dict)可以吧dict排序
dict.get()可以查找没存在的key,dict.[]不可以
dict.setdefault() 检查字典中是否含有某键。 如果字典中这个键存在,你可以取到它的值。 如果所找的键在字典中不存在,你可以给这个键赋默认值并返回此值。
{}.fromkeys()创建一个dict,例如: {}.fromkeys(('love', 'honor'), True) =>{'love': True, 'honor': True}
不允许一个键对应多个值
键值必须是哈希的,用hash()测试
一个对象,如果实现_hash()_方法可以作为键值使用

filter、map、reduce、lambda、yield

filter(function, sequence):对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String/Tuple(取决于sequence的类型)返回:

>>> def f(x): return x % 2 != 0 and x % 3 != 0
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]
>>> def f(x): return x != 'a'
>>> filter(f, "abcdef")
'bcdef'

map(function, sequence) :对sequence中的item依次执行function(item),见执行结果组成一个List返回:

>>> def cube(x): return x*x*x
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
>>> def cube(x) : return x + x
...
>>> map(cube , "abcde")
['aa', 'bb', 'cc', 'dd', 'ee']


另外map也支持多个sequence,这就要求function也支持相应数量的参数输入:

>>> def add(x, y): return x+y
>>> map(add, range(8), range(8))
[0, 2, 4, 6, 8, 10, 12, 14]

reduce(function, sequence, starting_value):对sequence中的item顺序迭代调用function,如果有starting_value,还可以作为初始值调用,例如可以用来对List求和:

>>> def add(x,y): return x + y
>>> reduce(add, range(1, 11))
55 (注:1+2+3+4+5+6+7+8+9+10)
>>> reduce(add, range(1, 11), 20)
75 (注:1+2+3+4+5+6+7+8+9+10+20)

lambda:在js框架中通常会被叫做(匿名函数),它允许你快速定义单行的最小函数,类似与C语言中的宏,这些叫做lambda的函数,是从LISP借用来的,可以用在任何需要函数的地方:

>>> g = lambda x: x * 2
>>> g(3)
6
>>> (lambda x: x * 2)(3)
6

我们也可以把filter map reduce 和lambda结合起来用,函数就可以简单的写成一行。
例如

kmpathes = filter(lambda kmpath: kmpath,
map(lambda kmpath: string.strip(kmpath),
string.split(l, ':')))


看起来麻烦,其实就像用语言来描述问题一样,非常优雅。
对 l 中的所有元素以':'做分割,得出一个列表。对这个列表的每一个元素做字符串strip,形成一个列表。对这个列表的每一个元素做直接返回操作(这个地方可以加上过滤条件限制),最终获得一个字符串被':'分割的列表,列表中的每一个字符串都做了strip,并可以对特殊字符串过滤。

[转] http://hi.baidu.com/black/item/307001d18715fc322a35c747
yield

Yield
的用法和关键字
return
差不多,下面的函数将会返回一个生成器:

>>> def createGenerator():
...    mylist = range(3)
...    for i in mylist:
...        yield i*i
...
>>> mygenerator = createGenerator() # 创建生成器
>>> print(mygenerator) # mygenerator is an object!
<generator object createGenerator at 0xb7555c34>
>>> for i in mygenerator:
...     print(i)
0
1
4

当你调用函数的时候,函数里的代码并没有运行.函数仅仅返回生成器对象

每当
for
语句迭代生成器的时候你的代码才会运转,当
for
语句第一次调用函数里返回的生成器对象,函数里的代码就开始运作,直到碰到
yield
,然后会返回本次循环的第一个返回值.所以下一次调用也将运行一次循环然后返回下一个值,直到没有值可以返回
https://taizilongxu.gitbooks.io/stackoverflow-about-python/content/1/README.html
返回一个函数对象例子:
lambda表达式
func = lambda x,y:x+y
func相当于下面这个函数
def func(x,y):
return x+y
注意def是语句,lambda是表达式
下面这种情况下就只能用lambda而不能用def
[(lambda x:x*x)(x) for x in range(1,11)]
map,reduce,filter中的function都可以用lambda表达式来生成!
map(function,sequence)把sequence中的值当参数逐个传给function,返回一个包含函数执行结果的list。
如果function有两个参数,即map(function,sequence1,sequence2)。
例:求1*1,2*2,3*3,4*4
map(lambda x:x*x,range(1,5))
返回值是[1,4,9,16]
reduce(function,sequence)
function接收的参数个数只能为2
先把sequence中第一个值和第二个值当参数传给function,再把function的返回值和第三个值当参数传给function,然后只返回一个结果。
例:求1到10的累加
reduce(lambda x,y:x+y,range(1,11))
返回值是55。
filter(function,sequence)
function的返回值只能是True或False把sequence中的值逐个当参数传给function,如果function(x)的返回值是True,就把x加到filter的返回值里面。
一般来说filter的返回值是list,特殊情况如sequence是string或tuple,则返回值按照sequence的类型。
例子:找出1到10之间的奇数
filter(lambda x:x%2!=0,range(1,11))
返回值[1,3,5,7,9]
如果sequence是一个string
filter(lambda x:len(x)!=0,'hello')
返回'hello'
filter(lambda x:len(x)==0,'hello')
返回''

Python print格式化输出。

1. 打印字符串

print ("His name is %s"%("Aviad"))

2.打印整数

print ("He is %d years old"%(25))

3.打印浮点数

print ("His height is %f m"%(1.83))

4.打印浮点数(指定保留小数点位数)

print ("His height is %.2f m"%(1.83))

5.指定占位符宽度

print ("Name:%10s Age:%8d Height:%8.2f"%("Aviad",25,1.83))

6.指定占位符宽度(左对齐)

print ("Name:%-10s Age:%-8d Height:%-8.2f"%("Aviad",25,1.83))

7.指定占位符(只能用0当占位符?)

print ("Name:%-10s Age:%08d Height:%08.2f"%("Aviad",25,1.83))

8.科学计数法

format(0.0015,'.2e')

9.打印对象

print ("this is test2: %r" %test)

格式化字符%r,表示打印的是对象,什么都打印

%r打印时能够重现它所代表的对象(rper()

%r,%s 的区别 http://blog.csdn.net/wusuopubupt/article/details/23678291
项目骨架

...

自动化测试

nose – http://pypi.python.org/pypi/nose/
正则

re.match()
re.search()
>>>match = re.search(r'dog', 'dog cat dog')
>>>match.start()
>>>match.end()
>>>match.group(1)

re.findall()

...

模块

sys模块:

sys模块是提供关于python本身的详细内在的信息的模块。

sys.executable变量,它包含python解释器的路径

sys.platform变量,告诉我们现在处于什么操作系统上

sys.argv argv变量是一个包含命令行参数的列表。第一项argv[0]是所运行脚本的路径,argv[1]是文件名的第一个参数,被存储在__filename__里面。

sys.path变量是模块搜索路径,最前面的空字符串’’是指当前目录。

sys.modules它将当前已装入的所有模块的名称映射到模块对象。

os模块:

os模块提供的API接口函数,可以对操作系统上面的进程和文件系统(文件和目录)进行操作。

1、 改变进程id,os.geteuid()、os.getegid()、os.getuid()、os.getlogin()、os.getgid()、os.getgroups()

os.setegid()、os.seteuid()

2、 访问操作系统中的系统环境

os.environ()、os.getenv()可以访问在环境中设置的变量字符串。

os.environ.get()得到某环境变量的值。

os.system()执行系统命令。

del.os.system()删除环境变量。

3、 工作目录处理

os.getcwd()得到当前是的工作目录。

os.curdir()指向当前目录。

os.pardir()指向当前工作目录的父目录。

os.chdir()改变当前的工作目录。

os.listdir(os.curdir())列出当前目录中的所有目录。

4、 管道

管道中经常使用的函数popen(),它创建一个新的进程用于运行给定的命令并且根据模式选项附加给这个进程一个单一的输入输出数据流。

读模式:

pipe_stdout = os.popen(‘’, ‘r’)

stdout_value = pipe_stdout.read()

pipe_stdout.close()

写模式:

pipe_stdout = os.popen(‘’, ‘w’)

stdout_value = pipe_stdout.write(‘’)

pipe._stdout.close()

popen2()函数返回一个与子进程标准输入绑定的只写流和一个与子进程标准输出绑定的只读流。

pipe_stdin, pipe_stdout = os.popen2(‘cat -’)

os.popen3()

os.popen4()

5、 文件系统权限

os.access测试一个进程对一个文件是否有可访问权限。

包含在stat模块中

os.stat()查看文件的一些状态信息,如:大小、权限、Owner、Device和最后修改时间等。

stat_info = os.stat(filename)

stat_info.st_size 大小

oct(stat_info.st_mode) 权限

stat_info.st_uid

stat_info.st_dev

time_ctime(stat_info.st_mtime)

os.chmod()改变文件权限

os.makedirs()创建目录

os.rmdir()删除目录

os.makedirs()和os.removedirs()可以操作当前路径下面的所有目录,makedirs()可以创建路

径不存的目录,removedirs()中以删除包含父目录的子目录。

6、 符号链接

包含在模块tempfile

tempfile.mktemp()创建连接名

os.symlink(__filename__, link_name)

os.lstat(link_name)检查链接文件的权限

os.readlink(link_name)查看链接指向的地方

os.unlink(link_name)删除链接

7、 访问目录树

os.walk()可以递归遍历一个目录,对于每一个目录,可以产生一个包含目录路径、当前路径的子目录树列表,以及在子目录中的文件。

8、 运行外部命令

os.system(‘’)

os.fork()创建一个新进程作为当前进程的一个复本。

signal模块对信号的处理。

os.kill()可以发送信息给子进程。

os.wait()等待一个子进程。

os.waitpid()等待一个特定的进程。

os.Spawn() os.spawnv(mode, path, args) 在新进程中执行程序, 以命令行参数的形式传递args中指定的参数

未完待续...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: