内置函数

文件操作
操作文件时,一般需要经历如下步骤:
一、打开文件
1
|
文件句柄 = file ( '文件路径' , '模式' )
|
注:python中打开文件有两种方式,即:open(...) 和 file(...) ,本质上前者在内部会调用后者来进行文件操作,推荐使用 open。
打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。
打开文件的模式有:
"+" 表示可以同时读写某个文件
-
r+,可读写文件。【可读;可写;可追加】
-
w+,无意义
-
a+,同a
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
二、操作操作
class
file
(
object
):
def
close(
self
):
关闭文件
def
fileno(
self
):
文件描述符
return
0
def
flush(
self
):
刷新文件内部缓冲区
pass
def
isatty(
self
):
判断文件是否是同意tty设备
return
False
def
next
(
self
):
获取下一行数据,不存在,则报错
pass
def
read(
self
, size
=
None
):
读取指定字节数据
pass
def
readinto(
self
):
读取到缓冲区,不要用,将被遗弃
pass
def
readline(
self
, size
=
None
):
仅读取一行数据
pass
def
readlines(
self
, size
=
None
):
读取所有数据,并根据换行保存值列表
return
[]
def
seek(
self
, offset, whence
=
None
):
指定文件中指针位置
pass
def
tell(
self
):
获取当前指针位置
pass
def
truncate(
self
, size
=
None
):
截断数据,仅保留指定之前数据
pass
def
write(
self
, p_str):
写内容
pass
def
writelines(
self
, sequence_of_strings):
将一个字符串列表写入文件
pass
def
xreadlines(
self
):
可用于逐行读取文件,非全部
pass
三、with
为了避免打开文件后忘记关闭,可以通过管理上下文,即:
1
2
3
|
with open ( 'log' , 'r' ) as f:
...
|
如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。
在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:
1
2
|
with open ( 'log1' ) as obj1, open ( 'log2' ) as obj2:
pass
|
四、那么问题来了...
1、如何在线上环境优雅的修改配置文件?
原配置文件
需求
2、文件处理中xreadlines的内部是如何实现的呢?
自定义函数
一、背景
在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复制到现需功能处,如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
while True :
if cpu利用率 > 90 % :
连接邮箱服务器
发送邮件
关闭连接
if 硬盘使用空间 > 90 % :
连接邮箱服务器
发送邮件
关闭连接
if 内存占用 > 80 % :
连接邮箱服务器
发送邮件
关闭连接
|
腚眼一看上述代码,if条件语句下的内容可以被提取出来公用,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
def 发送邮件(内容)
连接邮箱服务器
发送邮件
关闭连接
while True :
if cpu利用率 > 90 % :
发送邮件( 'CPU报警' )
if 硬盘使用空间 > 90 % :
发送邮件( '硬盘报警' )
if 内存占用 > 80 % :
|
对于上述的两种实现方式,第二次必然比第一次的重用性和可读性要好,其实这就是函数式编程和面向过程编程的区别:
函数式编程最重要的是增强代码的重用性和可读性
二、 函数的定义和使用
1
2
3
4
5
|
def 函数名(参数):
...
函数体
...
|
函数的定义主要有如下要点:
-
def:表示函数的关键字
-
函数名:函数的名称,日后根据函数名调用函数
-
函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等...
-
参数:为函数体提供数据
-
返回值:当函数执行完毕后,可以给调用者返回数据。
以上要点中,比较重要有参数和返回值:
1、返回值
函数是一个功能块,该功能到底执行成功与否,需要通过返回值来告知调用者。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
def 发送短信():
发送短信的代码...
if 发送成功:
return True
else :
return False
while True :
result = 发送短信()
if result = = False :
记录日志,短信发送失败...
|
2、参数
为什么要有参数?
上例,无参数实现
上列,有参数实现
函数的有三中不同的参数:
普通参数
默认参数
动态参数一
动态参数二
动态参数三
扩展:发送邮件实例
+ View Code
模块导入
Python只所有应用越来越广泛,在一定程度上也依赖于其为程序员提供了大量的模块以供使用,如果想要使用模块,则需要导入。导入模块有一下几种方法:
1
2
3
4
|
import module
from module.xx.xx import xx
from module.xx.xx import xx as rename
from module.xx.xx import *
|
那么问题来了,导入模块时是根据那个路径作为基准来进行的呢?即:sys.path
1
2
3
4
5
|
import sys
print sys.path
结果:
[ '/Users/wupeiqi/PycharmProjects/calculator/p1/pp1' , '/usr/local/lib/python2.7/site-packages/setuptools-15.2-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/distribute-0.6.28-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.10-x86_64.egg' , '/usr/local/lib/python2.7/site-packages/xlutils-1.7.1-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/xlwt-1.0.0-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/xlrd-0.9.3-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/tornado-4.1-py2.7-macosx-10.10-x86_64.egg' , '/usr/local/lib/python2.7/site-packages/backports.ssl_match_hostname-3.4.0.2-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/certifi-2015.4.28-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/pyOpenSSL-0.15.1-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/six-1.9.0-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/cryptography-0.9.1-py2.7-macosx-10.10-x86_64.egg' , '/usr/local/lib/python2.7/site-packages/cffi-1.1.1-py2.7-macosx-10.10-x86_64.egg' , '/usr/local/lib/python2.7/site-packages/ipaddress-1.0.7-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/enum34-1.0.4-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/pyasn1-0.1.7-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/idna-2.0-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/pycparser-2.13-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/Django-1.7.8-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/paramiko-1.10.1-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/gevent-1.0.2-py2.7-macosx-10.10-x86_64.egg' , '/usr/local/lib/python2.7/site-packages/greenlet-0.4.7-py2.7-macosx-10.10-x86_64.egg' , '/Users/wupeiqi/PycharmProjects/calculator' , '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python27.zip' , '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7' , '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin' , '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac' , '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages' , '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk' , '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old' , '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload' , '/usr/local/lib/python2.7/site-packages' , '/Library/Python/2.7/site-packages' ]
|
如果sys.path路径列表没有你想要的路径,可以通过 sys.path.append('路径') 添加。
yield生成器
1、对比range 和 xrange 的区别
1
2
3
4
|
>>> print range ( 10 )
[ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]
>>> print xrange ( 10 )
xrange ( 10 )
|
如上代码所示,range会在内存中创建所有指定的数字,而xrange不会立即创建,只有在迭代循环时,才去创建每个数组。
自定义生成器nrange
2、文件操作的 read 和 xreadlinex 的的区别
1
2
|
read会读取所有内容到内存
xreadlines则只有在循环迭代时才获取
|
基于next自定义生成器NReadlines
基于seek和tell自定义生成器NReadlines
装饰器
装饰器是函数,只不过该函数可以具有特殊的含义,装饰器用来装饰函数或类,使用装饰器可以在函数执行前和执行后添加相应操作。
1
2
3
4
5
6
7
8
9
10
|
def wrapper(func):
def result():
print 'before'
func()
print 'after'
return result
@wrapper
def foo():
print 'foo'
|
View Code
递归
利用函数编写如下数列:
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368
demo
本文转自 msj0905 51CTO博客,原文链接:http://blog.51cto.com/sky66/1712451