第三部分 python的语句与语法



第三部分python的语句与语法

目录

第10章 python语句简介... 2

要点... 2

第11 章 赋值,表达式和打印... 3

赋值语句... 3

特性:... 3

高级序列赋值语句模式... 3

列表分解赋值... 3

多目标赋值语句 以及共享引用... 4

增强赋值语句... 4

变量命名规则... 5

命名惯例... 5

表达式... 5

打印语句... 5

重定向输出流... 6

第12章 if测试... 6

Python语法规则... 7

代码块分隔符与语句的分隔符... 7

If / else 三元表达式... 8

第13章 while和for 循环... 9

While循环... 9

Breank, continue, pass 和循环else. 9

For循环... 10

迭代器: 初探... 12

文件迭代器... 12

其他内置迭代器... 13

其他迭代环境... 13

循环计数器 while和range. 14

并行遍历 zip 和 map. 15

使用zip构造字典... 16

产生偏移和元素: enumerate. 16

列表解析:初探... 16

第14章Python文档资源... 17

文档字符串 __doc__. 18

内置文档字符串... 19

PyDoc: help函数... 19

常见编写代码的陷阱... 21

 

 

第10章 python语句简介

要点

l  Python中新的语法成分是冒号(:)

l  一行的结束会自动终止现在该行的语句

l  缩进的结束就是代码块的结束。

l  当一行中出现多行语句时用分号(;)隔开。

l  如果一条语句横跨多行,你只需用一对 括号,方括号,大括号 括起来就行了。

例如:

if(x<y and

    y<z):

        Print('true')

If[x<y and

    y<z]:

        Print('true')

If{x<y and

    y<z}:

        Print('true')

 

l  复合语句的主体可以出现在python的首先冒号之后,但只有当复合语句本身不包含任何复合语句的时候才能这样做,也就是单语句。例如 if x>y : print(x)

 

    while True:

         reply = raw_input('Enter text:')

         if reply  == 'stop':

                   break

         elif not reply.isdigit():

                   print('Bad!' * 8)

         else:

                   print(int(reply) ** 2)

 

    while True:

         reply = raw_input("Enter text:")

         if reply == 'stop' : break

         try:

                   num = int(reply)

         except:

                   print('bad!' * 8)

         else:

                   print(num ** 2)

 

由上例,从语句嵌套观点来看,因为try, except以及else这些关键字全都缩进在同一层次上,它们全都被视为单个try语句的一部分。注意:else部分是和try结合,而不是和if结合。在python中, else可出现在if 语句中,也可以出现在try语句以及循环中----其缩进会告诉你它属于哪个语句。

 

 

 

 

 

 

第11 章 赋值,表达式和打印

赋值语句

特性:

1.        赋值语句总是建立对象的引用值而不是复制对象,因此python变量更像是指针,而不是数据存储区域。

2.        变量名首次赋值时会被创建。

3.        变量名在引用前必须先被赋值

4.        隐式赋值语句import, from, def, class, for, 函数参数。

举例

>>> a, b = 'a', 'b'

>>> [x, y] = ['x','y']

>>> e, f, m, n ='spam' 

#将序列'spam'中每一项分别赋值给变量名的元组(e, f, m, n

#注意=号左右变量名与序列长度要相一致,否则出错

>>> z1 = z2 = 'zzz'

>>> a, b, e, f, m, n,z1, z2

('a', 'b', 's', 'p', 'a', 'm','zzz', 'zzz')

高级序列赋值语句模式

>>> string = 'SPAM'

>>> a, b, c =string[0], string[1], string[2:]   #分解序列stirng为三个元素

>>> a, b, c

('S', 'P', 'AM')

>>> a, b, c =list(string[:2]) + [string[2:]] 

#用list内置函数将序列前2个元素转换为列表,再加上用[]转换的列表(元素是string[2:]),然后组成一个三个元素的列表赋值给变量组a, b, c

>>> a, b, c

('S', 'P', 'AM')

>>> a, b = string[:2]

>>> c = string[2:]

>>> a, b, c

('S', 'P', 'AM')

>>> (a, b), c =string[:2], string[2:]

>>> a, b, c

('S', 'P', 'AM')

列表分解赋值

>>> l = [ 1,2,3,4]

>>> while l:

   front, l = l[0], l[1:]  #每次循环都会重新分配列表l,这其实等于 front= l[0] ; l = l[1:]

   print(front, l)

 

  

(1, [2, 3, 4])

(2, [3, 4])

(3, [4])

(4, [])

>>> range(3)   #range内置函数会产生连续的整数列表

[0, 1, 2]

# 以上这个程序使用列表作为一种堆栈的数据结构。也可通过列表对象的append和pop方法来实现。在这里front = l.pop(0)

多目标赋值语句以及共享引用

>>> a = b = c ='spam'  #这里只有一个对象'spam'  由三个变量共享

>>> a, b, c

('spam', 'spam', 'spam')

>>> a = b = 0  #因为数字不支持在原处修改,只要赋值的对象是不可变的,即使有一个以上的变量名使用该对象也无所谓。

>>> b = b + 1

>>> a, b

(0, 1)

>>> a = b = []  #因为[]列表对象是可变的, 所以b发生了改变,a 由于引用了,所以也变了

>>> b.append(28)

>>> a, b

([28], [28])

>>> a = []  # a和b分别创建不同的对象,所以一方改变不影响另一方

>>> b = []

>>> b.append(32)

>>> a, b

([], [32])

增强赋值语句

>>> l = l + [5,6]  #合并运算必须建立新的对象,赋值给l

>>> l

[5, 6]

>>> l.extend([7, 8])  #extend会在原处内存块的末尾增加元素

#Python会自动调用较快的extend方法来完成合并操作。

>>> l

[5, 6, 7, 8]

>>> l += [1, 2]  # +=隐含了对列表进行原处修改的意思

>>> l

[5, 6, 7, 8, 1, 2]

>>> m = l

>>> l = l + [3,4]  #因为使用了合并操作会创建新的对象赋给l,而m还引用原先的没改变

>>> m

[5, 6, 7, 8, 1, 2]

>>> l

[5, 6, 7, 8, 1, 2, 3, 4]

变量命名规则

区分大小写,以下划线和字母开头。只能由下划线,字母,数字组成。

命名惯例

1, 以单下划线开头的变量名( _X )不会被from module import * 语句导入

2,  前后有下划线的变量名( __X__ )是系统定义的变量名,对解释器有特殊意义.

3,  以两下划线开头,但结尾没有的变量名( __X ) 是类的本地变量

4,  通过交互模式运行时,只有单个下划线的变量名( _ )会保存最后表达式的结果.

5,  类变量名通常以一个大写字母开头, 而模块名以小写字母开头.

6,  变量名 self 虽然并非保留字,但类中一般都有特殊的角色.Open = 2是可以的但不要用

7,  变量名没有类型, 但对象有, 在不同的时刻把相同变量名赋值给不同类型的对象,是允许

 

表达式

通常两种情况下表达式作语句使用:

调用函数和方法

在交互模式提示符下打印值

>>> L = L.append(4)

对列表调用append, sortreverse这类原处修改的运算后,这些方法在列表修改后并不会把列表返回,事实上,它们返回的是None对象 .

新的内建函数sorted会排序任何序列,并传回有排序结果的新列表因为这并不是在原处修改,将其结果赋值给变量名。

打印语句

Print语句只是python的人性化的特性,提供了sys.stdout对象的简接口, 再加上一些默认的格式设置.

>>> import sys

>>> sys.stdout.write('helloworld\n')

hello world

重定向输出流

通常print和sys.stdou的关系如下:

>>>print( x )

等于:

Import sys

Sys.stdout.write(str(x) + '\n')

 

当把sys.stdou重新赋值给标准输出流以外的东西时,就可以让print语句将文字传送到你指定的位置.

>>>import sys

>>>sys.stdout = open('c:\\log.txt', 'a')

>>>print('kangqiao')  #这时你的c盘下就存在了一个log.txt文件,里面保存了kangqiao

当print语句以>>开始,后面再跟着输出的文件对象时,该print语句可以将其文字传给该对象的write方法,但是不用重设sys.stdout, 因为这种重定向是暂时的.

>>> log =open('c:\\log.txt', 'a')

>>> x, y = 'spam','bad'

>>> print >> log,x, y

>>> print(x, y)

('spam', 'bad')

>>> log.close()

这种pirnt的扩展形式通常也用于把错误讯息打印到标准错误流sys.stderr

>>> import sys

>>>sys.stderr.write(('Bad!' * 8) + '\n')

Bad!Bad!Bad!Bad!Bad!Bad!Bad!Bad!

>>> print >>sys.stderr, 'Bad!' * 8

Bad!Bad!Bad!Bad!Bad!Bad!Bad!Bad!

注意: python 3.0, print语句将变为内置函数,功用相同, 但语法略有不同,目标谁的和列结尾行为是由关键词参数赋值的,例如 : 语句print x, y 会变成调用 print(x, y), print >> f, 会变成print(x, file=f, end='  ').

Python中的raw_input()函数会从sys.stdin文件中读入,所以可以用类似的方法拦截对输入的请求

>>> raw_input()

nihao

'nihao'

第12章 if测试

      实际上, elif和else部分可以省略,而且每一段中可以嵌套一个以上的语句。注意if,elif以及else结合在一起的原因在于它们垂直对齐, 具有相同 的缩进。

         Python中没有switch或case语句。

x = 'killerrabbit'

if x == 'roger':

         print("how's jessica?")

elif x == 'bugs':

         print("what's up doc?")

else:

         print('Run away! Run away!')

 

        

Run away! Runaway!

>>> choice = 'ham'

>>> print{'spam': 1.25,

      'ham':1.99,

      'eggs':0.99,

     'bacon': 1.10}[choice]  #这有些像switch,这个字典是多路分支,根据键的选择进行索引。

1.99

>>> branch = {'sapm': 1,

           'ham': 2,

           'eggs': 3}

>>> print(branch.get('spam', 'Badchoice'))

#字典默认值能够通过has_key测试, get方法调用或异捕捉来处理。

Bad choice

>>> print(branch.get('bacon', 'Badchoice'))

Bad choice

 

Python语法规则

1.        语句是逐个运行的,除非你不这样编写

2.        块和语句的边界会自动被检测

3.        复合语句=首行+ “:”+缩进语句

4.        空白行,空格以及注释通常都会被忽略。

5.        文档字符串(docstring)会被忽略,但会被保存并由工具显示

 

代码块分隔符与语句的分隔符

         任何特定单一块中的所有 语句都必须缩进到时相同的层次否则python会报告错误

         如果 使用语法括号对,语句就可以横跨数行。() [] {}

         如果语句以反斜线结尾,就可以横跨数行

         三重引号字符串常量可以横跨数行。

         其他规则: 用分号终止语句,注释和空白行可以出现在文件的任意之处。

特殊情况:

if a == b and c == d and \

   d == e andf == g:

         print('olde')

 

if(a == b and c == d and

   d == e ande ==f):

         print('new')

 

>>> x = 1; y = 2; print(x)

1

>>> if 1: print('hello')

 

hello

>>> 

任何非零数字或非空对象都是真

数字零,空对象以及特殊对象None都被认为是假

比较和相等测试会递归地应用在数据结构中

比较和相等测试会返回True或False(1和0的特殊版本)

布尔and和or 运算会返回真或假的操作对象

Python中有三种布尔运算符: and or not

 

And和or运算符总会返回对象,不是运算符左侧的就是右侧的。

>>> 2 or 3, 3 or 2

(2, 3)

>>> [] or 3

3

>>> [] or {}

{}

>>> {} or []

[]

>>> 2 and 3, 3 and 2

(3, 2)

>>> [] and {}

[]

>>> 3 and []

[]

从上面我们看到and和or总是返回那个导致结果 的对象

 

If / else 三元表达式

>>> x, y, z = 0, 1, 2

>>> a = y if xelse z

>>> a

2    # 这是三元的结果,它等同于下面的判断。

>>> if x:

         a = y

else:

         a = z

 

bool函数总是会把一个表达式或对象返回10

>>> ['f', 't'][bool('sapm')]

't'

>>> ['f', 't'][bool('')]

'f'

 

x = a or bor c or None

由于 or 的短路特性,x 总是返回a, b, c中第一个非空的值,当a, b, c 都为空时它就取最后的None作为默认值。这是python中相当决的编码手法。

 

 

第13章 while和for 循环

While循环

一般格式

         While<test>:

                   <statements1>

         Else:

                   <statemnets2>

举例:

>>> a = 0; b = 10

>>> while a < b:

         printa,

         a +=1

 

        

0 1 2 3 4 5 6 7 8 9

 

Breank, continue, pass 和循环else

Break: 跳出最近所在的循环(跳出整个循环)

Continue:跳出最近所在循环的开头处(来到时循环的道行)

Pass: 什么事也不做,只是空占位符

循环else块:只有当循环正常离开时都会执行(也就是没有碰到break语句)

一般格式:

         While<test1>:

                   <statements1>

                   If<test2>: break

                   If<test3>: continue

         Else:

                   <statements2>

举例:

如果想写个无限循环,每次迭代时什么也不做,就写个pass.

>>> x

0

while x > 1:

         if y% x == 0:

                   print(y,'has factor', x)

                   break

         x = x- 1

else:

         print(y,'is prime')

 

        

(1, 'is prime')

#######################

>>> x = 2

>>> while x :

         print(x)

         x = x- 1

else:

         print("else")

 

        

2

1

Else  #因为循环中没有碰到break语句所以会打印else部分.

简而言之, 如果循环文体没有执行过,循环else分句也会执行, 因为你没有其中执行break语句,在while循环中,如果执行的测试一开始就是假,就会发生这种问题.

 

For循环

For循环是一个通用的序列迭代器,: 可以遍历任何有序的序列对象内的元素, for语句可用于字符串, 列表, 元组, 其他内置可迭代对象以及之后我们能够通过类所创建的对象 .

 

格式 :

For <target> in <object>:

         <statements>

         If<test>: break

         If<test>: continue

Else:

         <statements>

举例:

>>>prod = 1

>>>for item in [1, 2, 3, 4] : prod *= item

 

>>>prod

24

>>> sum = 0

>>> for x in [1, 2, 3, 4]:

         sum =sum + x

 

        

>>> sum

10

在for循环中的元组赋值

如果迭代元组序列,循环目标本身实际上可以是目标元组.

>>> t = [(1, 2), (3, 4), (5, 6)]

>>> for (a, b) in t:

         print(a,b)

 

        

(1, 2)

(3, 4)

(5, 6)

嵌套for循环

>>> tests = [(4, 5), 3.14]

>>> items = ['aaa', 111, (4, 5), 2.01]

>>> for key in tests:

         foritem in items:

                   ifitem == key:

                            print(key,'was found')

                            break

         else:

                   print(key,'not found')

 

                  

((4, 5), 'was found')

(3.14, 'not found')

################

>>> for key in tests:

         ifkey in items:

                   print(key,'was found')

         else:

                   print(key,'not found')

 

                  

((4, 5), 'was found')

(3.14, 'not found')

 

迭代器: 初探

For循环可以用于python中任何序列类型, 包括,元组以及字符串

For 循环甚至比这还要更为通用:可用于任何可迭代的对象.

 

文件迭代器

每次调用readline方法时,就会前进到时下一列,到达文件末尾时就会返回空字符串,我们可通过 它来检测,从而跳出循环。

Next方法:与readline一样每次调用时都会返回文件中的下一行,唯一的区别在于, 当到达文件末尾时,next是引发内置的StopIteration异常而不是返回空字符串。

 

值得注意的是这个next接口就是python中所谓的迭代协议:有next方法的对象会前进到下一个结果,而在一系列结果的末尾时, 会引发StopIteration,在python中任何这类对象都认为是可迭代的。任何这类对象也能以for循环或其他迭代工具遍历,因为所有迭代工具内部工作起来都是在每次迭代中调用next,并且捕捉StopIteration异常来确定何时离开。

>>> for line in open('c:\\log.txt'):

         printline.upper(),  #注意这后面有个逗号,当不加时输出会导致每行之间都有个空行, 不解

        

KANGQIAO

ABC KANGQIAO

45676

HELLO WORLDHW

上述方式是读取文件的最佳方式,

当你使用readlines()方法时,也能用,但这个版本其实是一次把整个文件加载到内存,如果文件太大,以至于计算机内存空间不够,甚至不能够工作,

其他内置迭代器

>>> l = [1, 2, 3]

>>> I = iter(l)

>>> I.next(), I.next(), I.next()

(1, 2, 3)

>>> I.next() #已经没有下一个元素了,所以抛出异常

 

Traceback (most recent call last):

  File"<pyshell#13>", line 1, in <module>

    I.next()

StopIteration

>>> D = {'a': 1, "b": 2, 'c': 3}

>>> for key in D.keys():

         printkey, D[key]

 

        

a 1

c 3

b 2

#字典有一个迭代器,在迭代环境中,会自动返回一个键。所以不需要keys()

这也是字典优化后的最佳迭代方案

>>> for key in D:

         printkey, D[key]

 

        

a 1

c 3

b 2

其他迭代环境

每一种由左至右扫描对象的工具都会使用迭代协议。

>>> for line in open('c:\\log.txt'):  #原始输出

         printline,

 

        

kangqiao

abc 126.com

45676

hello worldhw

>>> uppers = [line.upper() for line inopen('c:\\log.txt')]  #用方括号组成列表。

>>> uppers

['KANGQIAO\n', 'ABC 126.COM\n', '45676\n', 'HELLOWORLDHW\n']

>>> map(str.upper, open('c:\\log.txt'))  #map函数的第一个参数为一个函数指针。

['KANGQIAO\n', 'ABC 126.COM\n', '45676\n', 'HELLOWORLDHW\n']

>>> 'kangqiao\n' in open('c:\\log.txt') #判断文件中’c:\\log.txt’是否存在字符’kangqiao’

True

>>> 'HELLO WORLDHW\n' in open('c:\\log.txt')

False

>>> sorted(open('c:\\log.txt'))   #排序c:\\log.txt文件中的每一行.

['45676\n', 'abc 126.com\n', 'hello worldhw\n','kangqiao\n']

>>> list(open('c:\\log.txt'))     #用list函数组成列表

['kangqiao\n', 'abc 126.com\n', '45676\n', 'helloworldhw\n']

>>> tuple(open('c:\\log.txt'))  #用tuple组成元组

('kangqiao\n', 'abc 126.com\n', '45676\n', 'helloworldhw\n')

>>> '&&'.join(open('c:\\log.txt'))   #用’&&’字符串的join方法连接文件中的每一行.

'kangqiao\n&&abc126.com\n&&45676\n&&hello worldhw\n'

>>> a, b, c, d = open('c:\\log.txt')   #将文件中的每一行分别赋值给变量a, b, c, d.但要注意一一对应啊.

>>> a, b

('kangqiao\n', 'abc 126.com\n')

 

循环计数器 while和range

>>> range(5), range(2, 5), range(0, 10, 2)#当有三个参数时,第三个参数代表步进.

([0, 1, 2, 3, 4], [2, 3, 4], [0, 2, 4, 6, 8])

>>> range(-5, 5)

[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]

>>> range(5, -5, -1)

[5, 4, 3, 2, 1, 0, -1, -2, -3, -4]

>>> for i in range(3):   #迭代三次

         printi, 'pythons'

 

        

0 pythons

1 pythons

2 pythons

>>> x = 'spam'

>>> for item in x: print item,   #遍历序列中的第一个元素

 

s p a m

>>> i = 0

>>> while i < len(x):   #变通的下标迭代

         printx[i], ; i += 1

 

        

s p a m

>>> x

'spam'

>>> len(x)

4

>>> range(len(x))

[0, 1, 2, 3]

>>> for i in range(len(x)): print x[i],  #迭代长度为len(x)

 

s p a m

>>> for item in x: print item,

 

s p a m

>>> s = 'abcdefghijk'

>>> range(0, len(s), 2)

[0, 2, 4, 6, 8, 10]

>>> for x in s[::2]: print x,  #首先改变列表,然后打印每一个元素

 

a c e g i k

>>> 

 

并行遍历 zip 和 map

内置函数zip让我们使用for循环来并行使用多个序列. Zip会取得一个或多个序列为参数, 然后返回元组的列表, 将这些序列中的并排的元素配成对.

>>> L1 = [1, 2, 3, 4]

>>> L2 = [5, 6, 7, 8]

>>> zip(L1, L2)

[(1, 5), (2, 6), (3, 7), (4, 8)]

>>> for (x, y) in zip(L1, L2):  #这个for循环在这里使用元组赋值运算以分解zip结果中的每个元组.

         printx, y, '--', x + y

 

        

1 5 -- 6

2 6 -- 8

3 7 -- 10

4 8 – 12

# zip可以接受任何类型的序列(也就是任何可迭代对象,包括文件)并且可以有两个以上的参数.

>>> T1, T2, T3 = (1, 2, 3), (4, 5, 6), (7,8, 9)

>>> zip(T1, T2, T3)

[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

>>> s1 = 'abc'; s2 = 'xyz123'

>>> zip(s1, s2)

[('a', 'x'), ('b', 'y'), ('c', 'z')]

#当参数长度不同时, zip会以最短序列的长度为准来截断所得到的元组. 相比较旧的内置map函数, 用类似方式把序列元素配对起来, 但是如果参数长度不同,则会以较短的序列用None补齐.

>>> map(None, s1, s2)

[('a', 'x'), ('b', 'y'), ('c', 'z'), (None, '1'),(None, '2'), (None, '3')]

 

使用zip构造字典

>>> keys = ['sapm', 'egggs', 'toast']

>>> vals = [1, 3, 5]

>>> zip(keys, vals)

[('sapm', 1), ('egggs', 3), ('toast', 5)]

>>> D2 = {}

>>> for(k, v)in zip(keys, vals): D2[k] = v#用列表keys做键, 用vals做值

 

>>> D2

{'egggs': 3, 'sapm': 1, 'toast': 5}

>>> D3 = dict(zip(keys, vals)) #内置变量名dict其实是python中的类型名称

>>> D3

{'egggs': 3, 'sapm': 1, 'toast': 5}

 

产生偏移和元素: enumerate

Enumerate函数返回一个生成器对象: 这种对象支持本章前面提过的迭代协议.

这个对象有个next方法, 每次遍历列表时, 会返回一个(index, value)的元组, 而我们能在for中通过元组赋值运算将其分解(这很像使用zip).

>>> s = 'spam'

>>> for (offset, item) in enumerate(s):

         printitem,'appears at offfset', offset

 

        

s appears at offfset 0

p appears at offfset 1

a appears at offfset 2

m appears at offfset 3

>>> E = enumerate(s)

>>> E.next()

(0, 's')

>>> E.next()

(1, 'p')

>>> [ c * i for (i, c) in enumerate(s)]

['', 'p', 'aa', 'mmm']

 

列表解析:初探  

note: 列表解析是写在方括号中.

>>>L = [1, 2, 3, 4]

>>>L = [x + 10 for x in L]

>>>L

[11, 12, 13,14]

列表解析基础

列表解析语法是从集合理论表示法中的一种结构中衍生出来的, 也就是对集合中的每个元素应用某一种运算, 但不需要懂得集合理论就能运用.

Python会在解释器内通过列表来执行迭代, 依次把item赋值给每个元素, 然后通过左侧的表达式运行每一个元素并且存储其结果 .

对文件使用列表解析

>>> lines = [ line.rstrip() for line inopen('c:\\log.txt')]

>>> lines

['kangqiao', 'abc 126.com', '45676', 'helloworldhw']

列表解析会自动使用前面提到过的迭代协议,也就是调用文件的next方法,一次从文件中读取一行,再通过rstrip表达示执行这行,再将其加到结果列表中。

扩展列表解析语法

>>> lines = [line.rstrip() for line inopen('c:\\log.txt') if line[0] == 'k']

#if过滤分句会检查每行第一个字母如果为’k’才会将这一行加入列表。

>>> lines

['kangqiao']

复杂形式的双重循环。

>>> [x + y for x in 'abc' for y in 'lmn']

['al', 'am', 'an', 'bl', 'bm', 'bn', 'cl', 'cm','cn']

#下面是其展开的形式,

>>> res = []

>>> for x in 'abc':

         for yin 'lmn':

                   res.append(x+ y)

 

                  

>>> res

['al', 'am', 'an', 'bl', 'bm', 'bn', 'cl', 'cm','cn']

上面使列表解析表达式本身的优点变得过于紧凑。一般来说,列表解析都是用在简单的迭代类型上

 

14章Python文档资源

#注释                          文件中的文档                                     只能在源码文件中看到

Dir函数                     对象中可用属性的列表

文档字符串:__doc__   附加在对象上的文件中的文档

PyDoc:help函数       对象的交互帮助

PyDoc:  HTML报表       浏览器中的模块文档

标准手册                 正式的语言和库的说明

网站资源                   在线教程,例子等

 

#注释最适用于较小功能的文档, 而文档字符串最适于较大型功能的文档。

Dir函数是抓取对象内可用所有属性列表的简单方式,

>>> import sys

>>> dir(sys)  #找出标准库中sys模块有什么可以用的属性

['__displayhook__', '__doc__', '__excepthook__','__name__', '__package__', '__stderr__', '__stdin__', '__stdout__','_clear_type_cache', '_current_frames', '_getframe', '_mercurial','api_version', 'argv', 'builtin_module_names', 'byteorder', 'call_tracing','callstats', 'copyright', 'displayhook', 'dllhandle', 'dont_write_bytecode','exc_clear', 'exc_info', 'exc_traceback', 'exc_type', 'exc_value','excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info','float_repr_style', 'getcheckinterval', 'getdefaultencoding','getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount','getsizeof', 'gettrace', 'getwindowsversion', 'hexversion', 'long_info','maxint', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path','path_hooks', 'path_importer_cache', 'platform', 'prefix', 'py3kwarning','setcheckinterval', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr','stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions','winver']

任何内置类型的dir结果都包含了一组属性,这些属性和该类型的实现相关(从技术角度来讲,就是运算符重载的方法)

文档字符串 __doc__

这类注释是写成字符串,放在模块文件,函数以及类语句的顶端,就在任何可执行程序代码前(#注释在其前也没问题)。Python会自动封装这个字符串,也就是成为所谓的文档字符串,使其成为相应对象的__doc__属性。例如:docstrings.py源码如下:

############docstring.py-20121127-begin###############

"""

Module documentation

Words Go Here

"""

 

spam = 40

 

def square(x):

   """

    functiondocumentation

    can wehave your liver then?

   """

    return x**2

 

class employee:

   "class documentation"

    pass

 

print square(4)

print square.__doc__

############ docstring.py-20121127-end###############

>>> import docstring

16

 

    functiondocumentation

    can wehave your liver then?

   

>>> print docstring.__doc__

 

Module documentation

Words Go Here

 

>>> print docstring.square.__doc__

 

    functiondocumentation

    can wehave your liver then?

   

>>> print docstring.employee.__doc__

class documentation

>>> 

要取出模块中类的方法函数的文档字符串, 可以通过路径访问类:module.class.method.__doc__

内置文档字符串

>>> import sys

>>> print sys.__doc__   #查看内置sys模块文档注释

This module provides access to some objects used ormaintained by the

interpreter and to functions that interact stronglywith the interpreter.

 

Dynamic objects:

……

>>> print open.__doc__  #查看open函数的文档注释.

open(name[, mode[, buffering]]) -> file object

 

Open a file using the file() type, returns a fileobject.  This is the

preferred way to open a file.  See file.__doc__ for further information.

>>> 

PyDoc: help函数

Help函数会启用PyDoc从而产生简单的文字报表(这看地来就像是类UNIX系统上的message)

>>> import sys

>>> help(sys.getrefcount)

Help on built-in function getrefcount in modulesys:

 

getrefcount(...)

   getrefcount(object) -> integer

   

    Returnthe reference count of object.  The countreturned is generally

    onehigher than you might expect, because it includes the (temporary)

    referenceas an argument to getrefcount().

 

>>> 

注意: 调用help时, 不用导入sys, 但是要取得 sys的辅助信息时,就得导入sys

>>>help(docstring.square)  #显示docstrign.py文件中的文档.

Help on function square in module docstring:

 

square(x)

    functiondocumentation

    can wehave your liver then?

 

#如下会显示整个docstring.py文件中的所有文档

>>> help(docstring)

Help on module docstring:

 

NAME

    docstring

 

FILE

   c:\python27\docstring.py

 

DESCRIPTION

    Moduledocumentation

    Words GoHere

 

CLASSES

    employee

   

    classemployee

     |  class documentation

 

FUNCTIONS

    square(x)

       function documentation

        canwe have your liver then?

 

DATA

    spam = 40

 

执行PyDoc GUI接口, 保持模块名称空白, 伏兵选择”open browser”, 这样会打开一个网页,其中包含了程序中每个可用模块的链接.

 

常见编写代码的陷阱

1.        别忘了冒号:   在复合语句道行末尾输入”:”

2.        从第1行开始:        要确定顶层程序从代码第1行第1格开始,这包括在交互模式下

>>>  print 'abc'

 

  File "<pyshell#30>", line 1

    print 'abc'

   ^

IndentationError: unexpected indent

>>> 

3.        空白行在交互模式提示符下很重要:        模块文件中的复合语句内的空白行会被忽视, 但交互模式下会认为是结束语句

4.        缩进要一致: 避免在块缩进中混合制表符和空格, 建议全都使用空格

5.        不要在python中写c代码,          

a)        不要在if和while首行测试语句中使用括号,  例如if(x ==1):  建议用if x == 1:

b)        不要以分号终止所有的语句,

c)        不要在while循环测试中嵌入赋值语句,

d)        不要在块周围使用{}要改用一致的缩进.

6.        使用简单的for循环,而不是while或range:              

a)        比起while或者range式的计数器循环来讲,简单for循环总是容易写,运行也更快.

7.        要注意赋值语句中的可变对象:  

a)        在( a = b = [])以及增强指定语句( a += [1, 2]) , 使用可变对象时,要小心一点.在这两种情况下,在原处修改会影响其他变量.

8.        不要期待进行在原处的修改的函数会返回结果

a)        List.append和list.sort方法这种修改运算, 并不会有返回值,

当初学者使用mylist= mylist.append(x) 这样的语句时, 实际是把mylist指定为None了

b)        你可以使用如下方法

                        i.             使用sorted内置函数来返回排序后的列表,

                      ii.             先执行ks = D.keys() 然后执行 ks.sort() 最后执行 k in ks :

9.        一定要使用括号调用函数     其实函数也是对象,只是有特殊的运算.你通过括号触发对它的调用

10.    不要在导入和重载中使用扩展名或路径  在import语句中省略目录路径和文件字尾

 

 

>>> map(lambda x: 2 **x, range(7))

[1, 2, 4, 8, 16, 32, 64]

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值