python基础总结

Python 基础教程
本文详细介绍了 Python 的基本概念,包括对汉字的支持、标识符规范、保留关键字、数据类型及其转换、运算符、内置函数等内容,是初学者入门 Python 的良好指南。

参考:https://blog.youkuaiyun.com/u011955252/article/details/51273863

https://blog.youkuaiyun.com/qq_27713281/article/details/69341454

1、Python的对汉字的支持

#!/usr/bin/python
#coding: UTF-8 
print "你好,世界";

2、Python标识符

在python里,标识符有字母、数字、下划线组成。

在python中,所有标识符可以包括英文、数字以及下划线(_),但不能以数字开头。

python中的标识符是区分大小写的。

以下划线开头的标识符是有特殊意义的。以单下划线开头(_foo)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用"from xxx import *"而导入;

以双下划线开头的(__foo)代表类的私有成员;以双下划线开头和结尾的(__foo__)代表python里特殊方法专用的标识,如__init__()代表类的构造函数。

3、python的保留关键字

andexecnot
assertfinallyor
breakforpass
classfromprint
continueglobalraise
defifreturn
delimporttry
elifinwhile
elseiswith
exceptlambdayield
4、Python的字符串的表示形式

Python 接收单引号(' ),双引号(" ),三引号(''' """) 来表示字符串,引号的开始与结束必须的相同类型的。

其中三引号可以由多行组成,编写多行文本的快捷语法,常用语文档字符串,在文件的特定地点,被当做注释。

word = 'word'
sentence = "这是一个句子。"
paragraph = """这是一个段落。
包含了多个语句"""
5、Python的注解主要试用的是

# 或者''' ''' 或者""  """

6、Python的数据类型:

  • Numbers(数字
    • int(有符号整型)
    • long(长整型[也可以代表八进制和十六进制])
    • float(浮点型)
    • complex(复数)
  • String(字符串){
  • 加号(+)是字符串连接运算符,星号(*)是重复操作。如下实例:

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-

    str = 'Hello World!'

    print str # 输出完整字符串
    print str[0] # 输出字符串中的第一个字符
    print str[2:5] # 输出字符串中第三个至第五个之间的字符串
    print str[2:] # 输出从第三个字符开始的字符串
    print str * 2 # 输出字符串两次
    print str + "TEST" # 输出连接的字符串

  • }
  • List(列表)
  • {
  • #!/usr/bin/python
    # -*- coding: UTF-8 -*-

    list = [ 'abcd', 786 , 2.23, 'john', 70.2 ]
    tinylist = [123, 'john']

    print list # 输出完整列表
    print list[0] # 输出列表的第一个元素
    print list[1:3] # 输出第二个至第三个的元素 
    print list[2:] # 输出从第三个开始至列表末尾的所有元素
    print tinylist * 2 # 输出列表两次
    print list + tinylist # 打印组合的列表

    以上实例输出结果:

    ['abcd', 786, 2.23, 'john', 70.2]
    abcd
    [786, 2.23]
    [2.23, 'john', 70.2]
    [123, 'john', 123, 'john']
    ['abcd', 786, 2.23, 'john', 70.2, 123, 'john']

  • }
  • Tuple(元组)
  • {
  • 元组用"()"标识。内部元素用逗号隔开。但是元组不能二次赋值,相当于只读列表。

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-

    tuple = ( 'abcd', 786 , 2.23, 'john', 70.2 )
    tinytuple = (123, 'john')

    print tuple # 输出完整元组
    print tuple[0] # 输出元组的第一个元素
    print tuple[1:3] # 输出第二个至第三个的元素 
    print tuple[2:] # 输出从第三个开始至列表末尾的所有元素
    print tinytuple * 2 # 输出元组两次
    print tuple + tinytuple # 打印组合的元组

    以上实例输出结果:

    ('abcd', 786, 2.23, 'john', 70.2)
    abcd
    (786, 2.23)
    (2.23, 'john', 70.2)
    (123, 'john', 123, 'john')
    ('abcd', 786, 2.23, 'john', 70.2, 123, 'john')

    以下是元组无效的,因为元组是不允许更新的。而列表是允许更新的:

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-

    tuple = ( 'abcd', 786 , 2.23, 'john', 70.2 )
    list = [ 'abcd', 786 , 2.23, 'john', 70.2 ]
    tuple[2] = 1000 # 元组中是非法应用
    list[2] = 1000 # 列表中是合法应用

  • }
  • Dictionary(字典)
  • {
  • 字典用"{ }"标识。字典由索引(key)和它对应的值value组成。

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-

    dict = {}
    dict['one'] = "This is one"
    dict[2] = "This is two"

    tinydict = {'name': 'john','code':6734, 'dept': 'sales'}


    print dict['one'] # 输出键为'one' 的值
    print dict[2] # 输出键为 2 的值
    print tinydict # 输出完整的字典
    print tinydict.keys() # 输出所有键
    print tinydict.values() # 输出所有值

    输出结果为:

    This is one This is two {'dept': 'sales', 'code': 6734, 'name': 'john'} ['dept', 'code', 'name'] ['sales', 6734, 'john']
  • }
7、Python 数据类型的转换

函数描述

int(x [,base])

将x转换为一个整数

long(x [,base] )

将x转换为一个长整数

float(x)

将x转换到一个浮点数

complex(real [,imag])

创建一个复数

str(x)

将对象 x 转换为字符串

repr(x)

将对象 x 转换为表达式字符串

eval(str)

用来计算在字符串中的有效Python表达式,并返回一个对象

tuple(s)

将序列 s 转换为一个元组

list(s)

将序列 s 转换为一个列表

set(s)

转换为可变集合

dict(d)

创建一个字典。d 必须是一个序列 (key,value)元组。

frozenset(s)

转换为不可变集合

chr(x)

将一个整数转换为一个字符

unichr(x)

将一个整数转换为Unicode字符

ord(x)

将一个字符转换为它的整数值

hex(x)

将一个整数转换为一个十六进制字符串

oct(x)

将一个整数转换为一个八进制字符串

8、Python的运算符

python的算术运算符

+加 - 两个对象相加a + b 输出结果 30
-减 - 得到负数或是一个数减去另一个数a - b 输出结果 -10
*乘 - 两个数相乘或是返回一个被重复若干次的字符串a * b 输出结果 200
/除 - x除以yb / a 输出结果 2
%取模 - 返回除法的余数b % a 输出结果 0
**幂 - 返回x的y次幂a**b 为10的20次方, 输出结果 100000000000000000000
//取整除 - 返回商的整数部分9//2 输出结果 4 , 9.0//2.0 输出结果 4.0
python的比较运算符

运算符描述实例
==等于 - 比较对象是否相等(a == b) 返回 False。
!=不等于 - 比较两个对象是否不相等(a != b) 返回 true.
<>不等于 - 比较两个对象是否不相等(a <> b) 返回 true。这个运算符类似 != 。
>大于 - 返回x是否大于y(a > b) 返回 False。
<小于 - 返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。注意,这些变量名的大写。(a < b) 返回 true。
>=大于等于 - 返回x是否大于等于y。(a >= b) 返回 False。
<=小于等于 - 返回x是否小于等于y。(a <= b) 返回 true。
python的赋值运算符

运算符描述实例
=简单的赋值运算符c = a + b 将 a + b 的运算结果赋值为 c
+=加法赋值运算符c += a 等效于 c = c + a
-=减法赋值运算符c -= a 等效于 c = c - a
*=乘法赋值运算符c *= a 等效于 c = c * a
/=除法赋值运算符c /= a 等效于 c = c / a
%=取模赋值运算符c %= a 等效于 c = c % a
**=幂赋值运算符c **= a 等效于 c = c ** a
//=取整除赋值运算符c //= a 等效于 c = c // a
python位运算符

算符描述实例
&按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0(a & b) 输出结果 12 ,二进制解释: 0000 1100
|按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。(a | b) 输出结果 61 ,二进制解释: 0011 1101
^按位异或运算符:当两对应的二进位相异时,结果为1(a ^ b) 输出结果 49 ,二进制解释: 0011 0001
~按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1(~a ) 输出结果 -61 ,二进制解释: 1100 0011, 在一个有符号二进制数的补码形式。
<<左移动运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。a << 2 输出结果 240 ,二进制解释: 1111 0000
>>右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数a >> 2 输出结果 15 ,二进制解释: 0000 1111
python逻辑运算符

运算符逻辑表达式描述实例
andx and y布尔"与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。(a and b) 返回 20。
orx or y布尔"或" - 如果 x 是 True,它返回 True,否则它返回 y 的计算值。(a or b) 返回 10。
notnot x布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。not(a and b) 返回 False
python的成员运算符

运算符描述实例
in如果在指定的序列中找到值返回 True,否则返回 False。x 在 y 序列中 , 如果 x 在 y 序列中返回 True。
not in如果在指定的序列中没有找到值返回 True,否则返回 False。x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。
python 的优先级

**指数 (最高优先级)
~ + -按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)
* / % //乘,除,取模和取整除
+ -加法减法
>> <<右移,左移运算符
&位 'AND'
^ |位运算符
<= < > >=比较运算符
<> == !=等于运算符
= %= /= //= -= += *= **=赋值运算符
is is not身份运算符
in not in成员运算符
not or and逻辑运算符
python的数学函数

函数返回值 ( 描述 )
abs(x)返回数字的绝对值,如abs(-10) 返回 10
ceil(x)返回数字的上入整数,如math.ceil(4.1) 返回 5
cmp(x, y)如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1
exp(x)返回e的x次幂(ex),如math.exp(1) 返回2.718281828459045
fabs(x)返回数字的绝对值,如math.fabs(-10) 返回10.0
floor(x)返回数字的下舍整数,如math.floor(4.9)返回 4
log(x)如math.log(math.e)返回1.0,math.log(100,10)返回2.0
log10(x)返回以10为基数的x的对数,如math.log10(100)返回 2.0
max(x1, x2,...)返回给定参数的最大值,参数可以为序列。
min(x1, x2,...)返回给定参数的最小值,参数可以为序列。
modf(x)返回x的整数部分与小数部分,两部分的数值符号与x相同,整数部分以浮点型表示。
pow(x, y)x**y 运算后的值。
round(x [,n])返回浮点数x的四舍五入值,如给出n值,则代表舍入到小数点后的位数。
sqrt(x)返回数字x的平方根,数字可以为负数,返回类型为实数,如math.sqrt(4)返回 2+0j
python随即函数

随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性。

Python包含以下常用随机数函数:

函数描述
choice(seq)从序列的元素中随机挑选一个元素,比如random.choice(range(10)),从0到9中随机挑选一个整数。
randrange ([start,] stop [,step])从指定范围内,按指定基数递增的集合中获取一个随机数,基数缺省值为1
random()随机生成下一个实数,它在[0,1)范围内。
seed([x])改变随机数生成器的种子seed。如果你不了解其原理,你不必特别去设定seed,Python会帮你选择seed。
shuffle(lst)将序列的所有元素随机排序
uniform(x, y)随机生成下一个实数,它在[x,y]范围内。
python的三角函数

描述
acos(x)返回x的反余弦弧度值。
asin(x)返回x的反正弦弧度值。 
atan(x)返回x的反正切弧度值。
atan2(y, x)返回给定的 X 及 Y 坐标值的反正切值。
cos(x)返回x的弧度的余弦值。
hypot(x, y)返回欧几里德范数 sqrt(x*x + y*y)。
sin(x)返回的x弧度的正弦值。
tan(x)返回x弧度的正切值。
degrees(x)将弧度转换为角度,如degrees(math.pi/2) , 返回90.0
radians(x)将角度转换为弧度
python的字符串内置函数

方法描述

string.capitalize()

把字符串的第一个字符大写

string.center(width)

返回一个原字符串居中,并使用空格填充至长度 width 的新字符串

string.count(str, beg=0, end=len(string))

返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数

string.decode(encoding='UTF-8', errors='strict')

以 encoding 指定的编码格式解码 string,如果出错默认报一个 ValueError 的 异 常 , 除 非 errors 指 定 的 是 'ignore' 或 者'replace'

string.encode(encoding='UTF-8', errors='strict')

以 encoding 指定的编码格式编码 string,如果出错默认报一个ValueError 的异常,除非 errors 指定的是'ignore'或者'replace'

string.endswith(obj, beg=0, end=len(string))

检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 False.

string.expandtabs(tabsize=8)

把字符串 string 中的 tab 符号转为空格,tab 符号默认的空格数是 8。

string.find(str, beg=0, end=len(string))

检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1

string.index(str, beg=0, end=len(string))

跟find()方法一样,只不过如果str不在 string中会报一个异常.

string.isalnum()

如果 string 至少有一个字符并且所有字符都是字母或数字则返

回 True,否则返回 False

string.isalpha()

如果 string 至少有一个字符并且所有字符都是字母则返回 True,

否则返回 False

string.isdecimal()

如果 string 只包含十进制数字则返回 True 否则返回 False.

string.isdigit()

如果 string 只包含数字则返回 True 否则返回 False.

string.islower()

如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False

string.isnumeric()

如果 string 中只包含数字字符,则返回 True,否则返回 False

string.isspace()

如果 string 中只包含空格,则返回 True,否则返回 False.

string.istitle()

如果 string 是标题化的(见 title())则返回 True,否则返回 False

string.isupper()

如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False

string.join(seq)

以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串

string.ljust(width)

返回一个原字符串左对齐,并使用空格填充至长度 width 的新字符串

string.lower()

转换 string 中所有大写字符为小写.

string.lstrip()

截掉 string 左边的空格

string.maketrans(intab, outtab])

maketrans() 方法用于创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。

max(str)

返回字符串 str 中最大的字母。

min(str)

返回字符串 str 中最小的字母。

string.partition(str)

有点像 find()和 split()的结合体,从 str 出现的第一个位置起,把 字 符 串 string 分 成 一 个 3 元 素 的 元 组 (string_pre_str,str,string_post_str),如果 string 中不包含str 则 string_pre_str == string.

string.replace(str1, str2,  num=string.count(str1))

把 string 中的 str1 替换成 str2,如果 num 指定,则替换不超过 num 次.

string.rfind(str, beg=0,end=len(string) )

类似于 find()函数,不过是从右边开始查找.

string.rindex( str, beg=0,end=len(string))

类似于 index(),不过是从右边开始.

string.rjust(width)

返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串

string.rpartition(str)

类似于 partition()函数,不过是从右边开始查找.

string.rstrip()

删除 string 字符串末尾的空格.

string.split(str="", num=string.count(str))

以 str 为分隔符切片 string,如果 num有指定值,则仅分隔 num 个子字符串

string.splitlines(num=string.count('\n'))

按照行分隔,返回一个包含各行作为元素的列表,如果 num 指定则仅切片 num 个行.

string.startswith(obj, beg=0,end=len(string))

检查字符串是否是以 obj 开头,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查.

string.strip([obj])

在 string 上执行 lstrip()和 rstrip()

string.swapcase()

翻转 string 中的大小写

string.title()

返回"标题化"的 string,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle())

string.translate(str, del="")

根据 str 给出的表(包含 256 个字符)转换 string 的字符,

要过滤掉的字符放到 del 参数中

string.upper()

转换 string 中的小写字母为大写

string.zfill(width)

返回长度为 width 的字符串,原字符串 string 右对齐,前面填充0

string.isdecimal()

isdecimal()方法检查字符串是否只包含十进制字符。这种方法只存在于unicode对象。

python的List的函数

序号函数
1cmp(list1, list2)
比较两个列表的元素
2len(list)
列表元素个数
3max(list)
返回列表元素最大值
4min(list)
返回列表元素最小值
5list(seq)
将元组转换为列表

Python包含以下方法:

序号方法
1list.append(obj)
在列表末尾添加新的对象
2list.count(obj)
统计某个元素在列表中出现的次数
3list.extend(seq)
在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
4list.index(obj)
从列表中找出某个值第一个匹配项的索引位置
5list.insert(index, obj)
将对象插入列表
6list.pop(obj=list[-1])
移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
7list.remove(obj)
移除列表中某个值的第一个匹配项
8list.reverse()
反向列表中元素
9list.sort([func])
对原列表进行排序
python元祖的内置函数

Python元组包含了以下内置函数

序号方法及描述
1cmp(tuple1, tuple2)
比较两个元组元素。
2len(tuple)
计算元组元素个数。
3max(tuple)
返回元组中元素最大值。
4min(tuple)
返回元组中元素最小值。
5tuple(seq)
将列表转换为元组。

字典内置函数&方法

Python字典包含了以下内置函数:

序号函数及描述
1cmp(dict1, dict2)
比较两个字典元素。
2len(dict)
计算字典元素个数,即键的总数。
3str(dict)
输出字典可打印的字符串表示。
4type(variable)
返回输入的变量类型,如果变量是字典就返回字典类型。

Python字典包含了以下内置方法:

序号函数及描述
1radiansdict.clear()
删除字典内所有元素
2radiansdict.copy()
返回一个字典的浅复制
3radiansdict.fromkeys()
创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值
4radiansdict.get(key, default=None)
返回指定键的值,如果值不在字典中返回default值
5radiansdict.has_key(key)
如果键在字典dict里返回true,否则返回false
6radiansdict.items()
以列表返回可遍历的(键, 值) 元组数组
7radiansdict.keys()
以列表返回一个字典所有的键
8radiansdict.setdefault(key, default=None)
和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default
9radiansdict.update(dict2)
把字典dict2的键/值对更新到dict里
10radiansdict.values()
以列表返回字典中的所有值

Python 日期和时间

thon 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能。

Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间。

时间间隔是以秒为单位的浮点小数。

每个时间戳都以自从1970年1月1日午夜(历元)经过了多长时间来表示。

Python 的 time 模块下有很多函数可以转换常见日期格式。如函数time.time()用于获取当前时间戳, 如下实例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import time;  # 引入time模块

ticks = time.time()
print "当前时间戳为:", ticks

以上实例输出结果:

当前时间戳为: 1459994552.51

时间戳单位最适于做日期运算。但是1970年之前的日期就无法以此表示了。太遥远的日期也不行,UNIX和Windows只支持到2038年。



什么是时间元组?

很多Python函数用一个元组装起来的9组数字处理时间:

序号字段
04位数年2008
11 到 12
21到31
3小时0到23
4分钟0到59
50到61 (60或61 是闰秒)
6一周的第几日0到6 (0是周一)
7一年的第几日1到366 (儒略历)
8夏令时-1, 0, 1, -1是决定是否为夏令时的旗帜

上述也就是struct_time元组。这种结构具有如下属性:

序号属性
0tm_year2008
1tm_mon1 到 12
2tm_mday1 到 31
3tm_hour0 到 23
4tm_min0 到 59
5tm_sec0 到 61 (60或61 是闰秒)
6tm_wday0到6 (0是周一)
7tm_yday1 到 366(儒略历)
8tm_isdst-1, 0, 1, -1是决定是否为夏令时的旗帜


获取当前时间

从返回浮点数的时间辍方式向时间元组转换,只要将浮点数传递给如localtime之类的函数。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import time

localtime = time.localtime(time.time())
print "本地时间为 :", localtime

以上实例输出结果:

本地时间为 : time.struct_time(tm_year=2016, tm_mon=4, tm_mday=7, tm_hour=10, tm_min=3, tm_sec=27, tm_wday=3, tm_yday=98, tm_isdst=0)


获取格式化的时间

你可以根据需求选取各种格式,但是最简单的获取可读的时间模式的函数是asctime():

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import time

localtime = time.asctime( time.localtime(time.time()) )
print "本地时间为 :", localtime

以上实例输出结果:

本地时间为 : Thu Apr  7 10:05:21 2016

格式化日期

我们可以使用 time 模块的 strftime 方法来格式化日期,:

time.strftime(format[, t])
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import time

# 格式化成2016-03-20 11:45:39形式
print time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) 

# 格式化成Sat Mar 28 22:24:24 2016形式
print time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()) 
  
# 将格式字符串转换为时间戳
a = "Sat Mar 28 22:24:24 2016"
print time.mktime(time.strptime(a,"%a %b %d %H:%M:%S %Y"))

以上实例输出结果:

2016-04-07 10:25:09
Thu Apr 07 10:25:09 2016
1459175064.0

python中时间日期格式化符号:

  • %y 两位数的年份表示(00-99)
  • %Y 四位数的年份表示(000-9999)
  • %m 月份(01-12)
  • %d 月内中的一天(0-31)
  • %H 24小时制小时数(0-23)
  • %I 12小时制小时数(01-12)
  • %M 分钟数(00=59)
  • %S 秒(00-59)
  • %a 本地简化星期名称
  • %A 本地完整星期名称
  • %b 本地简化的月份名称
  • %B 本地完整的月份名称
  • %c 本地相应的日期表示和时间表示
  • %j 年内的一天(001-366)
  • %p 本地A.M.或P.M.的等价符
  • %U 一年中的星期数(00-53)星期天为星期的开始
  • %w 星期(0-6),星期天为星期的开始
  • %W 一年中的星期数(00-53)星期一为星期的开始
  • %x 本地相应的日期表示
  • %X 本地相应的时间表示
  • %Z 当前时区的名称
  • %% %号本身

获取某月日历

Calendar模块有很广泛的方法用来处理年历和月历,例如打印某月的月历:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import calendar

cal = calendar.month(2016, 1)
print "以下输出2016年1月份的日历:"
print cal;

以上实例输出结果:

以下输出20161月份的日历:
    January 2016
Mo Tu We Th Fr Sa Su
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31


Time 模块

Time 模块包含了以下内置函数,既有时间处理相的,也有转换时间格式的:

序号函数及描述
1time.altzone
返回格林威治西部的夏令时地区的偏移秒数。如果该地区在格林威治东部会返回负值(如西欧,包括英国)。对夏令时启用地区才能使用。
2time.asctime([tupletime])
接受时间元组并返回一个可读的形式为"Tue Dec 11 18:07:14 2008"(2008年12月11日 周二18时07分14秒)的24个字符的字符串。
3time.clock( )
用以浮点数计算的秒数返回当前的CPU时间。用来衡量不同程序的耗时,比time.time()更有用。
4time.ctime([secs])
作用相当于asctime(localtime(secs)),未给参数相当于asctime()
5time.gmtime([secs])
接收时间辍(1970纪元后经过的浮点秒数)并返回格林威治天文时间下的时间元组t。注:t.tm_isdst始终为0
6time.localtime([secs])
接收时间辍(1970纪元后经过的浮点秒数)并返回当地时间下的时间元组t(t.tm_isdst可取0或1,取决于当地当时是不是夏令时)。
7time.mktime(tupletime)
接受时间元组并返回时间辍(1970纪元后经过的浮点秒数)。
8time.sleep(secs)
推迟调用线程的运行,secs指秒数。
9time.strftime(fmt[,tupletime])
接收以时间元组,并返回以可读字符串表示的当地时间,格式由fmt决定。
10time.strptime(str,fmt='%a %b %d %H:%M:%S %Y')
根据fmt的格式把一个时间字符串解析为时间元组。
11time.time( )
返回当前时间的时间戳(1970纪元后经过的浮点秒数)。
12time.tzset()
根据环境变量TZ重新初始化时间相关设置。

Time模块包含了以下2个非常重要的属性:

序号属性及描述
1time.timezone
属性time.timezone是当地时区(未启动夏令时)距离格林威治的偏移秒数(>0,美洲;<=0大部分欧洲,亚洲,非洲)。
2time.tzname
属性time.tzname包含一对根据情况的不同而不同的字符串,分别是带夏令时的本地时区名称,和不带的。


日历(Calendar)模块

此模块的函数都是日历相关的,例如打印某月的字符月历。

星期一是默认的每周第一天,星期天是默认的最后一天。更改设置需调用calendar.setfirstweekday()函数。模块包含了以下内置函数:

序号函数及描述
1calendar.calendar(year,w=2,l=1,c=6)
返回一个多行字符串格式的year年年历,3个月一行,间隔距离为c。 每日宽度间隔为w字符。每行长度为21* W+18+2* C。l是每星期行数。
2calendar.firstweekday( )
返回当前每周起始日期的设置。默认情况下,首次载入caendar模块时返回0,即星期一。
3calendar.isleap(year)
是闰年返回True,否则为false。
4calendar.leapdays(y1,y2)
返回在Y1,Y2两年之间的闰年总数。
5calendar.month(year,month,w=2,l=1)
返回一个多行字符串格式的year年month月日历,两行标题,一周一行。每日宽度间隔为w字符。每行的长度为7* w+6。l是每星期的行数。
6calendar.monthcalendar(year,month)
返回一个整数的单层嵌套列表。每个子列表装载代表一个星期的整数。Year年month月外的日期都设为0;范围内的日子都由该月第几日表示,从1开始。
7calendar.monthrange(year,month)
返回两个整数。第一个是该月的星期几的日期码,第二个是该月的日期码。日从0(星期一)到6(星期日);月从1到12。
8calendar.prcal(year,w=2,l=1,c=6)
相当于 print calendar.calendar(year,w,l,c).
9calendar.prmonth(year,month,w=2,l=1)
相当于 print calendar.calendar(year,w,l,c)。
10calendar.setfirstweekday(weekday)
设置每周的起始日期码。0(星期一)到6(星期日)。
11calendar.timegm(tupletime)
和time.gmtime相反:接受一个时间元组形式,返回该时刻的时间辍(1970纪元后经过的浮点秒数)。
12calendar.weekday(year,month,day)
返回给定日期的日期码。0(星期一)到6(星期日)。月份为 1(一月) 到 12(12月)。

一、文件
1、打开
fp = open('/etc/motd') # 以读方式打开
fp = open('test', 'w') # 以写方式打开
fp = open('data', 'r+') # 以读写方式打开
fp = open(r'c:\io.sys', 'rb') # 以二进制读模式打开
2、读取
f.read([n]) 读取至多 n 字节
f.readline([n]) 读取一行中的前 n 字符。如果 n 被省略,就读取整行
f.readlines() 读取所有的行并返回一个包含所有行的列表
f.xreadlines() 返回一个迭代器,每次迭代返回文件的一个新行
data = [line.strip() for line in f.readlines()]
3、写入
f.write(s) 将字符串 s 写入文件
f.writelines(l) 将列表 l 中的所有字符串写入文件
和readlines() 一样,writelines() 方法是针对列表的操作, 它接受一个字符串列表作为参数, 将它们写入文件. 行结束符并不会被自动加入, 类似地, 
输出方法 write() 或 writelines() 也不会自动加入行结束符. 你应该在向文件写 所以如果需要的话, 你必须在调用
writelines()前给每行结尾加上行结束符.
4、移动
f.tell() 返回当前的文件指针
f.seek(offset [, where]) 定位到一个新的文件位置
5、杂项
f.close() 结束文件
f.isatty() 如果 f 是一个交互式终端则返回 1
f.flush() 刷新输出缓冲区
f.truncate([size]) 如果文件长于 size 就截短它至 size 大小
f.fileno() 返回一个整型的文件描述符
f.name 文件名
f.mode 文件类型 读或写
6、最佳读取方式文件迭代
f=open('/etc/rc.conf')
for eachLine in f.readline():
eachLine=eachLine.upper()
print eachline
f.close()
可以用with 因为文件对象有环境管理器
>>> with open('/etc/rc.conf') as myfile:
... for line in myfile:
... line=line.upper()
... print line

二、异常
1、2.5版本后可统一后的异常语句
try:
main-action:
except Exception1:
hander1
except Exception2:
hander2
...
else:
else-block
finally:
finally-block
这语句中main-action代码会先执行。如果该程序代码(main-action)引发异常,那么except代码块都会逐一测试,寻找与抛出的异常相符的语句。
如果引发异常的是Exception1则会执行hander1代码块,如果引发异常的是Exception2,则会执行hander2代码块。以此类推。如果没有引发异常,
将会执行else-block代码块。无论前面发生什么,当main-action代码块完成时。finally-block都会执行。
捕捉异常补充
except: 捕捉所有(其他)异常类型
except name: 只捕捉特定的异常
except name,value: 捕捉所有的异常和其额外的数据(或实例)
except (name1,name2) 捕捉任何列出的异常
except (name1,name2),value: 捕捉任何列出的异常,并取得其额外数据
内置Exception类
Python把内置异常组织成层次,来支持各种捕捉模式
Exception: 异常的顶层根超类
StandardError: 所有内置错误异常的超类
ArithmeticError: 所有数值错误的超类
OverflowError: 识别特定的数值错误的子类
可以在Python库手册或exceptionsn模块的帮助文本中查阅。

2、下文管理 with/as环境管理
python2.6引入新的异常相关的语句:with及其可选的as分句。这个语句的设计是为了和环境管理器对象(支持新的方法协议)一起工作。
简而言之, with/as语句的设计作为常见try/finally用法模式的替代方案。就像try/finally语句, with/as语句也用于定义必须执行的
终止或“清理"行为,无论步骤中是否发生异常。和try/finally不同的是,with语句支持更丰富的基于对象的协议,可以代码块定义支持进入
和离开动作。
with语句基本格式:
with expression [as variable]:
block
在这里expression要返回一个对象,从而支持环境管理协议。如果选用as分句存在时,此对象也可返回一个值,赋值给变量名variable.
注意:variable并非赋值为expression的结果,expression的结果是支持环境协议的对象,而variable则是赋值为其他的东西(??)
然后,expression返回的对象可在with-block开始前,先自行启动程序,并且在该代码块完成后,执行终止程序代码,无论代码块是否引发异常
有些内置的Python对象已得到强化,支持环境管理协议,因此可以用于with语句。例如,文件对象有环境管理器,可在with代码块后自动关闭
文件,无法是否引发异常。
>>> with open('/etc/rc.conf') as myfile:
... for line in myfile:
... line=line.upper()
... print line
在这里,对open的调用,会返回一个简单文件对象,赋值给变量名myfile。我们可以用一般的文件工具使用myfile:就此而言,文件迭代器会在
for循环内逐行读取。然后,此对象也支持with语句所使用的环境协议。在这个with语句执行后。环境管理机制保证由myfile所引用的文件对象自动关闭。
即使处理该文件时,for循环引发了异常,也会对文件自动关闭。
环境管理器是有些高级的机制。还不是Python的正式组成部分。就较为简单的用途来说,try/finally语句可对终止活动提供足够的支持。

with工作于上下文管理协议的对象,比如文件和线程
with比try更简洁
因为已经从你手边拿走了一堆细节,所以实际上只是进行了两层处理:
第一,发生用户层 —— 和 in 类似,你所需要关心的只是被使用的对象
第二,在对象层.既然这个对象支持上下文管理协议,它干的也就是"上下文管理".

3、assert语句 断言
assert可以有条件地在程序代码中触发异常,可以认为是有条件的raise.
牢记:assert几乎都是用来收集用户定义的约束条件,而不是捕捉内在的程序设计错误。
因为Python会自动收集程序的设计错误,通常没有必要写assert去捕捉超出索引值,类型不匹配以及除数为0之类的事。
引发的异常为:AssertionError。如果没有被try捕捉到,就会终止程序。
该语句形式:
assert <test>,<data>
实例1
>>> def f(x):
... assert x>0,'x must be great zerot' 
... return x**2
实例2
try:
assert 1 == 0, 'One does not equal zero silly!'
except AssertionError, args:
print '%s: %s' % (args.__class__.__name__, args
实例3
class ProtectAndHideX(object):
def __init__(self, x):
assert isinstance(x, int), '"x" must be an integer!'
self.__x = ~x

>>> t=ProtectAndHideX()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() takes exactly 2 arguments (1 given)
>>> t=ProtectAndHideX('ddd')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in __init__
AssertionError: "x" must be an integer
>>> t=ProtectAndHideX(50) 

断言语句在Python 中如何用函数实现.可以像下面这样:
def assert(expr, args=None):
if __debug__ and not expr:
raise AssertionError, args
此处的 if 语句检查 assert 的语法是否合适,也就是expr 必须是一个表达式.我们比较expr
的类型和真正的表达式来确认.函数的第二部分对表达式求值然后根据结果选择性的引发异常.内建
的变量__debug__在通常情况下为True,如果开启优化后为False(命令行选项-O)(Python 2.2 后为布尔值True 和False.)

个人感觉是一个简单化的必要条件判断,如输入的数字必须大于0,输入的必须是字符串,很有用。

三、模块
1、搜索模块
导入模块时,不带模块的后缀名,比如.py
Python搜索模块的路径:
1)、程序的主目录
2)、PTYHONPATH目录(如果已经进行了设置)
3)、标准连接库目录(一般在/usr/local/lib/python2.X/)
4)、任何的.pth文件的内容(如果存在的话).新功能,允许用户把有效果的目录添加到模块搜索路径中去
.pth后缀的文本文件中一行一行的地列出目录。
这四个组建组合起来就变成了sys.path了,
>>> import sys
>>> sys.path
导入时,Python会自动由左到右搜索这个列表中每个目录。
2、import 和 from语句
import 导入整个模块
from 将获取(复制)模块特定变量名
from 模块名 import 需要复制的属性
from 模块名 import 需要复制的属性 as 新的属性名
from会把变量名赋值到另一个作用域,所以它就可以让我们直接在脚本中使用复制后的变量名,而不是通过模块。
尽量避免使用from 模块名 import *

四、函数
1、函数编写
def是可执行的代码,if,while,def可嵌套,可以出现在任何地方,但往往包含在模块文件中。
def创建了一个对象并将其赋值给某一个变量名。
return将一个结果对象发送给调用者,如果函数中没有return语句,就会自动返回None对象.
return可以在函数主体中的任何地方出现。它表示函数调动的结束,并将结果返回至函数调用处。
函数是通过赋值(对象引用)传递的。参数通过赋值传递给函数。
global声明了一个模块级的变量并被赋值。参数,返回值以及变量并不是声明
def语句将创建一个函数对象并将其赋值给一个变量名。一般格式如下:
def <name>(arg1,age2,...,agrN):
<statements>
return <value>
函数通过嵌套到if语句中去实现不同的函数定义的格式:
if test:
def func():
...
else:
def func()
2、编写函数时的参数设置
def func(name1,name2) 函数 常规参数(位置参数):通过位置或变量名进行匹配,从左到右进行匹配
def func(name=value) 函数 默认参数值:如果没有在调用中传递的话,就是用默认值,注意默认参数要放置在位置参数的后面,可变长度参数前面
def func(*name) 函数 可变长度参数:匹配并收集(在元组中)所有包含位置的参数 通过一个把元组(非关键字参数)作为参数组传递给函数
def func(**name) 函数 可变长度参数:匹配并收集(在字典中)所有包含位置的参数。过一个把字典(关键字参数)作为参数组传递给函数
完整格式
>>> def named(name1,name2,name3='jin',*name4,**name5):
... print name1,name2,name3,name4,name5
... 
>>> named('diege','wang')
diege wang jin () {}
3、函数调用和传递参数
func(value1,value2) 调用者 常规参数(位置参数):通过位置进行匹配,从左到右进行匹配
func(name=value) 调用者 关键字参数,通过变量名匹配
func(*name) 调用者 可变长度的参数,以name传递所有的对象,并作为独立的基于位置的参数,通过一个把元组(非关键字参数)作为参数组传递给函数
func(**name) 调用者 可变长度的参数,以name成对的传递所有的关键字/值,并作为独立的关键字的参数,过一个把字典(关键字参数)
作为参数组传递给函数.

补充说明:
【1】关键字参数:通过参数名进行匹配。【调用时】【调用者】可以定义那个函数接受这个值,通过在调用时使用参数的变量名,使用name=value这种语法。
【2】*默认参数:为没有传入值得参数定义参数值【定义函数时】如果调用时传入的值过于少的话,函数能够为参数定义接受的默认值,在函数定义中使用name=value
【3】任意参数
*和** 让函数支持接收任意数目的参数。
收集参数
第一种用法:在函数定义中,在元组中收集不匹配的位置参数
【1】非关键字可变长参数(元组)
当函数被调用的时候,所有的形参(必须的和默认的)都将值赋给了在函数声明中相对应的局部变量。剩下的非关键字参数按顺序插入到一个元组中便于访问
def function_name([formal_args,] *vargs_tuple):
"function_documentation_string"
function_body_suite

【2】关键字变量参数(Dictionary)
在我们有不定数目的或者额外集合的关键字的情况中,参数被放入一个字典中,字典中键为参数名,值为相应的参数值。为什么一定要是字典呢?因为为每个参数-参数的名字和参数值-
-都是成对给出---用字典来保存这些参数自然就最适合不过了。
这给出使用了变量参数字典来应对额外关键字参数的函数定义的语法:
def function_name([formal_args,][*vargst,] **vargsd):
function_documentation_string function_body_suite
为了区分关键字参数和非关键字非正式参数,使用了双星号(**)。**是被重载了的以便不与幂运算发生混淆。关键字变量参数应该为函数定义的【最后一个参数】,带**。

4、闭包[函数的功能,仅需了解,功能在很多情况下用类做最合适]
如果在一个内部函数里,对在外部作用域(但不是在全局作用域)[也就是包含函数的函数作用域]的变量进行引用,那么内部函数就被认为是闭包closure。
定义在外部函数内的但由内部函数引用或者使用的变量被称为[自由变量]。
闭包将内部函数自己的代码和作用域以及外部函数的作用域结合起来。闭包的词法变量不属于全
局名字空间或者局部的--而属于其他的名字空间,带着“流浪"的作用域。
回调就是函数。闭包也是函数,但是他们能携带一些额外的作用域。它们仅仅是带了额外特征的函数……另外的作用域。
将函数1放到一个函数2中,函数2 return 函数1这个对象。函数1会引用函数2作用域中的变量【引用外部但不是全局作用域】
def 函数2(argv2):
name=0
def 函数1(argv1):
name=+1
return 函数1
testdef=函数2(函数2参数) 有点类似于类的实例
有点不同的是我们能够做些原来需要我们写一个类做的事,并且不仅仅是要写,而且必需覆盖掉这个类的__call__()特别方法来使他的实例可调用。
这里我们能够使用一对函数来做这事。
现在,在很多情况下,类是最适合使用的。
def counter(start_at=0):
count = [start_at]
def incr():
count[0] += 1
return count[0]
return incr
counter()做的唯一一件事就是接受一个初始化的的值来开始计数,并将该值赋给列表count唯一一个成员。
然后定义一个incr()的内部函数。通过在内部使用变量count,我们创建了一个闭包。
因为它现在携带了整个counter()作用域。incr()增加了正在运行的count然后返回它。然后最后的
魔法就是counter()返回一个incr,一个(可调用的)函数对象。如我们交互地运行这个函数,我
们将得到如下的输出---------注意这看起来和实例化一个counter对象并执行这个实例有多么相似。
>>> count = counter(5)
>>> print count()
6
>>> print count()
7
>>> count2 = counter(100)
>>> print count2()
101
闭包和修饰符也有类似,修饰符在函数前后做准备或者清理操作,闭包是在函数中引用外部作用域变量做操作并返回做操作的函数

5、函数(方法)装饰器[函数修饰符]
可参考http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html
函数修饰符,一种在Python2.4 中加入的新特征。你可以用
它把一个函数应用到另个函数对象上, 而且新函数对象依然绑定在原来的变量。我们正是需要它来
整理语法。通过使用decorators,我们可以避免重新赋值:
class TestStaticMethod:
@staticmethod
def foo():
print 'calling static method foo()'
class TestClassMethod:
@classmethod
def foo(cls):
print 'calling class method foo()'
print 'foo() is part of class:', cls.__name__
1)什么是装饰器
装饰器实际就是函数。他接受函数对象,也可以有自己的参数。一般说来,当包装一个函数的时候,会最终会调用它。最棒的是我们能在包装的环境下
在合适的时机调用它。我们在执行函数之前,可以运行些预备代码,也可以在执行代码之后做些清理工作。也就是做预备或者清理工作。
可以考虑在装饰器中置入通用功能的代码来降低程序复杂度。例如,可以用装饰器来:
(1)引入日志
(2)增加计时逻辑来检测性能
(3)给函数加入事务的能力
个人设想:定义一个函数记录日志 然后在有需要的地方用这个记录日志的函数做装饰器去记录其他函数的执行情况。

2)修饰符语法
面向切面的编程(Aspect-Oriented Programming),与传统编程习惯的从上往下执行方式相比较而言,像是在函数执行的流程中横向地插入了一段逻辑。
装饰器背后的主要动机源自python面向切面的编程。装饰器是在函数调用之上的修饰。这些修饰仅是当声明一个函数或者方法的时候,才会应用的额外调用。
装饰器的语法以@开头,接着是装饰器函数的名字和可选的参数。紧跟着装饰器声明的是被修饰的函数,和被装饰函数的可选参数。装饰器看起来会是这样:
@decorator(dec_opt_args)
def func2Bdecorated(func_opt_args):
pass

class MyClass(object):
@staticmethod
def staticFoo():
pass
3)修饰符堆叠
装饰器可以如函数调用一样“堆叠“起来,这里有一个更加普遍的例子,使用了多个装饰器:
装饰器可以试一个也可以是多个,多个装饰器在应用时的顺序与指定的顺序相反
@deco2
@deco1
def func(arg1, arg2, ...): pass
这和创建一个组合函数是等价的。
def func(arg1, arg2, ...): pass
func = deco2(deco1(func))

4)有参数和无参数的装饰器
【修饰符本身是函数所以可以有参数】
没有参数的情况,一个装饰器如:
@deco
def foo(): pass
等同
foo = deco(foo)

带参数的装饰器decomaker()
@decomaker(deco_args)
def foo(): pass
等同
foo = decomaker(deco_args)(foo)
需要自己返回以函数作为参数的装饰器。换句话说,decomaker()用deco_args 做了些事并返回函数对象
1个含有多个装饰器的例子,其中的一个装饰器带有一个参数
@deco1(deco_arg)
@deco2
def func(): pass
This is equivalent to:这等价于:
func = deco1(deco_arg)(deco2(func))
修饰符举例
#!/bin/env python

from time import ctime, sleep
def tsfunc(func): #定义一个将做修饰符的函数,里面包含了一个子函数打印调修饰的对象和调用的时间,修饰符函数返回这个子函数对象
def wrappedFunc():
print '[%s] %s() called' % (ctime(), func.__name__)
return func()
return wrappedFunc

@tsfunc #使用前面定义的函数修饰foo函数,foo函数什么都没做
def foo():
pass

foo() #调用被修饰过的函数foo
sleep(4)

for i in range(2): #连续3次,间隔1秒调用foo函数
sleep(1)
foo()
5)内置的装饰器
内置的装饰器有三个,分别是staticmethod、classmethod和property,作用分别是把类中定义的实例方法变成静态方法、类方法和类属性。
由于模块里可以定义函数,所以静态方法和类方法的用处并不是太多,除非你想要完全的面向对象编程。而属性也不是不可或缺的,
使用property,staticmethod和classmethod的频率也非常低。
property属于新式类的特性python版本大于2.2
class HideX(object):
def __init__(self, x):
self.x = x
@property
def x():
def fget(self):
return ~self.__x
def fset(self, x):
assert isinstance(x, int), '"x" must be an integer!'
self.__x = ~x
return locals()
6)其他模块包含的装饰器
functools模块
wraps(wrapped[, assigned][, updated]): 
total_ordering(cls):


五、类
1、属性树的构造
命名空间树构造以及填入变量名的方式,通常来说:
【*】实例属性是由对方法内self属性进行赋值运算而生成的
【*】类属性是通过class语句内顶层的语句(赋值语句)而生成的
【*】超类链接通过class语句首行的括号内列出类而生成的。
2、继承和重载
子类继承父类,多可个父类时纵向查询。
子类可根据情况重载父类方法。
重载的关键概念
*运算符重载让类拦截常规的Python运算。
*类可重载所有Python表达式运算。
*类可重载打印,函数调用,属性点号运算等运算。
*重载使类实例的行为像内置类型。
*重载是通过提供特殊名称的类方法来实现的。
3、常见的运算符重载方法
方法 重载 调用
__init__ 构造器方法 对象建立:X=Class()
__del__ 析构方法 对象收回
__add__ 运算符+ X+Y,X+=Y
__sub__ 运算符- X-Y,X-=Y
__or__ 运算符|(位OR) X|Y X|=Y
__repr__ 运行时的字符串输出;内建repr(X) 和‘‘ 操作符,让直接访问对象时 有print的效果 注意方法里return的是字符串对象
__str__ 可打印的字符输出;内建str(X)及print X语句,print X才有输出,运行时不输出 注意方法里return的是字符串对象
__call__ 函数调用 X() ##??
__getattr__ 点号运算 X.undefined
__setattr__ 属性赋值语句 X.any=Value
__getitem__ 索引运算 X[key],没有__iter__时的for循环和其他迭代器
__setitem__ 索引赋值语句 X[key]=value
__len__ 长度 len(X),真值测试
__cmp__ 比较 X==Y,X
__lt__ 特定的比较 X<Y(or else __cmp__)
__eq__ 特定的比较 X==Y(or else __cmp__)
__radd__ 左侧加法 + Noninstance + X
__iadd__ 实地(增强的)的加法 X+=Y(or else __add__)
__iter__ 迭代环境 用于循环,测试,理解,列表,映射及其他
所有重载方法的名称前后都有两个下划线字符,以便把同类中定义的变量名区别开来。特殊方法名称和表达式或运算的映射关系,是由Python语言预先定义好的。
所有运算符重载的方法都是选用的:如果没有写某个方法,那么定义的类就不支持该运算。多数重载方法只用在需要对象行为表现得就像内置函数一样的高级程序
中。然而,__init__构造方法常出现在绝大多数类中。
__getitem__方法拦截实例的索引运算。当实例X出现X[i]这样的索引运算中时,Python会调用这个实例继承的__getitem__方法。(如果有),把X作为第一个参数
传递,并且放括号内的索引值传递给第二个参数。
__getitem__和__iter__实现迭代。
for循环的作用是从0到更大的索引值,重复对序列进行索引运算,直到检测到超出边界的异常。
__getitem__也可以是Python中一种重载迭代的方式,如果定义了这个方法,for循环每次循环时都会调用类的__getitem__
任何支持for循环的类也会自动支持Python所有迭代环境,包括成员关系测试in,列表解析,内置函数map,列表和元组赋值运算
以及类型构造方法也会自动调用__getitem__(如果定义的话)。
【迭代时使用方法的顺序】:
如今,Python中所有的迭代环境都会先尝试__iter__方法,再尝试__getitem__。如果对象不支持迭代协议,就会尝试索引运算。
重载__repr__和__str__,可定义一个,然后再用__repr__=__str__,因为这两个方法代码一样。
3、抽象类
class Super:
def method(self):
print "in Super.method"
def delegate(self):
self.action()
class Provider(Super):
def action(self):
print "in Provider.method"
if __name__=='__main__': 
print '\nProvider...'
x=Provider() #创建实例对象
x.delegate() #实例对象条用delegate方法,delegate方法通过实例的action方法实现
上例中Provider类如何工作的?当通过Provider类的实例调用delegate方法时,两个独立的继承搜索会发生:
(1)最初x.delegate的调用中,Python会搜索Provider实例和它上层的对象。知道在Super中找到delegate方法。实例x
会像往常一样传递给这个方法self参数
(2)Super.delegate方法中,self.action会对self及其它上层的对象启动新的独立继承搜索,因为self指的是Provider
实例,就会找到Provider中的action方法。
【抽象类就是会调用方法的类,但没有继承或定义该方法,而是期待该方法由子类填补。当行为无法预测,非得等到更为具体的子类编写时才知道】
通过用这种方式把类通用话。
这种“填空”的代码结构一般就是OOP软件的框架。从delegate方法的角度来看,这个例子中的超类有时也称作是抽象类--
也就是类的部分行为默认是由其子类所提供的。如果预期的方法没有在子类定义,当继承搜索失败时,Python会引发为定义
变量名的异常。类的编写者偶尔会使用assert语句,使这种子类需求更为明显,或者引发内置的异常NotImplementedError
class Super:
def method(self):
print "in Super.method"
def delegate(self):
self.action()
def action(self):
assert 0, 'action must be defind'
如果表达式运算结构为假,就会引发带有错误信息的异常。在这里表达式总是为假(0)。因为如果没有方法重新定义(子类没有重载该方法),
继承就会找到这里的版本,触发错误信息。

4、迭代器-iter
1)、迭代器介绍
Iterator是迭代器的意思,它的作用是一次产生一个数据项,直到没有为止。这样在 for 循环中就可以对它进行循环处理了。
那么它与一般的序列类型(list, tuple等)有什么区别呢?它一次只返回一个数据项,占用更少的内存。但它需要记住当前的状态,以便返回下一数据项。
它是一个有着next()方法的对象。而序列类型则保存了所有的数据项,它们的访问是通过索引进行的。
迭代器和iter()函数
根本上说, 迭代器就是有一个 next()方法的对象, 而不是通过索引来计数. 当你或是一个循环机制(例如 for 语句)需要下一个项时, 
调用迭代器的next()方法就可以获得它。条目全部取出后, 会引发一个 StopIteration 异常, 这并不表示错误发生, 只是告诉外部调用者, 迭代完成.
2)迭代器基本方法
迭代器仅是一容器对象,它实现了迭代器协议。它有两个基本方法:
(1)next方法
返回容器的下一个元素
(2)__iter__方法
返回迭代器自身
3)、如何创建迭代器
(1)iter()函数创建
对一个对象调用iter()就可以得到它的迭代器. 它的语法如下:
iter(obj)
iter(func, sentinel )
如果你传递一个参数给 iter() , 它会检查你传递的是不是一个序列, 如果是, 那么很简单:
根据索引从 0 一直迭代到序列结束.
>>> i = iter('abc')
>>> i.next()
'a'
>>> i.next()
'b'
>>> i.next()
'c'
>>> i.next()
Traceback (most recent call last):
File "<string>", line 1, in <string>
StopIteration:
(2)另一个创建迭代器的方法是使用类
一个实现了 __iter__() 和 next() 方法的类可以作为迭代器使用
class中__init__()方法执行前述的赋值操作。__iter__()仅返回self,这就是如何将一个对象声明为迭代器的方式,
最后,调用next()来得到迭代器中连续的值。next()控制怎么返回下一个值,顺序,倒序,多个步进,随机等。
StopIteration异常需要在next抛出。
#coding=utf-8
class Fib():
def __init__(self, max): 
self.max = max 
self.a = 0 
self.b = 1 

def __iter__(self):

return self 

def next(self): 
fib = self.a 
if fib > self.max: 
raise StopIteration 
self.a, self.b = self.b, self.a + self.b 
return fib
next倒序的例子
class MyIterator(object):
def __init__(self, step):
self.step = step
def next(self):
"""Returns the next element."""
if self.step==0:
raise StopIteration
self.step-=1
return self.step
def __iter__(self):
"""Returns the iterator itself."""
return self

for i in MyIterator(4):
print i

next随机的例子(永不退出)
#!/usr/bin/env python

from random import choice

class RandSeq(object):
def __init__(self, seq):
self.data = seq

def __iter__(self):
return self

def next(self):
return choice(self.data)
这个例子展示了一些我们可以用定制类迭代器来做的与众不同的事情。一个是无穷迭代。因为
我们无损地读取一个序列,所以它是不会越界的。每次用户调用next()时,它会得到下一个迭代值,
但我们的对象永远不会引发StopIteration 异常

4、生成器-yield关键字
1)、什么是生成器,生成器有什么用?
首先请确信,生成器就是一种迭代器。生成器拥有next方法并且行为与迭代器完全相同,这意味着生成器也可以用于Python的for循环中。另外,对于生成器的特殊语法支持使得编写一个生成器比自定义一个常规的迭代器要简单不少,所以生成器也是最常用到的特性之一。

当协同程序暂停的时候,我们能从其中获得一个中间的返回值,当调用回到程序中时,能够传入额外或者改变了的参数,但仍能够从
我们上次离开的地方继续,并且所有状态完整。挂起返回出中间值并多次继续的协同程序被称为生成器,那就是pytho的生成器真正在做的事。

生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 
n次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。
生成器不仅“记住”了它数据状态;生成器还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。

在Python2.5 提升让生成器更加接近一个完全的协同程序,因为允许值(和异常)能传回到一个继续的函数。
什么是python式的生成器?从句法上讲,生成器是一个带yield 语句的函数。一个函数或者子程序只返回一次,
但一个生成器能暂停执行并返回一个中间的结果----那就是yield 语句的功能, 返回一个值给调用者并暂停执行。
当生成器的next()方法被调用的时候,它会准确地从离开地方继续(当它返回[一个值以及]控制给调用者时)

2)、简单的生成器特性
与迭代器相似,生成器以另外的方式来运作:当到达一个真正的返回或者函数结束没有更多的值返回(当调用next()),一个StopIteration 异常就会抛出。
这里有个例子,简单的生成器:
>>> def simpleGen():
... yield 1
... yield '2---> punch!'
>>> myG=simpleGen()
>>> myG.next()#有点怪怪的,函数对象还有方法,next,send,close
1
>>> myG.next()
'2---> punch!'
>>> myG.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
在接下来的例子中,我们将要创建一个带序列并从那个序列中返回一个随机元素的随机迭代器:
>>> from random import randint
>>> def randGen(aList):
... while len(aList)>0:
... yield aList.pop(randint(0,len(aList)-1))#网上例子这里有错误,随机数的范围有问题,没有len(aList)-1
不同点在于每个返回的元素将从那个队列中消失,像一个list.pop()和random.choice()的结合的归类。
>>> for item in randGen(['rock', 'paper', 'scissors']):
... print item
... 
rock
scissors
paper
使用生成器最好的地方就是当你正迭代穿越一个巨大的数据集合,而重复迭代这个数据集合是
一个很麻烦的事,比如一个巨大的磁盘文件,或者一个复杂的数据库查询。对于每行的数据,你希
望执行非元素的操作以及处理,但当正指向和迭代过它的时候,你“不想失去你的地盘“
3)加强的生成器特性
一些加强特性加入到生成器中,所以除了next()来获得下个生成的值,用户
可以将值回送给生成器[send()],在生成器中抛出异常,以及要求生成器退出[close()]
由于双向的动作涉及到叫做 send()的代码来向生成器发送值(以及生成器返回的值发送回来),
现在yield 语句必须是一个表达式,因为当回到生成器中继续执行的时候,你或许正在接收一个进
入的对象。下面是一个展示了这些特性的,简单的例子。我们用简单的闭包例子,counter:
>>> def counter(start_at=0):
... count = start_at
... while True:
... val=(yield count) #直接返回初始值 同时将值赋给val
... if val is not None: #如yield count返回的不是None 则count=val
... count=val
... else:#是None的情况 count加1,也就是yield coun没有东西返回的时候count加以
... count+=1
... 
生成器带有一个初始化的值,对每次对生成器[next()]调用以1 累加计数。用户已可以选择重
置这个值,如果他们非常想要用新的值来调用send()不是调用next()。这个生成器是永远运行的,
所以如果你想要终结它,调用close()方法。如果我们交互的运行这段代码,会得到如下输出:
>>> count=counter(5)
>>> count.next() #有初始值 返回
5
>>> count.next() #现在为NONE count
6
>>> count.send(9)
9
>>> count.next()
10
>>> count.close()
>>> count.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> count=counter() 
>>> count.next() #

网上精辟总结:生成器和迭代器
生成器是迭代器,同时也并不仅仅是迭代器,不过迭代器之外的用途实在是不多,所以我们可以大声地说:生成器提供了非常方便的自定义迭代器的途径。
4)、__getitem__和__iter__以及生成器实现迭代 简单对比
__getitem__和__iter__实现迭代
for循环的作用是从0到更大的索引值,重复对序列进行索引运算,直到检测到超出边界的异常。
__getitem__也可以是Python中一种重载迭代的方式,如果定义了这个方法,for循环每次循环时都会调用类的__getitem__
>>> class stepper:
... def __getitem__(self,i):
... return self.data[i]
... 
>>> X=stepper
>>> X=stepper() 
>>> X.data='diege'
>>> X[1]
'i'
>>> for item in X:
... print item,
... 
d i e g e
任何支持for循环的类也会自动支持Python所有迭代环境,包括成员关系测试in,列表解析,内置函数map,列表和元组赋值运算
以及类型构造方法也会自动调用__getitem__(如果定义的话).
如今,Python中所有的迭代环境都会先尝试__iter__方法,再尝试__getitem__。如果对象不支持迭代协议,就会尝试索引运算。
从技术角度来将,迭代环境是通过调用内置函数iter去尝试寻找__iter__方法来实现的,而这种方法应该返回一个迭代器对象。
如果已经提供了,Python就会重复调用这个迭代器对象的next方法,直到发生StopIteration异常。如果没有找到__iter__方法
,Python会改用__getitem__机制,就像之前那样通过偏移量重复索引,直到引发IndexError异常。如果都有没最后就会尝试索引运算。

五、列表解析
列表解析
>>> L=[1,2,3,4,5]
>>> L=[x+10 for x in L]
将列表中行的换行符去掉
>>> lines=[line.rstrip() for line in lines]
>>> lines=[line.rstrip() for line in open('/etc/rc.conf')]
扩展列表解析
重复上一个例子,但我们只需开头不为#的文字行。
>>> lines=[line.rstrip() for line in open('/etc/rc.conf') if line[0]!='#']
完整的语句可接纳任意数目的for分句,而每个分区都可以结合一个可选的if分句
>>> [x+y for x in 'abc' for y in 'lmn']
['al', 'am', 'an', 'bl', 'bm', 'bn', 'cl', 'cm', 'cn']
对一个字符串中的每个x,以及另一个字符串中的每个y,创建x+y合并的列表。收集两个字符串字符的排列组合

重访列表解析:映射
1)、列表解析基础
>>> [x**2 for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> map((lambda x:x**2),range(10)) 
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
2)、增加测试和嵌套循环
在for之后编写if分支,用来增加逻辑选择,if分支相当filter
>>> [x for x in range(5) if x%2==0]
[0, 2, 4]
>>> filter((lambda x:x%2==0),range(5)) 
[0, 2, 4]
filter出来的列表可以作为map的第2个参数
>>> map((lambda x:x**2),filter((lambda x:x%2==0),range(5))) 
[0, 4, 16]
六、模块和类特殊属性
1、模块基本属性
__name__:模块的名字
——version__:模块的版本
__copyright__ = """
abc
""" :模块的版权信息
__all__:列表是指出当包(目录—)名称使用from *的时候,应该导入的子模块名称清单,包括函数和类。这样可以控制导入那些函数和类。
__all__ = ['getSectionMap',
'getValueMap',
'getConfValue',
'getGmtApiLine',
'getGmtApi']
'__doc__': 模块说明帮助文档,模块的doc定义在模块的开头,class的doc在call中定义,函数的doc在函数中定义
2、类和实例特殊的属性
特殊的类属性
C.__name__ 类C的名字(字符串)
C.__doc__ 类C的文档字符串
C.__bases__ 类C的所有父类构成的元组
C.__dict__ 类C的属性
C.__module__ 类C定义所在的模块(1.5 版本新增)
C.__class__ 实例C对应的类(仅新式类中
特殊实例属性
I.__class__ 实例化I 的类
I.__dict__ I 的属性

七、几个常用的函数
1)、dir() 
模块内方法和类类表,类中方法列表。和M.__dict__和C.__dict__显示key value不同只显示key
2)、vars()
这个函数返回的字典包含了所有在本函数调用时存在的变量。
vars()内建函数与dir()相似,只是给定的对象参数都必须有一个__dict__属性。vars()返回一
个字典,它包含了对象存储于其__dict__中的属性(键)及值。如果提供的对象没有这样一个属性,
则会引发一个TypeError 异常。如果没有提供对象作为vars()的一个参数,它将显示一个包含本地
名字空间的属性(键)及其值的字典,也就是,locals()。
3)sum()
列表求和
4)max(L)和min(L)
列表中的最大值最小值: max(L)和min(L)
5)、enumerate(iter)
接受一个可迭代对象作为参数,返回一个enumerate对象(同时也是一个迭代器),该对象生成由iter每个元素的index 值和item值组成的元组
>>> L=[1,2,3]
>>> enumerate(L)
>>> for i in enumerate(L): 
... print i
... 
(0, 1)
(1, 2)
(2, 3)
6)、zip()
对多个列表内容进行组合,将每个列表对应位置的元素组成元祖,返回这些元组组成的列表
>>> L1=[1,2,3]
>>> L2=['a','b','c']
>>> L3=['x','y','z']
>>> zip(L1,L2,L3)
[(1, 'a', 'x'), (2, 'b', 'y'), (3, 'c', 'z')]
以最短的为准
>>> L2=['a','b','c','d']
>>> zip(L1,L2,L3)
[(1, 'a', 'x'), (2, 'b', 'y'), (3, 'c', 'z')]
另外一个用处,将个列表组成k,v元组传递给dict产生字典
>>> zip(L1,L2) 
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]
>>> dict(zip(L1,L2))
{1: 'a', 2: 'b', 3: 'c', 4: 'd'}
可以用map来实现
>>> map(None,L1,L2)
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]
>>> dict(map(None,L1,L2))
{1: 'a', 2: 'b', 3: 'c', 4: 'd'}

八、函数式编程 
【函数也可以做参数,也可以做返回值】
掌握lambda、map()、filter()、reduce()即可
Python不是也不大可能会成为一种函数式编程语言,但是它支持许多有价值的函数式编程语言构建。
1.匿名函数与lambda
1)介绍和语法
python 允许用lambda 关键字创造匿名函数。匿名是因为不需要以标准的方式来声明,比如说,
使用def 语句。(除非赋值给一个局部变量,这样的对象也不会在任何的名字空间内创建名字.)然而,
作为函数,它们也能有参数。一个完整的lambda“语句”代表了一个表达式,这个表达式的定义体
必须和声明放在同一行。我们现在来演示下匿名函数的语法:
lambad 创建了一个之后能够被调用的函数,它返回了一个函数而不是将这个函数赋值给一个变量名。
lambda表达式
lanbda arg1,arg2,...,argN:expression using arguments
参数是可选的,如果使用的参数话,参数通常也是表达式的一部分。
lambda 是一个表达式,而不是一个语句
lambda的主体是一个单个的表达式,而不是代码块

2)、核心笔记:lambda 表达式返回可调用的函数对象。
用合适的表达式调用一个lambda 生成一个可以像其他函数一样使用的函数对象。它们可被传入
给其他函数,用额外的引用别名化,作为容器对象以及作为可调用的对象被调用(如果需要的话,
可以带参数)。当被调用的时候,如给定相同的参数的话,这些对象会生成一个和相同表达式等价
的结果。
对比
def true():
return True

def true(): return True
使用lambda 的等价表达式(没有参数,返回一个True)为:
lambda :True
这里用它赋值看起来非常有用。相似地,我们可以把lambda 表达式赋值给一个如列表和元组的
数据结构,其中,基于一些输入标准,我们可以选择哪些函数可以执行,以及参数应该是什么。(在下个部分中,、
我们将展示如何去使用带函数式编程构建的lambda 表达式。
def add(x, y): return x + y 
lambda x, y: x + y
>>> def func(x,y,z):return x+y+z
... 
>>> func(2,3,4)
9
等同于
>>> f=lambda x,y,z:x+y+z
>>> f(2,3,4) 
9
>> L=[1,2,3,4,5] 
map嵌套lambda 
>>> map((lambda x:x+3),L)
[4, 5, 6, 7, 8]
3)、为什么要使用lambda?
lambda 通常用来编写跳转表,也就是行为的列表或字典,能够按照需要执行相应的动作。
L=[(lambda x:x**2),(lambda x:x**3),(lambda x:x**4)]
>>> for f in L:
... print f(2)
... 
4
8
16
>>> print L[0](3) 
9
嵌套lambda和作用域【和闭包类似,返回一个函数】 
>>> def action(x):
... return (lambda y:x+y)
... 
>>> act=action(99)
>>> act
<function <lambda> at 0x285066f4>
>>> act(2)
101

2 内建函数apply()、filter()、map()、reduce()
map/filter/reduce,都是对一个集合进行处理,filter很容易理解用于过滤,map用于映射,reduce用于归并。
这几个函数都可以内嵌匿名函数
内建函数 描述
apply(func[, nkw][, kw])【已淘汰】
filter(func, seq) 【部分功能被列表解析取代】调用一个布尔函数func 来迭代遍历每个seq 中的元素; 返回一个使func 返回值为ture 的元素的序列。

map(func, seq1[,seq2...])【部分功能被列表解析取代】 将函数func用于给定序列(s)的每个元素,并用一个列表来提供返回值;
func为None, func表现为一个身份函数,返回一个含有每个序列中元素集合的n个元组的列表。

reduce(func, seq[, init]) 将二元函数作用于seq 序列的元素,每次携带一对(先前的结果以及下一个序列元素),连续的将现有的结果和下雨给值作用在获
得的随后的结果上,最后减少我们的序列为一个单一的返回值;如果初始值init 给定,第一个比较会是init 和第一个序列元素而不是序列的头两个元素。

1)filter(func, seq) 
给定一个对象的序列和一个“过滤”函数,每个序列元素都通过这个过滤器进行筛选, 保留函数返回为真的的对象。filter 函数为已知的序列的每个元素调用
给定布尔函数。每个filter 返回的非零(true)值元素添加到一个列表中。返回的对象是一个从原始队列中“过滤后”的队列。为真的队列。
个人总结:
通过一个函数对一个序列操作,返回操作为真的序列。
返回一个序列, 包含了给定序列中所有调用function(item)后返回值为true的元素。
目的:基于某一测试函数过滤出一些元素。
列表模拟
from random import randint as ri
print [n for n in [ri(1,99) for i in range(9)] if n%2]
>>> range(-5,5)
[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]
>>> filter((lambda x:x>0),range(-5,5))
[1, 2, 3, 4]
这个等效于for range:if语句
[n for n in range(-5,5) if n>0]
2)map(func, seq1[,seq2...])
map(函数,传入函数的序列对象)
个人总结:#多个序列相同位置组成的元组作参数传递给函数,返回函数处理后的返回值组成的列表。
为每个元素一次调用function(item)并将返回值组成一个链表返回.
使用内置工具map,map函数会对一个序列对象中的每一个元素应用被传入的函数,并且返回一个包含了所有函数调用结果的一个列表。
形式更一般的map()能以多个序列作为其输入。如果是这种情况, 那么map()会并行地迭代每个序列。将每个序列相同位置的元素组成一个元组传递给函数。
函数的参数个数必须和序列个数一致, 执行时会一次用各个序列上对应的元素来调用函数(如果某些序列比其他短,则用None代替).
>>> def inc(x):return x+10
... 
>>> L=[1,2,3,4,5]
>>> map(inc,L)
[11, 12, 13, 14, 15]
备注:map函数另外一个用法,把序列的元素配对起来,但是如果参数长度,不同则会为较短的序列用None补齐。
map(None, seq1,seq2) 最简单的形式,这个和zip几乎相同,唯一不同的的是以最长为标准补全,而zip是以最短为标准截断
>>> aList=[1,2,3]
>>> bList=['a','b','c']
>>> map(None,aList,bList)
[(1, 'a'), (2, 'b'), (3, 'c')]
map嵌套lambda 
>>> map((lambda x:x+3),L)
[4, 5, 6, 7, 8]

def map_imp(function, sequence) :
if function is None: return list(sequence)
retvals = []
for element in sequence:
if (function(element)):
retvals.append(element)
return retvals

当map的第一个参数为class类型时,返回的是用第二个参数创建的class类的实例。
def map_imp2(class,sequence):
retvals = []
if (class(sequence)):
retvals.append([class(sequence)])
return retvals

3)reduce 使用了一个二元函数(一个接收带两个值作为输入,进行了一些计算然后返回【一个值】作为输出),一个序列,和一个可选的初始化器,卓有成
效地将那个列表的内容“减少”为一个单一的值,如同它的名字一样。在其他的语言中,这种概念也被称作为折叠


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值