Python基础教程——抽象
抽象
懒惰是一种美德
例如,计算一些斐波那契数(一种数列,其中每个数偶数前两个数的和)。
fibs = [0,1]
for i in range(8):
fibs.append(fibs[-2]+fibs[-1])
运行代码,将包含前10个斐波那契数。
>>> fibs
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
还可指定最终要得到的序列的长度:
fibs = [0,1]
num = int(input('How many Fibonacci numbers do you want?'))
for i in range(num-2):
fibs.append(fibs[-2]+fibs[-1])
print(fibs)
让程序更抽象,可以如下:
num = input('How many numbers do you want?')
print(fibs(num))
以抽象的方式完成:只是让计算机这样做,而没有具体地告诉它如何做。
创建一个名为 fibs 的函数,并在需要计算斐波那契数时调用它。
如需在多个地方计算时,可以节省很多精力。
抽象和结构
抽象可以节省人力,还有个更重要的优点:抽象是程序能够被人理解的关键所在。
程序应非常抽象,如下载网页、计算使用频率、打印每个单词的使用频率。
如:
page = download_page()
freqs = compute_frequencies(page)
for word, freq in freqs:
print(word, freq)
在这里只是让计算机去下载网页并计算使用频率,至于这些操作的具体细节,将在其他地方(独立的函数定义)中给出。
自定义函数
函数执行特定的操作并返回一个值,可以调用它(调用时可能需要提供一些参数——放在圆括号中的内容)。
要判断某个对象是否可调用,可使用内置函数 callable。
>>> import math
>>> x = 1
>>> y = math.sqrt
>>> callable(x)
False
>>> callable(y)
True
使用 def (表示定义函数)语句。
def hello(name):
return 'Hello,' + name + '!'
可像使用内置函数一样使用这个函数。
>>> print(hello('world'))
Hello,world!
>>> print(hello('Gumby'))
Hello,Gumby!
编写一个函数,返回一个由斐波那契数组成的列表。就可以通过参数来获取数字。
def fibs(num):
result = [0,1]
for i in range(num-2):
result.append(result[-2] + result[-1])
return result
只需要调用函数 fibs 就可以了。
>>> fibs(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
>>> fibs(15)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
return 语句非常重要。
return 语句用于从函数返回值。
给函数编写文档
要给函数编写文档,以确保其他人能够理解,可添加注释(以#打头的内容)。
另外一种编写注释的方式,就是添加独立的字符串。
放在函数开头的字符串称为文档字符串(docstring),将作为函数的一部分存储起来。
代码演示:
def square(x)
'Calculates the square of the number x.'
return x * x
可以像下面这样访问文档字符串:
>>> square._doc_
'Calculates the square of the number x.'
注意, _doc_ 是函数的一个属性。
属性名中的双下划线表示这是一个特殊的属性。
特殊的内置函数help很有用。
在交互式解释器中,可使用它获取有关函数的信息,其中包含函数的文档字符串。
>>> help(square)
Help on function square in modul_main_:
square(x)
Calculates the square of the number x.
其实并不是函数的函数
在Python中,有些函数什么都不返回。
在Python中,函数就是函数,即使它严格来说并非函数。什么都不返回的函数不包含return语句,或者包含return语句,但没有在return后面指定值。
def test():
print('This is printed')
return
print('This is not')
这里使用return语句只是为了结束函数。
>>> x = test()
This is printed
如上,跳过了第二条print语句。
test什么都不返回,x指向什么?
>>> x
>>>
什么都没有。
>>> print(x)
None
返回值:None。
由此,所有的函数都有返回值。
如果没有告诉它们该返回什么,将返回None。
参数魔法
值从哪里来
定义函数时,参数的值是怎么来的呢?
编写函数旨在为当前程序(甚至其他程序)提供服务,职责是确保它在提供的参数正确时完成任务,并在参数不对时以显而易见的方式失败。
注意,在def语句中,位于函数名后面的变量通常称为形参,而调用函数时提供的值称为实参。
我能修改参数吗
在函数内部给参数赋值对外部没有任何影响。
>>> def try_to_change(n):
n = 'Mr.Gumby'
>>> name = 'Mrs.Entity'
>>> try_to_change(name)
>>