Sivan's blog

用代码说话……
posts - 14, comments - 2, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

[学]Python用户手册笔记_1_More Control Flow Tools

Posted on 2010-12-19 13:50 Sivan 阅读(363) 评论(0)  编辑 收藏 引用 所属分类: Python

More Control Flow Tools
深入流程控制


以下及以后的内容来自Python用户手册2.5&&2.6,为学习时的摘抄笔记。



3 深入流程控制

3.1 if语句

if elif

缩进,冒号

3.2 for x in a:

a链表

在迭代过程中修改迭代序列不安全,要想修改迭代序列,可以迭代它的复本 for x in a[:]:

3.3 使用range()函数生成等差级数链表

>>> a = ['Mary','had','a','little','lamb']

>>> for i in range(len(a)):

...   print i, a[i]

...  

0 Mary

1 had

2 a

3 little

4 lamb

>>>

3.4 breakcontinueelse

breakcontinueC语言中的类似。循环可以有一个else子句;它在循环迭代完整个列表(对于for)或执行条件为false(对于while)时执行,但循环break中止的情况下不会执行。例如

>>> for n in range(2,10):

...   for x in range(2,n):

...          if n % x == 0:

...                 print n, 'equals', x, '*',n/x

...                 break

...   else:

...          print n, 'is a prime number'

...         

2 is a prime number

3 is a prime number

4 equals 2 * 2

5 is a prime number

6 equals 2 * 3

7 is a prime number

8 equals 2 * 4

9 equals 3 * 3

3.5 pass语句

pass语句什么也不做。它用于那些语法上必须要有什么语句,但程序什么也不做的场合。例如:

3.6 定义函数

关键字def引入一个函数定义。在其后必须跟有函数名和包括形式参数的圆括号。函数体语句从下一行开始,必须是缩进的。函数体的第一行可以是一个字符串值,这个字符串是该函数的文档字符串。

执行函数时会为局部变量引入一个新的符号表。所有的局部变量都存储在这个局部符号表。引用参数时,会先从局部符号表中查找,然后是全局符号表,然后是内置命名表。因此,全局参数虽然可以被引用,但它们不能再函数中直接赋值(除非它们用global语句命名)。

返回一个链表的函数

>>> def fib2(n):

...   """Return a list containing the Fibonacci series up to n."""

...   result = []

...   a, b = 0, 1

...   while b < n:

...          result.append(b)

...          a, b = b, a+b

...   return result

...

>>> f100 = fib2(2000)

>>> f100

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597]

return语句从函数中返回一个值,不带表达式的return返回None。过程结束后也会返回None

3.7 深入函数定义

定义参数可变的函数

3.7.1参数默认值

给一个或多个参数指定默认值

3.7.2 关键字参数

函数可以通过关键字参数的形式来调用,形如‘keyword=value’。例如,以下的函数:

>>> def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):

...   print "-- This parrot wouldn't", action,

...   print "if you put", voltage, "volts through it."

...   print "-- Lovely poumage, the", type

...   print "-- It's", state, "!"

...  

>>> parrot(1000)

-- This parrot wouldn't voom if you put 1000 volts through it.

-- Lovely poumage, the Norwegian Blue

-- It's a stiff !

>>> parrot(action='vooooom', voltage=1000000)

-- This parrot wouldn't vooooom if you put 1000000 volts through it.

-- Lovely poumage, the Norwegian Blue

-- It's a stiff !

参数列表中的每一个关键字都必须来自于形式参数,每个参数都有对应的关键字。形式参数有没有默认值并不重要。实际参数不能一次赋多个值。形式参数不能在同一次调用中同时使用位置和关键字绑定值。

>>> def func(a):

...   pass

...

>>> func(a=0)

>>>

>>> func(0, a=0)

Traceback (most recent call last):

  File "<interactive input>", line 1, in <module>

TypeError: func() got multiple values for keyword argument 'a'

>>>

引入一个形如**name的参数时,它接收一个字典,该字典包含了所有未出现在形式参数列表中的关键字参数。这里可能还会组合使用一个形如*name的形式参数,它接收一个元组,包好了所有没有出现在形式参数列表中的参数值。(*name必须在**name之前出现)

>>> def cheeseshop(kind, *arguments, **keywords):

...   print "--Do you have any", kind, '?'

...   print "-- I'm sorry, we're all out of", kind

...   for arg in arguments: print arg

...   print '-'*40

...   keys=keywords.keys()

...   keys.sort()

...   for kw in keys: print kw, ':', keywords[kw]

...  

>>> cheeseshop('Limburger',"It's very runny, sir.","It's really very, VERY runny, sir.", client='John Cleese',shopkeeper='Michael Palin',sketch='Cheese Shop Sketch')

--Do you have any Limburger ?

-- I'm sorry, we're all out of Limburger

It's very runny, sir.

It's really very, VERY runny, sir.

----------------------------------------

client : John Cleese

shopkeeper : Michael Palin

sketch : Cheese Shop Sketch

3.7.3 可变参数列表

函数可以调用可变个数的参数。这些参数被包装进一个元组。在这些可变个数的参数之前,可以有零到多个普通的参数:

>>> def fprintf(file, format, *args):

...   file.write(format % args)

...

3.7.4 参数列表的分解

当传递的参数已经是一个列表的时候,而要调用的函数却接受分开一个个的参数值。这时要把已有的列表拆开。

>>> args = [3, 6]

>>> range(*args)

[3, 4, 5]

>>>

使用**操作符分拆关键字参数为字典

3.7.5 Lambda形式

通过lambad关键字,可以创建短小的匿名函数。这里有一个函数返回它的两个参数的和:‘lambda a, b:  a+b’。Lambda形式可以用于任何需要的函数对象。出于语法限制,它们只能有一个单独的表达式。语义上讲,它们只是普通函数定义中的一个语法技巧。类似于嵌套函数定义,lambda形式可以从包含范围内引用变量:

>>> def make_incrementor(n):

...   return lambda x: x+n

...

>>> f = make_incrementor(42)

>>> f(0)

42

>>> f(1)

43

3.7.6 文档字符串

第一行介绍对象的用途。如果文档字符串有多行,第二行应该空出来,与接下来的详细描述明确分割。下面的文档应该有一或多段描述对象的调用约定、边界效应。

>>> def my_fun():

...   """Do nothing, but document it.

...  

...   No, really, it doesn't do anything.

...   """

...   pass

...

>>> print my_fun.__doc__

Do nothing, but document it.

      

       No, really, it doesn't do anything.

      

>>> print my_fun.func_doc

Do nothing, but document it.

      

       No, really, it doesn't do anything.

      

>>> 


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理